diff --git a/DEPS b/DEPS
index 01f5f7b6..9cfaaab 100644
--- a/DEPS
+++ b/DEPS
@@ -276,7 +276,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
-  'src_internal_revision': '30bfae1f40eec5b253fda18c43cd86625561ec4a',
+  'src_internal_revision': 'b11d5217eddb9b5182b1025baa30fe8d3749fb5b',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Skia
   # and whatever else without interference from each other.
@@ -284,11 +284,11 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
-  'v8_revision': '41dacffe436aeb9311879cb07648f1e36609a804',
+  'v8_revision': '75be3dcb5330aa3ebcf79031e7123bc3f0f07179',
   # 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': 'd1496a22a9fc107e5458565c2c4e6794925b47de',
+  'angle_revision': '59162e2e5451b344d3f0c1045bd99c2c694a610b',
   # 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': 'd777ea2a7004ff7ef40ef983b41a5125f316f898',
+  'boringssl_revision': 'f2394d14d81df436b263ff104eb6efc915cbdfc6',
   # 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.
@@ -332,7 +332,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling freetype
   # and whatever else without interference from each other.
-  'freetype_testing_revision': '7a69b1a2b028476f840ab7d4a2ffdfe4eb2c389f',
+  'freetype_testing_revision': 'f2f190f8524d68ce1ba8e848a0be4552f523d9bc',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling HarfBuzz
   # and whatever else without interference from each other.
@@ -352,7 +352,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling chromium_variations
   # and whatever else without interference from each other.
-  'chromium_variations_revision': '59f30bf1d20ecefceec9e39837ab78c113b9ffb5',
+  'chromium_variations_revision': 'b6808cf1ce5f192681ae7e441a6367ec681751ed',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling CrossBench
   # and whatever else without interference from each other.
@@ -372,7 +372,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling devtools-frontend
   # and whatever else without interference from each other.
-  'devtools_frontend_revision': '972ab829b87413bffa19e1ee476ca380c7363f79',
+  'devtools_frontend_revision': '2a31e372ea28cccb45c63fdd1639c76b50d7217e',
   # 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,7 +396,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'dawn_revision': '3989b426db4499d4af5f6afffb5eb804c7563323',
+  'dawn_revision': '2b29587b8842709eb181a55998924d51a575dd8c',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -496,7 +496,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling llvm-libc
   # and whatever else without interference from each other.
-  'llvm_libc_revision':    'c19ea20051628d97f4e3a0fc74992ac32fd82a56',
+  'llvm_libc_revision':    'bba78980368407630a21a3918e7e8a4cc5fef205',
 
   # If you change this, also update the libc++ revision in
   # //buildtools/deps_revisions.gni.
@@ -1439,7 +1439,7 @@
 
   'src/clank': {
     'url': Var('chrome_git') + '/clank/internal/apps.git' + '@' +
-    '11a98e686ad3746325e83f4357fad4b60112da74',
+    '2638f42d4957fb0d8fe71d113068a7cc2d0d79ce',
     'condition': 'checkout_android and checkout_src_internal',
   },
 
@@ -2436,7 +2436,7 @@
     Var('pdfium_git') + '/pdfium.git' + '@' +  Var('pdfium_revision'),
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' + '01f1eab6f88647dab2a70eb72c92a6cf7c6acb86',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' + '19792a9913a7c898c2a154c10b580087bc2ee7b6',
 
   'src/base/tracing/test/data': {
     'bucket': 'perfetto',
@@ -2800,13 +2800,13 @@
     Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + '450cceb587613ac1469c5a131fac15935c99e0e7',
 
   'src/third_party/webgpu-cts/src':
-    Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '10b66cd2ff469e53ee5068a3348c4979b05b3123',
+    Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '63658e137bf2efcb6199c849afc8be1b4995f2d2',
 
   'src/third_party/webpagereplay':
     Var('chromium_git') + '/webpagereplay.git' + '@' + Var('webpagereplay_revision'),
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + '161d12fa8bf61cff73d97107c3438b414390ff18',
+    Var('webrtc_git') + '/src.git' + '@' + '80344a0a5cb3ecb93716bd6a994e65cc6c8c3b51',
 
   # 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.
@@ -4474,7 +4474,7 @@
   # grepping.
   'src/chrome/installer/mac/internal': {
       'url': Var('chrome_git') + '/chrome/installer/mac/internal.git' + '@' +
-        '4bac26477e63edd1db3d6fd771236798ec4adc97',
+        '85c282fe6f2763822964028cb89be7b808b07169',
       'condition': 'checkout_src_internal',
   },
 
@@ -4568,7 +4568,7 @@
 
   'src/components/optimization_guide/internal': {
       'url': Var('chrome_git') + '/chrome/components/optimization_guide.git' + '@' +
-        'c97178e22cfde77ce6134e69266e5ae9c5bc0b87',
+        'bd3667785fe1b0b97fd32cd07c78a1145ffcd82d',
       'condition': 'checkout_src_internal',
   },
 
@@ -4634,7 +4634,7 @@
 
   'src/ios_internal':  {
       'url': Var('chrome_git') + '/chrome/ios_internal.git' + '@' +
-        'f622666c2d3e428fc7eed7c570bb629f049ea497',
+        'c7edd0f42e54c80ca27602846639c13933b2b7c8',
       'condition': 'checkout_ios and checkout_src_internal',
   },
 
diff --git a/android_webview/browser/aw_content_browser_client.cc b/android_webview/browser/aw_content_browser_client.cc
index f9e3e0e..61515862 100644
--- a/android_webview/browser/aw_content_browser_client.cc
+++ b/android_webview/browser/aw_content_browser_client.cc
@@ -582,8 +582,9 @@
   }
 }
 
-void AwContentBrowserClient::OverrideWebkitPrefs(
+void AwContentBrowserClient::OverrideWebPreferences(
     content::WebContents* web_contents,
+    content::SiteInstance& main_frame_site,
     blink::web_pref::WebPreferences* web_prefs) {
   AwSettings* aw_settings = AwSettings::FromWebContents(web_contents);
   if (aw_settings) {
diff --git a/android_webview/browser/aw_content_browser_client.h b/android_webview/browser/aw_content_browser_client.h
index 4c95638..1cf36d8 100644
--- a/android_webview/browser/aw_content_browser_client.h
+++ b/android_webview/browser/aw_content_browser_client.h
@@ -138,8 +138,10 @@
       const base::CommandLine& command_line,
       int child_process_id,
       content::PosixFileDescriptorInfo* mappings) override;
-  void OverrideWebkitPrefs(content::WebContents* web_contents,
-                           blink::web_pref::WebPreferences* web_prefs) override;
+  void OverrideWebPreferences(
+      content::WebContents* web_contents,
+      content::SiteInstance& main_frame_site,
+      blink::web_pref::WebPreferences* web_prefs) override;
   std::vector<std::unique_ptr<content::NavigationThrottle>>
   CreateThrottlesForNavigation(
       content::NavigationHandle* navigation_handle) override;
diff --git a/android_webview/common/aw_features.cc b/android_webview/common/aw_features.cc
index 25597a0..49f4bef 100644
--- a/android_webview/common/aw_features.cc
+++ b/android_webview/common/aw_features.cc
@@ -116,7 +116,7 @@
 // on WebViews running on supervised user accounts.
 BASE_FEATURE(kWebViewSupervisedUserSiteBlock,
              "WebViewSupervisedUserSiteBlock",
-             base::FEATURE_DISABLED_BY_DEFAULT);
+             base::FEATURE_ENABLED_BY_DEFAULT);
 
 // Disallows window.{alert, prompt, confirm} if triggered inside a subframe that
 // is not same origin with the main frame.
diff --git a/ash/accelerators/accelerator_controller_impl.cc b/ash/accelerators/accelerator_controller_impl.cc
index 7b9e300..f67d8690 100644
--- a/ash/accelerators/accelerator_controller_impl.cc
+++ b/ash/accelerators/accelerator_controller_impl.cc
@@ -45,6 +45,7 @@
 #include "base/system/sys_info.h"
 #include "chromeos/ash/components/audio/cras_audio_handler.h"
 #include "chromeos/ash/components/dbus/biod/fake_biod_client.h"
+#include "chromeos/ash/services/assistant/public/cpp/features.h"
 #include "ui/accessibility/accessibility_features.h"
 #include "ui/aura/env.h"
 #include "ui/base/accelerators/accelerator.h"
@@ -158,6 +159,10 @@
 }
 
 void RecordToggleAssistant(const ui::Accelerator& accelerator) {
+  if (assistant::features::IsNewEntryPointEnabled()) {
+    return;
+  }
+
   if (accelerator.IsCmdDown() && accelerator.key_code() == ui::VKEY_SPACE) {
     base::RecordAction(
         base::UserMetricsAction("VoiceInteraction.Started.Search_Space"));
diff --git a/ash/accelerators/accelerator_unittest.cc b/ash/accelerators/accelerator_unittest.cc
index 314003dd..6c56154 100644
--- a/ash/accelerators/accelerator_unittest.cc
+++ b/ash/accelerators/accelerator_unittest.cc
@@ -2,9 +2,15 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "ash/accelerators/accelerator_controller_impl.h"
+#include "ui/base/accelerators/accelerator.h"
 
+#include <memory>
+
+#include "ash/accelerators/accelerator_controller_impl.h"
 #include "ash/app_list/test/app_list_test_helper.h"
+#include "ash/assistant/model/assistant_ui_model.h"
+#include "ash/public/cpp/assistant/controller/assistant_ui_controller.h"
+#include "ash/public/cpp/test/assistant_test_api.h"
 #include "ash/shell.h"
 #include "ash/shell_observer.h"
 #include "ash/system/network/network_observer.h"
@@ -16,12 +22,17 @@
 #include "ash/wm/window_util.h"
 #include "base/run_loop.h"
 #include "base/test/metrics/user_action_tester.h"
+#include "base/test/scoped_feature_list.h"
+#include "base/test/task_environment.h"
+#include "base/test/test_future.h"
 #include "chromeos/ash/components/dbus/shill/shill_clients.h"
 #include "chromeos/ash/components/network/network_handler.h"
+#include "chromeos/ash/services/assistant/public/cpp/features.h"
+#include "chromeos/ash/services/assistant/test_support/scoped_assistant_browser_delegate.h"
 #include "ui/aura/window.h"
-#include "ui/base/accelerators/accelerator.h"
 #include "ui/base/accelerators/test_accelerator_target.h"
 #include "ui/events/event.h"
+#include "ui/events/keycodes/keyboard_codes_posix.h"
 #include "ui/events/test/event_generator.h"
 
 namespace ash {
@@ -176,4 +187,90 @@
   GetAppListTestHelper()->CheckVisibility(false);
 }
 
+TEST_F(AcceleratorTest, SearchPlusAWithNewEntryPointDisabled) {
+  ASSERT_FALSE(ash::assistant::features::IsNewEntryPointEnabled());
+
+  base::UserActionTester user_action_tester;
+
+  std::unique_ptr<AssistantTestApi> test_api = AssistantTestApi::Create();
+  test_api->EnableAssistantAndWait();
+
+  ui::test::EmulateFullKeyPressReleaseSequence(
+      GetEventGenerator(), ui::VKEY_A,
+      /*control=*/false, /*shift=*/false, /*alt=*/false, /*command=*/true);
+
+  AssistantUiController* ui_controller = AssistantUiController::Get();
+  CHECK(ui_controller);
+  EXPECT_EQ(AssistantVisibility::kVisible,
+            ui_controller->GetModel()->visibility());
+  EXPECT_EQ(1, user_action_tester.GetActionCount(
+                   "VoiceInteraction.Started.Search_A"));
+}
+
+TEST_F(AcceleratorTest, AssistantKeyWithNewEntryPointDisabled) {
+  ASSERT_FALSE(ash::assistant::features::IsNewEntryPointEnabled());
+
+  base::UserActionTester user_action_tester;
+
+  std::unique_ptr<AssistantTestApi> test_api = AssistantTestApi::Create();
+  test_api->EnableAssistantAndWait();
+
+  ui::test::EmulateFullKeyPressReleaseSequence(
+      GetEventGenerator(), ui::VKEY_ASSISTANT,
+      /*control=*/false, /*shift=*/false, /*alt=*/false, /*command=*/false);
+
+  AssistantUiController* ui_controller = AssistantUiController::Get();
+  CHECK(ui_controller);
+  EXPECT_EQ(AssistantVisibility::kVisible,
+            ui_controller->GetModel()->visibility());
+  EXPECT_EQ(1, user_action_tester.GetActionCount(
+                   "VoiceInteraction.Started.Assistant"));
+}
+
+class AcceleratorNewEntryPointTest : public AcceleratorTest {
+ private:
+  // Accelerators registration happens at early stage. Test body is late to
+  // configure a flag.
+  base::test::ScopedFeatureList scoped_feature_list{
+      ash::assistant::features::kEnableNewEntryPoint};
+};
+
+TEST_F(AcceleratorNewEntryPointTest, AssistantKeyWithNewEntryPointEnabled) {
+  base::UserActionTester user_action_tester;
+
+  base::test::TestFuture<void> open_new_entry_point_future;
+  assistant::ScopedAssistantBrowserDelegate scoped_assistant_browser_delegate;
+  scoped_assistant_browser_delegate.SetOpenNewEntryPointClosure(
+      open_new_entry_point_future.GetCallback());
+
+  ui::test::EmulateFullKeyPressReleaseSequence(
+      GetEventGenerator(), ui::VKEY_ASSISTANT,
+      /*control=*/false, /*shift=*/false, /*alt=*/false, /*command=*/false);
+
+  EXPECT_TRUE(open_new_entry_point_future.Wait());
+  EXPECT_EQ(0, user_action_tester.GetActionCount(
+                   "VoiceInteraction.Started.Assistant"));
+}
+
+TEST_F(AcceleratorNewEntryPointTest, NoSearchPlusAWithNewEntryPointEnabled) {
+  base::UserActionTester user_action_tester;
+
+  base::test::TestFuture<void> open_new_entry_point_future;
+  assistant::ScopedAssistantBrowserDelegate scoped_assistant_browser_delegate;
+  scoped_assistant_browser_delegate.SetOpenNewEntryPointClosure(
+      open_new_entry_point_future.GetCallback());
+
+  ui::test::EmulateFullKeyPressReleaseSequence(
+      GetEventGenerator(), ui::VKEY_A,
+      /*control=*/false, /*shift=*/false, /*alt=*/false, /*command=*/true);
+
+  task_environment()->RunUntilIdle();
+  EXPECT_FALSE(open_new_entry_point_future.IsReady())
+      << "Search+A shortcut won't be available if new entry point flag is on. "
+         "New entry point won't be expected to be opened.";
+
+  EXPECT_EQ(0, user_action_tester.GetActionCount(
+                   "VoiceInteraction.Started.Search_A"));
+}
+
 }  // namespace ash
diff --git a/ash/accelerators/ash_accelerator_configuration.cc b/ash/accelerators/ash_accelerator_configuration.cc
index dbea904c3..afc3d9c 100644
--- a/ash/accelerators/ash_accelerator_configuration.cc
+++ b/ash/accelerators/ash_accelerator_configuration.cc
@@ -26,6 +26,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/values.h"
+#include "chromeos/ash/services/assistant/public/cpp/features.h"
 #include "components/prefs/pref_registry_simple.h"
 #include "components/prefs/pref_service.h"
 #include "ui/base/accelerators/accelerator.h"
@@ -170,6 +171,11 @@
                           ash::kToggleCameraAllowedAcceleratorData);
   }
 
+  if (!ash::assistant::features::IsNewEntryPointEnabled()) {
+    AppendAcceleratorData(accelerators,
+                          ash::kAssistantSearchPlusAAcceleratorData);
+  }
+
   return accelerators;
 }
 
diff --git a/ash/accessibility/a11y_feature_type.h b/ash/accessibility/a11y_feature_type.h
index 71a7dc5..98363001 100644
--- a/ash/accessibility/a11y_feature_type.h
+++ b/ash/accessibility/a11y_feature_type.h
@@ -16,7 +16,6 @@
   kBounceKeys,
   kCaretHighlight,
   kColorCorrection,
-  kCursorColor,
   kCursorHighlight,
   kDictation,
   kDisableTouchpad,
diff --git a/ash/accessibility/accessibility_controller.cc b/ash/accessibility/accessibility_controller.cc
index 5701099..004374e 100644
--- a/ash/accessibility/accessibility_controller.cc
+++ b/ash/accessibility/accessibility_controller.cc
@@ -162,8 +162,6 @@
      nullptr, IDS_ASH_STATUS_TRAY_ACCESSIBILITY_CARET_HIGHLIGHT},
     {FeatureType::kCursorHighlight, prefs::kAccessibilityCursorHighlightEnabled,
      nullptr, IDS_ASH_STATUS_TRAY_ACCESSIBILITY_HIGHLIGHT_MOUSE_CURSOR},
-    {FeatureType::kCursorColor, prefs::kAccessibilityCursorColorEnabled,
-     nullptr, 0, /*toggleable_in_quicksettings=*/false},
     {FeatureType::kDictation, prefs::kAccessibilityDictationEnabled,
      &kDictationMenuIcon, IDS_ASH_STATUS_TRAY_ACCESSIBILITY_DICTATION},
     {FeatureType::kColorCorrection, prefs::kAccessibilityColorCorrectionEnabled,
@@ -288,7 +286,6 @@
     prefs::kAccessibilityChromeVoxVoiceName,
     prefs::kAccessibilityColorCorrectionEnabled,
     prefs::kAccessibilityCursorHighlightEnabled,
-    prefs::kAccessibilityCursorColorEnabled,
     prefs::kAccessibilityCursorColor,
     prefs::kAccessibilityDictationEnabled,
     prefs::kAccessibilityDictationLocale,
@@ -465,6 +462,16 @@
   }
 }
 
+// Calculate the duration and record it into a histogram.
+void RecordFeatureDurationMetric(const std::string& feature_duration_metric,
+                                 const base::Time& enabled_time) {
+  // Calculate the duration from the enabled time to now.
+  base::TimeDelta duration = base::Time::Now() - enabled_time;
+  // Log the duration into a histogram.
+  base::UmaHistogramCustomCounts(feature_duration_metric, duration.InSeconds(),
+                                 1, base::Days(1) / base::Seconds(1), 100);
+}
+
 void ShowAccessibilityNotification(
     const AccessibilityController::A11yNotificationWrapper& wrapper) {
   A11yNotificationType type = wrapper.type;
@@ -1021,9 +1028,6 @@
     case FeatureType::kColorCorrection:
       feature_duration_metric += "CrosColorCorrection";
       break;
-    case FeatureType::kCursorColor:
-      feature_duration_metric += "CrosCursorColor";
-      break;
     case FeatureType::kCursorHighlight:
       feature_duration_metric += "CrosCursorHighlight";
       break;
@@ -1090,11 +1094,7 @@
 
   feature_duration_metric += ".SessionDuration";
 
-  base::TimeDelta duration = base::Time::Now() - enabled_time_;
-  base::UmaHistogramCustomCounts(feature_duration_metric, duration.InSeconds(),
-                                 1, base::Days(1) / base::Seconds(1), 100);
-
-  // Reset enabled time as this duration is now logged and accounted for.
+  RecordFeatureDurationMetric(feature_duration_metric, enabled_time_);
   enabled_time_ = base::Time();
 }
 
@@ -1223,7 +1223,6 @@
   // not synced due to the impact they have on device interaction.
   registry->RegisterBooleanPref(prefs::kAccessibilityAutoclickEnabled, false);
   registry->RegisterBooleanPref(prefs::kAccessibilityBounceKeysEnabled, false);
-  registry->RegisterBooleanPref(prefs::kAccessibilityCursorColorEnabled, false);
   registry->RegisterBooleanPref(prefs::kAccessibilityCaretHighlightEnabled,
                                 false);
   registry->RegisterBooleanPref(prefs::kAccessibilityCursorHighlightEnabled,
@@ -1684,11 +1683,6 @@
   return GetFeature(FeatureType::kCursorHighlight);
 }
 
-AccessibilityController::Feature& AccessibilityController::cursor_color()
-    const {
-  return GetFeature(FeatureType::kCursorColor);
-}
-
 AccessibilityController::Feature& AccessibilityController::dictation() const {
   return GetFeature(FeatureType::kDictation);
 }
@@ -3017,18 +3011,48 @@
 void AccessibilityController::UpdateCursorColorFromPrefs(bool notify) {
   DCHECK(active_user_prefs_);
 
-  const bool enabled =
-      active_user_prefs_->GetBoolean(prefs::kAccessibilityCursorColorEnabled);
+  int cursor_color =
+      active_user_prefs_->GetInteger(prefs::kAccessibilityCursorColor);
+  UpdateCursorColor(cursor_color, notify);
+  TrackCursorColorEnabledDuration(cursor_color);
+}
+
+void AccessibilityController::UpdateCursorColor(SkColor cursor_color,
+                                                bool notify) {
   Shell* shell = Shell::Get();
-  shell->SetCursorColor(
-      enabled ? active_user_prefs_->GetInteger(prefs::kAccessibilityCursorColor)
-              : kDefaultCursorColor);
+  shell->SetCursorColor(cursor_color);
+
   if (notify) {
     NotifyAccessibilityStatusChanged();
   }
   shell->UpdateCursorCompositingEnabled();
 }
 
+void AccessibilityController::TrackCursorColorEnabledDuration(
+    SkColor cursor_color) {
+  // Check if a custom cursor color is currently enabled.
+  bool is_custom_color_enabled = cursor_color != kDefaultCursorColor;
+
+  if (last_cursor_color_enabled_time_ == base::Time()) {
+    cursor_color_enabled_ = is_custom_color_enabled;
+    if (is_custom_color_enabled) {
+      last_cursor_color_enabled_time_ = base::Time::Now();
+    }
+  }
+
+  if (cursor_color_enabled_ == is_custom_color_enabled) {
+    return;
+  }
+
+  if (!is_custom_color_enabled) {
+    RecordFeatureDurationMetric("Accessibility.CrosCursorColor.SessionDuration",
+                                last_cursor_color_enabled_time_);
+    last_cursor_color_enabled_time_ = base::Time();
+  }
+
+  cursor_color_enabled_ = is_custom_color_enabled;
+}
+
 void AccessibilityController::UpdateFaceGazeFromPrefs() {
   if (!::features::IsAccessibilityFaceGazeEnabled()) {
     return;
@@ -3938,11 +3962,6 @@
     case FeatureType::kVirtualKeyboard:
       keyboard::SetAccessibilityKeyboardEnabled(enabled);
       break;
-    case FeatureType::kCursorColor:
-      // The notification will already come via UpdateFeatureFromPref
-      // so we don't need to run it twice.
-      UpdateCursorColorFromPrefs(/*notify=*/false);
-      break;
     case FeatureType::kColorCorrection:
       if (enabled && !active_user_prefs_->GetBoolean(
                          prefs::kAccessibilityColorCorrectionHasBeenSetup)) {
diff --git a/ash/accessibility/accessibility_controller.h b/ash/accessibility/accessibility_controller.h
index 10792e2..29141911 100644
--- a/ash/accessibility/accessibility_controller.h
+++ b/ash/accessibility/accessibility_controller.h
@@ -806,6 +806,10 @@
   void UpdateShortcutsEnabledFromPref();
   void UpdateTabletModeShelfNavigationButtonsFromPref();
 
+  // UpdateCursorColorFromPrefs helpers.
+  void UpdateCursorColor(SkColor cursor_color, bool notify);
+  void TrackCursorColorEnabledDuration(SkColor cursor_color);
+
   void SwitchAccessDisableDialogClosed(bool disable_dialog_accepted);
   void MaybeCreateSelectToSpeakEventHandler();
   void ActivateSwitchAccess();
@@ -851,9 +855,14 @@
   int large_cursor_size_in_dip_ = kDefaultLargeCursorSize;
 
   bool dictation_active_ = false;
+  bool cursor_color_enabled_ = false;
   bool shortcuts_enabled_ = true;
   bool tablet_mode_shelf_navigation_buttons_enabled_ = false;
 
+  // The time at which the cursor color feature was last enabled. Used for
+  // metrics.
+  base::Time last_cursor_color_enabled_time_;
+
   SelectToSpeakState select_to_speak_state_ =
       SelectToSpeakState::kSelectToSpeakStateInactive;
   std::unique_ptr<SelectToSpeakEventHandler> select_to_speak_event_handler_;
diff --git a/ash/accessibility/accessibility_controller_unittest.cc b/ash/accessibility/accessibility_controller_unittest.cc
index 394880a..20a936f 100644
--- a/ash/accessibility/accessibility_controller_unittest.cc
+++ b/ash/accessibility/accessibility_controller_unittest.cc
@@ -215,7 +215,6 @@
       prefs()->FindPreference(prefs::kAccessibilityCaretHighlightEnabled));
   EXPECT_TRUE(
       prefs()->FindPreference(prefs::kAccessibilityCursorHighlightEnabled));
-  EXPECT_TRUE(prefs()->FindPreference(prefs::kAccessibilityCursorColorEnabled));
   EXPECT_TRUE(prefs()->FindPreference(prefs::kAccessibilityDictationEnabled));
   EXPECT_TRUE(prefs()->FindPreference(prefs::kAccessibilityDictationLocale));
   EXPECT_TRUE(
@@ -480,22 +479,29 @@
 }
 
 TEST_F(AccessibilityControllerTest, SetCursorColorEnabled) {
-  EXPECT_FALSE(controller()->cursor_color().enabled());
-
   TestAccessibilityObserver observer;
   controller()->AddObserver(&observer);
   EXPECT_EQ(0, observer.status_changed_count_);
+  ExpectSessionDurationMetricCount("CrosCursorColor", 0);
 
-  controller()->cursor_color().SetEnabled(true);
-  EXPECT_TRUE(controller()->cursor_color().enabled());
+  prefs()->SetInteger(prefs::kAccessibilityCursorColor, 1);
   EXPECT_EQ(1, observer.status_changed_count_);
   ExpectSessionDurationMetricCount("CrosCursorColor", 0);
 
-  controller()->cursor_color().SetEnabled(false);
-  EXPECT_FALSE(controller()->cursor_color().enabled());
+  prefs()->SetInteger(prefs::kAccessibilityCursorColor, kDefaultCursorColor);
   EXPECT_EQ(2, observer.status_changed_count_);
   ExpectSessionDurationMetricCount("CrosCursorColor", 1);
 
+  // Set to custom color, and return back to default cursor color to ensure
+  // that second duration is still counted.
+  prefs()->SetInteger(prefs::kAccessibilityCursorColor, 1);
+  EXPECT_EQ(3, observer.status_changed_count_);
+  ExpectSessionDurationMetricCount("CrosCursorColor", 1);
+
+  prefs()->SetInteger(prefs::kAccessibilityCursorColor, kDefaultCursorColor);
+  EXPECT_EQ(4, observer.status_changed_count_);
+  ExpectSessionDurationMetricCount("CrosCursorColor", 2);
+
   controller()->RemoveObserver(&observer);
 }
 
@@ -1357,7 +1363,6 @@
   // Simulate using chrome settings webui to set cursor color, which also turns
   // on the cursor color enabled pref.
   prefs()->SetInteger(prefs::kAccessibilityCursorColor, SK_ColorBLUE);
-  prefs()->SetBoolean(prefs::kAccessibilityCursorColorEnabled, true);
 
   CursorWindowController* cursor_window_controller =
       Shell::Get()->window_tree_host_manager()->cursor_window_controller();
@@ -1374,11 +1379,10 @@
 
   // Simulate using chrome settings webui to set cursor color to black, which
   // which also turns off the cursor color enabled pref.
-  prefs()->SetInteger(prefs::kAccessibilityCursorColor, 0);
-  prefs()->SetBoolean(prefs::kAccessibilityCursorColorEnabled, false);
+  prefs()->SetInteger(prefs::kAccessibilityCursorColor, kDefaultCursorColor);
+
   EXPECT_EQ(kDefaultCursorColor,
             cursor_window_controller->GetCursorColorForTest());
-  ExpectSessionDurationMetricCount("CrosCursorColor", 1);
 }
 
 TEST_F(AccessibilityControllerTest, SetMonoAudioEnabled) {
diff --git a/ash/ambient/managed/screensaver_images_policy_handler_unittest.cc b/ash/ambient/managed/screensaver_images_policy_handler_unittest.cc
index 155bf87..1b14cf2 100644
--- a/ash/ambient/managed/screensaver_images_policy_handler_unittest.cc
+++ b/ash/ambient/managed/screensaver_images_policy_handler_unittest.cc
@@ -128,7 +128,7 @@
 
     GetSessionControllerClient()->Reset();
     GetSessionControllerClient()->AddUserSession(
-        kUserEmail, user_type,
+        account_id, account_id.GetUserEmail(), user_type,
         /*provide_pref_service=*/false);
     GetSessionControllerClient()->SetUserPrefService(account_id,
                                                      std::move(user_prefs));
diff --git a/ash/ash_strings.grd b/ash/ash_strings.grd
index a9beaf97..45f2b25d 100644
--- a/ash/ash_strings.grd
+++ b/ash/ash_strings.grd
@@ -8886,6 +8886,24 @@
       <message name="IDS_ASH_BIRCH_CORAL_SAVED_GROUPS_MAX_NUM_REACHED" translateable="false" desc="Message shown to users when they attempt to save a new coral group when the maximum number of coral saved groups has been reached.">
         Maximum number of saved groups reached.
       </message>
+      <message name="IDS_ASH_BIRCH_CORAL_SUGGESTION_NAME" translateable="false" desc="The general name of the suggestions provided by coral service">
+        Suggested group
+      </message>
+      <message name="IDS_ASH_BIRCH_CORAL_RESTORE_CHIP_SUBTITLE" translateable="false" desc="The subtitle of coral restore chip">
+        Resume suggested group
+      </message>
+      <message name="IDS_ASH_BIRCH_CORAL_IN_SESSION_CHIP_SUBTITLE" translateable="false" desc="The subtitle of coral in-session chip">
+        Organize in a new desk
+      </message>
+      <message name="IDS_ASH_BIRCH_CORAL_CHIP_MENU_OPEN_GROUP" translateable="false" desc="The chip menu item label of opening a group">
+        Open
+      </message>
+      <message name="IDS_ASH_BIRCH_CORAL_CHIP_MENU_SAVE_GROUP" translateable="false" desc="The chip menu item label of saving a group as a desk template">
+        Save group for later
+      </message>
+      <message name="IDS_ASH_BIRCH_CORAL_CHIP_MENU_HIDE_GROUP" translateable="false" desc="The chip menu item label of hiding a group">
+        Don't suggest group to resume
+      </message>
 
       <!-- Graduation app strings -->
       <message name="IDS_ASH_GRADUATION_NUDGE_TEXT" desc="Text shown in nudge that is displayed after the Content Transfer app becomes available.">
diff --git a/ash/birch/birch_coral_provider.cc b/ash/birch/birch_coral_provider.cc
index 8205d9c5..9fc4934 100644
--- a/ash/birch/birch_coral_provider.cc
+++ b/ash/birch/birch_coral_provider.cc
@@ -20,6 +20,7 @@
 #include "ash/public/cpp/window_properties.h"
 #include "ash/session/session_controller_impl.h"
 #include "ash/shell.h"
+#include "ash/strings/grit/ash_strings.h"
 #include "ash/wm/coral/coral_controller.h"
 #include "ash/wm/desks/desk.h"
 #include "ash/wm/desks/desks_controller.h"
@@ -34,6 +35,7 @@
 #include "chromeos/ui/base/window_properties.h"
 #include "components/prefs/pref_service.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
+#include "ui/base/l10n/l10n_util.h"
 #include "ui/wm/core/window_util.h"
 
 // Implement custom hash for EntityPtr because GURL doesn't support hash.
@@ -66,8 +68,6 @@
 constexpr base::TimeDelta kPostLoginSecondClusterLifespan = base::Minutes(10);
 BirchCoralProvider* g_instance = nullptr;
 
-constexpr char16_t kTitlePlaceholder[] = u"Suggested Group";
-
 // The minimum number of entities in a group that allows user to remove an
 // entity.
 constexpr size_t kMinGroupSizeToRemove = 3;
@@ -677,21 +677,23 @@
     const auto& group = response_->groups()[i];
     // Set a placeholder to item title. The chip title will be directly fetched
     // from group title.
-    // TODO(zxdan): Localize the strings.
-    std::u16string subtitle;
+    int subtitle_id;
     switch (response_->source()) {
       case CoralSource::kPostLogin:
-        subtitle = u"Resume suggested group";
+        subtitle_id = IDS_ASH_BIRCH_CORAL_RESTORE_CHIP_SUBTITLE;
         break;
       case CoralSource::kInSession:
-        subtitle = u"Organize in a new desk";
+        subtitle_id = IDS_ASH_BIRCH_CORAL_IN_SESSION_CHIP_SUBTITLE;
         break;
       case CoralSource::kUnknown:
-        break;
+        NOTREACHED() << "Unknown response type.";
     }
-    items.emplace_back(/*title=*/kTitlePlaceholder,
-                       /*subtitle=*/subtitle, response_->source(),
-                       /*group_id=*/group->id);
+
+    items.emplace_back(
+        group->title
+            ? base::UTF8ToUTF16(*(group->title))
+            : l10n_util::GetStringUTF16(IDS_ASH_BIRCH_CORAL_SUGGESTION_NAME),
+        l10n_util::GetStringUTF16(subtitle_id), response_->source(), group->id);
   }
   Shell::Get()->birch_model()->SetCoralItems(items);
 
diff --git a/ash/capture_mode/capture_mode_controller.cc b/ash/capture_mode/capture_mode_controller.cc
index 91ac330..74610dd0 100644
--- a/ash/capture_mode/capture_mode_controller.cc
+++ b/ash/capture_mode/capture_mode_controller.cc
@@ -90,6 +90,7 @@
 #include "ui/snapshot/snapshot.h"
 #include "ui/views/view_utils.h"
 #include "ui/views/widget/widget.h"
+#include "ui/wm/core/coordinate_conversion.h"
 #include "ui/wm/core/window_util.h"
 
 namespace ash {
@@ -538,46 +539,48 @@
           capture_type == PerformCaptureType::kSearch);
 }
 
-gfx::Rect CalculateSearchResultPanelBounds(const gfx::Rect& work_area,
-                                           const gfx::Rect& captured_region,
-                                           const gfx::Rect& feedback_bounds) {
-  // TODO: crbug.com/362284723 - Ensure tooltips are visible over overlay
-  // container.
-
+// Returns the target panel bounds in screen coordinates.
+gfx::Rect CalculateSearchResultPanelScreenBounds(
+    const gfx::Rect& work_area_in_screen,
+    const gfx::Rect& captured_region_in_screen,
+    const gfx::Rect& feedback_bounds_in_screen) {
   // Attempt to place the panel on the left by default.
-  gfx::Rect bounds(work_area.x() + capture_mode::kPanelWorkAreaSpacing,
-                   work_area.bottom() -
-                       capture_mode::kSearchResultsPanelHeight -
-                       capture_mode::kPanelWorkAreaSpacing,
-                   capture_mode::kSearchResultsPanelWidth,
-                   capture_mode::kSearchResultsPanelHeight);
+  gfx::Rect bounds(
+      work_area_in_screen.x() + capture_mode::kPanelWorkAreaSpacing,
+      work_area_in_screen.bottom() - capture_mode::kSearchResultsPanelHeight -
+          capture_mode::kPanelWorkAreaSpacing,
+      capture_mode::kSearchResultsPanelWidth,
+      capture_mode::kSearchResultsPanelHeight);
 
   // If the region would then intersect with the panel, attempt to place the
   // panel on the right.
-  if (bounds.Intersects(captured_region)) {
-    bounds.set_x(work_area.right() - capture_mode::kSearchResultsPanelWidth -
+  if (bounds.Intersects(captured_region_in_screen)) {
+    bounds.set_x(work_area_in_screen.right() -
+                 capture_mode::kSearchResultsPanelWidth -
                  capture_mode::kPanelWorkAreaSpacing);
 
     // If the region would still intersect with the panel, choose the side with
     // the least intersection.
-    if (bounds.Intersects(captured_region)) {
+    if (bounds.Intersects(captured_region_in_screen)) {
       // Calculate the horizontal distance from the centerpoint of the work area
       // to the left and right edges of the capture region. The panel will be
       // placed on the side with the smaller distance (more space for the
       // panel).
-      const int center_x = work_area.CenterPoint().x();
-      const int left_dist = center_x - captured_region.x();
-      const int right_dist = captured_region.right() - center_x;
+      const int center_x = work_area_in_screen.CenterPoint().x();
+      const int left_dist = center_x - captured_region_in_screen.x();
+      const int right_dist = captured_region_in_screen.right() - center_x;
       if (left_dist < right_dist) {
-        bounds.set_x(work_area.x() + capture_mode::kPanelWorkAreaSpacing);
+        bounds.set_x(work_area_in_screen.x() +
+                     capture_mode::kPanelWorkAreaSpacing);
       }
     }
   }
 
   // If the panel would overlap with the feedback button when it is created,
   // instead place it just above the button.
-  if (bounds.Intersects(feedback_bounds)) {
-    bounds.set_y(feedback_bounds.y() - capture_mode::kSearchResultsPanelHeight -
+  if (bounds.Intersects(feedback_bounds_in_screen)) {
+    bounds.set_y(feedback_bounds_in_screen.y() -
+                 capture_mode::kSearchResultsPanelHeight -
                  capture_mode::kPanelButtonSpacing);
   }
 
@@ -704,13 +707,6 @@
         capture_mode_session_->current_root(), is_active);
 
     RecordSearchResultsPanelEntryType(capture_mode_session_->active_behavior());
-
-    // Setting or updating the bounds here only accounts for newly selected
-    // regions. We also have to update the bounds elsewhere when the region is
-    // adjusted or the display metrics change. We don't want the panel to update
-    // its bounds when we make a multimodal search, as it would reset the panel
-    // back to its default position each time.
-    MaybeUpdateSearchResultsPanelBounds();
   }
 
   // If the panel was not visible beforehand (either the panel was not created
@@ -718,6 +714,12 @@
   if (!search_results_panel_widget_->IsVisible()) {
     search_results_panel_widget_->Show();
     RecordSearchResultsPanelShown();
+    // Setting or updating the bounds here only accounts for newly selected
+    // regions. We also have to update the bounds elsewhere when the region is
+    // adjusted or the display metrics change. We don't want the panel to update
+    // its bounds when we make a multimodal search, as it would reset the panel
+    // back to its default position each time.
+    MaybeUpdateSearchResultsPanelBounds();
   }
 
   // Note at this point the session may no longer be active.
@@ -735,22 +737,31 @@
 }
 
 void CaptureModeController::MaybeUpdateSearchResultsPanelBounds() {
-  if (!search_results_panel_widget_) {
+  // It only makes sense to update the panel bounds here if capture mode session
+  // is currently active as we will use the current session's root to determine
+  // the panel bounds. If the panel is alive outside the session, it will update
+  // its own bounds on display or metric changes.
+  if (!search_results_panel_widget_ || !IsActive()) {
     return;
   }
 
   CHECK(features::IsSunfishFeatureEnabled());
 
-  // TODO: crbug.com/364718783 - Ensure this works with multi-display.
-  const gfx::Rect work_area =
+  aura::Window* current_root = capture_mode_session_->current_root();
+  // Update the panel root before recalculating its bounds.
+  RefreshSearchResultsPanel(current_root);
+
+  const gfx::Rect work_area_in_screen =
       search_results_panel_widget_->GetWorkAreaBoundsInScreen();
 
-  const gfx::Rect panel_bounds = CalculateSearchResultPanelBounds(
-      work_area, user_capture_region_,
-      capture_mode_session_
-          ? capture_mode_session_->GetFeedbackWidgetScreenBounds()
-          : gfx::Rect());
-  search_results_panel_widget_->SetBounds(panel_bounds);
+  gfx::Rect captured_region_in_screen(user_capture_region_);
+  wm::ConvertRectToScreen(current_root, &captured_region_in_screen);
+
+  gfx::Rect panel_bounds_in_screen = CalculateSearchResultPanelScreenBounds(
+      work_area_in_screen, captured_region_in_screen,
+      capture_mode_session_->GetFeedbackWidgetScreenBounds());
+
+  search_results_panel_widget_->SetBounds(panel_bounds_in_screen);
 }
 
 void CaptureModeController::OnLocatedEventDragged() {
@@ -763,10 +774,13 @@
   }
 }
 
-void CaptureModeController::RefreshSearchResultsPanel(bool is_active) {
+void CaptureModeController::RefreshSearchResultsPanel(
+    aura::Window* current_root) {
   // Note we re-stack the panel even if it's not currently visible.
-  if (auto* panel = GetSearchResultsPanel()) {
-    panel->RefreshStackingOrder(is_active);
+  if (auto* panel = GetSearchResultsPanel();
+      panel &&
+      panel->GetWidget()->GetNativeWindow()->GetRootWindow() != current_root) {
+    panel->RefreshStackingOrder(current_root);
   }
 }
 
@@ -805,9 +819,9 @@
   // target, because the panel may not be the target of certain events (e.g.
   // right clicks), and lose focus, after which the panel will no longer be able
   // to be targeted (b/377019438).
-  return search_results_panel_widget_ &&
-         search_results_panel_widget_->GetWindowBoundsInScreen().Contains(
-             screen_location);
+  return IsSearchResultsPanelVisible() &&
+         (search_results_panel_widget_->GetWindowBoundsInScreen().Contains(
+             screen_location));
 }
 
 bool CaptureModeController::IsSearchResultsPanelVisible() const {
@@ -923,7 +937,7 @@
   capture_mode_session_->ReportSessionHistograms();
   capture_mode_session_->Shutdown();
   capture_mode_session_.reset();
-  RefreshSearchResultsPanel(/*is_active=*/false);
+  RefreshSearchResultsPanel(/*current_root=*/nullptr);
 
   delegate_->OnSessionStateChanged(/*started=*/false);
 }
diff --git a/ash/capture_mode/capture_mode_controller.h b/ash/capture_mode/capture_mode_controller.h
index 3e5cb9e..dd00c101 100644
--- a/ash/capture_mode/capture_mode_controller.h
+++ b/ash/capture_mode/capture_mode_controller.h
@@ -730,10 +730,10 @@
   // remove it if remote.
   void DeleteFileAsync(const base::FilePath& path);
 
-  // Refreshes the search results panel stacking order if it exists. `is_active`
-  // indicates whether capture mode session is currently active and will be used
-  // to determine the panel stacking order.
-  void RefreshSearchResultsPanel(bool is_active);
+  // Refreshes the search results panel stacking order if it exists.
+  // `current_root` is the current capture mode session root if it is active,
+  // else nullptr.
+  void RefreshSearchResultsPanel(aura::Window* current_root);
 
   // The ID of this object as a client of the video conference manager.
   const base::UnguessableToken vc_client_id_ = base::UnguessableToken::Create();
diff --git a/ash/capture_mode/capture_mode_session.cc b/ash/capture_mode/capture_mode_session.cc
index fc8cea8..44d0d78 100644
--- a/ash/capture_mode/capture_mode_session.cc
+++ b/ash/capture_mode/capture_mode_session.cc
@@ -1818,12 +1818,6 @@
     controller_->camera_controller()->MaybeUpdatePreviewWidget();
   }
 
-  // TODO: crbug.com/377519801 - Investigate if we can move this to
-  // `SearchResultsPanel` so it will still update after the session ends.
-  // The search results panel may be offscreen after the display metrics change,
-  // so we can reset it back to a default position.
-  controller_->MaybeUpdateSearchResultsPanelBounds();
-
   if (capture_label_widget_) {
     UpdateCaptureLabelWidget(CaptureLabelAnimation::kNone);
   }
@@ -2302,14 +2296,13 @@
   // This must be done after `MaybeUpdateCaptureUisOpacity()` which will hide
   // the panel if a drag is in progress and before running
   // `deferred_cursor_updater` to allow the panel to update the cursor type.
-  if (controller_->IsSearchResultsPanelVisible() &&
-      controller_->IsEventOnSearchResultsPanel(screen_location)) {
+  if (controller_->IsEventOnSearchResultsPanel(screen_location)) {
     if (cursor_setter_) {
       cursor_setter_->ResetCursor();
     }
     // If the event is a mouse or touch down, we assume the user wants to
     // interact with the panel and stop the session now.
-    if (is_press_event) {
+    if (is_press_event && (event->flags() & ui::EF_RIGHT_MOUSE_BUTTON)) {
       controller_->Stop();  // Deletes `this`.
     }
     return;
diff --git a/ash/capture_mode/search_results_panel.cc b/ash/capture_mode/search_results_panel.cc
index 026b312a..1357993 100644
--- a/ash/capture_mode/search_results_panel.cc
+++ b/ash/capture_mode/search_results_panel.cc
@@ -260,12 +260,12 @@
   search_box_view_->textfield_->SetText(text);
 }
 
-void SearchResultsPanel::RefreshStackingOrder(bool is_active) {
+void SearchResultsPanel::RefreshStackingOrder(aura::Window* new_root) {
   aura::Window* native_window = GetWidget()->GetNativeWindow();
   // While the capture mode session is active, we parent the panel to its own
   // container, else we parent it to the system modal container.
-  aura::Window* new_parent =
-      GetParentContainer(native_window->GetRootWindow(), is_active);
+  aura::Window* new_parent = GetParentContainer(
+      new_root ? new_root : native_window->GetRootWindow(), !!new_root);
   views::Widget::ReparentNativeView(native_window, new_parent);
 }
 
diff --git a/ash/capture_mode/search_results_panel.h b/ash/capture_mode/search_results_panel.h
index 4518ffb8..d924ede9 100644
--- a/ash/capture_mode/search_results_panel.h
+++ b/ash/capture_mode/search_results_panel.h
@@ -47,10 +47,10 @@
   virtual void SetSearchBoxImage(const gfx::ImageSkia& image);
   void SetSearchBoxText(const std::u16string& text);
 
-  // Refreshes the panel z-order. `is_active` indicates whether capture mode
-  // session is currently active and will be used to determine the panel
-  // stacking order.
-  void RefreshStackingOrder(bool is_active);
+  // Refreshes the panel z-order. If `new_root` is not null, capture mode
+  // session is active and will be used to determine the panel root. Else the
+  // panel will be re-stacked on its native window's root window.
+  void RefreshStackingOrder(aura::Window* new_root);
 
   // SystemPanelView:
   bool HasFocus() const override;
diff --git a/ash/capture_mode/sunfish_unittest.cc b/ash/capture_mode/sunfish_unittest.cc
index 1c8e967..776dd03 100644
--- a/ash/capture_mode/sunfish_unittest.cc
+++ b/ash/capture_mode/sunfish_unittest.cc
@@ -629,6 +629,34 @@
   }
 }
 
+TEST_F(SunfishTest, DragPanelInSession) {
+  auto* controller = CaptureModeController::Get();
+  controller->StartSunfishSession();
+  auto* event_generator = GetEventGenerator();
+  SelectCaptureModeRegion(event_generator, gfx::Rect(50, 50, 400, 400),
+                          /*release_mouse=*/true, /*verify_region=*/true);
+  WaitForImageCapturedForSearch(PerformCaptureType::kSunfish);
+  auto* panel = controller->GetSearchResultsPanel();
+  ASSERT_TRUE(panel);
+  ASSERT_TRUE(controller->IsActive());
+
+  // Start dragging the panel.
+  const gfx::Point draggable_point(
+      panel->search_results_view()->GetBoundsInScreen().origin() +
+      gfx::Vector2d(0, -3));
+  event_generator->MoveMouseTo(draggable_point);
+  event_generator->PressLeftButton();
+
+  // Test the session is still active.
+  ASSERT_TRUE(panel->IsDragging());
+  EXPECT_TRUE(controller->IsActive());
+
+  // Move the panel. Test the session is still active.
+  event_generator->MoveMouseTo(400, 400);
+  ASSERT_TRUE(panel->IsDragging());
+  EXPECT_TRUE(controller->IsActive());
+}
+
 class MockSearchResultsPanel : public SearchResultsPanel {
  public:
   MockSearchResultsPanel() = default;
@@ -2068,6 +2096,79 @@
   EXPECT_TRUE(search_button->GetVisible());
 }
 
+using SunfishMultiDisplayTest = SunfishTest;
+
+TEST_F(SunfishMultiDisplayTest, SelectNewRegionAndPanelRoot) {
+  UpdateDisplay("800x600,1000x900");
+  aura::Window::Windows roots = Shell::GetAllRootWindows();
+  EXPECT_THAT(roots, SizeIs(2));
+
+  auto* controller = CaptureModeController::Get();
+  controller->StartSunfishSession();
+
+  // Select a region on display 1.
+  auto* generator = GetEventGenerator();
+  SelectCaptureModeRegion(generator, gfx::Rect(100, 100, 600, 500),
+                          /*release_mouse=*/true, /*verify_region=*/true);
+  WaitForImageCapturedForSearch(PerformCaptureType::kSunfish);
+  ASSERT_EQ(roots[0], controller->capture_mode_session()->current_root());
+  auto* panel_window =
+      controller->search_results_panel_widget()->GetNativeWindow();
+  EXPECT_EQ(roots[0], controller->search_results_panel_widget()
+                          ->GetNativeWindow()
+                          ->GetRootWindow());
+
+  // Start a drag on display 2.
+  generator->MoveMouseTo(1010, 10);
+  generator->PressLeftButton();
+  generator->MoveMouseBy(100, 100);
+
+  // The panel will be hidden during the drag.
+  ASSERT_TRUE(controller->capture_mode_session()->is_drag_in_progress());
+  EXPECT_FALSE(controller->search_results_panel_widget()->IsVisible());
+
+  // Release the drag. Test the region and panel are on display 2.
+  generator->ReleaseLeftButton();
+  ASSERT_EQ(roots[1], controller->capture_mode_session()->current_root());
+  WaitForImageCapturedForSearch(PerformCaptureType::kSunfish);
+  EXPECT_EQ(roots[1], controller->search_results_panel_widget()
+                          ->GetNativeWindow()
+                          ->GetRootWindow());
+  EXPECT_EQ(Shell::GetContainer(roots[1],
+                                kShellWindowId_CaptureModeSearchResultsPanel),
+            panel_window->parent());
+
+  // Start a drag on display 1 again.
+  generator->MoveMouseTo(10, 10);
+  generator->PressLeftButton();
+  generator->MoveMouseBy(100, 100);
+  ASSERT_TRUE(controller->capture_mode_session()->is_drag_in_progress());
+  EXPECT_FALSE(controller->search_results_panel_widget()->IsVisible());
+
+  // Release the drag. Test the region and panel are on display 1.
+  generator->ReleaseLeftButton();
+  ASSERT_EQ(roots[0], controller->capture_mode_session()->current_root());
+  WaitForImageCapturedForSearch(PerformCaptureType::kSunfish);
+  EXPECT_EQ(roots[0], controller->search_results_panel_widget()
+                          ->GetNativeWindow()
+                          ->GetRootWindow());
+  EXPECT_EQ(Shell::GetContainer(roots[0],
+                                kShellWindowId_CaptureModeSearchResultsPanel),
+            panel_window->parent());
+
+  // Stop the session. Test the panel stays on display 1.
+  controller->Stop();
+  ASSERT_EQ(gfx::Rect(10, 10, 100, 100), controller->user_capture_region());
+  EXPECT_EQ(roots[0], controller->search_results_panel_widget()
+                          ->GetNativeWindow()
+                          ->GetRootWindow());
+
+  // Restart the session. The region and panel will be cleared.
+  controller->StartSunfishSession();
+  ASSERT_EQ(gfx::Rect(), controller->user_capture_region());
+  EXPECT_FALSE(controller->search_results_panel_widget());
+}
+
 class ScannerTest : public AshTestBase {
  public:
   ScannerTest()
diff --git a/ash/constants/ash_pref_names.h b/ash/constants/ash_pref_names.h
index 01642d62..4a8b4cb 100644
--- a/ash/constants/ash_pref_names.h
+++ b/ash/constants/ash_pref_names.h
@@ -702,10 +702,7 @@
 // A boolean pref which determines whether cursor highlighting is enabled.
 inline constexpr char kAccessibilityCursorHighlightEnabled[] =
     "settings.a11y.cursor_highlight";
-// A boolean pref which determines whether custom cursor color is enabled.
-inline constexpr char kAccessibilityCursorColorEnabled[] =
-    "settings.a11y.cursor_color_enabled";
-// An integer pref which determines the custom cursor color.
+// An integer pref which determines the custom cursor color if any.
 inline constexpr char kAccessibilityCursorColor[] =
     "settings.a11y.cursor_color";
 // A boolean pref which determines whether flash screen for notifications is
diff --git a/ash/public/cpp/accelerators.h b/ash/public/cpp/accelerators.h
index b7d81a0..c17f4c2 100644
--- a/ash/public/cpp/accelerators.h
+++ b/ash/public/cpp/accelerators.h
@@ -297,8 +297,9 @@
     {true, ui::VKEY_OEM_103, ui::EF_NONE, AcceleratorAction::kMediaRewind},
     {true, ui::VKEY_OEM_104, ui::EF_NONE, AcceleratorAction::kMediaFastForward},
 
-    // Assistant shortcuts.
-    {true, ui::VKEY_A, ui::EF_COMMAND_DOWN, AcceleratorAction::kStartAssistant},
+    // Assistant shortcut. Assistant has two shortcuts, a dedicated Assistant
+    // key and Search+A. Search+A is defined below as
+    // `kAssistantSearchPlusAAcceleratorData`.
     {true, ui::VKEY_ASSISTANT, ui::EF_NONE, AcceleratorAction::kStartAssistant},
 
     // IME mode change key.
@@ -356,6 +357,11 @@
      AcceleratorAction::kToggleGameDashboard},
 });
 
+ASH_PUBLIC_EXPORT inline constexpr AcceleratorData
+    kAssistantSearchPlusAAcceleratorData[] = {
+        {true, ui::VKEY_A, ui::EF_COMMAND_DOWN,
+         AcceleratorAction::kStartAssistant}};
+
 // Accelerators that are enabled/disabled with new accelerator mapping.
 // crbug.com/1067269
 ASH_PUBLIC_EXPORT inline constexpr auto kDisableWithNewMappingAcceleratorData =
diff --git a/ash/test/ash_test_helper.cc b/ash/test/ash_test_helper.cc
index 80774d6..0e77546e 100644
--- a/ash/test/ash_test_helper.cc
+++ b/ash/test/ash_test_helper.cc
@@ -182,7 +182,7 @@
 
 void AshTestHelper::TearDown() {
   fwupd_download_client_.reset();
-  saved_desk_test_helper_.reset();
+  saved_desk_test_helper_->Shutdown();
 
   ambient_ash_test_helper_.reset();
 
@@ -232,6 +232,7 @@
   statistics_provider_.reset();
   command_line_.reset();
   quick_pair_browser_delegate_.reset();
+  saved_desk_test_helper_.reset();
 
   // Purge ColorProviderManager between tests so that we don't accumulate
   // ColorProviderInitializers. crbug.com/1349232.
@@ -402,6 +403,9 @@
   // Requires the AppListController the Shell creates.
   app_list_test_helper_ = std::make_unique<AppListTestHelper>();
 
+  // SavedDeskTestHelper depends on account.
+  saved_desk_test_helper_ = std::make_unique<SavedDeskTestHelper>();
+
   Shell::GetPrimaryRootWindow()->Show();
   Shell::GetPrimaryRootWindow()->GetHost()->Show();
 
@@ -475,7 +479,6 @@
     StabilizeUIForPixelTest();
   }
 
-  saved_desk_test_helper_ = std::make_unique<SavedDeskTestHelper>();
   fwupd_download_client_ = std::make_unique<FakeFwupdDownloadClient>();
 }
 
diff --git a/ash/webui/annotator/untrusted_annotator_ui.cc b/ash/webui/annotator/untrusted_annotator_ui.cc
index 5487056..6fa5982 100644
--- a/ash/webui/annotator/untrusted_annotator_ui.cc
+++ b/ash/webui/annotator/untrusted_annotator_ui.cc
@@ -32,9 +32,7 @@
 
 namespace {
 
-void CreateAndAddAnnotatorHTMLSource(
-    content::WebUI* web_ui,
-    UntrustedAnnotatorUIDelegate* delegate) {
+void CreateAndAddAnnotatorHTMLSource(content::WebUI* web_ui) {
   content::WebUIDataSource* source = content::WebUIDataSource::CreateAndAdd(
       web_ui->GetWebContents()->GetBrowserContext(),
       kChromeUIUntrustedAnnotatorUrl);
@@ -88,17 +86,14 @@
   // Loading WASM in chrome-untrusted://projector-annotator/annotator/ink.js is
   // not compatible with trusted types.
   source->DisableTrustedTypesCSP();
-  delegate->PopulateLoadTimeData(source);
   source->UseStringsJs();
 }
 
 }  // namespace
 
-UntrustedAnnotatorUI::UntrustedAnnotatorUI(
-    content::WebUI* web_ui,
-    UntrustedAnnotatorUIDelegate* delegate)
+UntrustedAnnotatorUI::UntrustedAnnotatorUI(content::WebUI* web_ui)
     : UntrustedWebUIController(web_ui) {
-  CreateAndAddAnnotatorHTMLSource(web_ui, delegate);
+  CreateAndAddAnnotatorHTMLSource(web_ui);
 }
 
 UntrustedAnnotatorUI::~UntrustedAnnotatorUI() = default;
diff --git a/ash/webui/annotator/untrusted_annotator_ui.h b/ash/webui/annotator/untrusted_annotator_ui.h
index 3d60d909..b33886e 100644
--- a/ash/webui/annotator/untrusted_annotator_ui.h
+++ b/ash/webui/annotator/untrusted_annotator_ui.h
@@ -11,33 +11,16 @@
 #include "mojo/public/cpp/bindings/receiver.h"
 #include "ui/webui/untrusted_web_ui_controller.h"
 
-namespace content {
-class WebUIDataSource;
-}  // namespace content
-
 namespace ash {
 
 class UntrustedAnnotatorPageHandlerImpl;
 
-// A delegate used during data source creation to expose some //chrome
-// functionality to the data source
-class UntrustedAnnotatorUIDelegate {
- public:
-  virtual ~UntrustedAnnotatorUIDelegate() {}
-  // Takes a WebUIDataSource, and populates its load-time data.
-  virtual void PopulateLoadTimeData(content::WebUIDataSource* source) = 0;
-};
-
 // The webui for chrome-untrusted://projector-annotator.
 class UntrustedAnnotatorUI
     : public ui::UntrustedWebUIController,
       public annotator::mojom::UntrustedAnnotatorPageHandlerFactory {
  public:
-  // UntrustedAnnotatorUI does not store the passed in
-  // `UntrustedAnnotatorUIDelegate`.
-  UntrustedAnnotatorUI(
-      content::WebUI* web_ui,
-      UntrustedAnnotatorUIDelegate* delegate);
+  UntrustedAnnotatorUI(content::WebUI* web_ui);
   UntrustedAnnotatorUI(const UntrustedAnnotatorUI&) = delete;
   UntrustedAnnotatorUI& operator=(
       const UntrustedAnnotatorUI&) = delete;
diff --git a/ash/webui/boca_ui/BUILD.gn b/ash/webui/boca_ui/BUILD.gn
index 99af65a..74e7a0ca 100644
--- a/ash/webui/boca_ui/BUILD.gn
+++ b/ash/webui/boca_ui/BUILD.gn
@@ -38,6 +38,7 @@
     "//ash/webui/system_apps/public:system_web_app_config",
     "//base",
     "//chromeos/ash/components/boca",
+    "//chromeos/ash/components/boca:spotlight",
     "//chromeos/ash/components/boca/proto",
     "//chromeos/ash/components/boca/session_api",
     "//chromeos/ash/components/browser_context_helper",
@@ -83,6 +84,7 @@
     "//chrome/test:test_support",
     "//chromeos/ash/components:test_support",
     "//chromeos/ash/components/boca",
+    "//chromeos/ash/components/boca:spotlight",
     "//chromeos/ash/components/boca/proto",
     "//chromeos/ash/components/boca/session_api",
     "//chromeos/ash/components/browser_context_helper",
diff --git a/ash/webui/boca_ui/boca_app_page_handler.cc b/ash/webui/boca_ui/boca_app_page_handler.cc
index 1c03054..e4c45a2 100644
--- a/ash/webui/boca_ui/boca_app_page_handler.cc
+++ b/ash/webui/boca_ui/boca_app_page_handler.cc
@@ -27,6 +27,7 @@
 #include "chromeos/ash/components/boca/proto/bundle.pb.h"
 #include "chromeos/ash/components/boca/proto/roster.pb.h"
 #include "chromeos/ash/components/boca/proto/session.pb.h"
+#include "chromeos/ash/components/boca/session_api/constants.h"
 #include "chromeos/ash/components/boca/session_api/create_session_request.h"
 #include "chromeos/ash/components/boca/session_api/get_session_request.h"
 #include "chromeos/ash/components/boca/session_api/join_session_request.h"
@@ -428,6 +429,25 @@
   session_client_impl_->JoinSession(std::move(request));
 }
 
+void BocaAppHandler::ViewStudentScreen(const std::string& id,
+                                       ViewStudentScreenCallback callback) {
+  CHECK(spotlight_service_);
+  spotlight_service_->ViewScreen(
+      id, kSchoolToolsApiBaseUrl,
+      base::BindOnce(
+          [](ViewStudentScreenCallback callback,
+             base::expected<bool, google_apis::ApiErrorCode> result) {
+            if (!result.has_value()) {
+              std::move(callback).Run(
+                  mojom::ViewStudentScreenError::kHTTPError);
+              return;
+            } else {
+              std::move(callback).Run(std::nullopt);
+            }
+          },
+          std::move(callback)));
+}
+
 void BocaAppHandler::OnStudentActivityUpdated(
     std::vector<mojom::IdentifiedActivityPtr> activities) {
   if (!test_activity_callback_.is_null()) {
@@ -461,8 +481,12 @@
       auto identity_ptr = mojom::IdentifiedActivity::New(
           item.first, mojom::StudentActivity::New(
                           item.second.state() == ::boca::StudentStatus::ACTIVE,
-                          device.second.activity().active_tab().title(), false,
-                          false, mojom::JoinMethod::kRoster));
+                          device.second.activity().active_tab().title(),
+                          /*is_caption_enabled=*/false,
+                          /*is_hand_raised=*/false, mojom::JoinMethod::kRoster,
+                          device.second.view_screen_config()
+                              .connection_param()
+                              .connection_code()));
       result.push_back(std::move(identity_ptr));
     }
   }
@@ -503,6 +527,10 @@
       std::move(local_caption_config));
 }
 
+void BocaAppHandler::SetSpotlightService(SpotlightService* spotlight_service) {
+  spotlight_service_ = spotlight_service;
+}
+
 void BocaAppHandler::SetFloatModeAndBoundsForWindow(
     bool isFloatMode,
     aura::Window* window,
diff --git a/ash/webui/boca_ui/boca_app_page_handler.h b/ash/webui/boca_ui/boca_app_page_handler.h
index d962304..2394dd3 100644
--- a/ash/webui/boca_ui/boca_app_page_handler.h
+++ b/ash/webui/boca_ui/boca_app_page_handler.h
@@ -18,6 +18,7 @@
 #include "chromeos/ash/components/boca/proto/roster.pb.h"
 #include "chromeos/ash/components/boca/proto/session.pb.h"
 #include "chromeos/ash/components/boca/session_api/session_client_impl.h"
+#include "chromeos/ash/components/boca/spotlight/spotlight_service.h"
 #include "components/account_id/account_id.h"
 #include "content/public/browser/web_ui.h"
 #include "mojo/public/cpp/bindings/receiver.h"
@@ -70,6 +71,8 @@
   void SubmitAccessCode(const std::string& access_code,
                         SubmitAccessCodeCallback callback) override;
 
+  void ViewStudentScreen(const std::string& id,
+                         ViewStudentScreenCallback callback) override;
   // mojom::Page:
   void OnStudentActivityUpdated(
       std::vector<mojom::IdentifiedActivityPtr> activities) override;
@@ -93,6 +96,8 @@
 
   void NotifyLocalCaptionConfigUpdate(mojom::CaptionConfigPtr config);
 
+  void SetSpotlightService(SpotlightService* spotlight_service);
+
   // For testing.
   // Mojo service binding is not invoked in unit test. So we manually override
   // a interceptor for testing.
@@ -100,6 +105,7 @@
       ActivityInterceptorCallback callback);
   void SetSessionConfigInterceptorCallbackForTesting(
       SessionConfigInterceptorCallback callback);
+  void SetSpotlightServiceForTesting(std::unique_ptr<SpotlightService> service);
 
  private:
   void UpdateSessionConfig();
@@ -122,7 +128,8 @@
   const bool is_producer_;
   TabInfoCollector tab_info_collector_;
   std::unique_ptr<ClassroomPageHandlerImpl> class_room_page_handler_;
-  // Lastest config is not always the same as the instance maintained in
+  raw_ptr<SpotlightService> spotlight_service_;
+  // Latest config is not always the same as the instance maintained in
   // boca_session_manager as it contains the async config that hasn't been
   // committed yet. OnTask and caption config use the same server endpoint. We
   // keep track of pending config to avoid override in race.
diff --git a/ash/webui/boca_ui/boca_app_page_handler_unittest.cc b/ash/webui/boca_ui/boca_app_page_handler_unittest.cc
index 05a24ad..a42c8ae 100644
--- a/ash/webui/boca_ui/boca_app_page_handler_unittest.cc
+++ b/ash/webui/boca_ui/boca_app_page_handler_unittest.cc
@@ -29,6 +29,7 @@
 #include "chromeos/ash/components/boca/session_api/remove_student_request.h"
 #include "chromeos/ash/components/boca/session_api/session_client_impl.h"
 #include "chromeos/ash/components/boca/session_api/update_session_request.h"
+#include "chromeos/ash/components/boca/spotlight/spotlight_service.h"
 #include "chromeos/ash/components/browser_context_helper/annotated_account_id.h"
 #include "chromeos/ash/components/browser_context_helper/browser_context_helper.h"
 #include "chromeos/ash/components/browser_context_helper/fake_browser_context_helper_delegate.h"
@@ -214,6 +215,17 @@
   ~MockSessionManager() override = default;
 };
 
+class MockSpotlightService : public SpotlightService {
+ public:
+  explicit MockSpotlightService(
+      std::unique_ptr<google_apis::RequestSender> sender)
+      : SpotlightService(std::move(sender)) {}
+  MOCK_METHOD(void,
+              ViewScreen,
+              (std::string, std::string, ViewScreenRequestCallback),
+              (override));
+};
+
 class BocaAppPageHandlerTest : public testing::Test {
  public:
   BocaAppPageHandlerTest() = default;
@@ -275,6 +287,7 @@
         pending_receiver_.InitWithNewPipeAndPassRemote(), web_ui_.get(),
         /*classroom_client_impl=*/nullptr, &session_client_impl_,
         /*is_producer=*/true);
+    boca_app_handler_->SetSpotlightService(&spotlight_service_);
   }
 
   void TearDown() override {
@@ -295,6 +308,7 @@
   MockBocaAppClient* boca_app_client() { return boca_app_client_.get(); }
   MockSessionManager* session_manager() { return session_manager_.get(); }
   BocaAppHandler* boca_app_handler() { return boca_app_handler_.get(); }
+  MockSpotlightService* spotlight_service() { return &spotlight_service_; }
 
  private:
   content::BrowserTaskEnvironment task_environment_;
@@ -314,6 +328,7 @@
   mojo::Remote<mojom::PageHandler> remote_;
   mojo::PendingReceiver<mojom::Page> pending_receiver_;
   std::unique_ptr<BocaAppHandler> boca_app_handler_;
+  StrictMock<MockSpotlightService> spotlight_service_{nullptr};
 };
 
 TEST_F(BocaAppPageHandlerTest, CreateSessionWithFullInput) {
@@ -1338,6 +1353,9 @@
   ::boca::StudentDevice device_11;
   auto* activity_11 = device_11.mutable_activity();
   activity_11->mutable_active_tab()->set_title("google1");
+  device_11.mutable_view_screen_config()
+      ->mutable_connection_param()
+      ->set_connection_code("abcd");
   (*status_1.mutable_devices())["device1"] = std::move(device_1);
   (*status_1.mutable_devices())["device11"] = std::move(device_11);
 
@@ -1373,6 +1391,11 @@
   EXPECT_EQ("2", result[2]->id);
   EXPECT_EQ("youtube", result[2]->activity->active_tab);
   EXPECT_FALSE(result[2]->activity->is_active);
+
+  // Connection code should be set
+  EXPECT_EQ("abcd", result[0]->activity->view_screen_session_code);
+  EXPECT_EQ("", result[1]->activity->view_screen_session_code);
+  EXPECT_EQ("", result[2]->activity->view_screen_session_code);
 }
 
 TEST_F(BocaAppPageHandlerTest, RemoveStudentSucceedAlsoRemoveFromLocalSession) {
@@ -1596,6 +1619,37 @@
   EXPECT_EQ(mojom::SubmitAccessCodeError::kInvalid, future_1.Get().value());
 }
 
+TEST_F(BocaAppPageHandlerTest, ViewScreenSucceeded) {
+  const std::string student_id = "123";
+  EXPECT_CALL(*spotlight_service(),
+              ViewScreen(student_id, kSchoolToolsApiBaseUrl, _))
+      .WillOnce(WithArg<2>(Invoke(
+          [&](auto request) { std::move(request).Run(base::ok(true)); })));
+
+  base::test::TestFuture<std::optional<mojom::ViewStudentScreenError>> future;
+
+  boca_app_handler()->ViewStudentScreen(student_id, future.GetCallback());
+  ASSERT_TRUE(future.Wait());
+  EXPECT_FALSE(future.Get().has_value());
+}
+
+TEST_F(BocaAppPageHandlerTest, ViewScreenFailed) {
+  const std::string student_id = "123";
+
+  EXPECT_CALL(*spotlight_service(),
+              ViewScreen(student_id, kSchoolToolsApiBaseUrl, _))
+      .WillOnce(WithArg<2>(Invoke([&](auto request) {
+        std::move(request).Run(
+            base::unexpected(google_apis::ApiErrorCode::HTTP_FORBIDDEN));
+      })));
+
+  base::test::TestFuture<std::optional<mojom::ViewStudentScreenError>> future;
+
+  boca_app_handler()->ViewStudentScreen(student_id, future.GetCallback());
+  ASSERT_TRUE(future.Wait());
+  EXPECT_EQ(mojom::ViewStudentScreenError::kHTTPError, future.Get().value());
+}
+
 class BocaAppPageHandlerFloatModeTest : public AshTestBase {
  public:
   BocaAppPageHandlerFloatModeTest() = default;
diff --git a/ash/webui/boca_ui/boca_ui.cc b/ash/webui/boca_ui/boca_ui.cc
index de6d67d..3e3be73 100644
--- a/ash/webui/boca_ui/boca_ui.cc
+++ b/ash/webui/boca_ui/boca_ui.cc
@@ -129,6 +129,7 @@
       std::make_unique<ClassroomPageHandlerImpl>(),
       BocaAppClient::Get()->GetSessionManager()->session_client_impl(),
       is_producer_);
+  page_handler_impl_->SetSpotlightService(&spotlight_service_);
 }
 
 WEB_UI_CONTROLLER_TYPE_IMPL(BocaUI)
diff --git a/ash/webui/boca_ui/boca_ui.h b/ash/webui/boca_ui/boca_ui.h
index c27ea99..3a1d91a 100644
--- a/ash/webui/boca_ui/boca_ui.h
+++ b/ash/webui/boca_ui/boca_ui.h
@@ -11,6 +11,7 @@
 #include "ash/webui/boca_ui/url_constants.h"
 #include "ash/webui/common/chrome_os_webui_config.h"
 #include "ash/webui/system_apps/public/system_web_app_ui_config.h"
+#include "chromeos/ash/components/boca/spotlight/spotlight_service.h"
 #include "content/public/browser/web_ui.h"
 #include "content/public/browser/webui_config.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
@@ -69,6 +70,7 @@
   const bool is_producer_;
   mojo::Receiver<boca::mojom::BocaPageHandlerFactory> receiver_{this};
   std::unique_ptr<BocaAppHandler> page_handler_impl_;
+  SpotlightService spotlight_service_;
 
   std::unique_ptr<ui::ColorChangeHandler> color_provider_handler_;
 
diff --git a/ash/webui/boca_ui/mojom/boca.mojom b/ash/webui/boca_ui/mojom/boca.mojom
index 6dbf86d..c51307a 100644
--- a/ash/webui/boca_ui/mojom/boca.mojom
+++ b/ash/webui/boca_ui/mojom/boca.mojom
@@ -131,6 +131,8 @@
   // TODO(b/365191878): Remove this after refactoring existing schema to support
   // multi-group.
   JoinMethod join_method;
+  // A string-format code to connect to student's device.
+  string? view_screen_session_code;
 };
 
 struct IdentifiedActivity{
@@ -165,6 +167,11 @@
   kInvalid,
 };
 
+enum ViewStudentScreenError {
+  kInvalid,
+  kHTTPError,
+};
+
 // Implemented by browser process for page chrome-untrusted://boca-app/
 interface PageHandler {
   // Fetches a list of browser windows and tabs in it. Windows are ordered using
@@ -194,6 +201,8 @@
   SetFloatMode(bool isFloatMode)=> (bool success);
   // Submit access code to join a current class session.
   SubmitAccessCode(string access_code) => (SubmitAccessCodeError? error);
+  // Requests to view screen of a given student.
+  ViewStudentScreen(string id) => (ViewStudentScreenError? error);
 };
 
 // Implemented by renderer process
diff --git a/ash/webui/boca_ui/resources/app/boca_app.ts b/ash/webui/boca_ui/resources/app/boca_app.ts
index 191921d..4448304 100644
--- a/ash/webui/boca_ui/resources/app/boca_app.ts
+++ b/ash/webui/boca_ui/resources/app/boca_app.ts
@@ -148,6 +148,7 @@
   // TODO(b/365191878): Remove this after refactoring existing schema to support
   // multi-group.
   joinMethod: JoinMethod;
+  viewScreenSessionCode?: string;
 }
 
 /**
@@ -223,6 +224,11 @@
    * Submit an access code for student to join the session.
    */
   submitAccessCode(accessCode: string): Promise<SubmitAccessCodeResult>;
+
+  /**
+   * Request to view the screen of the student with the given id.
+   */
+  viewStudentScreen(id: string): Promise<boolean>;
 }
 
 /**
diff --git a/ash/webui/boca_ui/resources/app/client_delegate.ts b/ash/webui/boca_ui/resources/app/client_delegate.ts
index c08490d..9c1de0c 100644
--- a/ash/webui/boca_ui/resources/app/client_delegate.ts
+++ b/ash/webui/boca_ui/resources/app/client_delegate.ts
@@ -24,7 +24,10 @@
                                                undefined,
           isCaptionEnabled: item.activity.isCaptionEnabled,
           isHandRaised: item.activity.isHandRaised,
-          joinMethod: item.activity.joinMethod.valueOf()
+          joinMethod: item.activity.joinMethod.valueOf(),
+          viewScreenSessionCode: item.activity.viewScreenSessionCode ?
+              item.activity.viewScreenSessionCode :
+              undefined,
         }
     }
   })
@@ -224,6 +227,10 @@
           return SubmitAccessCodeResult.SUCCESS;
         }
         return SubmitAccessCodeResult.INVALID_CODE;
+      },
+      viewStudentScreen: async (id: string) => {
+        const result = await pageHandler.viewStudentScreen(id);
+        return !resultHasError(result);
       }
     };
   }
diff --git a/ash/webui/common/resources/BUILD.gn b/ash/webui/common/resources/BUILD.gn
index 82205716..d43efa9d 100644
--- a/ash/webui/common/resources/BUILD.gn
+++ b/ash/webui/common/resources/BUILD.gn
@@ -296,9 +296,6 @@
     "metrics:copy_files",
     "shortcut_input_ui:copy_mojo_files",
     "//ash/webui/common/resources:i18n_behavior",
-    "//ash/webui/common/resources/network:onc_mojo",
-    "//chromeos/services/network_config/public/mojom:mojom_webui_js",
-    "//chromeos/services/network_config/public/mojom:network_types_webui_js",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
   ]
 
@@ -567,7 +564,6 @@
     ":closure_compile_local",
     "cr_picture:closure_compile_module",
     "multidevice_setup:closure_compile_module",
-    "network:closure_compile_module",
     "post_message_api:closure_compile",
     "smb_shares:closure_compile_module",
   ]
diff --git a/ash/webui/common/resources/cellular_setup/esim_flow_ui.ts b/ash/webui/common/resources/cellular_setup/esim_flow_ui.ts
index 8eb0541..33cf155 100644
--- a/ash/webui/common/resources/cellular_setup/esim_flow_ui.ts
+++ b/ash/webui/common/resources/cellular_setup/esim_flow_ui.ts
@@ -17,6 +17,7 @@
 import {NetworkListenerBehavior} from '//resources/ash/common/network/network_listener_behavior.js';
 import {assert, assertNotReached} from '//resources/js/assert.js';
 import {ESimManagerInterface, ESimOperationResult, ESimProfileProperties, EuiccRemote, ProfileInstallMethod, ProfileInstallResult, ProfileState} from '//resources/mojo/chromeos/ash/services/cellular_setup/public/mojom/esim_manager.mojom-webui.js';
+import type {CrosNetworkConfigInterface} from '//resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
 import {FilterType, NetworkStateProperties, NO_LIMIT} from '//resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
 import {ConnectionStateType, NetworkType} from '//resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
@@ -226,7 +227,7 @@
     super();
 
     this.eSimManagerRemote_ = getESimManagerRemote();
-    const networkConfig =
+    const networkConfig: CrosNetworkConfigInterface =
         MojoInterfaceProviderImpl.getInstance().getMojoServiceRemote();
 
     const filter = {
diff --git a/ash/webui/common/resources/cellular_setup/profile_discovery_list_page.ts b/ash/webui/common/resources/cellular_setup/profile_discovery_list_page.ts
index ac29403..e83c349 100644
--- a/ash/webui/common/resources/cellular_setup/profile_discovery_list_page.ts
+++ b/ash/webui/common/resources/cellular_setup/profile_discovery_list_page.ts
@@ -17,6 +17,7 @@
 import {MojoInterfaceProviderImpl} from '//resources/ash/common/network/mojo_interface_provider.js';
 import {assert} from '//resources/js/assert.js';
 import {ESimProfileProperties} from '//resources/mojo/chromeos/ash/services/cellular_setup/public/mojom/esim_manager.mojom-webui.js';
+import type {CrosNetworkConfigInterface} from '//resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
 import {NetworkType} from '//resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
@@ -81,9 +82,9 @@
   constructor() {
     super();
 
-    const networkConfig =
+    const networkConfig: CrosNetworkConfigInterface =
         MojoInterfaceProviderImpl.getInstance().getMojoServiceRemote();
-    networkConfig!.getDeviceStateList().then(response => {
+    networkConfig.getDeviceStateList().then(response => {
       const devices = response.result;
       const deviceState =
           devices.find(device => device.type === NetworkType.kCellular) || null;
diff --git a/ash/webui/common/resources/network/BUILD.gn b/ash/webui/common/resources/network/BUILD.gn
deleted file mode 100644
index 8d3810c..0000000
--- a/ash/webui/common/resources/network/BUILD.gn
+++ /dev/null
@@ -1,229 +0,0 @@
-# Copyright 2018 The Chromium Authors
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//third_party/closure_compiler/compile_js.gni")
-
-assert(is_chromeos_ash, "Only ChromeOS components belong here.")
-
-js_type_check("closure_compile_module") {
-  is_polymer3 = true
-  closure_flags = default_closure_args + mojom_js_args
-
-  deps = [
-    ":apn_detail_dialog",
-    ":apn_list_item",
-    ":apn_selection_dialog_list_item",
-    ":cellular_utils",
-    ":cr_policy_network_behavior_mojo",
-    ":cr_policy_network_indicator_mojo",
-    ":mojo_interface_provider",
-    ":network_config_element_behavior",
-    ":network_config_select",
-    ":network_config_toggle",
-    ":network_icon",
-    ":network_ip_config",
-    ":network_list_item",
-    ":network_list_types",
-    ":network_listener_behavior",
-    ":network_password_input",
-    ":network_property_list_mojo",
-    ":onc_mojo",
-    ":sim_lock_dialogs",
-  ]
-}
-
-js_library("mojo_interface_provider") {
-  deps = [
-    "//ash/webui/common/resources:cr_deprecated",
-    "//chromeos/services/network_config/public/mojom:mojom_webui_js",
-  ]
-}
-
-js_library("cr_policy_network_behavior_mojo") {
-  deps = [
-    "//ash/webui/common/resources:cr_policy_indicator_behavior",
-    "//chromeos/services/network_config/public/mojom:mojom_webui_js",
-    "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-  ]
-}
-
-js_library("cr_policy_network_indicator_mojo") {
-  deps = [
-    ":cr_policy_network_behavior_mojo",
-    ":onc_mojo",
-    "//ash/webui/common/resources:cr_policy_indicator_behavior",
-    "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-  ]
-}
-
-js_library("apn_list_item") {
-  deps = [
-    "//ash/webui/common/resources:i18n_behavior",
-    "//ash/webui/common/resources:load_time_data.m",
-    "//ash/webui/common/resources/network:cellular_utils",
-    "//chromeos/services/network_config/public/mojom:mojom_webui_js",
-    "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-  ]
-  externs_list = [ "//ash/webui/common/resources/cr_elements/cr_action_menu/cr_action_menu_externs.js" ]
-}
-
-js_library("apn_detail_dialog") {
-  deps = [
-    ":onc_mojo",
-    "//ash/webui/common/resources:assert",
-    "//ash/webui/common/resources:i18n_behavior",
-    "//ash/webui/common/resources/network:cellular_utils",
-    "//chromeos/services/network_config/public/mojom:mojom_webui_js",
-    "//third_party/polymer/v3_0/components-chromium/iron-collapse:iron-collapse",
-    "//third_party/polymer/v3_0/components-chromium/iron-icon:iron-icon",
-    "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-  ]
-  externs_list = [
-    "//ash/webui/common/resources/cr_elements/cr_button/cr_button_externs.js",
-    "//ash/webui/common/resources/cr_elements/cr_dialog/cr_dialog_externs.js",
-    "//ash/webui/common/resources/cr_elements/cr_input/cr_input_externs.js",
-  ]
-}
-
-js_library("apn_selection_dialog_list_item") {
-  deps = [
-    "//ash/webui/common/resources:i18n_behavior",
-    "//ash/webui/common/resources/network:cellular_utils",
-    "//chromeos/services/network_config/public/mojom:mojom_webui_js",
-    "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-  ]
-  externs_list = []
-}
-
-js_library("network_config_element_behavior") {
-}
-
-js_library("network_config_select") {
-  deps = [
-    ":cr_policy_network_behavior_mojo",
-    ":cr_policy_network_indicator_mojo",
-    ":network_config_element_behavior",
-    "//ash/webui/common/resources:i18n_behavior",
-    "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-  ]
-  externs_list = [ "//ash/webui/common/resources/cr_elements/policy/cr_tooltip_icon_externs.js" ]
-}
-
-js_library("network_config_toggle") {
-  deps = [
-    ":cr_policy_network_behavior_mojo",
-    ":cr_policy_network_indicator_mojo",
-    ":network_config_element_behavior",
-    "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-  ]
-  externs_list = [
-    "//ash/webui/common/resources/cr_elements/cr_toggle/cr_toggle_externs.js",
-  ]
-}
-
-js_library("network_icon") {
-  deps = [
-    ":onc_mojo",
-    "//ash/webui/common/resources:assert",
-    "//ash/webui/common/resources:i18n_behavior",
-    "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-  ]
-}
-
-js_library("network_ip_config") {
-  deps = [
-    ":cr_policy_network_behavior_mojo",
-    ":network_property_list_mojo",
-    ":onc_mojo",
-    "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-  ]
-  externs_list = [
-    "//ash/webui/common/resources/cr_elements/cr_toggle/cr_toggle_externs.js",
-    "//ash/webui/common/resources/cr_elements/policy/cr_policy_indicator_externs.js",
-  ]
-}
-
-js_library("network_list_item") {
-  deps = [
-    ":cr_policy_network_behavior_mojo",
-    ":mojo_interface_provider",
-    ":network_list_types",
-    ":onc_mojo",
-    "//ash/webui/common/resources:focus_row_behavior",
-    "//third_party/polymer/v3_0/components-chromium/paper-spinner:paper-spinner-lite",
-    "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-  ]
-  externs_list = [
-    "//ash/webui/common/resources/cellular_setup/cellular_types_externs.js",
-  ]
-}
-
-js_library("network_list_types") {
-  deps = [ ":onc_mojo" ]
-}
-
-js_library("network_listener_behavior") {
-  deps = [
-    ":mojo_interface_provider",
-    "//ash/webui/common/resources:assert",
-  ]
-}
-
-js_library("network_password_input") {
-  deps = [
-    ":cr_policy_network_behavior_mojo",
-    ":cr_policy_network_indicator_mojo",
-    ":network_config_element_behavior",
-    "//ash/webui/common/resources:i18n_behavior",
-    "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-  ]
-  externs_list = [
-    "//ash/webui/common/resources/cr_elements/cr_input/cr_input_externs.js",
-  ]
-}
-
-js_library("network_property_list_mojo") {
-  deps = [
-    ":cr_policy_network_behavior_mojo",
-    ":cr_policy_network_indicator_mojo",
-    ":onc_mojo",
-    "//ash/webui/common/resources:assert",
-    "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-  ]
-  externs_list = [
-    "//ash/webui/common/resources/cr_elements/cr_input/cr_input_externs.js",
-  ]
-}
-
-js_library("onc_mojo") {
-  deps = [
-    "//ash/webui/common/resources:assert",
-    "//ash/webui/common/resources:load_time_data.m",
-    "//chromeos/services/network_config/public/mojom:mojom_webui_js",
-  ]
-}
-
-js_library("cellular_utils") {
-  deps = [
-    ":mojo_interface_provider",
-    ":onc_mojo",
-  ]
-}
-
-js_library("sim_lock_dialogs") {
-  deps = [
-    ":mojo_interface_provider",
-    ":network_password_input",
-    ":onc_mojo",
-    "//ash/webui/common/resources:i18n_behavior",
-    "//third_party/polymer/v3_0/components-chromium/iron-flex-layout:iron-flex-layout-classes",
-    "//third_party/polymer/v3_0/components-chromium/iron-icon:iron-icon",
-    "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-  ]
-  externs_list = [
-    "//ash/webui/common/resources/cr_elements/cr_button/cr_button_externs.js",
-    "//ash/webui/common/resources/cr_elements/cr_dialog/cr_dialog_externs.js",
-    "//ash/webui/common/resources/cr_elements/cr_toggle/cr_toggle_externs.js",
-  ]
-}
diff --git a/ash/webui/common/resources/network/apn_detail_dialog.js b/ash/webui/common/resources/network/apn_detail_dialog.js
index 121d808c..afac5a6 100644
--- a/ash/webui/common/resources/network/apn_detail_dialog.js
+++ b/ash/webui/common/resources/network/apn_detail_dialog.js
@@ -20,7 +20,7 @@
 import {assert} from '//resources/ash/common/assert.js';
 import {I18nBehavior, I18nBehaviorInterface} from '//resources/ash/common/i18n_behavior.js';
 import {focusWithoutInk} from '//resources/js/focus_without_ink.js';
-import {ApnAuthenticationType, ApnIpType, ApnProperties, ApnState, ApnType, CrosNetworkConfigInterface} from '//resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
+import {ApnAuthenticationType, ApnIpType, ApnState, ApnType} from '//resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
 import {afterNextRender, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {getTemplate} from './apn_detail_dialog.html.js';
diff --git a/ash/webui/common/resources/network/apn_list_item.js b/ash/webui/common/resources/network/apn_list_item.js
index fa49fe09..2494adc 100644
--- a/ash/webui/common/resources/network/apn_list_item.js
+++ b/ash/webui/common/resources/network/apn_list_item.js
@@ -13,7 +13,7 @@
 import {I18nBehavior, I18nBehaviorInterface} from '//resources/ash/common/i18n_behavior.js';
 import {ApnDetailDialogMode, ApnEventData, getApnDisplayName} from '//resources/ash/common/network/cellular_utils.js';
 import {MojoInterfaceProviderImpl} from '//resources/ash/common/network/mojo_interface_provider.js';
-import {ApnProperties, ApnState, ApnType, CrosNetworkConfigInterface} from '//resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
+import {ApnState, ApnType} from '//resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
 import {PortalState} from '//resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.js';
diff --git a/ash/webui/common/resources/network/apn_selection_dialog_list_item.js b/ash/webui/common/resources/network/apn_selection_dialog_list_item.js
index ccafcfd..05005db8 100644
--- a/ash/webui/common/resources/network/apn_selection_dialog_list_item.js
+++ b/ash/webui/common/resources/network/apn_selection_dialog_list_item.js
@@ -12,7 +12,6 @@
 
 import {I18nBehavior, I18nBehaviorInterface} from '//resources/ash/common/i18n_behavior.js';
 import {getApnDisplayName} from '//resources/ash/common/network/cellular_utils.js';
-import {ApnProperties} from '//resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
 import {mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {getTemplate} from './apn_selection_dialog_list_item.html.js';
diff --git a/ash/webui/common/resources/network/cellular_utils.js b/ash/webui/common/resources/network/cellular_utils.js
index 98c9056..1c41a0e 100644
--- a/ash/webui/common/resources/network/cellular_utils.js
+++ b/ash/webui/common/resources/network/cellular_utils.js
@@ -5,11 +5,17 @@
 import '//resources/ash/common/network/onc_mojo.js';
 
 import {MojoInterfaceProviderImpl} from '//resources/ash/common/network/mojo_interface_provider.js';
-import {ApnProperties, ApnType, DeviceStateProperties, FilterType, ManagedProperties, NetworkStateProperties, NO_LIMIT} from '//resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
+import {ApnType, FilterType, NO_LIMIT} from '//resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
 import {ConnectionStateType, NetworkType} from '//resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 
 import {OncMojo} from './onc_mojo.js';
 
+// Type aliases for js-webui to ts-webui migration
+/** @typedef {*} ApnProperties */
+/** @typedef {*} DeviceStateProperties */
+/** @typedef {*} ManagedProperties */
+/** @typedef {*} NetworkStateProperties */
+
 /**
  * TODO(b/162365553): Implement Edit mode.
  * @enum {string}
diff --git a/ash/webui/common/resources/network/cr_policy_network_behavior_mojo.js b/ash/webui/common/resources/network/cr_policy_network_behavior_mojo.js
index 0171b8c0..c3246f8 100644
--- a/ash/webui/common/resources/network/cr_policy_network_behavior_mojo.js
+++ b/ash/webui/common/resources/network/cr_policy_network_behavior_mojo.js
@@ -8,13 +8,20 @@
  * optional properties (which may be null|undefined).
  */
 
-import {ApnProperties, ManagedApnList, ManagedBoolean, ManagedInt32, ManagedString, ManagedStringList} from '//resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
 import {OncSource, PolicySource} from '//resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 
 import {CrPolicyIndicatorType} from '../cr_policy_indicator_behavior.js';
 
 import {OncMojo} from './onc_mojo.js';
 
+// Type aliases for js-webui to ts-webui migration
+/** @typedef {*} ApnProperties */
+/** @typedef {*} ManagedApnList */
+/** @typedef {*} ManagedBoolean */
+/** @typedef {*} ManagedInt32 */
+/** @typedef {*} ManagedString */
+/** @typedef {*} ManagedStringList */
+
 /** @polymerBehavior */
 export const CrPolicyNetworkBehaviorMojo = {
   /**
diff --git a/ash/webui/common/resources/network/cr_policy_network_indicator_mojo.js b/ash/webui/common/resources/network/cr_policy_network_indicator_mojo.js
index bc3c159..0384248 100644
--- a/ash/webui/common/resources/network/cr_policy_network_indicator_mojo.js
+++ b/ash/webui/common/resources/network/cr_policy_network_indicator_mojo.js
@@ -11,7 +11,6 @@
 import '//resources/ash/common/cr_elements/cr_hidden_style.css.js';
 
 import {CrPolicyIndicatorBehavior, CrPolicyIndicatorBehaviorInterface, CrPolicyIndicatorType} from '//resources/ash/common/cr_policy_indicator_behavior.js';
-import {ManagedBoolean, ManagedInt32, ManagedString} from '//resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
 import {PolicySource} from '//resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
diff --git a/ash/webui/common/resources/network/mojo_interface_provider.js b/ash/webui/common/resources/network/mojo_interface_provider.js
index b501ae32..4468935 100644
--- a/ash/webui/common/resources/network/mojo_interface_provider.js
+++ b/ash/webui/common/resources/network/mojo_interface_provider.js
@@ -2,22 +2,22 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {CrosNetworkConfig, CrosNetworkConfigInterface} from '//resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
+import {CrosNetworkConfig} from '//resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
 
 /** @interface */
 export class MojoInterfaceProvider {
-  /** @return {!CrosNetworkConfigInterface} */
+  /** @return {!*} was !CrosNetworkConfigInterface */
   getMojoServiceRemote() {}
 }
 
 /** @implements {MojoInterfaceProvider} */
 export class MojoInterfaceProviderImpl {
   constructor() {
-    /** @private {?CrosNetworkConfigInterface} */
+    /** @private {?*} was ?CrosNetworkConfigInterface */
     this.remote_ = null;
   }
 
-  /** @return {!CrosNetworkConfigInterface} */
+  /** @return {!*} was !CrosNetworkConfigInterface */
   getMojoServiceRemote() {
     if (!this.remote_) {
       this.remote_ = CrosNetworkConfig.getRemote();
@@ -25,7 +25,7 @@
 
     return this.remote_;
   }
-  /** @param {!CrosNetworkConfigInterface} remote */
+  /** @param {!*} was !CrosNetworkConfigInterface remote */
   setMojoServiceRemoteForTest(remote) {
     this.remote_ = remote;
   }
diff --git a/ash/webui/common/resources/network/network_apnlist.ts b/ash/webui/common/resources/network/network_apnlist.ts
index 135d59d..bb8d1ff70 100644
--- a/ash/webui/common/resources/network/network_apnlist.ts
+++ b/ash/webui/common/resources/network/network_apnlist.ts
@@ -163,9 +163,9 @@
       ipType: ApnIpType.kAutomatic,
       apnTypes: [ApnType.kDefault],
       source: ApnSource.kModem,
-      id: undefined,
-      language: undefined,
-      attach: undefined,
+      id: null,
+      language: null,
+      attach: null,
     };
   }
 
@@ -206,8 +206,7 @@
     const newApnList = this.managedProperties.typeProperties.cellular!.apnList;
     const oldApnList = oldManagedProperties.typeProperties.cellular!.apnList;
     if (!OncMojo.apnListMatch(
-            oldApnList && oldApnList.activeValue,
-            newApnList && newApnList.activeValue)) {
+            oldApnList?.activeValue, newApnList?.activeValue)) {
       return true;
     }
 
@@ -316,7 +315,7 @@
       return {
         accessPointName: apn.accessPointName,
         localizedName: apn.localizedName,
-        name: apn.name || apn.accessPointName || undefined,
+        name: apn.name || apn.accessPointName,
         username: apn.username,
         password: apn.password,
         id: apn.id,
@@ -392,11 +391,11 @@
         password: this.otherApn_.password,
         attach: this.isAttachApnToggleEnabled_ ? OncMojo.USE_ATTACH_APN_NAME :
                                                  '',
-        id: undefined,
+        id: null,
         authentication: ApnAuthenticationType.kAutomatic,
-        language: undefined,
-        localizedName: undefined,
-        name: undefined,
+        language: null,
+        localizedName: null,
+        name: null,
         state: ApnState.kEnabled,
         ipType: ApnIpType.kAutomatic,
         apnTypes: [ApnType.kDefault],
diff --git a/ash/webui/common/resources/network/network_choose_mobile.ts b/ash/webui/common/resources/network/network_choose_mobile.ts
index 4018b16..9b34de91 100644
--- a/ash/webui/common/resources/network/network_choose_mobile.ts
+++ b/ash/webui/common/resources/network/network_choose_mobile.ts
@@ -92,7 +92,7 @@
       this.networkConfig_ =
           MojoInterfaceProviderImpl.getInstance().getMojoServiceRemote();
     }
-    return this.networkConfig_;
+    return this.networkConfig_!;
   }
 
   private managedPropertiesChanged_(): void {
@@ -106,7 +106,7 @@
         networkId: 'none',
         technology: '',
         longName: this.i18n('networkCellularNoNetworks'),
-        shortName: undefined
+        shortName: null
       }];
     }
     // Set selectedMobileNetworkId_ after the dom-repeat has been stamped.
diff --git a/ash/webui/common/resources/network/network_config.ts b/ash/webui/common/resources/network/network_config.ts
index 4b3e4fd2..10d7e88 100644
--- a/ash/webui/common/resources/network/network_config.ts
+++ b/ash/webui/common/resources/network/network_config.ts
@@ -818,9 +818,9 @@
   }
 
   private getActiveStringList_(property: ManagedStringList|undefined|
-                               null): string[]|undefined {
+                               null): string[]|null {
     if (!property) {
-      return undefined;
+      return null;
     }
     return property.activeValue;
   }
@@ -941,7 +941,7 @@
           OncMojo.getActiveString(ipSec.authenticationType) || 'PSK',
       clientCertPkcs11Id: OncMojo.getActiveString(ipSec.clientCertPkcs11Id),
       clientCertType: OncMojo.getActiveString(ipSec.clientCertType),
-      eap: ipSec.eap ? this.getEAPConfigProperties_(ipSec.eap) : undefined,
+      eap: ipSec.eap ? this.getEAPConfigProperties_(ipSec.eap) : null,
       group: OncMojo.getActiveString(ipSec.group),
       ikeVersion: this.getActiveInt32_(ipSec.ikeVersion),
       localIdentity: OncMojo.getActiveString(ipSec.localIdentity),
@@ -1043,7 +1043,7 @@
         const eap = managedProperties.typeProperties.ethernet.eap ?
             this.getEAPConfigProperties_(
                 managedProperties.typeProperties.ethernet.eap) :
-            undefined;
+            null;
         security = eap ? SecurityType.kWpaEap : SecurityType.kNone;
         const auth = security === SecurityType.kWpaEap ? '8021X' : 'None';
         assert(configProperties.typeConfig.ethernet);
@@ -1099,6 +1099,7 @@
     const requestCertificates = this.configProperties_ === undefined;
     this.configProperties_ = configProperties;
     this.securityType_ = security;
+    assert(this.configProperties_);
     this.set('eapProperties_', this.getEap_(this.configProperties_));
     if (!this.eapProperties_) {
       this.showEap_ = null;
@@ -1138,7 +1139,7 @@
       assert(this.configProperties_.typeConfig.ethernet);
       this.configProperties_.typeConfig.ethernet.authentication = auth;
     }
-    let eap;
+    let eap = null;
     if (security === SecurityType.kWpaEap) {
       eap = this.getEap_(this.configProperties_, true);
       assert(eap);
@@ -1227,21 +1228,21 @@
         useSystemCas: false,
         domainSuffixMatch: [],
         subjectAltNameMatch: [],
-        anonymousIdentity: undefined,
-        clientCertPkcs11Id: undefined,
-        clientCertType: undefined,
-        identity: undefined,
-        inner: undefined,
-        outer: undefined,
-        password: undefined,
-        serverCaPems: undefined,
-        subjectMatch: undefined,
+        anonymousIdentity: null,
+        clientCertPkcs11Id: null,
+        clientCertType: null,
+        identity: null,
+        inner: null,
+        outer: null,
+        password: null,
+        serverCaPems: null,
+        subjectMatch: null,
       };
     }
     return eap || null;
   }
 
-  private setEap_(eapProperties: EAPConfigProperties|undefined) {
+  private setEap_(eapProperties: EAPConfigProperties|null) {
     assert(this.configProperties_);
     switch (this.mojoType_) {
       case NetworkType.kWiFi:
@@ -1406,15 +1407,15 @@
             authenticationType: this.ipsecAuthType_,
             ikeVersion: 2,
             saveCredentials: false,
-            clientCertPkcs11Id: undefined,
-            clientCertType: undefined,
-            eap: undefined,
-            group: undefined,
-            localIdentity: undefined,
-            psk: undefined,
-            remoteIdentity: undefined,
-            serverCaPems: undefined,
-            serverCaRefs: undefined,
+            clientCertPkcs11Id: null,
+            clientCertType: null,
+            eap: null,
+            group: null,
+            localIdentity: null,
+            psk: null,
+            remoteIdentity: null,
+            serverCaPems: null,
+            serverCaRefs: null,
           };
         }
         assert(vpn.ipSec);
@@ -1425,14 +1426,14 @@
             saveCredentials: false,
             subjectAltNameMatch: [],
             useSystemCas: false,
-            anonymousIdentity: undefined,
-            clientCertPkcs11Id: undefined,
-            clientCertType: undefined,
-            identity: undefined,
-            inner: undefined,
-            password: undefined,
-            serverCaPems: undefined,
-            subjectMatch: undefined,
+            anonymousIdentity: null,
+            clientCertPkcs11Id: null,
+            clientCertType: null,
+            identity: null,
+            inner: null,
+            password: null,
+            serverCaPems: null,
+            subjectMatch: null,
           };
           assert(vpn.ipSec.eap);
           this.eapProperties_ = vpn.ipSec.eap;
@@ -1453,15 +1454,15 @@
             authenticationType: this.ipsecAuthType_,
             ikeVersion: 1,
             saveCredentials: false,
-            clientCertPkcs11Id: undefined,
-            clientCertType: undefined,
-            eap: undefined,
-            group: undefined,
-            localIdentity: undefined,
-            psk: undefined,
-            remoteIdentity: undefined,
-            serverCaPems: undefined,
-            serverCaRefs: undefined,
+            clientCertPkcs11Id: null,
+            clientCertType: null,
+            eap: null,
+            group: null,
+            localIdentity: null,
+            psk: null,
+            remoteIdentity: null,
+            serverCaPems: null,
+            serverCaRefs: null,
           };
         }
         break;
@@ -1469,15 +1470,15 @@
         vpn.type = {value: VpnType.kOpenVPN};
         vpn.openVpn = vpn.openVpn || {
           saveCredentials: false,
-          clientCertPkcs11Id: undefined,
-          clientCertType: undefined,
-          extraHosts: undefined,
-          otp: undefined,
-          password: undefined,
-          serverCaPems: undefined,
-          serverCaRefs: undefined,
-          username: undefined,
-          userAuthenticationType: undefined,
+          clientCertPkcs11Id: null,
+          clientCertType: null,
+          extraHosts: null,
+          otp: null,
+          password: null,
+          serverCaPems: null,
+          serverCaRefs: null,
+          username: null,
+          userAuthenticationType: null,
         };
         break;
       case VPNConfigType.WIREGUARD:
@@ -1485,13 +1486,13 @@
         vpn.wireguard = vpn.wireguard || {
           peers: [{
             publicKey: '',
-            presharedKey: undefined,
-            allowedIps: undefined,
-            endpoint: undefined,
+            presharedKey: null,
+            allowedIps: null,
+            endpoint: null,
             persistentKeepaliveInterval: 0,
           }],
-          ipAddresses: undefined,
-          privateKey: undefined,
+          ipAddresses: null,
+          privateKey: null,
         };
         break;
       default:
@@ -1525,16 +1526,16 @@
     }
     if (vpn.type.value !== VpnType.kL2TPIPsec &&
         vpn.type.value !== VpnType.kIKEv2) {
-      delete vpn.ipSec;
+      vpn.ipSec = null;
     }
     if (vpn.type.value !== VpnType.kL2TPIPsec) {
-      delete vpn.l2tp;
+      vpn.l2tp = null;
     }
     if (vpn.type.value !== VpnType.kOpenVPN) {
-      delete vpn.openVpn;
+      vpn.openVpn = null;
     }
     if (vpn.type.value !== VpnType.kWireGuard) {
-      delete vpn.wireguard;
+      vpn.wireguard = null;
     }
     this.updateCertError_();
   }
@@ -1562,7 +1563,7 @@
     if (!ipSec) {
       return;
     }
-    const pem = ipSec.serverCaPems ? ipSec.serverCaPems[0] : undefined;
+    const pem = ipSec.serverCaPems ? ipSec.serverCaPems[0] : null;
     const certId =
         ipSec.clientCertType === 'PKCS11Id' ? ipSec.clientCertPkcs11Id : '';
     this.setSelectedCerts_(pem, certId);
@@ -1577,7 +1578,7 @@
     if (!openVpn) {
       return;
     }
-    const pem = openVpn.serverCaPems ? openVpn.serverCaPems[0] : undefined;
+    const pem = openVpn.serverCaPems ? openVpn.serverCaPems[0] : null;
     const certId =
         openVpn.clientCertType === 'PKCS11Id' ? openVpn.clientCertPkcs11Id : '';
     this.setSelectedCerts_(pem, certId);
@@ -1618,8 +1619,7 @@
    * Sets the selected cert if |pem| (serverCa) or |certId| (user) is specified.
    * Otherwise sets a default value if no certificate is selected.
    */
-  private setSelectedCerts_(pem: string|undefined, certId: string|undefined):
-      void {
+  private setSelectedCerts_(pem: string|null, certId: string|null): void {
     if (pem) {
       const serverCa = this.serverCaCerts_.find(function(cert) {
         return cert.pemOrId === pem;
@@ -2021,7 +2021,7 @@
     const propertiesToSet = Object.assign({}, this.configProperties_);
     // Do not set AutoConnect by default, the connection manager will set
     // it to true on a successful connection.
-    delete propertiesToSet.autoConnect;
+    propertiesToSet.autoConnect = null;
     if (this.guid) {
       propertiesToSet.guid = this.guid;
     }
@@ -2034,7 +2034,7 @@
       assert(vpnConfig);
       // VPN.Host can be an IP address but will not be recognized as such if
       // there is initial whitespace, so trim it.
-      if (vpnConfig.host !== undefined) {
+      if (!!vpnConfig.host) {
         vpnConfig.host = vpnConfig.host.trim();
       }
       assert(vpnConfig.type);
@@ -2044,7 +2044,7 @@
         this.setOpenVPNProperties_(propertiesToSet);
       } else {
         assert(propertiesToSet.typeConfig.vpn);
-        delete propertiesToSet.typeConfig.vpn.openVpn;
+        propertiesToSet.typeConfig.vpn.openVpn = null;
       }
       if (vpnType === VpnType.kIKEv2) {
         this.setVpnIkev2Properties_(propertiesToSet);
@@ -2052,14 +2052,14 @@
         this.setVpnL2tpIpsecProperties_(propertiesToSet);
       } else {
         assert(propertiesToSet.typeConfig.vpn);
-        delete propertiesToSet.typeConfig.vpn.ipSec;
-        delete propertiesToSet.typeConfig.vpn.l2tp;
+        propertiesToSet.typeConfig.vpn.ipSec = null;
+        propertiesToSet.typeConfig.vpn.l2tp = null;
       }
       if (vpnType === VpnType.kWireGuard) {
         this.setWireGuardProperties_(propertiesToSet);
       } else {
         assert(propertiesToSet.typeConfig.vpn);
-        delete propertiesToSet.typeConfig.vpn.wireguard;
+        propertiesToSet.typeConfig.vpn.wireguard = null;
       }
     }
     return propertiesToSet;
@@ -2111,8 +2111,8 @@
       ipsec.clientCertType = 'PKCS11Id';
       ipsec.clientCertPkcs11Id = this.getUserCertPkcs11Id_();
     } else {
-      delete ipsec.clientCertType;
-      delete ipsec.clientCertPkcs11Id;
+      ipsec.clientCertType = null;
+      ipsec.clientCertPkcs11Id = null;
     }
 
     if (ipsec.authenticationType === IpsecAuthType.EAP) {
@@ -2127,15 +2127,15 @@
         saveCredentials: this.vpnSaveCredentials_,
         subjectAltNameMatch: [],
         useSystemCas: false,
-        anonymousIdentity: undefined,
-        clientCertPkcs11Id: undefined,
-        clientCertType: undefined,
-        inner: undefined,
-        serverCaPems: undefined,
-        subjectMatch: undefined,
+        anonymousIdentity: null,
+        clientCertPkcs11Id: null,
+        clientCertType: null,
+        inner: null,
+        serverCaPems: null,
+        subjectMatch: null,
       };
     } else {
-      delete ipsec.eap;
+      ipsec.eap = null;
     }
 
     ipsec.ikeVersion = 2;
@@ -2178,12 +2178,12 @@
       gateway: this.ipAddressInput_,
       routingPrefix: 32,
       type: IPConfigType.kIPv4,
-      ipAddress: undefined,
-      excludedRoutes: undefined,
-      includedRoutes: undefined,
-      nameServers: undefined,
-      searchDomains: undefined,
-      webProxyAutoDiscoveryUrl: undefined,
+      ipAddress: null,
+      excludedRoutes: null,
+      includedRoutes: null,
+      nameServers: null,
+      searchDomains: null,
+      webProxyAutoDiscoveryUrl: null,
     };
     if (this.nameServersInput_) {
       propertiesToSet.nameServersConfigType = 'Static';
@@ -2191,14 +2191,14 @@
           this.nameServersInput_.split(',');
     }
     if (this.wireguardKeyType_ === WireGuardKeyConfigType.USE_CURRENT) {
-      delete wireguard.privateKey;
+      wireguard.privateKey = null;
     } else if (this.wireguardKeyType_ === WireGuardKeyConfigType.GENERATE_NEW) {
       wireguard.privateKey = '';
     }
     assert(!!wireguard.peers);
     for (const peer of wireguard.peers) {
       if (peer.presharedKey === PLACEHOLDER_CREDENTIAL) {
-        delete peer.presharedKey;  // No modification
+        peer.presharedKey = null;  // No modification
       } else if (peer.presharedKey === undefined) {
         peer.presharedKey = '';  // Explicitly removed
       }
@@ -2222,9 +2222,9 @@
     vpn.l2tp.saveCredentials = this.vpnSaveCredentials_;
 
     // Clear IPsec fields which are only for IKEv2.
-    delete vpn.ipSec.eap;
-    delete vpn.ipSec.localIdentity;
-    delete vpn.ipSec.remoteIdentity;
+    vpn.ipSec.eap = null;
+    vpn.ipSec.localIdentity = null;
+    vpn.ipSec.remoteIdentity = null;
   }
 
   /**
@@ -2310,7 +2310,7 @@
     return [];
   }
 
-  private setError_(error: string|undefined): void {
+  private setError_(error: string|null): void {
     this.error = error || '';
   }
 
@@ -2328,7 +2328,7 @@
           activeValue: OncMojo.getSecurityTypeString(
               managedProperties.typeProperties.wifi.security),
           policySource: policySource,
-          policyValue: undefined,
+          policyValue: null,
         };
       }
       case NetworkType.kEthernet: {
@@ -2337,7 +2337,7 @@
           activeValue: OncMojo.getActiveString(
               managedProperties.typeProperties.ethernet.authentication),
           policySource: policySource,
-          policyValue: undefined,
+          policyValue: null,
         };
       }
     }
diff --git a/ash/webui/common/resources/network/network_config_select.js b/ash/webui/common/resources/network/network_config_select.js
index d6b93b8..6436683 100644
--- a/ash/webui/common/resources/network/network_config_select.js
+++ b/ash/webui/common/resources/network/network_config_select.js
@@ -14,7 +14,6 @@
 
 import {assertNotReached} from '//resources/ash/common/assert.js';
 import {I18nBehavior, I18nBehaviorInterface} from '//resources/ash/common/i18n_behavior.js';
-import {NetworkCertificate} from '//resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
 import {microTask, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {CrPolicyNetworkBehaviorMojo, CrPolicyNetworkBehaviorMojoInterface} from './cr_policy_network_behavior_mojo.js';
@@ -22,6 +21,9 @@
 import {getTemplate} from './network_config_select.html.js';
 import {OncMojo} from './onc_mojo.js';
 
+// Type aliases for js-webui to ts-webui migration
+/** @typedef {*} NetworkCertificate */
+
 /**
  * @constructor
  * @extends {PolymerElement}
diff --git a/ash/webui/common/resources/network/network_ip_config.js b/ash/webui/common/resources/network/network_ip_config.js
index 1200048..7615319 100644
--- a/ash/webui/common/resources/network/network_ip_config.js
+++ b/ash/webui/common/resources/network/network_ip_config.js
@@ -13,7 +13,7 @@
 import './network_shared.css.js';
 
 import {I18nBehavior, I18nBehaviorInterface} from '//resources/ash/common/i18n_behavior.js';
-import {IPConfigProperties, ManagedProperties, NO_ROUTING_PREFIX} from '//resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
+import {NO_ROUTING_PREFIX} from '//resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
 import {IPConfigType, NetworkType} from '//resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
diff --git a/ash/webui/common/resources/network/network_list_item.js b/ash/webui/common/resources/network/network_list_item.js
index 1b07243..f2189fc 100644
--- a/ash/webui/common/resources/network/network_list_item.js
+++ b/ash/webui/common/resources/network/network_list_item.js
@@ -24,7 +24,7 @@
 import {I18nBehavior, I18nBehaviorInterface} from '//resources/ash/common/i18n_behavior.js';
 import {loadTimeData} from '//resources/ash/common/load_time_data.m.js';
 import {mojoString16ToString} from '//resources/js/mojo_type_util.js';
-import {ActivationStateType, CrosNetworkConfigInterface, GlobalPolicy, SecurityType, VpnType} from '//resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
+import {ActivationStateType, SecurityType, VpnType} from '//resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
 import {ConnectionStateType, NetworkType, OncSource, PortalState} from '//resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
diff --git a/ash/webui/common/resources/network/network_listener_behavior.js b/ash/webui/common/resources/network/network_listener_behavior.js
index d3f6e4ab..98c84e0 100644
--- a/ash/webui/common/resources/network/network_listener_behavior.js
+++ b/ash/webui/common/resources/network/network_listener_behavior.js
@@ -6,11 +6,14 @@
  * @fileoverview Polymer behavior for observing CrosNetworkConfigObserver
  * events.
  */
-
-import {CrosNetworkConfigObserver, CrosNetworkConfigObserverReceiver, NetworkStateProperties} from '//resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
+import {CrosNetworkConfigObserverReceiver} from '//resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
 
 import {MojoInterfaceProviderImpl} from './mojo_interface_provider.js';
 
+// Type aliases for js-webui to ts-webui migration
+/** @typedef {*} CrosNetworkConfigObserver */
+/** @typedef {*} NetworkStateProperties */
+
 /** @polymerBehavior */
 export const NetworkListenerBehavior = {
   /** @private {?CrosNetworkConfigObserver} */
diff --git a/ash/webui/common/resources/network/network_property_list_mojo.js b/ash/webui/common/resources/network/network_property_list_mojo.js
index 54890f5..a24126f3 100644
--- a/ash/webui/common/resources/network/network_property_list_mojo.js
+++ b/ash/webui/common/resources/network/network_property_list_mojo.js
@@ -15,7 +15,6 @@
 
 import {assert} from '//resources/ash/common/assert.js';
 import {I18nBehavior, I18nBehaviorInterface} from '//resources/ash/common/i18n_behavior.js';
-import {ActivationStateType, SecurityType, SubjectAltName, VpnType} from '//resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
 import {OncSource, PolicySource, PortalState} from '//resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {flush, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
diff --git a/ash/webui/common/resources/network/network_proxy.ts b/ash/webui/common/resources/network/network_proxy.ts
index 4b5feab..8bdfd163 100644
--- a/ash/webui/common/resources/network/network_proxy.ts
+++ b/ash/webui/common/resources/network/network_proxy.ts
@@ -30,9 +30,9 @@
 function createDefaultProxySettings(): ManagedProxySettings {
   return {
     type: OncMojo.createManagedString('Direct'),
-    manual: undefined,
-    excludeDomains: undefined,
-    pac: undefined,
+    manual: null,
+    excludeDomains: null,
+    pac: null,
   };
 }
 
@@ -242,8 +242,12 @@
         proxy.pac = OncMojo.createManagedString('');
       }
     } else if (type === 'Manual') {
-      proxy.manual =
-          proxy.manual || this.savedManual_ || new ManagedManualProxySettings();
+      proxy.manual = proxy.manual || this.savedManual_ || {
+        httpProxy: null,
+        secureHttpProxy: null,
+        ftpProxy: null,
+        socks: null,
+      };
       assert(proxy.manual);
       if (!proxy.manual.httpProxy) {
         proxy.manual.httpProxy = this.createDefaultProxyLocation_(80);
@@ -258,7 +262,7 @@
           proxy.excludeDomains || this.savedExcludeDomains_ || {
             activeValue: [],
             policySource: PolicySource.kNone,
-            policyValue: undefined,
+            policyValue: null,
           };
     }
     return proxy;
@@ -275,7 +279,7 @@
     // settings and use the default value.
     if (this.isShared_() && proxySettings &&
         !this.isControlled(proxySettings.type) && !this.useSharedProxies) {
-      proxySettings = undefined;  // Ignore proxy settings.
+      proxySettings = null;  // Ignore proxy settings.
     }
 
     const proxy = proxySettings ? this.validateProxy_(proxySettings) :
@@ -320,9 +324,9 @@
   }
 
   private getProxyLocation_(location: ManagedProxyLocation|undefined|
-                            null): ProxyLocation|undefined {
+                            null): ProxyLocation|null {
     if (!location) {
-      return undefined;
+      return null;
     }
     return {
       host: location.host.activeValue,
@@ -339,21 +343,29 @@
       return;
     }
 
-    const proxy = new ProxySettings();
-    proxy.type = proxyType;
-    proxy.excludeDomains =
-        OncMojo.getActiveValue(this.proxy_.excludeDomains) as string[] |
-        undefined;
+    const proxy: ProxySettings = {
+      type: proxyType,
+      excludeDomains: OncMojo.getActiveValue(this.proxy_.excludeDomains) as
+              string[] ||
+          null,
+      manual: null,
+      pac: null,
+    };
 
     if (proxyType === 'Manual') {
-      let manual = new ManualProxySettings();
+      let manual: ManualProxySettings = {
+        httpProxy: null,
+        secureHttpProxy: null,
+        ftpProxy: null,
+        socks: null,
+      };
       if (this.proxy_.manual) {
         this.savedManual_ = {...this.proxy_.manual};
         manual = {
           httpProxy: this.getProxyLocation_(this.proxy_.manual.httpProxy),
           secureHttpProxy:
               this.getProxyLocation_(this.proxy_.manual.secureHttpProxy),
-          ftpProxy: undefined,
+          ftpProxy: null,
           socks: this.getProxyLocation_(this.proxy_.manual.socks),
         };
       }
@@ -367,13 +379,13 @@
       } else {
         // Remove properties with empty hosts to unset them.
         if (manual.httpProxy && !manual.httpProxy.host) {
-          delete manual.httpProxy;
+          manual.httpProxy = null;
         }
         if (manual.secureHttpProxy && !manual.secureHttpProxy.host) {
-          delete manual.secureHttpProxy;
+          manual.secureHttpProxy = null;
         }
         if (manual.socks && !manual.socks.host) {
-          delete manual.socks;
+          manual.socks = null;
         }
       }
       proxy.manual = manual;
diff --git a/ash/webui/common/resources/network/onc_mojo.js b/ash/webui/common/resources/network/onc_mojo.js
index 64197ea1..d09869d 100644
--- a/ash/webui/common/resources/network/onc_mojo.js
+++ b/ash/webui/common/resources/network/onc_mojo.js
@@ -10,11 +10,28 @@
 
 import {assert, assertNotReached} from '//resources/ash/common/assert.js';
 import {loadTimeData} from '//resources/ash/common/load_time_data.m.js';
-import {ActivationStateType, ApnProperties, AuthenticationType, ConfigProperties, DeviceStateProperties as MojomDeviceStateProperties, HiddenSsidMode, InhibitReason, IPConfigProperties, ManagedApnList, ManagedBoolean, ManagedInt32, ManagedProperties, ManagedString, ManagedStringList, ManagedSubjectAltNameMatchList, MatchType, NetworkStateProperties as MojomNetworkStateProperties, ProxyMode, SecurityType, SIMInfo, SIMLockStatus, SubjectAltName, SubjectAltName_Type, TetherStateProperties, TrafficCounterProperties, VpnType} from '//resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
+import {ActivationStateType, AuthenticationType, HiddenSsidMode, InhibitReason, MatchType, ProxyMode, SecurityType, SubjectAltName_Type, VpnType} from '//resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
 import {ConnectionStateType, DeviceStateType, IPConfigType, NetworkType, OncSource, PolicySource, PortalState} from '//resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {IPAddress} from '//resources/mojo/services/network/public/mojom/ip_address.mojom-webui.js';
 
-
+// Type aliases for js-webui to ts-webui migration
+/** @typedef {*} ApnProperties */
+/** @typedef {*} ConfigProperties */
+/** @typedef {*} IPConfigProperties */
+/** @typedef {*} ManagedApnList */
+/** @typedef {*} ManagedBoolean */
+/** @typedef {*} ManagedInt32 */
+/** @typedef {*} ManagedProperties */
+/** @typedef {*} ManagedString */
+/** @typedef {*} ManagedStringList */
+/** @typedef {*} ManagedSubjectAltNameMatchList */
+/** @typedef {*} MojomDeviceStateProperties */
+/** @typedef {*} MojomNetworkStateProperties */
+/** @typedef {*} SIMInfo */
+/** @typedef {*} SIMLockStatus */
+/** @typedef {*} SubjectAltName */
+/** @typedef {*} TetherStateProperties */
+/** @typedef {*} TrafficCounterProperties */
 
 // Used to indicate a saved but unknown credential value. Will appear as
 // placeholder character in the credential (passphrase, password, etc.) field by
@@ -34,7 +51,7 @@
    * @return {string}
    */
   static getEnumString(value) {
-    if (value === undefined) {
+    if (value === undefined || value === null) {
       return 'undefined';
     }
     return value.toString();
@@ -1217,8 +1234,8 @@
 
   /**
    * Returns true if the APN List matches.
-   * @param {Array<!ApnProperties>|undefined} a
-   * @param {Array<!ApnProperties>|undefined} b
+   * @param {Array<!ApnProperties>|undefined|null} a
+   * @param {Array<!ApnProperties>|undefined|null} b
    * @return {boolean}
    */
   static apnListMatch(a, b) {
diff --git a/ash/webui/common/resources/network/sim_lock_dialogs.js b/ash/webui/common/resources/network/sim_lock_dialogs.js
index 523c9b8..1c099ffa 100644
--- a/ash/webui/common/resources/network/sim_lock_dialogs.js
+++ b/ash/webui/common/resources/network/sim_lock_dialogs.js
@@ -18,7 +18,6 @@
 import {assertNotReached} from '//resources/ash/common/assert.js';
 import {I18nBehavior, I18nBehaviorInterface} from '//resources/ash/common/i18n_behavior.js';
 import {loadTimeData} from '//resources/ash/common/load_time_data.m.js';
-import {CellularSimState, CrosNetworkConfigInterface, GlobalPolicy} from '//resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
 import {mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {MojoInterfaceProvider, MojoInterfaceProviderImpl} from './mojo_interface_provider.js';
diff --git a/ash/webui/common/resources/network_health/network_diagnostics.ts b/ash/webui/common/resources/network_health/network_diagnostics.ts
index db4ca8d..4de3ce9 100644
--- a/ash/webui/common/resources/network_health/network_diagnostics.ts
+++ b/ash/webui/common/resources/network_health/network_diagnostics.ts
@@ -689,7 +689,6 @@
       case RoutineVerdict.kProblem:
         return 'Failed';
     }
-    return 'Unknown';
   }
 }
 
diff --git a/ash/webui/common/resources/network_health/routine_group.ts b/ash/webui/common/resources/network_health/routine_group.ts
index 0a88632..bc0fa35 100644
--- a/ash/webui/common/resources/network_health/routine_group.ts
+++ b/ash/webui/common/resources/network_health/routine_group.ts
@@ -136,8 +136,6 @@
       case RoutineVerdict.kNotRun:
         return Icons.TEST_NOT_RUN;
     }
-
-    return Icons.TEST_NOT_RUN;
   }
 
   /**
diff --git a/ash/webui/shortcut_customization_ui/BUILD.gn b/ash/webui/shortcut_customization_ui/BUILD.gn
index c63f4f8..92a54f2 100644
--- a/ash/webui/shortcut_customization_ui/BUILD.gn
+++ b/ash/webui/shortcut_customization_ui/BUILD.gn
@@ -73,6 +73,7 @@
     "//chromeos/ash/components/local_search_service/public/cpp:cpp",
     "//chromeos/ash/components/local_search_service/public/mojom",
     "//chromeos/ash/components/local_search_service/public/mojom:mojom",
+    "//chromeos/ash/services/assistant/public/cpp",
     "//content/test:test_support",
     "//device/udev_linux:test_support",
     "//mojo/public/cpp/bindings:bindings",
diff --git a/ash/webui/shortcut_customization_ui/backend/accelerator_layout_table_unittest.cc b/ash/webui/shortcut_customization_ui/backend/accelerator_layout_table_unittest.cc
index d9fb8494..ab6b67b0 100644
--- a/ash/webui/shortcut_customization_ui/backend/accelerator_layout_table_unittest.cc
+++ b/ash/webui/shortcut_customization_ui/backend/accelerator_layout_table_unittest.cc
@@ -14,6 +14,7 @@
 #include "base/hash/md5_boringssl.h"
 #include "base/strings/strcat.h"
 #include "base/strings/stringprintf.h"
+#include "chromeos/ash/services/assistant/public/cpp/features.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/base/ui_base_features.h"
 
@@ -160,6 +161,13 @@
     }
   }
 
+  if (!ash::assistant::features::IsNewEntryPointEnabled()) {
+    for (const AcceleratorData& data :
+         ash::kAssistantSearchPlusAAcceleratorData) {
+      ash_accelerators.emplace_back(data);
+    }
+  }
+
   const char kCommonMessage[] =
       "If you are modifying Chrome OS available shortcuts, please update "
       "kAcceleratorLayouts & following the instruction in "
diff --git a/ash/wm/desks/templates/saved_desk_test_helper.cc b/ash/wm/desks/templates/saved_desk_test_helper.cc
index a03f3882..de00a1b9 100644
--- a/ash/wm/desks/templates/saved_desk_test_helper.cc
+++ b/ash/wm/desks/templates/saved_desk_test_helper.cc
@@ -5,69 +5,105 @@
 #include "ash/wm/desks/templates/saved_desk_test_helper.h"
 
 #include "ash/public/cpp/test/test_saved_desk_delegate.h"
+#include "ash/session/session_controller_impl.h"
 #include "ash/shell.h"
 #include "base/run_loop.h"
 #include "components/desks_storage/core/admin_template_service.h"
 #include "components/desks_storage/core/desk_test_util.h"
 #include "components/desks_storage/core/local_desk_data_manager.h"
 #include "components/prefs/testing_pref_service.h"
+#include "components/services/app_service/public/cpp/app_registry_cache_wrapper.h"
 
 namespace ash {
 
-SavedDeskTestHelper::SavedDeskTestHelper()
-    : account_id_(AccountId::FromUserEmail("test@gmail.com")) {
+SavedDeskTestHelper::SavedDeskTestHelper() {
   CHECK(desk_model_data_dir_.CreateUniqueTempDir());
-
-  test_pref_service_ = std::make_unique<TestingPrefServiceSimple>();
-
-  saved_desk_model_ = std::make_unique<desks_storage::LocalDeskDataManager>(
-      desk_model_data_dir_.GetPath(), account_id_);
-
-  // Creates the admin template service and its associated sub-directory within
-  // the admin_template_service.  Allows us to test admin templates in desks
-  // client.
-  admin_template_service_ =
-      std::make_unique<desks_storage::AdminTemplateService>(
-          desk_model_data_dir_.GetPath(), account_id_,
-          test_pref_service_.get());
-
-  // Install desk model.
-  static_cast<TestSavedDeskDelegate*>(Shell::Get()->saved_desk_delegate())
-      ->set_desk_model(saved_desk_model_.get());
-
-  // Install admin template service.
-  static_cast<TestSavedDeskDelegate*>(Shell::Get()->saved_desk_delegate())
-      ->set_admin_template_service(admin_template_service_.get());
-
-  // Setup app registry cache.
-  cache_ = std::make_unique<apps::AppRegistryCache>();
-  desks_storage::desk_test_util::PopulateAppRegistryCache(account_id_,
-                                                          cache_.get());
-
-  // The admin template service requires that some app types be in the
-  // initialized apps set, this method ensures that that set is populated
-  // correctly.
-  desks_storage::desk_test_util::PopulateAdminTestAppRegistryCache(
-      account_id_, cache_.get());
+  scoped_observation_.Observe(Shell::Get()->session_controller());
 }
 
 SavedDeskTestHelper::~SavedDeskTestHelper() {
-  static_cast<TestSavedDeskDelegate*>(Shell::Get()->saved_desk_delegate())
-      ->set_desk_model(nullptr);
-  cache_.reset();
-  saved_desk_model_.reset();
-  admin_template_service_.reset();
-
+  cache_map_.clear();
   // TODO(b/277753059): Temporary workaround that makes the timing issue less
   // likely to occur.
   base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
       FROM_HERE, base::DoNothingWithBoundArgs(std::move(desk_model_data_dir_)));
 }
 
+void SavedDeskTestHelper::OnUserSessionAdded(const AccountId& account_id) {
+  auto cache = std::make_unique<apps::AppRegistryCache>();
+  auto* cache_ptr = cache.get();
+  if (cache_map_.count(account_id)) {
+    // TODO(crbug.com/383442863): Remove this once the misused of
+    // SimulateUserLogin has been fixed.
+    return;
+  }
+
+  cache_map_.emplace(account_id, std::move(cache));
+  apps::AppRegistryCacheWrapper::Get().AddAppRegistryCache(account_id,
+                                                           cache_ptr);
+
+  // Setup app registry cache.
+  desks_storage::desk_test_util::PopulateAppRegistryCache(account_id,
+                                                          cache_ptr);
+
+  // The admin template service requires that some app types be in the
+  // initialized apps set, this method ensures that that set is populated
+  // correctly.
+  desks_storage::desk_test_util::PopulateAdminTestAppRegistryCache(account_id,
+                                                                   cache_ptr);
+}
+
+void SavedDeskTestHelper::OnActiveUserSessionChanged(
+    const AccountId& account_id) {
+  auto* cache =
+      apps::AppRegistryCacheWrapper::Get().GetAppRegistryCache(account_id);
+  CHECK(cache);
+  account_id_ = account_id;
+
+  // Install desk model.
+  auto* saved_desk_delegate =
+      static_cast<TestSavedDeskDelegate*>(Shell::Get()->saved_desk_delegate());
+  saved_desk_delegate->set_desk_model(nullptr);
+  saved_desk_delegate->set_admin_template_service(nullptr);
+
+  saved_desk_model_ = std::make_unique<desks_storage::LocalDeskDataManager>(
+      desk_model_data_dir_.GetPath(), account_id_);
+
+  auto* pref_service =
+      Shell::Get()->session_controller()->GetActivePrefService();
+  CHECK(pref_service);
+
+  // Creates the admin template service and its associated sub-directory within
+  // the admin_template_service.  Allows us to test admin templates in desks
+  // client.
+  admin_template_service_ =
+      std::make_unique<desks_storage::AdminTemplateService>(
+          desk_model_data_dir_.GetPath(), account_id_, pref_service);
+
+  // Install desk model.
+  saved_desk_delegate->set_desk_model(saved_desk_model_.get());
+
+  // Install admin template service.
+  saved_desk_delegate->set_admin_template_service(
+      admin_template_service_.get());
+}
+
+void SavedDeskTestHelper::Shutdown() {
+  scoped_observation_.Reset();
+  auto* saved_desk_delegate =
+      static_cast<TestSavedDeskDelegate*>(Shell::Get()->saved_desk_delegate());
+  saved_desk_delegate->set_desk_model(nullptr);
+  saved_desk_delegate->set_admin_template_service(nullptr);
+  saved_desk_model_.reset();
+  admin_template_service_.reset();
+}
+
 void SavedDeskTestHelper::AddAppIdToAppRegistryCache(
     const std::string& app_id) {
-  desks_storage::desk_test_util::AddAppIdToAppRegistryCache(
-      account_id_, cache_.get(), app_id.c_str());
+  auto* cache =
+      apps::AppRegistryCacheWrapper::Get().GetAppRegistryCache(account_id_);
+  desks_storage::desk_test_util::AddAppIdToAppRegistryCache(account_id_, cache,
+                                                            app_id.c_str());
 }
 
 void SavedDeskTestHelper::WaitForDeskModels() {
diff --git a/ash/wm/desks/templates/saved_desk_test_helper.h b/ash/wm/desks/templates/saved_desk_test_helper.h
index d3f377c9..da11a573 100644
--- a/ash/wm/desks/templates/saved_desk_test_helper.h
+++ b/ash/wm/desks/templates/saved_desk_test_helper.h
@@ -7,8 +7,11 @@
 
 #include <memory>
 #include <string>
+#include <unordered_map>
 
+#include "ash/public/cpp/session/session_observer.h"
 #include "base/files/scoped_temp_dir.h"
+#include "base/scoped_observation.h"
 #include "components/account_id/account_id.h"
 
 namespace apps {
@@ -23,16 +26,17 @@
 class TestingPrefServiceSimple;
 
 namespace ash {
+class SessionControllerImpl;
 
 // This class creates a desk model and has functionality used by unit tests that
 // involve saved desk functionality.
-class SavedDeskTestHelper {
+class SavedDeskTestHelper : public SessionObserver {
  public:
   // Creates a desk model. Will CHECK-fail on errors.
   SavedDeskTestHelper();
   SavedDeskTestHelper(const SavedDeskTestHelper&) = delete;
   SavedDeskTestHelper& operator=(const SavedDeskTestHelper&) = delete;
-  ~SavedDeskTestHelper();
+  ~SavedDeskTestHelper() override;
 
   // Adds `app_id` to `registry_cache_` for `account_id_`.
   void AddAppIdToAppRegistryCache(const std::string& app_id);
@@ -50,6 +54,13 @@
     return test_pref_service_.get();
   }
 
+  // SessionObserver:
+  void OnUserSessionAdded(const AccountId& account_id) override;
+  void OnActiveUserSessionChanged(const AccountId& account_id) override;
+
+  // Shutdown and clear the internal states.
+  void Shutdown();
+
  private:
   AccountId account_id_;
 
@@ -59,9 +70,13 @@
 
   std::unique_ptr<desks_storage::DeskModel> saved_desk_model_;
 
-  std::unique_ptr<apps::AppRegistryCache> cache_;
+  std::unordered_map<AccountId, std::unique_ptr<apps::AppRegistryCache>>
+      cache_map_;
 
   std::unique_ptr<TestingPrefServiceSimple> test_pref_service_;
+
+  base::ScopedObservation<SessionControllerImpl, SessionObserver>
+      scoped_observation_{this};
 };
 
 }  // namespace ash
diff --git a/ash/wm/overview/birch/birch_animation_utils.cc b/ash/wm/overview/birch/birch_animation_utils.cc
index 896fa2e..e8ef5f4 100644
--- a/ash/wm/overview/birch/birch_animation_utils.cc
+++ b/ash/wm/overview/birch/birch_animation_utils.cc
@@ -16,8 +16,7 @@
 constexpr char kLoadingAnimationRestartMarker[] =
     "_CrOS_Marker_CycleRestart_Line";
 
-base::TimeDelta GetCycleRestartTimestamp(const cc::SkottieWrapper& skottie,
-                                         int animation_id) {
+base::TimeDelta GetCycleRestartTimestamp(const cc::SkottieWrapper& skottie) {
   CHECK(skottie.is_valid());
   CHECK_EQ(skottie.GetAllMarkers().size(), 1u);
 
@@ -45,12 +44,11 @@
 }
 
 std::optional<lottie::Animation::PlaybackConfig> GetLottiePlaybackConfig(
-    const cc::SkottieWrapper& skottie,
-    int animation_id) {
+    const cc::SkottieWrapper& skottie) {
   auto animation_duration = base::Seconds(skottie.duration());
   return lottie::Animation::PlaybackConfig(
       {{base::TimeDelta(), animation_duration},
-       {GetCycleRestartTimestamp(skottie, animation_id), animation_duration}},
+       {GetCycleRestartTimestamp(skottie), animation_duration}},
       /*initial_offset=*/base::TimeDelta(),
       /*initial_completed_cycles=*/0, lottie::Animation::Style::kLoop);
 }
diff --git a/ash/wm/overview/birch/birch_animation_utils.h b/ash/wm/overview/birch/birch_animation_utils.h
index 2b032fa..7f65fde 100644
--- a/ash/wm/overview/birch/birch_animation_utils.h
+++ b/ash/wm/overview/birch/birch_animation_utils.h
@@ -18,8 +18,7 @@
 // Gets the playback config for the animation that maps to the provided
 // `animation_id`.
 std::optional<lottie::Animation::PlaybackConfig> GetLottiePlaybackConfig(
-    const cc::SkottieWrapper& skottie,
-    int animation_id);
+    const cc::SkottieWrapper& skottie);
 
 }  // namespace ash::birch_animation_utils
 
diff --git a/ash/wm/overview/birch/birch_bar_context_menu_model.cc b/ash/wm/overview/birch/birch_bar_context_menu_model.cc
index 908c5d4..69dc46e 100644
--- a/ash/wm/overview/birch/birch_bar_context_menu_model.cc
+++ b/ash/wm/overview/birch/birch_bar_context_menu_model.cc
@@ -40,7 +40,7 @@
 
     if (features::IsCoralFeatureEnabled()) {
       AddItem(base::to_underlying(CommandId::kCoralSuggestions),
-              u"Suggested group");
+              l10n_util::GetStringUTF16(IDS_ASH_BIRCH_CORAL_SUGGESTION_NAME));
     }
 
     bool enabled = IsWeatherAllowedByGeolocation();
diff --git a/ash/wm/overview/birch/birch_bar_view.cc b/ash/wm/overview/birch/birch_bar_view.cc
index 27b9b98..91cc7b58 100644
--- a/ash/wm/overview/birch/birch_bar_view.cc
+++ b/ash/wm/overview/birch/birch_bar_view.cc
@@ -416,8 +416,11 @@
       item->GetType() == BirchItemType::kCoral
           ? std::make_unique<CoralChipButton>()
           : std::make_unique<BirchChipButton>();
-  chip->Init(item);
+
+  // Setting preferred size ahead since the preferred size may be needed during
+  // initialization.
   chip->SetPreferredSize(chip_size_);
+  chip->Init(item);
   return chip;
 }
 
diff --git a/ash/wm/overview/birch/birch_chip_button_base.cc b/ash/wm/overview/birch/birch_chip_button_base.cc
index ce9c6f9..9113604 100644
--- a/ash/wm/overview/birch/birch_chip_button_base.cc
+++ b/ash/wm/overview/birch/birch_chip_button_base.cc
@@ -50,6 +50,10 @@
   StyleUtil::SetUpFocusRingForView(this);
 }
 
+int BirchChipButtonBase::GetRoundedCornerRadius() const {
+  return kRoundedCornerRadius;
+}
+
 BEGIN_METADATA(BirchChipButtonBase)
 END_METADATA
 
diff --git a/ash/wm/overview/birch/birch_chip_button_base.h b/ash/wm/overview/birch/birch_chip_button_base.h
index 5ebdadc..94211b5 100644
--- a/ash/wm/overview/birch/birch_chip_button_base.h
+++ b/ash/wm/overview/birch/birch_chip_button_base.h
@@ -37,6 +37,8 @@
   // background, focus ring). This depends on whether the selection widget is
   // visible, which only the birch coral chip has.
   void UpdateRoundedCorners(bool selection_widget_visible);
+
+  int GetRoundedCornerRadius() const;
 };
 
 BEGIN_VIEW_BUILDER(/*no export*/, BirchChipButtonBase, views::Button)
diff --git a/ash/wm/overview/birch/birch_chip_context_menu_model.cc b/ash/wm/overview/birch/birch_chip_context_menu_model.cc
index bba71a70..1cd1593 100644
--- a/ash/wm/overview/birch/birch_chip_context_menu_model.cc
+++ b/ash/wm/overview/birch/birch_chip_context_menu_model.cc
@@ -80,20 +80,24 @@
       break;
     case BirchSuggestionType::kCoral:
       // TODO(zxdan): Localize the strings.
-      AddItemWithIcon(base::to_underlying(CommandId::kCoralNewDesk), u"Open",
-                      CreateIconForMenuItem(kCoralOpenIcon));
+      AddItemWithIcon(
+          base::to_underlying(CommandId::kCoralNewDesk),
+          l10n_util::GetStringUTF16(IDS_ASH_BIRCH_CORAL_CHIP_MENU_OPEN_GROUP),
+          CreateIconForMenuItem(kCoralOpenIcon));
       if (features::IsCoralFeatureEnabled() &&
           !display::Screen::GetScreen()->InTabletMode() &&
           !BirchBarController::Get()->is_informed_restore()) {
-        AddItemWithIcon(base::to_underlying(CommandId::kCoralSaveForLater),
-                        u"Save group for later",
-                        CreateIconForMenuItem(kSaveDeskForLaterIcon));
+        AddItemWithIcon(
+            base::to_underlying(CommandId::kCoralSaveForLater),
+            l10n_util::GetStringUTF16(IDS_ASH_BIRCH_CORAL_CHIP_MENU_SAVE_GROUP),
+            CreateIconForMenuItem(kSaveDeskForLaterIcon));
       }
       AddSeparator(ui::NORMAL_SEPARATOR);
       add_hide_suggestion_item();
-      AddItemWithIcon(base::to_underlying(CommandId::kHideCoralSuggestions),
-                      u"Don't suggest group to resume",
-                      CreateIconForMenuItem(kForbidIcon));
+      AddItemWithIcon(
+          base::to_underlying(CommandId::kHideCoralSuggestions),
+          l10n_util::GetStringUTF16(IDS_ASH_BIRCH_CORAL_CHIP_MENU_HIDE_GROUP),
+          CreateIconForMenuItem(kForbidIcon));
       break;
     default:
       break;
@@ -116,7 +120,8 @@
   if (chip_type == BirchSuggestionType::kCoral) {
     AddSeparator(ui::NORMAL_SEPARATOR);
     AddItemWithIcon(base::to_underlying(CommandId::kProvideFeedback),
-                    u"Send feedback", CreateIconForMenuItem(kFeedbackIcon));
+                    l10n_util::GetStringUTF16(IDS_ASH_BIRCH_SEND_FEEDBACK),
+                    CreateIconForMenuItem(kFeedbackIcon));
   }
 }
 
diff --git a/ash/wm/overview/birch/coral_chip_button.cc b/ash/wm/overview/birch/coral_chip_button.cc
index 1ff0072..c68379b 100644
--- a/ash/wm/overview/birch/coral_chip_button.cc
+++ b/ash/wm/overview/birch/coral_chip_button.cc
@@ -20,8 +20,10 @@
 #include "components/vector_icons/vector_icons.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/metadata/metadata_impl_macros.h"
+#include "ui/gfx/geometry/rounded_corners_f.h"
 #include "ui/views/controls/animated_image_view.h"
 #include "ui/views/controls/label.h"
+#include "ui/views/view_class_properties.h"
 #include "ui/views/view_utils.h"
 
 namespace ash {
@@ -29,6 +31,7 @@
 
 constexpr gfx::Size kLoadingAnimationSize = gfx::Size(100, 20);
 constexpr char kMaxSavedGroupsToastId[] = "coral_max_saved_groups_toast";
+constexpr base::TimeDelta kBorderAnimationDuration = base::Seconds(3);
 
 }  // namespace
 
@@ -79,10 +82,6 @@
     title_label->SetVisible(false);
 
     BuildTitleLoadingAnimation();
-    title_loading_animated_image_->Play(
-        birch_animation_utils::GetLottiePlaybackConfig(
-            *title_loading_animated_image_->animated_image()->skottie(),
-            IDR_CORAL_LOADING_TITLE_ANIMATION));
   }
 
   SetAccessibleName(item_->GetAccessibleName());
@@ -93,6 +92,8 @@
 
   BirchChipButton::Init(item);
 
+  BuildBorderAnimation();
+
   // Override the title, callback and addon. Gets the real title from the group.
   auto* coral_provider = BirchCoralProvider::Get();
   const std::optional<std::string>& group_title =
@@ -185,6 +186,50 @@
   title_loading_animated_image_ =
       title()->parent()->AddChildViewAt(std::move(title_loading_animated_image),
                                         /*index=*/0);
+  title_loading_animated_image_->Play(
+      birch_animation_utils::GetLottiePlaybackConfig(
+          *title_loading_animated_image_->animated_image()->skottie()));
+}
+
+void CoralChipButton::BuildBorderAnimation() {
+  // Build `rainbow_border_animated_image_` and cover it on the chip.
+  std::unique_ptr<views::AnimatedImageView> rainbow_border_animated_image =
+      views::Builder<views::AnimatedImageView>()
+          .SetAnimatedImage(birch_animation_utils::GetLottieAnimationData(
+              IDR_CORAL_BORDER_ANIMATION))
+          .SetProperty(views::kViewIgnoredByLayoutKey, true)
+          .SetCanProcessEventsWithinSubtree(false)
+          .Build();
+  rainbow_border_animated_image_ =
+      AddChildView(std::move(rainbow_border_animated_image));
+
+  // Transform the animated image to fit the chip.
+  const gfx::SizeF chip_size(GetPreferredSize());
+  const gfx::SizeF image_size(
+      rainbow_border_animated_image_->GetPreferredSize());
+  rainbow_border_animated_image_->SetTransform(
+      gfx::Transform::MakeScale(chip_size.width() / image_size.width(),
+                                chip_size.height() / image_size.height()));
+  rainbow_border_animated_image_->layer()->SetFillsBoundsOpaquely(false);
+
+  // Clipping the image outside chip region.
+  rainbow_border_animated_image_->layer()->SetRoundedCornerRadius(
+      gfx::RoundedCornersF(GetRoundedCornerRadius()));
+
+  rainbow_border_animated_image_->SizeToPreferredSize();
+  rainbow_border_animated_image_->Play(
+      birch_animation_utils::GetLottiePlaybackConfig(
+          *rainbow_border_animated_image_->animated_image()->skottie()));
+
+  stop_border_animation_timer_.Start(FROM_HERE, kBorderAnimationDuration, this,
+                                     &CoralChipButton::DestroyBorderAnimation);
+}
+
+void CoralChipButton::DestroyBorderAnimation() {
+  if (rainbow_border_animated_image_) {
+    stop_border_animation_timer_.Stop();
+    RemoveChildViewT(std::exchange(rainbow_border_animated_image_, nullptr));
+  }
 }
 
 BEGIN_METADATA(CoralChipButton)
diff --git a/ash/wm/overview/birch/coral_chip_button.h b/ash/wm/overview/birch/coral_chip_button.h
index 52405ae..9553795 100644
--- a/ash/wm/overview/birch/coral_chip_button.h
+++ b/ash/wm/overview/birch/coral_chip_button.h
@@ -6,6 +6,7 @@
 #define ASH_WM_OVERVIEW_BIRCH_CORAL_CHIP_BUTTON_H_
 
 #include "ash/wm/overview/birch/birch_chip_button.h"
+#include "base/timer/timer.h"
 
 namespace views {
 class AnimatedImageView;
@@ -55,7 +56,16 @@
   // Builds `title_loading_animated_image_`.
   void BuildTitleLoadingAnimation();
 
+  // Builds `rainbow_border_animated_image_`.
+  void BuildBorderAnimation();
+
+  // Destroys `rainbow_border_animated_image_`.
+  void DestroyBorderAnimation();
+
   raw_ptr<views::AnimatedImageView> title_loading_animated_image_ = nullptr;
+  raw_ptr<views::AnimatedImageView> rainbow_border_animated_image_ = nullptr;
+
+  base::OneShotTimer stop_border_animation_timer_;
 
   // The selection menu to select tabs and apps for coral launching. Created
   // once the coral add on button is clicked.
diff --git a/ash/wm/overview/birch/resources/OWNERS b/ash/wm/overview/birch/resources/OWNERS
new file mode 100644
index 0000000..3a83e7e
--- /dev/null
+++ b/ash/wm/overview/birch/resources/OWNERS
@@ -0,0 +1 @@
+file://ash/resources/OWNERS
\ No newline at end of file
diff --git a/ash/wm/overview/birch/resources/coral_border.json b/ash/wm/overview/birch/resources/coral_border.json
new file mode 100644
index 0000000..49d77af
--- /dev/null
+++ b/ash/wm/overview/birch/resources/coral_border.json
@@ -0,0 +1 @@
+{"v":"5.9.3","fr":60,"ip":0,"op":197,"w":277,"h":67,"nm":"box real size","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":1,"nm":"White Solid 13","parent":3,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-306.074,119,0],"ix":2,"l":2},"a":{"a":0,"k":[307,119,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":5,"nm":"Gradient Ramp","np":10,"mn":"ADBE Ramp","ix":1,"en":1,"ef":[{"ty":3,"nm":"Start of Ramp","mn":"ADBE Ramp-0001","ix":1,"v":{"a":0,"k":[128,60],"ix":1}},{"ty":2,"nm":"Start Color","mn":"ADBE Ramp-0002","ix":2,"v":{"a":0,"k":[0,0,0,1],"ix":2}},{"ty":3,"nm":"End of Ramp","mn":"ADBE Ramp-0003","ix":3,"v":{"a":0,"k":[472,210],"ix":3}},{"ty":2,"nm":"End Color","mn":"ADBE Ramp-0004","ix":4,"v":{"a":0,"k":[1,1,1,1],"ix":4}},{"ty":7,"nm":"Ramp Shape","mn":"ADBE Ramp-0005","ix":5,"v":{"a":0,"k":1,"ix":5}},{"ty":0,"nm":"Ramp Scatter","mn":"ADBE Ramp-0006","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Blend With Original","mn":"ADBE Ramp-0007","ix":7,"v":{"a":0,"k":0,"ix":7}},{"ty":6,"nm":"","mn":"ADBE Ramp-0008","ix":8,"v":0}]}],"sw":614,"sh":238,"sc":"#ffffff","ip":98,"op":698,"st":98,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"gradient_stroke_green","tt":3,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[174.5,33,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[275,65],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":23,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.701960784314,0.937254961799,0.831372608858,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1.5,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[-36.27,0.271],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":98,"op":197,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":1,"nm":"White Solid 13","parent":5,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":146,"s":[-309,119,0],"to":[0,0,0],"ti":[0,0,0]},{"t":196,"s":[330.148,119,0]}],"ix":2,"l":2},"a":{"a":0,"k":[307,119,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":5,"nm":"Gradient Ramp","np":10,"mn":"ADBE Ramp","ix":1,"en":1,"ef":[{"ty":3,"nm":"Start of Ramp","mn":"ADBE Ramp-0001","ix":1,"v":{"a":0,"k":[128,60],"ix":1}},{"ty":2,"nm":"Start Color","mn":"ADBE Ramp-0002","ix":2,"v":{"a":0,"k":[1,1,1,1],"ix":2}},{"ty":3,"nm":"End of Ramp","mn":"ADBE Ramp-0003","ix":3,"v":{"a":0,"k":[472,210],"ix":3}},{"ty":2,"nm":"End Color","mn":"ADBE Ramp-0004","ix":4,"v":{"a":0,"k":[0,0,0,1],"ix":4}},{"ty":7,"nm":"Ramp Shape","mn":"ADBE Ramp-0005","ix":5,"v":{"a":0,"k":1,"ix":5}},{"ty":0,"nm":"Ramp Scatter","mn":"ADBE Ramp-0006","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Blend With Original","mn":"ADBE Ramp-0007","ix":7,"v":{"a":0,"k":0,"ix":7}},{"ty":6,"nm":"","mn":"ADBE Ramp-0008","ix":8,"v":0}]}],"sw":614,"sh":238,"sc":"#ffffff","ip":98,"op":698,"st":98,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"gradient_stroke_green","tt":3,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[174.5,33,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[275,65],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":23,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.701960784314,0.937254961799,0.831372608858,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1.5,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[-36.27,0.271],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":98,"op":197,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":1,"nm":"White Solid 13","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":98,"s":[125.723,30.674,0],"to":[0,0,0],"ti":[0,0,0]},{"t":146,"s":[445.064,30.674,0]}],"ix":2,"l":2},"a":{"a":0,"k":[307,119,0],"ix":1,"l":2},"s":{"a":0,"k":[54,54,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":5,"nm":"Gradient Ramp","np":10,"mn":"ADBE Ramp","ix":1,"en":1,"ef":[{"ty":3,"nm":"Start of Ramp","mn":"ADBE Ramp-0001","ix":1,"v":{"a":0,"k":[128,60],"ix":1}},{"ty":2,"nm":"Start Color","mn":"ADBE Ramp-0002","ix":2,"v":{"a":0,"k":[0,0,0,1],"ix":2}},{"ty":3,"nm":"End of Ramp","mn":"ADBE Ramp-0003","ix":3,"v":{"a":0,"k":[472,210],"ix":3}},{"ty":2,"nm":"End Color","mn":"ADBE Ramp-0004","ix":4,"v":{"a":0,"k":[1,1,1,1],"ix":4}},{"ty":7,"nm":"Ramp Shape","mn":"ADBE Ramp-0005","ix":5,"v":{"a":0,"k":1,"ix":5}},{"ty":0,"nm":"Ramp Scatter","mn":"ADBE Ramp-0006","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Blend With Original","mn":"ADBE Ramp-0007","ix":7,"v":{"a":0,"k":0,"ix":7}},{"ty":6,"nm":"","mn":"ADBE Ramp-0008","ix":8,"v":0}]}],"sw":614,"sh":238,"sc":"#ffffff","ip":98,"op":698,"st":98,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"gradient_stroke_green","tt":3,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[174.5,33,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[275,65],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":23,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.701960784314,0.937254961799,0.831372608858,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1.5,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[-36.27,0.271],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":757,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":1,"nm":"White Solid 13","parent":9,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-306.074,119,0],"ix":2,"l":2},"a":{"a":0,"k":[307,119,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":5,"nm":"Gradient Ramp","np":10,"mn":"ADBE Ramp","ix":1,"en":1,"ef":[{"ty":3,"nm":"Start of Ramp","mn":"ADBE Ramp-0001","ix":1,"v":{"a":0,"k":[128,60],"ix":1}},{"ty":2,"nm":"Start Color","mn":"ADBE Ramp-0002","ix":2,"v":{"a":0,"k":[0,0,0,1],"ix":2}},{"ty":3,"nm":"End of Ramp","mn":"ADBE Ramp-0003","ix":3,"v":{"a":0,"k":[472,210],"ix":3}},{"ty":2,"nm":"End Color","mn":"ADBE Ramp-0004","ix":4,"v":{"a":0,"k":[1,1,1,1],"ix":4}},{"ty":7,"nm":"Ramp Shape","mn":"ADBE Ramp-0005","ix":5,"v":{"a":0,"k":1,"ix":5}},{"ty":0,"nm":"Ramp Scatter","mn":"ADBE Ramp-0006","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Blend With Original","mn":"ADBE Ramp-0007","ix":7,"v":{"a":0,"k":0,"ix":7}},{"ty":6,"nm":"","mn":"ADBE Ramp-0008","ix":8,"v":0}]}],"sw":614,"sh":238,"sc":"#ffffff","ip":0,"op":98,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"gradient_stroke_green","tt":3,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[174.5,33,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[275,65],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":23,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.701960784314,0.937254961799,0.831372608858,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1.5,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[-36.27,0.271],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":757,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":1,"nm":"White Solid 13","parent":11,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":48,"s":[-309,119,0],"to":[0,0,0],"ti":[0,0,0]},{"t":98,"s":[330.148,119,0]}],"ix":2,"l":2},"a":{"a":0,"k":[307,119,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":5,"nm":"Gradient Ramp","np":10,"mn":"ADBE Ramp","ix":1,"en":1,"ef":[{"ty":3,"nm":"Start of Ramp","mn":"ADBE Ramp-0001","ix":1,"v":{"a":0,"k":[128,60],"ix":1}},{"ty":2,"nm":"Start Color","mn":"ADBE Ramp-0002","ix":2,"v":{"a":0,"k":[1,1,1,1],"ix":2}},{"ty":3,"nm":"End of Ramp","mn":"ADBE Ramp-0003","ix":3,"v":{"a":0,"k":[472,210],"ix":3}},{"ty":2,"nm":"End Color","mn":"ADBE Ramp-0004","ix":4,"v":{"a":0,"k":[0,0,0,1],"ix":4}},{"ty":7,"nm":"Ramp Shape","mn":"ADBE Ramp-0005","ix":5,"v":{"a":0,"k":1,"ix":5}},{"ty":0,"nm":"Ramp Scatter","mn":"ADBE Ramp-0006","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Blend With Original","mn":"ADBE Ramp-0007","ix":7,"v":{"a":0,"k":0,"ix":7}},{"ty":6,"nm":"","mn":"ADBE Ramp-0008","ix":8,"v":0}]}],"sw":614,"sh":238,"sc":"#ffffff","ip":0,"op":98,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"gradient_stroke_green","tt":3,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[174.5,33,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[275,65],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":23,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.701960784314,0.937254961799,0.831372608858,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1.5,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[-36.27,0.271],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":757,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":11,"ty":1,"nm":"White Solid 13","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[139.223,30.674,0],"to":[0,0,0],"ti":[0,0,0]},{"t":48,"s":[445.064,30.674,0]}],"ix":2,"l":2},"a":{"a":0,"k":[307,119,0],"ix":1,"l":2},"s":{"a":0,"k":[54,54,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":5,"nm":"Gradient Ramp","np":10,"mn":"ADBE Ramp","ix":1,"en":1,"ef":[{"ty":3,"nm":"Start of Ramp","mn":"ADBE Ramp-0001","ix":1,"v":{"a":0,"k":[128,60],"ix":1}},{"ty":2,"nm":"Start Color","mn":"ADBE Ramp-0002","ix":2,"v":{"a":0,"k":[0,0,0,1],"ix":2}},{"ty":3,"nm":"End of Ramp","mn":"ADBE Ramp-0003","ix":3,"v":{"a":0,"k":[472,210],"ix":3}},{"ty":2,"nm":"End Color","mn":"ADBE Ramp-0004","ix":4,"v":{"a":0,"k":[1,1,1,1],"ix":4}},{"ty":7,"nm":"Ramp Shape","mn":"ADBE Ramp-0005","ix":5,"v":{"a":0,"k":1,"ix":5}},{"ty":0,"nm":"Ramp Scatter","mn":"ADBE Ramp-0006","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Blend With Original","mn":"ADBE Ramp-0007","ix":7,"v":{"a":0,"k":0,"ix":7}},{"ty":6,"nm":"","mn":"ADBE Ramp-0008","ix":8,"v":0}]}],"sw":614,"sh":238,"sc":"#ffffff","ip":0,"op":99,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"gradient_stroke_green","tt":3,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":48,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[174.5,33,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[275,65],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":23,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.701960784314,0.937254961799,0.831372608858,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1.5,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[-36.27,0.271],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":757,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"base_stroke_purple","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":48,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[174.75,33.25,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[275,65],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":23,"ix":4},"nm":"size adjustment layer","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.61568627451,0.639215686275,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1.5,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[-36.27,0.271],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":757,"st":0,"ct":1,"bm":0}],"markers":[{"tm":98,"cm":"_CrOS_Marker_CycleRestart_Line","dr":0}]}
\ No newline at end of file
diff --git a/ash/wm/overview/birch/resources/coral_resources.grd b/ash/wm/overview/birch/resources/coral_resources.grd
index 1462c3fa..6049610 100644
--- a/ash/wm/overview/birch/resources/coral_resources.grd
+++ b/ash/wm/overview/birch/resources/coral_resources.grd
@@ -9,6 +9,7 @@
   <release seq="1">
     <structures>
       <structure type="lottie" name="IDR_CORAL_LOADING_TITLE_ANIMATION" file="coral_title.json" compress="gzip" />
+      <structure type="lottie" name="IDR_CORAL_BORDER_ANIMATION" file="coral_border.json" compress="gzip" />
       </structures>
   </release>
 </grit>
\ No newline at end of file
diff --git a/ash/wm/system_panel_view.cc b/ash/wm/system_panel_view.cc
index 9634f04..929fe640 100644
--- a/ash/wm/system_panel_view.cc
+++ b/ash/wm/system_panel_view.cc
@@ -93,6 +93,10 @@
 
 SystemPanelView::~SystemPanelView() = default;
 
+bool SystemPanelView::IsDragging() const {
+  return drag_controller_.is_dragging_;
+}
+
 void SystemPanelView::OnMouseEvent(ui::MouseEvent* event) {
   HandleDragEventIfNeeded(event);
 }
diff --git a/ash/wm/system_panel_view.h b/ash/wm/system_panel_view.h
index 724c0af..2f982b51 100644
--- a/ash/wm/system_panel_view.h
+++ b/ash/wm/system_panel_view.h
@@ -36,6 +36,7 @@
                              ui::LocatedEvent* event);
 
    private:
+    friend class SystemPanelView;
     // Whether a drag is currently in progress.
     bool is_dragging_ = false;
 
@@ -53,6 +54,8 @@
   SystemPanelView& operator=(const SystemPanelView&) = delete;
   ~SystemPanelView() override;
 
+  bool IsDragging() const;
+
   // views::View:
   void OnMouseEvent(ui::MouseEvent* event) override;
   void OnGestureEvent(ui::GestureEvent* event) override;
diff --git a/base/BUILD.gn b/base/BUILD.gn
index 5d8029a..344e02a 100644
--- a/base/BUILD.gn
+++ b/base/BUILD.gn
@@ -536,6 +536,7 @@
     "profiler/periodic_sampling_scheduler.h",
     "profiler/profile_builder.h",
     "profiler/register_context.h",
+    "profiler/register_context_registers.h",
     "profiler/sample_metadata.cc",
     "profiler/sample_metadata.h",
     "profiler/sampling_profiler_thread_token.cc",
diff --git a/base/android/java/src/org/chromium/base/FeatureOverrides.java b/base/android/java/src/org/chromium/base/FeatureOverrides.java
index d943ccaf..7585773 100644
--- a/base/android/java/src/org/chromium/base/FeatureOverrides.java
+++ b/base/android/java/src/org/chromium/base/FeatureOverrides.java
@@ -5,9 +5,9 @@
 package org.chromium.base;
 
 import androidx.annotation.CheckResult;
-import androidx.annotation.Nullable;
 
 import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 
 /**
  * Allows overriding feature flags and parameters for tests. Prefer @Features annotations.
@@ -23,7 +23,7 @@
 @NullMarked
 public class FeatureOverrides {
     public static class Builder extends FeatureList.TestValues {
-        @Nullable private String mLastFeatureName;
+        private @Nullable String mLastFeatureName;
 
         private Builder() {}
 
diff --git a/base/android/java/src/org/chromium/base/process_launcher/ChildProcessService.java b/base/android/java/src/org/chromium/base/process_launcher/ChildProcessService.java
index 5e43bfcc..442f223 100644
--- a/base/android/java/src/org/chromium/base/process_launcher/ChildProcessService.java
+++ b/base/android/java/src/org/chromium/base/process_launcher/ChildProcessService.java
@@ -4,6 +4,8 @@
 
 package org.chromium.base.process_launcher;
 
+import static org.chromium.build.NullUtil.assumeNonNull;
+
 import android.app.Service;
 import android.content.Context;
 import android.content.Intent;
@@ -35,6 +37,7 @@
 import org.chromium.base.library_loader.LibraryLoader;
 import org.chromium.base.memory.MemoryPressureMonitor;
 import org.chromium.base.metrics.RecordHistogram;
+import org.chromium.build.annotations.Initializer;
 import org.chromium.build.annotations.NullMarked;
 import org.chromium.build.annotations.Nullable;
 
@@ -93,7 +96,6 @@
     private @Nullable String mBoundCallingClazz;
 
     // This is the native "Main" thread for the renderer / utility process.
-    @SuppressWarnings("NullAway.Init")
     private Thread mMainThread;
 
     // Parameters received via IPC, only accessed while holding the mMainThread monitor.
@@ -110,8 +112,7 @@
     private boolean mServiceBound;
 
     // Interface to send notifications to the parent process.
-    @SuppressWarnings("NullAway.Init")
-    private IParentProcess mParentProcess;
+    private @Nullable IParentProcess mParentProcess;
 
     public ChildProcessService(
             ChildProcessServiceDelegate delegate, Service service, Context applicationContext) {
@@ -257,7 +258,7 @@
             };
 
     /** Loads Chrome's native libraries and initializes a ChildProcessService. */
-    // For sCreateCalled check.
+    @Initializer
     public void onCreate() {
         Log.i(TAG, "Creating new ChildProcessService pid=%d", Process.myPid());
         if (sCreateCalled) {
@@ -283,6 +284,7 @@
     }
 
     private void mainThreadMain() {
+        assumeNonNull(mParentProcess);
         try {
             // CommandLine must be initialized before everything else.
             synchronized (mMainThread) {
diff --git a/base/files/file_util.cc b/base/files/file_util.cc
index 6211201..f38ee3e 100644
--- a/base/files/file_util.cc
+++ b/base/files/file_util.cc
@@ -36,8 +36,8 @@
 #include "base/notreached.h"
 #include "base/posix/eintr_wrapper.h"
 #include "base/ranges/algorithm.h"
+#include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
-#include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/task/bind_post_task.h"
 #include "base/threading/scoped_blocking_call.h"
@@ -511,8 +511,10 @@
     return path;
   }
   for (int count = 1; count <= kMaxUniqueFiles; ++count) {
-    FilePath candidate_path = path.InsertBeforeExtensionASCII(
-        StringPrintfNonConstexpr(suffix_format.data(), count));
+    std::string suffix(suffix_format);
+    base::ReplaceFirstSubstringAfterOffset(&suffix, 0, "%d",
+                                           base::NumberToString(count));
+    FilePath candidate_path = path.InsertBeforeExtensionASCII(suffix);
     if (!PathExists(candidate_path)) {
       return candidate_path;
     }
diff --git a/base/i18n/streaming_utf8_validator_perftest.cc b/base/i18n/streaming_utf8_validator_perftest.cc
index f5408d176..cba3966fa 100644
--- a/base/i18n/streaming_utf8_validator_perftest.cc
+++ b/base/i18n/streaming_utf8_validator_perftest.cc
@@ -24,6 +24,7 @@
 
 #include "base/functional/bind.h"
 #include "base/functional/callback.h"
+#include "base/strings/cstring_view.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/test/perf_time_logger.h"
@@ -152,12 +153,14 @@
     {&IsStringUTF8, "IsStringUTF8"},
     {&IsString7Bit, "IsString7Bit"}};
 
-// Construct a test string from |construct_test_string| for each of the lengths
-// in |kTestLengths| in turn. For each string, run each test in |test_functions|
+// Construct a test string from `construct_test_string` for each of the lengths
+// in `kTestLengths` in turn. For each string, run each test in `test_functions`
 // for a number of iterations such that the total number of bytes validated
-// is around 16MB.
+// is around 16MB. `num_bytes` and `type` are used to create a human-readable
+// description of what `construct_test_string` is actually doing.
 void RunSomeTests(
-    const char format[],
+    int num_bytes,
+    base::cstring_view type,
     base::RepeatingCallback<std::string(size_t length)> construct_test_string,
     const TestFunctionDescription* test_functions,
     size_t test_count) {
@@ -166,24 +169,24 @@
     const int real_length = static_cast<int>(test_string.length());
     const int times = (1 << 24) / real_length;
     for (size_t test_index = 0; test_index < test_count; ++test_index) {
-      EXPECT_TRUE(RunTest(StringPrintfNonConstexpr(
-                              format, test_functions[test_index].function_name,
-                              real_length, times),
-                          test_functions[test_index].function, test_string,
-                          times));
+      EXPECT_TRUE(
+          RunTest(StringPrintf("%s: bytes=%d %s length=%d repeat=%d",
+                               test_functions[test_index].function_name,
+                               num_bytes, type.c_str(), real_length, times),
+                  test_functions[test_index].function, test_string, times));
     }
   }
 }
 
 TEST(StreamingUtf8ValidatorPerfTest, OneByteRepeated) {
   RunSomeTests(
-      "%s: bytes=1 repeated length=%d repeat=%d",
+      1, "repeated",
       base::BindRepeating(ConstructRepeatedTestString, kOneByteSeqRangeStart),
       kTestFunctions, 3);
 }
 
 TEST(StreamingUtf8ValidatorPerfTest, OneByteRange) {
-  RunSomeTests("%s: bytes=1 ranged length=%d repeat=%d",
+  RunSomeTests(1, "ranged",
                base::BindRepeating(ConstructRangedTestString,
                                    kOneByteSeqRangeStart, kOneByteSeqRangeEnd),
                kTestFunctions, 3);
@@ -191,13 +194,13 @@
 
 TEST(StreamingUtf8ValidatorPerfTest, TwoByteRepeated) {
   RunSomeTests(
-      "%s: bytes=2 repeated length=%d repeat=%d",
+      2, "repeated",
       base::BindRepeating(ConstructRepeatedTestString, kTwoByteSeqRangeStart),
       kTestFunctions, 2);
 }
 
 TEST(StreamingUtf8ValidatorPerfTest, TwoByteRange) {
-  RunSomeTests("%s: bytes=2 ranged length=%d repeat=%d",
+  RunSomeTests(2, "ranged",
                base::BindRepeating(ConstructRangedTestString,
                                    kTwoByteSeqRangeStart, kTwoByteSeqRangeEnd),
                kTestFunctions, 2);
@@ -205,14 +208,14 @@
 
 TEST(StreamingUtf8ValidatorPerfTest, ThreeByteRepeated) {
   RunSomeTests(
-      "%s: bytes=3 repeated length=%d repeat=%d",
+      3, "repeated",
       base::BindRepeating(ConstructRepeatedTestString, kThreeByteSeqRangeStart),
       kTestFunctions, 2);
 }
 
 TEST(StreamingUtf8ValidatorPerfTest, ThreeByteRange) {
   RunSomeTests(
-      "%s: bytes=3 ranged length=%d repeat=%d",
+      3, "ranged",
       base::BindRepeating(ConstructRangedTestString, kThreeByteSeqRangeStart,
                           kThreeByteSeqRangeEnd),
       kTestFunctions, 2);
@@ -220,14 +223,14 @@
 
 TEST(StreamingUtf8ValidatorPerfTest, FourByteRepeated) {
   RunSomeTests(
-      "%s: bytes=4 repeated length=%d repeat=%d",
+      4, "repeated",
       base::BindRepeating(ConstructRepeatedTestString, kFourByteSeqRangeStart),
       kTestFunctions, 2);
 }
 
 TEST(StreamingUtf8ValidatorPerfTest, FourByteRange) {
   RunSomeTests(
-      "%s: bytes=4 ranged length=%d repeat=%d",
+      4, "ranged",
       base::BindRepeating(ConstructRangedTestString, kFourByteSeqRangeStart,
                           kFourByteSeqRangeEnd),
       kTestFunctions, 2);
diff --git a/base/metrics/persistent_sample_map.cc b/base/metrics/persistent_sample_map.cc
index bdf1fff..c31c4d8 100644
--- a/base/metrics/persistent_sample_map.cc
+++ b/base/metrics/persistent_sample_map.cc
@@ -4,26 +4,30 @@
 
 #include "base/metrics/persistent_sample_map.h"
 
+#include <stddef.h>
+#include <stdint.h>
+
 #include <atomic>
 #include <type_traits>
 
 #include "base/check_op.h"
 #include "base/containers/contains.h"
-#include "base/debug/crash_logging.h"
+#include "base/metrics/histogram_base.h"
 #include "base/metrics/histogram_macros.h"
+#include "base/metrics/histogram_samples.h"
 #include "base/metrics/persistent_histogram_allocator.h"
 #include "base/metrics/sample_map_iterator.h"
 #include "base/notreached.h"
-#include "base/numerics/safe_conversions.h"
+#include "build/buildflag.h"
+
+#if !BUILDFLAG(IS_NACL)
+#include "base/debug/crash_logging.h"
+#endif
 
 namespace base {
 
-typedef HistogramBase::Count Count;
-typedef HistogramBase::Sample Sample;
-
-typedef std::map<HistogramBase::Sample,
-                 raw_ptr<std::atomic<HistogramBase::Count>, CtnExperimental>>
-    SampleToCountMap;
+using Count = HistogramBase::Count;
+using Sample = HistogramBase::Sample;
 
 namespace {
 
@@ -68,23 +72,18 @@
   // concurrently modify the value.
   GetOrCreateSampleCountStorage(value)->fetch_add(count,
                                                   std::memory_order_relaxed);
-  IncreaseSumAndCount(strict_cast<int64_t>(count) * value, count);
+  IncreaseSumAndCount(int64_t{count} * value, count);
 }
 
 Count PersistentSampleMap::GetCount(Sample value) const {
-  // Have to override "const" to make sure all samples have been loaded before
-  // being able to know what value to return.
-  const std::atomic<Count>* const count_pointer =
-      const_cast<PersistentSampleMap*>(this)->GetSampleCountStorage(value);
+  const std::atomic<Count>* const count_pointer = GetSampleCountStorage(value);
   return count_pointer ? count_pointer->load(std::memory_order_relaxed) : 0;
 }
 
 Count PersistentSampleMap::TotalCount() const {
-  // Have to override "const" in order to make sure all samples have been
-  // loaded before trying to iterate over the map.
-  const_cast<PersistentSampleMap*>(this)->ImportSamples(
-      /*until_value=*/std::nullopt);
-
+  // Make sure all samples have been loaded before trying to iterate over the
+  // map.
+  ImportSamples();
   Count count = 0;
   for (const auto& entry : sample_counts_) {
     count += entry.second->load(std::memory_order_relaxed);
@@ -93,10 +92,9 @@
 }
 
 std::unique_ptr<SampleCountIterator> PersistentSampleMap::Iterator() const {
-  // Have to override "const" in order to make sure all samples have been
-  // loaded before trying to iterate over the map.
-  const_cast<PersistentSampleMap*>(this)->ImportSamples(
-      /*until_value=*/std::nullopt);
+  // Make sure all samples have been loaded before trying to iterate over the
+  // map.
+  ImportSamples();
   return std::make_unique<SampleMapIterator<SampleToCountMap, false>>(
       sample_counts_);
 }
@@ -104,7 +102,7 @@
 std::unique_ptr<SampleCountIterator> PersistentSampleMap::ExtractingIterator() {
   // Make sure all samples have been loaded before trying to iterate over the
   // map.
-  ImportSamples(/*until_value=*/std::nullopt);
+  ImportSamples();
   return std::make_unique<SampleMapIterator<SampleToCountMap, true>>(
       sample_counts_);
 }
@@ -137,26 +135,25 @@
     uint64_t sample_map_id,
     Sample value) {
   SampleRecord* record = allocator->New<SampleRecord>();
-  if (!record) {
-    if (!allocator->IsFull()) {
-#if !BUILDFLAG(IS_NACL)
-      // TODO(crbug.com/40064026): Remove these. They are used to investigate
-      // unexpected failures.
-      SCOPED_CRASH_KEY_BOOL("PersistentSampleMap", "corrupted",
-                            allocator->IsCorrupt());
-#endif  // !BUILDFLAG(IS_NACL)
-      DUMP_WILL_BE_NOTREACHED() << "corrupt=" << allocator->IsCorrupt();
-    }
-    return 0;
+  if (record) {
+    record->id = sample_map_id;
+    record->value = value;
+    record->count = 0;
+    PersistentMemoryAllocator::Reference ref =
+        allocator->GetAsReference(record);
+    allocator->MakeIterable(ref);
+    return ref;
   }
 
-  record->id = sample_map_id;
-  record->value = value;
-  record->count = 0;
-
-  PersistentMemoryAllocator::Reference ref = allocator->GetAsReference(record);
-  allocator->MakeIterable(ref);
-  return ref;
+  if (!allocator->IsFull()) {
+    const bool corrupt = allocator->IsCorrupt();
+#if !BUILDFLAG(IS_NACL)
+    // TODO(crbug.com/40064026): Remove.
+    SCOPED_CRASH_KEY_BOOL("PersistentSampleMap", "corrupted", corrupt);
+#endif  // !BUILDFLAG(IS_NACL)
+    DUMP_WILL_BE_NOTREACHED() << "corrupt=" << corrupt;
+  }
+  return 0;
 }
 
 bool PersistentSampleMap::AddSubtractImpl(SampleCountIterator* iter,
@@ -169,7 +166,7 @@
     if (count == 0) {
       continue;
     }
-    if (strict_cast<int64_t>(min) + 1 != max) {
+    if (int64_t{min} + 1 != max) {
       return false;  // SparseHistogram only supports bucket with size 1.
     }
 
@@ -183,15 +180,11 @@
   return true;
 }
 
-std::atomic<Count>* PersistentSampleMap::GetSampleCountStorage(Sample value) {
+std::atomic<Count>* PersistentSampleMap::GetSampleCountStorage(
+    Sample value) const {
   // If |value| is already in the map, just return that.
-  auto it = sample_counts_.find(value);
-  if (it != sample_counts_.end()) {
-    return it->second;
-  }
-
-  // Import any new samples from persistent memory looking for the value.
-  return ImportSamples(/*until_value=*/value);
+  const auto it = sample_counts_.find(value);
+  return (it == sample_counts_.end()) ? ImportSamples(value) : it->second.get();
 }
 
 std::atomic<Count>* PersistentSampleMap::GetOrCreateSampleCountStorage(
@@ -225,12 +218,12 @@
   // Thread-safety within a process where multiple threads use the same
   // histogram object is delegated to the controlling histogram object which,
   // for sparse histograms, is a lock object.
-  count_pointer = ImportSamples(/*until_value=*/value);
+  count_pointer = ImportSamples(value);
   DCHECK(count_pointer);
   return count_pointer;
 }
 
-PersistentSampleMapRecords* PersistentSampleMap::GetRecords() {
+PersistentSampleMapRecords* PersistentSampleMap::GetRecords() const {
   // The |records_| pointer is lazily fetched from the |allocator_| only on
   // first use. Sometimes duplicate histograms are created by race conditions
   // and if both were to grab the records object, there would be a conflict.
@@ -243,7 +236,7 @@
 }
 
 std::atomic<Count>* PersistentSampleMap::ImportSamples(
-    std::optional<Sample> until_value) {
+    std::optional<Sample> until_value) const {
   std::vector<PersistentMemoryAllocator::Reference> refs;
   PersistentSampleMapRecords* records = GetRecords();
   while (!(refs = records->GetNextRecords(until_value)).empty()) {
@@ -251,7 +244,7 @@
     // map. Iterate through them all and store them internally. Note that if
     // |until_value| was found, it will be the last element in |refs|.
     for (auto ref : refs) {
-      SampleRecord* record = records->GetAsObject<SampleRecord>(ref);
+      SampleRecord* const record = records->GetAsObject<SampleRecord>(ref);
       if (!record) {
         continue;
       }
@@ -259,10 +252,8 @@
       DCHECK_EQ(id(), record->id);
 
       // Check if the record's value is already known.
-      if (!Contains(sample_counts_, record->value)) {
-        // No: Add it to map of known values.
-        sample_counts_[record->value] = &record->count;
-      } else {
+      const auto ret = sample_counts_.insert({record->value, &record->count});
+      if (!ret.second) {
         // Yes: Ignore it; it's a duplicate caused by a race condition -- see
         // code & comment in GetOrCreateSampleCountStorage() for details.
         // Check that nothing ever operated on the duplicate record.
diff --git a/base/metrics/persistent_sample_map.h b/base/metrics/persistent_sample_map.h
index 9c7df044..335f987f 100644
--- a/base/metrics/persistent_sample_map.h
+++ b/base/metrics/persistent_sample_map.h
@@ -17,7 +17,6 @@
 #include <optional>
 
 #include "base/base_export.h"
-#include "base/compiler_specific.h"
 #include "base/memory/raw_ptr.h"
 #include "base/metrics/histogram_base.h"
 #include "base/metrics/histogram_samples.h"
@@ -30,6 +29,10 @@
 // structures. Changes here likely need to be duplicated there.
 class BASE_EXPORT PersistentSampleMap : public HistogramSamples {
  public:
+  using SampleToCountMap =
+      std::map<HistogramBase::Sample,
+               raw_ptr<std::atomic<HistogramBase::Count>, CtnExperimental>>;
+
   // Constructs a persistent sample map using a PersistentHistogramAllocator
   // as the data source for persistent records.
   PersistentSampleMap(uint64_t id,
@@ -73,17 +76,17 @@
   // Gets a pointer to a "count" corresponding to a given |value|. Returns NULL
   // if sample does not exist.
   std::atomic<HistogramBase::Count>* GetSampleCountStorage(
-      HistogramBase::Sample value);
+      HistogramBase::Sample value) const;
 
   // Gets a pointer to a "count" corresponding to a given |value|, creating
-  // the sample (initialized to zero) if it does not already exists.
+  // the sample (initialized to zero) if it does not already exist.
   std::atomic<HistogramBase::Count>* GetOrCreateSampleCountStorage(
       HistogramBase::Sample value);
 
  private:
   // Gets the object that manages persistent records. This returns the
   // |records_| member after first initializing it if necessary.
-  PersistentSampleMapRecords* GetRecords();
+  PersistentSampleMapRecords* GetRecords() const;
 
   // Imports samples from persistent memory by iterating over all sample records
   // found therein, adding them to the sample_counts_ map. If a count for the
@@ -93,24 +96,22 @@
   // |until_value| to force the importing of all available samples (null will
   // always be returned in this case).
   std::atomic<HistogramBase::Count>* ImportSamples(
-      std::optional<HistogramBase::Sample> until_value);
+      std::optional<HistogramBase::Sample> until_value = std::nullopt) const;
 
   // All created/loaded sample values and their associated counts. The storage
   // for the actual Count numbers is owned by the |records_| object and its
   // underlying allocator.
-  std::map<HistogramBase::Sample,
-           raw_ptr<std::atomic<HistogramBase::Count>, CtnExperimental>>
-      sample_counts_;
+  mutable SampleToCountMap sample_counts_;
 
   // The allocator that manages histograms inside persistent memory. This is
   // owned externally and is expected to live beyond the life of this object.
-  raw_ptr<PersistentHistogramAllocator> allocator_;
+  mutable raw_ptr<PersistentHistogramAllocator> allocator_;
 
   // The object that manages sample records inside persistent memory. The
   // underlying data used is owned by the |allocator_| object (above). This
   // value is lazily-initialized on first use via the GetRecords() accessor
   // method.
-  std::unique_ptr<PersistentSampleMapRecords> records_ = nullptr;
+  mutable std::unique_ptr<PersistentSampleMapRecords> records_ = nullptr;
 };
 
 }  // namespace base
diff --git a/base/metrics/sample_map.cc b/base/metrics/sample_map.cc
index f6969f7..d9156d0 100644
--- a/base/metrics/sample_map.cc
+++ b/base/metrics/sample_map.cc
@@ -4,20 +4,19 @@
 
 #include "base/metrics/sample_map.h"
 
-#include <type_traits>
+#include <stdint.h>
 
-#include "base/check.h"
+#include <memory>
+
+#include "base/metrics/histogram_base.h"
+#include "base/metrics/histogram_samples.h"
 #include "base/metrics/sample_map_iterator.h"
-#include "base/numerics/safe_conversions.h"
+#include "base/numerics/wrapping_math.h"
 
 namespace base {
 
-typedef HistogramBase::Count Count;
-typedef HistogramBase::Sample Sample;
-
-typedef std::map<HistogramBase::Sample, HistogramBase::Count> SampleToCountMap;
-
-SampleMap::SampleMap() : SampleMap(0) {}
+using Count = HistogramBase::Count;
+using Sample = HistogramBase::Sample;
 
 SampleMap::SampleMap(uint64_t id)
     : HistogramSamples(id, std::make_unique<LocalMetadata>()) {}
@@ -35,11 +34,8 @@
 }
 
 Count SampleMap::GetCount(Sample value) const {
-  auto it = sample_counts_.find(value);
-  if (it == sample_counts_.end()) {
-    return 0;
-  }
-  return it->second;
+  const auto it = sample_counts_.find(value);
+  return (it == sample_counts_.end()) ? 0 : it->second;
 }
 
 Count SampleMap::TotalCount() const {
@@ -75,7 +71,7 @@
   Count count;
   for (; !iter->Done(); iter->Next()) {
     iter->Get(&min, &max, &count);
-    if (strict_cast<int64_t>(min) + 1 != max) {
+    if (int64_t{min} + 1 != max) {
       return false;  // SparseHistogram only supports bucket with size 1.
     }
 
diff --git a/base/metrics/sample_map.h b/base/metrics/sample_map.h
index e62e6a7..92b805f 100644
--- a/base/metrics/sample_map.h
+++ b/base/metrics/sample_map.h
@@ -14,7 +14,6 @@
 #include <memory>
 
 #include "base/base_export.h"
-#include "base/compiler_specific.h"
 #include "base/metrics/histogram_base.h"
 #include "base/metrics/histogram_samples.h"
 
@@ -24,8 +23,10 @@
 // data structures. Changes here likely need to be duplicated there.
 class BASE_EXPORT SampleMap : public HistogramSamples {
  public:
-  SampleMap();
-  explicit SampleMap(uint64_t id);
+  using SampleToCountMap =
+      std::map<HistogramBase::Sample, HistogramBase::Count>;
+
+  explicit SampleMap(uint64_t id = 0);
 
   SampleMap(const SampleMap&) = delete;
   SampleMap& operator=(const SampleMap&) = delete;
@@ -46,7 +47,7 @@
   bool AddSubtractImpl(SampleCountIterator* iter, Operator op) override;
 
  private:
-  std::map<HistogramBase::Sample, HistogramBase::Count> sample_counts_;
+  SampleToCountMap sample_counts_;
 };
 
 }  // namespace base
diff --git a/base/profiler/chrome_unwinder_android_32.cc b/base/profiler/chrome_unwinder_android_32.cc
index f5116b6..b651dcc 100644
--- a/base/profiler/chrome_unwinder_android_32.cc
+++ b/base/profiler/chrome_unwinder_android_32.cc
@@ -16,6 +16,7 @@
 #include "base/notreached.h"
 #include "base/numerics/checked_math.h"
 #include "base/profiler/chrome_unwind_info_android_32.h"
+#include "base/profiler/register_context_registers.h"
 
 namespace base {
 namespace {
diff --git a/base/profiler/chrome_unwinder_android_32_unittest.cc b/base/profiler/chrome_unwinder_android_32_unittest.cc
index a1e73c2..a21d8bb 100644
--- a/base/profiler/chrome_unwinder_android_32_unittest.cc
+++ b/base/profiler/chrome_unwinder_android_32_unittest.cc
@@ -11,6 +11,7 @@
 
 #include "base/memory/aligned_memory.h"
 #include "base/profiler/chrome_unwind_info_android_32.h"
+#include "base/profiler/register_context_registers.h"
 #include "base/profiler/stack_sampling_profiler_test_util.h"
 #include "base/ranges/algorithm.h"
 #include "base/test/gtest_util.h"
diff --git a/base/profiler/frame_pointer_unwinder.cc b/base/profiler/frame_pointer_unwinder.cc
index 08853da..f8e783d 100644
--- a/base/profiler/frame_pointer_unwinder.cc
+++ b/base/profiler/frame_pointer_unwinder.cc
@@ -14,6 +14,7 @@
 #include "base/notreached.h"
 #include "base/numerics/clamped_math.h"
 #include "base/profiler/module_cache.h"
+#include "base/profiler/register_context_registers.h"
 #include "build/build_config.h"
 
 #if BUILDFLAG(IS_APPLE)
diff --git a/base/profiler/frame_pointer_unwinder_unittest.cc b/base/profiler/frame_pointer_unwinder_unittest.cc
index bb82171de..ec6ab18 100644
--- a/base/profiler/frame_pointer_unwinder_unittest.cc
+++ b/base/profiler/frame_pointer_unwinder_unittest.cc
@@ -7,6 +7,7 @@
 #include <memory>
 
 #include "base/profiler/module_cache.h"
+#include "base/profiler/register_context_registers.h"
 #include "base/profiler/stack_sampling_profiler_test_util.h"
 #include "base/profiler/unwinder.h"
 #include "build/buildflag.h"
diff --git a/base/profiler/libunwindstack_unwinder_android_unittest.cc b/base/profiler/libunwindstack_unwinder_android_unittest.cc
index 90e9ac9c..d9c8a8e9 100644
--- a/base/profiler/libunwindstack_unwinder_android_unittest.cc
+++ b/base/profiler/libunwindstack_unwinder_android_unittest.cc
@@ -15,6 +15,7 @@
 #include "base/native_library.h"
 #include "base/path_service.h"
 #include "base/profiler/register_context.h"
+#include "base/profiler/register_context_registers.h"
 #include "base/profiler/stack_buffer.h"
 #include "base/profiler/stack_copier_signal.h"
 #include "base/profiler/stack_sampler.h"
diff --git a/base/profiler/native_unwinder_android_unittest.cc b/base/profiler/native_unwinder_android_unittest.cc
index 3e7a252..93107de 100644
--- a/base/profiler/native_unwinder_android_unittest.cc
+++ b/base/profiler/native_unwinder_android_unittest.cc
@@ -25,6 +25,7 @@
 #include "base/profiler/native_unwinder_android_map_delegate.h"
 #include "base/profiler/native_unwinder_android_memory_regions_map_impl.h"
 #include "base/profiler/register_context.h"
+#include "base/profiler/register_context_registers.h"
 #include "base/profiler/stack_buffer.h"
 #include "base/profiler/stack_copier_signal.h"
 #include "base/profiler/stack_sampler.h"
diff --git a/base/profiler/native_unwinder_win.cc b/base/profiler/native_unwinder_win.cc
index cc2dd68..0626b81 100644
--- a/base/profiler/native_unwinder_win.cc
+++ b/base/profiler/native_unwinder_win.cc
@@ -4,10 +4,11 @@
 
 #include "base/profiler/native_unwinder_win.h"
 
-#include <winnt.h>
+#include <windows.h>
 
 #include "base/check_op.h"
 #include "base/notreached.h"
+#include "base/profiler/register_context_registers.h"
 #include "base/profiler/win32_stack_frame_unwinder.h"
 #include "build/build_config.h"
 
diff --git a/base/profiler/register_context.h b/base/profiler/register_context.h
index e034bd0..db247d6e 100644
--- a/base/profiler/register_context.h
+++ b/base/profiler/register_context.h
@@ -2,240 +2,53 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40284755): Remove this and spanify to fix the errors.
-#pragma allow_unsafe_buffers
-#endif
-
 // This file provides the RegisterContext cross-platform typedef that represents
-// the native register context for the platform, plus functions that provide
-// access to key registers in the context.
+// the native register context for the platform.
 
 #ifndef BASE_PROFILER_REGISTER_CONTEXT_H_
 #define BASE_PROFILER_REGISTER_CONTEXT_H_
 
-#include <cstdint>
-
 #include "build/build_config.h"
 
 #if BUILDFLAG(IS_WIN)
-#include <windows.h>
-#elif BUILDFLAG(IS_APPLE)
-#include <mach/machine/thread_status.h>
+typedef struct _CONTEXT CONTEXT;
 #elif BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
 #include <sys/ucontext.h>
+#elif BUILDFLAG(IS_APPLE) && \
+    (defined(ARCH_CPU_X86_64) || defined(ARCH_CPU_ARM64))
+#include <mach/machine/thread_status.h>
+#else
+#include <stdint.h>
 #endif
 
 namespace base {
 
-// Helper function to account for the fact that platform-specific register state
-// types may be of the same size as uintptr_t, but not of the same type or
-// signedness -- e.g. unsigned int vs. unsigned long on 32-bit Windows, unsigned
-// long vs. unsigned long long on Mac, long long vs. unsigned long long on
-// Linux.
-template <typename T>
-uintptr_t& AsUintPtr(T* value) {
-  static_assert(sizeof(T) == sizeof(uintptr_t),
-                "register state type must be of equivalent size to uintptr_t");
-  return *reinterpret_cast<uintptr_t*>(value);
-}
-
 #if BUILDFLAG(IS_WIN)
 
 using RegisterContext = ::CONTEXT;
 
-inline uintptr_t& RegisterContextStackPointer(::CONTEXT* context) {
-#if defined(ARCH_CPU_X86_64)
-  return context->Rsp;
-#elif defined(ARCH_CPU_ARM64)
-  return context->Sp;
-#else
-  return AsUintPtr(&context->Esp);
-#endif
-}
-
-inline uintptr_t& RegisterContextFramePointer(::CONTEXT* context) {
-#if defined(ARCH_CPU_X86_64)
-  return context->Rbp;
-#elif defined(ARCH_CPU_ARM64)
-  return context->Fp;
-#else
-  return AsUintPtr(&context->Ebp);
-#endif
-}
-
-inline uintptr_t& RegisterContextInstructionPointer(::CONTEXT* context) {
-#if defined(ARCH_CPU_X86_64)
-  return context->Rip;
-#elif defined(ARCH_CPU_ARM64)
-  return context->Pc;
-#else
-  return AsUintPtr(&context->Eip);
-#endif
-}
-
-#elif BUILDFLAG(IS_MAC) || BUILDFLAG(IS_IOS)
-
-#if defined(ARCH_CPU_X86_64)
-using RegisterContext = x86_thread_state64_t;
-
-inline uintptr_t& RegisterContextStackPointer(x86_thread_state64_t* context) {
-  return AsUintPtr(&context->__rsp);
-}
-
-inline uintptr_t& RegisterContextFramePointer(x86_thread_state64_t* context) {
-  return AsUintPtr(&context->__rbp);
-}
-
-inline uintptr_t& RegisterContextInstructionPointer(
-    x86_thread_state64_t* context) {
-  return AsUintPtr(&context->__rip);
-}
-
-#elif defined(ARCH_CPU_ARM64)  // defined(ARCH_CPU_X86_64)
-using RegisterContext = arm_thread_state64_t;
-
-// TODO(thakis): Have getter/setter functions instead of returning a ref to
-// prepare for arm64e. See __DARWIN_OPAQUE_ARM_THREAD_STATE6 in
-// mach/arm/_structs.h
-inline uintptr_t& RegisterContextStackPointer(arm_thread_state64_t* context) {
-  return AsUintPtr(&context->__sp);
-}
-
-inline uintptr_t& RegisterContextFramePointer(arm_thread_state64_t* context) {
-  return AsUintPtr(&context->__fp);
-}
-
-inline uintptr_t& RegisterContextInstructionPointer(
-    arm_thread_state64_t* context) {
-  return AsUintPtr(&context->__pc);
-}
-
-#else  // defined(ARCH_CPU_ARM64)
-
-// Placeholders for other cpus.
-struct RegisterContext {
-  uintptr_t stack_pointer;
-  uintptr_t frame_pointer;
-  uintptr_t instruction_pointer;
-};
-
-inline uintptr_t& RegisterContextStackPointer(RegisterContext* context) {
-  return context->stack_pointer;
-}
-
-inline uintptr_t& RegisterContextFramePointer(RegisterContext* context) {
-  return context->frame_pointer;
-}
-
-inline uintptr_t& RegisterContextInstructionPointer(RegisterContext* context) {
-  return context->instruction_pointer;
-}
-
-#endif
-
 #elif BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
 
 using RegisterContext = mcontext_t;
 
-#if defined(ARCH_CPU_ARM_FAMILY) && defined(ARCH_CPU_32_BITS)
+#elif BUILDFLAG(IS_APPLE) && defined(ARCH_CPU_X86_64)
 
-inline uintptr_t& RegisterContextStackPointer(mcontext_t* context) {
-  return AsUintPtr(&context->arm_sp);
-}
+using RegisterContext = x86_thread_state64_t;
 
-inline uintptr_t& RegisterContextFramePointer(mcontext_t* context) {
-  return AsUintPtr(&context->arm_fp);
-}
+#elif BUILDFLAG(IS_APPLE) && defined(ARCH_CPU_ARM64)
 
-inline uintptr_t& RegisterContextInstructionPointer(mcontext_t* context) {
-  return AsUintPtr(&context->arm_pc);
-}
+using RegisterContext = arm_thread_state64_t;
 
-#elif defined(ARCH_CPU_ARM_FAMILY) && defined(ARCH_CPU_64_BITS)
+#else
 
-inline uintptr_t& RegisterContextStackPointer(mcontext_t* context) {
-  return AsUintPtr(&context->sp);
-}
-
-inline uintptr_t& RegisterContextFramePointer(mcontext_t* context) {
-  // r29 is the FP register on 64-bit ARM per the Procedure Call Standard,
-  // section 5.1.1.
-  return AsUintPtr(&context->regs[29]);
-}
-
-inline uintptr_t& RegisterContextInstructionPointer(mcontext_t* context) {
-  return AsUintPtr(&context->pc);
-}
-
-#elif defined(ARCH_CPU_X86_FAMILY) && defined(ARCH_CPU_32_BITS)
-
-inline uintptr_t& RegisterContextStackPointer(mcontext_t* context) {
-  return AsUintPtr(&context->gregs[REG_ESP]);
-}
-
-inline uintptr_t& RegisterContextFramePointer(mcontext_t* context) {
-  return AsUintPtr(&context->gregs[REG_EBP]);
-}
-
-inline uintptr_t& RegisterContextInstructionPointer(mcontext_t* context) {
-  return AsUintPtr(&context->gregs[REG_EIP]);
-}
-
-#elif defined(ARCH_CPU_X86_FAMILY) && defined(ARCH_CPU_64_BITS)
-
-inline uintptr_t& RegisterContextStackPointer(mcontext_t* context) {
-  return AsUintPtr(&context->gregs[REG_RSP]);
-}
-
-inline uintptr_t& RegisterContextFramePointer(mcontext_t* context) {
-  return AsUintPtr(&context->gregs[REG_RBP]);
-}
-
-inline uintptr_t& RegisterContextInstructionPointer(mcontext_t* context) {
-  return AsUintPtr(&context->gregs[REG_RIP]);
-}
-
-#else  // defined(ARCH_CPU_ARM_FAMILY) && defined(ARCH_CPU_32_BITS)
-
-// Placeholders for other POSIX platforms that just return the first
-// three register slots in the context.
-inline uintptr_t& RegisterContextStackPointer(mcontext_t* context) {
-  return *reinterpret_cast<uintptr_t*>(context);
-}
-
-inline uintptr_t& RegisterContextFramePointer(mcontext_t* context) {
-  return *(reinterpret_cast<uintptr_t*>(context) + 1);
-}
-
-inline uintptr_t& RegisterContextInstructionPointer(mcontext_t* context) {
-  return *(reinterpret_cast<uintptr_t*>(context) + 2);
-}
-
-#endif  // defined(ARCH_CPU_ARM_FAMILY) && defined(ARCH_CPU_32_BITS)
-
-#else  // BUILDFLAG(IS_WIN)
-
-// Placeholders for other platforms.
+// Placeholders for other cases.
 struct RegisterContext {
   uintptr_t stack_pointer;
   uintptr_t frame_pointer;
   uintptr_t instruction_pointer;
 };
 
-inline uintptr_t& RegisterContextStackPointer(RegisterContext* context) {
-  return context->stack_pointer;
-}
-
-inline uintptr_t& RegisterContextFramePointer(RegisterContext* context) {
-  return context->frame_pointer;
-}
-
-inline uintptr_t& RegisterContextInstructionPointer(RegisterContext* context) {
-  return context->instruction_pointer;
-}
-
-#endif  // BUILDFLAG(IS_WIN)
+#endif
 
 }  // namespace base
 
diff --git a/base/profiler/register_context_registers.h b/base/profiler/register_context_registers.h
new file mode 100644
index 0000000..2f10163b
--- /dev/null
+++ b/base/profiler/register_context_registers.h
@@ -0,0 +1,176 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifdef UNSAFE_BUFFERS_BUILD
+// TODO(crbug.com/40284755): Remove this and spanify to fix the errors.
+#pragma allow_unsafe_buffers
+#endif
+
+// This file provides functions that provide access to key registers in the
+// native register context.
+
+#ifndef BASE_PROFILER_REGISTER_CONTEXT_REGISTERS_H_
+#define BASE_PROFILER_REGISTER_CONTEXT_REGISTERS_H_
+
+#include <stdint.h>
+
+#include "build/build_config.h"
+
+#if BUILDFLAG(IS_WIN)
+#include <windows.h>
+#elif BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
+#include <sys/ucontext.h>
+#elif BUILDFLAG(IS_APPLE)
+#include <mach/machine/thread_status.h>
+#else
+#include "base/profiler/register_context.h"
+#endif
+
+namespace base {
+
+// Helper function to account for the fact that platform-specific register state
+// types may be of the same size as uintptr_t, but not of the same type or
+// signedness -- e.g. unsigned int vs. unsigned long on 32-bit Windows, unsigned
+// long vs. unsigned long long on Mac, long long vs. unsigned long long on
+// Linux.
+template <typename T>
+uintptr_t& AsUintPtr(T* value) {
+  static_assert(sizeof(T) == sizeof(uintptr_t),
+                "register state type must be of equivalent size to uintptr_t");
+  return *reinterpret_cast<uintptr_t*>(value);
+}
+
+#if BUILDFLAG(IS_WIN)
+
+inline uintptr_t& RegisterContextStackPointer(::CONTEXT* context) {
+#if defined(ARCH_CPU_X86_64)
+  return context->Rsp;
+#elif defined(ARCH_CPU_ARM64)
+  return context->Sp;
+#else
+  return AsUintPtr(&context->Esp);
+#endif
+}
+
+inline uintptr_t& RegisterContextFramePointer(::CONTEXT* context) {
+#if defined(ARCH_CPU_X86_64)
+  return context->Rbp;
+#elif defined(ARCH_CPU_ARM64)
+  return context->Fp;
+#else
+  return AsUintPtr(&context->Ebp);
+#endif
+}
+
+inline uintptr_t& RegisterContextInstructionPointer(::CONTEXT* context) {
+#if defined(ARCH_CPU_X86_64)
+  return context->Rip;
+#elif defined(ARCH_CPU_ARM64)
+  return context->Pc;
+#else
+  return AsUintPtr(&context->Eip);
+#endif
+}
+
+#elif BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
+
+inline uintptr_t& RegisterContextStackPointer(mcontext_t* context) {
+#if defined(ARCH_CPU_ARM_FAMILY) && defined(ARCH_CPU_32_BITS)
+  return AsUintPtr(&context->arm_sp);
+#elif defined(ARCH_CPU_ARM_FAMILY) && defined(ARCH_CPU_64_BITS)
+  return AsUintPtr(&context->sp);
+#elif defined(ARCH_CPU_X86_FAMILY) && defined(ARCH_CPU_32_BITS)
+  return AsUintPtr(&context->gregs[REG_ESP]);
+#elif defined(ARCH_CPU_X86_FAMILY) && defined(ARCH_CPU_64_BITS)
+  return AsUintPtr(&context->gregs[REG_RSP]);
+#else
+  // The implementations here and below are placeholders for other POSIX
+  // platforms that just return the first three register slots in the context.
+  return *reinterpret_cast<uintptr_t*>(context);
+#endif
+}
+
+inline uintptr_t& RegisterContextFramePointer(mcontext_t* context) {
+#if defined(ARCH_CPU_ARM_FAMILY) && defined(ARCH_CPU_32_BITS)
+  return AsUintPtr(&context->arm_fp);
+#elif defined(ARCH_CPU_ARM_FAMILY) && defined(ARCH_CPU_64_BITS)
+  // r29 is the FP register on 64-bit ARM per the Procedure Call Standard,
+  // section 5.1.1.
+  return AsUintPtr(&context->regs[29]);
+#elif defined(ARCH_CPU_X86_FAMILY) && defined(ARCH_CPU_32_BITS)
+  return AsUintPtr(&context->gregs[REG_EBP]);
+#elif defined(ARCH_CPU_X86_FAMILY) && defined(ARCH_CPU_64_BITS)
+  return AsUintPtr(&context->gregs[REG_RBP]);
+#else
+  return *(reinterpret_cast<uintptr_t*>(context) + 1);
+#endif
+}
+
+inline uintptr_t& RegisterContextInstructionPointer(mcontext_t* context) {
+#if defined(ARCH_CPU_ARM_FAMILY) && defined(ARCH_CPU_32_BITS)
+  return AsUintPtr(&context->arm_pc);
+#elif defined(ARCH_CPU_ARM_FAMILY) && defined(ARCH_CPU_64_BITS)
+  return AsUintPtr(&context->pc);
+#elif defined(ARCH_CPU_X86_FAMILY) && defined(ARCH_CPU_32_BITS)
+  return AsUintPtr(&context->gregs[REG_EIP]);
+#elif defined(ARCH_CPU_X86_FAMILY) && defined(ARCH_CPU_64_BITS)
+  return AsUintPtr(&context->gregs[REG_RIP]);
+#else
+  return *(reinterpret_cast<uintptr_t*>(context) + 2);
+#endif
+}
+
+#elif BUILDFLAG(IS_APPLE) && defined(ARCH_CPU_X86_64)
+
+inline uintptr_t& RegisterContextStackPointer(x86_thread_state64_t* context) {
+  return AsUintPtr(&context->__rsp);
+}
+
+inline uintptr_t& RegisterContextFramePointer(x86_thread_state64_t* context) {
+  return AsUintPtr(&context->__rbp);
+}
+
+inline uintptr_t& RegisterContextInstructionPointer(
+    x86_thread_state64_t* context) {
+  return AsUintPtr(&context->__rip);
+}
+
+#elif BUILDFLAG(IS_APPLE) && defined(ARCH_CPU_ARM64)
+
+// TODO(thakis): Have getter/setter functions instead of returning a ref to
+// prepare for arm64e. See __DARWIN_OPAQUE_ARM_THREAD_STATE6 in
+// mach/arm/_structs.h
+inline uintptr_t& RegisterContextStackPointer(arm_thread_state64_t* context) {
+  return AsUintPtr(&context->__sp);
+}
+
+inline uintptr_t& RegisterContextFramePointer(arm_thread_state64_t* context) {
+  return AsUintPtr(&context->__fp);
+}
+
+inline uintptr_t& RegisterContextInstructionPointer(
+    arm_thread_state64_t* context) {
+  return AsUintPtr(&context->__pc);
+}
+
+#else
+
+// Placeholders for other cases.
+inline uintptr_t& RegisterContextStackPointer(RegisterContext* context) {
+  return context->stack_pointer;
+}
+
+inline uintptr_t& RegisterContextFramePointer(RegisterContext* context) {
+  return context->frame_pointer;
+}
+
+inline uintptr_t& RegisterContextInstructionPointer(RegisterContext* context) {
+  return context->instruction_pointer;
+}
+
+#endif
+
+}  // namespace base
+
+#endif  // BASE_PROFILER_REGISTER_CONTEXT_REGISTERS_H_
diff --git a/base/profiler/stack_copier_signal.cc b/base/profiler/stack_copier_signal.cc
index 132b74b..dd015d49 100644
--- a/base/profiler/stack_copier_signal.cc
+++ b/base/profiler/stack_copier_signal.cc
@@ -20,6 +20,7 @@
 #include "base/memory/raw_ptr_exclusion.h"
 #include "base/notreached.h"
 #include "base/profiler/register_context.h"
+#include "base/profiler/register_context_registers.h"
 #include "base/profiler/stack_buffer.h"
 #include "base/profiler/suspendable_thread_delegate.h"
 #include "base/time/time_override.h"
diff --git a/base/profiler/stack_copier_signal_unittest.cc b/base/profiler/stack_copier_signal_unittest.cc
index 0c53f8a0..ea722ec5 100644
--- a/base/profiler/stack_copier_signal_unittest.cc
+++ b/base/profiler/stack_copier_signal_unittest.cc
@@ -15,6 +15,7 @@
 #include <utility>
 
 #include "base/debug/alias.h"
+#include "base/profiler/register_context_registers.h"
 #include "base/profiler/sampling_profiler_thread_token.h"
 #include "base/profiler/stack_buffer.h"
 #include "base/profiler/thread_delegate_posix.h"
diff --git a/base/profiler/stack_copier_suspend.cc b/base/profiler/stack_copier_suspend.cc
index 5d85a61..a96fccc0 100644
--- a/base/profiler/stack_copier_suspend.cc
+++ b/base/profiler/stack_copier_suspend.cc
@@ -4,6 +4,7 @@
 
 #include "base/profiler/stack_copier_suspend.h"
 
+#include "base/profiler/register_context_registers.h"
 #include "base/profiler/stack_buffer.h"
 #include "base/profiler/suspendable_thread_delegate.h"
 
diff --git a/base/profiler/stack_copier_suspend_unittest.cc b/base/profiler/stack_copier_suspend_unittest.cc
index 38be7ceb..db0fd9b 100644
--- a/base/profiler/stack_copier_suspend_unittest.cc
+++ b/base/profiler/stack_copier_suspend_unittest.cc
@@ -17,6 +17,7 @@
 
 #include "base/memory/raw_ptr.h"
 #include "base/memory/raw_ref.h"
+#include "base/profiler/register_context_registers.h"
 #include "base/profiler/stack_buffer.h"
 #include "base/profiler/suspendable_thread_delegate.h"
 #include "build/build_config.h"
diff --git a/base/profiler/stack_copier_unittest.cc b/base/profiler/stack_copier_unittest.cc
index 4f62d38..a0bc935 100644
--- a/base/profiler/stack_copier_unittest.cc
+++ b/base/profiler/stack_copier_unittest.cc
@@ -16,6 +16,7 @@
 #include <numeric>
 
 #include "base/profiler/register_context.h"
+#include "base/profiler/register_context_registers.h"
 #include "base/profiler/stack_buffer.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
diff --git a/base/profiler/stack_sampler.cc b/base/profiler/stack_sampler.cc
index e86c930..67c90374 100644
--- a/base/profiler/stack_sampler.cc
+++ b/base/profiler/stack_sampler.cc
@@ -15,6 +15,7 @@
 #include "base/numerics/safe_conversions.h"
 #include "base/profiler/metadata_recorder.h"
 #include "base/profiler/profile_builder.h"
+#include "base/profiler/register_context_registers.h"
 #include "base/profiler/sample_metadata.h"
 #include "base/profiler/stack_buffer.h"
 #include "base/profiler/stack_copier.h"
diff --git a/base/profiler/stack_sampler_unittest.cc b/base/profiler/stack_sampler_unittest.cc
index ac9446e..53544a74 100644
--- a/base/profiler/stack_sampler_unittest.cc
+++ b/base/profiler/stack_sampler_unittest.cc
@@ -22,6 +22,7 @@
 #include "base/memory/raw_ref.h"
 #include "base/profiler/module_cache.h"
 #include "base/profiler/profile_builder.h"
+#include "base/profiler/register_context_registers.h"
 #include "base/profiler/stack_buffer.h"
 #include "base/profiler/stack_copier.h"
 #include "base/profiler/stack_sampling_profiler_test_util.h"
diff --git a/base/profiler/stack_sampling_profiler.cc b/base/profiler/stack_sampling_profiler.cc
index 86df83e..daf64ef 100644
--- a/base/profiler/stack_sampling_profiler.cc
+++ b/base/profiler/stack_sampling_profiler.cc
@@ -33,6 +33,8 @@
 #include "build/build_config.h"
 
 #if BUILDFLAG(IS_WIN)
+#include <windows.h>
+
 #include "base/win/static_constants.h"
 #endif
 
diff --git a/base/profiler/suspendable_thread_delegate_mac.cc b/base/profiler/suspendable_thread_delegate_mac.cc
index 473d33e..d4e3791 100644
--- a/base/profiler/suspendable_thread_delegate_mac.cc
+++ b/base/profiler/suspendable_thread_delegate_mac.cc
@@ -18,6 +18,7 @@
 #include "base/apple/mach_logging.h"
 #include "base/check.h"
 #include "base/profiler/profile_builder.h"
+#include "base/profiler/register_context_registers.h"
 #include "build/build_config.h"
 
 // IMPORTANT NOTE: Some functions within this implementation are invoked while
diff --git a/base/strings/string_slice.h b/base/strings/string_slice.h
index 1bf148f..e070b6af 100644
--- a/base/strings/string_slice.h
+++ b/base/strings/string_slice.h
@@ -5,6 +5,7 @@
 #ifndef BASE_STRINGS_STRING_SLICE_H_
 #define BASE_STRINGS_STRING_SLICE_H_
 
+#include <stddef.h>
 #include <stdint.h>
 
 #include <bit>
diff --git a/build/android/gyp/generate_linker_version_script.py b/build/android/gyp/generate_linker_version_script.py
index a165cbb..1ace7ca 100755
--- a/build/android/gyp/generate_linker_version_script.py
+++ b/build/android/gyp/generate_linker_version_script.py
@@ -57,9 +57,7 @@
   # for libcrashpad_handler_trampoline.so.
   symbol_list = ['CrashpadHandlerMain', 'JNI_OnLoad']
 
-  if options.jni_multiplexing:
-    symbol_list.append('Java_J_*N__*')
-  elif options.export_fortesting_java_symbols:
+  if options.export_fortesting_java_symbols or options.jni_multiplexing:
     symbol_list.append('Java_*')
   else:
     # The linker uses unix shell globbing patterns, not regex. So, we have to
diff --git a/build/rust/cxx_version.gni b/build/rust/cxx_version.gni
index 95dc659..9ec53fe 100644
--- a/build/rust/cxx_version.gni
+++ b/build/rust/cxx_version.gni
@@ -4,4 +4,4 @@
 
 # The version of cxx under //third_party/rust/chromium_crates_io/vendor.
 # Update this whenever cxx is rolled.
-cxx_version = "1.0.135"
+cxx_version = "1.0.136"
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/CloseAllTabsHelperUnitTest.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/CloseAllTabsHelperUnitTest.java
index f643336..d2b110a3 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/CloseAllTabsHelperUnitTest.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/CloseAllTabsHelperUnitTest.java
@@ -21,6 +21,9 @@
 import org.mockito.junit.MockitoRule;
 
 import org.chromium.base.test.BaseRobolectricTestRunner;
+import org.chromium.chrome.browser.app.tabmodel.ArchivedTabModelOrchestrator;
+import org.chromium.chrome.browser.profiles.Profile;
+import org.chromium.chrome.browser.tab.TabArchiver;
 import org.chromium.chrome.browser.tabmodel.TabCreator;
 import org.chromium.chrome.browser.tabmodel.TabGroupModelFilter;
 import org.chromium.chrome.browser.tabmodel.TabGroupModelFilterProvider;
@@ -40,8 +43,12 @@
     @Mock private TabGroupModelFilter mIncognitoTabGroupModelFilter;
     @Mock private TabModel mRegularTabModel;
     @Mock private TabModel mIncognitoTabModel;
+    @Mock private TabModel mArchivedTabModel;
     @Mock private TabRemover mRegularTabRemover;
     @Mock private TabRemover mIncognitoTabRemover;
+    @Mock private Profile mProfile;
+    @Mock private ArchivedTabModelOrchestrator mArchivedTabModelOrchestrator;
+    @Mock private TabArchiver mTabArchiver;
 
     @Before
     public void setUp() {
@@ -55,6 +62,14 @@
         when(mTabModelSelector.getModel(true)).thenReturn(mIncognitoTabModel);
         when(mRegularTabModel.getTabRemover()).thenReturn(mRegularTabRemover);
         when(mIncognitoTabModel.getTabRemover()).thenReturn(mIncognitoTabRemover);
+
+        // Setup deps for tab archiving.
+        when(mTabModelSelector.getCurrentModel()).thenReturn(mRegularTabModel);
+        when(mRegularTabModel.getProfile()).thenReturn(mProfile);
+        when(mProfile.getOriginalProfile()).thenReturn(mProfile);
+        when(mArchivedTabModelOrchestrator.getTabArchiver()).thenReturn(mTabArchiver);
+        when(mArchivedTabModelOrchestrator.getTabModel()).thenReturn(mArchivedTabModel);
+        ArchivedTabModelOrchestrator.setInstanceForTesting(mArchivedTabModelOrchestrator);
     }
 
     @Test
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMessageManagerUnitTest.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMessageManagerUnitTest.java
index 180ab7b..3dc5cc5 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMessageManagerUnitTest.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMessageManagerUnitTest.java
@@ -120,6 +120,7 @@
         doNothing().when(mTabGroupModelFilter).addObserver(mTabModelObserverCaptor.capture());
         doReturn(mTabModel).when(mTabGroupModelFilter).getTabModel();
         doReturn(mProfile).when(mTabModel).getProfile();
+        doReturn(mProfile).when(mProfile).getOriginalProfile();
         mCurrentTabGroupModelFilterSupplier.set(mTabGroupModelFilter);
 
         mActivityScenarioRule.getScenario().onActivity(this::onActivityReady);
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherPaneCoordinatorFactoryUnitTest.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherPaneCoordinatorFactoryUnitTest.java
index 4f50cf4..5412635 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherPaneCoordinatorFactoryUnitTest.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherPaneCoordinatorFactoryUnitTest.java
@@ -152,6 +152,7 @@
         mTab1 = TabUiUnitTestUtils.prepareTab(TAB1_ID, TAB1_TITLE);
         mProfileProviderSupplier.set(mProfileProvider);
         when(mProfile.isOffTheRecord()).thenReturn(false);
+        when(mProfile.getOriginalProfile()).thenReturn(mProfile);
         when(mProfileProvider.getOriginalProfile()).thenReturn(mProfile);
 
         when(mTabModelSelector.getTabGroupModelFilterProvider())
diff --git a/chrome/android/java/res/xml/main_preferences.xml b/chrome/android/java/res/xml/main_preferences.xml
index a0305e5..effdcae 100644
--- a/chrome/android/java/res/xml/main_preferences.xml
+++ b/chrome/android/java/res/xml/main_preferences.xml
@@ -32,7 +32,7 @@
         android:order="4"
         android:layout="@layout/account_management_account_row"
         android:title="@string/prefs_google_services"
-        android:icon="@drawable/ic_google_services_48dp"
+        android:icon="@drawable/ic_google_services_48dp_with_bg"
         android:fragment="org.chromium.chrome.browser.sync.settings.GoogleServicesSettings"/>
 
     <PreferenceCategory
diff --git a/chrome/android/java/res/xml/main_preferences_legacy.xml b/chrome/android/java/res/xml/main_preferences_legacy.xml
index c1b7b6e..4808c71 100644
--- a/chrome/android/java/res/xml/main_preferences_legacy.xml
+++ b/chrome/android/java/res/xml/main_preferences_legacy.xml
@@ -33,7 +33,7 @@
         android:order="4"
         android:layout="@layout/account_management_account_row"
         android:title="@string/prefs_google_services"
-        android:icon="@drawable/ic_google_services_48dp"
+        android:icon="@drawable/ic_google_services_48dp_with_bg"
         android:fragment="org.chromium.chrome.browser.sync.settings.GoogleServicesSettings"/>
 
     <PreferenceCategory
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/tabmodel/ArchivedTabModelOrchestrator.java b/chrome/android/java/src/org/chromium/chrome/browser/app/tabmodel/ArchivedTabModelOrchestrator.java
index 07f0782..e02e18c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/app/tabmodel/ArchivedTabModelOrchestrator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/app/tabmodel/ArchivedTabModelOrchestrator.java
@@ -69,6 +69,7 @@
     }
 
     private static ProfileKeyedMap<ArchivedTabModelOrchestrator> sProfileMap;
+    private static ArchivedTabModelOrchestrator sInstanceForTesting;
 
     // TODO(crbug.com/333572160): Rely on PKM destroy infra when it's working.
     @VisibleForTesting
@@ -141,6 +142,10 @@
      * @return The corresponding {@link ArchivedTabModelOrchestrator}.
      */
     public static ArchivedTabModelOrchestrator getForProfile(Profile profile) {
+        if (sInstanceForTesting != null) {
+            return sInstanceForTesting;
+        }
+
         if (sProfileMap == null) {
             ThreadUtils.assertOnUiThread();
             sProfileMap =
@@ -529,4 +534,8 @@
             ObservableSupplierImpl<Boolean> skipSaveTabListSupplier) {
         mSkipSaveTabListSupplier = skipSaveTabListSupplier;
     }
+
+    public static void setInstanceForTesting(ArchivedTabModelOrchestrator instance) {
+        sInstanceForTesting = instance;
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanel.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanel.java
index 705657c..a3bbabd 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanel.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanel.java
@@ -975,6 +975,9 @@
     }
 
     @Override
+    public void removeFromParent() {}
+
+    @Override
     public boolean isSceneOverlayTreeShowing() {
         return isShowing();
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanel.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanel.java
index 1aad445..3315f52 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanel.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanel.java
@@ -221,6 +221,11 @@
         return mSceneLayer;
     }
 
+    @Override
+    public void removeFromParent() {
+        mSceneLayer.removeFromParent();
+    }
+
     // ============================================================================================
     // Contextual Search Manager Integration
     // ============================================================================================
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl.java
index 4f146a0..50e9f91 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl.java
@@ -760,17 +760,19 @@
                         : mBrowserControlsStateProvider.getTopControlOffset();
 
         for (int i = 0; i < mSceneOverlays.size(); i++) {
+            SceneOverlay overlay = mSceneOverlays.get(i);
             // If the SceneOverlay is not showing, don't bother adding it to the tree.
-            if (!mSceneOverlays.get(i).isSceneOverlayTreeShowing()) continue;
+            if (!overlay.isSceneOverlayTreeShowing()) {
+                overlay.removeFromParent();
+                continue;
+            }
 
             SceneOverlayLayer overlayLayer =
-                    mSceneOverlays
-                            .get(i)
-                            .getUpdatedSceneOverlayTree(
-                                    mCachedWindowViewport,
-                                    mCachedVisibleViewport,
-                                    resourceManager,
-                                    offsetPx * mPxToDp);
+                    overlay.getUpdatedSceneOverlayTree(
+                            mCachedWindowViewport,
+                            mCachedVisibleViewport,
+                            resourceManager,
+                            offsetPx * mPxToDp);
 
             overlayLayer.setContentTree(layer);
             layer = overlayLayer;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/ToolbarSwipeLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/ToolbarSwipeLayout.java
index 5f257da..abb4fe1a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/ToolbarSwipeLayout.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/ToolbarSwipeLayout.java
@@ -31,6 +31,7 @@
 import org.chromium.chrome.browser.layouts.animation.CompositorAnimator;
 import org.chromium.chrome.browser.layouts.scene_layer.SceneLayer;
 import org.chromium.chrome.browser.tab.Tab;
+import org.chromium.chrome.browser.tab.TabHidingType;
 import org.chromium.chrome.browser.tab.TabSelectionType;
 import org.chromium.chrome.browser.tab_ui.TabContentManager;
 import org.chromium.chrome.browser.tabmodel.TabClosureParams;
@@ -196,6 +197,17 @@
 
     @Override
     public void doneHiding() {
+        // Native pages already had thumbnails captured in `show()` so repeat work can be bypassed
+        // by hiding the tab early. This also fixes a blank NTP from being captured after Feed
+        // memory optimizations.
+        Tab currentTab = mTabModelSelector.getCurrentTab();
+        if (currentTab != null && currentTab.isNativePage()) {
+            // Use type CHANGED_TABS here as it triggers side-effects in observers that we want to
+            // maintain. This is the type that would be set in `selectTabById` after thumbnail
+            // capture.
+            currentTab.hide(TabHidingType.CHANGED_TABS);
+        }
+
         TabModelUtils.selectTabById(mTabModelSelector, mNextTabId, TabSelectionType.FROM_USER);
         super.doneHiding();
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManager.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManager.java
index 48b719e..b26e93c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManager.java
@@ -771,6 +771,11 @@
         return mTabStripTreeProvider;
     }
 
+    @Override
+    public void removeFromParent() {
+        mTabStripTreeProvider.removeFromParent();
+    }
+
     private int getStripTransitionScrimColor() {
         return mToolbarManager.getPrimaryColor();
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/MainSettings.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/MainSettings.java
index a97cc2c..1fd273d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/settings/MainSettings.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/MainSettings.java
@@ -7,7 +7,6 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.PackageManager;
-import android.graphics.drawable.Drawable;
 import android.os.Build;
 import android.os.Bundle;
 import android.os.Handler;
@@ -46,7 +45,6 @@
 import org.chromium.chrome.browser.preferences.Pref;
 import org.chromium.chrome.browser.safety_hub.SafetyHubMetricUtils;
 import org.chromium.chrome.browser.search_engines.TemplateUrlServiceFactory;
-import org.chromium.chrome.browser.signin.SyncConsentActivityLauncherImpl;
 import org.chromium.chrome.browser.signin.services.IdentityServicesProvider;
 import org.chromium.chrome.browser.signin.services.ProfileDataCache;
 import org.chromium.chrome.browser.signin.services.SigninManager;
@@ -70,12 +68,9 @@
 import org.chromium.components.search_engines.TemplateUrlService;
 import org.chromium.components.signin.AccountManagerFacade;
 import org.chromium.components.signin.AccountManagerFacadeProvider;
-import org.chromium.components.signin.base.CoreAccountInfo;
 import org.chromium.components.signin.identitymanager.ConsentLevel;
-import org.chromium.components.signin.metrics.SigninAccessPoint;
 import org.chromium.components.sync.SyncService;
 import org.chromium.components.user_prefs.UserPrefs;
-import org.chromium.ui.UiUtils;
 import org.chromium.ui.modaldialog.ModalDialogManager;
 
 import java.util.HashMap;
@@ -224,7 +219,9 @@
         SignInPreference signInPreference = findPreference(PREF_SIGN_IN);
         signInPreference.initialize(getProfile(), profileDataCache, accountManagerFacade);
 
-        updateGoogleServicePreference();
+        ChromeBasePreference googleServicePreference = findPreference(PREF_GOOGLE_SERVICES);
+        googleServicePreference.setViewId(R.id.account_management_google_services_row);
+
         cachePreferences();
         updateAutofillPreferences();
         updatePlusAddressesPreference();
@@ -383,29 +380,7 @@
         if (preference != null) getPreferenceScreen().removePreference(preference);
     }
 
-    private void updateGoogleServicePreference() {
-        ChromeBasePreference googleServicePreference = findPreference(PREF_GOOGLE_SERVICES);
-        if (ChromeFeatureList.isEnabled(
-                ChromeFeatureList.REPLACE_SYNC_PROMOS_WITH_SIGN_IN_PROMOS)) {
-            googleServicePreference.setIcon(R.drawable.ic_google_services_48dp_with_bg);
-            googleServicePreference.setViewId(R.id.account_management_google_services_row);
-        } else {
-            Drawable googleServicesIcon =
-                    UiUtils.getTintedDrawable(
-                            getContext(),
-                            R.drawable.ic_google_services_48dp,
-                            R.color.default_icon_color_tint_list);
-            googleServicePreference.setIcon(googleServicesIcon);
-        }
-    }
-
     private void updateManageSyncPreference() {
-        String primaryAccountName =
-                CoreAccountInfo.getEmailFrom(
-                        IdentityServicesProvider.get()
-                                .getIdentityManager(getProfile())
-                                .getPrimaryAccountInfo(ConsentLevel.SIGNIN));
-
         // TODO(crbug.com/40067770): Remove usage of ConsentLevel.SYNC after kSync users are
         // migrated to kSignin in phase 3. See ConsentLevel::kSync documentation for details.
         boolean isSyncConsentAvailable =
@@ -413,13 +388,8 @@
                                 .getIdentityManager(getProfile())
                                 .getPrimaryAccountInfo(ConsentLevel.SYNC)
                         != null;
-        boolean showManageSync =
-                primaryAccountName != null
-                        && (!ChromeFeatureList.isEnabled(
-                                        ChromeFeatureList.REPLACE_SYNC_PROMOS_WITH_SIGN_IN_PROMOS)
-                                || isSyncConsentAvailable);
-        mManageSync.setVisible(showManageSync);
-        if (!showManageSync) return;
+        mManageSync.setVisible(isSyncConsentAvailable);
+        if (!isSyncConsentAvailable) return;
 
         mManageSync.setIcon(SyncSettingsUtils.getSyncStatusIcon(getActivity(), getProfile()));
         mManageSync.setSummary(SyncSettingsUtils.getSyncStatusSummary(getActivity(), getProfile()));
@@ -430,20 +400,10 @@
                     if (SyncServiceFactory.getForProfile(getProfile())
                             .isSyncDisabledByEnterprisePolicy()) {
                         SyncSettingsUtils.showSyncDisabledByAdministratorToast(context);
-                    } else if (isSyncConsentAvailable) {
+                    } else {
                         SettingsNavigation settingsNavigation =
                                 SettingsNavigationFactory.createSettingsNavigation();
                         settingsNavigation.startSettings(context, ManageSyncSettings.class);
-                    } else {
-                        // TODO(crbug.com/40067770): Remove after rolling out
-                        // REPLACE_SYNC_PROMOS_WITH_SIGN_IN_PROMOS.
-                        assert !ChromeFeatureList.isEnabled(
-                                ChromeFeatureList.REPLACE_SYNC_PROMOS_WITH_SIGN_IN_PROMOS);
-                        SyncConsentActivityLauncherImpl.getForProfile(getProfile())
-                                .launchActivityForPromoDefaultFlow(
-                                        context,
-                                        SigninAccessPoint.SETTINGS_SYNC_OFF_ROW,
-                                        primaryAccountName);
                     }
                     return true;
                 });
@@ -590,15 +550,10 @@
         // TODO(crbug.com/343933167): The snackbar should be shown from
         // SignOutCoordinator.startSignOutFlow(), in other words SignOutCoordinator.showSnackbar()
         // should be private method.
-
-        // onSignedOut() is also called when a supervised account revokes the sync consent without
-        // signing out, in this case the Snackbar should not be shown.
         if (IdentityServicesProvider.get()
-                                .getIdentityManager(getProfile())
-                                .getPrimaryAccountInfo(ConsentLevel.SIGNIN)
-                        == null
-                && ChromeFeatureList.isEnabled(
-                        ChromeFeatureList.REPLACE_SYNC_PROMOS_WITH_SIGN_IN_PROMOS)) {
+                        .getIdentityManager(getProfile())
+                        .getPrimaryAccountInfo(ConsentLevel.SIGNIN)
+                == null) {
             // Show the signout snackbar, or wait until `onStart()` if the fragment is not in the
             // `STARTED` state.
             if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED)) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/SignInPreference.java b/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/SignInPreference.java
index bcb60e5..73a6e62 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/SignInPreference.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/SignInPreference.java
@@ -17,11 +17,9 @@
 
 import org.chromium.base.metrics.RecordUserAction;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.preferences.Pref;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.signin.SigninAndHistorySyncActivityLauncherImpl;
-import org.chromium.chrome.browser.signin.SyncConsentActivityLauncherImpl;
 import org.chromium.chrome.browser.signin.services.DisplayableProfileData;
 import org.chromium.chrome.browser.signin.services.IdentityServicesProvider;
 import org.chromium.chrome.browser.signin.services.ProfileDataCache;
@@ -161,16 +159,9 @@
 
     private void setupSigninDisabledByPolicy() {
         setFragment(null);
-        if (ChromeFeatureList.isEnabled(
-                ChromeFeatureList.REPLACE_SYNC_PROMOS_WITH_SIGN_IN_PROMOS)) {
-            setTitle(R.string.signin_settings_title);
-            setSummary(R.string.settings_signin_disabled_by_administrator);
-            setIcon(R.drawable.ic_business_small_with_bg);
-        } else {
-            setTitle(R.string.sync_promo_turn_on_sync);
-            setSummary(R.string.sign_in_to_chrome_disabled_summary);
-            setIcon(ManagedPreferencesUtils.getManagedByEnterpriseIconId());
-        }
+        setTitle(R.string.signin_settings_title);
+        setSummary(R.string.settings_signin_disabled_by_administrator);
+        setIcon(R.drawable.ic_business_small_with_bg);
         setViewEnabledAndShowAlertIcon(/* enabled= */ false, /* alertIconVisible= */ false);
         setOnPreferenceClickListener(
                 pref -> {
@@ -185,55 +176,35 @@
     }
 
     private void setupGenericPromo() {
-        if (ChromeFeatureList.isEnabled(
-                ChromeFeatureList.REPLACE_SYNC_PROMOS_WITH_SIGN_IN_PROMOS)) {
-            setTitle(R.string.signin_settings_title);
-            setSummary(R.string.signin_settings_subtitle);
-        } else {
-            setTitle(R.string.sync_promo_turn_on_sync);
-            setSummary(R.string.signin_pref_summary);
-        }
+        setTitle(R.string.signin_settings_title);
+        setSummary(R.string.signin_settings_subtitle);
 
         setFragment(null);
-        if (ChromeFeatureList.isEnabled(
-                ChromeFeatureList.REPLACE_SYNC_PROMOS_WITH_SIGN_IN_PROMOS)) {
-            setIcon(
-                    AppCompatResources.getDrawable(
-                            getContext(), R.drawable.account_circle_with_bg));
-        } else {
-            setIcon(AppCompatResources.getDrawable(getContext(), R.drawable.logo_avatar_anonymous));
-        }
+        setIcon(AppCompatResources.getDrawable(getContext(), R.drawable.account_circle_with_bg));
         setViewEnabledAndShowAlertIcon(/* enabled= */ true, /* alertIconVisible= */ false);
         OnPreferenceClickListener clickListener =
                 pref -> {
-                    if (ChromeFeatureList.isEnabled(
-                            ChromeFeatureList.REPLACE_SYNC_PROMOS_WITH_SIGN_IN_PROMOS)) {
-                        AccountPickerBottomSheetStrings bottomSheetStrings =
-                                new AccountPickerBottomSheetStrings.Builder(
-                                                R.string.signin_account_picker_bottom_sheet_title)
-                                        .build();
-                        BottomSheetSigninAndHistorySyncConfig config =
-                                new BottomSheetSigninAndHistorySyncConfig.Builder(
-                                                bottomSheetStrings,
-                                                NoAccountSigninMode.BOTTOM_SHEET,
-                                                WithAccountSigninMode.DEFAULT_ACCOUNT_BOTTOM_SHEET,
-                                                HistorySyncConfig.OptInMode.OPTIONAL)
-                                        .build();
-                        @Nullable
-                        Intent intent =
-                                SigninAndHistorySyncActivityLauncherImpl.get()
-                                        .createBottomSheetSigninIntentOrShowError(
-                                                getContext(),
-                                                mProfile,
-                                                config,
-                                                SigninAccessPoint.SETTINGS);
-                        if (intent != null) {
-                            getContext().startActivity(intent);
-                        }
-                    } else {
-                        SyncConsentActivityLauncherImpl.getForProfile(mProfile)
-                                .launchActivityIfAllowed(
-                                        getContext(), SigninAccessPoint.SETTINGS_SYNC_OFF_ROW);
+                    AccountPickerBottomSheetStrings bottomSheetStrings =
+                            new AccountPickerBottomSheetStrings.Builder(
+                                            R.string.signin_account_picker_bottom_sheet_title)
+                                    .build();
+                    BottomSheetSigninAndHistorySyncConfig config =
+                            new BottomSheetSigninAndHistorySyncConfig.Builder(
+                                            bottomSheetStrings,
+                                            NoAccountSigninMode.BOTTOM_SHEET,
+                                            WithAccountSigninMode.DEFAULT_ACCOUNT_BOTTOM_SHEET,
+                                            HistorySyncConfig.OptInMode.OPTIONAL)
+                                    .build();
+                    @Nullable
+                    Intent intent =
+                            SigninAndHistorySyncActivityLauncherImpl.get()
+                                    .createBottomSheetSigninIntentOrShowError(
+                                            getContext(),
+                                            mProfile,
+                                            config,
+                                            SigninAccessPoint.SETTINGS);
+                    if (intent != null) {
+                        getContext().startActivity(intent);
                     }
                     return true;
                 };
@@ -253,8 +224,7 @@
         setTitle(
                 SyncSettingsUtils.getDisplayableFullNameOrEmailWithPreference(
                         profileData, getContext(), SyncSettingsUtils.TitlePreference.FULL_NAME));
-        if (ChromeFeatureList.isEnabled(ChromeFeatureList.REPLACE_SYNC_PROMOS_WITH_SIGN_IN_PROMOS)
-                && !mSyncService.hasSyncConsent()) {
+        if (!mSyncService.hasSyncConsent()) {
             setFragment(ManageSyncSettings.class.getName());
         } else {
             setFragment(AccountManagementFragment.class.getName());
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/desktop_windowing/AppHeaderCoordinatorBrowserTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/desktop_windowing/AppHeaderCoordinatorBrowserTest.java
index 26667b6..6573bd57 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/desktop_windowing/AppHeaderCoordinatorBrowserTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/desktop_windowing/AppHeaderCoordinatorBrowserTest.java
@@ -408,29 +408,6 @@
                 activity.getActivityTab().getWebContents(),
                 "document.querySelector('input').blur()");
 
-        // Verify that the root view bottom padding uses the nav bar bottom inset.
-        CriteriaHelper.pollUiThread(
-                () -> {
-                    var navBarBottomInset =
-                            insetObserver
-                                    .getLastRawWindowInsets()
-                                    .getInsets(WindowInsetsCompat.Type.navigationBars())
-                                    .bottom;
-                    Criteria.checkThat(rootView.getPaddingBottom(), Matchers.is(navBarBottomInset));
-                });
-
-        // Dispatch window insets to simulate no overlap of the app window with the nav bar.
-        ThreadUtils.runOnUiThreadBlocking(
-                () -> {
-                    insetObserver.onApplyWindowInsets(
-                            rootView,
-                            new WindowInsetsCompat.Builder()
-                                    .setInsets(
-                                            WindowInsetsCompat.Type.navigationBars(),
-                                            Insets.of(0, 0, 0, 0))
-                                    .build());
-                });
-
         // Verify that the root view bottom padding is reset.
         CriteriaHelper.pollUiThread(
                 () -> Criteria.checkThat(rootView.getPaddingBottom(), Matchers.is(0)));
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/PageInfoViewTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/PageInfoViewTest.java
index 01a0587..44772b1 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/PageInfoViewTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/PageInfoViewTest.java
@@ -149,6 +149,8 @@
     private static final String sSimpleHtml = "/chrome/test/data/android/simple.html";
     private static final String sSiteDataHtml = "/content/test/data/browsing_data/site_data.html";
 
+    private static final int DAYS_UNTIL_EXPIRATION = 33;
+
     private static String[] sCookieDataTypes = {
         "Cookie", "LocalStorage", "ServiceWorker", "CacheStorage", "IndexedDb", "FileSystem"
     };
@@ -1381,6 +1383,70 @@
         expectHasCookies(false);
     }
 
+    static Matcher<View> hasAccessibilityLiveRegion(int liveRegionState) {
+        return new TypeSafeMatcher<>() {
+            @Override
+            protected boolean matchesSafely(View view) {
+                return view.getAccessibilityLiveRegion() == liveRegionState;
+            }
+
+            @Override
+            public void describeTo(Description description) {
+                description.appendText("View has live region state " + liveRegionState);
+            }
+        };
+    }
+
+    /** Tests that the User Bypass has an accessibility live region set up correctly. */
+    @Test
+    @MediumTest
+    public void testA11yLiveRegionInUserBypass() throws Exception {
+        setThirdPartyCookieBlocking(CookieControlsMode.BLOCK_THIRD_PARTY);
+        sActivityTestRule.loadUrl(mTestServerRule.getServer().getURL(sSiteDataHtml));
+        // Create cookies.
+        expectHasCookies(false);
+        createCookies();
+        expectHasCookies(true);
+        // Go to cookies subpage.
+        openPageInfo(PageInfoController.NO_HIGHLIGHTED_PERMISSION);
+        enableTrackingProtectionFixedExpiration(
+                /* isModeBUiInCookiesController= */ false, /* days= */ DAYS_UNTIL_EXPIRATION);
+        onView(withId(R.id.page_info_cookies_row)).perform(click());
+        // Check that cookies usage is displayed.
+        onViewWaiting(allOf(withText(containsString("stored data")), isDisplayed()));
+        // Check that the cookie toggle is displayed.
+        onViewWaiting(
+                allOf(
+                        withText(R.string.page_info_tracking_protection_toggle_blocked),
+                        isDisplayed()));
+        // Verify the a11y live region.
+        onView(withText(R.string.page_info_cookies_site_not_working_title))
+                .check(matches(hasAccessibilityLiveRegion(View.ACCESSIBILITY_LIVE_REGION_POLITE)));
+        onView(
+                        withText(
+                                R.string
+                                        .page_info_cookies_site_not_working_description_tracking_protection))
+                .check(matches(hasAccessibilityLiveRegion(View.ACCESSIBILITY_LIVE_REGION_POLITE)));
+        // Click on the toggle for the content to change.
+        onView(withText(R.string.page_info_tracking_protection_toggle_blocked)).perform(click());
+        // Verify the a11y live region.
+        Context context = ApplicationProvider.getApplicationContext();
+        String title =
+                context.getResources()
+                        .getQuantityString(
+                                R.plurals
+                                        .page_info_cookies_blocking_restart_tracking_protection_title,
+                                DAYS_UNTIL_EXPIRATION,
+                                DAYS_UNTIL_EXPIRATION);
+        onView(withText(title))
+                .check(matches(hasAccessibilityLiveRegion(View.ACCESSIBILITY_LIVE_REGION_POLITE)));
+        String description =
+                context.getString(R.string.page_info_cookies_send_feedback_description)
+                        .replaceAll("<link>|</link>", "");
+        onView(withText(description))
+                .check(matches(hasAccessibilityLiveRegion(View.ACCESSIBILITY_LIVE_REGION_POLITE)));
+    }
+
     /** Tests resetting permissions on the permissions page of the PageInfo UI. */
     @Test
     @MediumTest
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/tab/TabArchiveSettingsTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/tab/TabArchiveSettingsTest.java
index 93fba9d..d60aece88 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/tab/TabArchiveSettingsTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/tab/TabArchiveSettingsTest.java
@@ -31,7 +31,7 @@
 
     static final String ARCHIVE_ENABLED_PARAM = "android_tab_declutter_archive_enabled";
     static final String ARCHIVE_TIME_DELTA_PARAM = "android_tab_declutter_archive_time_delta_hours";
-    static final int ARCHIVE_TIME_DELTA_HOURS_DEFAULT = 7 * 24;
+    static final int ARCHIVE_TIME_DELTA_HOURS_DEFAULT = 21 * 24;
     static final String AUTO_DELETE_ENABLED_PARAM = "android_tab_declutter_auto_delete_enabled";
     static final String AUTO_DELETE_TIME_DELTA_PARAM =
             "android_tab_declutter_auto_delete_time_delta_hours";
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index cc5f4b7..bd9922e 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -2486,10 +2486,8 @@
 
   # Platforms that have a network diagnostics dialog. All others fall through
   # to the stub which is not implemented.
-  if (is_chromeos_ash) {
+  if (is_chromeos) {
     sources += [ "net/net_error_diagnostics_dialog_chromeos.cc" ]
-  } else if (is_chromeos_lacros) {
-    sources += [ "net/net_error_diagnostics_dialog_lacros.cc" ]
   } else if (is_win) {
     sources += [ "net/net_error_diagnostics_dialog_win.cc" ]
   } else {
@@ -8301,16 +8299,11 @@
     ]
     if (is_chromeos) {
       sources += [
+        "net/nss_service_chromeos.cc",
         "net/nss_temp_certs_cache_chromeos.cc",
         "net/nss_temp_certs_cache_chromeos.h",
       ]
     }
-    if (is_chromeos_ash) {
-      sources += [ "net/nss_service_chromeos.cc" ]
-    }
-    if (is_chromeos_lacros) {
-      sources += [ "net/nss_service_lacros.cc" ]
-    }
     if (is_linux) {
       sources += [ "net/nss_service_linux.cc" ]
     }
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 7f00e707..a1460126 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -5595,9 +5595,6 @@
      flag_descriptions::kDrawKeyNativeEdgeToEdgeName,
      flag_descriptions::kDrawKeyNativeEdgeToEdgeDescription, kOsAndroid,
      FEATURE_VALUE_TYPE(chrome::android::kDrawKeyNativeEdgeToEdge)},
-    {"draw-native-edge-to-edge", flag_descriptions::kDrawNativeEdgeToEdgeName,
-     flag_descriptions::kDrawNativeEdgeToEdgeDescription, kOsAndroid,
-     FEATURE_VALUE_TYPE(chrome::android::kDrawNativeEdgeToEdge)},
     {"edge-to-edge-bottom-chin", flag_descriptions::kEdgeToEdgeBottomChinName,
      flag_descriptions::kEdgeToEdgeBottomChinDescription, kOsAndroid,
      FEATURE_WITH_PARAMS_VALUE_TYPE(chrome::android::kEdgeToEdgeBottomChin,
diff --git a/chrome/browser/apps/guest_view/web_view_browsertest.cc b/chrome/browser/apps/guest_view/web_view_browsertest.cc
index f99247f..3f3f5a7 100644
--- a/chrome/browser/apps/guest_view/web_view_browsertest.cc
+++ b/chrome/browser/apps/guest_view/web_view_browsertest.cc
@@ -2728,8 +2728,6 @@
 // This tests that in-memory storage partitions are reset on browser restart,
 // but persistent ones maintain state for cookies and HTML5 storage.
 IN_PROC_BROWSER_TEST_P(WebViewTest, PRE_StoragePersistence) {
-  SKIP_FOR_MPARCH();  // TODO(crbug.com/40202416): Enable test for MPArch.
-
   ASSERT_TRUE(StartEmbeddedTestServer());
   // We don't care where the main browser is on this test.
   ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), GURL("about:blank")));
@@ -2743,8 +2741,6 @@
 // This is the post-reset portion of the StoragePersistence test.  See
 // PRE_StoragePersistence for main comment.
 IN_PROC_BROWSER_TEST_P(WebViewTest, StoragePersistence) {
-  SKIP_FOR_MPARCH();  // TODO(crbug.com/40202416): Enable test for MPArch.
-
   ASSERT_TRUE(StartEmbeddedTestServer());
   // We don't care where the main browser is on this test.
   ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), GURL("about:blank")));
@@ -2760,8 +2756,6 @@
 // entries, which the test checks to ensure proper storage isolation is
 // enforced.
 IN_PROC_BROWSER_TEST_P(WebViewTest, DOMStorageIsolation) {
-  SKIP_FOR_MPARCH();  // TODO(crbug.com/40202416): Enable test for MPArch.
-
   ASSERT_TRUE(StartEmbeddedTestServer());
 
   GURL navigate_to_url = embedded_test_server()->GetURL(
@@ -3747,8 +3741,6 @@
 }
 
 IN_PROC_BROWSER_TEST_P(WebViewTest, ClearSessionCookies) {
-  SKIP_FOR_MPARCH();  // TODO(crbug.com/40202416): Enable test for MPArch.
-
   ASSERT_TRUE(StartEmbeddedTestServer());  // For serving guest pages.
   ASSERT_TRUE(RunExtensionTest(
       "platform_apps/web_view/common",
@@ -3757,8 +3749,6 @@
 }
 
 IN_PROC_BROWSER_TEST_P(WebViewTest, ClearPersistentCookies) {
-  SKIP_FOR_MPARCH();  // TODO(crbug.com/40202416): Enable test for MPArch.
-
   ASSERT_TRUE(StartEmbeddedTestServer());  // For serving guest pages.
   ASSERT_TRUE(RunExtensionTest(
       "platform_apps/web_view/common",
@@ -3768,8 +3758,6 @@
 
 // Regression test for https://crbug.com/615429.
 IN_PROC_BROWSER_TEST_P(WebViewTest, ClearDataTwice) {
-  SKIP_FOR_MPARCH();  // TODO(crbug.com/40202416): Enable test for MPArch.
-
   ASSERT_TRUE(StartEmbeddedTestServer());  // For serving guest pages.
   ASSERT_TRUE(RunExtensionTest(
       "platform_apps/web_view/common",
@@ -5095,8 +5083,6 @@
 
 // Tests that a WebView can be navigated to a WebView accessible resource.
 IN_PROC_BROWSER_TEST_P(WebViewTest, NavigateGuestToWebviewAccessibleResource) {
-  SKIP_FOR_MPARCH();  // TODO(crbug.com/40202416): Enable test for MPArch.
-
   TestHelper("testNavigateGuestToWebviewAccessibleResource",
              "web_view/load_webview_accessible_resource", NO_TEST_SERVER);
 
@@ -5143,8 +5129,6 @@
 
 IN_PROC_BROWSER_TEST_P(WebViewTest,
                        CookiesEnabledAfterWebviewAccessibleResource) {
-  SKIP_FOR_MPARCH();  // TODO(crbug.com/40202416): Enable test for MPArch.
-
   TestHelper("testCookiesEnabledAfterWebviewAccessibleResource",
              "web_view/load_webview_accessible_resource", NEEDS_TEST_SERVER);
 }
diff --git a/chrome/browser/ash/accessibility/accessibility_manager.cc b/chrome/browser/ash/accessibility/accessibility_manager.cc
index d6474cf..531d9bb 100644
--- a/chrome/browser/ash/accessibility/accessibility_manager.cc
+++ b/chrome/browser/ash/accessibility/accessibility_manager.cc
@@ -1950,20 +1950,20 @@
 
     base::UmaHistogramBoolean(
         "Accessibility.CrosCursorColor",
-        prefs->GetBoolean(prefs::kAccessibilityCursorColorEnabled));
+        prefs->GetInteger(prefs::kAccessibilityCursorColor) !=
+            static_cast<int>(kDefaultCursorColor));
 
-      bool color_correction_enabled = IsColorCorrectionEnabled();
-      base::UmaHistogramBoolean("Accessibility.CrosColorCorrection",
-                                color_correction_enabled);
-      if (color_correction_enabled) {
-        base::UmaHistogramEnumeration(
-            "Accessibility.CrosColorCorrection.FilterType",
-            static_cast<ColorVisionCorrectionType>(prefs->GetInteger(
-                prefs::kAccessibilityColorVisionCorrectionType)));
-        base::UmaHistogramPercentage(
-            "Accessibility.CrosColorCorrection.FilterAmount",
-            prefs->GetInteger(
-                prefs::kAccessibilityColorVisionCorrectionAmount));
+    bool color_correction_enabled = IsColorCorrectionEnabled();
+    base::UmaHistogramBoolean("Accessibility.CrosColorCorrection",
+                              color_correction_enabled);
+    if (color_correction_enabled) {
+      base::UmaHistogramEnumeration(
+          "Accessibility.CrosColorCorrection.FilterType",
+          static_cast<ColorVisionCorrectionType>(prefs->GetInteger(
+              prefs::kAccessibilityColorVisionCorrectionType)));
+      base::UmaHistogramPercentage(
+          "Accessibility.CrosColorCorrection.FilterAmount",
+          prefs->GetInteger(prefs::kAccessibilityColorVisionCorrectionAmount));
     }
 
     if (::features::IsAccessibilityFlashScreenFeatureEnabled()) {
diff --git a/chrome/browser/ash/accessibility/spoken_feedback_app_list_browsertest.cc b/chrome/browser/ash/accessibility/spoken_feedback_app_list_browsertest.cc
index 5bb64b8..aaf3fae 100644
--- a/chrome/browser/ash/accessibility/spoken_feedback_app_list_browsertest.cc
+++ b/chrome/browser/ash/accessibility/spoken_feedback_app_list_browsertest.cc
@@ -42,15 +42,17 @@
 #include "ui/display/display.h"
 #include "ui/display/manager/display_manager.h"
 #include "ui/events/base_event_utils.h"
+#include "ui/events/event_constants.h"
 #include "ui/events/test/event_generator.h"
 
 namespace ash {
 
 namespace {
 
-void SendKeyPressWithShiftAndControl(ui::KeyboardCode key) {
-  ASSERT_NO_FATAL_FAILURE(ASSERT_TRUE(ui_test_utils::SendKeyPressToWindowSync(
-      nullptr, key, true, true, false, false)));
+void SendKeyPressWithShiftAndControl(ui::test::EventGenerator* generator,
+                                     ui::KeyboardCode key) {
+  const int flags = ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN;
+  generator->PressAndReleaseKeyAndModifierKeys(key, flags);
 }
 
 class TestSearchResult : public ChromeSearchResult {
@@ -677,8 +679,11 @@
   EnableChromeVox();
   const int test_item_index = MoveToFirstTestApp();
 
+  auto* generator_ptr = event_generator();
   // Combine items and create a new folder.
-  sm_.Call([]() { SendKeyPressWithShiftAndControl(ui::VKEY_RIGHT); });
+  sm_.Call([generator_ptr]() {
+    SendKeyPressWithShiftAndControl(generator_ptr, ui::VKEY_RIGHT);
+  });
   sm_.ExpectNextSpeechIsNot("Alert");
   sm_.ExpectSpeech("Folder Unnamed");
   sm_.ExpectSpeech("Expanded");
@@ -690,7 +695,9 @@
   sm_.ExpectSpeech("Button");
 
   // Remove the first item from the folder back to the top level app list.
-  sm_.Call([]() { SendKeyPressWithShiftAndControl(ui::VKEY_LEFT); });
+  sm_.Call([generator_ptr]() {
+    SendKeyPressWithShiftAndControl(generator_ptr, ui::VKEY_LEFT);
+  });
 
   sm_.ExpectSpeech("app 1");
   sm_.ExpectSpeech("Button");
@@ -710,7 +717,10 @@
   MoveToFirstTestApp();
 
   // Combine items and create a new folder.
-  sm_.Call([]() { SendKeyPressWithShiftAndControl(ui::VKEY_RIGHT); });
+  auto* generator_ptr = event_generator();
+  sm_.Call([generator_ptr]() {
+    SendKeyPressWithShiftAndControl(generator_ptr, ui::VKEY_RIGHT);
+  });
   sm_.ExpectNextSpeechIsNot("Alert");
   sm_.ExpectSpeech("Folder Unnamed");
   sm_.ExpectSpeech("Expanded");
@@ -926,9 +936,7 @@
   auto* clock_ptr = &clock;
   ui::SetEventTickClockForTesting(clock_ptr);
 
-  auto* root_window = Shell::Get()->GetPrimaryRootWindow();
-  ui::test::EventGenerator generator(root_window);
-  auto* generator_ptr = &generator;
+  auto* generator_ptr = event_generator();
 
   // Start touch exploration, and go to the third result in the UI (expected to
   // be "app 2").
diff --git a/chrome/browser/ash/accessibility/spoken_feedback_browsertest.h b/chrome/browser/ash/accessibility/spoken_feedback_browsertest.h
index bfbbb8eb..1582eaad 100644
--- a/chrome/browser/ash/accessibility/spoken_feedback_browsertest.h
+++ b/chrome/browser/ash/accessibility/spoken_feedback_browsertest.h
@@ -69,6 +69,8 @@
   void RunJSForChromeVox(const std::string& script);
   void ImportJSModuleForChromeVox(std::string name, std::string path);
 
+  ui::test::EventGenerator* event_generator() { return event_generator_.get(); }
+
   test::SpeechMonitor sm_;
 
  private:
diff --git a/chrome/browser/ash/accessibility/switch_access_browsertest.cc b/chrome/browser/ash/accessibility/switch_access_browsertest.cc
index da8309b..a80825b 100644
--- a/chrome/browser/ash/accessibility/switch_access_browsertest.cc
+++ b/chrome/browser/ash/accessibility/switch_access_browsertest.cc
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 #include "ash/public/cpp/window_tree_host_lookup.h"
+#include "ash/shell.h"
 #include "chrome/browser/ash/accessibility/accessibility_feature_browsertest.h"
 #include "chrome/browser/ash/accessibility/accessibility_manager.h"
 #include "chrome/browser/ash/accessibility/automation_test_utils.h"
@@ -10,12 +11,12 @@
 #include "chrome/browser/ui/browser.h"
 #include "chrome/common/extensions/extension_constants.h"
 #include "chrome/test/base/in_process_browser_test.h"
-#include "chrome/test/base/interactive_test_utils.h"
 #include "chrome/test/base/ui_test_utils.h"
 #include "content/public/test/browser_test.h"
 #include "ui/aura/client/cursor_client.h"
 #include "ui/aura/window_tree_host.h"
 #include "ui/display/screen.h"
+#include "ui/events/test/event_generator.h"
 
 namespace ash {
 
@@ -29,11 +30,12 @@
   void SetUpOnMainThread() override {
     switch_access_test_utils_ = std::make_unique<SwitchAccessTestUtils>(
         AccessibilityManager::Get()->profile());
+    generator_ = std::make_unique<ui::test::EventGenerator>(
+        Shell::Get()->GetPrimaryRootWindow());
   }
 
   void SendVirtualKeyPress(ui::KeyboardCode key) {
-    ASSERT_NO_FATAL_FAILURE(ASSERT_TRUE(ui_test_utils::SendKeyPressToWindowSync(
-        nullptr, key, false, false, false, false)));
+    generator_->PressAndReleaseKey(key);
   }
 
   // Returns cursor client for root window at location (in DIPs) |x| and |y|.
@@ -71,6 +73,7 @@
 
  private:
   std::unique_ptr<SwitchAccessTestUtils> switch_access_test_utils_;
+  std::unique_ptr<ui::test::EventGenerator> generator_;
 };
 
 // Flaky. See https://crbug.com/1224254.
diff --git a/chrome/browser/ash/annotator/untrusted_annotator_ui_config.cc b/chrome/browser/ash/annotator/untrusted_annotator_ui_config.cc
index 0d92597e0..d463e51 100644
--- a/chrome/browser/ash/annotator/untrusted_annotator_ui_config.cc
+++ b/chrome/browser/ash/annotator/untrusted_annotator_ui_config.cc
@@ -5,23 +5,13 @@
 #include "chrome/browser/ash/annotator/untrusted_annotator_ui_config.h"
 
 #include "ash/constants/ash_features.h"
+#include "ash/webui/annotator/untrusted_annotator_ui.h"
 #include "ash/webui/projector_app/public/cpp/projector_app_constants.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/ash/projector/projector_utils.h"
-#include "chrome/common/channel_info.h"
-#include "components/version_info/channel.h"
 #include "content/public/browser/web_ui_data_source.h"
 #include "content/public/common/url_constants.h"
 
-ChromeUntrustedAnnotatorUIDelegate::
-    ChromeUntrustedAnnotatorUIDelegate() = default;
-
-void ChromeUntrustedAnnotatorUIDelegate::PopulateLoadTimeData(
-    content::WebUIDataSource* source) {
-  version_info::Channel channel = chrome::GetChannel();
-  source->AddBoolean("isDevChannel", channel == version_info::Channel::DEV);
-}
-
 UntrustedAnnotatorUIConfig::UntrustedAnnotatorUIConfig()
     : WebUIConfig(content::kChromeUIUntrustedScheme,
                   ash::kChromeUIProjectorAnnotatorHost) {}
@@ -41,6 +31,5 @@
 UntrustedAnnotatorUIConfig::CreateWebUIController(
     content::WebUI* web_ui,
     const GURL& url) {
-  ChromeUntrustedAnnotatorUIDelegate delegate;
-  return std::make_unique<ash::UntrustedAnnotatorUI>(web_ui, &delegate);
+  return std::make_unique<ash::UntrustedAnnotatorUI>(web_ui);
 }
diff --git a/chrome/browser/ash/annotator/untrusted_annotator_ui_config.h b/chrome/browser/ash/annotator/untrusted_annotator_ui_config.h
index b7f4a213..6718033a 100644
--- a/chrome/browser/ash/annotator/untrusted_annotator_ui_config.h
+++ b/chrome/browser/ash/annotator/untrusted_annotator_ui_config.h
@@ -5,30 +5,13 @@
 #ifndef CHROME_BROWSER_ASH_ANNOTATOR_UNTRUSTED_ANNOTATOR_UI_CONFIG_H_
 #define CHROME_BROWSER_ASH_ANNOTATOR_UNTRUSTED_ANNOTATOR_UI_CONFIG_H_
 
-#include "ash/webui/annotator/untrusted_annotator_ui.h"
 #include "content/public/browser/webui_config.h"
 
 namespace content {
-class WebUIDataSource;
 class WebUIController;
 class WebUI;
 }  // namespace content
 
-// Implementation of the chromeos::UntrustedAnnotatorUIDelegate to
-// expose some //chrome functions to //chromeos.
-class ChromeUntrustedAnnotatorUIDelegate
-    : public ash::UntrustedAnnotatorUIDelegate {
- public:
-  ChromeUntrustedAnnotatorUIDelegate();
-  ChromeUntrustedAnnotatorUIDelegate(
-      const ChromeUntrustedAnnotatorUIDelegate&) = delete;
-  ChromeUntrustedAnnotatorUIDelegate& operator=(
-      const ChromeUntrustedAnnotatorUIDelegate&) = delete;
-
-  // ash::UntrustedAnnotatorUIDelegate:
-  void PopulateLoadTimeData(content::WebUIDataSource* source) override;
-};
-
 // A webui config for the chrome-untrusted:// part of Projector annotator.
 class UntrustedAnnotatorUIConfig : public content::WebUIConfig {
  public:
@@ -40,7 +23,6 @@
 
   // content::WebUIConfig:
   bool IsWebUIEnabled(content::BrowserContext* browser_context) override;
-
   std::unique_ptr<content::WebUIController> CreateWebUIController(
       content::WebUI* web_ui,
       const GURL& url) override;
diff --git a/chrome/browser/ash/crosapi/extension_info_private_ash.cc b/chrome/browser/ash/crosapi/extension_info_private_ash.cc
index fb9b98a..c90e26b9 100644
--- a/chrome/browser/ash/crosapi/extension_info_private_ash.cc
+++ b/chrome/browser/ash/crosapi/extension_info_private_ash.cc
@@ -117,9 +117,6 @@
 // Key which corresponds to the Switch Access A11Y property in JS.
 const char kPropertySwitchAccessEnabled[] = "a11ySwitchAccessEnabled";
 
-// Key which corresponds to the cursor color A11Y property in JS.
-const char kPropertyCursorColorEnabled[] = "a11yCursorColorEnabled";
-
 // Key which corresponds to the docked magnifier property in JS.
 const char kPropertyDockedMagnifierEnabled[] = "a11yDockedMagnifierEnabled";
 
@@ -231,7 +228,6 @@
      ash::prefs::kAccessibilitySelectToSpeakEnabled},
     {kPropertySwitchAccessEnabled,
      ash::prefs::kAccessibilitySwitchAccessEnabled},
-    {kPropertyCursorColorEnabled, ash::prefs::kAccessibilityCursorColorEnabled},
     {kPropertyDockedMagnifierEnabled, ash::prefs::kDockedMagnifierEnabled},
     {kPropertySendFunctionsKeys, ash::prefs::kSendFunctionKeys}};
 
diff --git a/chrome/browser/ash/extensions/accessibility_features_apitest.cc b/chrome/browser/ash/extensions/accessibility_features_apitest.cc
index a8a7edc4..e2575dc 100644
--- a/chrome/browser/ash/extensions/accessibility_features_apitest.cc
+++ b/chrome/browser/ash/extensions/accessibility_features_apitest.cc
@@ -135,8 +135,6 @@
       return ash::prefs::kAccessibilitySelectToSpeakEnabled;
     if (feature == "switchAccess")
       return ash::prefs::kAccessibilitySwitchAccessEnabled;
-    if (feature == "cursorColor")
-      return ash::prefs::kAccessibilityCursorColorEnabled;
     if (feature == "dockedMagnifier")
       return ash::prefs::kDockedMagnifierEnabled;
     if (feature == "dictation")
@@ -247,7 +245,6 @@
   // WARNING: Make sure that features which load Chrome extension are not among
   // enabled_features (see |Set| test for the reason).
   std::vector<std::string> enabled_features = {
-      "cursorColor",
       "cursorHighlight",
       "highContrast",
       "largeCursor",
@@ -307,7 +304,6 @@
   std::vector<std::string> disabled_features = {
       "autoclick",
       "caretHighlight",
-      "cursorColor",
       "focusHighlight",
       "screenMagnifier",
       "selectToSpeak",
@@ -345,7 +341,6 @@
   // would induce loading of Chrome extension.
   std::vector<std::string> enabled_features = {
       "caretHighlight",
-      "cursorColor",
       "focusHighlight",
       "stickyKeys",
   };
@@ -391,7 +386,6 @@
   // enabled_features (see |Set| test for the reason).
   std::vector<std::string> enabled_features = {
       "caretHighlight",
-      "cursorColor",
       "focusHighlight",
       "stickyKeys",
   };
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index d73a7a2..f375251 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -4294,8 +4294,9 @@
 #endif
 }
 
-void ChromeContentBrowserClient::OverrideWebkitPrefs(
+void ChromeContentBrowserClient::OverrideWebPreferences(
     WebContents* web_contents,
+    content::SiteInstance& main_frame_site,
     WebPreferences* web_prefs) {
   Profile* profile =
       Profile::FromBrowserContext(web_contents->GetBrowserContext());
@@ -4560,10 +4561,8 @@
 
   UpdateForcedColorsForWebContent(web_prefs, web_contents, GetWebTheme());
 
-  UpdatePreferredColorScheme(
-      web_prefs,
-      web_contents->GetPrimaryMainFrame()->GetSiteInstance()->GetSiteURL(),
-      web_contents, GetWebTheme());
+  UpdatePreferredColorScheme(web_prefs, main_frame_site.GetSiteURL(),
+                             web_contents, GetWebTheme());
 
   web_prefs->translate_service_available = TranslateService::IsAvailable(prefs);
 
@@ -4599,7 +4598,7 @@
 #endif
 
   for (auto& parts : extra_parts_) {
-    parts->OverrideWebkitPrefs(web_contents, web_prefs);
+    parts->OverrideWebPreferences(web_contents, main_frame_site, web_prefs);
   }
 
   web_prefs->prefers_default_scrollbar_styles =
@@ -4608,12 +4607,14 @@
 
 bool ChromeContentBrowserClientParts::OverrideWebPreferencesAfterNavigation(
     WebContents* web_contents,
+    content::SiteInstance& main_frame_site,
     WebPreferences* web_prefs) {
   return false;
 }
 
 bool ChromeContentBrowserClient::OverrideWebPreferencesAfterNavigation(
     WebContents* web_contents,
+    content::SiteInstance& main_frame_site,
     WebPreferences* web_prefs) {
   bool prefs_changed = false;
 
@@ -4642,8 +4643,8 @@
 #endif  // !BUILDFLAG(IS_ANDROID)
 
   for (auto& parts : extra_parts_) {
-    prefs_changed |=
-        parts->OverrideWebPreferencesAfterNavigation(web_contents, web_prefs);
+    prefs_changed |= parts->OverrideWebPreferencesAfterNavigation(
+        web_contents, main_frame_site, web_prefs);
   }
 
   prefs_changed |=
@@ -6652,7 +6653,6 @@
     return false;
 
   return (web_request_api->MayHaveProxies() ||
-          web_request_api->MayHaveWebsocketProxiesForExtensionTelemetry() ||
           web_request_api->IsAvailableToWebViewEmbedderFrame(frame));
 #else
   return false;
diff --git a/chrome/browser/chrome_content_browser_client.h b/chrome/browser/chrome_content_browser_client.h
index 7e866a09..7e7c40da 100644
--- a/chrome/browser/chrome_content_browser_client.h
+++ b/chrome/browser/chrome_content_browser_client.h
@@ -488,10 +488,12 @@
   void MaybeOverrideManifest(content::RenderFrameHost* render_frame_host,
                              blink::mojom::ManifestPtr& manifest) override;
   content::TtsPlatform* GetTtsPlatform() override;
-  void OverrideWebkitPrefs(content::WebContents* web_contents,
-                           blink::web_pref::WebPreferences* prefs) override;
+  void OverrideWebPreferences(content::WebContents* web_contents,
+                              content::SiteInstance& main_frame_site,
+                              blink::web_pref::WebPreferences* prefs) override;
   bool OverrideWebPreferencesAfterNavigation(
       content::WebContents* web_contents,
+      content::SiteInstance& main_frame_site,
       blink::web_pref::WebPreferences* prefs) override;
   void BrowserURLHandlerCreated(content::BrowserURLHandler* handler) override;
   base::FilePath GetDefaultDownloadDirectory() override;
diff --git a/chrome/browser/chrome_content_browser_client_browsertest.cc b/chrome/browser/chrome_content_browser_client_browsertest.cc
index 0b6437ea..e1762f2 100644
--- a/chrome/browser/chrome_content_browser_client_browsertest.cc
+++ b/chrome/browser/chrome_content_browser_client_browsertest.cc
@@ -344,10 +344,12 @@
       web_app_scope_ = web_app_scope;
     }
 
-    void OverrideWebkitPrefs(
+    void OverrideWebPreferences(
         content::WebContents* web_contents,
+        content::SiteInstance& main_frame_site,
         blink::web_pref::WebPreferences* web_prefs) override {
-      ChromeContentBrowserClient::OverrideWebkitPrefs(web_contents, web_prefs);
+      ChromeContentBrowserClient::OverrideWebPreferences(
+          web_contents, main_frame_site, web_prefs);
 
       web_prefs->web_app_scope = web_app_scope_;
     }
diff --git a/chrome/browser/chrome_content_browser_client_parts.h b/chrome/browser/chrome_content_browser_client_parts.h
index 5813749..b0efffd 100644
--- a/chrome/browser/chrome_content_browser_client_parts.h
+++ b/chrome/browser/chrome_content_browser_client_parts.h
@@ -55,13 +55,15 @@
   // that their modifications are mututally exclusive.
   // This is called at startup, and when the user changes their webkit
   // preferences.
-  virtual void OverrideWebkitPrefs(content::WebContents* web_contents,
-                                   blink::web_pref::WebPreferences* web_prefs) {
-  }
+  virtual void OverrideWebPreferences(
+      content::WebContents* web_contents,
+      content::SiteInstance& main_frame_site,
+      blink::web_pref::WebPreferences* web_prefs) {}
   // This is called after each navigation. Return |true| if any changes were
   // made. A response value of |true| will result in IPC to the renderer.
   virtual bool OverrideWebPreferencesAfterNavigation(
       content::WebContents* web_contents,
+      content::SiteInstance& main_frame_site,
       blink::web_pref::WebPreferences* web_prefs);
 
   virtual void BrowserURLHandlerCreated(content::BrowserURLHandler* handler) {}
diff --git a/chrome/browser/chromeos/extensions/controlled_pref_mapping.h b/chrome/browser/chromeos/extensions/controlled_pref_mapping.h
index a238b93..dc1bdbf 100644
--- a/chrome/browser/chromeos/extensions/controlled_pref_mapping.h
+++ b/chrome/browser/chromeos/extensions/controlled_pref_mapping.h
@@ -31,8 +31,6 @@
     ash::prefs::kAccessibilityAutoclickEnabled;
 inline constexpr const char* kAccessibilityCaretHighlightEnabled =
     ash::prefs::kAccessibilityCaretHighlightEnabled;
-inline constexpr const char* kAccessibilityCursorColorEnabled =
-    ash::prefs::kAccessibilityCursorColorEnabled;
 inline constexpr const char* kAccessibilityCursorHighlightEnabled =
     ash::prefs::kAccessibilityCursorHighlightEnabled;
 inline constexpr const char* kAccessibilityDictationEnabled =
@@ -62,8 +60,6 @@
     ::prefs::kLacrosAccessibilityAutoclickEnabled;
 inline constexpr const char* kAccessibilityCaretHighlightEnabled =
     ::prefs::kLacrosAccessibilityCaretHighlightEnabled;
-inline constexpr const char* kAccessibilityCursorColorEnabled =
-    ::prefs::kLacrosAccessibilityCursorColorEnabled;
 inline constexpr const char* kAccessibilityCursorHighlightEnabled =
     ::prefs::kLacrosAccessibilityCursorHighlightEnabled;
 inline constexpr const char* kAccessibilityDictationEnabled =
diff --git a/chrome/browser/chromeos/extensions/info_private/info_private_apitest.cc b/chrome/browser/chromeos/extensions/info_private/info_private_apitest.cc
index c82b9d9..383f5d2d 100644
--- a/chrome/browser/chromeos/extensions/info_private/info_private_apitest.cc
+++ b/chrome/browser/chromeos/extensions/info_private/info_private_apitest.cc
@@ -65,7 +65,6 @@
   ASSERT_FALSE(
       prefs->GetBoolean(ash::prefs::kAccessibilityHighContrastEnabled));
   ASSERT_FALSE(prefs->GetBoolean(ash::prefs::kAccessibilityAutoclickEnabled));
-  ASSERT_FALSE(prefs->GetBoolean(ash::prefs::kAccessibilityCursorColorEnabled));
 
   ASSERT_FALSE(
       profile()->GetPrefs()->GetBoolean(ash::prefs::kSendFunctionKeys));
@@ -81,7 +80,6 @@
       prefs->GetBoolean(ash::prefs::kAccessibilitySpokenFeedbackEnabled));
   ASSERT_TRUE(prefs->GetBoolean(ash::prefs::kAccessibilityHighContrastEnabled));
   ASSERT_TRUE(prefs->GetBoolean(ash::prefs::kAccessibilityAutoclickEnabled));
-  ASSERT_TRUE(prefs->GetBoolean(ash::prefs::kAccessibilityCursorColorEnabled));
 
   ASSERT_TRUE(prefs->GetBoolean(ash::prefs::kSendFunctionKeys));
 }
diff --git a/chrome/browser/chromeos/tablet_mode/chrome_content_browser_client_tablet_mode_part.cc b/chrome/browser/chromeos/tablet_mode/chrome_content_browser_client_tablet_mode_part.cc
index 1483d1cd..97c14269 100644
--- a/chrome/browser/chromeos/tablet_mode/chrome_content_browser_client_tablet_mode_part.cc
+++ b/chrome/browser/chromeos/tablet_mode/chrome_content_browser_client_tablet_mode_part.cc
@@ -56,7 +56,7 @@
   return url.SchemeIs(content::kChromeUIScheme);
 }
 
-void OverrideWebkitPrefsForTabletMode(
+void OverrideWebPreferencesForTabletMode(
     content::WebContents* contents,
     blink::web_pref::WebPreferences* web_prefs) {
   // Enable some mobile-like behaviors when in tablet mode on Chrome OS.
@@ -126,15 +126,16 @@
 ChromeContentBrowserClientTabletModePart::
     ~ChromeContentBrowserClientTabletModePart() = default;
 
-void ChromeContentBrowserClientTabletModePart::OverrideWebkitPrefs(
+void ChromeContentBrowserClientTabletModePart::OverrideWebPreferences(
     content::WebContents* web_contents,
+    content::SiteInstance& main_frame_site,
     blink::web_pref::WebPreferences* web_prefs) {
   // A webcontents may not be the delegate of the render view host such as in
   // the case of interstitial pages.
   if (!web_contents)
     return;
 
-  OverrideWebkitPrefsForTabletMode(web_contents, web_prefs);
+  OverrideWebPreferencesForTabletMode(web_contents, web_prefs);
 #if BUILDFLAG(IS_CHROMEOS_ASH)
   OverrideFontSize(web_contents, web_prefs);
 #endif
diff --git a/chrome/browser/chromeos/tablet_mode/chrome_content_browser_client_tablet_mode_part.h b/chrome/browser/chromeos/tablet_mode/chrome_content_browser_client_tablet_mode_part.h
index 62f8804..891911d 100644
--- a/chrome/browser/chromeos/tablet_mode/chrome_content_browser_client_tablet_mode_part.h
+++ b/chrome/browser/chromeos/tablet_mode/chrome_content_browser_client_tablet_mode_part.h
@@ -22,8 +22,10 @@
   ~ChromeContentBrowserClientTabletModePart() override;
 
   // ChromeContentBrowserClientParts:
-  void OverrideWebkitPrefs(content::WebContents* web_contents,
-                           blink::web_pref::WebPreferences* web_prefs) override;
+  void OverrideWebPreferences(
+      content::WebContents* web_contents,
+      content::SiteInstance& main_frame_site,
+      blink::web_pref::WebPreferences* web_prefs) override;
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
   static bool UseDefaultFontSizeForTest(const GURL& url);
diff --git a/chrome/browser/chromeos/tablet_mode/tablet_mode_page_behavior.h b/chrome/browser/chromeos/tablet_mode/tablet_mode_page_behavior.h
index ff32bb9f..9452cd9 100644
--- a/chrome/browser/chromeos/tablet_mode/tablet_mode_page_behavior.h
+++ b/chrome/browser/chromeos/tablet_mode/tablet_mode_page_behavior.h
@@ -48,7 +48,7 @@
   // We only override the WebKit preferences of webcontents that belong to
   // tabstrips in browsers. When a webcontents is newly created, its WebKit
   // preferences are refreshed *before* it's added to any tabstrip, hence
-  // `ChromeContentBrowserClientAshPart::OverrideWebkitPrefs()` wouldn't be
+  // `ChromeContentBrowserClientAshPart::OverrideWebPreferences()` wouldn't be
   // able to override the mobile-like behavior prefs we want. Therefore, we need
   // to observe webcontents being added to the tabstrips in order to trigger
   // a refresh of its WebKit prefs.
diff --git a/chrome/browser/enterprise/connectors/connectors_manager.cc b/chrome/browser/enterprise/connectors/connectors_manager.cc
index 6c2b111b..7b6b505f 100644
--- a/chrome/browser/enterprise/connectors/connectors_manager.cc
+++ b/chrome/browser/enterprise/connectors/connectors_manager.cc
@@ -112,7 +112,7 @@
   // While multiple services can be set by the connector policies, only the
   // first one is considered for now.
   return analysis_connector_settings_[connector][0].GetAnalysisSettings(
-      url, GetDataRegion());
+      url, GetDataRegion(connector));
 }
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
@@ -136,7 +136,7 @@
   // While multiple services can be set by the connector policies, only the
   // first one is considered for now.
   return analysis_connector_settings_[connector][0].GetAnalysisSettings(
-      context, source_url, destination_url, GetDataRegion());
+      context, source_url, destination_url, GetDataRegion(connector));
 }
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
@@ -315,16 +315,26 @@
   return {};
 }
 
-DataRegion ConnectorsManager::GetDataRegion() const {
+DataRegion ConnectorsManager::GetDataRegion(AnalysisConnector connector) const {
 #if BUILDFLAG(IS_ANDROID)
   return DataRegion::NO_PREFERENCE;
 #else
-  bool apply_data_region =
-      prefs()->HasPrefPath(prefs::kChromeDataRegionSetting) &&
-      base::FeatureList::IsEnabled(safe_browsing::kDlpRegionalizedEndpoints);
-  return apply_data_region ? ChromeDataRegionSettingToEnum(prefs()->GetInteger(
-                                 prefs::kChromeDataRegionSetting))
-                           : DataRegion::NO_PREFERENCE;
+  // Connector's policy scope determines the DRZ policy scope to use.
+  policy::PolicyScope scope = static_cast<policy::PolicyScope>(
+      prefs()->GetInteger(AnalysisConnectorScopePref(connector)));
+
+  const PrefService* pref_service =
+      (scope == policy::PolicyScope::POLICY_SCOPE_MACHINE)
+          ? g_browser_process->local_state()
+          : prefs();
+
+  if (!pref_service ||
+      !pref_service->HasPrefPath(prefs::kChromeDataRegionSetting)) {
+    return DataRegion::NO_PREFERENCE;
+  }
+
+  return ChromeDataRegionSettingToEnum(
+      pref_service->GetInteger(prefs::kChromeDataRegionSetting));
 #endif
 }
 
diff --git a/chrome/browser/enterprise/connectors/connectors_manager.h b/chrome/browser/enterprise/connectors/connectors_manager.h
index 78980da..75f51f3 100644
--- a/chrome/browser/enterprise/connectors/connectors_manager.h
+++ b/chrome/browser/enterprise/connectors/connectors_manager.h
@@ -115,7 +115,7 @@
   void CacheAnalysisConnectorPolicy(AnalysisConnector connector) const;
 
   // Get data location region from policy.
-  DataRegion GetDataRegion() const;
+  DataRegion GetDataRegion(AnalysisConnector connector) const;
 
 #if BUILDFLAG(ENTERPRISE_LOCAL_CONTENT_ANALYSIS)
   // Close connection with local agent if all the relevant connectors are turned
diff --git a/chrome/browser/enterprise/connectors/connectors_manager_unittest.cc b/chrome/browser/enterprise/connectors/connectors_manager_unittest.cc
index a084b5b2..4c69b31 100644
--- a/chrome/browser/enterprise/connectors/connectors_manager_unittest.cc
+++ b/chrome/browser/enterprise/connectors/connectors_manager_unittest.cc
@@ -26,6 +26,7 @@
 #include "components/enterprise/buildflags/buildflags.h"
 #include "components/enterprise/connectors/core/common.h"
 #include "components/enterprise/connectors/core/connectors_prefs.h"
+#include "components/policy/core/common/policy_types.h"
 #include "components/prefs/pref_service.h"
 #include "components/prefs/scoped_user_pref_update.h"
 #include "components/safe_browsing/core/common/features.h"
@@ -51,6 +52,9 @@
     AnalysisConnector::FILE_DOWNLOADED, AnalysisConnector::FILE_ATTACHED,
     AnalysisConnector::BULK_DATA_ENTRY, AnalysisConnector::PRINT};
 
+constexpr DataRegion kAllDataRegions[] = {
+    DataRegion::NO_PREFERENCE, DataRegion::UNITED_STATES, DataRegion::EUROPE};
+
 constexpr char kEmptySettingsPref[] = "[]";
 
 constexpr char kNormalCloudAnalysisSettingsPref[] = R"([
@@ -924,26 +928,41 @@
 #if !BUILDFLAG(IS_ANDROID)
 class ConnectorsManagerDataRegionTest
     : public ConnectorsManagerTest,
-      public testing::WithParamInterface<
-          std::tuple<AnalysisConnector, DataRegion>> {
+      public testing::WithParamInterface<std::tuple<AnalysisConnector,
+                                                    DataRegion,
+                                                    DataRegion,
+                                                    policy::PolicyScope>> {
  public:
-  ConnectorsManagerDataRegionTest() {
-    scoped_feature_list_.InitAndEnableFeature(
-        safe_browsing::kDlpRegionalizedEndpoints);
-  }
+  ConnectorsManagerDataRegionTest() = default;
+
   AnalysisConnector connector() const { return std::get<0>(GetParam()); }
 
-  DataRegion data_region() const { return std::get<1>(GetParam()); }
+  DataRegion user_data_region() const { return std::get<1>(GetParam()); }
+
+  DataRegion machine_data_region() const { return std::get<2>(GetParam()); }
+
+  policy::PolicyScope policy_scope() const { return std::get<3>(GetParam()); }
 
   const char* pref() const { return AnalysisConnectorPref(connector()); }
 
- private:
-  base::test::ScopedFeatureList scoped_feature_list_;
+ protected:
+  void SetUp() override {
+    ConnectorsManagerTest::SetUp();
+
+    // Set up the data region setting in both local state and profile prefs.
+    g_browser_process->local_state()->SetInteger(
+        prefs::kChromeDataRegionSetting,
+        static_cast<int>(machine_data_region()));
+    pref_service()->SetInteger(prefs::kChromeDataRegionSetting,
+                               static_cast<int>(user_data_region()));
+
+    // Set up connector scope.
+    pref_service()->SetInteger(AnalysisConnectorScopePref(connector()),
+                               policy_scope());
+  }
 };
 
 TEST_P(ConnectorsManagerDataRegionTest, RegionalizedEndpoint) {
-  pref_service()->SetInteger(prefs::kChromeDataRegionSetting,
-                             static_cast<int>(data_region()));
   ConnectorsManager manager(pref_service(), GetServiceProviderConfig());
   ScopedConnectorPref scoped_pref(pref_service(), pref(),
                                   kNormalCloudAnalysisSettingsPref);
@@ -952,9 +971,10 @@
   auto settings_from_manager =
       manager.GetAnalysisSettings(GURL(kOnlyDlpUrl), connector());
   GURL expected_analysis_url =
-      GURL(GetServiceProviderConfig()
-               ->at("google")
-               .analysis->region_urls[static_cast<size_t>(data_region())]);
+      GURL(GetServiceProviderConfig()->at("google").analysis->region_urls
+               [static_cast<size_t>(policy_scope() == policy::POLICY_SCOPE_USER
+                                        ? user_data_region()
+                                        : machine_data_region())]);
   EXPECT_TRUE(settings_from_manager.has_value());
   if (settings_from_manager.has_value()) {
     EXPECT_EQ(
@@ -966,9 +986,11 @@
 INSTANTIATE_TEST_SUITE_P(
     ConnectorsManagerDataRegionTest,
     ConnectorsManagerDataRegionTest,
-    testing::Combine(testing::ValuesIn(kAllAnalysisConnectors),
-                     testing::Values(DataRegion::NO_PREFERENCE,
-                                     DataRegion::UNITED_STATES,
-                                     DataRegion::EUROPE)));
+    testing::Combine(
+        testing::ValuesIn(kAllAnalysisConnectors),
+        testing::ValuesIn(kAllDataRegions),
+        testing::ValuesIn(kAllDataRegions),
+        testing::Values(policy::PolicyScope::POLICY_SCOPE_USER,
+                        policy::PolicyScope::POLICY_SCOPE_MACHINE)));
 #endif  // !BUILDFLAG(IS_ANDROID)
 }  // namespace enterprise_connectors
diff --git a/chrome/browser/extensions/api/settings_private/prefs_util.cc b/chrome/browser/extensions/api/settings_private/prefs_util.cc
index 4a38c37d..73701eb 100644
--- a/chrome/browser/extensions/api/settings_private/prefs_util.cc
+++ b/chrome/browser/extensions/api/settings_private/prefs_util.cc
@@ -1161,8 +1161,6 @@
       settings_api::PrefType::kBoolean;
   (*s_allowlist)[chromeos::prefs::kAccessibilityCaretHighlightEnabled] =
       settings_api::PrefType::kBoolean;
-  (*s_allowlist)[chromeos::prefs::kAccessibilityCursorColorEnabled] =
-      settings_api::PrefType::kBoolean;
   (*s_allowlist)[chromeos::prefs::kAccessibilityCursorHighlightEnabled] =
       settings_api::PrefType::kBoolean;
   (*s_allowlist)[chromeos::prefs::kAccessibilityDictationEnabled] =
diff --git a/chrome/browser/extensions/chrome_content_browser_client_extensions_part.cc b/chrome/browser/extensions/chrome_content_browser_client_extensions_part.cc
index 3b994623..eb84f99d 100644
--- a/chrome/browser/extensions/chrome_content_browser_client_extensions_part.cc
+++ b/chrome/browser/extensions/chrome_content_browser_client_extensions_part.cc
@@ -817,8 +817,10 @@
 }
 
 bool ChromeContentBrowserClientExtensionsPart::
-    OverrideWebPreferencesAfterNavigation(WebContents* web_contents,
-                                          WebPreferences* web_prefs) {
+    OverrideWebPreferencesAfterNavigation(
+        WebContents* web_contents,
+        content::SiteInstance& main_frame_site,
+        WebPreferences* web_prefs) {
   const ExtensionRegistry* registry =
       ExtensionRegistry::Get(web_contents->GetBrowserContext());
   if (!registry)
@@ -834,10 +836,9 @@
   // `extension` below, they are not unset when navigating a tab from an
   // extension page to a regular web page. We should clear extension settings in
   // this case.
-  const GURL& site_url =
-      web_contents->GetPrimaryMainFrame()->GetSiteInstance()->GetSiteURL();
-  if (!site_url.SchemeIs(kExtensionScheme))
+  if (!main_frame_site.GetSiteURL().SchemeIs(kExtensionScheme)) {
     return false;
+  }
 
 #if BUILDFLAG(ENABLE_GUEST_VIEW)
   // If a webview navigates to a webview accessible resource, extension
@@ -846,25 +847,25 @@
   // after a navigation, we can remove this case so that extension settings can
   // apply to webview accessible resources without impacting web pages
   // subsequently loaded in the webview.
-  // TODO(crbug.com/40202416): Handle web preferences for MPArch based guests.
-  if (!base::FeatureList::IsEnabled(features::kGuestViewMPArch) &&
-      WebViewGuest::FromWebContents(web_contents)) {
+  if (main_frame_site.IsGuest()) {
     return false;
   }
 #endif  // BUILDFLAG(ENABLE_GUEST_VIEW)
 
 #if BUILDFLAG(ENABLE_EXTENSIONS)
-  const Extension* extension =
-      registry->enabled_extensions().GetByID(site_url.host());
+  const Extension* extension = registry->enabled_extensions().GetByID(
+      main_frame_site.GetSiteURL().host());
   extension_webkit_preferences::SetPreferences(extension, web_prefs);
 #endif
   return true;
 }
 
-void ChromeContentBrowserClientExtensionsPart::OverrideWebkitPrefs(
+void ChromeContentBrowserClientExtensionsPart::OverrideWebPreferences(
     WebContents* web_contents,
+    content::SiteInstance& main_frame_site,
     WebPreferences* web_prefs) {
-  OverrideWebPreferencesAfterNavigation(web_contents, web_prefs);
+  OverrideWebPreferencesAfterNavigation(web_contents, main_frame_site,
+                                        web_prefs);
 }
 
 void ChromeContentBrowserClientExtensionsPart::BrowserURLHandlerCreated(
diff --git a/chrome/browser/extensions/chrome_content_browser_client_extensions_part.h b/chrome/browser/extensions/chrome_content_browser_client_extensions_part.h
index 85a19cc..9d993f3f 100644
--- a/chrome/browser/extensions/chrome_content_browser_client_extensions_part.h
+++ b/chrome/browser/extensions/chrome_content_browser_client_extensions_part.h
@@ -133,10 +133,13 @@
   // ChromeContentBrowserClientParts:
   void SiteInstanceGotProcessAndSite(
       content::SiteInstance* site_instance) override;
-  void OverrideWebkitPrefs(content::WebContents* web_contents,
-                           blink::web_pref::WebPreferences* web_prefs) override;
+  void OverrideWebPreferences(
+      content::WebContents* web_contents,
+      content::SiteInstance& main_frame_site,
+      blink::web_pref::WebPreferences* web_prefs) override;
   bool OverrideWebPreferencesAfterNavigation(
       content::WebContents* web_contents,
+      content::SiteInstance& main_frame_site,
       blink::web_pref::WebPreferences* web_prefs) override;
   void BrowserURLHandlerCreated(content::BrowserURLHandler* handler) override;
   void GetAdditionalAllowedSchemesForFileSystem(
diff --git a/chrome/browser/extensions/chrome_extensions_browser_client.cc b/chrome/browser/extensions/chrome_extensions_browser_client.cc
index d959142..c7a441b 100644
--- a/chrome/browser/extensions/chrome_extensions_browser_client.cc
+++ b/chrome/browser/extensions/chrome_extensions_browser_client.cc
@@ -84,7 +84,6 @@
 #include "components/embedder_support/user_agent_utils.h"
 #include "components/privacy_sandbox/privacy_sandbox_prefs.h"
 #include "components/proxy_config/proxy_config_pref_names.h"
-#include "components/safe_browsing/core/common/features.h"
 #include "components/sessions/content/session_tab_helper.h"
 #include "components/update_client/update_client.h"
 #include "components/version_info/version_info.h"
@@ -839,38 +838,6 @@
   telemetry_service->AddSignal(std::move(signal));
 }
 
-void ChromeExtensionsBrowserClient::NotifyExtensionRemoteHostContacted(
-    content::BrowserContext* context,
-    const ExtensionId& extension_id,
-    const GURL& url) const {
-  // Collect only if new interception feature is disabled to avoid duplicates.
-  if (base::FeatureList::IsEnabled(
-          safe_browsing::
-              kExtensionTelemetryInterceptRemoteHostsContactedInRenderer)) {
-    return;
-  }
-
-  safe_browsing::RemoteHostInfo::ProtocolType protocol =
-      safe_browsing::RemoteHostInfo::UNSPECIFIED;
-  if (url.SchemeIsHTTPOrHTTPS()) {
-    protocol = safe_browsing::RemoteHostInfo::HTTP_HTTPS;
-  } else if (url.SchemeIsWSOrWSS()) {
-    protocol = safe_browsing::RemoteHostInfo::WEBSOCKET;
-  } else {
-    return;
-  }
-  auto* telemetry_service =
-      safe_browsing::ExtensionTelemetryServiceFactory::GetForProfile(
-          Profile::FromBrowserContext(context));
-  if (!telemetry_service || !telemetry_service->enabled()) {
-    return;
-  }
-  auto remote_host_signal =
-      std::make_unique<safe_browsing::RemoteHostContactedSignal>(extension_id,
-                                                                 url, protocol);
-  telemetry_service->AddSignal(std::move(remote_host_signal));
-}
-
 // static
 void ChromeExtensionsBrowserClient::set_did_chrome_update_for_testing(
     bool did_update) {
diff --git a/chrome/browser/extensions/chrome_extensions_browser_client.h b/chrome/browser/extensions/chrome_extensions_browser_client.h
index 1f76104..7310bee 100644
--- a/chrome/browser/extensions/chrome_extensions_browser_client.h
+++ b/chrome/browser/extensions/chrome_extensions_browser_client.h
@@ -206,9 +206,6 @@
       const ExtensionId& extension_id,
       const GURL& request_url,
       const GURL& redirect_url) const override;
-  void NotifyExtensionRemoteHostContacted(content::BrowserContext* context,
-                                          const ExtensionId& extension_id,
-                                          const GURL& url) const override;
   static void set_did_chrome_update_for_testing(bool did_update);
   bool IsUsbDeviceAllowedByPolicy(content::BrowserContext* context,
                                   const ExtensionId& extension_id,
diff --git a/chrome/browser/extensions/pref_mapping.cc b/chrome/browser/extensions/pref_mapping.cc
index a38b2158..584b347d 100644
--- a/chrome/browser/extensions/pref_mapping.cc
+++ b/chrome/browser/extensions/pref_mapping.cc
@@ -109,9 +109,6 @@
     {"caretHighlight", chromeos::prefs::kAccessibilityCaretHighlightEnabled,
      APIPermissionID::kAccessibilityFeaturesRead,
      APIPermissionID::kAccessibilityFeaturesModify},
-    {"cursorColor", chromeos::prefs::kAccessibilityCursorColorEnabled,
-     APIPermissionID::kAccessibilityFeaturesRead,
-     APIPermissionID::kAccessibilityFeaturesModify},
     {"cursorHighlight", chromeos::prefs::kAccessibilityCursorHighlightEnabled,
      APIPermissionID::kAccessibilityFeaturesRead,
      APIPermissionID::kAccessibilityFeaturesModify},
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index 55ed202..d06f8cf6 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -1117,7 +1117,7 @@
   {
     "name": "boundary-event-dispatch-tracks-node-removal",
     "owners": [ "mustaq@chromium.org", "blink-interactions-team@google.com" ],
-    "expiry_milestone": 134
+    "expiry_milestone": 140
   },
   {
     "name": "browsing-data-model-clank",
@@ -2154,11 +2154,6 @@
     "expiry_milestone": 142
   },
   {
-    "name": "draw-native-edge-to-edge",
-    "owners": ["twellington@chromium.org", "edge-to-edge@chromium.org"],
-    "expiry_milestone": 135
-  },
-  {
     "name": "drive-fs-mirroring",
     "owners": [ "wenbojie@chromium.org", "fdegros@chromium.org", "simmonsjosh@google.com"],
     "expiry_milestone": 133
@@ -5485,7 +5480,7 @@
   {
       "name": "ipp-first-setup-for-usb-printers",
       "owners": [ "pawliczek@chromium.org", "project-bolton@google.com" ],
-      "expiry_milestone": 133
+      "expiry_milestone": 140
   },
   {
     "name": "isolate-origins",
@@ -6826,12 +6821,12 @@
   {
     "name": "pdf-cr23",
     "owners": [ "andyphan@chromium.org", "//pdf/OWNERS" ],
-    "expiry_milestone": 134
+    "expiry_milestone": 136
   },
   {
     "name": "pdf-ink2",
     "owners": [ "andyphan@chromium.org", "awscreen@chromium.org", "thestig@chromium.org" ],
-    "expiry_milestone": 134
+    "expiry_milestone": 140
   },
   {
     "name": "pdf-oopif",
@@ -7124,7 +7119,7 @@
       "chrstne@google.com",
       "koilos@google.com"
     ],
-    "expiry_milestone": 134
+    "expiry_milestone": 135
   },
   {
     "name": "private-network-access-ignore-navigation-errors",
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index e3e67a2..71f22d54 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -4484,11 +4484,6 @@
     "Enables the Android feature Edge-to-Edge and forces a draw ToEdge on "
     "select native pages.";
 
-const char kDrawNativeEdgeToEdgeName[] = "DrawNativeEdgeToEdge";
-const char kDrawNativeEdgeToEdgeDescription[] =
-    "Enables the Android feature Edge-to-Edge and forces a draw ToEdge on all "
-    "native pages.";
-
 const char kEdgeToEdgeBottomChinName[] = "EdgeToEdgeBottomChin";
 const char kEdgeToEdgeBottomChinDescription[] =
     "Enables the scrollable bottom chin for an intermediate Edge-to-Edge "
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index 5d186545..7d36e01 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -2610,9 +2610,6 @@
 extern const char kDrawKeyNativeEdgeToEdgeName[];
 extern const char kDrawKeyNativeEdgeToEdgeDescription[];
 
-extern const char kDrawNativeEdgeToEdgeName[];
-extern const char kDrawNativeEdgeToEdgeDescription[];
-
 extern const char kDynamicSafeAreaInsetsName[];
 extern const char kDynamicSafeAreaInsetsDescription[];
 
diff --git a/chrome/browser/flags/android/chrome_feature_list.cc b/chrome/browser/flags/android/chrome_feature_list.cc
index 184ba5b0..582a6d9 100644
--- a/chrome/browser/flags/android/chrome_feature_list.cc
+++ b/chrome/browser/flags/android/chrome_feature_list.cc
@@ -257,7 +257,6 @@
     &kDelayTempStripRemoval,
     &kDeviceAuthenticatorAndroidx,
     &kDrawKeyNativeEdgeToEdge,
-    &kDrawNativeEdgeToEdge,
     &kEdgeToEdgeBottomChin,
     &kEdgeToEdgeEverywhere,
     &kEdgeToEdgeSafeAreaConstraint,
@@ -503,7 +502,7 @@
 
 BASE_FEATURE(kAndroidTabDeclutter,
              "AndroidTabDeclutter",
-             base::FEATURE_DISABLED_BY_DEFAULT);
+             base::FEATURE_ENABLED_BY_DEFAULT);
 
 BASE_FEATURE(kAndroidTabDeclutterArchiveAllButActiveTab,
              "AndroidTabDeclutterArchiveAllButActiveTab",
@@ -763,10 +762,6 @@
              "DrawKeyNativeEdgeToEdge",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
-BASE_FEATURE(kDrawNativeEdgeToEdge,
-             "DrawNativeEdgeToEdge",
-             base::FEATURE_DISABLED_BY_DEFAULT);
-
 BASE_FEATURE(kEdgeToEdgeBottomChin,
              "EdgeToEdgeBottomChin",
              base::FEATURE_DISABLED_BY_DEFAULT);
diff --git a/chrome/browser/flags/android/chrome_feature_list.h b/chrome/browser/flags/android/chrome_feature_list.h
index 6d073a2..24a2c046 100644
--- a/chrome/browser/flags/android/chrome_feature_list.h
+++ b/chrome/browser/flags/android/chrome_feature_list.h
@@ -97,7 +97,6 @@
 BASE_DECLARE_FEATURE(kDisableInstanceLimit);
 BASE_DECLARE_FEATURE(kDontPrefetchLibraries);
 BASE_DECLARE_FEATURE(kDrawKeyNativeEdgeToEdge);
-BASE_DECLARE_FEATURE(kDrawNativeEdgeToEdge);
 BASE_DECLARE_FEATURE(kEdgeToEdgeBottomChin);
 BASE_DECLARE_FEATURE(kEdgeToEdgeEverywhere);
 BASE_DECLARE_FEATURE(kEdgeToEdgeWebOptIn);
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
index ba38cf7..b8f8caa5 100644
--- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
+++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
@@ -319,7 +319,6 @@
     public static final String DOWNLOADS_MIGRATE_TO_JOBS_API = "DownloadsMigrateToJobsAPI";
     public static final String DRAW_CUTOUT_EDGE_TO_EDGE = "DrawCutoutEdgeToEdge";
     public static final String DRAW_KEY_NATIVE_EDGE_TO_EDGE = "DrawKeyNativeEdgeToEdge";
-    public static final String DRAW_NATIVE_EDGE_TO_EDGE = "DrawNativeEdgeToEdge";
     public static final String DYNAMIC_SAFE_AREA_INSETS = "DynamicSafeAreaInsets";
     public static final String EDGE_TO_EDGE_BOTTOM_CHIN = "EdgeToEdgeBottomChin";
     public static final String EDGE_TO_EDGE_EVERYWHERE = "EdgeToEdgeEverywhere";
@@ -669,8 +668,6 @@
                     DRAW_KEY_NATIVE_EDGE_TO_EDGE,
                     /* defaultValue= */ false,
                     /* defaultValueInTests= */ true);
-    public static final CachedFlag sDrawNativeEdgeToEdge =
-            newCachedFlag(DRAW_NATIVE_EDGE_TO_EDGE, false);
     public static final CachedFlag sEdgeToEdgeBottomChin =
             newCachedFlag(
                     EDGE_TO_EDGE_BOTTOM_CHIN,
@@ -857,7 +854,6 @@
                     sDisableInstanceLimit,
                     sDownloadsMigrateToJobsAPI,
                     sDrawKeyNativeEdgeToEdge,
-                    sDrawNativeEdgeToEdge,
                     sEdgeToEdgeBottomChin,
                     sEdgeToEdgeEverywhere,
                     sEdgeToEdgeWebOptIn,
@@ -934,7 +930,7 @@
     public static final MutableFlagWithSafeDefault sAndroidBookmarkBar =
             newMutableFlagWithSafeDefault(ANDROID_BOOKMARK_BAR, false);
     public static final MutableFlagWithSafeDefault sAndroidTabDeclutter =
-            newMutableFlagWithSafeDefault(ANDROID_TAB_DECLUTTER, false);
+            newMutableFlagWithSafeDefault(ANDROID_TAB_DECLUTTER, true);
     public static final MutableFlagWithSafeDefault sAndroidTabDeclutterArchiveAllButActiveTab =
             newMutableFlagWithSafeDefault(ANDROID_TAB_DECLUTTER_ARCHIVE_ALL_BUT_ACTIVE, false);
     public static final MutableFlagWithSafeDefault sAndroidTabDeclutterArchiveDuplicateTabs =
@@ -1358,7 +1354,7 @@
             sAndroidTabDeclutter.newBooleanParam("android_tab_declutter_archive_enabled", true);
     public static final MutableIntParamWithSafeDefault sAndroidTabDeclutterArchiveTimeDeltaHours =
             sAndroidTabDeclutter.newIntParam(
-                    "android_tab_declutter_archive_time_delta_hours", 7 * 24);
+                    "android_tab_declutter_archive_time_delta_hours", 21 * 24);
     public static final MutableBooleanParamWithSafeDefault sAndroidTabDeclutterAutoDeleteEnabled =
             sAndroidTabDeclutter.newBooleanParam(
                     "android_tab_declutter_auto_delete_enabled", false);
diff --git a/chrome/browser/glic/glic_window_controller.cc b/chrome/browser/glic/glic_window_controller.cc
index 24e9cd9..21042b0 100644
--- a/chrome/browser/glic/glic_window_controller.cc
+++ b/chrome/browser/glic/glic_window_controller.cc
@@ -26,7 +26,6 @@
 // Default value for how close the corner of glic has to be from a browser's
 // glic button to snap.
 constexpr static int kSnapDistanceThreshold = 50;
-constexpr static int kUnsnapDistanceThreshold = kSnapDistanceThreshold + 10;
 
 constexpr static int kWidgetWidth = 400;
 constexpr static int kWidgetHeight = 800;
@@ -229,32 +228,14 @@
   // This code isn't set up to handle nested run loops. Nested run loops will
   // lead to crashes.
   if (!in_move_loop_) {
-    // Prepare to start a new drag of the glic window using holder_widget_ as
-    // the new parent.
-    MaybeCreateHolderWindowAndReparent();
     in_move_loop_ = true;
     const views::Widget::MoveLoopSource move_loop_source =
         views::Widget::MoveLoopSource::kMouse;
-    // On Windows, RunMoveLoop doesn't work with `holder_widget_` because
-    // `widget_`'s hwnd received the mouse down and move messages, not
-    // `holder_widget_`'s hwnd. Calling RunMoveLoop on `holder_widget_` exits
-    // the loop immediately.
-    views::Widget* run_loop_widget =
-#if BUILDFLAG(IS_WIN)
-        widget_.get();
-#else
-        holder_widget_.get();
-#endif
-    run_loop_widget->RunMoveLoop(
-        mouse_offset, move_loop_source,
-        views::Widget::MoveLoopEscapeBehavior::kDontHide);
+    widget_->RunMoveLoop(mouse_offset, move_loop_source,
+                         views::Widget::MoveLoopEscapeBehavior::kDontHide);
     in_move_loop_ = false;
     // Look for pins
     HandleBrowserPinning(widget_.get());
-  } else {
-    // while in move loop, find browser pin targets close to the holder widget
-    // to animate glic to for a magnetic effect.
-    HandleBrowserPinning(holder_widget_.get());
   }
 }
 
@@ -287,29 +268,10 @@
     float corner_distance = (glic_button_rect.CenterPoint() -
                              widget->GetWindowBoundsInScreen().top_right())
                                 .Length();
-    // While glic window is actively being dragged, simulate a visual effect of
-    // being pulled to and away from the browser by updating its parent.
-    if (in_move_loop_) {
-      if (corner_distance > kUnsnapDistanceThreshold &&
-          widget_->parent() == window_widget) {
-        // Pull the glic window away from the browser window anchor point when a
-        // drag is far enough away
-        views::Widget::ReparentNativeView(widget_->GetNativeView(),
-                                          holder_widget_->GetNativeView());
-        // TODO(https://crbug.com/384792988): Should use GlicView->
-        // AnimateFrameBounds here but is currently having a glitchy animation.
-      } else if (corner_distance < kSnapDistanceThreshold &&
-                 widget_->parent() != window_widget) {
-        // Temporarily attach the window for the visual effect of being
-        // magnetised to the snapping point
-        MoveToBrowserPinTarget(browser, true);
-        views::Widget::ReparentNativeView(widget_->GetNativeView(),
-                                          window_widget->GetNativeView());
-      }
-    } else {
-      // If there is no active drag (i.e. the previous drag has ended)
-      // then determine whether to snap the glic window to the browser,
-      // or to detach it from the browser.
+    // If there is no active drag (i.e. the previous drag has ended)
+    // then determine whether to snap the glic window to the browser,
+    // or to detach it from the browser.
+    if (!in_move_loop_) {
       if (corner_distance < kSnapDistanceThreshold) {
         MoveToBrowserPinTarget(browser, true);
         // Close holder window if existing
diff --git a/chrome/browser/glic/glic_window_controller.h b/chrome/browser/glic/glic_window_controller.h
index 94198cd..7a08388 100644
--- a/chrome/browser/glic/glic_window_controller.h
+++ b/chrome/browser/glic/glic_window_controller.h
@@ -61,7 +61,7 @@
   void Close();
 
   // Drags the glic window following the current mouse location with a given
-  // offset and checks for pinning points during and after the move loop.
+  // offset and checks for pinning points after the move loop.
   void HandleWindowDragWithOffset(gfx::Vector2d mouse_offset);
 
   const mojom::PanelState& GetPanelState() const { return panel_state_; }
@@ -139,8 +139,7 @@
   };
 
   // If the widget is in snapping distance of a browser's glic button, it snaps
-  // glic to the top right of the browser's glic button. Also handles snapping
-  // when dragging for magnetism.
+  // glic to the top right of the browser's glic button.
   void HandleBrowserPinning(views::Widget* widget);
 
   // When glic is unpinned, reparent it to an empty holder Widget. Initializes
@@ -163,7 +162,7 @@
   // List of callbacks to be notified when window activation has changed.
   base::RepeatingCallbackList<void(bool)> window_activation_callback_list_;
 
-  // Empty holder widget to reparent to when unpinned and when being dragged.
+  // Empty holder widget to reparent to when unpinned.
   std::unique_ptr<views::Widget> holder_widget_;
 
   const raw_ptr<Profile> profile_;
diff --git a/chrome/browser/k_anonymity_service/k_anonymity_service_client.cc b/chrome/browser/k_anonymity_service/k_anonymity_service_client.cc
index 0d0ceb4..a6fb154 100644
--- a/chrome/browser/k_anonymity_service/k_anonymity_service_client.cc
+++ b/chrome/browser/k_anonymity_service/k_anonymity_service_client.cc
@@ -42,6 +42,9 @@
 constexpr base::TimeDelta kRequestTimeout = base::Seconds(5);
 constexpr base::TimeDelta kRequestMargin = base::Minutes(5);
 constexpr base::TimeDelta kKeyCacheDuration = base::Hours(24);
+constexpr base::TimeDelta kKAnonymityServiceQueryInterval = base::Days(1);
+constexpr base::TimeDelta kKAnonymityServiceJoinInterval = base::Days(1);
+
 constexpr int kMaxRetries = 5;
 constexpr size_t kMaxQueueSize = 100;
 
@@ -186,19 +189,17 @@
                         .AppendASCII(kKAnonymityServiceStoragePath))
               : std::make_unique<KAnonymityServiceMemoryStorage>()),
       // Pass the auth server origin as if it is our "top frame".
-      trust_token_answerer_(url::Origin::Create(GURL(
-                                features::kKAnonymityServiceAuthServer.Get())),
-                            profile),
+      trust_token_answerer_(
+          url::Origin::Create(GetURL(kKAnonymityServiceAuthServer)),
+          profile),
       token_getter_(IdentityManagerFactory::GetForProfile(profile),
                     url_loader_factory_,
                     &trust_token_answerer_,
                     storage_.get()),
       profile_(profile) {
-  join_origin_ =
-      url::Origin::Create(GURL(features::kKAnonymityServiceJoinServer.Get()));
+  join_origin_ = url::Origin::Create(GetURL(kKAnonymityServiceJoinServer));
   DCHECK(!join_origin_.opaque());
-  query_origin_ =
-      url::Origin::Create(GURL(features::kKAnonymityServiceQueryServer.Get()));
+  query_origin_ = url::Origin::Create(GetURL(kKAnonymityServiceQueryServer));
   DCHECK(!query_origin_.opaque());
 }
 
@@ -217,6 +218,14 @@
   return capability == signin::Tribool::kTrue;
 }
 
+// IN-TEST
+void KAnonymityServiceClient::SetTestOriginForTesting(GURL url) {
+  test_origin_ = url;
+  join_origin_ = url::Origin::Create(url);
+  query_origin_ = url::Origin::Create(url);
+  token_getter_.SetTestOriginForTesting(url::Origin::Create(url));
+}
+
 void KAnonymityServiceClient::JoinSet(std::string id,
                                       base::OnceCallback<void(bool)> callback) {
   if (!CanUseKAnonymityService(profile_)) {
@@ -342,7 +351,7 @@
 
   network::mojom::ObliviousHttpRequestPtr request =
       network::mojom::ObliviousHttpRequest::New();
-  request->relay_url = GURL(features::kKAnonymityServiceJoinRelayServer.Get());
+  request->relay_url = GetURL(kKAnonymityServiceJoinRelayServer);
   request->traffic_annotation = net::MutableNetworkTrafficAnnotationTag(
       kKAnonymityServiceJoinSetTrafficAnnotation);
   request->key_config = ohttp_key.key;
@@ -369,7 +378,7 @@
   // are scoped to auth_origin. That means we need to specify auth_origin as the
   // issuer.
   url::Origin auth_origin =
-      url::Origin::Create(GURL(features::kKAnonymityServiceAuthServer.Get()));
+      url::Origin::Create(GetURL(kKAnonymityServiceAuthServer));
   network::mojom::TrustTokenParamsPtr params =
       network::mojom::TrustTokenParams::New();
   params->operation = network::mojom::TrustTokenOperationType::kRedemption;
@@ -566,7 +575,7 @@
 
   network::mojom::ObliviousHttpRequestPtr request =
       network::mojom::ObliviousHttpRequest::New();
-  request->relay_url = GURL(features::kKAnonymityServiceQueryRelayServer.Get());
+  request->relay_url = GetURL(kKAnonymityServiceQueryRelayServer);
   request->traffic_annotation = net::MutableNetworkTrafficAnnotationTag(
       kKAnonymityServiceQuerySetTrafficAnnotation);
   request->key_config = ohttp_key.key;
@@ -725,9 +734,13 @@
 }
 
 base::TimeDelta KAnonymityServiceClient::GetJoinInterval() {
-  return features::kKAnonymityServiceJoinInterval.Get();
+  return kKAnonymityServiceJoinInterval;
 }
 
 base::TimeDelta KAnonymityServiceClient::GetQueryInterval() {
-  return features::kKAnonymityServiceQueryInterval.Get();
+  return kKAnonymityServiceQueryInterval;
+}
+
+GURL KAnonymityServiceClient::GetURL(const char url[]) {
+  return test_origin_ ? test_origin_.value() : GURL(url);
 }
diff --git a/chrome/browser/k_anonymity_service/k_anonymity_service_client.h b/chrome/browser/k_anonymity_service/k_anonymity_service_client.h
index 8420bad..0037ab6 100644
--- a/chrome/browser/k_anonymity_service/k_anonymity_service_client.h
+++ b/chrome/browser/k_anonymity_service/k_anonymity_service_client.h
@@ -83,6 +83,8 @@
   // service.
   static bool CanUseKAnonymityService(Profile* profile);
 
+  void SetTestOriginForTesting(GURL url);
+
  private:
   struct PendingJoinRequest {
     PendingJoinRequest(std::string set_id,
@@ -183,6 +185,8 @@
   // query_queue_.
   void DoQuerySetsCallback(std::vector<bool> result);
 
+  GURL GetURL(const char url[]);
+
   // queues
   base::circular_deque<std::unique_ptr<PendingJoinRequest>> join_queue_;
   base::circular_deque<std::unique_ptr<PendingQueryRequest>> query_queue_;
@@ -202,6 +206,7 @@
 
   url::Origin join_origin_;
   url::Origin query_origin_;
+  std::optional<GURL> test_origin_;
 
   raw_ptr<Profile> profile_;
   base::WeakPtrFactory<KAnonymityServiceClient> weak_ptr_factory_{this};
diff --git a/chrome/browser/k_anonymity_service/k_anonymity_service_client_browsertest.cc b/chrome/browser/k_anonymity_service/k_anonymity_service_client_browsertest.cc
index 31ce81c..8ba522a2 100644
--- a/chrome/browser/k_anonymity_service/k_anonymity_service_client_browsertest.cc
+++ b/chrome/browser/k_anonymity_service/k_anonymity_service_client_browsertest.cc
@@ -11,14 +11,12 @@
 #include "chrome/browser/k_anonymity_service/k_anonymity_service_urls.h"
 #include "chrome/browser/signin/identity_test_environment_profile_adaptor.h"
 #include "chrome/browser/ui/browser.h"
-#include "chrome/common/chrome_features.h"
 #include "chrome/test/base/mixin_based_in_process_browser_test.h"
 #include "components/signin/public/identity_manager/account_capabilities_test_mutator.h"
 #include "content/public/browser/k_anonymity_service_delegate.h"
 #include "content/public/test/browser_test.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
 #include "net/third_party/quiche/src/quiche/binary_http/binary_http_message.h"
-#include "services/network/public/cpp/features.h"
 #include "services/network/test/oblivious_http_request_test_helper.h"
 #include "services/network/test/trust_token_request_handler.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -77,22 +75,6 @@
     https_server_->RegisterRequestHandler(base::BindRepeating(
         &TestKAnonymityServiceMixin::HandleRequest, base::Unretained(this)));
     ASSERT_TRUE((https_server_handle_ = https_server_->StartAndReturnHandle()));
-
-    GURL ohttp_relay = https_server_->GetURL("/ohttpRelay");
-
-    feature_list_.InitWithFeaturesAndParameters(
-        /*enabled_features=*/{{features::kKAnonymityService,
-                               {{"KAnonymityServiceAuthServer",
-                                 https_server_->base_url().spec()},
-                                {"KAnonymityServiceJoinServer",
-                                 https_server_->base_url().spec()},
-                                {"KAnonymityServiceJoinRelayServer",
-                                 ohttp_relay.spec()},
-                                {"KAnonymityServiceQueryServer",
-                                 https_server_->base_url().spec()},
-                                {"KAnonymityServiceQueryRelayServer",
-                                 ohttp_relay.spec()}}}},
-        /*disabled_features=*/{});
   }
 
   std::unique_ptr<HttpResponse> HandleGenerateShortIdentifierRequest(
@@ -109,8 +91,7 @@
     return http_response;
   }
 
-  std::unique_ptr<HttpResponse> HandleTrustTokenKeyRequest(
-      const HttpRequest& request) {
+  std::unique_ptr<HttpResponse> HandleTrustTokenKeyRequest() {
     std::string commitment_in = trust_token_handler_.GetKeyCommitmentRecord();
     // Parse and reformat JSON for the key commitment.
 
@@ -174,8 +155,7 @@
     return MakeTrustTokenResponse(*operation_result);
   }
 
-  std::unique_ptr<HttpResponse> HandleOHttpKeyRequest(
-      const HttpRequest& request) {
+  std::unique_ptr<HttpResponse> HandleOHttpKeyRequest() {
     auto http_response = std::make_unique<BasicHttpResponse>();
     http_response->set_code(net::HTTP_OK);
     http_response->set_content(ohttp_request_handler_.GetPublicKeyConfigs());
@@ -254,6 +234,8 @@
       response.emplace(HandleBhttpQueryRequest(bhttp_request));
     } else if (path.starts_with("/v1/types/fledge/sets/")) {
       response.emplace(HandleBhttpJoinRequest(bhttp_request));
+    } else {
+      return nullptr;
     }
     CHECK(response) << path;
     http_response->set_content(ohttp_request_handler_.EncryptResponse(
@@ -269,15 +251,13 @@
     if (path == "/v1/generateShortIdentifier") {
       return HandleGenerateShortIdentifierRequest(request);
     } else if (path.starts_with("/v1/1/fetchKeys")) {
-      return HandleTrustTokenKeyRequest(request);
+      return HandleTrustTokenKeyRequest();
     } else if (path.starts_with("/v1/1/issueTrustToken")) {
       return HandleIssueRequest(request);
     } else if (path.starts_with("/v1/proxy/keys")) {
-      return HandleOHttpKeyRequest(request);
-    } else if (path.starts_with("/ohttpRelay")) {
-      return HandleOhttpRelayRequest(request);
+      return HandleOHttpKeyRequest();
     } else {
-      return nullptr;
+      return HandleOhttpRelayRequest(request);
     }
   }
 
@@ -286,9 +266,9 @@
     return join_called_;
   }
 
- private:
-  base::test::ScopedFeatureList feature_list_;
+  GURL server_url() { return GURL(https_server_->base_url().spec()); }
 
+ private:
   network::test::TrustTokenRequestHandler trust_token_handler_;
   network::test::ObliviousHttpRequestTestHelper ohttp_request_handler_;
 
@@ -331,6 +311,8 @@
     MixinBasedInProcessBrowserTest::SetUpOnMainThread();
   }
 
+  GURL server_url() { return k_anon_service_.server_url(); }
+
  protected:
   TestKAnonymityServiceMixin k_anon_service_{&mixin_host_};
 
@@ -343,6 +325,9 @@
   content::KAnonymityServiceDelegate* delegate =
       profile->GetKAnonymityServiceDelegate();
   ASSERT_TRUE(delegate);
+  static_cast<KAnonymityServiceClient*>(delegate)->SetTestOriginForTesting(
+      server_url());
+
   base::RunLoop run_loop;
   delegate->JoinSet("asdf", base::BindLambdaForTesting([&](bool result) {
                       EXPECT_TRUE(result);
@@ -356,8 +341,10 @@
   content::KAnonymityServiceDelegate* delegate =
       profile->GetKAnonymityServiceDelegate();
   ASSERT_TRUE(delegate);
-  base::RunLoop run_loop;
+  static_cast<KAnonymityServiceClient*>(delegate)->SetTestOriginForTesting(
+      server_url());
 
+  base::RunLoop run_loop;
   std::vector<std::string> set_ids = {"foo", "bar", "baz"};
   delegate->QuerySets(
       set_ids, base::BindLambdaForTesting([&](std::vector<bool> results) {
diff --git a/chrome/browser/k_anonymity_service/k_anonymity_service_client_unittest.cc b/chrome/browser/k_anonymity_service/k_anonymity_service_client_unittest.cc
index ee95229..ae8b305 100644
--- a/chrome/browser/k_anonymity_service/k_anonymity_service_client_unittest.cc
+++ b/chrome/browser/k_anonymity_service/k_anonymity_service_client_unittest.cc
@@ -11,6 +11,7 @@
 #include "base/test/bind.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "chrome/browser/k_anonymity_service/k_anonymity_service_metrics.h"
+#include "chrome/browser/k_anonymity_service/k_anonymity_service_urls.h"
 #include "chrome/browser/signin/identity_manager_factory.h"
 #include "chrome/browser/signin/identity_test_environment_profile_adaptor.h"
 #include "chrome/common/chrome_features.h"
@@ -408,8 +409,6 @@
   }
 };
 
-const char kJoinRelayURL[] = "https://relay.test/join_relay";
-const char kQueryRelayURL[] = "https://relay.test/query_relay";
 
 class OhttpTestNetworkContext : public network::TestNetworkContext {
  public:
@@ -434,13 +433,13 @@
     EXPECT_EQ("binaryKeyInBase64", request->key_config);
     EXPECT_EQ("application/json", request->request_body->content_type);
     if (request->trust_token_params) {
-      EXPECT_EQ(kJoinRelayURL, request->relay_url);
+      EXPECT_EQ(kKAnonymityServiceJoinRelayServer, request->relay_url);
       EXPECT_TRUE(base::StartsWith(
           request->resource_url.spec(),
           "https://chromekanonymity-pa.googleapis.com/v1/types/"
           "fledge/sets/"));
     } else {
-      EXPECT_EQ(kQueryRelayURL, request->relay_url);
+      EXPECT_EQ(kKAnonymityServiceQueryRelayServer, request->relay_url);
       EXPECT_TRUE(base::StartsWith(
           request->resource_url.spec(),
           "https://chromekanonymityquery-pa.googleapis.com/v1:query"));
@@ -521,12 +520,7 @@
  protected:
   void SetUp() override {
     feature_list_.InitWithFeaturesAndParameters(
-        {{features::kKAnonymityService,
-          {
-              {"KAnonymityServiceJoinRelayServer", kJoinRelayURL},
-              {"KAnonymityServiceQueryRelayServer", kQueryRelayURL},
-          }},
-         {features::kKAnonymityServiceOHTTPRequests, {}},
+        {{features::kKAnonymityServiceOHTTPRequests, {}},
          {features::kKAnonymityServiceStorage, {}}},
         {});
     TestingProfile::Builder builder;
@@ -556,7 +550,8 @@
 
   void RespondWithJoin() {
     task_environment_->RunUntilIdle();
-    network_context_.RespondToPendingRequest(kJoinRelayURL, "{}\n");
+    network_context_.RespondToPendingRequest(kKAnonymityServiceJoinRelayServer,
+                                             "{}\n");
   }
 
   void RespondWithQueryKey() {
@@ -567,7 +562,8 @@
 
   void RespondWithQuery(const std::string& response_str) {
     task_environment_->RunUntilIdle();
-    network_context_.RespondToPendingRequest(kQueryRelayURL, response_str);
+    network_context_.RespondToPendingRequest(kKAnonymityServiceQueryRelayServer,
+                                             response_str);
   }
 
   void DropOhttpRequests() { network_context_.SetDropRequests(true); }
diff --git a/chrome/browser/k_anonymity_service/k_anonymity_service_factory.cc b/chrome/browser/k_anonymity_service/k_anonymity_service_factory.cc
index cbcc4244..c4536a3 100644
--- a/chrome/browser/k_anonymity_service/k_anonymity_service_factory.cc
+++ b/chrome/browser/k_anonymity_service/k_anonymity_service_factory.cc
@@ -20,8 +20,6 @@
 
 namespace {
 ProfileSelections BuildKAnonymityServiceProfileSelections() {
-  if (!base::FeatureList::IsEnabled(features::kKAnonymityService))
-    return ProfileSelections::BuildNoProfilesSelected();
   return ProfileSelections::Builder()
       .WithRegular(ProfileSelection::kOwnInstance)
       .WithGuest(ProfileSelection::kOwnInstance)
diff --git a/chrome/browser/k_anonymity_service/k_anonymity_service_urls.h b/chrome/browser/k_anonymity_service/k_anonymity_service_urls.h
index 87f9062..66cb702 100644
--- a/chrome/browser/k_anonymity_service/k_anonymity_service_urls.h
+++ b/chrome/browser/k_anonymity_service/k_anonymity_service_urls.h
@@ -5,16 +5,27 @@
 #ifndef CHROME_BROWSER_K_ANONYMITY_SERVICE_K_ANONYMITY_SERVICE_URLS_H_
 #define CHROME_BROWSER_K_ANONYMITY_SERVICE_K_ANONYMITY_SERVICE_URLS_H_
 
-constexpr char kGenNonUniqueUserIdPath[] = "/v1/generateShortIdentifier";
-constexpr char kFetchKeysPathFmt[] =
+inline constexpr char kKAnonymityServiceAuthServer[] =
+    "https://chromekanonymityauth-pa.googleapis.com/";
+inline constexpr char kKAnonymityServiceJoinRelayServer[] =
+    "https://google-ohttp-relay-join.fastly-edge.com/";
+inline constexpr char kKAnonymityServiceJoinServer[] =
+    "https://chromekanonymity-pa.googleapis.com/";
+inline constexpr char kKAnonymityServiceQueryRelayServer[] =
+    "https://google-ohttp-relay-query.fastly-edge.com/";
+inline constexpr char kKAnonymityServiceQueryServer[] =
+    "https://chromekanonymityquery-pa.googleapis.com/";
+
+inline constexpr char kGenNonUniqueUserIdPath[] = "/v1/generateShortIdentifier";
+inline constexpr char kFetchKeysPathFmt[] =
     "/v1/%d/fetchKeys?key=%s";  // Put the short ID in the path.
-constexpr char kIssueTrustTokenPathFmt[] =
+inline constexpr char kIssueTrustTokenPathFmt[] =
     "/v1/%d/issueTrustToken";  // Put the short ID in the path.
 
-constexpr char kJoinSetPathFmt[] = "/v1/types/%s/sets/%s:join?key=%s";
-constexpr char kJoinSetOhttpPath[] = "/v1/proxy/keys?key=";
+inline constexpr char kJoinSetPathFmt[] = "/v1/types/%s/sets/%s:join?key=%s";
+inline constexpr char kJoinSetOhttpPath[] = "/v1/proxy/keys?key=";
 
-constexpr char kQuerySetsPath[] = "/v1:query?key=";
-constexpr char kQuerySetOhttpPath[] = "/v1/proxy/keys?key=";
+inline constexpr char kQuerySetsPath[] = "/v1:query?key=";
+inline constexpr char kQuerySetOhttpPath[] = "/v1/proxy/keys?key=";
 
 #endif  // CHROME_BROWSER_K_ANONYMITY_SERVICE_K_ANONYMITY_SERVICE_URLS_H_
diff --git a/chrome/browser/k_anonymity_service/k_anonymity_trust_token_getter.cc b/chrome/browser/k_anonymity_service/k_anonymity_trust_token_getter.cc
index 6938b75..caa12e5 100644
--- a/chrome/browser/k_anonymity_service/k_anonymity_trust_token_getter.cc
+++ b/chrome/browser/k_anonymity_service/k_anonymity_trust_token_getter.cc
@@ -108,8 +108,7 @@
       url_loader_factory_(std::move(url_loader_factory)),
       trust_token_query_answerer_(answerer),
       storage_(storage) {
-  auth_origin_ =
-      url::Origin::Create(GURL(features::kKAnonymityServiceAuthServer.Get()));
+  auth_origin_ = url::Origin::Create(GURL(kKAnonymityServiceAuthServer));
   isolation_info_ = net::IsolationInfo::Create(
       net::IsolationInfo::RequestType::kOther, auth_origin_, auth_origin_,
       net::SiteForCookies());
@@ -560,3 +559,10 @@
   std::move(pending_callbacks_.front().callback).Run(result);
   pending_callbacks_.pop_front();
 }
+
+void KAnonymityTrustTokenGetter::SetTestOriginForTesting(url::Origin url) {
+  auth_origin_ = url;
+  isolation_info_ = net::IsolationInfo::Create(
+      net::IsolationInfo::RequestType::kOther, auth_origin_, auth_origin_,
+      net::SiteForCookies());
+}
diff --git a/chrome/browser/k_anonymity_service/k_anonymity_trust_token_getter.h b/chrome/browser/k_anonymity_service/k_anonymity_trust_token_getter.h
index 6e8152a..04b4b58 100644
--- a/chrome/browser/k_anonymity_service/k_anonymity_trust_token_getter.h
+++ b/chrome/browser/k_anonymity_service/k_anonymity_trust_token_getter.h
@@ -69,6 +69,8 @@
   // should immediately initiate the request that uses the trust token.
   void TryGetTrustTokenAndKey(TryGetTrustTokenAndKeyCallback callback);
 
+  void SetTestOriginForTesting(url::Origin url);
+
  private:
   struct PendingRequest {
     explicit PendingRequest(TryGetTrustTokenAndKeyCallback callback);
diff --git a/chrome/browser/k_anonymity_service/k_anonymity_trust_token_getter_unittest.cc b/chrome/browser/k_anonymity_service/k_anonymity_trust_token_getter_unittest.cc
index 1e904958..e06d073 100644
--- a/chrome/browser/k_anonymity_service/k_anonymity_trust_token_getter_unittest.cc
+++ b/chrome/browser/k_anonymity_service/k_anonymity_trust_token_getter_unittest.cc
@@ -17,7 +17,6 @@
 #include "chrome/browser/k_anonymity_service/k_anonymity_service_urls.h"
 #include "chrome/browser/signin/identity_manager_factory.h"
 #include "chrome/browser/signin/identity_test_environment_profile_adaptor.h"
-#include "chrome/common/chrome_features.h"
 #include "chrome/test/base/testing_browser_process.h"
 #include "chrome/test/base/testing_profile.h"
 #include "chrome/test/base/testing_profile_manager.h"
@@ -25,7 +24,6 @@
 #include "google_apis/gaia/gaia_constants.h"
 #include "net/dns/mock_host_resolver.h"
 #include "services/data_decoder/public/cpp/test_support/in_process_data_decoder.h"
-#include "services/network/public/cpp/features.h"
 #include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
 #include "services/network/public/mojom/trust_tokens.mojom.h"
 #include "services/network/test/test_url_loader_factory.h"
@@ -34,8 +32,6 @@
 
 namespace {
 
-const char kAuthServer[] = "https://authserver";
-
 class TestTrustTokenQueryAnswerer
     : public network::mojom::TrustTokenQueryAnswerer {
  public:
@@ -65,10 +61,6 @@
 class KAnonymityTrustTokenGetterTest : public testing::Test {
  protected:
   void SetUp() override {
-    feature_list_.InitWithFeaturesAndParameters(
-        /*enabled_features=*/{{features::kKAnonymityService,
-                               {{"KAnonymityServiceAuthServer", kAuthServer}}}},
-        /*disabled_features=*/{});
     TestingProfile::Builder builder;
     builder.SetSharedURLLoaderFactory(
         base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
@@ -80,7 +72,8 @@
     getter_ = std::make_unique<KAnonymityTrustTokenGetter>(
         IdentityManagerFactory::GetForProfile(profile_.get()),
         profile_->GetURLLoaderFactory(), &trust_token_answerer_, &storage_);
-    url::Origin auth_origin = url::Origin::Create(GURL(kAuthServer));
+    url::Origin auth_origin =
+        url::Origin::Create(GURL(kKAnonymityServiceAuthServer));
     isolation_info_ = net::IsolationInfo::Create(
         net::IsolationInfo::RequestType::kOther, auth_origin, auth_origin,
         net::SiteForCookies());
@@ -142,8 +135,8 @@
   }
 
   void RespondWithTrustTokenNonUniqueUserId(int id) {
-    std::string request_url =
-        base::StrCat({kAuthServer, "/v1/generateShortIdentifier"});
+    std::string request_url = base::StrCat(
+        {kKAnonymityServiceAuthServer, "v1/generateShortIdentifier"});
 
     const auto* pending_request = WaitForPendingRequest();
     const auto& request = pending_request->request;
@@ -161,8 +154,8 @@
   }
 
   void RespondWithTrustTokenKeys(int id, base::Time expiration) {
-    std::string request_url =
-        base::StringPrintf("%s/v1/%d/fetchKeys?key=", kAuthServer, id);
+    std::string request_url = base::StringPrintf(
+        "%sv1/%d/fetchKeys?key=", kKAnonymityServiceAuthServer, id);
 
     const auto* pending_request = WaitForPendingRequest();
     const auto& request = pending_request->request;
@@ -193,8 +186,8 @@
   }
 
   void RespondWithTrustTokenIssued(int id) {
-    std::string request_url =
-        base::StringPrintf("%s/v1/%d/issueTrustToken", kAuthServer, id);
+    std::string request_url = base::StringPrintf(
+        "%sv1/%d/issueTrustToken", kKAnonymityServiceAuthServer, id);
 
     const auto* pending_request = WaitForPendingRequest();
     const auto& request = pending_request->request;
@@ -246,7 +239,6 @@
   bool HasPendingRequest() { return test_url_loader_factory_.NumPending() > 0; }
 
  protected:
-  base::test::ScopedFeatureList feature_list_;
   content::BrowserTaskEnvironment task_environment_{
       base::test::TaskEnvironment::TimeSource::MOCK_TIME};
   net::IsolationInfo isolation_info_;
@@ -306,8 +298,8 @@
                 run_loop.Quit();
               })));
   RespondWithOAuthToken(base::Time::Max());
-  SimulateFailedResponseForPendingRequest(
-      "https://authserver/v1/generateShortIdentifier");
+  SimulateFailedResponseForPendingRequest(base::StrCat(
+      {kKAnonymityServiceAuthServer, "v1/generateShortIdentifier"}));
   run_loop.Run();
   CheckHistogramActions(
       hist, {KAnonymityTrustTokenGetterAction::kTryGetTrustTokenAndKey,
@@ -356,8 +348,8 @@
                 })));
     RespondWithOAuthToken(base::Time::Now() + base::Seconds(1));
     SimulateResponseForPendingRequest(
-        "https://authserver/v1/"
-        "generateShortIdentifier",
+        base::StrCat(
+            {kKAnonymityServiceAuthServer, "v1/generateShortIdentifier"}),
         response);
     run_loop.Run();
     task_environment()->FastForwardBy(base::Minutes(1));
@@ -387,7 +379,8 @@
               })));
   RespondWithOAuthToken(base::Time::Max());
   RespondWithTrustTokenNonUniqueUserId(2);
-  SimulateFailedResponseForPendingRequest("https://authserver/v1/2/fetchKeys");
+  SimulateFailedResponseForPendingRequest(
+      base::StrCat({kKAnonymityServiceAuthServer, "v1/2/fetchKeys"}));
   run_loop.Run();
   CheckHistogramActions(
       hist, {KAnonymityTrustTokenGetterAction::kTryGetTrustTokenAndKey,
@@ -554,8 +547,9 @@
                 })));
     RespondWithOAuthToken(base::Time::Now() + base::Seconds(1));
     RespondWithTrustTokenNonUniqueUserId(2);
-    SimulateResponseForPendingRequest("https://authserver/v1/2/fetchKeys",
-                                      response);
+    SimulateResponseForPendingRequest(
+        base::StrCat({kKAnonymityServiceAuthServer, "v1/2/fetchKeys"}),
+        response);
     run_loop.Run();
     task_environment()->FastForwardBy(base::Minutes(1));
   }
@@ -661,10 +655,11 @@
                 })));
     RespondWithOAuthToken(base::Time::Now() + base::Seconds(1));
     RespondWithTrustTokenNonUniqueUserId(2);
-    SimulateResponseForPendingRequest("https://authserver/v1/2/fetchKeys",
-                                      test_case.response);
+    SimulateResponseForPendingRequest(
+        base::StrCat({kKAnonymityServiceAuthServer, "v1/2/fetchKeys"}),
+        test_case.response);
     SimulateFailedResponseForPendingRequest(
-        "https://authserver/v1/2/issueTrustToken");
+        base::StrCat({kKAnonymityServiceAuthServer, "v1/2/issueTrustToken"}));
     run_loop.Run();
     task_environment()->FastForwardBy(base::Minutes(1));
 
@@ -705,7 +700,8 @@
   RespondWithTrustTokenNonUniqueUserId(2);
   RespondWithTrustTokenKeys(2, base::Time::Now() + base::Days(1));
   SimulateFailedResponseForPendingRequest(
-      "https://authserver/v1/2/issueTrustToken");
+
+      base::StrCat({kKAnonymityServiceAuthServer, "v1/2/issueTrustToken"}));
 
   run_loop.Run();
   CheckHistogramActions(
@@ -818,7 +814,7 @@
   RespondWithTrustTokenNonUniqueUserId(2);
   RespondWithTrustTokenKeys(2, base::Time::Now() + base::Days(1));
   SimulateFailedResponseForPendingRequest(
-      "https://authserver/v1/2/issueTrustToken");
+      base::StrCat({kKAnonymityServiceAuthServer, "v1/2/issueTrustToken"}));
   run_loop.Run();
   EXPECT_EQ(10, callback_count);
   CheckHistogramActions(
diff --git a/chrome/browser/magic_stack/android/BUILD.gn b/chrome/browser/magic_stack/android/BUILD.gn
index 2d76054..f5bd8f9f 100644
--- a/chrome/browser/magic_stack/android/BUILD.gn
+++ b/chrome/browser/magic_stack/android/BUILD.gn
@@ -36,11 +36,13 @@
     "//chrome/browser/tab:java",
     "//chrome/browser/tabmodel:java",
     "//chrome/browser/ui/android/strings:ui_strings_grd",
+    "//chrome/browser/ui/android/toolbar:java_resources",
     "//chrome/browser/util:java",
     "//components/browser_ui/settings/android:java",
     "//components/browser_ui/strings/android:browser_ui_strings_grd",
     "//components/browser_ui/styles/android:java",
     "//components/browser_ui/widget/android:java",
+    "//components/browser_ui/widget/android:java_resources",
     "//components/cached_flags:java",
     "//components/embedder_support/android:util_java",
     "//components/segmentation_platform/public:public_java",
@@ -61,7 +63,10 @@
     "java/res/layout/home_modules_recycler_view_layout.xml",
     "java/res/values/dimens.xml",
   ]
-  deps = [ "//components/browser_ui/strings/android:browser_ui_strings_grd" ]
+  deps = [
+    "//components/browser_ui/strings/android:browser_ui_strings_grd",
+    "//ui/android:ui_java_resources",
+  ]
 }
 
 robolectric_library("junit") {
@@ -91,6 +96,7 @@
     "//base:base_shared_preferences_java",
     "//chrome/android:chrome_java",
     "//chrome/browser/android/lifecycle:java",
+    "//chrome/browser/educational_tip:java_resources",
     "//chrome/browser/flags:java",
     "//chrome/browser/preferences:java",
     "//chrome/browser/profiles/android:java",
@@ -102,6 +108,7 @@
     "//chrome/test/android:chrome_java_unit_test_support",
     "//components/browser_ui/settings/android:java",
     "//components/browser_ui/styles/android:java",
+    "//components/browser_ui/theme/android:java_resources",
     "//components/browser_ui/widget/android:java",
     "//components/embedder_support/android:util_java",
     "//components/segmentation_platform/public:public_java",
diff --git a/chrome/browser/magic_stack/android/java/src/org/chromium/chrome/browser/magic_stack/HomeModulesContextMenuManager.java b/chrome/browser/magic_stack/android/java/src/org/chromium/chrome/browser/magic_stack/HomeModulesContextMenuManager.java
index 6c80118..e84c012b 100644
--- a/chrome/browser/magic_stack/android/java/src/org/chromium/chrome/browser/magic_stack/HomeModulesContextMenuManager.java
+++ b/chrome/browser/magic_stack/android/java/src/org/chromium/chrome/browser/magic_stack/HomeModulesContextMenuManager.java
@@ -3,18 +3,29 @@
 // found in the LICENSE file.
 package org.chromium.chrome.browser.magic_stack;
 
+import static org.chromium.components.browser_ui.widget.BrowserUiListMenuUtils.buildMenuListItemWithEllipsizedAtEnd;
+
 import android.content.Context;
-import android.graphics.Point;
-import android.view.ContextMenu;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.MenuItem.OnMenuItemClickListener;
+import android.graphics.Color;
+import android.graphics.Rect;
+import android.graphics.drawable.ColorDrawable;
 import android.view.View;
 
 import androidx.annotation.IntDef;
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
 
+import org.chromium.base.ResettersForTesting;
+import org.chromium.components.browser_ui.widget.BrowserUiListMenuUtils;
+import org.chromium.ui.listmenu.BasicListMenu;
+import org.chromium.ui.listmenu.ListMenu;
+import org.chromium.ui.listmenu.ListMenuItemProperties;
+import org.chromium.ui.modelutil.MVCListAdapter.ModelList;
+import org.chromium.ui.widget.AnchoredPopupWindow;
+import org.chromium.ui.widget.AnchoredPopupWindow.VerticalOrientation;
+import org.chromium.ui.widget.RectProvider;
+
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 
@@ -42,18 +53,15 @@
         int NUM_ENTRIES = 2;
     }
 
-    private final Point mContextMenuStartPosition;
-
     private ModuleDelegate mModuleDelegate;
 
+    @Nullable private AnchoredPopupWindow mPopupWindow;
+
     /**
      * @param moduleDelegate The instance of magic stack {@link ModuleDelegate}.
-     * @param startPosition The starting position to show the context menu.
      */
-    public HomeModulesContextMenuManager(
-            @NonNull ModuleDelegate moduleDelegate, @NonNull Point startPosition) {
+    public HomeModulesContextMenuManager(@NonNull ModuleDelegate moduleDelegate) {
         mModuleDelegate = moduleDelegate;
-        mContextMenuStartPosition = startPosition;
     }
 
     public void destroy() {
@@ -61,72 +69,142 @@
     }
 
     /**
-     * Builds context menu items for a module.
+     * Builds and displays context menu items for a magic stack module.
      *
-     * @param contextMenu The provided instance of {@link ContextMenu}.
-     * @param associatedView The view to show the context menu.
-     * @param moduleProvider The given module.
+     * @param view The magic stack module view that is long clicked to show the context menu.
+     * @param moduleProvider The instance of magic stack {@link ModuleDelegate}.
      */
-    public void createContextMenu(
-            @NonNull ContextMenu contextMenu,
-            @NonNull View associatedView,
-            @NonNull ModuleProvider moduleProvider) {
+    public void displayMenu(@NonNull View view, @NonNull ModuleProvider moduleProvider) {
         if (mModuleDelegate == null) return;
 
-        OnMenuItemClickListener listener =
-                menuItem -> onMenuItemClickImpl(menuItem, moduleProvider);
+        ListMenu menu =
+                getListMenu(view, moduleProvider, mModuleDelegate, this::dismissPopupWindow);
+
+        // No item added. We won't show the menu, so we can skip the rest.
+        if (menu == null) return;
+
+        mPopupWindow =
+                new AnchoredPopupWindow(
+                        view.getContext(),
+                        view,
+                        new ColorDrawable(Color.TRANSPARENT),
+                        menu.getContentView(),
+                        new RectProvider(getAnchorRectangle(view)),
+                        null);
+
+        showContextMenu(menu, view);
+        notifyContextMenuShown(moduleProvider);
+    }
+
+    @VisibleForTesting
+    BasicListMenu getListMenu(
+            @NonNull View view,
+            @NonNull ModuleProvider moduleProvider,
+            @NonNull ModuleDelegate moduleDelegate,
+            @NonNull Runnable dismissPopupWindowRunnable) {
         boolean hasItems = false;
 
+        ModelList itemList = new ModelList();
+        Context context = view.getContext();
+
         for (@ContextMenuItemId int itemId = 0; itemId < ContextMenuItemId.NUM_ENTRIES; itemId++) {
             if (!shouldShowItem(itemId, moduleProvider)) continue;
 
             if (itemId != ContextMenuItemId.HIDE_MODULE) {
-                contextMenu
-                        .add(
-                                Menu.NONE,
-                                itemId,
-                                Menu.NONE,
-                                getResourceIdForMenuItem(itemId, moduleProvider))
-                        .setOnMenuItemClickListener(listener);
+                itemList.add(
+                        buildMenuListItemWithEllipsizedAtEnd(
+                                context.getString(getResourceIdForMenuItem(itemId, moduleProvider)),
+                                ContextMenuItemId.SHOW_CUSTOMIZE_SETTINGS,
+                                /* startIconId */ 0,
+                                /* enabled */ true,
+                                /* isTextEllipsizedAtEnd */ true));
             } else {
-                Context context = associatedView.getContext();
-                contextMenu
-                        .add(moduleProvider.getModuleContextMenuHideText(context))
-                        .setOnMenuItemClickListener(listener);
+                itemList.add(
+                        buildMenuListItemWithEllipsizedAtEnd(
+                                moduleProvider.getModuleContextMenuHideText(context),
+                                ContextMenuItemId.HIDE_MODULE,
+                                /* startIconId */ 0,
+                                /* enabled */ true,
+                                /* isTextEllipsizedAtEnd */ true));
             }
             hasItems = true;
         }
 
         // No item added. We won't show the menu, so we can skip the rest.
-        if (!hasItems) return;
+        if (!hasItems) return null;
 
-        notifyContextMenuShown(moduleProvider);
+        ListMenu.Delegate delegate =
+                (model) -> {
+                    switch (model.get(ListMenuItemProperties.MENU_ITEM_ID)) {
+                        case ContextMenuItemId.HIDE_MODULE:
+                            moduleDelegate.removeModuleAndDisable(moduleProvider.getModuleType());
+                            HomeModulesMetricsUtils.recordContextMenuRemoveModule(
+                                    moduleProvider.getModuleType());
+                            break;
+                        case ContextMenuItemId.SHOW_CUSTOMIZE_SETTINGS:
+                            moduleDelegate.customizeSettings();
+                            HomeModulesMetricsUtils.recordContextMenuCustomizeSettings(
+                                    moduleProvider.getModuleType());
+                            break;
+                        default:
+                            assert false : "Not reached.";
+                    }
+                    dismissPopupWindowRunnable.run();
+                };
+
+        return BrowserUiListMenuUtils.getBasicListMenu(context, itemList, delegate);
     }
 
     /**
-     * Called when a context menu item is clicked.
+     * Returns an anchor rectangle used by calculatePopupWindowSpec() in AnchoredPopupWindow class
+     * to calculate the the absolute coordinates of the popup window with respect to the screen. The
+     * horizontal position of the popup window should be anchorRect.left + (anchorRect.width() -
+     * menu's width) / 2 + marginPx and the vertical position of the pop up window should be
+     * anchorRect.y, when properties of the popup window are set as in showContextMenu().
      *
-     * @param menuItem The menu item which is clicked.
-     * @param moduleProvider The module which shows the context menu.
-     * @return Whether the click on the menu item is handled.
+     * @param view The magic stack module view that is long clicked to show the context menu.
      */
-    boolean onMenuItemClickImpl(
-            @NonNull MenuItem menuItem, @NonNull ModuleProvider moduleProvider) {
-        switch (menuItem.getItemId()) {
-            case ContextMenuItemId.HIDE_MODULE:
-                mModuleDelegate.removeModuleAndDisable(moduleProvider.getModuleType());
-                HomeModulesMetricsUtils.recordContextMenuRemoveModule(
-                        moduleProvider.getModuleType());
-                return true;
-            case ContextMenuItemId.SHOW_CUSTOMIZE_SETTINGS:
-                mModuleDelegate.customizeSettings();
-                HomeModulesMetricsUtils.recordContextMenuCustomizeSettings(
-                        moduleProvider.getModuleType());
-                return true;
-            default:
-                assert false : "Not reached.";
-                return false;
-        }
+    @VisibleForTesting
+    Rect getAnchorRectangle(@NonNull View view) {
+        int[] coordinates = new int[2];
+        view.getLocationOnScreen(coordinates);
+
+        // The values of x and y are defined to display the menu at the center of clicked magic
+        // stack module.
+        int x = coordinates[0];
+        int y = coordinates[1] + view.getHeight() / 4;
+
+        return new Rect(x, y, x + view.getWidth(), y + view.getHeight());
+    }
+
+    @VisibleForTesting
+    void showContextMenu(@NonNull ListMenu menu, @NonNull View view) {
+        final View contentView = menu.getContentView();
+        final int lateralPadding = contentView.getPaddingLeft() + contentView.getPaddingRight();
+
+        AnchoredPopupWindow.LayoutObserver layoutObserver =
+                (positionBelow, x, y, width, height, rect) ->
+                        mPopupWindow.setAnimationStyle(
+                                positionBelow
+                                        ? R.style.StartIconMenuAnim
+                                        : R.style.StartIconMenuAnimBottom);
+        mPopupWindow.setLayoutObserver(layoutObserver);
+        mPopupWindow.setVerticalOverlapAnchor(true);
+        // To fit the largest item of the menu in one line when it is possible,the width of the
+        // mPopupWindow is the sum of the padding round the item and the max width of the menu item
+        // or the width of the clicked magic stack module, if it is smaller.
+        mPopupWindow.setDesiredContentWidth(
+                Math.min(menu.getMaxItemWidth() + lateralPadding, view.getWidth()));
+        mPopupWindow.setFocusable(true);
+        mPopupWindow.setOutsideTouchable(true);
+
+        // To place the menu at the center of the magic stack module, HorizontalOrientation.CENTER
+        // and VerticalOrientation.BELOW are used.
+        mPopupWindow.setPreferredHorizontalOrientation(
+                AnchoredPopupWindow.HorizontalOrientation.CENTER);
+        mPopupWindow.setPreferredVerticalOrientation(VerticalOrientation.BELOW);
+
+        mPopupWindow.show();
     }
 
     /** Returns whether to show a context menu item. */
@@ -164,8 +242,17 @@
         HomeModulesMetricsUtils.recordContextMenuShown(moduleProvider.getModuleType());
     }
 
-    /** Returns the starting position of the context menu. */
-    Point getContextMenuOffset() {
-        return mContextMenuStartPosition;
+    @VisibleForTesting
+    void dismissPopupWindow() {
+        if (mPopupWindow == null) return;
+
+        mPopupWindow.dismiss();
+        mPopupWindow = null;
+    }
+
+    public void setPopupWindowForTesting(@NonNull AnchoredPopupWindow window) {
+        AnchoredPopupWindow oldWindow = mPopupWindow;
+        mPopupWindow = window;
+        ResettersForTesting.register(() -> mPopupWindow = oldWindow);
     }
 }
diff --git a/chrome/browser/magic_stack/android/java/src/org/chromium/chrome/browser/magic_stack/HomeModulesCoordinator.java b/chrome/browser/magic_stack/android/java/src/org/chromium/chrome/browser/magic_stack/HomeModulesCoordinator.java
index 53156153..1aa529d5 100644
--- a/chrome/browser/magic_stack/android/java/src/org/chromium/chrome/browser/magic_stack/HomeModulesCoordinator.java
+++ b/chrome/browser/magic_stack/android/java/src/org/chromium/chrome/browser/magic_stack/HomeModulesCoordinator.java
@@ -6,7 +6,6 @@
 
 import android.app.Activity;
 import android.content.Context;
-import android.graphics.Point;
 import android.os.SystemClock;
 import android.view.ViewGroup;
 import android.view.ViewGroup.LayoutParams;
@@ -21,6 +20,7 @@
 
 import org.chromium.base.Callback;
 import org.chromium.base.CallbackController;
+import org.chromium.base.ResettersForTesting;
 import org.chromium.base.supplier.ObservableSupplier;
 import org.chromium.chrome.browser.magic_stack.ModuleRegistry.OnViewCreatedCallback;
 import org.chromium.chrome.browser.profiles.Profile;
@@ -93,9 +93,7 @@
         assert mModuleRegistry != null;
 
         mCallbackController = new CallbackController();
-        mHomeModulesContextMenuManager =
-                new HomeModulesContextMenuManager(
-                        this, moduleDelegateHost.getContextMenuStartPoint());
+        mHomeModulesContextMenuManager = new HomeModulesContextMenuManager(this);
         mProfileSupplier = profileSupplier;
 
         mModel = new ModelList();
@@ -394,13 +392,8 @@
         group.setLayoutParams(layoutParams);
         group.setOnLongClickListener(
                 view -> {
-                    Point offset = mHomeModulesContextMenuManager.getContextMenuOffset();
-                    return view.showContextMenu(offset.x, offset.y);
-                });
-        group.setOnCreateContextMenuListener(
-                (contextMenu, view, contextMenuInfo) -> {
-                    mHomeModulesContextMenuManager.createContextMenu(
-                            contextMenu, view, moduleProvider);
+                    mHomeModulesContextMenuManager.displayMenu(view, moduleProvider);
+                    return true;
                 });
         moduleProvider.onViewCreated();
         int position = mMediator.findModuleIndexInRecyclerView(moduleType, mAdapter.getItemCount());
@@ -474,4 +467,10 @@
     public void setModelForTesting(ModelList model) {
         mModel = model;
     }
+
+    void setHomeModulesContextMenuManagerForTesting(HomeModulesContextMenuManager manager) {
+        HomeModulesContextMenuManager oldManager = mHomeModulesContextMenuManager;
+        mHomeModulesContextMenuManager = manager;
+        ResettersForTesting.register(() -> mHomeModulesContextMenuManager = oldManager);
+    }
 }
diff --git a/chrome/browser/magic_stack/android/junit/src/org/chromium/chrome/browser/magic_stack/HomeModulesContextMenuManagerUnitTest.java b/chrome/browser/magic_stack/android/junit/src/org/chromium/chrome/browser/magic_stack/HomeModulesContextMenuManagerUnitTest.java
index 7f83138..163a37cc 100644
--- a/chrome/browser/magic_stack/android/junit/src/org/chromium/chrome/browser/magic_stack/HomeModulesContextMenuManagerUnitTest.java
+++ b/chrome/browser/magic_stack/android/junit/src/org/chromium/chrome/browser/magic_stack/HomeModulesContextMenuManagerUnitTest.java
@@ -4,38 +4,45 @@
 
 package org.chromium.chrome.browser.magic_stack;
 
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.reset;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 import android.content.Context;
-import android.graphics.Point;
-import android.view.ContextMenu;
-import android.view.Menu;
-import android.view.MenuItem;
+import android.graphics.Rect;
+import android.view.ContextThemeWrapper;
+import android.view.LayoutInflater;
 import android.view.View;
+import android.widget.TextView;
 
+import androidx.test.core.app.ApplicationProvider;
 import androidx.test.filters.SmallTest;
 
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
 import org.mockito.Mock;
-import org.mockito.Mockito;
 import org.mockito.junit.MockitoJUnit;
 import org.mockito.junit.MockitoRule;
 import org.robolectric.annotation.Config;
 
 import org.chromium.base.test.BaseRobolectricTestRunner;
+import org.chromium.base.test.util.HistogramWatcher;
 import org.chromium.chrome.browser.magic_stack.HomeModulesContextMenuManager.ContextMenuItemId;
 import org.chromium.chrome.browser.magic_stack.ModuleDelegate.ModuleType;
+import org.chromium.ui.listmenu.BasicListMenu;
+import org.chromium.ui.widget.AnchoredPopupWindow;
+import org.chromium.ui.widget.AnchoredPopupWindow.VerticalOrientation;
 
 /** Unit tests for {@link HomeModulesContextMenuManager}. */
 @RunWith(BaseRobolectricTestRunner.class)
@@ -43,37 +50,160 @@
 public class HomeModulesContextMenuManagerUnitTest {
     @Rule public MockitoRule mMockitoRule = MockitoJUnit.rule();
 
-    @Mock private ModuleDelegate mModuleDelegate;
+    private static final String EXPECTED_OPTION_1 = "Hide Chrome tips card";
+    private static final String EXPECTED_OPTION_2 = "Customize";
+    private static final int MODULE_TYPE = ModuleType.TAB_RESUMPTION;
     @Mock private ModuleProvider mModuleProvider;
-    @Mock private MenuItem mMenuItem;
-    @Mock private ContextMenu mContextMenu;
     @Mock private View mView;
-    @Mock private Context mContext;
-
-    private @ModuleType int mModuleType;
-    private String mContextMenuHide = "Hide module";
-    private Point mPoint = new Point(0, 0);
+    @Mock private ModuleDelegate mModuleDelegate;
+    @Mock private AnchoredPopupWindow mPopupWindow;
+    @Mock private Runnable mDismissPopupWindowRunnable;
+    @Captor private ArgumentCaptor<AnchoredPopupWindow.LayoutObserver> mLayoutObserverCaptor;
+    private Context mContext;
+    private BasicListMenu mMenu;
     private HomeModulesContextMenuManager mManager;
 
     @Before
     public void setUp() {
-        mModuleType = ModuleType.SINGLE_TAB;
-        doReturn(mContext).when(mView).getContext();
-        doReturn(mModuleType).when(mModuleProvider).getModuleType();
-        when(mModuleProvider.getModuleContextMenuHideText(any())).thenReturn(mContextMenuHide);
-        mManager = new HomeModulesContextMenuManager(mModuleDelegate, mPoint);
+        mContext =
+                new ContextThemeWrapper(
+                        ApplicationProvider.getApplicationContext(),
+                        R.style.Theme_BrowserUI_DayNight);
+        mManager = new HomeModulesContextMenuManager(mModuleDelegate);
+
+        when(mModuleProvider.getModuleContextMenuHideText(any(Context.class)))
+                .thenReturn(EXPECTED_OPTION_1);
+        when(mView.getContext()).thenReturn(mContext);
+        when(mModuleProvider.getModuleType()).thenReturn(MODULE_TYPE);
+
+        mMenu =
+                mManager.getListMenu(
+                        mView, mModuleProvider, mModuleDelegate, mDismissPopupWindowRunnable);
+
+        mManager.setPopupWindowForTesting(mPopupWindow);
     }
 
     @Test
     @SmallTest
-    public void testOnMenuItemClick() {
-        doReturn(ContextMenuItemId.HIDE_MODULE).when(mMenuItem).getItemId();
-        mManager.onMenuItemClickImpl(mMenuItem, mModuleProvider);
-        verify(mModuleDelegate).removeModuleAndDisable(eq(mModuleType));
+    public void testDisplayMenu() {
+        View view =
+                LayoutInflater.from(mContext).inflate(R.layout.educational_tip_module_layout, null);
 
-        doReturn(ContextMenuItemId.SHOW_CUSTOMIZE_SETTINGS).when(mMenuItem).getItemId();
-        mManager.onMenuItemClickImpl(mMenuItem, mModuleProvider);
+        // Verifies notifyContextMenuShown(moduleProvider) is called
+        HistogramWatcher histogramWatcher =
+                HistogramWatcher.newBuilder()
+                        .expectIntRecord(
+                                "MagicStack.Clank.NewTabPage.ContextMenu.ShownV2", MODULE_TYPE)
+                        .build();
+
+        mManager.displayMenu(view, mModuleProvider);
+
+        histogramWatcher.assertExpected();
+        verify(mModuleProvider).onContextMenuCreated();
+    }
+
+    @Test
+    @SmallTest
+    public void testGetListMenuContent() {
+        // Obtains the first and second list views created by mManager.getListMenu().
+        View listItemView1 = mMenu.getAdapterForTesting().getView(0, null, mMenu.getListView());
+        View listItemView2 = mMenu.getAdapterForTesting().getView(1, null, mMenu.getListView());
+        String listItemText1 =
+                ((TextView) listItemView1.findViewById(R.id.menu_item_text)).getText().toString();
+        String listItemText2 =
+                ((TextView) listItemView2.findViewById(R.id.menu_item_text)).getText().toString();
+
+        // Verifies if the texts inside views are expected.
+        assertEquals(listItemText1, EXPECTED_OPTION_1);
+        assertEquals(listItemText2, EXPECTED_OPTION_2);
+    }
+
+    @Test
+    @SmallTest
+    public void testGetListMenuDelegation() {
+        // Verifies the magic stack module is removed, the action is recorded in the histogram and
+        // the popup window is dismissed at the end of the clicking the first option.
+        HistogramWatcher histogramWatcher =
+                HistogramWatcher.newBuilder()
+                        .expectIntRecord(
+                                "MagicStack.Clank.NewTabPage.ContextMenu.RemoveModuleV2",
+                                MODULE_TYPE)
+                        .build();
+
+        mMenu.onItemClick(null, null, 0, 0);
+
+        histogramWatcher.assertExpected();
+        verify(mModuleDelegate).removeModuleAndDisable(eq(MODULE_TYPE));
+        verify(mDismissPopupWindowRunnable).run();
+        reset(mDismissPopupWindowRunnable);
+
+        // Verifies the customize setting page is opened, this action is recorded and the pop window
+        // is dismissed at the end of the clicking the second option.
+        histogramWatcher =
+                HistogramWatcher.newBuilder()
+                        .expectIntRecord(
+                                "MagicStack.Clank.NewTabPage.ContextMenu.OpenCustomizeSettings",
+                                MODULE_TYPE)
+                        .build();
+
+        mMenu.onItemClick(null, null, 1, 0);
+
+        histogramWatcher.assertExpected();
         verify(mModuleDelegate).customizeSettings();
+        verify(mDismissPopupWindowRunnable).run();
+    }
+
+    @Test
+    @SmallTest
+    public void testDismissPopupWindow() {
+        mManager.dismissPopupWindow();
+        verify(mPopupWindow).dismiss();
+    }
+
+    @Test
+    @SmallTest
+    public void testShowContextMenu() {
+        mManager.showContextMenu(mMenu, mView);
+
+        // Verifies that all necessary attributes of the popWindow are set.
+        verify(mPopupWindow).setLayoutObserver(mLayoutObserverCaptor.capture());
+        mLayoutObserverCaptor.getValue().onPreLayoutChange(true, 1, 1, 1, 1, new Rect(1, 2, 3, 4));
+        verify(mPopupWindow).setAnimationStyle(R.style.StartIconMenuAnim);
+        verify(mPopupWindow).setVerticalOverlapAnchor(eq(true));
+        verify(mPopupWindow).setFocusable(eq(true));
+        verify(mPopupWindow).setOutsideTouchable(eq(true));
+        verify(mPopupWindow)
+                .setPreferredHorizontalOrientation(
+                        eq(AnchoredPopupWindow.HorizontalOrientation.CENTER));
+        verify(mPopupWindow).setPreferredVerticalOrientation(eq(VerticalOrientation.BELOW));
+        verify(mPopupWindow).show();
+    }
+
+    @Test
+    @SmallTest
+    public void testShowContextMenuWithShortMenuItem() {
+        int leftPadding = 10;
+        int rightPadding = 8;
+        BasicListMenu menu = setMenuData(leftPadding, rightPadding, 5, 100);
+
+        mManager.showContextMenu(menu, mView);
+
+        // Verifies that the width of the popup window is the width of the longest item on the menu
+        // plus paddings
+        verify(mPopupWindow)
+                .setDesiredContentWidth(eq(menu.getMaxItemWidth() + leftPadding + rightPadding));
+    }
+
+    @Test
+    @SmallTest
+    public void testShowContextMenuWithLongMenuItem() {
+        int viewWidth = 100;
+        BasicListMenu menu = setMenuData(10, 8, 100, viewWidth);
+        mManager.showContextMenu(menu, mView);
+
+        // Verifies that the width of the popup window is the width of the magic stack module
+        // clicked
+        verify(mPopupWindow).setDesiredContentWidth(eq(viewWidth));
     }
 
     @Test
@@ -86,32 +216,52 @@
         assertTrue(mManager.shouldShowItem(ContextMenuItemId.HIDE_MODULE, mModuleProvider));
 
         // Cases for a customized menu item.
-        doReturn(false).when(mModuleProvider).isContextMenuItemSupported(2);
+        when(mModuleProvider.isContextMenuItemSupported(2)).thenReturn(false);
         assertFalse(mManager.shouldShowItem(2, mModuleProvider));
 
-        doReturn(true).when(mModuleProvider).isContextMenuItemSupported(2);
+        when(mModuleProvider.isContextMenuItemSupported(2)).thenReturn(true);
         assertTrue(mManager.shouldShowItem(2, mModuleProvider));
     }
 
     @Test
     @SmallTest
-    public void testCreateContextMenu() {
-        MenuItem menuItem1 = Mockito.mock(MenuItem.class);
-        doReturn(menuItem1)
-                .when(mContextMenu)
-                .add(
-                        eq(Menu.NONE),
-                        eq(ContextMenuItemId.SHOW_CUSTOMIZE_SETTINGS),
-                        eq(Menu.NONE),
-                        anyInt());
-        MenuItem menuItem2 = Mockito.mock(MenuItem.class);
-        when(mContextMenu.add(anyString())).thenReturn(menuItem2);
+    public void testGetAnchorRectangle() {
+        int width = 440;
+        int height = 897;
+        int locationHorizontal = 1808;
+        int locationVertical = 32423;
 
-        mManager.createContextMenu(mContextMenu, mView, mModuleProvider);
+        doAnswer(
+                        invocation -> {
+                            int[] list = invocation.getArgument(0);
+                            list[0] = locationHorizontal;
+                            list[1] = locationVertical;
+                            return null;
+                        })
+                .when(mView)
+                .getLocationOnScreen(any(int[].class));
+        when(mView.getWidth()).thenReturn(width);
+        when(mView.getHeight()).thenReturn(height);
 
-        // Verifies context menu items SHOW_CUSTOMIZE_SETTINGS and HIDE_MODULE are shown.
-        verify(menuItem1).setOnMenuItemClickListener(any());
-        verify(menuItem2).setOnMenuItemClickListener(any());
-        verify(mModuleProvider).onContextMenuCreated();
+        Rect anchorRect = mManager.getAnchorRectangle(mView);
+
+        assertEquals(anchorRect.left, locationHorizontal);
+        assertEquals(anchorRect.right, locationHorizontal + width);
+        assertEquals(anchorRect.top, locationVertical + height / 4);
+        assertEquals(anchorRect.bottom, locationVertical + height / 4 + height);
+    }
+
+    private BasicListMenu setMenuData(
+            int leftPadding, int rightPadding, int maxWidth, int viewWidth) {
+        View contentView = mock(View.class);
+        BasicListMenu menu = mock(BasicListMenu.class);
+
+        when(menu.getContentView()).thenReturn(contentView);
+        when(contentView.getPaddingLeft()).thenReturn(leftPadding);
+        when(contentView.getPaddingRight()).thenReturn(rightPadding);
+        when(menu.getMaxItemWidth()).thenReturn(maxWidth);
+        when(mView.getWidth()).thenReturn(viewWidth);
+
+        return menu;
     }
 }
diff --git a/chrome/browser/magic_stack/android/junit/src/org/chromium/chrome/browser/magic_stack/HomeModulesCoordinatorUnitTest.java b/chrome/browser/magic_stack/android/junit/src/org/chromium/chrome/browser/magic_stack/HomeModulesCoordinatorUnitTest.java
index 11e30b3..ca52789 100644
--- a/chrome/browser/magic_stack/android/junit/src/org/chromium/chrome/browser/magic_stack/HomeModulesCoordinatorUnitTest.java
+++ b/chrome/browser/magic_stack/android/junit/src/org/chromium/chrome/browser/magic_stack/HomeModulesCoordinatorUnitTest.java
@@ -11,6 +11,7 @@
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.ArgumentMatchers.notNull;
+import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
@@ -25,6 +26,8 @@
 import android.content.res.Resources;
 import android.graphics.Color;
 import android.util.DisplayMetrics;
+import android.view.View.OnCreateContextMenuListener;
+import android.view.View.OnLongClickListener;
 import android.view.ViewGroup;
 import android.view.ViewGroup.LayoutParams;
 
@@ -111,6 +114,7 @@
     @Captor private ArgumentCaptor<Callback<Profile>> mProfileObserver;
     @Captor private ArgumentCaptor<RecyclerView.OnScrollListener> mOnScrollListener;
     @Captor private ArgumentCaptor<Callback<ClassificationResult>> mClassificationResultCaptor;
+    @Captor private ArgumentCaptor<OnLongClickListener> mLongClickListenerArgumentCaptor;
 
     @Captor
     private ArgumentCaptor<HomeModulesConfigManager.HomeModulesStateListener>
@@ -362,6 +366,24 @@
         verify(mMediator).onModuleClicked(eq(ModuleType.SINGLE_TAB));
     }
 
+    @Test
+    @SmallTest
+    public void testOnLongClick() {
+        HomeModulesContextMenuManager mHomeModulesContextMenuManager = mock();
+        mCoordinator = createCoordinator(/* skipInitProfile= */ true);
+        mCoordinator.setMediatorForTesting(mMediator);
+        mCoordinator.setHomeModulesContextMenuManagerForTesting(mHomeModulesContextMenuManager);
+        when(mMediator.getModuleProvider(ModuleType.SINGLE_TAB)).thenReturn(mModuleProvider);
+        when(mView.getLayoutParams()).thenReturn(mLayoutParams);
+
+        mCoordinator.onViewCreated(ModuleType.SINGLE_TAB, mView);
+        verify(mView).setOnLongClickListener(mLongClickListenerArgumentCaptor.capture());
+        mLongClickListenerArgumentCaptor.getValue().onLongClick(mView);
+        verify(mHomeModulesContextMenuManager).displayMenu(mView, mModuleProvider);
+        verify(mView, never())
+                .setOnCreateContextMenuListener(any(OnCreateContextMenuListener.class));
+    }
+
     private void setupAndVerifyTablets() {
         when(mResources.getInteger(org.chromium.ui.R.integer.min_screen_width_bucket))
                 .thenReturn(DeviceFormFactor.SCREEN_BUCKET_TABLET);
diff --git a/chrome/browser/media/unified_autoplay_browsertest.cc b/chrome/browser/media/unified_autoplay_browsertest.cc
index 5112b3d..20cc612 100644
--- a/chrome/browser/media/unified_autoplay_browsertest.cc
+++ b/chrome/browser/media/unified_autoplay_browsertest.cc
@@ -41,10 +41,12 @@
   ChromeContentBrowserClientOverrideWebAppScope() = default;
   ~ChromeContentBrowserClientOverrideWebAppScope() override = default;
 
-  void OverrideWebkitPrefs(
+  void OverrideWebPreferences(
       content::WebContents* web_contents,
+      content::SiteInstance& main_frame_site,
       blink::web_pref::WebPreferences* web_prefs) override {
-    ChromeContentBrowserClient::OverrideWebkitPrefs(web_contents, web_prefs);
+    ChromeContentBrowserClient::OverrideWebPreferences(
+        web_contents, main_frame_site, web_prefs);
 
     web_prefs->web_app_scope = web_app_scope_;
   }
diff --git a/chrome/browser/net/chrome_network_delegate.cc b/chrome/browser/net/chrome_network_delegate.cc
index acb4fe0c5..652c041 100644
--- a/chrome/browser/net/chrome_network_delegate.cc
+++ b/chrome/browser/net/chrome_network_delegate.cc
@@ -10,16 +10,12 @@
 #include "build/chromeos_buildflags.h"
 
 #if BUILDFLAG(IS_CHROMEOS)
-#include <fnmatch.h>
+#include "ash/constants/ambient_time_of_day_constants.h"
 #include "base/files/file_util.h"
 #include "base/system/sys_info.h"
 #include "chrome/common/chrome_paths.h"
 #endif
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-#include "ash/constants/ambient_time_of_day_constants.h"
-#endif
-
 #if BUILDFLAG(IS_ANDROID)
 #include "base/android/build_info.h"
 #include "base/android/path_utils.h"
@@ -45,13 +41,6 @@
 #endif
 
 #if BUILDFLAG(IS_CHROMEOS)
-bool IsLacrosLogFile(const base::FilePath& path) {
-  return (fnmatch("/home/chronos/user/lacros/lacros*.log", path.value().c_str(),
-                  FNM_NOESCAPE) == 0) ||
-         (fnmatch("/var/log/lacros/lacros*.log", path.value().c_str(),
-                  FNM_NOESCAPE) == 0);
-}
-
 // Returns true if access is allowed for |path| for a user with |profile_path).
 bool IsAccessAllowedChromeOS(const base::FilePath& path,
                              const base::FilePath& profile_path) {
@@ -66,16 +55,12 @@
     }
   }
 
-  if (IsLacrosLogFile(path))
-    return true;
-
   // Use an allowlist to only allow access to files residing in the list of
   // directories below.
   static const base::FilePath::CharType* const kLocalAccessAllowList[] = {
       "/home/chronos/user/MyFiles",
       "/home/chronos/user/WebRTC Logs",
       "/home/chronos/user/google-assistant-library/log",
-      "/home/chronos/user/lacros/Crash Reports",
       "/home/chronos/user/log",
       "/home/chronos/user/crostini.icons",
       "/media",
@@ -92,7 +77,6 @@
   if (base::PathService::Get(base::DIR_TEMP, &temp_dir))
     allowlist.push_back(temp_dir);
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
   // The actual location of "/home/chronos/user/Xyz" is the Xyz directory under
   // the profile path ("/home/chronos/user' is a hard link to current primary
   // logged in profile.) For the support of multi-profile sessions, we are
@@ -114,24 +98,6 @@
   // specifically contains assets required for one of ash's screen saver themes.
   allowlist.push_back(
       base::FilePath("/run/imageloader").Append(ash::kTimeOfDayDlcId));
-#else
-  // Lacros uses the system-level documents directory and downloads directory
-  // under /home/chronos/u-<hash>, which are provided via PathService. Since
-  // they are system-level, they are not subdirectories of |profile_path|.
-  // PathService also provides valid paths for developers using the
-  // linux-chromeos emulator.
-  base::FilePath documents_dir;
-  if (base::PathService::Get(chrome::DIR_USER_DOCUMENTS, &documents_dir))
-    allowlist.push_back(documents_dir);
-
-  base::FilePath downloads_dir;
-  if (base::PathService::Get(chrome::DIR_DEFAULT_DOWNLOADS, &downloads_dir))
-    allowlist.push_back(downloads_dir);
-
-  // Lacros can access WebRTC logs under its browser profile directories.
-  if (!profile_path.empty())
-    allowlist.push_back(profile_path.AppendASCII("WebRTC Logs"));
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
   return IsPathOnAllowlist(path, allowlist);
 }
diff --git a/chrome/browser/net/chrome_network_delegate_unittest.cc b/chrome/browser/net/chrome_network_delegate_unittest.cc
index af9069b..15ebaf4 100644
--- a/chrome/browser/net/chrome_network_delegate_unittest.cc
+++ b/chrome/browser/net/chrome_network_delegate_unittest.cc
@@ -57,7 +57,6 @@
   EXPECT_TRUE(IsAccessAllowed("/home/chronos/user/WebRTC Logs", ""));
   EXPECT_TRUE(
       IsAccessAllowed("/home/chronos/user/google-assistant-library/log", ""));
-  EXPECT_TRUE(IsAccessAllowed("/home/chronos/user/lacros/lacros.log", ""));
   EXPECT_TRUE(IsAccessAllowed("/home/chronos/user/log", ""));
   EXPECT_TRUE(IsAccessAllowed("/media", ""));
   EXPECT_TRUE(IsAccessAllowed("/opt/oem", ""));
@@ -78,8 +77,8 @@
   EXPECT_FALSE(IsAccessAllowed("/home/chronos/user/lacros", ""));
   EXPECT_FALSE(
       IsAccessAllowed("/home/chronos/user/lacros/subdir/lacros.log", ""));
+  EXPECT_FALSE(IsAccessAllowed("/home/chronos/user/lacros/lacros.log", ""));
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
   // If profile path is given, the following additional paths are allowed.
   EXPECT_TRUE(IsAccessAllowed("/profile/MyFiles/Downloads", "/profile"));
   EXPECT_TRUE(IsAccessAllowed("/profile/MyFiles", "/profile"));
@@ -94,17 +93,6 @@
     base::test::ScopedRunningOnChromeOS running_on_chromeos;
     EXPECT_FALSE(IsAccessAllowed(downloads_dir.AsUTF8Unsafe(), ""));
   }
-#endif
-
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  // System level documents and downloads directories are allowed.
-  base::FilePath documents_dir;
-  base::PathService::Get(chrome::DIR_USER_DOCUMENTS, &documents_dir);
-  EXPECT_TRUE(IsAccessAllowed(documents_dir.AsUTF8Unsafe(), ""));
-  base::FilePath downloads_dir;
-  base::PathService::Get(chrome::DIR_DEFAULT_DOWNLOADS, &downloads_dir);
-  EXPECT_TRUE(IsAccessAllowed(downloads_dir.AsUTF8Unsafe(), ""));
-#endif
 
   // WebRTC logs for the current profile are allowed.
   EXPECT_TRUE(IsAccessAllowed("/profile/WebRTC Logs", "/profile"));
diff --git a/chrome/browser/net/default_dns_over_https_config_source.cc b/chrome/browser/net/default_dns_over_https_config_source.cc
index ab84586..258250a 100644
--- a/chrome/browser/net/default_dns_over_https_config_source.cc
+++ b/chrome/browser/net/default_dns_over_https_config_source.cc
@@ -47,13 +47,8 @@
 }
 
 std::string DefaultDnsOverHttpsConfigSource::GetDnsOverHttpsTemplates() const {
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  return pref_change_registrar_.prefs()->GetString(
-      prefs::kDnsOverHttpsEffectiveTemplatesChromeOS);
-#else
   return pref_change_registrar_.prefs()->GetString(
       prefs::kDnsOverHttpsTemplates);
-#endif
 }
 
 bool DefaultDnsOverHttpsConfigSource::IsConfigManaged() const {
@@ -66,10 +61,5 @@
     base::RepeatingClosure callback) {
   CHECK(pref_change_registrar_.IsEmpty());
   pref_change_registrar_.Add(prefs::kDnsOverHttpsMode, callback);
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  pref_change_registrar_.Add(prefs::kDnsOverHttpsEffectiveTemplatesChromeOS,
-                             callback);
-#else
   pref_change_registrar_.Add(prefs::kDnsOverHttpsTemplates, callback);
-#endif
 }
diff --git a/chrome/browser/net/dns_probe_browsertest.cc b/chrome/browser/net/dns_probe_browsertest.cc
index b74167d5..d3c42c0 100644
--- a/chrome/browser/net/dns_probe_browsertest.cc
+++ b/chrome/browser/net/dns_probe_browsertest.cc
@@ -433,11 +433,11 @@
 
     // Update prefs to enable Secure DNS in secure mode.
     PrefService* pref_service = g_browser_process->local_state();
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
     // On Chrome OS, the local_state is shared between all users so the user-set
     // pref is stored in the profile's pref service.
     pref_service = browser()->profile()->GetPrefs();
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
     pref_service->SetString(prefs::kDnsOverHttpsMode,
                             SecureDnsConfig::kModeSecure);
     pref_service->SetString(prefs::kDnsOverHttpsTemplates,
diff --git a/chrome/browser/net/errorpage_browsertest.cc b/chrome/browser/net/errorpage_browsertest.cc
index a48129e..0e01ba3 100644
--- a/chrome/browser/net/errorpage_browsertest.cc
+++ b/chrome/browser/net/errorpage_browsertest.cc
@@ -79,11 +79,11 @@
 #include "services/network/public/cpp/features.h"
 #include "ui/base/l10n/l10n_util.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "ash/constants/ash_features.h"
 #include "chrome/browser/ash/system_web_apps/test_support/system_web_app_browsertest_base.h"  // nogncheck
 #include "chrome/browser/ui/ash/system_web_apps/system_web_app_ui_utils.h"  // nogncheck
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 using content::BrowserThread;
 using content::NavigationController;
@@ -488,9 +488,7 @@
 // This test fails regularly on win_rel trybots. See crbug.com/121540
 //
 // This fails on linux_aura bringup: http://crbug.com/163931
-#if BUILDFLAG(IS_WIN) ||                                       \
-    ((BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)) && \
-     defined(USE_AURA))
+#if BUILDFLAG(IS_WIN) || (BUILDFLAG(IS_LINUX) && defined(USE_AURA))
 #define MAYBE_IFrameDNSError_GoBackAndForward DISABLED_IFrameDNSError_GoBackAndForward
 #else
 #define MAYBE_IFrameDNSError_GoBackAndForward IFrameDNSError_GoBackAndForward
@@ -1072,7 +1070,7 @@
   ExpectDisplayingErrorPage(browser(), net::ERR_INVALID_RESPONSE);
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 // For ChromeOS, launches appropriate diagnostics app.
 void ClickDiagnosticsLink(Browser* browser) {
   DCHECK(IsDisplayingDiagnosticsLink(browser));
@@ -1082,9 +1080,7 @@
 }
 
 // On ChromeOS "Running Connectivity Diagnostics" link on error page should
-// launch chrome://diagnostics/?connectivity app by default. Not running test on
-// LaCROS due to errors on Wayland initialization and to keep test to ChromeOS
-// devices.
+// launch chrome://diagnostics/?connectivity app by default.
 using ErrorPageOfflineAppLaunchTest = ash::SystemWebAppBrowserTestBase;
 
 IN_PROC_BROWSER_TEST_F(ErrorPageOfflineAppLaunchTest, DiagnosticsConnectivity) {
@@ -1107,6 +1103,6 @@
       ::chrome::FindLastActive()->tab_strip_model()->GetActiveWebContents();
   EXPECT_EQ(expected_url, contents->GetVisibleURL());
 }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 }  // namespace
diff --git a/chrome/browser/net/net_error_diagnostics_dialog_lacros.cc b/chrome/browser/net/net_error_diagnostics_dialog_lacros.cc
deleted file mode 100644
index a0315b9..0000000
--- a/chrome/browser/net/net_error_diagnostics_dialog_lacros.cc
+++ /dev/null
@@ -1,23 +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 "chrome/browser/net/net_error_diagnostics_dialog.h"
-
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/ui/chrome_pages.h"
-#include "content/public/browser/web_contents.h"
-
-bool CanShowNetworkDiagnosticsDialog(content::WebContents* web_contents) {
-  // The ChromeOS network diagnostics dialog can be shown in incognito and guest
-  // profiles since it does not log the referring URL.
-  return true;
-}
-
-void ShowNetworkDiagnosticsDialog(content::WebContents* web_contents,
-                                  const std::string& failed_url) {
-  Profile* profile =
-      Profile::FromBrowserContext(web_contents->GetBrowserContext());
-
-  chrome::ShowConnectivityDiagnosticsApp(profile);
-}
diff --git a/chrome/browser/net/net_error_tab_helper.cc b/chrome/browser/net/net_error_tab_helper.cc
index 6242672..546ed04 100644
--- a/chrome/browser/net/net_error_tab_helper.cc
+++ b/chrome/browser/net/net_error_tab_helper.cc
@@ -31,7 +31,7 @@
 #include "components/offline_pages/core/client_namespace_constants.h"
 #endif  // BUILDFLAG(ENABLE_OFFLINE_PAGES)
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "ash/constants/ash_features.h"
 #include "chrome/browser/ui/ash/network/network_portal_signin_controller.h"
 #endif
@@ -165,11 +165,8 @@
 
 #if BUILDFLAG(IS_CHROMEOS)
 void NetErrorTabHelper::ShowPortalSignin() {
-  // TODO(b/247618374): Lacros implementation.
-#if BUILDFLAG(IS_CHROMEOS_ASH)
   ash::NetworkPortalSigninController::Get()->ShowSignin(
       ash::NetworkPortalSigninController::SigninSource::kErrorPage);
-#endif
 }
 #endif
 
diff --git a/chrome/browser/net/net_error_tab_helper_browsertest.cc b/chrome/browser/net/net_error_tab_helper_browsertest.cc
index 68c7d514..2a0afc9 100644
--- a/chrome/browser/net/net_error_tab_helper_browsertest.cc
+++ b/chrome/browser/net/net_error_tab_helper_browsertest.cc
@@ -250,7 +250,7 @@
   EvalJsResult result =
       EvalJs(inner_fenced_frame_rfh, kSearchingForDiagnosisScript);
   ASSERT_TRUE(result.error.empty());
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // ChromeOS has its own diagnostics extension, which doesn't rely on a
   // browser-initiated dialog.
   EXPECT_EQ("FOUND", result.ExtractString());
diff --git a/chrome/browser/net/network_connection_tracker_browsertest.cc b/chrome/browser/net/network_connection_tracker_browsertest.cc
index 827d44f..e1e4e43 100644
--- a/chrome/browser/net/network_connection_tracker_browsertest.cc
+++ b/chrome/browser/net/network_connection_tracker_browsertest.cc
@@ -118,7 +118,7 @@
   // NetworkService on ChromeOS doesn't yet have a NetworkChangeManager
   // implementation. OSX uses a separate binary for service processes and
   // browser test fixture doesn't have NetworkServiceTest mojo code.
-#if !BUILDFLAG(IS_CHROMEOS_ASH) && !BUILDFLAG(IS_MAC)
+#if !BUILDFLAG(IS_CHROMEOS) && !BUILDFLAG(IS_MAC)
   network::NetworkConnectionTracker* tracker =
       content::GetNetworkConnectionTracker();
   EXPECT_NE(nullptr, tracker);
@@ -153,7 +153,7 @@
   // NetworkService on ChromeOS doesn't yet have a NetworkChangeManager
   // implementation. OSX uses a separate binary for service processes and
   // browser test fixture doesn't have NetworkServiceTest mojo code.
-#if !BUILDFLAG(IS_CHROMEOS_ASH) && !BUILDFLAG(IS_MAC)
+#if !BUILDFLAG(IS_CHROMEOS) && !BUILDFLAG(IS_MAC)
   // Out-of-process network service is not enabled, so network service's crash
   // and restart aren't applicable.
   if (!content::IsOutOfProcessNetworkService())
diff --git a/chrome/browser/net/network_context_configuration_browsertest.cc b/chrome/browser/net/network_context_configuration_browsertest.cc
index 0be09e9..c9add99 100644
--- a/chrome/browser/net/network_context_configuration_browsertest.cc
+++ b/chrome/browser/net/network_context_configuration_browsertest.cc
@@ -279,7 +279,7 @@
       incognito_ = CreateIncognitoBrowser();
     SimulateNetworkServiceCrashIfNecessary();
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
     // On ChromeOS the connection type comes from a fake Shill service, which
     // is configured with a fake ethernet connection asynchronously. Wait for
     // the connection type to be available to avoid getting notified of the
diff --git a/chrome/browser/net/nss_service.h b/chrome/browser/net/nss_service.h
index 902a7075..6f6cc54 100644
--- a/chrome/browser/net/nss_service.h
+++ b/chrome/browser/net/nss_service.h
@@ -62,15 +62,13 @@
       base::OnceCallback<void(net::NSSCertDatabase*)> callback);
 
  private:
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // Owns and manages access to the net::NSSCertDatabaseChromeOS.
   class NSSCertDatabaseChromeOSManager;
 
   // Created on the UI thread, but after that, initialized, accessed, and
   // destroyed exclusively on the IO thread.
   std::unique_ptr<NSSCertDatabaseChromeOSManager> nss_cert_database_manager_;
-#elif BUILDFLAG(IS_CHROMEOS_LACROS)
-  raw_ptr<content::BrowserContext> context_;
 #endif
 };
 
diff --git a/chrome/browser/net/nss_service_factory.cc b/chrome/browser/net/nss_service_factory.cc
index 7f56632..9b8941e8 100644
--- a/chrome/browser/net/nss_service_factory.cc
+++ b/chrome/browser/net/nss_service_factory.cc
@@ -8,10 +8,6 @@
 #include "build/chromeos_buildflags.h"
 #include "chrome/browser/net/nss_service.h"
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-#include "chrome/browser/lacros/cert/cert_db_initializer_factory.h"
-#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
-
 NssService* NssServiceFactory::GetForContext(
     content::BrowserContext* browser_context) {
   return static_cast<NssService*>(
@@ -31,9 +27,6 @@
               // Ash Internals.
               .WithAshInternals(ProfileSelection::kOwnInstance)
               .Build()) {
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  DependsOn(CertDbInitializerFactory::GetInstance());
-#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
 }
 
 NssServiceFactory::~NssServiceFactory() = default;
diff --git a/chrome/browser/net/nss_service_lacros.cc b/chrome/browser/net/nss_service_lacros.cc
deleted file mode 100644
index 514e6f4..0000000
--- a/chrome/browser/net/nss_service_lacros.cc
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright 2021 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/net/nss_service.h"
-
-#include "chrome/browser/lacros/cert/cert_db_initializer.h"
-#include "chrome/browser/lacros/cert/cert_db_initializer_factory.h"
-#include "content/public/browser/browser_thread.h"
-
-NssService::NssService(content::BrowserContext* context) : context_(context) {}
-
-NssService::~NssService() = default;
-
-NssCertDatabaseGetter NssService::CreateNSSCertDatabaseGetterForIOThread() {
-  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
-  return CertDbInitializerFactory::GetForBrowserContext(context_)
-      ->CreateNssCertDatabaseGetterForIOThread();
-}
diff --git a/chrome/browser/net/profile_network_context_service.cc b/chrome/browser/net/profile_network_context_service.cc
index 0093645..810eee8 100644
--- a/chrome/browser/net/profile_network_context_service.cc
+++ b/chrome/browser/net/profile_network_context_service.cc
@@ -8,7 +8,6 @@
 #include <string>
 #include <string_view>
 
-#include "ash/constants/ash_features.h"
 #include "base/base64.h"
 #include "base/check_op.h"
 #include "base/command_line.h"
@@ -99,25 +98,23 @@
 #include "third_party/blink/public/common/features.h"
 
 #if BUILDFLAG(IS_CHROMEOS)
-#include "chrome/browser/certificate_provider/certificate_provider.h"
-#include "chrome/browser/certificate_provider/certificate_provider_service.h"
-#include "chrome/browser/certificate_provider/certificate_provider_service_factory.h"
-#include "chrome/browser/policy/networking/policy_cert_service.h"
-#include "chrome/browser/policy/networking/policy_cert_service_factory.h"
-#include "chromeos/components/kiosk/kiosk_utils.h"
-#include "chromeos/constants/chromeos_features.h"
-#include "net/cert/x509_util.h"
-#endif
-
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#include "ash/constants/ash_features.h"
 #include "ash/constants/ash_switches.h"
 #include "chrome/browser/ash/kcer/kcer_factory_ash.h"
 #include "chrome/browser/ash/net/client_cert_store_ash.h"
 #include "chrome/browser/ash/net/client_cert_store_kcer.h"
 #include "chrome/browser/ash/profiles/profile_helper.h"
+#include "chrome/browser/certificate_provider/certificate_provider.h"
+#include "chrome/browser/certificate_provider/certificate_provider_service.h"
+#include "chrome/browser/certificate_provider/certificate_provider_service_factory.h"
+#include "chrome/browser/policy/networking/policy_cert_service.h"
+#include "chrome/browser/policy/networking/policy_cert_service_factory.h"
 #include "chrome/browser/policy/profile_policy_connector.h"
+#include "chromeos/components/kiosk/kiosk_utils.h"
+#include "chromeos/constants/chromeos_features.h"
 #include "components/user_manager/user.h"
 #include "components/user_manager/user_manager.h"
+#include "net/cert/x509_util.h"
 #endif
 
 #if BUILDFLAG(USE_NSS_CERTS)
@@ -137,14 +134,6 @@
 #include "extensions/common/constants.h"
 #endif
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-#include "base/check_is_test.h"
-#include "chrome/browser/lacros/cert/cert_db_initializer_factory.h"
-#include "chrome/browser/lacros/cert/client_cert_store_lacros.h"
-#include "chrome/browser/profiles/incognito_helpers.h"
-#include "chromeos/startup/browser_params_proxy.h"
-#endif
-
 #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
 #include "chrome/browser/enterprise/client_certificates/certificate_provisioning_service_factory.h"
 #include "components/enterprise/client_certificates/core/certificate_provisioning_service.h"
@@ -1084,7 +1073,7 @@
   g_discard_domain_reliability_uploads_for_testing = new bool(value);
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 void ProfileNetworkContextService::CreateClientCertIssuerSourcesWithDBCerts(
     net::ClientCertIssuerSourceGetterCallback callback,
     std::vector<net::ServerCertificateDatabase::CertInformation>
@@ -1165,7 +1154,7 @@
   }
 #endif
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   bool use_system_key_slot = false;
   // Enable client certificates for the Chrome OS sign-in frame, if this feature
   // is not disabled by a flag.
@@ -1207,23 +1196,6 @@
       std::make_unique<net::ClientCertStoreNSS>(
           base::BindRepeating(&CreateCryptoModuleBlockingPasswordDelegate,
                               kCryptoModulePasswordClientAuth));
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-
-  if (!Profile::FromBrowserContext(
-           GetBrowserContextRedirectedInIncognito(profile_))
-           ->IsMainProfile()) {
-    // TODO(crbug.com/40156976): At the moment client certs are only enabled for
-    // the main profile and its incognito profile (similarly to how it worked in
-    // Ash-Chrome). Return some cert store for secondary profiles in
-    // Lacros-Chrome when certs are supported there.
-    return nullptr;
-  }
-
-  CertDbInitializer* cert_db_initializer =
-      CertDbInitializerFactory::GetForBrowserContext(profile_);
-  store = std::make_unique<ClientCertStoreLacros>(
-      std::move(certificate_provider), cert_db_initializer, std::move(store));
-#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
 #if BUILDFLAG(IS_LINUX)
   return GetWrappedCertStore(profile_, std::move(store));
 #else
@@ -1464,42 +1436,7 @@
                   metrics::prefs::kMetricsReportingEnabled);
   }
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  // Configure cert verifier to use the same software NSS database as Chrome is
-  // currently using (secondary profiles don't have their own databases at the
-  // moment).
-  cert_verifier_creation_params->nss_full_path.reset();
-  if (profile_->IsMainProfile()) {
-    const crosapi::mojom::DefaultPathsPtr& default_paths =
-        chromeos::BrowserParamsProxy::Get()->DefaultPaths();
-    // `default_paths` can be nullptr in tests.
-    if (!default_paths) {
-      CHECK_IS_TEST();
-    }
-    // Populating `nss_full_path` will make cert verifier load
-    // and use the corresponding NSS public slot. Kiosk sessions don't have
-    // the UI that could result in interactions with the public slot. Kiosk
-    // users are also not owner users and can't have the owner key in the
-    // public slot. Leaving it empty will make cert verifier ignore the
-    // public slot. This is done mainly because Chrome sometimes fails to
-    // load the public slot and has to crash because of that.
-    if (default_paths && default_paths->user_nss_database.has_value() &&
-        !chromeos::IsKioskSession()) {
-      cert_verifier_creation_params->nss_full_path =
-          default_paths->user_nss_database.value();
-    }
-  }
-
-  const policy::PolicyCertService* policy_cert_service =
-      policy::PolicyCertServiceFactory::GetForProfile(profile_);
-  if (policy_cert_service && !policy_cert_service->IsObservingCertChanges()) {
-    policy_cert_service->StartObservingCertChanges(base::BindRepeating(
-        &ProfileNetworkContextService::UpdateAdditionalCertificates,
-        weak_ptr_factory_.GetWeakPtr()));
-  }
-#endif
-
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   bool profile_supports_policy_certs = false;
   if (ash::ProfileHelper::IsSigninProfile(profile_) ||
       ash::ProfileHelper::IsLockScreenProfile(profile_)) {
diff --git a/chrome/browser/net/profile_network_context_service.h b/chrome/browser/net/profile_network_context_service.h
index d5dc94d..89f7443 100644
--- a/chrome/browser/net/profile_network_context_service.h
+++ b/chrome/browser/net/profile_network_context_service.h
@@ -135,7 +135,7 @@
   // Get platform ClientCertStore. May return nullptr.
   std::unique_ptr<net::ClientCertStore> CreateClientCertStore();
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // Returns a factory callback that may be run to get the issuer sources for
   // client cert pathbuilding. The factory callback may run its result callback
   // either synchronously or asynchronously.
@@ -190,7 +190,7 @@
   void UpdateAdditionalCertificatesWithUserAddedCerts(
       std::vector<net::ServerCertificateDatabase::CertInformation> cert_infos);
 #endif
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   void CreateClientCertIssuerSources(
       net::ClientCertIssuerSourceGetterCallback callback);
   void CreateClientCertIssuerSourcesWithDBCerts(
diff --git a/chrome/browser/net/profile_network_context_service_browsertest.cc b/chrome/browser/net/profile_network_context_service_browsertest.cc
index f3ce54e..b409762 100644
--- a/chrome/browser/net/profile_network_context_service_browsertest.cc
+++ b/chrome/browser/net/profile_network_context_service_browsertest.cc
@@ -666,7 +666,7 @@
                   policy_value));
 // ChromeOS guest sessions don't have the capability to
 // do ambient authentications.
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
     EXPECT_EQ(
         AmbientAuthenticationTestHelper::IsAmbientAuthAllowedForProfile(
             CreateGuestBrowser()->profile()),
diff --git a/chrome/browser/net/profile_network_context_service_factory.cc b/chrome/browser/net/profile_network_context_service_factory.cc
index 7376d44f..f986cd68 100644
--- a/chrome/browser/net/profile_network_context_service_factory.cc
+++ b/chrome/browser/net/profile_network_context_service_factory.cc
@@ -17,9 +17,6 @@
 
 #if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/policy/networking/policy_cert_service_factory.h"
-#endif
-
-#if BUILDFLAG(IS_CHROMEOS_ASH)
 #include "chrome/browser/certificate_provider/certificate_provider_service_factory.h"
 #endif
 
@@ -66,8 +63,6 @@
 #endif
 #if BUILDFLAG(IS_CHROMEOS)
   DependsOn(policy::PolicyCertServiceFactory::GetInstance());
-#endif
-#if BUILDFLAG(IS_CHROMEOS_ASH)
   DependsOn(chromeos::CertificateProviderServiceFactory::GetInstance());
 #endif
 #if BUILDFLAG(CHROME_ROOT_STORE_CERT_MANAGEMENT_UI)
diff --git a/chrome/browser/net/proxy_browsertest.cc b/chrome/browser/net/proxy_browsertest.cc
index e99a35f5..d922cbb 100644
--- a/chrome/browser/net/proxy_browsertest.cc
+++ b/chrome/browser/net/proxy_browsertest.cc
@@ -40,9 +40,9 @@
 #include "services/network/public/cpp/simple_url_loader.h"
 #include "url/gurl.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/ash/net/dhcp_wpad_url_client.h"
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 namespace {
 
@@ -145,7 +145,7 @@
   VerifyProxyScript(browser());
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 // Tests the use of a PAC script set via Web Proxy Autodiscovery Protocol.
 // TODO(crbug.com/41475031): Add a test case for when DhcpWpadUrlClient
 // returns an empty PAC URL.
@@ -183,7 +183,7 @@
 IN_PROC_BROWSER_TEST_F(WPADHttpProxyScriptBrowserTest, Verify) {
   VerifyProxyScript(browser());
 }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 // Tests the use of a PAC script that rejects requests to
 // https://www.google.com/ when myIpAddress() and myIpAddressEx() appear to be
diff --git a/chrome/browser/net/proxy_config_monitor.cc b/chrome/browser/net/proxy_config_monitor.cc
index ecc6f393..1c1bce34 100644
--- a/chrome/browser/net/proxy_config_monitor.cc
+++ b/chrome/browser/net/proxy_config_monitor.cc
@@ -17,9 +17,9 @@
 #include "mojo/public/cpp/bindings/pending_remote.h"
 #include "services/network/public/mojom/network_context.mojom.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/ash/profiles/profile_helper.h"
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 #if BUILDFLAG(ENABLE_EXTENSIONS)
 #include "chrome/browser/extensions/api/proxy/proxy_api.h"
@@ -37,14 +37,14 @@
 
 // If this is the ChromeOS sign-in or lock screen profile, just create the
 // tracker from global state.
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   if (ash::ProfileHelper::IsSigninProfile(profile) ||
       ash::ProfileHelper::IsLockScreenProfile(profile)) {
     pref_proxy_config_tracker_ =
         ProxyServiceFactory::CreatePrefProxyConfigTrackerOfLocalState(
             g_browser_process->local_state());
   }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
   if (!pref_proxy_config_tracker_) {
     pref_proxy_config_tracker_ =
diff --git a/chrome/browser/net/proxy_service_factory.cc b/chrome/browser/net/proxy_service_factory.cc
index 281a393..d81ff34 100644
--- a/chrome/browser/net/proxy_service_factory.cc
+++ b/chrome/browser/net/proxy_service_factory.cc
@@ -14,13 +14,9 @@
 #include "content/public/browser/browser_thread.h"
 #include "net/proxy_resolution/proxy_config_service.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chromeos/ash/components/network/proxy/proxy_config_service_impl.h"
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
-
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-#include "chrome/browser/lacros/net/proxy_config_service_lacros.h"
-#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 using content::BrowserThread;
 
@@ -36,17 +32,8 @@
 
   std::unique_ptr<net::ProxyConfigService> base_service;
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  // The base service for Lacros observes proxy updates coming from Ash-Chrome
-  // via Mojo. Only created for `tracker` instances associated to a profile;
-  // for`tracker` instances associated to local_state the base_service is
-  // nullptr.
-  if (profile) {
-    base_service =
-        std::make_unique<chromeos::ProxyConfigServiceLacros>(profile);
-  }
-#elif !BUILDFLAG(IS_CHROMEOS_ASH)
-  // On Ash-Chrome, base service is NULL; ash::ProxyConfigServiceImpl
+#if !BUILDFLAG(IS_CHROMEOS)
+  // On ChromeOS, base service is NULL; ash::ProxyConfigServiceImpl
   // determines the effective proxy config to take effect in the network layer,
   // be it from prefs or system (which is network shill on chromeos).
 
@@ -56,7 +43,7 @@
 
   base_service = net::ProxyConfigService::CreateSystemProxyConfigService(
       base::SingleThreadTaskRunner::GetCurrentDefault());
-#endif  // !BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // !BUILDFLAG(IS_CHROMEOS)
 
   return tracker->CreateTrackingProxyConfigService(std::move(base_service));
 }
@@ -66,23 +53,23 @@
 ProxyServiceFactory::CreatePrefProxyConfigTrackerOfProfile(
     PrefService* profile_prefs,
     PrefService* local_state_prefs) {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   return std::make_unique<ash::ProxyConfigServiceImpl>(
       profile_prefs, local_state_prefs, nullptr);
 #else
   return std::make_unique<PrefProxyConfigTrackerImpl>(profile_prefs, nullptr);
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 }
 
 // static
 std::unique_ptr<PrefProxyConfigTracker>
 ProxyServiceFactory::CreatePrefProxyConfigTrackerOfLocalState(
     PrefService* local_state_prefs) {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   return std::make_unique<ash::ProxyConfigServiceImpl>(
       nullptr, local_state_prefs, nullptr);
 #else
   return std::make_unique<PrefProxyConfigTrackerImpl>(local_state_prefs,
                                                       nullptr);
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 }
diff --git a/chrome/browser/net/secure_dns_policy_handler.cc b/chrome/browser/net/secure_dns_policy_handler.cc
index 8c23fe53..de2911d5 100644
--- a/chrome/browser/net/secure_dns_policy_handler.cc
+++ b/chrome/browser/net/secure_dns_policy_handler.cc
@@ -20,13 +20,13 @@
 #include "net/dns/public/dns_over_https_config.h"
 #include "net/dns/public/util.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "ash/constants/ash_features.h"
 #endif
 
 namespace {
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 constexpr int kMinDohSaltSize = 8;
 constexpr int kMaxDohSaltSize = 32;
 
@@ -153,11 +153,11 @@
       policies, errors, key::kDnsOverHttpsTemplates, mode_str);
   templates_is_applicable = is_templates_policy_valid_;
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-    bool templates_valid = CheckDnsOverHttpsTemplatePolicy(
-        policies, errors, key::kDnsOverHttpsTemplatesWithIdentifiers, mode_str);
-    bool salt_valid = CheckDnsOverHttpsSaltPolicy(policies, errors);
-    is_templates_with_identifiers_policy_valid_ = templates_valid && salt_valid;
+#if BUILDFLAG(IS_CHROMEOS)
+  bool templates_valid = CheckDnsOverHttpsTemplatePolicy(
+      policies, errors, key::kDnsOverHttpsTemplatesWithIdentifiers, mode_str);
+  bool salt_valid = CheckDnsOverHttpsSaltPolicy(policies, errors);
+  is_templates_with_identifiers_policy_valid_ = templates_valid && salt_valid;
 
   templates_is_applicable =
       is_templates_policy_valid_ || is_templates_with_identifiers_policy_valid_;
@@ -209,25 +209,25 @@
   else if (is_templates_policy_valid_)
     prefs->SetString(prefs::kDnsOverHttpsTemplates, templates->GetString());
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-    const base::Value* templates_with_identifiers = policies.GetValue(
-        key::kDnsOverHttpsTemplatesWithIdentifiers, base::Value::Type::STRING);
-    const base::Value* salt =
-        policies.GetValue(key::kDnsOverHttpsSalt, base::Value::Type::STRING);
+#if BUILDFLAG(IS_CHROMEOS)
+  const base::Value* templates_with_identifiers = policies.GetValue(
+      key::kDnsOverHttpsTemplatesWithIdentifiers, base::Value::Type::STRING);
+  const base::Value* salt =
+      policies.GetValue(key::kDnsOverHttpsSalt, base::Value::Type::STRING);
 
-    // A templates not specified error means that the pref should be set blank.
-    if (IsTemplatesPolicyNotSpecified(
-            is_templates_with_identifiers_policy_valid_, mode_str)) {
-      prefs->SetString(prefs::kDnsOverHttpsTemplatesWithIdentifiers,
-                       std::string());
-      prefs->SetString(prefs::kDnsOverHttpsSalt, std::string());
+  // A templates not specified error means that the pref should be set blank.
+  if (IsTemplatesPolicyNotSpecified(is_templates_with_identifiers_policy_valid_,
+                                    mode_str)) {
+    prefs->SetString(prefs::kDnsOverHttpsTemplatesWithIdentifiers,
+                     std::string());
+    prefs->SetString(prefs::kDnsOverHttpsSalt, std::string());
 
-    } else if (is_templates_with_identifiers_policy_valid_) {
-      prefs->SetString(prefs::kDnsOverHttpsTemplatesWithIdentifiers,
-                       templates_with_identifiers->GetString());
-      prefs->SetString(prefs::kDnsOverHttpsSalt,
-                       salt ? salt->GetString() : std::string());
-    }
+  } else if (is_templates_with_identifiers_policy_valid_) {
+    prefs->SetString(prefs::kDnsOverHttpsTemplatesWithIdentifiers,
+                     templates_with_identifiers->GetString());
+    prefs->SetString(prefs::kDnsOverHttpsSalt,
+                     salt ? salt->GetString() : std::string());
+  }
 #endif
 }
 
diff --git a/chrome/browser/net/secure_dns_policy_handler.h b/chrome/browser/net/secure_dns_policy_handler.h
index d0638c1..cfb1810d 100644
--- a/chrome/browser/net/secure_dns_policy_handler.h
+++ b/chrome/browser/net/secure_dns_policy_handler.h
@@ -44,7 +44,7 @@
   // `CheckPolicySettings`.
   bool is_templates_policy_valid_ = false;
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // Indicates whether the DnsOverHttpsTemplatesWithIdentifiers policy is valid
   // and can be applied. If not, the corresponding pref is not set. Set in
   // `CheckPolicySettings`.
diff --git a/chrome/browser/net/secure_dns_policy_handler_unittest.cc b/chrome/browser/net/secure_dns_policy_handler_unittest.cc
index ceedd21b..89f3447a 100644
--- a/chrome/browser/net/secure_dns_policy_handler_unittest.cc
+++ b/chrome/browser/net/secure_dns_policy_handler_unittest.cc
@@ -30,7 +30,7 @@
 #include "testing/gtest/include/gtest/gtest.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/test/scoped_feature_list.h"
 
@@ -452,7 +452,7 @@
   EXPECT_EQ(templates, test_policy_value);
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 TEST_F(SecureDnsPolicyHandlerTest, TemplatesWithIdentifiers) {
   SetPolicyValue(key::kDnsOverHttpsMode,
                  base::Value(SecureDnsConfig::kModeSecure));
@@ -635,6 +635,6 @@
   EXPECT_EQ(salt, kDohSalt);
 }
 
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 }  // namespace policy
diff --git a/chrome/browser/net/stub_resolver_config_reader_browsertest.cc b/chrome/browser/net/stub_resolver_config_reader_browsertest.cc
index a771e17b..7b91915e 100644
--- a/chrome/browser/net/stub_resolver_config_reader_browsertest.cc
+++ b/chrome/browser/net/stub_resolver_config_reader_browsertest.cc
@@ -37,7 +37,7 @@
 #include "base/win/win_util.h"
 #endif
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/ash/net/secure_dns_manager.h"
 #endif
 
@@ -47,13 +47,8 @@
 
 namespace {
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-const std::string kDnsOverHttpsTemplatesPrefName =
-    prefs::kDnsOverHttpsEffectiveTemplatesChromeOS;
-#else
 const std::string kDnsOverHttpsTemplatesPrefName =
     prefs::kDnsOverHttpsTemplates;
-#endif
 
 class StubResolverConfigReaderBrowsertest
     : public InProcessBrowserTest,
@@ -142,11 +137,11 @@
   PrefService* pref_service_for_user_settings =
       g_browser_process->local_state();
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // On ChromeOS, the local_state is shared between all users so the user-set
   // pref is stored in the profile's pref service.
   pref_service_for_user_settings = browser()->profile()->GetPrefs();
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
   pref_service_for_user_settings->SetString(prefs::kDnsOverHttpsMode,
                                             SecureDnsConfig::kModeSecure);
@@ -316,12 +311,7 @@
 #endif
 
   SetSecureDnsModePolicy("secure");
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  g_browser_process->local_state()->SetString(
-      prefs::kDnsOverHttpsEffectiveTemplatesChromeOS, "https://doh.test/");
-#else
   SetDohTemplatesPolicy("https://doh.test/");
-#endif
   SecureDnsConfig secure_dns_config = config_reader_->GetSecureDnsConfiguration(
       /*force_check_parental_controls_for_automatic_mode=*/false);
   EXPECT_EQ(secure_dns_config.mode(), net::SecureDnsMode::kSecure);
diff --git a/chrome/browser/net/stub_resolver_config_reader_unittest.cc b/chrome/browser/net/stub_resolver_config_reader_unittest.cc
index 6cef09c..d3b267f 100644
--- a/chrome/browser/net/stub_resolver_config_reader_unittest.cc
+++ b/chrome/browser/net/stub_resolver_config_reader_unittest.cc
@@ -26,13 +26,8 @@
 constexpr char kDohConfigString[] =
     "https://doh1.test https://doh2.test/query{?dns}";
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-const std::string kDnsOverHttpsTemplatesPrefName =
-    prefs::kDnsOverHttpsEffectiveTemplatesChromeOS;
-#else
 const std::string kDnsOverHttpsTemplatesPrefName =
     prefs::kDnsOverHttpsTemplates;
-#endif
 
 // Override the reader to mock out the ShouldDisableDohFor...() methods.
 class MockedStubResolverConfigReader : public StubResolverConfigReader {
@@ -250,13 +245,8 @@
   local_state_.SetManagedPref(
       prefs::kDnsOverHttpsMode,
       std::make_unique<base::Value>(SecureDnsConfig::kModeAutomatic));
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  local_state_.SetString(prefs::kDnsOverHttpsEffectiveTemplatesChromeOS,
-                         kDohConfigString);
-#else
   local_state_.SetManagedPref(prefs::kDnsOverHttpsTemplates,
                               std::make_unique<base::Value>(kDohConfigString));
-#endif
   SecureDnsConfig secure_dns_config = config_reader_->GetSecureDnsConfiguration(
       false /* force_check_parental_controls_for_automatic_mode */);
 
diff --git a/chrome/browser/net/system_network_context_manager.cc b/chrome/browser/net/system_network_context_manager.cc
index e349438..acef4b4 100644
--- a/chrome/browser/net/system_network_context_manager.cc
+++ b/chrome/browser/net/system_network_context_manager.cc
@@ -92,21 +92,10 @@
 
 #if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/net/network_annotation_monitor.h"
-#endif  // BUILDFLAG(IS_CHROMEOS)
-
-#if BUILDFLAG(IS_CHROMEOS_ASH)
 #include "chrome/browser/ash/net/dhcp_wpad_url_client.h"
 #include "chrome/browser/ash/policy/core/browser_policy_connector_ash.h"
 #include "chrome/browser/browser_process_platform_part.h"
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
-
-// 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)
-#include "chrome/common/chrome_paths_internal.h"
-#include "chrome/grit/branded_strings.h"
-#include "ui/base/l10n/l10n_util.h"
-#endif  // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 #if BUILDFLAG(ENABLE_EXTENSIONS)
 #include "extensions/common/constants.h"
@@ -668,12 +657,6 @@
   registry->RegisterStringPref(prefs::kAuthNegotiateDelegateAllowlist,
                                std::string());
 
-// On ChromeOS Ash, the pref below is registered by the
-// `KerberosCredentialsManager`.
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  registry->RegisterBooleanPref(prefs::kKerberosEnabled, false);
-#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
-
 #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_CHROMEOS)
   registry->RegisterBooleanPref(prefs::kAuthNegotiateDelegateByKdcPolicy,
                                 false);
@@ -893,10 +876,10 @@
       network_context_params->proxy_resolver_factory =
           ChromeMojoProxyResolverFactory::CreateWithSelfOwnedReceiver();
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
       network_context_params->dhcp_wpad_url_client =
           ash::DhcpWpadUrlClient::CreateWithSelfOwnedReceiver();
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
     }
   }
 
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc
index 48d8f86..29fe2c0 100644
--- a/chrome/browser/prefs/browser_prefs.cc
+++ b/chrome/browser/prefs/browser_prefs.cc
@@ -1154,25 +1154,27 @@
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
 // Deprecated 12/2024
-const char kCryptAuthDeviceSyncIsRecoveringFromFailure[] =
+inline const char kCryptAuthDeviceSyncIsRecoveringFromFailure[] =
     "cryptauth.device_sync.is_recovering_from_failure";
-const char kCryptAuthDeviceSyncLastSyncTimeSeconds[] =
+inline const char kCryptAuthDeviceSyncLastSyncTimeSeconds[] =
     "cryptauth.device_sync.last_device_sync_time_seconds";
-const char kCryptAuthDeviceSyncReason[] = "cryptauth.device_sync.reason";
-const char kCryptAuthDeviceSyncUnlockKeys[] =
+inline const char kCryptAuthDeviceSyncReason[] = "cryptauth.device_sync.reason";
+inline const char kCryptAuthDeviceSyncUnlockKeys[] =
     "cryptauth.device_sync.unlock_keys";
-const char kCryptAuthEnrollmentIsRecoveringFromFailure[] =
+inline const char kCryptAuthEnrollmentIsRecoveringFromFailure[] =
     "cryptauth.enrollment.is_recovering_from_failure";
-const char kCryptAuthEnrollmentLastEnrollmentTimeSeconds[] =
+inline const char kCryptAuthEnrollmentLastEnrollmentTimeSeconds[] =
     "cryptauth.enrollment.last_enrollment_time_seconds";
-const char kCryptAuthEnrollmentReason[] = "cryptauth.enrollment.reason";
-const char kCryptAuthEnrollmentUserPublicKey[] =
+inline const char kCryptAuthEnrollmentReason[] = "cryptauth.enrollment.reason";
+inline const char kCryptAuthEnrollmentUserPublicKey[] =
     "cryptauth.enrollment.user_public_key";
-const char kCryptAuthEnrollmentUserPrivateKey[] =
+inline const char kCryptAuthEnrollmentUserPrivateKey[] =
     "cryptauth.enrollment.user_private_key";
-const char kLacrosLaunchOnLogin[] = "lacros.launch_on_login";
-const char kLacrosLaunchSwitch[] = "lacros_launch_switch";
-const char kLacrosSelection[] = "lacros_selection";
+inline const char kLacrosLaunchOnLogin[] = "lacros.launch_on_login";
+inline const char kLacrosLaunchSwitch[] = "lacros_launch_switch";
+inline const char kLacrosSelection[] = "lacros_selection";
+inline constexpr char kAccessibilityCursorColorEnabled[] =
+    "settings.a11y.cursor_color_enabled";
 #endif
 
 // Deprecated 12/2024.
@@ -1676,6 +1678,7 @@
   registry->RegisterStringPref(kCryptAuthEnrollmentUserPrivateKey,
                                std::string());
   registry->RegisterBooleanPref(kLacrosLaunchOnLogin, false);
+  registry->RegisterBooleanPref(kAccessibilityCursorColorEnabled, false);
 #endif
 
   // Deprecated 12/2024.
@@ -3022,6 +3025,7 @@
   profile_prefs->ClearPref(kCryptAuthEnrollmentUserPublicKey);
   profile_prefs->ClearPref(kCryptAuthEnrollmentUserPrivateKey);
   profile_prefs->ClearPref(kLacrosLaunchOnLogin);
+  profile_prefs->ClearPref(kAccessibilityCursorColorEnabled);
 #endif
 
   // Added 12/2024.
diff --git a/chrome/browser/prefs/pref_service_incognito_allowlist.cc b/chrome/browser/prefs/pref_service_incognito_allowlist.cc
index 53cc913c..f3c1de7 100644
--- a/chrome/browser/prefs/pref_service_incognito_allowlist.cc
+++ b/chrome/browser/prefs/pref_service_incognito_allowlist.cc
@@ -121,7 +121,6 @@
     ash::prefs::kAccessibilityCaretHighlightEnabled,
     ash::prefs::kAccessibilityCaretBlinkInterval,
     ash::prefs::kAccessibilityCursorHighlightEnabled,
-    ash::prefs::kAccessibilityCursorColorEnabled,
     ash::prefs::kAccessibilityCursorColor,
     ash::prefs::kAccessibilityFocusHighlightEnabled,
     ash::prefs::kAccessibilitySelectToSpeakEnabled,
diff --git a/chrome/browser/resources/ash/settings/internet_page/cellular_roaming_toggle_button.ts b/chrome/browser/resources/ash/settings/internet_page/cellular_roaming_toggle_button.ts
index bd7c7977..05ecb74 100644
--- a/chrome/browser/resources/ash/settings/internet_page/cellular_roaming_toggle_button.ts
+++ b/chrome/browser/resources/ash/settings/internet_page/cellular_roaming_toggle_button.ts
@@ -104,8 +104,8 @@
       roaming: {
         allowRoaming: this.isRoamingAllowedForNetwork_,
       },
-      apn: undefined,
-      textMessageAllowState: undefined,
+      apn: null,
+      textMessageAllowState: null,
     };
     this.networkConfig_.setProperties(this.managedProperties.guid, config)
         .then(response => {
diff --git a/chrome/browser/resources/ash/settings/internet_page/internet_detail_subpage.ts b/chrome/browser/resources/ash/settings/internet_page/internet_detail_subpage.ts
index dc92e64f..3891b81 100644
--- a/chrome/browser/resources/ash/settings/internet_page/internet_detail_subpage.ts
+++ b/chrome/browser/resources/ash/settings/internet_page/internet_detail_subpage.ts
@@ -956,8 +956,8 @@
       textMessageAllowState: {
         allowTextMessages: e.detail.value,
       },
-      roaming: undefined,
-      apn: undefined,
+      roaming: null,
+      apn: null,
     };
     this.networkConfig_.setProperties(this.guid, config).then(response => {
       if (!response.success) {
@@ -1813,7 +1813,7 @@
     const config = this.getDefaultConfigProperties_();
     const apn = event.detail;
     config.typeConfig
-        .cellular = {apn, roaming: undefined, textMessageAllowState: undefined};
+        .cellular = {apn, roaming: null, textMessageAllowState: null};
     this.setMojoNetworkProperties_(config);
   }
 
diff --git a/chrome/browser/resources/ash/settings/internet_page/internet_page.ts b/chrome/browser/resources/ash/settings/internet_page/internet_page.ts
index cd348a3..e6322d3 100644
--- a/chrome/browser/resources/ash/settings/internet_page/internet_page.ts
+++ b/chrome/browser/resources/ash/settings/internet_page/internet_page.ts
@@ -50,7 +50,7 @@
 import type {NetworkListenerBehaviorInterface} from 'chrome://resources/ash/common/network/network_listener_behavior.js';
 import {NetworkListenerBehavior} from 'chrome://resources/ash/common/network/network_listener_behavior.js';
 import {OncMojo} from 'chrome://resources/ash/common/network/onc_mojo.js';
-import {assert, assertNotReached} from 'chrome://resources/js/assert.js';
+import {assert} from 'chrome://resources/js/assert.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.js';
 import type {CrosNetworkConfigInterface, GlobalPolicy, NetworkStateProperties, VpnProvider} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
 import {StartConnectResult} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
@@ -1049,7 +1049,6 @@
             ' Error: ' + response.message);
         return;
     }
-    assertNotReached();
   }
 
   /** Opens the three dots menu. */
diff --git a/chrome/browser/resources/ash/settings/internet_page/network_summary.ts b/chrome/browser/resources/ash/settings/internet_page/network_summary.ts
index 632d646..e052d14f 100644
--- a/chrome/browser/resources/ash/settings/internet_page/network_summary.ts
+++ b/chrome/browser/resources/ash/settings/internet_page/network_summary.ts
@@ -18,7 +18,7 @@
 import {NetworkListenerBehavior} from 'chrome://resources/ash/common/network/network_listener_behavior.js';
 import {OncMojo} from 'chrome://resources/ash/common/network/onc_mojo.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.js';
-import type {CrosNetworkConfigInterface, GlobalPolicy} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
+import type {CrosNetworkConfigInterface, DeviceStateProperties, GlobalPolicy, NetworkStateProperties} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
 import {FilterType, NO_LIMIT} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
 import {DeviceStateType, NetworkType, OncSource} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
@@ -122,7 +122,7 @@
 
   defaultNetwork: OncMojo.NetworkStateProperties|null;
   hotspotInfo: HotspotInfo|undefined;
-  deviceStates: Record<NetworkType, OncMojo.DeviceStateProperties>;
+  deviceStates: Partial<Record<NetworkType, OncMojo.DeviceStateProperties>>;
   private activeNetworkIds_: Set<string>|null;
   private activeNetworkStates_: OncMojo.NetworkStateProperties[];
   private crosHotspotConfig_: CrosHotspotConfigInterface;
@@ -131,7 +131,7 @@
   private isInstantHotspotRebrandEnabled_: boolean;
   private networkConfig_: CrosNetworkConfigInterface;
   private networkStateLists_:
-      Record<NetworkType, OncMojo.NetworkStateProperties[]>;
+      Partial<Record<NetworkType, OncMojo.NetworkStateProperties[]>>;
 
   constructor() {
     super();
@@ -250,9 +250,10 @@
    * Called after network states are received from getNetworks.
    */
   private updateNetworkStates_(
-      networkStates: OncMojo.NetworkStateProperties[],
-      deviceStateList: OncMojo.DeviceStateProperties[]): void {
-    const newDeviceStates: Record<string, OncMojo.DeviceStateProperties> = {};
+      networkStates: NetworkStateProperties[],
+      deviceStateList: DeviceStateProperties[]): void {
+    const newDeviceStates:
+        Partial<Record<NetworkType, DeviceStateProperties>> = {};
     for (const device of deviceStateList) {
       newDeviceStates[device.type] = device;
     }
diff --git a/chrome/browser/resources/ash/settings/metrics_utils.ts b/chrome/browser/resources/ash/settings/metrics_utils.ts
index a03f370..16aec8d 100644
--- a/chrome/browser/resources/ash/settings/metrics_utils.ts
+++ b/chrome/browser/resources/ash/settings/metrics_utils.ts
@@ -121,10 +121,6 @@
     setting: Setting.kHighlightCursorWhileMoving,
     type: PrefType.BOOLEAN,
   },
-  'settings.a11y.cursor_color_enabled': {
-    setting: Setting.kEnableCursorColor,
-    type: PrefType.BOOLEAN,
-  },
   'settings.a11y.face_gaze.enabled': {
     setting: Setting.kFaceGaze,
     type: PrefType.BOOLEAN,
diff --git a/chrome/browser/resources/ash/settings/os_a11y_page/cursor_and_touchpad_page.html b/chrome/browser/resources/ash/settings/os_a11y_page/cursor_and_touchpad_page.html
index 8538417..0fcd0e2 100644
--- a/chrome/browser/resources/ash/settings/os_a11y_page/cursor_and_touchpad_page.html
+++ b/chrome/browser/resources/ash/settings/os_a11y_page/cursor_and_touchpad_page.html
@@ -162,7 +162,6 @@
       aria-labelledby="cursorColorOptionsLabel"
       pref="{{prefs.settings.a11y.cursor_color}}"
       menu-options="[[cursorColorOptions_]]"
-      on-settings-control-change="onA11yCursorColorChange_"
       deep-link-focus-id$="[[Setting.kEnableCursorColor]]">
   </settings-dropdown-menu>
 </div>
diff --git a/chrome/browser/resources/ash/settings/os_a11y_page/cursor_and_touchpad_page.ts b/chrome/browser/resources/ash/settings/os_a11y_page/cursor_and_touchpad_page.ts
index cf5fde5..c4f566b 100644
--- a/chrome/browser/resources/ash/settings/os_a11y_page/cursor_and_touchpad_page.ts
+++ b/chrome/browser/resources/ash/settings/os_a11y_page/cursor_and_touchpad_page.ts
@@ -40,7 +40,6 @@
 import {CursorAndTouchpadPageBrowserProxyImpl} from './cursor_and_touchpad_page_browser_proxy.js';
 import {DisableTouchpadMode} from './disable_touchpad_constants.js';
 
-const DEFAULT_BLACK_CURSOR_COLOR = 0;
 interface Option {
   name: string;
   value: number;
@@ -140,7 +139,7 @@
         value() {
           return [
             {
-              value: DEFAULT_BLACK_CURSOR_COLOR,
+              value: -0x1000000,  // Black
               name: loadTimeData.getString('cursorColorBlack'),
             },
             {
@@ -513,15 +512,6 @@
         .recordSelectedShowShelfNavigationButtonValue(enabled);
   }
 
-  private onA11yCursorColorChange_(): void {
-    // Custom cursor color is enabled when the color is not set to black.
-    const a11yCursorColorOn =
-        this.getPref<number>('settings.a11y.cursor_color').value !==
-        DEFAULT_BLACK_CURSOR_COLOR;
-    this.set(
-        'prefs.settings.a11y.cursor_color_enabled.value', a11yCursorColorOn);
-  }
-
   private showTouchpadEnableMessage_(trackpadMode: number): boolean {
     return trackpadMode !== DisableTouchpadMode.NEVER;
   }
diff --git a/chrome/browser/resources/ash/settings/os_bluetooth_page/os_bluetooth_page.ts b/chrome/browser/resources/ash/settings/os_bluetooth_page/os_bluetooth_page.ts
index 218f26f..4f63c2f 100644
--- a/chrome/browser/resources/ash/settings/os_bluetooth_page/os_bluetooth_page.ts
+++ b/chrome/browser/resources/ash/settings/os_bluetooth_page/os_bluetooth_page.ts
@@ -14,10 +14,13 @@
 import '../os_settings_page/os_settings_animated_pages.js';
 import '../os_settings_page/os_settings_subpage.js';
 import '../os_settings_page/settings_card.js';
-import './os_bluetooth_devices_subpage.js';
 import './os_bluetooth_summary.js';
-import './os_bluetooth_device_detail_subpage.js';
 import './os_bluetooth_pairing_dialog.js';
+// This import is necessary to have since the devices subpage is the default
+// page for the Bluetooth section.
+// TODO(crbug.com/309808834) Remove this import once the Bluetooth L1 page is
+// revamped with up-leveled content.
+import './os_bluetooth_devices_subpage.js';
 
 import {PrefsMixin} from '/shared/settings/prefs/prefs_mixin.js';
 import {getBluetoothConfig} from 'chrome://resources/ash/common/bluetooth/cros_bluetooth_config.js';
diff --git a/chrome/browser/resources/ash/settings/os_settings_menu/os_settings_menu.ts b/chrome/browser/resources/ash/settings/os_settings_menu/os_settings_menu.ts
index 58b7ec53..943a9ecc 100644
--- a/chrome/browser/resources/ash/settings/os_settings_menu/os_settings_menu.ts
+++ b/chrome/browser/resources/ash/settings/os_settings_menu/os_settings_menu.ts
@@ -27,7 +27,7 @@
 import {OncMojo} from 'chrome://resources/ash/common/network/onc_mojo.js';
 import type {BluetoothSystemProperties, PairedBluetoothDeviceProperties} from 'chrome://resources/mojo/chromeos/ash/services/bluetooth_config/public/mojom/cros_bluetooth_config.mojom-webui.js';
 import {BluetoothSystemState, DeviceConnectionState, SystemPropertiesObserverReceiver as BluetoothPropertiesObserverReceiver} from 'chrome://resources/mojo/chromeos/ash/services/bluetooth_config/public/mojom/cros_bluetooth_config.mojom-webui.js';
-import type {CrosNetworkConfigInterface} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
+import type {CrosNetworkConfigInterface, NetworkStateProperties} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
 import {FilterType, NO_LIMIT} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
 import {NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import type {IronSelectorElement} from 'chrome://resources/polymer/v3_0/iron-selector/iron-selector.js';
@@ -84,8 +84,7 @@
 }
 
 function getPrioritizedConnectedNetwork(
-    networkStateList: OncMojo.NetworkStateProperties[]):
-    OncMojo.NetworkStateProperties|null {
+    networkStateList: NetworkStateProperties[]): NetworkStateProperties|null {
   // The priority of the network types. Both Cellular and Tether belongs to
   // the Mobile Data.
   const orderedNetworkTypes = [
@@ -97,18 +96,18 @@
   ];
 
   const networkStates:
-      Record<NetworkType, OncMojo.NetworkStateProperties[]> = {};
+      Partial<Record<NetworkType, NetworkStateProperties[]>> = {};
 
   for (const networkType of orderedNetworkTypes) {
     networkStates[networkType] = [];
   }
 
   for (const networkState of networkStateList) {
-    networkStates[networkState.type].push(networkState);
+    networkStates[networkState.type]!.push(networkState);
   }
 
   for (const type of orderedNetworkTypes) {
-    for (const networkState of networkStates[type]) {
+    for (const networkState of networkStates[type]!) {
       if (OncMojo.connectionStateIsConnected(networkState.connectionState)) {
         return networkState;
       }
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/BUILD.gn b/chrome/browser/resources/chromeos/accessibility/switch_access/BUILD.gn
index 7a7ca3b..aea9778 100644
--- a/chrome/browser/resources/chromeos/accessibility/switch_access/BUILD.gn
+++ b/chrome/browser/resources/chromeos/accessibility/switch_access/BUILD.gn
@@ -49,6 +49,7 @@
   "nodes/group_node.ts",
   "nodes/keyboard_node.ts",
   "nodes/modal_dialog_node.ts",
+  "nodes/slider_node.ts",
   "nodes/switch_access_node.ts",
   "nodes/tab_node.ts",
   "nodes/window_node.ts",
@@ -61,9 +62,6 @@
   "text_navigation_manager.ts",
 ]
 
-# JS files needed to compile TS.
-js_modules = [ "nodes/slider_node.js" ]
-
 # Root dir must be the parent directory so it can reach common.
 ts_library("ts_build") {
   root_dir = "$ts_build_staging_dir"
@@ -93,7 +91,7 @@
     "//tools/typescript/definitions/metrics_private.d.ts",
   ]
 
-  in_files = ts_modules + js_modules
+  in_files = ts_modules
 
   tsconfig_base = "../tsconfig.base.json"
 }
@@ -150,7 +148,7 @@
 # will also be copied into this folder, which will allow us to support a TS
 # build that uses both checked-in and generated files.
 copy("stage_ts_build") {
-  sources = ts_modules + js_modules
+  sources = ts_modules
   outputs = [ "$ts_build_staging_dir/{{source_target_relative}}" ]
 }
 
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/nodes/slider_node.js b/chrome/browser/resources/chromeos/accessibility/switch_access/nodes/slider_node.ts
similarity index 63%
rename from chrome/browser/resources/chromeos/accessibility/switch_access/nodes/slider_node.js
rename to chrome/browser/resources/chromeos/accessibility/switch_access/nodes/slider_node.ts
index 7462c497..223109af 100644
--- a/chrome/browser/resources/chromeos/accessibility/switch_access/nodes/slider_node.js
+++ b/chrome/browser/resources/chromeos/accessibility/switch_access/nodes/slider_node.ts
@@ -2,35 +2,32 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {EventGenerator} from '../../common/event_generator.js';
-import {KeyCode} from '../../common/key_code.js';
+import {EventGenerator} from '/common/event_generator.js';
+import {KeyCode} from '/common/key_code.js';
+
 import {ActionResponse} from '../switch_access_constants.js';
 
 import {BasicNode} from './basic_node.js';
-import {SAChildNode, SARootNode} from './switch_access_node.js';
+import {SARootNode} from './switch_access_node.js';
 
-const AutomationNode = chrome.automation.AutomationNode;
-const MenuAction = chrome.accessibilityPrivate.SwitchAccessMenuAction;
+type AutomationNode = chrome.automation.AutomationNode;
+import MenuAction = chrome.accessibilityPrivate.SwitchAccessMenuAction;
+import RoleType = chrome.automation.RoleType;
 
 /** This class handles interactions with sliders. */
 export class SliderNode extends BasicNode {
-  /**
-   * @param {!AutomationNode} baseNode
-   * @param {?SARootNode} parent
-   */
-  constructor(baseNode, parent) {
+  private isCustomSlider_ = true;
+
+  constructor(baseNode: AutomationNode, parent: SARootNode|null) {
     super(baseNode, parent);
-    this.isCustomSlider_ = true;
   }
 
-  /** @override */
-  onFocus() {
+  override onFocus(): void {
     super.onFocus();
     this.automationNode.focus();
   }
 
-  /** @override */
-  performAction(action) {
+  override performAction(action: MenuAction): ActionResponse {
     // Currently, custom sliders have no way to support increment/decrement via
     // the automation API. We handle this case by simulating left/right arrow
     // presses.
@@ -49,6 +46,6 @@
 }
 
 BasicNode.creators.push({
-  predicate: baseNode => baseNode.role === chrome.automation.RoleType.SLIDER,
+  predicate: baseNode => baseNode.role === RoleType.SLIDER,
   creator: (node, parent) => new SliderNode(node, parent),
 });
diff --git a/chrome/browser/resources/chromeos/internet_config_dialog/internet_config_dialog.ts b/chrome/browser/resources/chromeos/internet_config_dialog/internet_config_dialog.ts
index 624b58e..fe460036 100644
--- a/chrome/browser/resources/chromeos/internet_config_dialog/internet_config_dialog.ts
+++ b/chrome/browser/resources/chromeos/internet_config_dialog/internet_config_dialog.ts
@@ -81,7 +81,7 @@
        * empty if nothing to prefill or the information will be synced based on
        * given guid.
        */
-      prefilledProperties_: ConfigProperties,
+      prefilledProperties_: Object,
 
       enableConnect_: Boolean,
 
diff --git a/chrome/browser/resources/chromeos/internet_detail_dialog/internet_detail_dialog.ts b/chrome/browser/resources/chromeos/internet_detail_dialog/internet_detail_dialog.ts
index 013a375d..8dad6137 100644
--- a/chrome/browser/resources/chromeos/internet_detail_dialog/internet_detail_dialog.ts
+++ b/chrome/browser/resources/chromeos/internet_detail_dialog/internet_detail_dialog.ts
@@ -625,8 +625,8 @@
     const apn = event.detail;
     config.typeConfig.cellular = {
       apn: apn,
-      roaming: undefined,
-      textMessageAllowState: undefined,
+      roaming: null,
+      textMessageAllowState: null,
     };
     this.setMojoNetworkProperties_(config);
   }
diff --git a/chrome/browser/resources/chromeos/login/components/network_select_login.ts b/chrome/browser/resources/chromeos/login/components/network_select_login.ts
index 2378416..a25bfdd5 100644
--- a/chrome/browser/resources/chromeos/login/components/network_select_login.ts
+++ b/chrome/browser/resources/chromeos/login/components/network_select_login.ts
@@ -12,6 +12,7 @@
 import {NetworkList} from '//resources/ash/common/network/network_list_types.js';
 import {OncMojo} from '//resources/ash/common/network/onc_mojo.js';
 import {assert, assertInstanceof} from '//resources/js/assert.js';
+import type {CrosNetworkConfigInterface} from '//resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
 import {StartConnectResult} from '//resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
 import {ConnectionStateType, NetworkType} from '//resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {PolymerElementProperties} from '//resources/polymer/v3_0/polymer/interfaces.js';
@@ -342,7 +343,7 @@
       return;
     }
 
-    const networkConfig =
+    const networkConfig: CrosNetworkConfigInterface =
         MojoInterfaceProviderImpl.getInstance().getMojoServiceRemote();
 
     networkConfig.startConnect(guid).then(response => {
diff --git a/chrome/browser/resources/settings/people_page/sync_account_control.html b/chrome/browser/resources/settings/people_page/sync_account_control.html
index 015dd0a..24f7e7c 100644
--- a/chrome/browser/resources/settings/people_page/sync_account_control.html
+++ b/chrome/browser/resources/settings/people_page/sync_account_control.html
@@ -166,7 +166,7 @@
                 syncStatus.statusAction, syncStatus.disabled)]]
           </div>
           <div class="secondary text-elide"
-          hidden="[[shouldHideSubtitleWithAccountInfoText_()]]">
+          hidden="[[shouldHideSubtitleWithAccountInfoText_(syncStatus)]]">
             [[getAccountLabel_(
                 '$i18nPolymer{signedInTo}',
                 '$i18nPolymer{syncingTo}',
@@ -176,9 +176,12 @@
                 shownAccount_.isPrimaryAccount)]]
           </div>
           <div class="secondary"
-          hidden="[[!shouldHideSubtitleWithAccountInfoText_()]]">
+          hidden="[[!shouldHideSubtitleWithAccountInfoText_(syncStatus)]]">
           [[getAvatarSubtitleLabel_(
-            '$i18nPolymer{accountAwareRowSubtitle}')]]
+            '$i18nPolymer{accountAwareRowSubtitle}',
+            '$i18nPolymer{pendingStateAvatarRowSubtitle}',
+            shownAccount_.email,
+            this.syncStatus.signedInState)]]
           </div>
         </div>
         <cr-icon-button class="icon-arrow-dropdown cr-button-gap"
@@ -213,7 +216,9 @@
                 syncStatus.domain, showSetupButtons_)]]"
             on-click="onTurnOffButtonClick_"
             disabled="[[syncStatus.firstSetupInProgress]]">
-          $i18n{turnOffSync}
+            [[getTurnOffSyncLabel_(
+              '$i18nPolymer{turnOffSync}',
+              syncStatus.secondaryButtonActionText)]]
         </cr-button>
         <cr-button id="sync-error-button" class="action-button cr-button-gap"
             hidden="[[!shouldShowErrorActionButton_(syncStatus,
diff --git a/chrome/browser/resources/settings/people_page/sync_account_control.ts b/chrome/browser/resources/settings/people_page/sync_account_control.ts
index 5b8330f..99f393b7 100644
--- a/chrome/browser/resources/settings/people_page/sync_account_control.ts
+++ b/chrome/browser/resources/settings/people_page/sync_account_control.ts
@@ -265,9 +265,12 @@
       return false;
     }
 
-    if (this.syncStatus &&
-        this.syncStatus.signedInState === SignedInState.SIGNED_IN_PAUSED &&
-        this.syncStatus.hasError && this.syncStatus.statusText) {
+    if (this.syncStatus.signedInState === SignedInState.SIGNED_IN_PAUSED) {
+      return true;
+    }
+
+    if (this.syncStatus && this.syncStatus.hasError &&
+        this.syncStatus.statusText) {
       return true;
     }
 
@@ -279,7 +282,9 @@
   }
 
 
-  private getAvatarSubtitleLabel_(accountAwareRowSubtitle: string): string {
+  private getAvatarSubtitleLabel_(
+      accountAwareRowSubtitle: string, pendingStateSubtitle: string,
+      email: string): string {
     if (!loadTimeData.getBoolean('isImprovedSettingsUIOnDesktopEnabled')) {
       return '';
     }
@@ -288,8 +293,11 @@
       return accountAwareRowSubtitle;
     }
 
+    if (this.syncStatus.signedInState === SignedInState.SIGNED_IN_PAUSED) {
+      return loadTimeData.substituteString(pendingStateSubtitle, email);
+    }
+
     if (this.syncStatus &&
-        this.syncStatus.signedInState === SignedInState.SIGNED_IN_PAUSED &&
         this.syncStatus.hasError && this.syncStatus.statusText) {
       return this.syncStatus.statusText;
     }
@@ -365,14 +373,15 @@
       accountName: string, syncErrorLabel: string,
       syncPasswordsOnlyErrorLabel: string, authErrorLabel: string,
       disabledLabel: string, webOnlySignedInAccountRowTitle: string): string {
-    if (loadTimeData.getBoolean('isImprovedSettingsUIOnDesktopEnabled')) {
-      if (this.syncStatus.signedInState === SignedInState.WEB_ONLY_SIGNED_IN) {
-        return webOnlySignedInAccountRowTitle;
-      }
-      if (this.syncStatus.signedInState === SignedInState.SIGNED_IN_PAUSED &&
-          this.syncStatus.hasError) {
-        return accountName;
-      }
+    if (loadTimeData.getBoolean('isImprovedSettingsUIOnDesktopEnabled') &&
+        (this.syncStatus.signedInState === SignedInState.WEB_ONLY_SIGNED_IN)) {
+      return webOnlySignedInAccountRowTitle;
+    }
+
+    if (loadTimeData.getBoolean('isImprovedSettingsUIOnDesktopEnabled') &&
+        this.syncStatus && this.syncStatus.hasError &&
+        this.syncStatus.statusText) {
+      return accountName;
     }
 
     if (this.syncStatus.disabled) {
@@ -472,6 +481,16 @@
     return !this.hideButtons && !this.showSetupButtons_ && this.isSyncing_();
   }
 
+  private getTurnOffSyncLabel_(turnOffSync: string): string {
+    if (loadTimeData.getBoolean('isImprovedSettingsUIOnDesktopEnabled') &&
+        this.syncStatus.hasError && this.syncStatus.secondaryButtonActionText &&
+        this.isSyncing_()) {
+      return this.syncStatus.secondaryButtonActionText;
+    }
+
+    return turnOffSync;
+  }
+
   private shouldShowErrorActionButton_(): boolean {
     if (this.embeddedInSubpage &&
         this.syncStatus.statusAction === StatusAction.ENTER_PASSPHRASE) {
diff --git a/chrome/browser/resources/settings_shared/people_page/sync_browser_proxy.ts b/chrome/browser/resources/settings_shared/people_page/sync_browser_proxy.ts
index 0ed58f8..aa40bec36 100644
--- a/chrome/browser/resources/settings_shared/people_page/sync_browser_proxy.ts
+++ b/chrome/browser/resources/settings_shared/people_page/sync_browser_proxy.ts
@@ -45,6 +45,7 @@
   signedInState?: SignedInState;
   signedInUsername?: string;
   statusActionText?: string;
+  secondaryButtonActionText?: string;
   statusText?: string;
   supervisedUser?: boolean;
   syncCookiesSupported?: boolean;
diff --git a/chrome/browser/safe_browsing/extension_telemetry/extension_telemetry_service_browsertest.cc b/chrome/browser/safe_browsing/extension_telemetry/extension_telemetry_service_browsertest.cc
index a281f160..a7111dbd 100644
--- a/chrome/browser/safe_browsing/extension_telemetry/extension_telemetry_service_browsertest.cc
+++ b/chrome/browser/safe_browsing/extension_telemetry/extension_telemetry_service_browsertest.cc
@@ -76,8 +76,7 @@
         {kExtensionTelemetryForEnterprise,
          kExtensionTelemetryDeclarativeNetRequestActionSignal,
          extensions_features::kIncludeJSCallStackInExtensionApiRequest},
-        /*disabled_features=*/
-        {kExtensionTelemetryInterceptRemoteHostsContactedInRenderer});
+        /*disabled_features=*/{});
     CHECK(base::PathService::Get(chrome::DIR_TEST_DATA, &test_extension_dir_));
     test_extension_dir_ =
         test_extension_dir_.AppendASCII("safe_browsing/extension_telemetry");
@@ -163,88 +162,6 @@
 };
 
 IN_PROC_BROWSER_TEST_F(ExtensionTelemetryServiceBrowserTest,
-                       DetectsAndReportsRemoteHostContactedSignal) {
-  SetSafeBrowsingState(browser()->profile()->GetPrefs(),
-                       SafeBrowsingState::ENHANCED_PROTECTION);
-  ASSERT_TRUE(StartEmbeddedTestServer());
-
-  extensions::ResultCatcher result_catcher;
-  // Load extension from the test extension directory.
-  const auto* extension =
-      LoadExtension(test_extension_dir_.AppendASCII("basic_crx"));
-  ASSERT_TRUE(extension);
-  ASSERT_TRUE(result_catcher.GetNextResult());
-
-  // Successfully retrieve the extension telemetry instance.
-  ASSERT_NE(telemetry_service(), nullptr);
-  ASSERT_TRUE(IsTelemetryServiceEnabledForESB());
-  // Process signal.
-  {
-    // Verify that the registered extension information is saved in the
-    // telemetry service's extension store.
-    const ExtensionInfo* info =
-        GetExtensionInfoFromExtensionStore(extension->id());
-    EXPECT_EQ(extension->name(), kExtensionName);
-    EXPECT_EQ(extension->id(), extension->id());
-    EXPECT_EQ(info->version(), kExtensionVersion);
-  }
-  // Generate ESB telemetry report and verify the contents.
-  std::unique_ptr<TelemetryReport> telemetry_report_pb = GetTelemetryReport();
-  ASSERT_NE(telemetry_report_pb, nullptr);
-  // Retrieve the report corresponding to the test extension.
-  int report_index = -1;
-  for (int i = 0; i < telemetry_report_pb->reports_size(); i++) {
-    if (telemetry_report_pb->reports(i).extension().id() == extension->id()) {
-      report_index = i;
-    }
-  }
-  ASSERT_NE(report_index, -1);
-  const auto& extension_report = telemetry_report_pb->reports(report_index);
-  EXPECT_EQ(extension_report.extension().id(), extension->id());
-  EXPECT_EQ(extension_report.extension().name(), kExtensionName);
-  EXPECT_EQ(extension_report.extension().version(), kExtensionVersion);
-  // Verify the designated test extension's report has signal data.
-  ASSERT_EQ(extension_report.signals().size(), 1);
-  // Verify that extension store has been cleared after creating a telemetry
-  // report.
-  EXPECT_TRUE(IsExtensionStoreEmpty());
-  // Verify signal proto from the reports.
-  const ExtensionTelemetryReportRequest_SignalInfo& signal =
-      extension_report.signals()[0];
-  const RemoteHostContactedInfo& remote_host_contacted_info =
-      signal.remote_host_contacted_info();
-  ASSERT_EQ(remote_host_contacted_info.remote_host_size(), 2);
-  EXPECT_FALSE(remote_host_contacted_info.collected_from_new_interception());
-
-  const RemoteHostInfo& remote_host_info =
-      remote_host_contacted_info.remote_host(0);
-  EXPECT_EQ(remote_host_info.contact_count(), static_cast<uint32_t>(1));
-  EXPECT_EQ(remote_host_info.url(), kExtensionContactedHost);
-  EXPECT_EQ(remote_host_info.connection_protocol(), RemoteHostInfo::HTTP_HTTPS);
-  EXPECT_EQ(remote_host_info.contacted_by(), RemoteHostInfo::EXTENSION);
-  const RemoteHostInfo& remote_host_contacted_info_websocket =
-      remote_host_contacted_info.remote_host(1);
-  EXPECT_EQ(remote_host_contacted_info_websocket.contact_count(),
-            static_cast<uint32_t>(1));
-  EXPECT_EQ(remote_host_contacted_info_websocket.url(),
-            kExtensionContactedHost);
-  EXPECT_EQ(remote_host_contacted_info_websocket.connection_protocol(),
-            RemoteHostInfo::WEBSOCKET);
-  EXPECT_EQ(remote_host_contacted_info_websocket.contacted_by(),
-            RemoteHostInfo::EXTENSION);
-
-  // Verify enterprise telemetry reporting.
-  ASSERT_TRUE(IsTelemetryServiceEnabledForEnterprise());
-  std::unique_ptr<TelemetryReport> enterprise_telemetry_report_pb =
-      GetTelemetryReportForEnterprise();
-  const auto& enterprise_extension_report =
-      enterprise_telemetry_report_pb->reports(0);
-
-  EXPECT_THAT(extension_report, EqualsProto(enterprise_extension_report));
-  EXPECT_TRUE(IsEnterpriseExtensionStoreEmpty());
-}
-
-IN_PROC_BROWSER_TEST_F(ExtensionTelemetryServiceBrowserTest,
                        DetectsAndReportsCookiesGetAllSignal) {
   SetSafeBrowsingState(browser()->profile()->GetPrefs(),
                        SafeBrowsingState::ENHANCED_PROTECTION);
@@ -859,24 +776,8 @@
   EXPECT_TRUE(IsEnterpriseExtensionStoreEmpty());
 }
 
-// Test fixture with kExtensionTelemetryInterceptRemoteHostsContactedInRenderer
-// enabled.
-class
-    ExtensionTelemetryServiceBrowserTestWithInterceptRemoteHostsContactedInRendererEnabled
-    : public ExtensionTelemetryServiceBrowserTest {
- public:
-  ExtensionTelemetryServiceBrowserTestWithInterceptRemoteHostsContactedInRendererEnabled() {
-    scoped_feature_list_.Reset();
-    scoped_feature_list_.InitWithFeatures(
-        /*enabled_features=*/
-        {kExtensionTelemetryInterceptRemoteHostsContactedInRenderer},
-        /*disabled_features=*/{});
-  }
-};
-
-IN_PROC_BROWSER_TEST_F(
-    ExtensionTelemetryServiceBrowserTestWithInterceptRemoteHostsContactedInRendererEnabled,
-    InterceptsRemoteHostContactedSignalInRenderer) {
+IN_PROC_BROWSER_TEST_F(ExtensionTelemetryServiceBrowserTest,
+                       InterceptsRemoteHostContactedSignalInRenderer) {
   SetSafeBrowsingState(browser()->profile()->GetPrefs(),
                        SafeBrowsingState::ENHANCED_PROTECTION);
   ASSERT_TRUE(StartEmbeddedTestServer());
@@ -944,9 +845,8 @@
   }
 }
 
-IN_PROC_BROWSER_TEST_F(
-    ExtensionTelemetryServiceBrowserTestWithInterceptRemoteHostsContactedInRendererEnabled,
-    DetectsWebRequestFromContentScript) {
+IN_PROC_BROWSER_TEST_F(ExtensionTelemetryServiceBrowserTest,
+                       DetectsWebRequestFromContentScript) {
   SetSafeBrowsingState(browser()->profile()->GetPrefs(),
                        SafeBrowsingState::ENHANCED_PROTECTION);
   ASSERT_TRUE(StartEmbeddedTestServer());
diff --git a/chrome/browser/safe_browsing/extension_telemetry/extension_web_request_reporter_impl.cc b/chrome/browser/safe_browsing/extension_telemetry/extension_web_request_reporter_impl.cc
index c3de5e0..d621d911 100644
--- a/chrome/browser/safe_browsing/extension_telemetry/extension_web_request_reporter_impl.cc
+++ b/chrome/browser/safe_browsing/extension_telemetry/extension_web_request_reporter_impl.cc
@@ -8,7 +8,6 @@
 #include "chrome/browser/safe_browsing/extension_telemetry/extension_telemetry_service_factory.h"
 #include "chrome/browser/safe_browsing/extension_telemetry/remote_host_contacted_signal.h"
 #include "components/safe_browsing/content/common/safe_browsing.mojom-shared.h"
-#include "components/safe_browsing/core/common/features.h"
 #include "content/public/browser/browser_thread.h"
 
 namespace safe_browsing {
@@ -81,10 +80,7 @@
     mojom::WebRequestContactInitiatorType contact_initiator_type) {
   auto* telemetry_service =
       safe_browsing::ExtensionTelemetryServiceFactory::GetForProfile(profile_);
-  if (!telemetry_service || !telemetry_service->enabled() ||
-      !base::FeatureList::IsEnabled(
-          safe_browsing::
-              kExtensionTelemetryInterceptRemoteHostsContactedInRenderer)) {
+  if (!telemetry_service || !telemetry_service->enabled()) {
     return;
   }
 
diff --git a/chrome/browser/safe_browsing/extension_telemetry/remote_host_contacted_signal_processor.cc b/chrome/browser/safe_browsing/extension_telemetry/remote_host_contacted_signal_processor.cc
index c2e406e..1c63a9a 100644
--- a/chrome/browser/safe_browsing/extension_telemetry/remote_host_contacted_signal_processor.cc
+++ b/chrome/browser/safe_browsing/extension_telemetry/remote_host_contacted_signal_processor.cc
@@ -6,7 +6,6 @@
 
 #include "base/check_op.h"
 #include "chrome/browser/safe_browsing/extension_telemetry/remote_host_contacted_signal.h"
-#include "components/safe_browsing/core/common/features.h"
 
 namespace safe_browsing {
 
@@ -66,10 +65,7 @@
         std::move(remote_host_info);
   }
 
-  if (base::FeatureList::IsEnabled(
-          kExtensionTelemetryInterceptRemoteHostsContactedInRenderer)) {
     remote_host_contacted_info->set_collected_from_new_interception(true);
-  }
 
   // Clear the data in the remote host urls store.
   remote_host_contacted_store_.erase(remote_host_info_store_entry);
diff --git a/chrome/browser/safe_browsing/incident_reporting/last_download_finder.cc b/chrome/browser/safe_browsing/incident_reporting/last_download_finder.cc
index 36a814d2..ac0e275 100644
--- a/chrome/browser/safe_browsing/incident_reporting/last_download_finder.cc
+++ b/chrome/browser/safe_browsing/incident_reporting/last_download_finder.cc
@@ -266,10 +266,7 @@
     : download_details_getter_(std::move(download_details_getter)),
       callback_(std::move(callback)) {
   // Begin the search for all existing profiles.
-  for (auto* profile :
-       g_browser_process->profile_manager()->GetLoadedProfiles()) {
-    SearchInProfile(profile);
-  }
+  SearchInProfiles(g_browser_process->profile_manager()->GetLoadedProfiles());
 
   // Also search on new profiles when they are added.
   g_browser_process->profile_manager()->AddObserver(this);
@@ -292,23 +289,39 @@
 }
 
 void LastDownloadFinder::SearchInProfile(Profile* profile) {
-  // Do not look in OTR profiles or in profiles that do not participate in
-  // safe browsing extended reporting.
-  if (!IncidentReportingService::IsEnabledForProfile(profile))
-    return;
+  SearchInProfiles({profile});
+}
 
-  // Try to initiate a metadata search.
-  ProfileKey profile_key = KeyForProfile(profile);
-  auto [iter, inserted] = pending_profiles_.try_emplace(
-      profile_key, this, profile, PendingProfileData::WAITING_FOR_METADATA);
+void LastDownloadFinder::SearchInProfiles(
+    const std::vector<Profile*>& profiles) {
+  std::vector<std::pair<Profile*, ProfileKey>> keys_to_search;
+  keys_to_search.reserve(profiles.size());
 
-  // If the profile was already being processed, do nothing.
-  if (!inserted) {
-    return;
+  for (Profile* profile : profiles) {
+    // Do not look in OTR profiles or in profiles that do not participate in
+    // safe browsing extended reporting.
+    if (!IncidentReportingService::IsEnabledForProfile(profile)) {
+      continue;
+    }
+
+    // Try to initiate a metadata search.
+    ProfileKey profile_key = KeyForProfile(profile);
+    auto [iter, inserted] = pending_profiles_.try_emplace(
+        profile_key, this, profile, PendingProfileData::WAITING_FOR_METADATA);
+
+    // If the profile was already being processed, do nothing.
+    if (!inserted) {
+      continue;
+    }
+
+    keys_to_search.emplace_back(profile, profile_key);
   }
-  download_details_getter_.Run(
-      profile, base::BindOnce(&LastDownloadFinder::OnMetadataQuery,
-                              weak_ptr_factory_.GetWeakPtr(), profile_key));
+
+  for (auto [profile, profile_key] : keys_to_search) {
+    download_details_getter_.Run(
+        profile, base::BindOnce(&LastDownloadFinder::OnMetadataQuery,
+                                weak_ptr_factory_.GetWeakPtr(), profile_key));
+  }
 }
 
 void LastDownloadFinder::OnMetadataQuery(
diff --git a/chrome/browser/safe_browsing/incident_reporting/last_download_finder.h b/chrome/browser/safe_browsing/incident_reporting/last_download_finder.h
index 71e3e46..240e56e 100644
--- a/chrome/browser/safe_browsing/incident_reporting/last_download_finder.h
+++ b/chrome/browser/safe_browsing/incident_reporting/last_download_finder.h
@@ -111,6 +111,12 @@
   // extended reporting. A search for metadata is initiated immediately.
   void SearchInProfile(Profile* profile);
 
+  // Adds every profile in `profiles` to the set of profiles to be searched if
+  // it is an on-the-record profile with history that participates in safe
+  // browsing extended reporting. A search for metadata is initiated
+  // immediately.
+  void SearchInProfiles(const std::vector<Profile*>& profiles);
+
   // DownloadMetadataManager::GetDownloadDetailsCallback. If |details| are
   // provided, retrieves them if they are the most relevant results. Otherwise
   // begins a search in history. Reports results if there are no more pending
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 49b8e2c..2a3ad93 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
@@ -5,6 +5,7 @@
 package org.chromium.chrome.browser.safety_hub;
 
 import static org.chromium.chrome.browser.safety_hub.SafetyHubMetricUtils.getDashboardModuleTypeForModuleOption;
+import static org.chromium.chrome.browser.safety_hub.SafetyHubMetricUtils.maybeRecordAbusiveNotificationRevokedInteraction;
 import static org.chromium.chrome.browser.safety_hub.SafetyHubMetricUtils.recordDashboardInteractions;
 import static org.chromium.chrome.browser.safety_hub.SafetyHubMetricUtils.recordModuleState;
 import static org.chromium.chrome.browser.safety_hub.SafetyHubMetricUtils.recordNotificationsInteraction;
@@ -296,11 +297,18 @@
                                                     recordRevokedPermissionsInteraction(
                                                             PermissionsModuleInteractions
                                                                     .UNDO_ACKNOWLEDGE_ALL);
+                                                    maybeRecordAbusiveNotificationRevokedInteraction(
+                                                            (PermissionsData[]) actionData,
+                                                            PermissionsModuleInteractions
+                                                                    .UNDO_ACKNOWLEDGE_ALL);
                                                 }
                                             },
                                             permissionsDataList);
                                     recordRevokedPermissionsInteraction(
                                             PermissionsModuleInteractions.ACKNOWLEDGE_ALL);
+                                    maybeRecordAbusiveNotificationRevokedInteraction(
+                                            permissionsDataList,
+                                            PermissionsModuleInteractions.ACKNOWLEDGE_ALL);
                                 })
                         .with(
                                 SafetyHubModuleProperties.SECONDARY_BUTTON_LISTENER,
diff --git a/chrome/browser/safety_hub/android/java/src/org/chromium/chrome/browser/safety_hub/SafetyHubMetricUtils.java b/chrome/browser/safety_hub/android/java/src/org/chromium/chrome/browser/safety_hub/SafetyHubMetricUtils.java
index 50eab9c..b65124a 100644
--- a/chrome/browser/safety_hub/android/java/src/org/chromium/chrome/browser/safety_hub/SafetyHubMetricUtils.java
+++ b/chrome/browser/safety_hub/android/java/src/org/chromium/chrome/browser/safety_hub/SafetyHubMetricUtils.java
@@ -11,10 +11,12 @@
 import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.chrome.browser.safety_hub.SafetyHubModuleProperties.ModuleOption;
 import org.chromium.chrome.browser.safety_hub.SafetyHubModuleProperties.ModuleState;
+import org.chromium.components.content_settings.ContentSettingsType;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.util.StringJoiner;
+import java.util.stream.IntStream;
 
 /** Helper utils to log UMA histograms for Safety Hub. */
 public class SafetyHubMetricUtils {
@@ -37,6 +39,10 @@
     @VisibleForTesting
     public static final String MODULE_STATE_HISTOGRAM_NAME = "Settings.SafetyHub";
 
+    @VisibleForTesting
+    public static final String ABUSIVE_NOTIFICATION_REVOCATION_INTERACTIONS_HISTOGRAM_NAME =
+            "Settings.SafetyHub.AbusiveNotificationPermissionRevocation.Interactions";
+
     /**
      * Interactions on surfaces outside of the Safety Hub settings pages. These can be in the Magic
      * Stack or in other settings surfaces. Must be kept in sync with SafetyHubExternalInteractions
@@ -236,4 +242,19 @@
         RecordHistogram.recordEnumeratedHistogram(
                 DASHBOARD_INTERACTIONS_HISTOGRAM_NAME, value, DashboardInteractions.MAX_VALUE);
     }
+
+    static void maybeRecordAbusiveNotificationRevokedInteraction(
+            PermissionsData[] permissionsDataList, @PermissionsModuleInteractions int value) {
+        // If any of the `PermissionsData` objects include notifications, log the histogram once.
+        for (PermissionsData permissionsData : permissionsDataList) {
+            if (IntStream.of(permissionsData.getPermissions())
+                    .anyMatch(x -> x == ContentSettingsType.NOTIFICATIONS)) {
+                RecordHistogram.recordEnumeratedHistogram(
+                        ABUSIVE_NOTIFICATION_REVOCATION_INTERACTIONS_HISTOGRAM_NAME,
+                        value,
+                        PermissionsModuleInteractions.MAX_VALUE);
+                return;
+            }
+        }
+    }
 }
diff --git a/chrome/browser/safety_hub/android/java/src/org/chromium/chrome/browser/safety_hub/SafetyHubPermissionsFragment.java b/chrome/browser/safety_hub/android/java/src/org/chromium/chrome/browser/safety_hub/SafetyHubPermissionsFragment.java
index 443d3f3..5fc4862 100644
--- a/chrome/browser/safety_hub/android/java/src/org/chromium/chrome/browser/safety_hub/SafetyHubPermissionsFragment.java
+++ b/chrome/browser/safety_hub/android/java/src/org/chromium/chrome/browser/safety_hub/SafetyHubPermissionsFragment.java
@@ -4,6 +4,7 @@
 
 package org.chromium.chrome.browser.safety_hub;
 
+import static org.chromium.chrome.browser.safety_hub.SafetyHubMetricUtils.maybeRecordAbusiveNotificationRevokedInteraction;
 import static org.chromium.chrome.browser.safety_hub.SafetyHubMetricUtils.recordRevokedPermissionsInteraction;
 
 import android.os.Bundle;
@@ -65,10 +66,15 @@
                                     (PermissionsData[]) actionData);
                             recordRevokedPermissionsInteraction(
                                     PermissionsModuleInteractions.UNDO_ACKNOWLEDGE_ALL);
+                            maybeRecordAbusiveNotificationRevokedInteraction(
+                                    (PermissionsData[]) actionData,
+                                    PermissionsModuleInteractions.UNDO_ACKNOWLEDGE_ALL);
                         }
                     },
                     permissionsDataList);
             recordRevokedPermissionsInteraction(PermissionsModuleInteractions.ACKNOWLEDGE_ALL);
+            maybeRecordAbusiveNotificationRevokedInteraction(
+                    permissionsDataList, PermissionsModuleInteractions.ACKNOWLEDGE_ALL);
         }
     }
 
@@ -90,10 +96,19 @@
                                     (PermissionsData) actionData);
                             recordRevokedPermissionsInteraction(
                                     PermissionsModuleInteractions.UNDO_ALLOW_AGAIN);
+                            PermissionsData[] permissionsDataList =
+                                    new PermissionsData[] {(PermissionsData) actionData};
+                            maybeRecordAbusiveNotificationRevokedInteraction(
+                                    permissionsDataList,
+                                    PermissionsModuleInteractions.UNDO_ALLOW_AGAIN);
                         }
                     },
                     permissionsData);
             recordRevokedPermissionsInteraction(PermissionsModuleInteractions.ALLOW_AGAIN);
+            PermissionsData[] permissionsDataList = new PermissionsData[] {permissionsData};
+            permissionsDataList[0] = permissionsData;
+            maybeRecordAbusiveNotificationRevokedInteraction(
+                    permissionsDataList, PermissionsModuleInteractions.ALLOW_AGAIN);
         }
         return false;
     }
diff --git a/chrome/browser/safety_hub/android/javatests/src/org/chromium/chrome/browser/safety_hub/SafetyHubTest.java b/chrome/browser/safety_hub/android/javatests/src/org/chromium/chrome/browser/safety_hub/SafetyHubTest.java
index 5af3028c..b1d70e4 100644
--- a/chrome/browser/safety_hub/android/javatests/src/org/chromium/chrome/browser/safety_hub/SafetyHubTest.java
+++ b/chrome/browser/safety_hub/android/javatests/src/org/chromium/chrome/browser/safety_hub/SafetyHubTest.java
@@ -30,6 +30,7 @@
 import static org.hamcrest.Matchers.not;
 import static org.junit.Assert.assertEquals;
 
+import static org.chromium.chrome.browser.safety_hub.SafetyHubMetricUtils.ABUSIVE_NOTIFICATION_REVOCATION_INTERACTIONS_HISTOGRAM_NAME;
 import static org.chromium.chrome.browser.safety_hub.SafetyHubMetricUtils.DASHBOARD_INTERACTIONS_HISTOGRAM_NAME;
 import static org.chromium.chrome.browser.safety_hub.SafetyHubMetricUtils.NOTIFICATIONS_INTERACTIONS_HISTOGRAM_NAME;
 import static org.chromium.chrome.browser.safety_hub.SafetyHubMetricUtils.PERMISSIONS_INTERACTIONS_HISTOGRAM_NAME;
@@ -250,6 +251,8 @@
                                 PERMISSIONS_INTERACTIONS_HISTOGRAM_NAME,
                                 PermissionsModuleInteractions.ALLOW_AGAIN,
                                 PermissionsModuleInteractions.UNDO_ALLOW_AGAIN)
+                        .expectNoRecords(
+                                ABUSIVE_NOTIFICATION_REVOCATION_INTERACTIONS_HISTOGRAM_NAME)
                         .build();
 
         // Regrant the permissions by clicking the corresponding action button.
@@ -277,6 +280,8 @@
                                 PermissionsModuleInteractions.OPEN_REVIEW_UI,
                                 PermissionsModuleInteractions.ACKNOWLEDGE_ALL,
                                 PermissionsModuleInteractions.UNDO_ACKNOWLEDGE_ALL)
+                        .expectNoRecords(
+                                ABUSIVE_NOTIFICATION_REVOCATION_INTERACTIONS_HISTOGRAM_NAME)
                         .build();
 
         // Verify the permissions module is displaying the info state.
@@ -906,6 +911,8 @@
                                 PERMISSIONS_INTERACTIONS_HISTOGRAM_NAME,
                                 PermissionsModuleInteractions.ACKNOWLEDGE_ALL,
                                 PermissionsModuleInteractions.UNDO_ACKNOWLEDGE_ALL)
+                        .expectNoRecords(
+                                ABUSIVE_NOTIFICATION_REVOCATION_INTERACTIONS_HISTOGRAM_NAME)
                         .build();
 
         // Verify the permissions module is displaying the info state.
@@ -1228,6 +1235,91 @@
         histogramWatcher.assertExpected();
     }
 
+    @Test
+    @LargeTest
+    @Feature({"SafetyHubPermissions"})
+    public void testAbusiveNotificationPermissionRegrant() {
+        mUnusedPermissionsBridge.setPermissionsDataForReview(
+                new PermissionsData[] {PERMISSIONS_DATA_3});
+        mPermissionsFragmentTestRule.startSettingsActivity();
+        var histogramWatcher =
+                HistogramWatcher.newBuilder()
+                        .expectIntRecords(
+                                ABUSIVE_NOTIFICATION_REVOCATION_INTERACTIONS_HISTOGRAM_NAME,
+                                PermissionsModuleInteractions.ALLOW_AGAIN,
+                                PermissionsModuleInteractions.UNDO_ALLOW_AGAIN)
+                        .expectIntRecords(
+                                PERMISSIONS_INTERACTIONS_HISTOGRAM_NAME,
+                                PermissionsModuleInteractions.ALLOW_AGAIN,
+                                PermissionsModuleInteractions.UNDO_ALLOW_AGAIN)
+                        .build();
+
+        // Regrant the permissions by clicking the corresponding action button.
+        clickOnButtonNextToText(PERMISSIONS_DATA_3.getOrigin());
+        onView(withText(PERMISSIONS_DATA_3.getOrigin())).check(doesNotExist());
+
+        // Click on the action button of the snackbar to undo the above action.
+        onViewWaiting(withText(R.string.undo)).perform(click());
+        onViewWaiting(withText(PERMISSIONS_DATA_3.getOrigin())).check(matches(isDisplayed()));
+
+        histogramWatcher.assertExpected();
+    }
+
+    @Test
+    @LargeTest
+    @Feature({"SafetyHubPermissions"})
+    public void testClearAbusiveNotificationPermissionsReviewList() {
+        mUnusedPermissionsBridge.setPermissionsDataForReview(
+                new PermissionsData[] {PERMISSIONS_DATA_3});
+        mSafetyHubFragmentTestRule.startSettingsActivity();
+        var histogramWatcher =
+                HistogramWatcher.newBuilder()
+                        .expectIntRecords(
+                                ABUSIVE_NOTIFICATION_REVOCATION_INTERACTIONS_HISTOGRAM_NAME,
+                                PermissionsModuleInteractions.ACKNOWLEDGE_ALL,
+                                PermissionsModuleInteractions.UNDO_ACKNOWLEDGE_ALL)
+                        .expectIntRecords(
+                                PERMISSIONS_INTERACTIONS_HISTOGRAM_NAME,
+                                PermissionsModuleInteractions.OPEN_REVIEW_UI,
+                                PermissionsModuleInteractions.ACKNOWLEDGE_ALL,
+                                PermissionsModuleInteractions.UNDO_ACKNOWLEDGE_ALL)
+                        .build();
+
+        // Verify the permissions module is displaying the info state.
+        String permissionsTitle =
+                mSafetyHubFragmentTestRule
+                        .getActivity()
+                        .getResources()
+                        .getQuantityString(R.plurals.safety_hub_permissions_warning_title, 1, 1);
+        scrollToExpandedPreference(permissionsTitle);
+        onView(withText(permissionsTitle)).check(matches(isDisplayed()));
+
+        // Module should be expanded initially since it's in an info state and there are no other
+        // warning states.
+        verifyButtonsNextToTextVisibility(permissionsTitle, true);
+
+        // Open the permissions subpage.
+        clickOnSecondaryButtonNextToText(permissionsTitle);
+
+        // Verify that 2 sites are displayed.
+        onView(withText(PERMISSIONS_DATA_3.getOrigin())).check(matches(isDisplayed()));
+
+        // Click the button at the bottom of the page.
+        onView(withText(R.string.got_it)).perform(click());
+
+        // Verify tha the permissions subpage has been dismissed and the state of the permissions
+        // module has changed.
+        onViewWaiting(withText(R.string.safety_hub_permissions_ok_title))
+                .check(matches(isDisplayed()));
+
+        // Click on the snackbar action button and verify that the info state is displayed
+        // again.
+        onViewWaiting(withText(R.string.undo)).perform(click());
+        onViewWaiting(withText(permissionsTitle)).check(matches(isDisplayed()));
+
+        histogramWatcher.assertExpected();
+    }
+
     private void clickOnPreferenceWithTextAndWaitForActivity(
             Matcher<View> matcher, String expectedUrl) {
         CustomTabActivity cta =
diff --git a/chrome/browser/site_isolation/chrome_site_per_process_browsertest.cc b/chrome/browser/site_isolation/chrome_site_per_process_browsertest.cc
index e7d556f9..d978435 100644
--- a/chrome/browser/site_isolation/chrome_site_per_process_browsertest.cc
+++ b/chrome/browser/site_isolation/chrome_site_per_process_browsertest.cc
@@ -1468,87 +1468,6 @@
   EXPECT_EQ(first_web_contents, tab_strip_model->GetActiveWebContents());
 }
 
-class ChromeSitePerProcessTestWithVerifiedUserActivation
-    : public ChromeSitePerProcessTest {
- public:
-  ChromeSitePerProcessTestWithVerifiedUserActivation() {
-    feature_list()->Reset();
-    feature_list()->InitWithFeatures(
-        /*enabled_features=*/{features::kBrowserVerifiedUserActivationMouse},
-        // TODO(crbug.com/40248833): Use HTTPS URLs in tests to avoid having to
-        // disable this feature.
-        /*disabled_features=*/{features::kHttpsUpgrades});
-  }
-};
-
-// Test mouse down activation notification with browser verification.
-// TODO(crbug.com/40826005): Flaky on Mac.
-#if BUILDFLAG(IS_MAC)
-#define MAYBE_UserActivationBrowserVerificationSameOriginSite \
-  DISABLED_UserActivationBrowserVerificationSameOriginSite
-#else
-#define MAYBE_UserActivationBrowserVerificationSameOriginSite \
-  UserActivationBrowserVerificationSameOriginSite
-#endif
-IN_PROC_BROWSER_TEST_F(ChromeSitePerProcessTestWithVerifiedUserActivation,
-                       MAYBE_UserActivationBrowserVerificationSameOriginSite) {
-  // Start on a page a.com with same-origin iframe on a.com and cross-origin
-  // iframe b.com.
-  GURL main_url(embedded_test_server()->GetURL(
-      "a.com", "/cross_site_iframe_factory.html?a(a(b))"));
-  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), main_url));
-  content::WebContents* web_contents =
-      browser()->tab_strip_model()->GetActiveWebContents();
-  content::RenderFrameHost* frame_a =
-      ChildFrameAt(web_contents->GetPrimaryMainFrame(), 0);
-  content::RenderFrameHost* frame_b = ChildFrameAt(frame_a, 0);
-
-  // The test becomes flaky if we don't wait for frame_a's hit-test data before
-  // sending the mouse-event below (crbug.com/1119342).
-  content::WaitForHitTestData(frame_a);
-
-  // Activate frame_a by clicking at the midpoints of top-left corners of
-  // frame_a and frame_b.
-  gfx::Rect bounds_a = frame_a->GetView()->GetViewBounds();
-  gfx::Rect bounds_b = frame_b->GetView()->GetViewBounds();
-  content::SimulateMouseClickAt(web_contents, 0 /* modifiers */,
-                                blink::WebMouseEvent::Button::kLeft,
-                                gfx::Point((bounds_a.x() + bounds_b.x()) / 2,
-                                           (bounds_a.y() + bounds_b.y()) / 2));
-
-  // Add a popup observer.
-  content::TestNavigationObserver popup_observer(nullptr);
-  popup_observer.StartWatchingNewWebContents();
-
-  // Try opening popups from frame_b and root frame.
-  GURL popup_url(embedded_test_server()->GetURL("popup.com", "/"));
-  EXPECT_TRUE(
-      ExecJs(frame_b,
-             content::JsReplace("window.w = window.open($1 + 'title1.html');",
-                                popup_url),
-             content::EXECUTE_SCRIPT_NO_USER_GESTURE));
-  EXPECT_TRUE(
-      ExecJs(web_contents,
-             content::JsReplace("window.w = window.open($1 + 'title2.html');",
-                                popup_url),
-             content::EXECUTE_SCRIPT_NO_USER_GESTURE));
-
-  // Wait and check that only one popup has opened.
-  popup_observer.Wait();
-  EXPECT_EQ(2, browser()->tab_strip_model()->count());
-
-  content::WebContents* popup =
-      browser()->tab_strip_model()->GetActiveWebContents();
-  EXPECT_EQ(embedded_test_server()->GetURL("popup.com", "/title2.html"),
-            popup->GetLastCommittedURL());
-  EXPECT_NE(popup, web_contents);
-
-  // Confirm that only the root_frame opened the popup.
-  EXPECT_EQ(true, content::EvalJs(web_contents, "!!window.w"));
-
-  EXPECT_EQ(false, content::EvalJs(frame_b, "!!window.w"));
-}
-
 IN_PROC_BROWSER_TEST_F(ChromeSitePerProcessTest, JSPrintDuringSwap) {
   content::WebContents* contents =
       browser()->tab_strip_model()->GetActiveWebContents();
diff --git a/chrome/browser/ssl/ssl_browsertest.cc b/chrome/browser/ssl/ssl_browsertest.cc
index a67ec16..291fa18 100644
--- a/chrome/browser/ssl/ssl_browsertest.cc
+++ b/chrome/browser/ssl/ssl_browsertest.cc
@@ -325,8 +325,9 @@
   ChromeContentBrowserClientForMixedContentTest& operator=(
       const ChromeContentBrowserClientForMixedContentTest&) = delete;
 
-  void OverrideWebkitPrefs(
+  void OverrideWebPreferences(
       content::WebContents* web_contents,
+      content::SiteInstance& main_frame_site,
       blink::web_pref::WebPreferences* web_prefs) override {
     web_prefs->allow_running_insecure_content = allow_running_insecure_content_;
     web_prefs->strict_mixed_content_checking = strict_mixed_content_checking_;
diff --git a/chrome/browser/sync/sync_ui_util.cc b/chrome/browser/sync/sync_ui_util.cc
index e4716f7a..a20d5a6 100644
--- a/chrome/browser/sync/sync_ui_util.cc
+++ b/chrome/browser/sync/sync_ui_util.cc
@@ -292,14 +292,17 @@
 
 SyncStatusLabels GetAvatarSyncErrorLabelsForSettings(
     AvatarSyncErrorType error) {
-  // check flag disabled.
   switch (error) {
     case AvatarSyncErrorType::kSyncPaused:
-    // not sure what to return here;
+      return {SyncStatusMessageType::kSyncError, IDS_SYNC_RELOGIN_ERROR,
+              IDS_SYNC_RELOGIN_BUTTON, IDS_SYNC_EMPTY_STRING,
+              SyncStatusActionType::kReauthenticate};
+
     case AvatarSyncErrorType::kTrustedVaultKeyMissingForPasswordsError:
       return {SyncStatusMessageType::kPasswordsOnlySyncError,
               IDS_SETTINGS_ERROR_PASSWORDS_USER_ERROR_DESCRIPTION,
-              IDS_SYNC_STATUS_NEEDS_KEYS_BUTTON, IDS_SYNC_EMPTY_STRING,
+              IDS_SYNC_STATUS_NEEDS_KEYS_BUTTON,
+              IDS_PROFILES_ACCOUNT_REMOVAL_TITLE,
               SyncStatusActionType::kRetrieveTrustedVaultKeys};
 
     case AvatarSyncErrorType::
@@ -307,13 +310,13 @@
       return {
           SyncStatusMessageType::kPasswordsOnlySyncError,
           IDS_SETTINGS_ERROR_RECOVERABILITY_DEGRADED_FOR_PASSWORDS_USER_ERROR_DESCRIPTION,
-          IDS_SYNC_STATUS_NEEDS_KEYS_BUTTON, IDS_SYNC_EMPTY_STRING,
+          IDS_SYNC_STATUS_NEEDS_KEYS_BUTTON, IDS_PROFILES_ACCOUNT_REMOVAL_TITLE,
           SyncStatusActionType::kRetrieveTrustedVaultKeys};
 
     case AvatarSyncErrorType::kPassphraseError:
       return {SyncStatusMessageType::kSyncError,
               IDS_SETTINGS_ERROR_PASSPHRASE_USER_ERROR_DESCRIPTION,
-              IDS_SYNC_STATUS_NEEDS_PASSWORD_BUTTON, IDS_SYNC_EMPTY_STRING,
+              IDS_SYNC_STATUS_NEEDS_PASSWORD_BUTTON, IDS_PROFILE_MENU_SIGN_OUT,
               SyncStatusActionType::kEnterPassphrase};
 
     case AvatarSyncErrorType::
@@ -321,31 +324,34 @@
     case AvatarSyncErrorType::kTrustedVaultKeyMissingForEverythingError:
       return {SyncStatusMessageType::kSyncError,
               IDS_SETTINGS_ERROR_TRUSTED_VAULT_USER_ERROR_DESCRIPTION,
-              IDS_SYNC_STATUS_NEEDS_PASSWORD_BUTTON, IDS_SYNC_EMPTY_STRING,
+              IDS_SYNC_STATUS_NEEDS_KEYS_BUTTON,
+              IDS_PROFILES_ACCOUNT_REMOVAL_TITLE,
               SyncStatusActionType::kRetrieveTrustedVaultKeys};
 
     case AvatarSyncErrorType::kUpgradeClientError:
       return {SyncStatusMessageType::kSyncError,
               IDS_SETTINGS_ERROR_UPGRADE_CLIENT_USER_ERROR_DESCRIPTION,
-              IDS_SYNC_UPGRADE_CLIENT_BUTTON, IDS_SYNC_EMPTY_STRING,
+              IDS_SYNC_UPGRADE_CLIENT_BUTTON, IDS_PROFILE_MENU_SIGN_OUT,
               SyncStatusActionType::kUpgradeClient};
 
     case AvatarSyncErrorType::kSettingsUnconfirmedError:
-      return {
-          SyncStatusMessageType::kSyncError, IDS_SYNC_SETTINGS_NOT_CONFIRMED,
-          IDS_SYNC_ERROR_USER_MENU_CONFIRM_SYNC_SETTINGS_BUTTON,
-          IDS_SYNC_EMPTY_STRING, SyncStatusActionType::kConfirmSyncSettings};
+      return {SyncStatusMessageType::kSyncError,
+              IDS_SYNC_SETTINGS_NOT_CONFIRMED,
+              IDS_SYNC_ERROR_USER_MENU_CONFIRM_SYNC_SETTINGS_BUTTON,
+              IDS_PROFILES_ACCOUNT_REMOVAL_TITLE,
+              SyncStatusActionType::kConfirmSyncSettings};
 
     case AvatarSyncErrorType::kManagedUserUnrecoverableError:
       return {SyncStatusMessageType::kSyncError,
               IDS_SYNC_STATUS_UNRECOVERABLE_ERROR_NEEDS_SIGNOUT,
-              IDS_SYNC_RELOGIN_BUTTON, IDS_SYNC_EMPTY_STRING,
+              IDS_SYNC_RELOGIN_BUTTON, IDS_PROFILES_ACCOUNT_REMOVAL_TITLE,
               SyncStatusActionType::kReauthenticate};
 
     case AvatarSyncErrorType::kUnrecoverableError:
       return {SyncStatusMessageType::kSyncError,
               IDS_SYNC_STATUS_UNRECOVERABLE_ERROR, IDS_SYNC_RELOGIN_BUTTON,
-              IDS_SYNC_EMPTY_STRING, SyncStatusActionType::kReauthenticate};
+              IDS_PROFILES_ACCOUNT_REMOVAL_TITLE,
+              SyncStatusActionType::kReauthenticate};
   }
 }
 
diff --git a/chrome/browser/tab_ui/android/java/src/org/chromium/chrome/browser/tab_ui/TabContentManager.java b/chrome/browser/tab_ui/android/java/src/org/chromium/chrome/browser/tab_ui/TabContentManager.java
index 96b40d0..0545826 100644
--- a/chrome/browser/tab_ui/android/java/src/org/chromium/chrome/browser/tab_ui/TabContentManager.java
+++ b/chrome/browser/tab_ui/android/java/src/org/chromium/chrome/browser/tab_ui/TabContentManager.java
@@ -571,6 +571,11 @@
         assert mNativeTabContentManager != 0;
         assert mSnapshotsEnabled;
 
+        if (tab.isHidden()) {
+            Callback.runNullSafe(callback, null);
+            return;
+        }
+
         if (tab.getNativePage() != null || isNativeViewShowing(tab)) {
             // If we use readbackNativeBitmap() with a downsampled scale and not saving it through
             // TabContentManagerJni.get().cacheTabWithBitmap(), the logic
@@ -593,10 +598,8 @@
                             bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
             callback.onResult(resized);
         } else {
-            if (tab.getWebContents() == null || tab.isHidden()) {
-                if (callback != null) {
-                    callback.onResult(null);
-                }
+            if (tab.getWebContents() == null) {
+                Callback.runNullSafe(callback, null);
                 return;
             }
             TabContentManagerJni.get()
@@ -607,8 +610,9 @@
 
     /**
      * Invalidate a thumbnail if the content of the tab has been changed.
+     *
      * @param tabId The id of the {@link Tab} thumbnail to check.
-     * @param url   The current URL of the {@link Tab}.
+     * @param url The current URL of the {@link Tab}.
      */
     public void invalidateIfChanged(int tabId, GURL url) {
         if (mNativeTabContentManager != 0) {
diff --git a/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelObserver.java b/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelObserver.java
index 6fcbf15..0ffce3f 100644
--- a/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelObserver.java
+++ b/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelObserver.java
@@ -90,7 +90,7 @@
 
     /**
      * Called when a tab is pending closure, i.e. the user has just closed it, but it can still be
-     * undone.  At this point, the Tab has been removed from the TabModel and can only be accessed
+     * undone. At this point, the Tab has been removed from the TabModel and can only be accessed
      * via {@link TabModel#getComprehensiveModel()}.
      *
      * @param tab The tab that is pending closure.
@@ -127,15 +127,15 @@
     default void tabClosureCommitted(Tab tab) {}
 
     /**
-     * Called when an "all tabs" closure will happen.
-     * If multiple tabs are closed, @{@link TabModelObserver#willCloseMultipleTabs(boolean, List)}
-     * is invoked
+     * Called when an "all tabs" closure will happen. If multiple tabs are closed, @{@link
+     * TabModelObserver#willCloseMultipleTabs(boolean, List)} is invoked
      */
     default void willCloseAllTabs(boolean incognito) {}
 
     /**
      * Called when multiple tabs closure will happen. If "all tabs" are closed at once, @{@link
      * TabModelObserver#willCloseAllTabs(boolean)} is invoked.
+     *
      * @param allowUndo If undo is allowed on the tab closure.
      * @param tabs being closed.
      */
@@ -156,4 +156,42 @@
      * are loaded from storage.
      */
     default void restoreCompleted() {}
+
+    //  TODO(crbug.com/381471263): The following methods are still in development and will
+    //  replace the existing tab closure events in the near future. Methods being replaced are
+    //  tabPendingClosure, multipleTabsPendingClosure, tabClosureUndone,
+    //  allTabsClosureUndone, tabClosureCommitted, willCloseAllTabs,
+    //  willCloseMultipleTabs and allTabsClosureCommitted.
+    /**
+     * Called right before {@code tabs} will be destroyed.
+     *
+     * @param tabs The list of {@link Tab}s that will be closed.
+     * @param isAllTabs Whether tabs are all the tabs.
+     */
+    default void onTabCloseImmediate(List<Tab> tabs, boolean isAllTabs) {}
+
+    /**
+     * Called right before when tabs are pending closure, i.e. the user has just closed them, but it
+     * can still be undone.
+     *
+     * @param tabs The list of {@link Tab}s that are pending closure.
+     * @param isAllTabs Whether tabs are all the tabs.
+     */
+    default void onTabClosePending(List<Tab> tabs, boolean isAllTabs) {}
+
+    /**
+     * Called right before {@code tabs} closure is committed permanently and cannot be undone.
+     *
+     * @param tabs The list of {@link Tab}s that are closed.
+     * @param isAllTabs Whether tabs are all the tabs.
+     */
+    default void onTabCloseCommitted(List<Tab> tabs, boolean isAllTabs) {}
+
+    /**
+     * Called just before {@code tabs} closed have been successfully restored by an undo action.
+     *
+     * @param tabs The list of {@link Tab}s that has been reopened.
+     * @param isAllTabs Whether tabs are all the tabs.
+     */
+    default void onTabCloseUndone(List<Tab> tabs, boolean isAllTabs) {}
 }
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index 41ff055..3357ad05 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -4607,6 +4607,12 @@
       "views/tabs/color_picker_view.h",
       "views/tabs/compound_tab_container.cc",
       "views/tabs/compound_tab_container.h",
+      "views/tabs/dragging/tab_drag_context.cc",
+      "views/tabs/dragging/tab_drag_context.h",
+      "views/tabs/dragging/tab_drag_controller.cc",
+      "views/tabs/dragging/tab_drag_controller.h",
+      "views/tabs/dragging/tab_strip_scroll_session.cc",
+      "views/tabs/dragging/tab_strip_scroll_session.h",
       "views/tabs/fade_footer_view.cc",
       "views/tabs/fade_footer_view.h",
       "views/tabs/fade_label_view.cc",
@@ -4633,10 +4639,6 @@
       "views/tabs/tab_container_controller.h",
       "views/tabs/tab_container_impl.cc",
       "views/tabs/tab_container_impl.h",
-      "views/tabs/tab_drag_context.cc",
-      "views/tabs/tab_drag_context.h",
-      "views/tabs/tab_drag_controller.cc",
-      "views/tabs/tab_drag_controller.h",
       "views/tabs/tab_group_editor_bubble_view.cc",
       "views/tabs/tab_group_editor_bubble_view.h",
       "views/tabs/tab_group_header.cc",
@@ -4688,8 +4690,6 @@
       "views/tabs/tab_strip_nudge_button.h",
       "views/tabs/tab_strip_scroll_container.cc",
       "views/tabs/tab_strip_scroll_container.h",
-      "views/tabs/tab_strip_scroll_session.cc",
-      "views/tabs/tab_strip_scroll_session.h",
       "views/tabs/tab_strip_scrolling_overflow_indicator_strategy.cc",
       "views/tabs/tab_strip_scrolling_overflow_indicator_strategy.h",
       "views/tabs/tab_style_views.cc",
diff --git a/chrome/browser/ui/android/autofill/internal/java/src/org/chromium/chrome/browser/ui/autofill/AutofillProgressDialogBridge.java b/chrome/browser/ui/android/autofill/internal/java/src/org/chromium/chrome/browser/ui/autofill/AutofillProgressDialogBridge.java
index 5e973953..e26e5fc 100644
--- a/chrome/browser/ui/android/autofill/internal/java/src/org/chromium/chrome/browser/ui/autofill/AutofillProgressDialogBridge.java
+++ b/chrome/browser/ui/android/autofill/internal/java/src/org/chromium/chrome/browser/ui/autofill/AutofillProgressDialogBridge.java
@@ -117,9 +117,11 @@
             mProgressDialogContentView
                     .findViewById(R.id.confirmation_icon)
                     .setVisibility(View.VISIBLE);
-            ((TextView) mProgressDialogContentView.findViewById(R.id.message))
-                    .setText(confirmationMessage);
-            mProgressDialogContentView.announceForAccessibility(confirmationMessage);
+            TextView confirmationMessageView =
+                    ((TextView) mProgressDialogContentView.findViewById(R.id.message));
+            confirmationMessageView.setAccessibilityLiveRegion(
+                    View.ACCESSIBILITY_LIVE_REGION_POLITE);
+            confirmationMessageView.setText(confirmationMessage);
             // TODO(crbug.com/40195445): Dismiss the Java View after some delay if confirmation has
             // been shown.
         }
diff --git a/chrome/browser/ui/android/desktop_windowing/java/src/org/chromium/chrome/browser/ui/desktop_windowing/AppHeaderCoordinator.java b/chrome/browser/ui/android/desktop_windowing/java/src/org/chromium/chrome/browser/ui/desktop_windowing/AppHeaderCoordinator.java
index 8657473..f9331a0 100644
--- a/chrome/browser/ui/android/desktop_windowing/java/src/org/chromium/chrome/browser/ui/desktop_windowing/AppHeaderCoordinator.java
+++ b/chrome/browser/ui/android/desktop_windowing/java/src/org/chromium/chrome/browser/ui/desktop_windowing/AppHeaderCoordinator.java
@@ -79,7 +79,6 @@
             DesktopWindowHeuristicResult.UNKNOWN;
     private @WindowingMode int mWindowingMode = WindowingMode.UNKNOWN;
     private int mKeyboardInset;
-    private int mNavBarInset;
 
     /**
      * Instantiate the coordinator to handle drawing the tab strip into the captionBar area.
@@ -111,7 +110,7 @@
         mRootView = rootView;
         mBrowserControlsVisibilityDelegate = browserControlsVisibilityDelegate;
         mInsetObserver = insetObserver;
-        mInsetObserver.addInsetsConsumer(this, InsetConsumerSource.APP_HEADER_COORDINATOR_BOTTOM);
+        mInsetObserver.addInsetsConsumer(this, InsetConsumerSource.APP_HEADER_COORDINATOR_IME);
         mInsetsController = mRootView.getWindowInsetsController();
         mActivityLifecycleDispatcher = activityLifecycleDispatcher;
         mActivityLifecycleDispatcher.register(this);
@@ -314,10 +313,7 @@
     private boolean maybeUpdateRootViewBottomPadding() {
         int rootViewBottomPadding = mRootView.getPaddingBottom();
         // Pad the root view with IME bottom insets only if E2E is active.
-        int bottomInset =
-                FALSE.equals(mEdgeToEdgeStateProvider.get())
-                        ? 0
-                        : Math.max(mKeyboardInset, mNavBarInset);
+        int bottomInset = FALSE.equals(mEdgeToEdgeStateProvider.get()) ? 0 : mKeyboardInset;
 
         // If the root view is padded as needed already, return early.
         if (rootViewBottomPadding == bottomInset) return bottomInset != 0;
@@ -362,15 +358,12 @@
     public WindowInsetsCompat onApplyWindowInsets(
             @NonNull View view, @NonNull WindowInsetsCompat windowInsetsCompat) {
         mKeyboardInset = windowInsetsCompat.getInsets(WindowInsetsCompat.Type.ime()).bottom;
-        mNavBarInset =
-                windowInsetsCompat.getInsets(WindowInsetsCompat.Type.navigationBars()).bottom;
         boolean resizedRootView = maybeUpdateRootViewBottomPadding();
         if (!resizedRootView) return windowInsetsCompat;
 
         // Consume IME insets if the root view has been adjusted.
         return new WindowInsetsCompat.Builder(windowInsetsCompat)
                 .setInsets(WindowInsetsCompat.Type.ime(), Insets.NONE)
-                .setInsets(WindowInsetsCompat.Type.navigationBars(), Insets.NONE)
                 .build();
     }
 }
diff --git a/chrome/browser/ui/android/desktop_windowing/java/src/org/chromium/chrome/browser/ui/desktop_windowing/AppHeaderCoordinatorUnitTest.java b/chrome/browser/ui/android/desktop_windowing/java/src/org/chromium/chrome/browser/ui/desktop_windowing/AppHeaderCoordinatorUnitTest.java
index abe720c7..15a86dc 100644
--- a/chrome/browser/ui/android/desktop_windowing/java/src/org/chromium/chrome/browser/ui/desktop_windowing/AppHeaderCoordinatorUnitTest.java
+++ b/chrome/browser/ui/android/desktop_windowing/java/src/org/chromium/chrome/browser/ui/desktop_windowing/AppHeaderCoordinatorUnitTest.java
@@ -72,8 +72,6 @@
     private static final Rect WIDEST_UNOCCLUDED_RECT =
             new Rect(LEFT_BLOCK, 0, WINDOW_WIDTH - RIGHT_BLOCK, HEADER_HEIGHT);
     private static final int KEYBOARD_INSET = 736;
-    private static final int NAV_BAR_INSET = 128;
-    private static final int UNSPECIFIED_INSET = -1;
     private static final int APPEARANCE_LIGHT_CAPTION_BARS = 1 << 8;
 
     @Rule public MockitoRule mockitoRule = MockitoJUnit.rule();
@@ -347,7 +345,7 @@
     }
 
     @Test
-    public void noImeOrNavBarInsets() {
+    public void noImeInsets() {
         // Simulate switching to desktop windowing mode, without any bottom insets.
         setupWithLeftAndRightBoundingRect();
         notifyInsetsRectObserver();
@@ -360,7 +358,7 @@
                 /* error= */ "DesktopWindowing should exit when no insets is supplied.");
 
         // Simulate overlapping keyboard.
-        var insets = applyWindowInsets(KEYBOARD_INSET, UNSPECIFIED_INSET);
+        var insets = applyWindowInsets(KEYBOARD_INSET);
         assertNotEquals(
                 "Ime insets should not be consumed when root view is not adjusted.",
                 Insets.NONE,
@@ -370,7 +368,7 @@
         // Simulate switching to desktop windowing mode.
         setupWithLeftAndRightBoundingRect();
         notifyInsetsRectObserver();
-        insets = applyWindowInsets(KEYBOARD_INSET, UNSPECIFIED_INSET);
+        insets = applyWindowInsets(KEYBOARD_INSET);
         assertEquals(
                 "Ime insets should be consumed when root view is bottom-padded.",
                 Insets.NONE,
@@ -384,7 +382,7 @@
         // Simulate switching out of desktop windowing mode.
         setupWithNoCaptionInsets();
         notifyInsetsRectObserver();
-        insets = applyWindowInsets(KEYBOARD_INSET, UNSPECIFIED_INSET);
+        insets = applyWindowInsets(KEYBOARD_INSET);
         assertNotEquals(
                 "Ime insets should not be consumed when root view is not adjusted.",
                 Insets.NONE,
@@ -400,7 +398,7 @@
         notifyInsetsRectObserver();
 
         // Simulate overlapping keyboard.
-        var insets = applyWindowInsets(KEYBOARD_INSET, UNSPECIFIED_INSET);
+        var insets = applyWindowInsets(KEYBOARD_INSET);
         assertEquals(
                 "Ime insets should be consumed when root view is adjusted.",
                 Insets.NONE,
@@ -411,7 +409,7 @@
                 mSpyRootView.getPaddingBottom());
 
         // Simulate moving a desktop window that causes the keyboard inset to be updated.
-        insets = applyWindowInsets(KEYBOARD_INSET + 100, UNSPECIFIED_INSET);
+        insets = applyWindowInsets(KEYBOARD_INSET + 100);
         assertEquals(
                 "Ime insets should be consumed when root view is adjusted.",
                 Insets.NONE,
@@ -423,84 +421,6 @@
     }
 
     @Test
-    public void overlappingNavBar_SwitchToAndFromDesktopWindowingMode() {
-        verifyDesktopWindowingDisabled(
-                /* error= */ "Desktop windowing mode should be disabled initially.");
-
-        // Simulate overlapping nav bar bottom inset.
-        var insets = applyWindowInsets(UNSPECIFIED_INSET, NAV_BAR_INSET);
-        assertNotEquals(
-                "Nav bar insets should not be consumed when root view is not adjusted.",
-                Insets.NONE,
-                insets.getInsets(WindowInsetsCompat.Type.navigationBars()));
-        assertEquals("Root view bottom should not be padded.", 0, mSpyRootView.getPaddingBottom());
-
-        // Simulate switching to desktop windowing mode.
-        setupWithLeftAndRightBoundingRect();
-        notifyInsetsRectObserver();
-        insets = applyWindowInsets(UNSPECIFIED_INSET, NAV_BAR_INSET);
-        assertEquals(
-                "Nav bar insets should be consumed when root view is bottom-padded.",
-                Insets.NONE,
-                insets.getInsets(WindowInsetsCompat.Type.ime()));
-        verifyDesktopWindowingEnabled();
-        assertEquals(
-                "Root view bottom padding should be updated.",
-                NAV_BAR_INSET,
-                mSpyRootView.getPaddingBottom());
-
-        // Simulate switching out of desktop windowing mode.
-        setupWithNoCaptionInsets();
-        notifyInsetsRectObserver();
-        insets = applyWindowInsets(UNSPECIFIED_INSET, NAV_BAR_INSET);
-        assertNotEquals(
-                "Nav bar insets should not be consumed when root view is not adjusted.",
-                Insets.NONE,
-                insets.getInsets(WindowInsetsCompat.Type.navigationBars()));
-        assertEquals(
-                "Root view bottom padding should be reset.", 0, mSpyRootView.getPaddingBottom());
-    }
-
-    @Test
-    public void overlappingNavBar_MoveDesktopWindow() {
-        // Simulate switching to desktop windowing mode.
-        setupWithLeftAndRightBoundingRect();
-        notifyInsetsRectObserver();
-
-        // Simulate overlapping nav bar bottom inset.
-        var insets = applyWindowInsets(UNSPECIFIED_INSET, NAV_BAR_INSET);
-        assertEquals(
-                "Nav bar insets should be consumed when root view is adjusted.",
-                Insets.NONE,
-                insets.getInsets(WindowInsetsCompat.Type.navigationBars()));
-
-        // Simulate moving a desktop window that causes the nav bar inset to be updated.
-        insets = applyWindowInsets(UNSPECIFIED_INSET, NAV_BAR_INSET - 10);
-        assertEquals(
-                "Nav bar insets should be consumed when root view is adjusted.",
-                Insets.NONE,
-                insets.getInsets(WindowInsetsCompat.Type.navigationBars()));
-        assertEquals(
-                "Root view bottom padding should be updated.",
-                NAV_BAR_INSET - 10,
-                mSpyRootView.getPaddingBottom());
-    }
-
-    @Test
-    public void overlappingKeyboardAndNavBar() {
-        // Simulate switching to desktop windowing mode.
-        setupWithLeftAndRightBoundingRect();
-        notifyInsetsRectObserver();
-
-        // Simulate overlapping keyboard and nav bar bottom insets.
-        var insets = applyWindowInsets(KEYBOARD_INSET, NAV_BAR_INSET);
-        assertEquals(
-                "Root view bottom padding should be updated.",
-                KEYBOARD_INSET,
-                mSpyRootView.getPaddingBottom());
-    }
-
-    @Test
     public void windowingModeHistogram_EnterFullScreen() {
         // Simulate starting in desktop windowing mode for an initial state.
         setupWithLeftAndRightBoundingRect();
@@ -674,16 +594,10 @@
         assertFalse("Edge to edge should not be active.", mEdgeToEdgeStateProvider.get());
     }
 
-    private WindowInsetsCompat applyWindowInsets(int keyboardInset, int navBarInset) {
+    private WindowInsetsCompat applyWindowInsets(int keyboardInset) {
         var windowInsetsBuilder = new WindowInsetsCompat.Builder();
-        if (keyboardInset != UNSPECIFIED_INSET) {
-            windowInsetsBuilder.setInsets(
-                    WindowInsetsCompat.Type.ime(), Insets.of(0, 0, 0, keyboardInset));
-        }
-        if (navBarInset != UNSPECIFIED_INSET) {
-            windowInsetsBuilder.setInsets(
-                    WindowInsetsCompat.Type.navigationBars(), Insets.of(0, 0, 0, navBarInset));
-        }
+        windowInsetsBuilder.setInsets(
+                WindowInsetsCompat.Type.ime(), Insets.of(0, 0, 0, keyboardInset));
         return mAppHeaderCoordinator.onApplyWindowInsets(mSpyRootView, windowInsetsBuilder.build());
     }
 }
diff --git a/chrome/browser/ui/android/edge_to_edge/internal/junit/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeControllerTest.java b/chrome/browser/ui/android/edge_to_edge/internal/junit/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeControllerTest.java
index 75e5489..b177b07 100644
--- a/chrome/browser/ui/android/edge_to_edge/internal/junit/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeControllerTest.java
+++ b/chrome/browser/ui/android/edge_to_edge/internal/junit/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeControllerTest.java
@@ -91,7 +91,6 @@
     ChromeFeatureList.EDGE_TO_EDGE_BOTTOM_CHIN,
     ChromeFeatureList.EDGE_TO_EDGE_WEB_OPT_IN
 })
-@DisableFeatures(ChromeFeatureList.DRAW_NATIVE_EDGE_TO_EDGE)
 public class EdgeToEdgeControllerTest {
 
     private static final int TOP_INSET = 113;
@@ -220,9 +219,7 @@
                         eq(0),
                         intThat(Matchers.greaterThan(0)),
                         eq(0),
-                        ChromeFeatureList.sDrawNativeEdgeToEdge.isEnabled()
-                                ? eq(0)
-                                : intThat(Matchers.greaterThan(0)));
+                        intThat(Matchers.greaterThan(0)));
         verify(mInsetObserver, times(1))
                 .addInsetsConsumer(any(), eq(InsetConsumerSource.EDGE_TO_EDGE_CONTROLLER_IMPL));
         EdgeToEdgeControllerFactory.setHas3ButtonNavBar(false);
@@ -292,29 +289,6 @@
     }
 
     @Test
-    @EnableFeatures(ChromeFeatureList.DRAW_NATIVE_EDGE_TO_EDGE)
-    public void onObservingDifferentTab_changeToNative() {
-        when(mTab.isNativePage()).thenReturn(true);
-        mTabProvider.set(mTab);
-        verifyInteractions(mTab);
-        assertTrue(mEdgeToEdgeControllerImpl.isPageOptedIntoEdgeToEdge());
-        assertToEdgeExpectations();
-    }
-
-    @Test
-    @EnableFeatures(ChromeFeatureList.DRAW_NATIVE_EDGE_TO_EDGE)
-    public void onObservingDifferentTab_changeToTabSwitcher() {
-        // For the Tab Switcher we need to switch from some non-null Tab to null.
-        when(mTab.isNativePage()).thenReturn(false);
-        mTabProvider.set(mTab);
-        verifyInteractions(mTab);
-        Tab nullForTabSwitcher = null;
-        mTabProvider.set(nullForTabSwitcher);
-        assertTrue(mEdgeToEdgeControllerImpl.isPageOptedIntoEdgeToEdge());
-        assertToEdgeExpectations();
-    }
-
-    @Test
     @SuppressLint("NewApi")
     public void onObservingDifferentTab_changeToWebDisabled() {
         // First go ToEdge by invoking the changeToTabSwitcher test logic.
@@ -502,20 +476,6 @@
     }
 
     @Test
-    @EnableFeatures({
-        ChromeFeatureList.DRAW_NATIVE_EDGE_TO_EDGE,
-        ChromeFeatureList.DYNAMIC_SAFE_AREA_INSETS
-    })
-    public void onObservingDifferentTab_simple() {
-        // For the Tab Switcher we need to switch from some non-null Tab to null.
-        when(mTab.isNativePage()).thenReturn(true);
-        mTabProvider.set(mTab);
-        verifyInteractions(mTab);
-        assertToEdgeExpectations();
-        assertBottomInsetForSafeArea(SYSTEM_INSETS.bottom);
-    }
-
-    @Test
     @DisableFeatures(ChromeFeatureList.DYNAMIC_SAFE_AREA_INSETS)
     public void bottomInsetForSafeArea_noTab() {
         mEdgeToEdgeControllerImpl.setIsOptedIntoEdgeToEdgeForTesting(true);
@@ -683,7 +643,6 @@
 
     @Test
     @Config(qualifiers = "xlarge")
-    @EnableFeatures(ChromeFeatureList.DRAW_NATIVE_EDGE_TO_EDGE)
     public void disabledWhenNotPhone() {
         // Even these always-draw flags do not override the device abilities.
         EdgeToEdgeUtils.setAlwaysDrawWebEdgeToEdgeForTesting(true);
@@ -694,7 +653,6 @@
     }
 
     @Test
-    @EnableFeatures(ChromeFeatureList.DRAW_NATIVE_EDGE_TO_EDGE)
     public void disabledWhenNotGestureEnabled() {
         // Even these always-draw flags do not override the device abilities.
         EdgeToEdgeUtils.setAlwaysDrawWebEdgeToEdgeForTesting(true);
diff --git a/chrome/browser/ui/android/edge_to_edge/java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeUtils.java b/chrome/browser/ui/android/edge_to_edge/java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeUtils.java
index 3fe2c03..03fba40 100644
--- a/chrome/browser/ui/android/edge_to_edge/java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeUtils.java
+++ b/chrome/browser/ui/android/edge_to_edge/java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeUtils.java
@@ -223,9 +223,6 @@
 
     /** Whether a native tab will be drawn edge to to edge. */
     static boolean isNativeTabDrawingToEdge(Tab activeTab) {
-        // sDrawNativeEdgeToEdge will draw all native page to edge forcefully.
-        if (ChromeFeatureList.sDrawNativeEdgeToEdge.isEnabled()) return true;
-
         if (!ChromeFeatureList.sDrawKeyNativeEdgeToEdge.isEnabled()) return false;
 
         // TODO(crbug.com/339025702): Check if we are in tab switcher when activeTab is null.
diff --git a/chrome/browser/ui/android/layouts/java/src/org/chromium/chrome/browser/layouts/SceneOverlay.java b/chrome/browser/ui/android/layouts/java/src/org/chromium/chrome/browser/layouts/SceneOverlay.java
index 609fff25..6a04c6a0 100644
--- a/chrome/browser/ui/android/layouts/java/src/org/chromium/chrome/browser/layouts/SceneOverlay.java
+++ b/chrome/browser/ui/android/layouts/java/src/org/chromium/chrome/browser/layouts/SceneOverlay.java
@@ -22,15 +22,19 @@
      * @param visibleViewport The viewport accounting for browser controls.
      * @param resourceManager A resource manager.
      * @param yOffset Current browser controls offset in dp.
-     * @return A {@link SceneOverlayLayer} that represents an scene overlay.
-     * Or {@code null} if this {@link SceneOverlay} doesn't have a tree.
+     * @return A {@link SceneOverlayLayer} that represents an scene overlay. Or {@code null} if this
+     *     {@link SceneOverlay} doesn't have a tree.
      */
     SceneOverlayLayer getUpdatedSceneOverlayTree(
             RectF viewport, RectF visibleViewport, ResourceManager resourceManager, float yOffset);
 
+    /** Notify the {@link SceneOverlayLayer} that it should be removed from its parent. */
+    void removeFromParent();
+
     /**
      * Notify the layout that a SceneOverlay is visible. If not visible, the content tree will not
      * be modified.
+     *
      * @return True if the SceneOverlay tree is showing.
      */
     boolean isSceneOverlayTreeShowing();
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/AutocompleteEditTextTest.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/AutocompleteEditTextTest.java
index 7b252585..22e4f27 100644
--- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/AutocompleteEditTextTest.java
+++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/AutocompleteEditTextTest.java
@@ -464,18 +464,15 @@
     }
 
     @Test
-    @EnableFeatures(
-            OmniboxFeatureList.RICH_AUTOCOMPLETION
-                    + ":rich_autocomplete_full_url/true"
-                    + "/rich_autocomplete_minimum_characters/1")
+    @EnableFeatures(OmniboxFeatureList.RICH_AUTOCOMPLETION + ":rich_autocomplete_full_url/true")
     public void testAppendWithAdditionalText_CommitText() {
-        // User types "h".
-        assertTrue(mInputConnection.commitText("h", 1));
-        mInOrder.verify(mVerifier).onUpdateSelection(1, 1);
+        // User types "hel".
+        assertTrue(mInputConnection.commitText("hel", 1));
+        mInOrder.verify(mVerifier).onUpdateSelection(3, 3);
         verifyOnPopulateAccessibilityEvent(
-                AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED, "h", "", -1, 0, -1, 0, 1);
+                AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED, "hel", "", -1, 0, -1, 0, 3);
         verifyOnPopulateAccessibilityEvent(
-                AccessibilityEvent.TYPE_VIEW_TEXT_SELECTION_CHANGED, "h", "", 1, 1, 1, -1, -1);
+                AccessibilityEvent.TYPE_VIEW_TEXT_SELECTION_CHANGED, "hel", "", 3, 3, 3, -1, -1);
         mInOrder.verify(mVerifier).onAutocompleteTextStateChanged(false);
         assertVerifierCallCounts(2, 2);
 
@@ -483,56 +480,56 @@
         assertTrue(mAutocomplete.shouldAutocomplete());
 
         // The controller kicks in.
-        mAutocomplete.setAutocompleteText("h", "ello world", Optional.of("www.foo.com"));
+        mAutocomplete.setAutocompleteText("hel", "lo world", Optional.of("www.foo.com"));
         assertFalse(mAutocomplete.isCursorVisible());
         verifyOnPopulateAccessibilityEvent(
                 AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED,
                 "hello world - www.foo.com",
-                "h",
+                "hel",
                 -1,
-                1,
+                3,
                 -1,
                 0,
-                10);
+                8);
         assertVerifierCallCounts(0, 1);
         mInOrder.verifyNoMoreInteractions();
         assertTrue(mAutocomplete.shouldAutocomplete());
 
-        // User types "he".
-        assertTrue(mInputConnection.commitText("e", 1));
-        mInOrder.verify(mVerifier).onUpdateSelection(2, 2);
+        // User types "hell".
+        assertTrue(mInputConnection.commitText("l", 1));
+        mInOrder.verify(mVerifier).onUpdateSelection(4, 4);
         verifyOnPopulateAccessibilityEvent(
                 AccessibilityEvent.TYPE_VIEW_TEXT_SELECTION_CHANGED,
                 "hello world - www.foo.com",
                 "",
                 25,
-                2,
-                2,
+                4,
+                4,
                 -1,
                 -1);
         verifyOnPopulateAccessibilityEvent(
                 AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED,
                 "hello world - www.foo.com",
-                "he",
+                "hell",
                 -1,
-                2,
+                4,
                 -1,
                 0,
-                9);
+                7);
         mInOrder.verify(mVerifier).onAutocompleteTextStateChanged(false);
         assertVerifierCallCounts(2, 2);
         mInOrder.verifyNoMoreInteractions();
         assertTrue(mAutocomplete.shouldAutocomplete());
         // The controller kicks in.
-        mAutocomplete.setAutocompleteText("he", "llo world", Optional.of("www.bar.com"));
+        mAutocomplete.setAutocompleteText("hell", "o world", Optional.of("www.bar.com"));
         assertFalse(mAutocomplete.isCursorVisible());
 
         mInOrder.verifyNoMoreInteractions();
-        assertTexts("he", "llo world", "www.bar.com");
+        assertTexts("hell", "o world", "www.bar.com");
         assertTrue(mAutocomplete.shouldAutocomplete());
 
         // User types "hello".
-        assertTrue(mInputConnection.commitText("llo", 1));
+        assertTrue(mInputConnection.commitText("o", 1));
         mInOrder.verify(mVerifier).onUpdateSelection(5, 5);
         verifyOnPopulateAccessibilityEvent(
                 AccessibilityEvent.TYPE_VIEW_TEXT_SELECTION_CHANGED,
@@ -610,18 +607,15 @@
     }
 
     @Test
-    @EnableFeatures(
-            OmniboxFeatureList.RICH_AUTOCOMPLETION
-                    + ":rich_autocomplete_full_url/true"
-                    + "/rich_autocomplete_minimum_characters/1")
+    @EnableFeatures(OmniboxFeatureList.RICH_AUTOCOMPLETION + ":rich_autocomplete_full_url/true")
     public void testAdditionalTextColor() {
-        // User types "h".
-        assertTrue(mInputConnection.commitText("h", 1));
-        mInOrder.verify(mVerifier).onUpdateSelection(1, 1);
+        // User types "hel".
+        assertTrue(mInputConnection.commitText("hel", 1));
+        mInOrder.verify(mVerifier).onUpdateSelection(3, 3);
         verifyOnPopulateAccessibilityEvent(
-                AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED, "h", "", -1, 0, -1, 0, 1);
+                AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED, "hel", "", -1, 0, -1, 0, 3);
         verifyOnPopulateAccessibilityEvent(
-                AccessibilityEvent.TYPE_VIEW_TEXT_SELECTION_CHANGED, "h", "", 1, 1, 1, -1, -1);
+                AccessibilityEvent.TYPE_VIEW_TEXT_SELECTION_CHANGED, "hel", "", 3, 3, 3, -1, -1);
         mInOrder.verify(mVerifier).onAutocompleteTextStateChanged(false);
         assertVerifierCallCounts(2, 2);
 
@@ -629,17 +623,17 @@
         assertTrue(mAutocomplete.shouldAutocomplete());
 
         // The controller kicks in.
-        mAutocomplete.setAutocompleteText("h", "ello world", Optional.of("www.foo.com"));
+        mAutocomplete.setAutocompleteText("hel", "lo world", Optional.of("www.foo.com"));
         assertFalse(mAutocomplete.isCursorVisible());
         verifyOnPopulateAccessibilityEvent(
                 AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED,
                 "hello world - www.foo.com",
-                "h",
+                "hel",
                 -1,
-                1,
+                3,
                 -1,
                 0,
-                10);
+                8);
         assertVerifierCallCounts(0, 1);
         mInOrder.verifyNoMoreInteractions();
         assertTrue(mAutocomplete.shouldAutocomplete());
@@ -654,10 +648,7 @@
     }
 
     @Test
-    @EnableFeatures(
-            OmniboxFeatureList.RICH_AUTOCOMPLETION
-                    + ":rich_autocomplete_full_url/false"
-                    + "/rich_autocomplete_minimum_characters/1")
+    @EnableFeatures(OmniboxFeatureList.RICH_AUTOCOMPLETION + ":rich_autocomplete_full_url/false")
     public void testAppendWithAdditionalText_noFullUrl() {
         // User types "h".
         assertTrue(mInputConnection.commitText("h", 1));
@@ -684,10 +675,7 @@
     }
 
     @Test
-    @EnableFeatures(
-            OmniboxFeatureList.RICH_AUTOCOMPLETION
-                    + ":rich_autocomplete_full_url/true"
-                    + "/rich_autocomplete_minimum_characters/4")
+    @EnableFeatures(OmniboxFeatureList.RICH_AUTOCOMPLETION + ":rich_autocomplete_full_url/true")
     public void testAppendWithAdditionalText_minimumCharacters() {
         // User types "h".
         assertTrue(mInputConnection.commitText("h", 1));
@@ -775,18 +763,15 @@
     }
 
     @Test
-    @EnableFeatures(
-            OmniboxFeatureList.RICH_AUTOCOMPLETION
-                    + ":rich_autocomplete_full_url/true"
-                    + "/rich_autocomplete_minimum_characters/1")
+    @EnableFeatures(OmniboxFeatureList.RICH_AUTOCOMPLETION + ":rich_autocomplete_full_url/true")
     public void testAppendWithAdditionalText_onSelectionChanged() {
-        // User types "h".
-        assertTrue(mInputConnection.commitText("h", 1));
-        mInOrder.verify(mVerifier).onUpdateSelection(1, 1);
+        // User types "hel".
+        assertTrue(mInputConnection.commitText("hel", 1));
+        mInOrder.verify(mVerifier).onUpdateSelection(3, 3);
         verifyOnPopulateAccessibilityEvent(
-                AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED, "h", "", -1, 0, -1, 0, 1);
+                AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED, "hel", "", -1, 0, -1, 0, 3);
         verifyOnPopulateAccessibilityEvent(
-                AccessibilityEvent.TYPE_VIEW_TEXT_SELECTION_CHANGED, "h", "", 1, 1, 1, -1, -1);
+                AccessibilityEvent.TYPE_VIEW_TEXT_SELECTION_CHANGED, "hel", "", 3, 3, 3, -1, -1);
         mInOrder.verify(mVerifier).onAutocompleteTextStateChanged(false);
         assertVerifierCallCounts(2, 2);
 
@@ -794,17 +779,17 @@
         assertTrue(mAutocomplete.shouldAutocomplete());
 
         // The controller kicks in.
-        mAutocomplete.setAutocompleteText("h", "ello world", Optional.of("www.foo.com"));
+        mAutocomplete.setAutocompleteText("hel", "lo world", Optional.of("www.foo.com"));
         assertFalse(mAutocomplete.isCursorVisible());
         verifyOnPopulateAccessibilityEvent(
                 AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED,
                 "hello world - www.foo.com",
-                "h",
+                "hel",
                 -1,
-                1,
+                3,
                 -1,
                 0,
-                10);
+                8);
         assertVerifierCallCounts(0, 1);
         mInOrder.verifyNoMoreInteractions();
         assertTrue(mAutocomplete.shouldAutocomplete());
@@ -837,10 +822,7 @@
     }
 
     @Test
-    @EnableFeatures(
-            OmniboxFeatureList.RICH_AUTOCOMPLETION
-                    + ":rich_autocomplete_full_url/true"
-                    + "/rich_autocomplete_minimum_characters/1")
+    @EnableFeatures(OmniboxFeatureList.RICH_AUTOCOMPLETION + ":rich_autocomplete_full_url/true")
     public void testAppendWithAdditionalText_removeAutocompleteAndAddtionalText() {
         // User types "hello".
         assertTrue(mInputConnection.commitText("hello", 1));
@@ -1441,10 +1423,7 @@
     }
 
     @Test
-    @EnableFeatures(
-            OmniboxFeatureList.RICH_AUTOCOMPLETION
-                    + ":rich_autocomplete_full_url/true"
-                    + "/rich_autocomplete_minimum_characters/3")
+    @EnableFeatures(OmniboxFeatureList.RICH_AUTOCOMPLETION + ":rich_autocomplete_full_url/true")
     public void testPerformEditorAction_withAdditionText() {
         // User types "goo".
         assertTrue(mInputConnection.setComposingText("goo", 1));
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/DeferredIMEWindowInsetApplicationCallback.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/DeferredIMEWindowInsetApplicationCallback.java
index 2872d69..b67779cec 100644
--- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/DeferredIMEWindowInsetApplicationCallback.java
+++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/DeferredIMEWindowInsetApplicationCallback.java
@@ -135,14 +135,9 @@
         }
 
         // Zero out (consume) the ime insets; we're applying them ourselves so no one else needs
-        // to consume them. Additionally, we will also consume nav bar insets because we have at
-        // least one other inset consumer that might otherwise use the nav bar inset incorrectly
-        // when the ime is visible and only the ime insets are consumed here. This is based on the
-        // assumption that both the ime and nav bar are present at the bottom of the app window.
-        // TODO (crbug.com/388037271): Remove nav bar inset consumption.
+        // to consume them.
         return new WindowInsetsCompat.Builder(windowInsetsCompat)
                 .setInsets(WindowInsetsCompat.Type.ime(), Insets.NONE)
-                .setInsets(WindowInsetsCompat.Type.navigationBars(), Insets.NONE)
                 .build();
     }
 
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/DeferredIMEWindowInsetApplicationCallbackTest.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/DeferredIMEWindowInsetApplicationCallbackTest.java
index 2dc422c8..23255cc 100644
--- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/DeferredIMEWindowInsetApplicationCallbackTest.java
+++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/DeferredIMEWindowInsetApplicationCallbackTest.java
@@ -79,8 +79,6 @@
         WindowInsetsCompat modifiedInsets = mCallback.onApplyWindowInsets(mView, windowInsets);
 
         assertEquals(Insets.NONE, modifiedInsets.getInsets(WindowInsetsCompat.Type.ime()));
-        assertEquals(
-                Insets.NONE, modifiedInsets.getInsets(WindowInsetsCompat.Type.navigationBars()));
         verify(mUpdateRunnable, never()).run();
 
         mCallback.onEnd(mAnimation);
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
index a67bac9..3ca7344 100644
--- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
+++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
@@ -289,12 +289,6 @@
       <message name="IDS_PREFS_MANAGE_SYNC_SETTINGS_CONTENT_DESCRIPTION" is_accessibility_with_no_ui="true" desc="The accessibility text to read when the 'Manage Sync Settings' page is opened from the sign-in page. This text is attached to the 'Navigate Up' button shown at the top of the screen. The first two sentences describe the screen that is currently shown to the user, while 'Navigate up' is a description for the button this text is attached to. 'Navigate up' should match TC ID 6794660482873516081.">
         You are currently customizing your Sync settings. To finish turning on sync, tap the Confirm button near the bottom of the screen. Navigate up
       </message>
-      <message name="IDS_SIGNIN_PREF_SUMMARY" desc="Summary for the entry in Settings to sign in to Chrome, explaining benefits of signing in.">
-        Sync and personalize across devices
-      </message>
-      <message name="IDS_SIGN_IN_TO_CHROME_DISABLED_SUMMARY" desc="A descriptive line of text that appears under the 'Sign in to Chrome' option, in Chrome Settings on Android. The text explains why 'Sign in to Chrome' is disabled. 'Administrator' refers to the IT administrator of the company/organization that owns the user’s device.">
-        Disabled by the administrator of this device
-      </message>
       <message name="IDS_SIGN_IN_TO_CHROME_DISABLED_BY_USER_SUMMARY" desc="A descriptive line of text that appears when a user tries to signin when signin is disabled by the Google Services option in settings. The text explains why 'Sign in to Chrome' is not available.">
         Not available on your device
       </message>
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SIGN_IN_TO_CHROME_DISABLED_BY_USER_SUMMARY.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SIGN_IN_TO_CHROME_DISABLED_BY_USER_SUMMARY.png.sha1
deleted file mode 100644
index 58b103d2..0000000
--- a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SIGN_IN_TO_CHROME_DISABLED_BY_USER_SUMMARY.png.sha1
+++ /dev/null
@@ -1 +0,0 @@
-ff000a9dc3e0cecfb71597667d90ac50a2b1b3e5
\ No newline at end of file
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/bottom/BottomControlsMediatorTest.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/bottom/BottomControlsMediatorTest.java
index 2651e08..020e821d 100644
--- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/bottom/BottomControlsMediatorTest.java
+++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/bottom/BottomControlsMediatorTest.java
@@ -38,7 +38,6 @@
 import org.chromium.base.supplier.Supplier;
 import org.chromium.base.test.BaseRobolectricTestRunner;
 import org.chromium.base.test.util.Features.DisableFeatures;
-import org.chromium.base.test.util.Features.EnableFeatures;
 import org.chromium.chrome.browser.browser_controls.BottomControlsStacker;
 import org.chromium.chrome.browser.browser_controls.BrowserControlsStateProvider;
 import org.chromium.chrome.browser.browser_controls.BrowserStateBrowserControlsVisibilityDelegate;
@@ -199,7 +198,6 @@
     }
 
     @Test
-    @EnableFeatures(ChromeFeatureList.DRAW_NATIVE_EDGE_TO_EDGE)
     public void testEdgeToEdge_ObserverCalled() {
         // Set up a mediator with a live EdgeToEdgeController.
         Activity activity = Robolectric.buildActivity(TestActivity.class).setup().get();
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarOverlayCoordinator.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarOverlayCoordinator.java
index 461de539..8d4b325 100644
--- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarOverlayCoordinator.java
+++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarOverlayCoordinator.java
@@ -127,6 +127,11 @@
     }
 
     @Override
+    public void removeFromParent() {
+        mSceneLayer.removeFromParent();
+    }
+
+    @Override
     public boolean isSceneOverlayTreeShowing() {
         return mMediator.shouldBeAttachedToTree();
     }
diff --git a/chrome/browser/ui/ash/wm/coral_browsertest.cc b/chrome/browser/ui/ash/wm/coral_browsertest.cc
index 159e6ea..b6ac6c8 100644
--- a/chrome/browser/ui/ash/wm/coral_browsertest.cc
+++ b/chrome/browser/ui/ash/wm/coral_browsertest.cc
@@ -407,9 +407,9 @@
   // updated title.
   BirchCoralProvider::Get()->TitleUpdated(base::Token(), "");
   ASSERT_TRUE(coral_chip->title()->GetVisible());
-  EXPECT_EQ(coral_chip->title()->GetText(), u"Suggested Group");
+  EXPECT_EQ(coral_chip->title()->GetText(), u"Suggested group");
   EXPECT_EQ(coral_chip->GetAccessibleName(),
-            u"Suggested Group Organize in a new desk");
+            u"Suggested group Organize in a new desk");
 }
 
 // Tests that the coral chip gets updated while corresponding tab/app items are
diff --git a/chrome/browser/ui/tabs/saved_tab_groups/collaboration_messaging_observer.cc b/chrome/browser/ui/tabs/saved_tab_groups/collaboration_messaging_observer.cc
index bf76e8b..ac9786b 100644
--- a/chrome/browser/ui/tabs/saved_tab_groups/collaboration_messaging_observer.cc
+++ b/chrome/browser/ui/tabs/saved_tab_groups/collaboration_messaging_observer.cc
@@ -51,8 +51,10 @@
 // Returns the local tab group ID from the PersistentMessage.
 std::optional<LocalTabGroupID> UnwrapTabGroupID(PersistentMessage message) {
   auto tab_group_metadata = message.attribution.tab_group_metadata;
-  CHECK(tab_group_metadata.has_value());
-  return tab_group_metadata->local_tab_group_id;
+  if (tab_group_metadata.has_value()) {
+    return tab_group_metadata->local_tab_group_id;
+  }
+  return std::nullopt;
 }
 
 // Returns the tab strip index of the tab. If the sync service is not
@@ -70,13 +72,17 @@
   auto group_offset_in_tabstrip = GetTabStripWithGroup(local_tab_group_id)
                                       ->GetTabGroup(local_tab_group_id)
                                       ->GetFirstTab();
-  CHECK(group_offset_in_tabstrip.has_value());
+  if (!group_offset_in_tabstrip.has_value()) {
+    return std::nullopt;
+  }
 
   // Get the index in the group of the tab.
   auto saved_tab_group = tab_group_sync_service->GetGroup(local_tab_group_id);
-  CHECK(saved_tab_group);
-  auto tab_offset_in_group = saved_tab_group->GetIndexOfTab(local_tab_id);
+  if (!saved_tab_group.has_value()) {
+    return std::nullopt;
+  }
 
+  auto tab_offset_in_group = saved_tab_group->GetIndexOfTab(local_tab_id);
   if (!tab_offset_in_group.has_value()) {
     // When hiding a DIRTY_TAB message on a deleted tab (e.g. the tab was
     // deleted by another user), this tab won't be found in the group.
@@ -103,32 +109,30 @@
 // * the tab can be found in the tab strip
 std::optional<TabInfo> UnwrapTabInfo(PersistentMessage message,
                                      Profile* profile) {
-  // Get tab group ID.
   auto local_tab_group_id = UnwrapTabGroupID(message);
-  if (!local_tab_group_id) {
-    // The LocalTabGroupID is not guaranteed to be available from the
-    // MessagingBackenddService, so we need to handle this case gracefully.
+  if (!local_tab_group_id.has_value()) {
     return std::nullopt;
   }
 
-  // Get tab ID.
   auto tab_metadata = message.attribution.tab_metadata;
-  CHECK(tab_metadata.has_value());
+  if (!tab_metadata.has_value()) {
+    return std::nullopt;
+  }
+
   auto local_tab_id = tab_metadata->local_tab_id;
   if (!local_tab_id.has_value()) {
-    // The LocalTabID is not guaranteed to be available from the
-    // MessagingBackenddService, so we need to handle this case gracefully.
     return std::nullopt;
   }
 
   // Get tab index.
-  auto tabstrip_index =
-      GetTabStripIndex(*local_tab_id, *local_tab_group_id, profile);
+  auto tabstrip_index = GetTabStripIndex(local_tab_id.value(),
+                                         local_tab_group_id.value(), profile);
   if (!tabstrip_index.has_value()) {
     return std::nullopt;
   }
 
-  return TabInfo(*local_tab_id, *local_tab_group_id, *tabstrip_index);
+  return TabInfo(local_tab_id.value(), local_tab_group_id.value(),
+                 tabstrip_index.value());
 }
 
 }  // namespace
@@ -136,36 +140,26 @@
 void CollaborationMessagingObserver::HandleDirtyTabGroup(
     PersistentMessage message,
     MessageDisplayStatus display) {
-  // DIRTY_TAB_GROUP notifications may not have tab metadata. Only the
-  // group metadata is needed here.
-  std::optional<LocalTabGroupID> local_tab_group_id = UnwrapTabGroupID(message);
-  if (!local_tab_group_id) {
-    // The LocalTabGroupID is not guaranteed to be available from the
-    // MessagingBackenddService, so we need to handle this case gracefully.
-    return;
+  if (auto local_tab_group_id = UnwrapTabGroupID(message)) {
+    GetTabStripWithGroup(local_tab_group_id.value())
+        ->SetTabGroupNeedsAttention(local_tab_group_id.value(),
+                                    display == MessageDisplayStatus::kDisplay);
   }
-
-  GetTabStripWithGroup(*local_tab_group_id)
-      ->SetTabGroupNeedsAttention(*local_tab_group_id,
-                                  display == MessageDisplayStatus::kDisplay);
 }
 
 void CollaborationMessagingObserver::HandleDirtyTab(
     PersistentMessage message,
     MessageDisplayStatus display) {
-  std::optional<TabInfo> tab_info = UnwrapTabInfo(message, profile_);
-  if (!tab_info.has_value()) {
-    return;
+  if (auto tab_info = UnwrapTabInfo(message, profile_)) {
+    GetTabStripWithGroup(tab_info->local_tab_group_id)
+        ->SetTabNeedsAttention(tab_info->tabstrip_index,
+                               display == MessageDisplayStatus::kDisplay);
   }
-
-  GetTabStripWithGroup(tab_info->local_tab_group_id)
-      ->SetTabNeedsAttention(tab_info->tabstrip_index,
-                             display == MessageDisplayStatus::kDisplay);
 }
 
 void CollaborationMessagingObserver::HandleChip(PersistentMessage message,
                                                 MessageDisplayStatus display) {
-  std::optional<TabInfo> tab_info = UnwrapTabInfo(message, profile_);
+  auto tab_info = UnwrapTabInfo(message, profile_);
   if (!tab_info.has_value()) {
     return;
   }
@@ -173,7 +167,9 @@
   tabs::TabInterface* tab =
       GetTabStripModelWithGroup(tab_info->local_tab_group_id)
           ->GetTabAtIndex(tab_info->tabstrip_index);
-  CHECK(tab);
+  if (!tab) {
+    return;
+  }
   auto* tab_features = tab->GetTabFeatures();
   CHECK(tab_features);
 
diff --git a/chrome/browser/ui/tabs/saved_tab_groups/collaboration_messaging_observer.h b/chrome/browser/ui/tabs/saved_tab_groups/collaboration_messaging_observer.h
index fd3703a8..255d663 100644
--- a/chrome/browser/ui/tabs/saved_tab_groups/collaboration_messaging_observer.h
+++ b/chrome/browser/ui/tabs/saved_tab_groups/collaboration_messaging_observer.h
@@ -52,6 +52,8 @@
                            HandlesMessages);
   FRIEND_TEST_ALL_PREFIXES(CollaborationMessagingObserverBrowserTest,
                            HandlesTabMessagesInCollapsedGroup);
+  FRIEND_TEST_ALL_PREFIXES(CollaborationMessagingObserverBrowserTest,
+                           IgnoresTabMessagesWithIncompleteData);
 
   // MessagingBackendService::PersistentMessageObserver
   void OnMessagingBackendServiceInitialized() override;
diff --git a/chrome/browser/ui/tabs/saved_tab_groups/collaboration_messaging_observer_browsertest.cc b/chrome/browser/ui/tabs/saved_tab_groups/collaboration_messaging_observer_browsertest.cc
index c31b425..eebf6f1 100644
--- a/chrome/browser/ui/tabs/saved_tab_groups/collaboration_messaging_observer_browsertest.cc
+++ b/chrome/browser/ui/tabs/saved_tab_groups/collaboration_messaging_observer_browsertest.cc
@@ -137,7 +137,6 @@
   // Add 4 more tabs, for a total of 5.
   AddTabs(browser(), 4);
   EXPECT_EQ(5, browser()->tab_strip_model()->count());
-  EXPECT_TRUE(browser()->IsActive());
 
   // Observer is initialized
   EXPECT_NE(observer(), nullptr);
@@ -235,4 +234,69 @@
   EXPECT_FALSE(GetTabIcon(browser(), 2)->GetShowingAttentionIndicator());
 }
 
+IN_PROC_BROWSER_TEST_F(CollaborationMessagingObserverBrowserTest,
+                       IgnoresTabMessagesWithIncompleteData) {
+  // Add 1 more tab, for a total of 2.
+  AddTabs(browser(), 1);
+  EXPECT_EQ(2, browser()->tab_strip_model()->count());
+
+  // Observer is initialized
+  EXPECT_NE(observer(), nullptr);
+
+  // Group 2 tabs in the middle of the tab strip to test group offsets.
+  auto group_id = browser()->tab_strip_model()->AddToNewGroup({0, 1});
+
+  // CHIP messages set the message in TabFeatures
+  auto tab0_id =
+      browser()->tab_strip_model()->GetTabAtIndex(0)->GetHandle().raw_value();
+
+  // Prevent network request.
+  GetTabDataAtIndex(browser(), 0)->set_mocked_avatar_for_testing(gfx::Image());
+
+  // Message has no tab group metadata.
+  {
+    auto message =
+        CreateMessage("User", "URL", CollaborationEvent::TAB_ADDED,
+                      PersistentNotificationType::CHIP, tab0_id, group_id);
+
+    // Remove tab group metadata.
+    message.attribution.tab_group_metadata = std::nullopt;
+
+    // No messages are delivered.
+    EXPECT_FALSE(GetTabDataAtIndex(browser(), 0)->HasMessage());
+    observer()->DisplayPersistentMessage(message);
+    EXPECT_FALSE(GetTabDataAtIndex(browser(), 0)->HasMessage());
+  }
+
+  // Message has no tab metadata.
+  {
+    auto message =
+        CreateMessage("User", "URL", CollaborationEvent::TAB_UPDATED,
+                      PersistentNotificationType::DIRTY_TAB, tab0_id, group_id);
+
+    // Remove tab metadata.
+    message.attribution.tab_metadata = std::nullopt;
+
+    // No messages are delivered.
+    EXPECT_FALSE(GetTabIcon(browser(), 0)->GetShowingAttentionIndicator());
+    observer()->DisplayPersistentMessage(message);
+    EXPECT_FALSE(GetTabIcon(browser(), 0)->GetShowingAttentionIndicator());
+  }
+
+  // Tab does not exists.
+  {
+    auto message =
+        CreateMessage("User", "URL", CollaborationEvent::TAB_ADDED,
+                      PersistentNotificationType::DIRTY_TAB, tab0_id, group_id);
+
+    // Close the tab group so no message can be delivered.
+    browser()->tab_strip_model()->CloseWebContentsAt(0, 0);
+    EXPECT_EQ(1, browser()->tab_strip_model()->count());
+
+    EXPECT_FALSE(GetTabIcon(browser(), 0)->GetShowingAttentionIndicator());
+    observer()->DisplayPersistentMessage(message);
+    EXPECT_FALSE(GetTabIcon(browser(), 0)->GetShowingAttentionIndicator());
+  }
+}
+
 }  // namespace tab_groups
diff --git a/chrome/browser/ui/tabs/saved_tab_groups/collaboration_messaging_tab_data.cc b/chrome/browser/ui/tabs/saved_tab_groups/collaboration_messaging_tab_data.cc
index 7506b21..70ce4015 100644
--- a/chrome/browser/ui/tabs/saved_tab_groups/collaboration_messaging_tab_data.cc
+++ b/chrome/browser/ui/tabs/saved_tab_groups/collaboration_messaging_tab_data.cc
@@ -53,7 +53,9 @@
         message.collaboration_event == CollaborationEvent::TAB_UPDATED);
 
   // Chip messages must contain a triggering user.
-  CHECK(message.attribution.triggering_user.has_value());
+  if (!message.attribution.triggering_user.has_value()) {
+    return;
+  }
 
   // Cache this message to prevent committing stale data when the
   // image request resolves.
@@ -95,7 +97,7 @@
 }
 
 void CollaborationMessagingTabData::FetchAvatar(PersistentMessage message) {
-  // Safe to unwrap member because it was previously CHECKed.
+  // Safe to unwrap member because it was previously verified.
   auto avatar_url = message.attribution.triggering_user->avatar_url;
 
   image_fetcher::ImageFetcherService* image_fetcher_service =
diff --git a/chrome/browser/ui/tabs/saved_tab_groups/collaboration_messaging_tab_data.h b/chrome/browser/ui/tabs/saved_tab_groups/collaboration_messaging_tab_data.h
index e8809cc79..dc7acc8 100644
--- a/chrome/browser/ui/tabs/saved_tab_groups/collaboration_messaging_tab_data.h
+++ b/chrome/browser/ui/tabs/saved_tab_groups/collaboration_messaging_tab_data.h
@@ -77,6 +77,8 @@
                            IgnoresRequestsWhenMessageIsCleared);
   FRIEND_TEST_ALL_PREFIXES(CollaborationMessagingTabDataTest,
                            IgnoresRequestsWhenMessageIsChanged);
+  FRIEND_TEST_ALL_PREFIXES(CollaborationMessagingTabDataTest,
+                           IgnoresMessageWithoutUser);
 
   // Notify callback list that a new message has been committed.
   void NotifyMessageChanged();
diff --git a/chrome/browser/ui/tabs/saved_tab_groups/collaboration_messaging_tab_data_unittest.cc b/chrome/browser/ui/tabs/saved_tab_groups/collaboration_messaging_tab_data_unittest.cc
index 8dfabb5f..b44df52 100644
--- a/chrome/browser/ui/tabs/saved_tab_groups/collaboration_messaging_tab_data_unittest.cc
+++ b/chrome/browser/ui/tabs/saved_tab_groups/collaboration_messaging_tab_data_unittest.cc
@@ -218,4 +218,33 @@
   EXPECT_FALSE(tab_data().HasMessage());
 }
 
+TEST_F(CollaborationMessagingTabDataTest, IgnoresMessageWithoutUser) {
+  EXPECT_FALSE(tab_data().HasMessage());
+
+  std::string given_name = "User";
+  std::string avatar_url = "https://google.com/chrome/1";
+  auto message =
+      CreateMessage(given_name, avatar_url, CollaborationEvent::TAB_ADDED);
+
+  // Remove triggering_user. Not all messages will be fully formed, so tab
+  // data should be able to ignore messages without enough data to display.
+  message.attribution.triggering_user = std::nullopt;
+
+  // Service will be triggered to request the image.
+  EXPECT_CALL(*sharing_service(),
+              GetAvatarImageForURL(GURL(avatar_url), 20, _, _))
+      .Times(0);
+
+  // Set the message. This will trigger the avatar request, but will not
+  // set data since the fetcher is mocked.
+  tab_data().SetMessage(message);
+
+  // Mock resolution of the avatar image request by directly
+  // triggering the callback.
+  tab_data().CommitMessage(message, gfx::Image());
+
+  // Data will not be set.
+  EXPECT_FALSE(tab_data().HasMessage());
+}
+
 }  // namespace tab_groups
diff --git a/chrome/browser/ui/tabs/tab_strip_model.cc b/chrome/browser/ui/tabs/tab_strip_model.cc
index 075b534..e9846393 100644
--- a/chrome/browser/ui/tabs/tab_strip_model.cc
+++ b/chrome/browser/ui/tabs/tab_strip_model.cc
@@ -72,7 +72,7 @@
 #include "chrome/browser/ui/tabs/tab_utils.h"
 #include "chrome/browser/ui/thumbnails/thumbnail_tab_helper.h"
 #include "chrome/browser/ui/views/frame/browser_view.h"
-#include "chrome/browser/ui/views/tabs/tab_drag_controller.h"
+#include "chrome/browser/ui/views/tabs/dragging/tab_drag_controller.h"
 #include "chrome/browser/ui/views/tabs/tab_strip.h"
 #include "chrome/browser/ui/web_applications/web_app_dialog_utils.h"
 #include "chrome/browser/ui/web_applications/web_app_launch_utils.h"
diff --git a/chrome/browser/ui/ui_features.cc b/chrome/browser/ui/ui_features.cc
index 908ecaf..69aef42e 100644
--- a/chrome/browser/ui/ui_features.cc
+++ b/chrome/browser/ui/ui_features.cc
@@ -440,4 +440,8 @@
              "PageActionsMigration",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
+BASE_FEATURE(kCompositorLoadingAnimations,
+             "CompositorLoadingAnimations",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+
 }  // namespace features
diff --git a/chrome/browser/ui/ui_features.h b/chrome/browser/ui/ui_features.h
index ca66a66..9c5227d 100644
--- a/chrome/browser/ui/ui_features.h
+++ b/chrome/browser/ui/ui_features.h
@@ -272,6 +272,10 @@
 // actions.
 BASE_DECLARE_FEATURE(kPageActionsMigration);
 
+// Controls whether browser tab loading animations are driven by the compositor
+// vs. a repeating timer.
+BASE_DECLARE_FEATURE(kCompositorLoadingAnimations);
+
 }  // namespace features
 
 #endif  // CHROME_BROWSER_UI_UI_FEATURES_H_
diff --git a/chrome/browser/ui/views/apps/app_info_dialog/app_info_dialog_views_unittest.cc b/chrome/browser/ui/views/apps/app_info_dialog/app_info_dialog_views_unittest.cc
index 1425d78..7c5fe809 100644
--- a/chrome/browser/ui/views/apps/app_info_dialog/app_info_dialog_views_unittest.cc
+++ b/chrome/browser/ui/views/apps/app_info_dialog/app_info_dialog_views_unittest.cc
@@ -284,7 +284,6 @@
 
   EXPECT_FALSE(widget_);
 }
-#endif  // !BUILDFLAG(IS_CHROMEOS)
 
 // Tests that the dialog does not close when a different profile is destroyed.
 TEST_F(AppInfoDialogViewsTest, DestroyedOtherProfileDoesNotCloseDialog) {
@@ -304,6 +303,7 @@
   base::RunLoop().RunUntilIdle();
   EXPECT_TRUE(widget_);
 }
+#endif  // !BUILDFLAG(IS_CHROMEOS)
 
 // Tests that clicking the View in Store link opens a browser tab and closes the
 // dialog cleanly.
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_bar_view.cc b/chrome/browser/ui/views/bookmarks/bookmark_bar_view.cc
index b0f7a74..ce43637f 100644
--- a/chrome/browser/ui/views/bookmarks/bookmark_bar_view.cc
+++ b/chrome/browser/ui/views/bookmarks/bookmark_bar_view.cc
@@ -532,7 +532,7 @@
   // Then the overflow button.
   if (overflow_button_->GetVisible() &&
       overflow_button_->bounds().Contains(adjusted_loc)) {
-    *model_start_index = GetFirstHiddenNodeIndex();
+    *model_start_index = first_hidden_node_idx_;
     return bookmark_model_->bookmark_bar_node();
   }
 
@@ -1250,10 +1250,7 @@
   UpdateOtherAndManagedButtonsVisibility();
 
   // Remove the existing buttons.
-  for (views::LabelButton* button : bookmark_buttons_) {
-    delete button;
-  }
-  bookmark_buttons_.clear();
+  RemoveAllBookmarkButtons();
 
   LayoutAndPaint();
 
@@ -1275,10 +1272,7 @@
   }
 
   // Remove the existing buttons.
-  for (views::LabelButton* button : bookmark_buttons_) {
-    delete button;
-  }
-  bookmark_buttons_.clear();
+  RemoveAllBookmarkButtons();
 
   // Create the new buttons.
   for (size_t i = 0; i < node->children().size(); ++i) {
@@ -1392,7 +1386,7 @@
   } else {
     RecordBookmarkFolderOpen(BookmarkLaunchLocation::kAttachedBar);
     const size_t start_index = (node == bookmark_model_->bookmark_bar_node())
-                                   ? GetFirstHiddenNodeIndex()
+                                   ? first_hidden_node_idx_
                                    : 0;
     bookmark_menu_ = new BookmarkMenuController(browser_, GetWidget(), node,
                                                 start_index, false);
@@ -1629,9 +1623,40 @@
   ConfigureButton(node, button.get());
   size_t index = node->parent()->GetIndexOf(node).value();
   bookmark_buttons_.insert(bookmark_buttons_.cbegin() + index, button.get());
+  button_visibility_changed_callbacks_[button.get()] =
+      button->AddVisibleChangedCallback(
+          base::BindRepeating(&BookmarkBarView::UpdateFirstHiddenNodeIndex,
+                              base::Unretained(this)));
+  UpdateFirstHiddenNodeIndex();
   return button;
 }
 
+void BookmarkBarView::RemoveBookmarkButton(size_t index) {
+  CHECK_LE(index, bookmark_buttons_.size());
+  views::LabelButton* button = bookmark_buttons_[index];
+  bookmark_buttons_.erase(bookmark_buttons_.cbegin() + index);
+  // Set not visible before removing to advance focus if needed, and to ensure
+  // that the overflow menu is updated.
+  button->SetVisible(false);
+  button_visibility_changed_callbacks_.erase(button);
+  RemoveChildViewT(button);
+}
+
+void BookmarkBarView::RemoveAllBookmarkButtons() {
+  while (!bookmark_buttons_.empty()) {
+    RemoveBookmarkButton(0);
+  }
+}
+
+void BookmarkBarView::UpdateFirstHiddenNodeIndex() {
+  size_t prev_idx = first_hidden_node_idx_;
+  first_hidden_node_idx_ = GetFirstHiddenNodeIndex();
+  if (bookmark_menu_ && prev_idx != first_hidden_node_idx_) {
+    bookmark_menu_->BookmarkStartIndexChanged(
+        bookmark_model_->bookmark_bar_node(), first_hidden_node_idx_);
+  }
+}
+
 std::unique_ptr<views::LabelButton>
 BookmarkBarView::CreateAppsPageShortcutButton() {
   auto button = std::make_unique<ShortcutButton>(
@@ -1752,13 +1777,7 @@
     return needs_layout;
   }
 
-  views::LabelButton* button = bookmark_buttons_[index];
-  bookmark_buttons_.erase(bookmark_buttons_.cbegin() + index);
-  // Set not visible before removing to advance focus if needed. See
-  // crbug.com/1183980. TODO(crbug.com/40755614): remove this workaround if
-  // FocusManager behavior is changed.
-  button->SetVisible(false);
-  RemoveChildViewT(button);
+  RemoveBookmarkButton(index);
 
   return true;
 }
@@ -1807,7 +1826,7 @@
 
   size_t start_index = 0;
   if (node == bookmark_model_->bookmark_bar_node()) {
-    start_index = GetFirstHiddenNodeIndex();
+    start_index = first_hidden_node_idx_;
   }
 
   drop_info_->is_menu_showing = true;
@@ -1912,12 +1931,12 @@
       if (overflow_delta_x >= 0 &&
           overflow_delta_x < overflow_button_->width()) {
         // Mouse is over overflow button.
-        location->index = GetFirstHiddenNodeIndex();
+        location->index = first_hidden_node_idx_;
         location->button_type = DROP_OVERFLOW;
       } else if (overflow_delta_x < 0) {
         // Mouse is after the last visible button but before overflow button;
         // use the last visible index.
-        location->index = GetFirstHiddenNodeIndex();
+        location->index = first_hidden_node_idx_;
       } else {
         return;
       }
@@ -1925,7 +1944,7 @@
                mirrored_x < all_bookmarks_button_->x()) {
       // Mouse is after the last visible button but before more recently
       // bookmarked; use the last visible index.
-      location->index = GetFirstHiddenNodeIndex();
+      location->index = first_hidden_node_idx_;
     } else {
       return;
     }
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_bar_view.h b/chrome/browser/ui/views/bookmarks/bookmark_bar_view.h
index 140f77f4..1664305 100644
--- a/chrome/browser/ui/views/bookmarks/bookmark_bar_view.h
+++ b/chrome/browser/ui/views/bookmarks/bookmark_bar_view.h
@@ -32,6 +32,7 @@
 #include "ui/views/controls/menu/menu_types.h"
 #include "ui/views/drag_controller.h"
 #include "ui/views/view.h"
+#include "ui/views/view_observer.h"
 
 class BookmarkBarViewObserver;
 class BookmarkBarViewTestHelper;
@@ -278,6 +279,10 @@
   // visible, this returns GetBookmarkButtonCount().
   size_t GetFirstHiddenNodeIndex() const;
 
+  // Updates `first_hidden_node_idx_` and notifies the controller, if any, to
+  // update the overflow menu.
+  void UpdateFirstHiddenNodeIndex();
+
   // Creates the button showing the "All Bookmarks" folder.
   std::unique_ptr<views::MenuButton> CreateAllBookmarksButton();
 
@@ -291,6 +296,12 @@
   std::unique_ptr<views::View> CreateBookmarkButton(
       const bookmarks::BookmarkNode* node);
 
+  // Removes the bookmark button at the given index.
+  void RemoveBookmarkButton(size_t index);
+
+  // Removes all bookmark buttons.
+  void RemoveAllBookmarkButtons();
+
   // Creates the button for rendering the apps page shortcut.
   std::unique_ptr<views::LabelButton> CreateAppsPageShortcutButton();
 
@@ -444,8 +455,14 @@
   raw_ptr<views::MenuButton> overflow_button_ = nullptr;
 
   // The individual bookmark buttons.
-  std::vector<raw_ptr<views::LabelButton, VectorExperimental>>
-      bookmark_buttons_;
+  std::vector<raw_ptr<views::LabelButton>> bookmark_buttons_;
+
+  std::map<raw_ptr<const views::LabelButton>, base::CallbackListSubscription>
+      button_visibility_changed_callbacks_;
+
+  // The index of the bookmark bar's first hidden node.
+  // This is used to populate the overflow bookmarks button.
+  size_t first_hidden_node_idx_ = 0;
 
   raw_ptr<ButtonSeparatorView> bookmarks_separator_view_ = nullptr;
   raw_ptr<ButtonSeparatorView> saved_tab_groups_separator_view_ = nullptr;
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_bar_view_unittest.cc b/chrome/browser/ui/views/bookmarks/bookmark_bar_view_unittest.cc
index 4f1e579f..125f7fd8 100644
--- a/chrome/browser/ui/views/bookmarks/bookmark_bar_view_unittest.cc
+++ b/chrome/browser/ui/views/bookmarks/bookmark_bar_view_unittest.cc
@@ -27,6 +27,7 @@
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/ui_features.h"
 #include "chrome/browser/ui/views/bookmarks/bookmark_bar_view_test_helper.h"
+#include "chrome/browser/ui/views/frame/browser_view.h"
 #include "chrome/browser/ui/views/native_widget_factory.h"
 #include "chrome/common/url_constants.h"
 #include "chrome/grit/generated_resources.h"
@@ -53,6 +54,7 @@
 #include "ui/views/style/platform_style.h"
 #include "ui/views/test/views_test_utils.h"
 #include "ui/views/view_utils.h"
+#include "ui/views/widget/widget.h"
 #include "url/gurl.h"
 
 using bookmarks::BookmarkModel;
@@ -109,8 +111,8 @@
     return result;
   }
 
-  // Continues sizing the bookmark bar until it has |count| buttons that are
-  // visible.
+  // Continues enlarging the bookmark bar until it has at least `count`
+  // buttons that are visible.
   // NOTE: if the model has more than |count| buttons this results in
   // |count| + 1 buttons.
   void SizeUntilButtonsVisible(size_t count) {
@@ -125,6 +127,24 @@
     }
   }
 
+  // Continues shrinking the bookmark bar until it has at most `count` buttons
+  // that are visible.
+  void SizeDownUntilButtonsVisible(size_t count) {
+    const int start_width = bookmark_bar_view()->width();
+    const int height = bookmark_bar_view()->GetPreferredSize().height();
+    // Keep shrinking the bar view's bounds until either:
+    // - There are fewer bookmark buttons than `count`.
+    // - The button at index `count` is hidden.
+    // - Up to a maximum of 100 times.
+    for (size_t i = 0;
+         i < 100 && (test_helper_->GetBookmarkButtonCount() >= count &&
+                     test_helper_->GetBookmarkButton(count)->GetVisible());
+         ++i) {
+      bookmark_bar_view()->SetBounds(0, 0, start_width - i * 10, height);
+      views::test::RunScheduledLayout(bookmark_bar_view());
+    }
+  }
+
   BookmarkModel* model() {
     return BookmarkModelFactory::GetForBrowserContext(profile());
   }
@@ -412,6 +432,31 @@
   EXPECT_EQ("a c", GetStringForVisibleButtons());
 }
 
+// Ensures that the overflow button's menu responds as bookmark button
+// visibility changes.
+TEST_F(BookmarkBarViewInWidgetTest, ButtonVisiblityUpdatesOverflowMenu) {
+  widget()->Show();
+  AddNodesToBookmarkBarFromModelString("a b c d ");
+  ASSERT_EQ(4u, test_helper_->GetBookmarkButtonCount());
+  SizeDownUntilButtonsVisible(1);
+
+  views::MenuButton* overflow_button = bookmark_bar_view()->overflow_button();
+  ASSERT_TRUE(overflow_button);
+  overflow_button->Activate(nullptr);
+  views::MenuItemView* overflow_menu = bookmark_bar_view()->GetMenu();
+  ASSERT_TRUE(overflow_menu && overflow_menu->HasSubmenu());
+  EXPECT_EQ(3u, overflow_menu->GetSubmenu()->GetMenuItems().size());
+
+  SizeUntilButtonsVisible(2);
+  EXPECT_EQ(2u, overflow_menu->GetSubmenu()->GetMenuItems().size());
+
+  SizeUntilButtonsVisible(3);
+  EXPECT_EQ(1u, overflow_menu->GetSubmenu()->GetMenuItems().size());
+
+  SizeDownUntilButtonsVisible(1);
+  EXPECT_EQ(3u, overflow_menu->GetSubmenu()->GetMenuItems().size());
+}
+
 // TODO(crbug.com/375364962): Deflake and re-enable.
 // Assertions for changing the title of a node.
 TEST_F(BookmarkBarViewTest, DISABLED_ChangeTitle) {
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_menu_controller_views.cc b/chrome/browser/ui/views/bookmarks/bookmark_menu_controller_views.cc
index 1cd2972..63fb967 100644
--- a/chrome/browser/ui/views/bookmarks/bookmark_menu_controller_views.cc
+++ b/chrome/browser/ui/views/bookmarks/bookmark_menu_controller_views.cc
@@ -30,11 +30,11 @@
                                                const BookmarkNode* node,
                                                size_t start_child_index,
                                                bool for_drop)
-    : menu_delegate_(
-          new BookmarkMenuDelegate(browser,
-                                   parent,
-                                   this,
-                                   BookmarkLaunchLocation::kSubfolder)),
+    : menu_delegate_(std::make_unique<BookmarkMenuDelegate>(
+          browser,
+          parent,
+          this,
+          BookmarkLaunchLocation::kSubfolder)),
       node_(node),
       observer_(nullptr),
       for_drop_(for_drop),
@@ -198,6 +198,11 @@
   }
 }
 
+void BookmarkMenuController::BookmarkStartIndexChanged(const BookmarkNode* node,
+                                                       size_t new_start_index) {
+  menu_delegate_->SetMenuStartIndex(node, new_start_index);
+}
+
 bool BookmarkMenuController::ShouldTryPositioningBesideAnchor() const {
   // The bookmark menu appears from the bookmark bar, which has a set of buttons
   // positioned next to each other; if the bookmark menu appears beside its
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_menu_controller_views.h b/chrome/browser/ui/views/bookmarks/bookmark_menu_controller_views.h
index 413e3eb..1eb6aec 100644
--- a/chrome/browser/ui/views/bookmarks/bookmark_menu_controller_views.h
+++ b/chrome/browser/ui/views/bookmarks/bookmark_menu_controller_views.h
@@ -113,6 +113,9 @@
   // bookmarks::BaseBookmarkModelObserver:
   void BookmarkModelChanged() override;
 
+  void BookmarkStartIndexChanged(const bookmarks::BookmarkNode* node,
+                                 size_t new_start_index);
+
  private:
   // BookmarkMenuController deletes itself as necessary.
   ~BookmarkMenuController() override;
diff --git a/chrome/browser/ui/views/desktop_capture/rounded_corner_image_view.cc b/chrome/browser/ui/views/desktop_capture/rounded_corner_image_view.cc
index 7071bd05..f139aba 100644
--- a/chrome/browser/ui/views/desktop_capture/rounded_corner_image_view.cc
+++ b/chrome/browser/ui/views/desktop_capture/rounded_corner_image_view.cc
@@ -8,8 +8,8 @@
 #include "ui/gfx/geometry/skia_conversions.h"
 #include "ui/views/layout/layout_provider.h"
 
-bool RoundedCornerImageView::GetCanProcessEventsWithinSubtree() const {
-  return false;
+RoundedCornerImageView::RoundedCornerImageView() {
+  SetCanProcessEventsWithinSubtree(false);
 }
 
 void RoundedCornerImageView::OnPaint(gfx::Canvas* canvas) {
diff --git a/chrome/browser/ui/views/desktop_capture/rounded_corner_image_view.h b/chrome/browser/ui/views/desktop_capture/rounded_corner_image_view.h
index 2f05717..6b64306 100644
--- a/chrome/browser/ui/views/desktop_capture/rounded_corner_image_view.h
+++ b/chrome/browser/ui/views/desktop_capture/rounded_corner_image_view.h
@@ -13,12 +13,12 @@
   METADATA_HEADER(RoundedCornerImageView, views::ImageView)
 
  public:
-  RoundedCornerImageView() = default;
+  RoundedCornerImageView();
+
   RoundedCornerImageView(const RoundedCornerImageView&) = delete;
   RoundedCornerImageView& operator=(const RoundedCornerImageView&) = delete;
 
-  // views::ImageView:
-  bool GetCanProcessEventsWithinSubtree() const override;
+  ~RoundedCornerImageView() override = default;
 
  protected:
   // views::ImageView:
diff --git a/chrome/browser/ui/views/frame/browser_desktop_window_tree_host_linux.cc b/chrome/browser/ui/views/frame/browser_desktop_window_tree_host_linux.cc
index a3840a57..e089273 100644
--- a/chrome/browser/ui/views/frame/browser_desktop_window_tree_host_linux.cc
+++ b/chrome/browser/ui/views/frame/browser_desktop_window_tree_host_linux.cc
@@ -18,7 +18,7 @@
 #include "chrome/browser/ui/views/frame/browser_view.h"
 #include "chrome/browser/ui/views/frame/desktop_browser_frame_aura_linux.h"
 #include "chrome/browser/ui/views/frame/picture_in_picture_browser_frame_view.h"
-#include "chrome/browser/ui/views/tabs/tab_drag_controller.h"
+#include "chrome/browser/ui/views/tabs/dragging/tab_drag_controller.h"
 #include "chrome/browser/ui/views/tabs/tab_strip.h"
 #include "third_party/skia/include/core/SkRRect.h"
 #include "ui/base/dragdrop/mojom/drag_drop_types.mojom-shared.h"
diff --git a/chrome/browser/ui/views/frame/browser_non_client_frame_view_chromeos_browsertest.cc b/chrome/browser/ui/views/frame/browser_non_client_frame_view_chromeos_browsertest.cc
index 85f256ca..a8a3504 100644
--- a/chrome/browser/ui/views/frame/browser_non_client_frame_view_chromeos_browsertest.cc
+++ b/chrome/browser/ui/views/frame/browser_non_client_frame_view_chromeos_browsertest.cc
@@ -1705,7 +1705,7 @@
   // Verify background color is immediately resolved from the app controller
   // despite the fact that the web contents background color hasn't loaded
   // yet.
-  EXPECT_EQ(contents_web_view->GetBackground()->get_color(),
+  EXPECT_EQ(contents_web_view->layer()->background_color(),
             browser->app_controller()->GetBackgroundColor().value());
   EXPECT_FALSE(web_contents->GetBackgroundColor().has_value());
 
@@ -1714,9 +1714,9 @@
   {
     content::BackgroundColorChangeWaiter waiter(web_contents);
     waiter.Wait();
-    EXPECT_EQ(contents_web_view->GetBackground()->get_color(),
+    EXPECT_EQ(contents_web_view->layer()->background_color(),
               browser->app_controller()->GetBackgroundColor().value());
-    EXPECT_EQ(contents_web_view->GetBackground()->get_color(),
+    EXPECT_EQ(contents_web_view->layer()->background_color(),
               web_contents->GetBackgroundColor().value());
   }
 
@@ -1728,9 +1728,9 @@
   // background color and the web contents background color due to the fact
   // that the web contents background color update is async.
   ToggleColorMode();
-  EXPECT_EQ(contents_web_view->GetBackground()->get_color(),
+  EXPECT_EQ(contents_web_view->layer()->background_color(),
             browser->app_controller()->GetBackgroundColor().value());
-  EXPECT_EQ(contents_web_view->GetBackground()->get_color(),
+  EXPECT_EQ(contents_web_view->layer()->background_color(),
             web_contents->GetBackgroundColor().value());
 
   // If theme changes should be animated, the layer associated with the
@@ -1747,9 +1747,9 @@
   {
     content::BackgroundColorChangeWaiter waiter(web_contents);
     waiter.Wait();
-    EXPECT_EQ(contents_web_view->GetBackground()->get_color(),
+    EXPECT_EQ(contents_web_view->layer()->background_color(),
               browser->app_controller()->GetBackgroundColor().value());
-    EXPECT_EQ(contents_web_view->GetBackground()->get_color(),
+    EXPECT_EQ(contents_web_view->layer()->background_color(),
               web_contents->GetBackgroundColor().value());
   }
 
diff --git a/chrome/browser/ui/views/frame/browser_view.cc b/chrome/browser/ui/views/frame/browser_view.cc
index d7096d08f..baa31a0 100644
--- a/chrome/browser/ui/views/frame/browser_view.cc
+++ b/chrome/browser/ui/views/frame/browser_view.cc
@@ -265,6 +265,7 @@
 #include "ui/content_accelerators/accelerator_util.h"
 #include "ui/display/screen.h"
 #include "ui/events/event_utils.h"
+#include "ui/gfx/animation/animation_runner.h"
 #include "ui/gfx/canvas.h"
 #include "ui/gfx/color_utils.h"
 #include "ui/gfx/geometry/point.h"
@@ -275,6 +276,7 @@
 #include "ui/gfx/scrollbar_size.h"
 #include "ui/views/accessibility/view_accessibility.h"
 #include "ui/views/accessibility/view_accessibility_utils.h"
+#include "ui/views/animation/compositor_animation_runner.h"
 #include "ui/views/background.h"
 #include "ui/views/bubble/bubble_dialog_delegate_view.h"
 #include "ui/views/controls/button/menu_button.h"
@@ -1626,7 +1628,7 @@
     web_app_window_title_->SetText(GetWindowTitle());
     InvalidateLayout();
   }
-  if (!loading_animation_timer_.IsRunning() && CanChangeWindowIcon()) {
+  if (!IsLoadingAnimationRunning() && CanChangeWindowIcon()) {
     frame_->UpdateWindowIcon();
   }
 }
@@ -1666,7 +1668,7 @@
   const bool should_animate =
       is_visible && browser_->tab_strip_model()->TabsNeedLoadingUI();
 
-  if (should_animate == loading_animation_timer_.IsRunning()) {
+  if (should_animate == IsLoadingAnimationRunning()) {
     // Early return if the loading animation state doesn't change.
     return;
   }
@@ -1682,17 +1684,34 @@
     loading_animation_tracker_->Start(ash::metrics_util::ForSmoothnessV3(
         base::BindRepeating(&RecordTabLoadingSmoothness)));
 #endif
-    // Loads are happening, and the timer isn't running, so start it.
+    static constexpr base::TimeDelta kAnimationUpdateInterval =
+        base::Milliseconds(30);
+    // Loads are happening, and the animation isn't running, so start it.
     loading_animation_start_ = base::TimeTicks::Now();
-    loading_animation_timer_.Start(FROM_HERE, base::Milliseconds(30), this,
-                                   &BrowserView::LoadingAnimationCallback);
+    if (base::FeatureList::IsEnabled(features::kCompositorLoadingAnimations)) {
+      loading_animation_ =
+          std::make_unique<views::CompositorAnimationRunner>(GetWidget());
+      loading_animation_->Start(
+          kAnimationUpdateInterval, base::TimeDelta(),
+          base::BindRepeating(&BrowserView::LoadingAnimationCallback,
+                              base::Unretained(this)));
+    } else {
+      loading_animation_timer_.Start(
+          FROM_HERE, kAnimationUpdateInterval, this,
+          &BrowserView::LoadingAnimationTimerCallback);
+    }
   } else {
-    loading_animation_timer_.Stop();
+    if (base::FeatureList::IsEnabled(features::kCompositorLoadingAnimations)) {
+      loading_animation_->Stop();
+      loading_animation_.reset();
+    } else {
+      loading_animation_timer_.Stop();
+    }
 #if BUILDFLAG(IS_CHROMEOS)
     loading_animation_tracker_->Stop();
 #endif
     // Loads are now complete, update the state if a task was scheduled.
-    LoadingAnimationCallback();
+    LoadingAnimationCallback(base::TimeTicks::Now());
   }
 }
 
@@ -1740,8 +1759,12 @@
   return BrowserView::DevToolsDockedPlacement::kUnknown;
 }
 
-bool BrowserView::IsLoadingAnimationRunningForTesting() const {
-  return loading_animation_timer_.IsRunning();
+bool BrowserView::IsLoadingAnimationRunning() const {
+  if (base::FeatureList::IsEnabled(features::kCompositorLoadingAnimations)) {
+    return loading_animation_ != nullptr;
+  } else {
+    return loading_animation_timer_.IsRunning();
+  }
 }
 
 void BrowserView::SetStarredState(bool is_starred) {
@@ -4834,13 +4857,16 @@
 #endif  // BUILDFLAG(ENABLE_WEBUI_TAB_STRIP)
 }
 
-void BrowserView::LoadingAnimationCallback() {
+void BrowserView::LoadingAnimationTimerCallback() {
+  LoadingAnimationCallback(base::TimeTicks::Now());
+}
+
+void BrowserView::LoadingAnimationCallback(base::TimeTicks timestamp) {
   if (GetSupportsTabStrip()) {
     // Loading animations are shown in the tab for tabbed windows. Update them
     // even if the tabstrip isn't currently visible so they're in the right
     // state when it returns.
-    tabstrip_->UpdateLoadingAnimations(base::TimeTicks::Now() -
-                                       loading_animation_start_);
+    tabstrip_->UpdateLoadingAnimations(timestamp - loading_animation_start_);
   }
 
   if (ShouldShowWindowIcon()) {
diff --git a/chrome/browser/ui/views/frame/browser_view.h b/chrome/browser/ui/views/frame/browser_view.h
index 121c651..ae9bc67 100644
--- a/chrome/browser/ui/views/frame/browser_view.h
+++ b/chrome/browser/ui/views/frame/browser_view.h
@@ -93,6 +93,10 @@
 class WebContentsCloseHandler;
 class WebUITabStripContainerView;
 
+namespace gfx {
+class AnimationRunner;
+}  // namespace gfx
+
 namespace ui {
 class NativeTheme;
 }  // namespace ui
@@ -167,7 +171,7 @@
   // (and hide immediately).
   static void SetDisableRevealerDelayForTesting(bool disable);
 
-  bool IsLoadingAnimationRunningForTesting() const;
+  bool IsLoadingAnimationRunning() const;
 
   // Returns a Browser instance of this view.
   Browser* browser() { return browser_.get(); }
@@ -914,7 +918,8 @@
   void MaybeInitializeWebUITabStrip();
 
   // Callback for the loading animation(s) associated with this view.
-  void LoadingAnimationCallback();
+  void LoadingAnimationTimerCallback();
+  void LoadingAnimationCallback(base::TimeTicks timestamp);
 
 #if BUILDFLAG(IS_WIN)
   // Creates the JumpList.
@@ -1266,13 +1271,16 @@
   // Kiosk session.
   bool force_fullscreen_ = false;
 
+  // The runner used for displaying tab-loading animations.
+  std::unique_ptr<gfx::AnimationRunner> loading_animation_;
+
   // The timer used to update frames for tab-loading animations.
   base::RepeatingTimer loading_animation_timer_;
 
   // Closure invoked when the state of the loading animation changes.
   base::OnceClosure loading_animation_state_change_closure_;
 
-  // Start timestamp for all throbbers. Set when |loading_animation_timer_|
+  // Start timestamp for all throbbers. Set when the loading animation
   // starts and used for all consecutive tabs (while any are loading) to keep
   // throbbers in sync.
   base::TimeTicks loading_animation_start_;
diff --git a/chrome/browser/ui/views/frame/browser_view_ash.cc b/chrome/browser/ui/views/frame/browser_view_ash.cc
index 681aadc0..79afc8b 100644
--- a/chrome/browser/ui/views/frame/browser_view_ash.cc
+++ b/chrome/browser/ui/views/frame/browser_view_ash.cc
@@ -124,7 +124,7 @@
     }
   }
 
-  if (contents_webview->background_radii() != contents_webview_radii) {
+  if (contents_webview->GetBackgroundRadii() != contents_webview_radii) {
     contents_webview->SetBackgroundRadii(contents_webview_radii);
   }
 }
diff --git a/chrome/browser/ui/views/frame/browser_view_interactive_uitest.cc b/chrome/browser/ui/views/frame/browser_view_interactive_uitest.cc
index 45b70468..c9a3907 100644
--- a/chrome/browser/ui/views/frame/browser_view_interactive_uitest.cc
+++ b/chrome/browser/ui/views/frame/browser_view_interactive_uitest.cc
@@ -391,7 +391,7 @@
   }
 
   EXPECT_TRUE(browser()->tab_strip_model()->TabsNeedLoadingUI());
-  EXPECT_FALSE(browser_view()->IsLoadingAnimationRunningForTesting());
+  EXPECT_FALSE(browser_view()->IsLoadingAnimationRunning());
 
   {
     base::RunLoop run_loop;
@@ -404,7 +404,7 @@
   }
 
   EXPECT_TRUE(browser()->tab_strip_model()->TabsNeedLoadingUI());
-  EXPECT_TRUE(browser_view()->IsLoadingAnimationRunningForTesting());
+  EXPECT_TRUE(browser_view()->IsLoadingAnimationRunning());
 
   // Now block for the navigation to complete.
   navigation_watcher.Wait();
diff --git a/chrome/browser/ui/views/frame/browser_view_unittest.cc b/chrome/browser/ui/views/frame/browser_view_unittest.cc
index a1e5eaeca..88309ab9 100644
--- a/chrome/browser/ui/views/frame/browser_view_unittest.cc
+++ b/chrome/browser/ui/views/frame/browser_view_unittest.cc
@@ -5,9 +5,10 @@
 #include "chrome/browser/ui/views/frame/browser_view.h"
 
 #include <memory>
+#include <string_view>
 
 #include "base/memory/scoped_refptr.h"
-#include "base/strings/stringprintf.h"
+#include "base/strings/strcat.h"
 #include "build/build_config.h"
 #include "chrome/app/chrome_command_ids.h"
 #include "chrome/browser/ui/actions/chrome_action_id.h"
@@ -73,12 +74,12 @@
   return tabstrip_region_origin;
 }
 
-// Helper function to take a printf-style format string and substitute the
-// browser name (like "Chromium" or "Google Chrome") for %s, and return the
-// result as a std::u16string.
-std::u16string SubBrowserName(const char* fmt) {
-  return base::UTF8ToUTF16(base::StringPrintfNonConstexpr(
-      fmt, l10n_util::GetStringUTF8(IDS_PRODUCT_NAME).c_str()));
+// Helper function to take a prefix and suffix and insert the browser name (like
+// "Chromium" or "Google Chrome") in the middle.
+std::u16string SubBrowserName(std::u16string_view prefix,
+                              std::u16string_view suffix) {
+  return base::StrCat(
+      {prefix, l10n_util::GetStringUTF16(IDS_PRODUCT_NAME), suffix});
 }
 
 }  // namespace
@@ -460,21 +461,21 @@
 }
 
 TEST_F(BrowserViewTest, DISABLED_AccessibleWindowTitle) {
-  EXPECT_EQ(SubBrowserName("Untitled - %s"),
+  EXPECT_EQ(SubBrowserName(u"Untitled - ", u""),
             browser_view()->GetAccessibleWindowTitleForChannelAndProfile(
                 version_info::Channel::STABLE, browser()->profile()));
-  EXPECT_EQ(SubBrowserName("Untitled - %s Beta"),
+  EXPECT_EQ(SubBrowserName(u"Untitled - ", u" Beta"),
             browser_view()->GetAccessibleWindowTitleForChannelAndProfile(
                 version_info::Channel::BETA, browser()->profile()));
-  EXPECT_EQ(SubBrowserName("Untitled - %s Dev"),
+  EXPECT_EQ(SubBrowserName(u"Untitled - ", u" Dev"),
             browser_view()->GetAccessibleWindowTitleForChannelAndProfile(
                 version_info::Channel::DEV, browser()->profile()));
-  EXPECT_EQ(SubBrowserName("Untitled - %s Canary"),
+  EXPECT_EQ(SubBrowserName(u"Untitled - ", u" Canary"),
             browser_view()->GetAccessibleWindowTitleForChannelAndProfile(
                 version_info::Channel::CANARY, browser()->profile()));
 
   AddTab(browser(), GURL("about:blank"));
-  EXPECT_EQ(SubBrowserName("about:blank - %s"),
+  EXPECT_EQ(SubBrowserName(u"about:blank - ", u""),
             browser_view()->GetAccessibleWindowTitleForChannelAndProfile(
                 version_info::Channel::STABLE, browser()->profile()));
 
@@ -482,24 +483,24 @@
   TabRendererData start_media;
   start_media.alert_state = {TabAlertState::AUDIO_PLAYING};
   tab->SetData(std::move(start_media));
-  EXPECT_EQ(SubBrowserName("about:blank - Audio playing - %s"),
+  EXPECT_EQ(SubBrowserName(u"about:blank - Audio playing - ", u""),
             browser_view()->GetAccessibleWindowTitleForChannelAndProfile(
                 version_info::Channel::STABLE, browser()->profile()));
 
   TabRendererData network_error;
   network_error.network_state = TabNetworkState::kError;
   tab->SetData(std::move(network_error));
-  EXPECT_EQ(SubBrowserName("about:blank - Network error - %s Beta"),
+  EXPECT_EQ(SubBrowserName(u"about:blank - Network error - ", u" Beta"),
             browser_view()->GetAccessibleWindowTitleForChannelAndProfile(
                 version_info::Channel::BETA, browser()->profile()));
 
   TestingProfile* profile = profile_manager()->CreateTestingProfile("Sadia");
-  EXPECT_EQ(SubBrowserName("about:blank - Network error - %s Dev - Sadia"),
+  EXPECT_EQ(SubBrowserName(u"about:blank - Network error - ", u" Dev - Sadia"),
             browser_view()->GetAccessibleWindowTitleForChannelAndProfile(
                 version_info::Channel::DEV, profile));
 
   EXPECT_EQ(
-      SubBrowserName("about:blank - Network error - %s Canary (Incognito)"),
+      SubBrowserName(u"about:blank - Network error - ", u" Canary (Incognito)"),
       browser_view()->GetAccessibleWindowTitleForChannelAndProfile(
           version_info::Channel::CANARY,
           TestingProfile::Builder().BuildIncognito(profile)));
@@ -534,7 +535,7 @@
   tab->SetData(std::move(memory_usage));
 
   // Expect that low memory usage isn't in the window title.
-  EXPECT_EQ(SubBrowserName("about:blank - %s"),
+  EXPECT_EQ(SubBrowserName(u"about:blank - ", u""),
             browser_view()->GetAccessibleWindowTitle());
   uint64_t memory_used = TabResourceUsage::kHighMemoryUsageThresholdBytes + 1;
   tab_resource_usage_->SetMemoryUsageInBytes(memory_used);
@@ -736,10 +737,10 @@
   browser_view()->frame()->Show();
 
   EXPECT_TRUE(browser()->tab_strip_model()->TabsNeedLoadingUI());
-  EXPECT_TRUE(browser_view()->IsLoadingAnimationRunningForTesting());
+  EXPECT_TRUE(browser_view()->IsLoadingAnimationRunning());
 
   browser_view()->frame()->Hide();
 
   EXPECT_TRUE(browser()->tab_strip_model()->TabsNeedLoadingUI());
-  EXPECT_FALSE(browser_view()->IsLoadingAnimationRunningForTesting());
+  EXPECT_FALSE(browser_view()->IsLoadingAnimationRunning());
 }
diff --git a/chrome/browser/ui/views/frame/contents_web_view.cc b/chrome/browser/ui/views/frame/contents_web_view.cc
index 8249bfe..04d10717 100644
--- a/chrome/browser/ui/views/frame/contents_web_view.cc
+++ b/chrome/browser/ui/views/frame/contents_web_view.cc
@@ -13,7 +13,7 @@
 #include "ui/color/color_provider.h"
 #include "ui/compositor/layer.h"
 #include "ui/compositor/layer_tree_owner.h"
-#include "ui/views/background.h"
+#include "ui/compositor/layer_type.h"
 #include "ui/views/view_class_properties.h"
 
 #if defined(USE_AURA)
@@ -32,6 +32,8 @@
 
 ContentsWebView::ContentsWebView(content::BrowserContext* browser_context)
     : views::WebView(browser_context), status_bubble_(nullptr) {
+  // Draws the ContentsWebView background.
+  SetPaintToLayer(ui::LAYER_SOLID_COLOR);
   SetProperty(views::kElementIdentifierKey, kContentsWebViewElementId);
 #if BUILDFLAG(ENABLE_GLIC)
   // `IsEnabledForProfile` returns true if the feature is explicitly enabled by
@@ -84,15 +86,19 @@
   }
 }
 
-void ContentsWebView::SetBackgroundRadii(const gfx::RoundedCornersF& radii) {
-  if (background_radii_ == radii) {
-    return;
-  }
+const gfx::RoundedCornersF& ContentsWebView::GetBackgroundRadii() const {
+  const ui::Layer* background_layer = layer();
 
-  background_radii_ = radii;
-  if (GetWidget()) {
-    UpdateBackgroundColor();
-  }
+  CHECK(background_layer);
+  return background_layer->rounded_corner_radii();
+}
+
+void ContentsWebView::SetBackgroundRadii(const gfx::RoundedCornersF& radii) {
+  ui::Layer* background_layer = layer();
+
+  CHECK(background_layer);
+  background_layer->SetRoundedCornerRadius(radii);
+  background_layer->SetIsFastRoundedCorner(true);
 }
 
 bool ContentsWebView::GetNeedsNotificationWhenVisibleBoundsChange() const {
@@ -117,12 +123,12 @@
 }
 
 void ContentsWebView::UpdateBackgroundColor() {
-  SkColor color = GetColorProvider()->GetColor(
+  const SkColor color = GetColorProvider()->GetColor(
       is_letterboxing() ? kColorWebContentsBackgroundLetterboxing
                         : kColorWebContentsBackground);
-  SetBackground(background_visible_ ? views::CreateRoundedRectBackground(
-                                          color, background_radii_)
-                                    : nullptr);
+
+  ui::Layer* background_layer = layer();
+  background_layer->SetColor(background_visible_ ? color : SK_ColorTRANSPARENT);
 
   if (web_contents()) {
     content::RenderWidgetHostView* rwhv =
@@ -167,9 +173,7 @@
     return;
   }
 
-  SetPaintToLayer();
-
-  // The cloned layer is in a different coordinate system them our layer (which
+  // The cloned layer is in a different coordinate system than our layer (which
   // is now the new parent of the cloned layer). Convert coordinates so that the
   // cloned layer appears at the right location.
   gfx::PointF origin;
@@ -183,7 +187,6 @@
 
 void ContentsWebView::DestroyClonedLayer() {
   cloned_layer_tree_.reset();
-  DestroyLayer();
 }
 
 void ContentsWebView::RenderViewReady() {
diff --git a/chrome/browser/ui/views/frame/contents_web_view.h b/chrome/browser/ui/views/frame/contents_web_view.h
index 18e4be1..84b490f 100644
--- a/chrome/browser/ui/views/frame/contents_web_view.h
+++ b/chrome/browser/ui/views/frame/contents_web_view.h
@@ -19,7 +19,7 @@
 
 namespace ui {
 class LayerTreeOwner;
-}
+}  // namespace ui
 
 #if BUILDFLAG(ENABLE_GLIC)
 namespace glic {
@@ -48,9 +48,7 @@
   // Toggles whether the background is visible.
   void SetBackgroundVisible(bool background_visible);
 
-  const gfx::RoundedCornersF& background_radii() const {
-    return background_radii_;
-  }
+  const gfx::RoundedCornersF& GetBackgroundRadii() const;
   void SetBackgroundRadii(const gfx::RoundedCornersF& radii);
 
   // WebView overrides:
@@ -77,8 +75,6 @@
 
   bool background_visible_ = true;
 
-  gfx::RoundedCornersF background_radii_;
-
   std::unique_ptr<ui::LayerTreeOwner> cloned_layer_tree_;
 
 #if BUILDFLAG(ENABLE_GLIC)
diff --git a/chrome/browser/ui/views/frame/tab_strip_region_view.cc b/chrome/browser/ui/views/frame/tab_strip_region_view.cc
index 78aa6ce4..99f80a03 100644
--- a/chrome/browser/ui/views/frame/tab_strip_region_view.cc
+++ b/chrome/browser/ui/views/frame/tab_strip_region_view.cc
@@ -21,9 +21,9 @@
 #include "chrome/browser/ui/views/chrome_layout_provider.h"
 #include "chrome/browser/ui/views/commerce/product_specifications_button.h"
 #include "chrome/browser/ui/views/tab_search_bubble_host.h"
+#include "chrome/browser/ui/views/tabs/dragging/tab_drag_controller.h"
 #include "chrome/browser/ui/views/tabs/glic_button.h"
 #include "chrome/browser/ui/views/tabs/new_tab_button.h"
-#include "chrome/browser/ui/views/tabs/tab_drag_controller.h"
 #include "chrome/browser/ui/views/tabs/tab_search_button.h"
 #include "chrome/browser/ui/views/tabs/tab_search_container.h"
 #include "chrome/browser/ui/views/tabs/tab_strip.h"
diff --git a/chrome/browser/ui/views/omnibox/omnibox_match_cell_view.cc b/chrome/browser/ui/views/omnibox/omnibox_match_cell_view.cc
index fa80e4e..c046374 100644
--- a/chrome/browser/ui/views/omnibox/omnibox_match_cell_view.cc
+++ b/chrome/browser/ui/views/omnibox/omnibox_match_cell_view.cc
@@ -115,18 +115,22 @@
   METADATA_HEADER(RoundedCornerImageView, views::ImageView)
 
  public:
-  RoundedCornerImageView() = default;
+  RoundedCornerImageView();
+
   RoundedCornerImageView(const RoundedCornerImageView&) = delete;
   RoundedCornerImageView& operator=(const RoundedCornerImageView&) = delete;
 
-  // views::ImageView:
-  bool GetCanProcessEventsWithinSubtree() const override { return false; }
+  ~RoundedCornerImageView() override = default;
 
  protected:
   // views::ImageView:
   void OnPaint(gfx::Canvas* canvas) override;
 };
 
+RoundedCornerImageView::RoundedCornerImageView() {
+  SetCanProcessEventsWithinSubtree(false);
+}
+
 void RoundedCornerImageView::OnPaint(gfx::Canvas* canvas) {
   SkPath mask;
   const int corner_radius = views::LayoutProvider::Get()->GetCornerRadiusMetric(
diff --git a/chrome/browser/ui/views/omnibox/omnibox_text_view.cc b/chrome/browser/ui/views/omnibox/omnibox_text_view.cc
index d960feb..7988aca3 100644
--- a/chrome/browser/ui/views/omnibox/omnibox_text_view.cc
+++ b/chrome/browser/ui/views/omnibox/omnibox_text_view.cc
@@ -95,7 +95,9 @@
 }  // namespace
 
 OmniboxTextView::OmniboxTextView(OmniboxResultView* result_view)
-    : result_view_(result_view) {}
+    : result_view_(result_view) {
+  SetCanProcessEventsWithinSubtree(false);
+}
 
 OmniboxTextView::~OmniboxTextView() = default;
 
@@ -126,10 +128,6 @@
   return cached_calculate_preferred_size_;
 }
 
-bool OmniboxTextView::GetCanProcessEventsWithinSubtree() const {
-  return false;
-}
-
 void OmniboxTextView::OnPaint(gfx::Canvas* canvas) {
   View::OnPaint(canvas);
 
diff --git a/chrome/browser/ui/views/omnibox/omnibox_text_view.h b/chrome/browser/ui/views/omnibox/omnibox_text_view.h
index 50d434c..d35e4cf 100644
--- a/chrome/browser/ui/views/omnibox/omnibox_text_view.h
+++ b/chrome/browser/ui/views/omnibox/omnibox_text_view.h
@@ -40,7 +40,6 @@
   // views::View:
   gfx::Size CalculatePreferredSize(
       const views::SizeBounds& available_size) const override;
-  bool GetCanProcessEventsWithinSubtree() const override;
   void OnPaint(gfx::Canvas* canvas) override;
 
   // Applies given theme color to underlying render text. This is called Apply*
diff --git a/chrome/browser/ui/views/page_action/page_action_view.cc b/chrome/browser/ui/views/page_action/page_action_view.cc
index 8cdc9b86..28570fc 100644
--- a/chrome/browser/ui/views/page_action/page_action_view.cc
+++ b/chrome/browser/ui/views/page_action/page_action_view.cc
@@ -148,6 +148,7 @@
     actions::ActionItem* action_item) {
   views::LabelButtonActionViewInterface::ActionItemChangedImpl(action_item);
   action_view_->SetVisible(ShouldShow(action_item->GetAsWeakPtr(), model_));
+  action_view_->UpdateIconImage();
 }
 
 }  // namespace page_actions
diff --git a/chrome/browser/ui/views/page_action/page_action_view.h b/chrome/browser/ui/views/page_action/page_action_view.h
index 12cb2ad8..16547544 100644
--- a/chrome/browser/ui/views/page_action/page_action_view.h
+++ b/chrome/browser/ui/views/page_action/page_action_view.h
@@ -52,12 +52,12 @@
 
   void SetShouldShowLabelForTesting(bool should_show_label);
 
- private:
   // The image associated with the `action_item_` size may be different from the
   // size needed for the location bar page action icon. Therefore, we should to
   // update the image size if needed.
   void UpdateIconImage();
 
+ private:
   bool should_show_label_ = false;
 
   base::WeakPtr<actions::ActionItem> action_item_ = nullptr;
diff --git a/chrome/browser/ui/views/page_action/page_action_view_unittest.cc b/chrome/browser/ui/views/page_action/page_action_view_unittest.cc
index fc33357b..66443ee 100644
--- a/chrome/browser/ui/views/page_action/page_action_view_unittest.cc
+++ b/chrome/browser/ui/views/page_action/page_action_view_unittest.cc
@@ -6,6 +6,7 @@
 
 #include <memory>
 
+#include "chrome/browser/ui/layout_constants.h"
 #include "chrome/browser/ui/toolbar/pinned_toolbar/pinned_toolbar_actions_model.h"
 #include "chrome/browser/ui/views/location_bar/icon_label_bubble_view.h"
 #include "chrome/browser/ui/views/page_action/page_action_controller.h"
@@ -23,6 +24,8 @@
 namespace page_actions {
 namespace {
 
+constexpr int kDefaultIconSize = 16;
+
 class MockIconLabelViewDelegate : public IconLabelBubbleView::Delegate {
  public:
   MOCK_METHOD(SkColor,
@@ -42,9 +45,8 @@
   void SetUp() override {
     ChromeViewsTestBase::SetUp();
     // Use any arbitrary vector icon.
-    auto image = ui::ImageModel::FromVectorIcon(vector_icons::kBackArrowIcon,
-                                                ui::kColorSysPrimary,
-                                                /*icon_size=*/16);
+    auto image = ui::ImageModel::FromVectorIcon(
+        vector_icons::kBackArrowIcon, ui::kColorSysPrimary, kDefaultIconSize);
     action_item_ = actions::ActionManager::Get().AddAction(
         actions::ActionItem::Builder().SetActionId(0).SetImage(image).Build());
     page_action_view_ = std::make_unique<PageActionView>(
@@ -80,6 +82,13 @@
         page_action_view_.get(), action_item_->GetAsWeakPtr());
   }
 
+  int GetViewImageWidth() {
+    return page_action_view()
+        ->GetImageModel(views::Button::STATE_NORMAL)
+        ->Size()
+        .width();
+  }
+
   PageActionView* page_action_view() { return page_action_view_.get(); }
   actions::ActionItem* action_item() { return action_item_; }
 
@@ -201,13 +210,21 @@
 
 // Test that OnThemeChanged updates the icon image correctly.
 TEST_F(PageActionViewTest, OnThemeChangedUpdatesIconImage) {
-  // Simulate OnThemeChanged.
-  page_action_view()->OnThemeChanged();
+  const int required_icon_size =
+      GetLayoutConstant(LOCATION_BAR_TRAILING_ICON_SIZE);
+  // If the default size is the intended icon size, this test is useless.
+  EXPECT_GT(required_icon_size, kDefaultIconSize);
 
-  // Verify that UpdateIconImage is invoked and sets a valid image model.
-  gfx::ImageSkia image_model =
-      page_action_view()->GetImage(views::Button::STATE_NORMAL);
-  ASSERT_FALSE(image_model.isNull());
+  EXPECT_EQ(GetViewImageWidth(), required_icon_size);
+
+  // Icon maintains its size across a theme change.
+  page_action_view()->OnThemeChanged();
+  EXPECT_EQ(GetViewImageWidth(), required_icon_size);
+
+  // Icon maintains its size across an ActionItem update.
+  page_action_view()->GetActionViewInterface()->ActionItemChangedImpl(
+      action_item());
+  EXPECT_EQ(GetViewImageWidth(), required_icon_size);
 }
 
 // Test that UpdateBorder adjusts the insets based on label visibility.
diff --git a/chrome/browser/ui/views/sad_tab_view.cc b/chrome/browser/ui/views/sad_tab_view.cc
index 7ce2012..a8fb51b 100644
--- a/chrome/browser/ui/views/sad_tab_view.cc
+++ b/chrome/browser/ui/views/sad_tab_view.cc
@@ -599,7 +599,7 @@
     // If the `owner_` ContentsWebView has a rounded background, the sad tab
     // should also have matching rounded corners as well.
     SetBackgroundRadii(
-        static_cast<ContentsWebView*>(owner_)->background_radii());
+        static_cast<ContentsWebView*>(owner_)->GetBackgroundRadii());
   }
 
   // Make the accessibility role of this view an alert dialog, and
diff --git a/chrome/browser/ui/views/tabs/DEPS b/chrome/browser/ui/views/tabs/DEPS
index c66b005..183b326 100644
--- a/chrome/browser/ui/views/tabs/DEPS
+++ b/chrome/browser/ui/views/tabs/DEPS
@@ -1,8 +1,4 @@
 specific_include_rules = {
-  "tab_drag_controller_interactive_uitest\.cc": [
-    "+ash/shell.h",
-    "+ash/wm/splitview/split_view_controller.h",
-  ],
   "tab_scrubber_chromeos*": [
     "+ash/shell.h",
     "+ash/display/event_transformation_handler.h",
diff --git a/chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc b/chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc
index b4b61fda..0acd226 100644
--- a/chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc
+++ b/chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc
@@ -42,8 +42,8 @@
 #include "chrome/browser/ui/tabs/tab_strip_user_gesture_details.h"
 #include "chrome/browser/ui/tabs/tab_utils.h"
 #include "chrome/browser/ui/ui_features.h"
+#include "chrome/browser/ui/views/tabs/dragging/tab_drag_controller.h"
 #include "chrome/browser/ui/views/tabs/tab.h"
-#include "chrome/browser/ui/views/tabs/tab_drag_controller.h"
 #include "chrome/browser/ui/views/tabs/tab_strip.h"
 #include "chrome/browser/ui/views/tabs/tab_strip_types.h"
 #include "chrome/browser/ui/web_applications/app_browser_controller.h"
diff --git a/chrome/browser/ui/views/tabs/compound_tab_container_unittest.cc b/chrome/browser/ui/views/tabs/compound_tab_container_unittest.cc
index 65f460c..1f903ee 100644
--- a/chrome/browser/ui/views/tabs/compound_tab_container_unittest.cc
+++ b/chrome/browser/ui/views/tabs/compound_tab_container_unittest.cc
@@ -10,9 +10,9 @@
 #include "chrome/browser/ui/layout_constants.h"
 #include "chrome/browser/ui/tabs/tab_renderer_data.h"
 #include "chrome/browser/ui/views/frame/browser_root_view.h"
+#include "chrome/browser/ui/views/tabs/dragging/tab_drag_context.h"
 #include "chrome/browser/ui/views/tabs/fake_base_tab_strip_controller.h"
 #include "chrome/browser/ui/views/tabs/fake_tab_slot_controller.h"
-#include "chrome/browser/ui/views/tabs/tab_drag_context.h"
 #include "chrome/browser/ui/views/tabs/tab_group_header.h"
 #include "chrome/test/views/chrome_views_test_base.h"
 #include "tab_style_views.h"
diff --git a/chrome/browser/ui/views/tabs/dragging/DEPS b/chrome/browser/ui/views/tabs/dragging/DEPS
new file mode 100644
index 0000000..856ebd7
--- /dev/null
+++ b/chrome/browser/ui/views/tabs/dragging/DEPS
@@ -0,0 +1,6 @@
+specific_include_rules = {
+  "tab_drag_controller_interactive_uitest.cc": [
+    "+ash/shell.h",
+    "+ash/wm/window_state.h",
+  ],
+}
diff --git a/chrome/browser/ui/views/tabs/dragging/DIR_METADATA b/chrome/browser/ui/views/tabs/dragging/DIR_METADATA
new file mode 100644
index 0000000..3ee889a
--- /dev/null
+++ b/chrome/browser/ui/views/tabs/dragging/DIR_METADATA
@@ -0,0 +1,6 @@
+monorail: {
+  component: "UI>Browser>TopChrome>TabStrip"
+}
+buganizer_public: {
+  component_id: 1456118
+}
diff --git a/chrome/browser/ui/views/tabs/dragging/OWNERS b/chrome/browser/ui/views/tabs/dragging/OWNERS
new file mode 100644
index 0000000..6871633
--- /dev/null
+++ b/chrome/browser/ui/views/tabs/dragging/OWNERS
@@ -0,0 +1,7 @@
+dpenning@chromium.org
+shibalik@chromium.org
+tbergquist@chromium.org
+dljames@chromium.org
+
+# For changes related to fallback (system-DnD-based) tab dragging.
+max@igalia.com
diff --git a/chrome/browser/ui/views/tabs/tab_drag_context.cc b/chrome/browser/ui/views/tabs/dragging/tab_drag_context.cc
similarity index 80%
rename from chrome/browser/ui/views/tabs/tab_drag_context.cc
rename to chrome/browser/ui/views/tabs/dragging/tab_drag_context.cc
index d432162..357225b 100644
--- a/chrome/browser/ui/views/tabs/tab_drag_context.cc
+++ b/chrome/browser/ui/views/tabs/dragging/tab_drag_context.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/views/tabs/tab_drag_context.h"
+#include "chrome/browser/ui/views/tabs/dragging/tab_drag_context.h"
 
 #include "ui/base/metadata/metadata_impl_macros.h"
 
diff --git a/chrome/browser/ui/views/tabs/tab_drag_context.h b/chrome/browser/ui/views/tabs/dragging/tab_drag_context.h
similarity index 96%
rename from chrome/browser/ui/views/tabs/tab_drag_context.h
rename to chrome/browser/ui/views/tabs/dragging/tab_drag_context.h
index a7a5873..40471711 100644
--- a/chrome/browser/ui/views/tabs/tab_drag_context.h
+++ b/chrome/browser/ui/views/tabs/dragging/tab_drag_context.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 CHROME_BROWSER_UI_VIEWS_TABS_TAB_DRAG_CONTEXT_H_
-#define CHROME_BROWSER_UI_VIEWS_TABS_TAB_DRAG_CONTEXT_H_
+#ifndef CHROME_BROWSER_UI_VIEWS_TABS_DRAGGING_TAB_DRAG_CONTEXT_H_
+#define CHROME_BROWSER_UI_VIEWS_TABS_DRAGGING_TAB_DRAG_CONTEXT_H_
 
 #include <memory>
 #include <optional>
@@ -159,4 +159,4 @@
   virtual void ForceLayout() = 0;
 };
 
-#endif  // CHROME_BROWSER_UI_VIEWS_TABS_TAB_DRAG_CONTEXT_H_
+#endif  // CHROME_BROWSER_UI_VIEWS_TABS_DRAGGING_TAB_DRAG_CONTEXT_H_
diff --git a/chrome/browser/ui/views/tabs/tab_drag_controller.cc b/chrome/browser/ui/views/tabs/dragging/tab_drag_controller.cc
similarity index 99%
rename from chrome/browser/ui/views/tabs/tab_drag_controller.cc
rename to chrome/browser/ui/views/tabs/dragging/tab_drag_controller.cc
index 23bb8c2..e47f9123 100644
--- a/chrome/browser/ui/views/tabs/tab_drag_controller.cc
+++ b/chrome/browser/ui/views/tabs/dragging/tab_drag_controller.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/views/tabs/tab_drag_controller.h"
+#include "chrome/browser/ui/views/tabs/dragging/tab_drag_controller.h"
 
 #include <algorithm>
 #include <limits>
@@ -45,11 +45,11 @@
 #include "chrome/browser/ui/views/chrome_widget_sublevel.h"
 #include "chrome/browser/ui/views/frame/browser_non_client_frame_view.h"
 #include "chrome/browser/ui/views/frame/browser_view.h"
+#include "chrome/browser/ui/views/tabs/dragging/tab_strip_scroll_session.h"
 #include "chrome/browser/ui/views/tabs/tab.h"
 #include "chrome/browser/ui/views/tabs/tab_slot_view.h"
 #include "chrome/browser/ui/views/tabs/tab_strip.h"
 #include "chrome/browser/ui/views/tabs/tab_strip_layout_helper.h"
-#include "chrome/browser/ui/views/tabs/tab_strip_scroll_session.h"
 #include "chrome/browser/ui/views/tabs/tab_style_views.h"
 #include "chrome/browser/ui/views/tabs/window_finder.h"
 #include "chrome/browser/ui/web_applications/app_browser_controller.h"
diff --git a/chrome/browser/ui/views/tabs/tab_drag_controller.h b/chrome/browser/ui/views/tabs/dragging/tab_drag_controller.h
similarity index 98%
rename from chrome/browser/ui/views/tabs/tab_drag_controller.h
rename to chrome/browser/ui/views/tabs/dragging/tab_drag_controller.h
index dcf0a33..0e6e6e65 100644
--- a/chrome/browser/ui/views/tabs/tab_drag_controller.h
+++ b/chrome/browser/ui/views/tabs/dragging/tab_drag_controller.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 CHROME_BROWSER_UI_VIEWS_TABS_TAB_DRAG_CONTROLLER_H_
-#define CHROME_BROWSER_UI_VIEWS_TABS_TAB_DRAG_CONTROLLER_H_
+#ifndef CHROME_BROWSER_UI_VIEWS_TABS_DRAGGING_TAB_DRAG_CONTROLLER_H_
+#define CHROME_BROWSER_UI_VIEWS_TABS_DRAGGING_TAB_DRAG_CONTROLLER_H_
 
 #include <stddef.h>
 
@@ -17,8 +17,8 @@
 #include "base/timer/timer.h"
 #include "base/uuid.h"
 #include "chrome/browser/ui/tabs/tab_strip_model_observer.h"
-#include "chrome/browser/ui/views/tabs/tab_drag_context.h"
-#include "chrome/browser/ui/views/tabs/tab_strip_scroll_session.h"
+#include "chrome/browser/ui/views/tabs/dragging/tab_drag_context.h"
+#include "chrome/browser/ui/views/tabs/dragging/tab_strip_scroll_session.h"
 #include "chrome/browser/ui/views/tabs/tab_strip_types.h"
 #include "components/saved_tab_groups/public/tab_group_sync_service.h"
 #include "components/tab_groups/tab_group_visual_data.h"
@@ -827,4 +827,4 @@
   base::WeakPtrFactory<TabDragController> weak_factory_{this};
 };
 
-#endif  // CHROME_BROWSER_UI_VIEWS_TABS_TAB_DRAG_CONTROLLER_H_
+#endif  // CHROME_BROWSER_UI_VIEWS_TABS_DRAGGING_TAB_DRAG_CONTROLLER_H_
diff --git a/chrome/browser/ui/views/tabs/tab_drag_controller_interactive_uitest.cc b/chrome/browser/ui/views/tabs/dragging/tab_drag_controller_interactive_uitest.cc
similarity index 99%
rename from chrome/browser/ui/views/tabs/tab_drag_controller_interactive_uitest.cc
rename to chrome/browser/ui/views/tabs/dragging/tab_drag_controller_interactive_uitest.cc
index 6dbc4aef..99d3fbd 100644
--- a/chrome/browser/ui/views/tabs/tab_drag_controller_interactive_uitest.cc
+++ b/chrome/browser/ui/views/tabs/dragging/tab_drag_controller_interactive_uitest.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/views/tabs/tab_drag_controller_interactive_uitest.h"
+#include "chrome/browser/ui/views/tabs/dragging/tab_drag_controller_interactive_uitest.h"
 
 #include <stddef.h>
 
@@ -46,8 +46,8 @@
 #include "chrome/browser/ui/views/frame/browser_view.h"
 #include "chrome/browser/ui/views/frame/native_browser_frame_factory.h"
 #include "chrome/browser/ui/views/frame/tab_strip_region_view.h"
+#include "chrome/browser/ui/views/tabs/dragging/tab_drag_controller.h"
 #include "chrome/browser/ui/views/tabs/tab.h"
-#include "chrome/browser/ui/views/tabs/tab_drag_controller.h"
 #include "chrome/browser/ui/views/tabs/tab_strip.h"
 #include "chrome/browser/ui/views/tabs/window_finder.h"
 #include "chrome/browser/ui/web_applications/test/web_app_browsertest_util.h"
diff --git a/chrome/browser/ui/views/tabs/tab_drag_controller_interactive_uitest.h b/chrome/browser/ui/views/tabs/dragging/tab_drag_controller_interactive_uitest.h
similarity index 90%
rename from chrome/browser/ui/views/tabs/tab_drag_controller_interactive_uitest.h
rename to chrome/browser/ui/views/tabs/dragging/tab_drag_controller_interactive_uitest.h
index 7124d186..b23d6f5 100644
--- a/chrome/browser/ui/views/tabs/tab_drag_controller_interactive_uitest.h
+++ b/chrome/browser/ui/views/tabs/dragging/tab_drag_controller_interactive_uitest.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 CHROME_BROWSER_UI_VIEWS_TABS_TAB_DRAG_CONTROLLER_INTERACTIVE_UITEST_H_
-#define CHROME_BROWSER_UI_VIEWS_TABS_TAB_DRAG_CONTROLLER_INTERACTIVE_UITEST_H_
+#ifndef CHROME_BROWSER_UI_VIEWS_TABS_DRAGGING_TAB_DRAG_CONTROLLER_INTERACTIVE_UITEST_H_
+#define CHROME_BROWSER_UI_VIEWS_TABS_DRAGGING_TAB_DRAG_CONTROLLER_INTERACTIVE_UITEST_H_
 
 #include <string>
 
@@ -85,4 +85,4 @@
 
 }  // namespace test
 
-#endif  // CHROME_BROWSER_UI_VIEWS_TABS_TAB_DRAG_CONTROLLER_INTERACTIVE_UITEST_H_
+#endif  // CHROME_BROWSER_UI_VIEWS_TABS_DRAGGING_TAB_DRAG_CONTROLLER_INTERACTIVE_UITEST_H_
diff --git a/chrome/browser/ui/views/tabs/tab_strip_scroll_session.cc b/chrome/browser/ui/views/tabs/dragging/tab_strip_scroll_session.cc
similarity index 97%
rename from chrome/browser/ui/views/tabs/tab_strip_scroll_session.cc
rename to chrome/browser/ui/views/tabs/dragging/tab_strip_scroll_session.cc
index b18e45d20..34d5521 100644
--- a/chrome/browser/ui/views/tabs/tab_strip_scroll_session.cc
+++ b/chrome/browser/ui/views/tabs/dragging/tab_strip_scroll_session.cc
@@ -2,12 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/ui/views/tabs/tab_strip_scroll_session.h"
+#include "chrome/browser/ui/views/tabs/dragging/tab_strip_scroll_session.h"
 
 #include <algorithm>
 
 #include "base/check.h"
-#include "chrome/browser/ui/views/tabs/tab_drag_controller.h"
+#include "chrome/browser/ui/views/tabs/dragging/tab_drag_controller.h"
 #include "ui/gfx/geometry/point.h"
 #include "ui/views/controls/scroll_view.h"
 
diff --git a/chrome/browser/ui/views/tabs/tab_strip_scroll_session.h b/chrome/browser/ui/views/tabs/dragging/tab_strip_scroll_session.h
similarity index 92%
rename from chrome/browser/ui/views/tabs/tab_strip_scroll_session.h
rename to chrome/browser/ui/views/tabs/dragging/tab_strip_scroll_session.h
index 28545f9..24bee13 100644
--- a/chrome/browser/ui/views/tabs/tab_strip_scroll_session.h
+++ b/chrome/browser/ui/views/tabs/dragging/tab_strip_scroll_session.h
@@ -2,13 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_UI_VIEWS_TABS_TAB_STRIP_SCROLL_SESSION_H_
-#define CHROME_BROWSER_UI_VIEWS_TABS_TAB_STRIP_SCROLL_SESSION_H_
+#ifndef CHROME_BROWSER_UI_VIEWS_TABS_DRAGGING_TAB_STRIP_SCROLL_SESSION_H_
+#define CHROME_BROWSER_UI_VIEWS_TABS_DRAGGING_TAB_STRIP_SCROLL_SESSION_H_
 
 #include "base/memory/raw_ptr.h"
 #include "base/time/time.h"
 #include "base/timer/timer.h"
-#include "tab_style_views.h"
+#include "chrome/browser/ui/views/tabs/tab_style_views.h"
 
 class TabDragWithScrollManager;
 
@@ -100,4 +100,4 @@
       ScrollSessionTimerType::kConstantTimer;
 };
 
-#endif  // CHROME_BROWSER_UI_VIEWS_TABS_TAB_STRIP_SCROLL_SESSION_H_
+#endif  // CHROME_BROWSER_UI_VIEWS_TABS_DRAGGING_TAB_STRIP_SCROLL_SESSION_H_
diff --git a/chrome/browser/ui/views/tabs/recent_activity_bubble_dialog_view.cc b/chrome/browser/ui/views/tabs/recent_activity_bubble_dialog_view.cc
index 94ec0dfb..aa7adc8a 100644
--- a/chrome/browser/ui/views/tabs/recent_activity_bubble_dialog_view.cc
+++ b/chrome/browser/ui/views/tabs/recent_activity_bubble_dialog_view.cc
@@ -58,8 +58,11 @@
 // Returns the correct user that should be used for a given log item.
 // Sometimes the string should describe the user that triggered an event
 // and sometimes it should describe the user that was affected by the event.
-data_sharing::GroupMember GetRelevantUserForActivity(ActivityLogItem item) {
-  std::optional<data_sharing::GroupMember> user;
+std::optional<data_sharing::GroupMember> GetRelevantUserForActivity(
+    ActivityLogItem item) {
+  using collaboration::messaging::CollaborationEvent;
+
+  std::optional<data_sharing::GroupMember> user = std::nullopt;
   switch (item.collaboration_event) {
     case CollaborationEvent::TAB_UPDATED:
     case CollaborationEvent::TAB_REMOVED:
@@ -74,11 +77,14 @@
       // Membership changes should show the affected user.
       user = item.activity_metadata.affected_user;
       break;
-    default:
+    case CollaborationEvent::TAB_GROUP_ADDED:
+    case CollaborationEvent::TAB_GROUP_REMOVED:
+    case CollaborationEvent::COLLABORATION_ADDED:
+    case CollaborationEvent::COLLABORATION_REMOVED:
+    case CollaborationEvent::UNDEFINED:
       NOTREACHED();
   }
-  CHECK(user.has_value());
-  return user.value();
+  return user;
 }
 
 // Gets the string for the metadata line to describe an event.
@@ -192,7 +198,10 @@
 RecentActivityRowImageView::~RecentActivityRowImageView() = default;
 
 void RecentActivityRowImageView::FetchAvatar() {
-  auto avatar_url = GetRelevantUserForActivity(item_).avatar_url;
+  auto user = GetRelevantUserForActivity(item_);
+  if (!user.has_value()) {
+    return;
+  }
 
   image_fetcher::ImageFetcherService* image_fetcher_service =
       ImageFetcherServiceFactory::GetForKey(profile_->GetProfileKey());
@@ -207,7 +216,7 @@
   }
 
   data_sharing_service->GetAvatarImageForURL(
-      avatar_url,
+      user->avatar_url,
       ChromeLayoutProvider::Get()->GetDistanceMetric(
           DISTANCE_RECENT_ACTIVITY_AVATAR_SIZE),
       base::BindOnce(&RecentActivityRowImageView::SetAvatar,
diff --git a/chrome/browser/ui/views/tabs/tab.cc b/chrome/browser/ui/views/tabs/tab.cc
index fcb94a0e..ee0c833 100644
--- a/chrome/browser/ui/views/tabs/tab.cc
+++ b/chrome/browser/ui/views/tabs/tab.cc
@@ -41,8 +41,8 @@
 #include "chrome/browser/ui/views/frame/browser_view.h"
 #include "chrome/browser/ui/views/tabs/alert_indicator_button.h"
 #include "chrome/browser/ui/views/tabs/browser_tab_strip_controller.h"
+#include "chrome/browser/ui/views/tabs/dragging/tab_drag_controller.h"
 #include "chrome/browser/ui/views/tabs/tab_close_button.h"
-#include "chrome/browser/ui/views/tabs/tab_drag_controller.h"
 #include "chrome/browser/ui/views/tabs/tab_hover_card_bubble_view.h"
 #include "chrome/browser/ui/views/tabs/tab_icon.h"
 #include "chrome/browser/ui/views/tabs/tab_slot_controller.h"
diff --git a/chrome/browser/ui/views/tabs/tab_container_impl.cc b/chrome/browser/ui/views/tabs/tab_container_impl.cc
index c20038b..4df8600b 100644
--- a/chrome/browser/ui/views/tabs/tab_container_impl.cc
+++ b/chrome/browser/ui/views/tabs/tab_container_impl.cc
@@ -14,9 +14,9 @@
 #include "chrome/browser/ui/tabs/features.h"
 #include "chrome/browser/ui/ui_features.h"
 #include "chrome/browser/ui/views/frame/browser_root_view.h"
+#include "chrome/browser/ui/views/tabs/dragging/tab_drag_context.h"
+#include "chrome/browser/ui/views/tabs/dragging/tab_drag_controller.h"
 #include "chrome/browser/ui/views/tabs/tab.h"
-#include "chrome/browser/ui/views/tabs/tab_drag_context.h"
-#include "chrome/browser/ui/views/tabs/tab_drag_controller.h"
 #include "chrome/browser/ui/views/tabs/tab_group_header.h"
 #include "chrome/browser/ui/views/tabs/tab_group_highlight.h"
 #include "chrome/browser/ui/views/tabs/tab_group_underline.h"
diff --git a/chrome/browser/ui/views/tabs/tab_container_unittest.cc b/chrome/browser/ui/views/tabs/tab_container_unittest.cc
index d3050ee5..ed970885f 100644
--- a/chrome/browser/ui/views/tabs/tab_container_unittest.cc
+++ b/chrome/browser/ui/views/tabs/tab_container_unittest.cc
@@ -10,11 +10,11 @@
 #include "chrome/browser/ui/tabs/features.h"
 #include "chrome/browser/ui/ui_features.h"
 #include "chrome/browser/ui/views/frame/browser_root_view.h"
+#include "chrome/browser/ui/views/tabs/dragging/tab_drag_context.h"
 #include "chrome/browser/ui/views/tabs/fake_base_tab_strip_controller.h"
 #include "chrome/browser/ui/views/tabs/fake_tab_slot_controller.h"
 #include "chrome/browser/ui/views/tabs/tab_close_button.h"
 #include "chrome/browser/ui/views/tabs/tab_container_impl.h"
-#include "chrome/browser/ui/views/tabs/tab_drag_context.h"
 #include "chrome/browser/ui/views/tabs/tab_group_header.h"
 #include "chrome/browser/ui/views/tabs/tab_group_views.h"
 #include "chrome/browser/ui/views/tabs/tab_strip_layout_helper.h"
diff --git a/chrome/browser/ui/views/tabs/tab_group_highlight.cc b/chrome/browser/ui/views/tabs/tab_group_highlight.cc
index 17558b36..22f75b7c 100644
--- a/chrome/browser/ui/views/tabs/tab_group_highlight.cc
+++ b/chrome/browser/ui/views/tabs/tab_group_highlight.cc
@@ -17,7 +17,11 @@
 TabGroupHighlight::TabGroupHighlight(TabGroupViews* tab_group_views,
                                      const tab_groups::TabGroupId& group,
                                      const TabGroupStyle& style)
-    : tab_group_views_(tab_group_views), group_(group), style_(style) {}
+    : tab_group_views_(tab_group_views), group_(group), style_(style) {
+  // Don't accept any mouse events, otherwise this will prevent tabs and group
+  // headers from getting clicked.
+  SetCanProcessEventsWithinSubtree(false);
+}
 
 void TabGroupHighlight::UpdateBounds(views::View* leading_view,
                                      views::View* trailing_view) {
@@ -42,12 +46,6 @@
   canvas->DrawPath(path, flags);
 }
 
-bool TabGroupHighlight::GetCanProcessEventsWithinSubtree() const {
-  // Don't accept any mouse events, otherwise this will prevent tabs and group
-  // headers from getting clicked.
-  return false;
-}
-
 SkPath TabGroupHighlight::GetPath() const {
   // This path imitates the shape of a tab (see GM2TabStyle::GetPath()). It
   // doesn't reuse the exact same GetPath() function because it doesn't need
diff --git a/chrome/browser/ui/views/tabs/tab_group_highlight.h b/chrome/browser/ui/views/tabs/tab_group_highlight.h
index 945a910..9124599 100644
--- a/chrome/browser/ui/views/tabs/tab_group_highlight.h
+++ b/chrome/browser/ui/views/tabs/tab_group_highlight.h
@@ -30,7 +30,6 @@
 
   // views::View:
   void OnPaint(gfx::Canvas* canvas) override;
-  bool GetCanProcessEventsWithinSubtree() const override;
 
  private:
   // Returns the highlight shape, which immitates the tab highlight shape.
diff --git a/chrome/browser/ui/views/tabs/tab_strip.cc b/chrome/browser/ui/views/tabs/tab_strip.cc
index e1d6a12c..b4fe9e90 100644
--- a/chrome/browser/ui/views/tabs/tab_strip.cc
+++ b/chrome/browser/ui/views/tabs/tab_strip.cc
@@ -57,9 +57,9 @@
 #include "chrome/browser/ui/views/frame/browser_view.h"
 #include "chrome/browser/ui/views/tabs/browser_tab_strip_controller.h"
 #include "chrome/browser/ui/views/tabs/compound_tab_container.h"
+#include "chrome/browser/ui/views/tabs/dragging/tab_drag_controller.h"
 #include "chrome/browser/ui/views/tabs/tab.h"
 #include "chrome/browser/ui/views/tabs/tab_container_impl.h"
-#include "chrome/browser/ui/views/tabs/tab_drag_controller.h"
 #include "chrome/browser/ui/views/tabs/tab_group_header.h"
 #include "chrome/browser/ui/views/tabs/tab_group_highlight.h"
 #include "chrome/browser/ui/views/tabs/tab_group_underline.h"
diff --git a/chrome/browser/ui/views/tabs/tab_strip.h b/chrome/browser/ui/views/tabs/tab_strip.h
index 8b48841..d9b518f 100644
--- a/chrome/browser/ui/views/tabs/tab_strip.h
+++ b/chrome/browser/ui/views/tabs/tab_strip.h
@@ -20,10 +20,10 @@
 #include "chrome/browser/ui/tabs/tab_types.h"
 #include "chrome/browser/ui/tabs/tab_utils.h"
 #include "chrome/browser/ui/views/frame/browser_root_view.h"
+#include "chrome/browser/ui/views/tabs/dragging/tab_drag_context.h"
 #include "chrome/browser/ui/views/tabs/tab.h"
 #include "chrome/browser/ui/views/tabs/tab_container.h"
 #include "chrome/browser/ui/views/tabs/tab_container_controller.h"
-#include "chrome/browser/ui/views/tabs/tab_drag_context.h"
 #include "chrome/browser/ui/views/tabs/tab_group_header.h"
 #include "chrome/browser/ui/views/tabs/tab_group_views.h"
 #include "chrome/browser/ui/views/tabs/tab_slot_controller.h"
diff --git a/chrome/browser/ui/views/tabs/tab_strip_scroll_session_unittest.cc b/chrome/browser/ui/views/tabs/tab_strip_scroll_session_unittest.cc
index 093c8c5..640ab70 100644
--- a/chrome/browser/ui/views/tabs/tab_strip_scroll_session_unittest.cc
+++ b/chrome/browser/ui/views/tabs/tab_strip_scroll_session_unittest.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/views/tabs/tab_strip_scroll_session.h"
+#include "chrome/browser/ui/views/tabs/dragging/tab_strip_scroll_session.h"
 
 #include <memory>
 
@@ -10,7 +10,7 @@
 #include "base/timer/mock_timer.h"
 #include "chrome/browser/ui/tabs/features.h"
 #include "chrome/browser/ui/ui_features.h"
-#include "chrome/browser/ui/views/tabs/tab_drag_controller.h"
+#include "chrome/browser/ui/views/tabs/dragging/tab_drag_controller.h"
 #include "chrome/test/views/chrome_views_test_base.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
diff --git a/chrome/browser/ui/views/tabs/tab_style_views.cc b/chrome/browser/ui/views/tabs/tab_style_views.cc
index 95807b1..13203a5 100644
--- a/chrome/browser/ui/views/tabs/tab_style_views.cc
+++ b/chrome/browser/ui/views/tabs/tab_style_views.cc
@@ -43,17 +43,6 @@
 #include "ui/views/widget/widget.h"
 
 namespace {
-// How the tab shape path is modified for selected tabs.
-using ShapeModifier = int;
-// No modification should be done.
-constexpr ShapeModifier kNone = 0x00;
-// Exclude the lower left arc.
-constexpr ShapeModifier kNoLowerLeftArc = 0x01;
-// Exclude the lower right arc.
-constexpr ShapeModifier kNoLowerRightArc = 0x01 << 1;
-// shrink the left arc to fit the reduced space without frame
-// controls/tabsearch.
-constexpr ShapeModifier kCompactLeftArc = 0x01 << 2;
 
 // Updates a target value, returning true if it changed.
 template <class T>
@@ -160,11 +149,10 @@
   // be the same as GetHoverAnimationValue.
   float GetHoverOpacity() const;
 
-  // When selected, non-active, non-hovered tabs are adjacent to each other,
-  // there are anti-aliasing artifacts in the overlapped lower arc region. This
-  // returns how to modify the tab shape to eliminate the lower arcs on the
-  // right or left based on the state of the adjacent tab(s).
-  ShapeModifier GetShapeModifier(TabStyle::PathType path_type) const;
+  // In some platforms, the window caption buttons and tab search may not be on
+  // the left side of the tabstrip. The leading edge should be modified for
+  // those cases.
+  bool ShouldCompactLeadingEdge(TabStyle::PathType path_type) const;
 
   // Painting helper functions:
   void PaintInactiveTabBackground(gfx::Canvas* canvas) const;
@@ -354,11 +342,7 @@
     tab_bottom -= 0.5f * stroke_adjustment;
     extension_corner_radius -= 0.5f * stroke_adjustment;
   }
-  const ShapeModifier shape_modifier = GetShapeModifier(path_type);
-  const bool extend_left_to_bottom = shape_modifier & kNoLowerLeftArc;
-  const bool extend_right_to_bottom = shape_modifier & kNoLowerRightArc;
-  const bool compact_left_to_bottom =
-      !extend_left_to_bottom && (shape_modifier & kCompactLeftArc);
+  const bool compact_left_to_bottom = ShouldCompactLeadingEdge(path_type);
 
   SkPath path;
 
@@ -397,14 +381,10 @@
     //   ╭─────────╮
     //   │ Content │
     // ┌━╝         ╰─┐
-    if (extend_left_to_bottom) {
-      path.lineTo(tab_left, tab_bottom);
-    } else {
       path.lineTo(tab_left - left_extension_corner_radius, tab_bottom);
       path.arcTo(left_extension_corner_radius, left_extension_corner_radius, 0,
                  SkPath::kSmall_ArcSize, SkPathDirection::kCCW, tab_left,
                  tab_bottom - left_extension_corner_radius);
-    }
   }
 
   // Draw the ascender and top-left curve, if present.
@@ -444,14 +424,10 @@
     //   ╭─────────╮
     //   │ Content ┃
     // ┌─╯         ╚━┐
-    if (extend_right_to_bottom) {
-      path.lineTo(tab_right, tab_bottom);
-    } else {
       path.lineTo(tab_right, tab_bottom - extension_corner_radius);
       path.arcTo(extension_corner_radius, extension_corner_radius, 0,
                  SkPath::kSmall_ArcSize, SkPathDirection::kCCW,
                  tab_right + extension_corner_radius, tab_bottom);
-    }
     if (tab_bottom != extended_bottom) {
       path.lineTo(right, tab_bottom);
     }
@@ -913,31 +889,11 @@
   return TabStyle::TabSelectionState::kInactive;
 }
 
-ShapeModifier TabStyleViewsImpl::GetShapeModifier(
+bool TabStyleViewsImpl::ShouldCompactLeadingEdge(
     TabStyle::PathType path_type) const {
-  ShapeModifier shape_modifier = kNone;
-  if (path_type == TabStyle::PathType::kFill && tab_->IsSelected() &&
-      !IsHoverAnimationActive() && !tab_->IsActive()) {
-    auto check_adjacent_tab = [](const Tab* tab, int offset,
-                                 ShapeModifier modifier) {
-      const Tab* adjacent_tab = tab->controller()->GetAdjacentTab(tab, offset);
-      if (adjacent_tab && adjacent_tab->IsSelected() &&
-          !adjacent_tab->IsMouseHovered()) {
-        return modifier;
-      }
-      return kNone;
-    };
-    shape_modifier |= check_adjacent_tab(tab_, -1, kNoLowerLeftArc);
-    shape_modifier |= check_adjacent_tab(tab_, 1, kNoLowerRightArc);
-  }
-
   // If the tab is the first in the list
-  if (tab_->controller()->tab_at(0) == tab_ &&
-      tab_->controller()->ShouldCompactLeadingEdge()) {
-    shape_modifier |= kCompactLeftArc;
-  }
-
-  return shape_modifier;
+  return tab_->controller()->tab_at(0) == tab_ &&
+         tab_->controller()->ShouldCompactLeadingEdge();
 }
 
 void TabStyleViewsImpl::PaintTabBackground(
diff --git a/chrome/browser/ui/views/web_apps/deprecated_apps_dialog_view_browsertest.cc b/chrome/browser/ui/views/web_apps/deprecated_apps_dialog_view_browsertest.cc
index 65431580..41425b6 100644
--- a/chrome/browser/ui/views/web_apps/deprecated_apps_dialog_view_browsertest.cc
+++ b/chrome/browser/ui/views/web_apps/deprecated_apps_dialog_view_browsertest.cc
@@ -9,6 +9,7 @@
 
 #include "base/functional/callback_helpers.h"
 #include "base/run_loop.h"
+#include "base/strings/cstring_view.h"
 #include "base/test/bind.h"
 #include "chrome/browser/extensions/extension_browsertest.h"
 #include "chrome/browser/platform_util.h"
@@ -28,32 +29,12 @@
 #include "ui/views/widget/widget_observer.h"
 
 namespace {
-constexpr char mock_app_manifest1[] =
-    "{"
-    "  \"name\": \"Test App1\","
-    "  \"version\": \"1\","
-    "  \"manifest_version\": 2,"
-    "  \"app\": {"
-    "    \"launch\": {"
-    "      \"web_url\": \"%s\""
-    "    },"
-    "    \"urls\": [\"*://app1.com/\"]"
-    "  }"
-    "}";
-constexpr char mock_app_manifest2[] =
-    "{"
-    "  \"name\": \"Test App2\","
-    "  \"version\": \"1\","
-    "  \"manifest_version\": 2,"
-    "  \"app\": {"
-    "    \"launch\": {"
-    "      \"web_url\": \"%s\""
-    "    },"
-    "    \"urls\": [\"*://app2.com/\"]"
-    "  }"
-    "}";
-constexpr char mock_url1[] = "https://www.app1.com/index.html";
-constexpr char mock_url2[] = "https://www.app2.com/index.html";
+constexpr char kMockName1[] = "Test App1";
+constexpr char kMockName2[] = "Test App2";
+constexpr char kMockUrl1[] = "https://www.app1.com/index.html";
+constexpr char kMockUrl2[] = "https://www.app2.com/index.html";
+constexpr char kMockHost1[] = "app1.com";
+constexpr char kMockHost2[] = "app2.com";
 }  // namespace
 
 class DeprecatedAppDialogWidgetObserver : public views::WidgetObserver {
@@ -132,11 +113,24 @@
     return nullptr;
   }
 
-  extensions::ExtensionId InstallExtensionForTesting(const char* app_manifest,
-                                                     const char* url) {
+  extensions::ExtensionId InstallExtensionForTesting(base::cstring_view name,
+                                                     std::string_view url,
+                                                     base::cstring_view host) {
     extensions::TestExtensionDir test_app_dir;
+    static constexpr char kMockAppManifest[] = R"({
+  "name": "%s",
+  "version": "1",
+  "manifest_version": 2,
+  "app": {
+    "launch": {
+      "web_url": "%s"
+    },
+    "urls": ["*://%s/"]
+  }
+})";
     test_app_dir.WriteManifest(
-        base::StringPrintfNonConstexpr(app_manifest, GURL(url).spec().c_str()));
+        base::StringPrintf(kMockAppManifest, name.c_str(),
+                           GURL(url).spec().c_str(), host.c_str()));
     const extensions::Extension* app = InstallExtensionWithSourceAndFlags(
         test_app_dir.UnpackedPath(), /*expected_change=*/1,
         extensions::mojom::ManifestLocation::kInternal,
@@ -155,7 +149,7 @@
                        VerifyTableModelForSingleApp) {
   auto* web_contents = browser()->tab_strip_model()->GetActiveWebContents();
 
-  InstallExtensionForTesting(mock_app_manifest1, mock_url1);
+  InstallExtensionForTesting(kMockName1, kMockUrl1, kMockHost1);
   test_dialog_view_ =
       DeprecatedAppsDialogView::CreateAndShowDialog(
           std::string(), deprecated_app_ids_for_testing_, web_contents)
@@ -170,8 +164,8 @@
                        VerifyTableModelForMultipleApps) {
   auto* web_contents = browser()->tab_strip_model()->GetActiveWebContents();
 
-  InstallExtensionForTesting(mock_app_manifest1, mock_url1);
-  InstallExtensionForTesting(mock_app_manifest2, mock_url2);
+  InstallExtensionForTesting(kMockName1, kMockUrl1, kMockHost1);
+  InstallExtensionForTesting(kMockName2, kMockUrl2, kMockHost2);
   test_dialog_view_ =
       DeprecatedAppsDialogView::CreateAndShowDialog(
           std::string(), deprecated_app_ids_for_testing_, web_contents)
@@ -187,7 +181,7 @@
   auto* web_contents = browser()->tab_strip_model()->GetActiveWebContents();
 
   extensions::ExtensionId test_id(
-      InstallExtensionForTesting(mock_app_manifest1, mock_url1));
+      InstallExtensionForTesting(kMockName1, kMockUrl1, kMockHost1));
   test_dialog_view_ =
       DeprecatedAppsDialogView::CreateAndShowDialog(
           std::string(), deprecated_app_ids_for_testing_, web_contents)
@@ -219,7 +213,7 @@
 IN_PROC_BROWSER_TEST_F(DeprecatedAppsDialogViewBrowserTest,
                        DeprecatedAppsDialogShownFromLinkClick) {
   auto* web_contents = browser()->tab_strip_model()->GetActiveWebContents();
-  InstallExtensionForTesting(mock_app_manifest1, mock_url1);
+  InstallExtensionForTesting(kMockName1, kMockUrl1, kMockHost1);
   ASSERT_TRUE(
       ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUIAppsURL)));
   auto waiter = views::NamedWidgetShownWaiter(
diff --git a/chrome/browser/ui/webui/chrome_content_browser_client_webui_part.cc b/chrome/browser/ui/webui/chrome_content_browser_client_webui_part.cc
index bb8b5940..9210b15 100644
--- a/chrome/browser/ui/webui/chrome_content_browser_client_webui_part.cc
+++ b/chrome/browser/ui/webui/chrome_content_browser_client_webui_part.cc
@@ -56,8 +56,9 @@
 ChromeContentBrowserClientWebUiPart::~ChromeContentBrowserClientWebUiPart() =
     default;
 
-void ChromeContentBrowserClientWebUiPart::OverrideWebkitPrefs(
+void ChromeContentBrowserClientWebUiPart::OverrideWebPreferences(
     content::WebContents* web_contents,
+    content::SiteInstance& main_frame_site,
     blink::web_pref::WebPreferences* web_prefs) {
   // This logic is invoked at startup, and anytime the default prefs change.
   GURL url = GetVisibleURL(web_contents);
@@ -83,6 +84,7 @@
 
 bool ChromeContentBrowserClientWebUiPart::OverrideWebPreferencesAfterNavigation(
     content::WebContents* web_contents,
+    content::SiteInstance& main_frame_site,
     blink::web_pref::WebPreferences* web_prefs) {
   // This logic is invoked once on each navigation.
 
@@ -92,8 +94,7 @@
   }
 
   // Extensions are handled by ChromeContentBrowserClientExtensionsPart.
-  const GURL& site_url =
-      web_contents->GetPrimaryMainFrame()->GetSiteInstance()->GetSiteURL();
+  const GURL& site_url = main_frame_site.GetSiteURL();
   if (site_url.SchemeIs(extensions::kExtensionScheme)) {
     return false;
   }
diff --git a/chrome/browser/ui/webui/chrome_content_browser_client_webui_part.h b/chrome/browser/ui/webui/chrome_content_browser_client_webui_part.h
index 3219469..dde8d866 100644
--- a/chrome/browser/ui/webui/chrome_content_browser_client_webui_part.h
+++ b/chrome/browser/ui/webui/chrome_content_browser_client_webui_part.h
@@ -22,10 +22,13 @@
   ~ChromeContentBrowserClientWebUiPart() override;
 
   // ChromeContentBrowserClientParts:
-  void OverrideWebkitPrefs(content::WebContents* web_contents,
-                           blink::web_pref::WebPreferences* web_prefs) override;
+  void OverrideWebPreferences(
+      content::WebContents* web_contents,
+      content::SiteInstance& main_frame_site,
+      blink::web_pref::WebPreferences* web_prefs) override;
   bool OverrideWebPreferencesAfterNavigation(
       content::WebContents* web_contents,
+      content::SiteInstance& main_frame_site,
       blink::web_pref::WebPreferences* web_prefs) override;
 };
 
diff --git a/chrome/browser/ui/webui/settings/people_handler.cc b/chrome/browser/ui/webui/settings/people_handler.cc
index 8bfbe5c8e..eccab62 100644
--- a/chrome/browser/ui/webui/settings/people_handler.cc
+++ b/chrome/browser/ui/webui/settings/people_handler.cc
@@ -550,6 +550,7 @@
 #if BUILDFLAG(ENABLE_DICE_SUPPORT)
   UpdateChromeSigninUserChoiceInfo();
   UpdateSyncStatus();
+  UpdateStoredAccounts();
 #endif
 }
 
@@ -1144,6 +1145,8 @@
                   GetStringUTF16(status_labels.status_label_string_id));
   sync_status.Set("statusActionText",
                   GetStringUTF16(status_labels.button_string_id));
+  sync_status.Set("secondaryButtonActionText",
+                  GetStringUTF16(status_labels.secondary_button_string_id));
   sync_status.Set(
       "hasError",
       status_labels.message_type == SyncStatusMessageType::kSyncError ||
diff --git a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
index 6fe4f07..0e34ad4 100644
--- a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
+++ b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
@@ -1560,6 +1560,7 @@
        IDS_SETTINGS_PEOPLE_ACCOUNT_AWARE_SIGNIN_ACCOUNT_ROW_TITLE},
       {"accountAwareRowSubtitle",
        IDS_SETTINGS_PEOPLE_ACCOUNT_AWARE_SIGNIN_ACCOUNT_ROW_SUBTITLE},
+      {"pendingStateAvatarRowSubtitle", IDS_SETTINGS_PENDING_STATE_DESCRIPTION},
   };
 
   html_source->AddLocalizedStrings(kLocalizedStrings);
diff --git a/chrome/browser/webapps/web_app_offline_browsertest.cc b/chrome/browser/webapps/web_app_offline_browsertest.cc
index c26fa178..4dc1470 100644
--- a/chrome/browser/webapps/web_app_offline_browsertest.cc
+++ b/chrome/browser/webapps/web_app_offline_browsertest.cc
@@ -386,7 +386,7 @@
 
  protected:
   void SetUpCommandLine(base::CommandLine* command_line) override {
-    // ShellContentBrowserClient::OverrideWebkitPrefs() overrides the
+    // ShellContentBrowserClient::OverrideWebPreferences() overrides the
     // prefers-color-scheme according to switches::kForceDarkMode
     // command line.
     if (GetParam() == blink::mojom::PreferredColorScheme::kDark)
diff --git a/chrome/build/android-arm32.pgo.txt b/chrome/build/android-arm32.pgo.txt
index 010c4bc8..315febf 100644
--- a/chrome/build/android-arm32.pgo.txt
+++ b/chrome/build/android-arm32.pgo.txt
@@ -1 +1 @@
-chrome-android32-main-1736251087-28bbc04b799abd41fc99a9fa6c8dbbf3013fbc0a-ede71bd9ed020334a5c130c4eb4c12c61f07df8c.profdata
+chrome-android32-main-1736272752-7bd193d949fda45bfc163d7608fccbc7c5fd334d-27c7fe6e7a57093e09bcdb675cc6cfedac716110.profdata
diff --git a/chrome/build/android-arm64.pgo.txt b/chrome/build/android-arm64.pgo.txt
index ca08bf0..12db630 100644
--- a/chrome/build/android-arm64.pgo.txt
+++ b/chrome/build/android-arm64.pgo.txt
@@ -1 +1 @@
-chrome-android64-main-1736261553-5e995415b9c286caee3bc82feb308b2f18a3a8c6-6372e1a932473cd76629cf7d4565d53cc1504efa.profdata
+chrome-android64-main-1736277140-6f03d9c740a1a96ee929725f1cc30890feca969b-a4897185c0829379ab96307f0bc0ef0e08a12f59.profdata
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt
index 1b994b4..ced5ea4 100644
--- a/chrome/build/linux.pgo.txt
+++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@
-chrome-linux-main-1736207974-5ae9f0162c20fff82f1e40f419ea3bfa7e81091b-af4ba91a321f05ca255d879c0b3f1d78b123ad44.profdata
+chrome-linux-main-1736272752-1c90793f30e0ab690fb7694ecd081599201a7db8-27c7fe6e7a57093e09bcdb675cc6cfedac716110.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt
index 7c3b299e..6478935a 100644
--- a/chrome/build/mac-arm.pgo.txt
+++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@
-chrome-mac-arm-main-1736265592-41ff2486464119b7daa5e476c6c0a5e59bc26599-92866ee99b357f6a2ba3a8a2a6be1e40ada84f17.profdata
+chrome-mac-arm-main-1736279989-5bb8aca24c6066a27a82f731af86e5e23902d0a5-bc34e4985465add578ce7907d236e20a00c06248.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt
index de1b3df..fa585ad 100644
--- a/chrome/build/mac.pgo.txt
+++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@
-chrome-mac-main-1736251087-db8e9fddd499b11d81658bbd2d78dafcc1b6e73b-ede71bd9ed020334a5c130c4eb4c12c61f07df8c.profdata
+chrome-mac-main-1736272752-e93296709dc03ec7534a74f4e56773c4927140be-27c7fe6e7a57093e09bcdb675cc6cfedac716110.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt
index 296c16a..9f7369e 100644
--- a/chrome/build/win32.pgo.txt
+++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@
-chrome-win32-main-1736251087-a854cde66340ce856b9b35fd84c6b8ab780ce3f1-ede71bd9ed020334a5c130c4eb4c12c61f07df8c.profdata
+chrome-win32-main-1736261981-74761280f2f7b7408b1f01d74625590565e1930a-854cf508c0554d06c7af4d33a5fc9fccf188c40d.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt
index 15ffe8e..45ed9bd 100644
--- a/chrome/build/win64.pgo.txt
+++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@
-chrome-win64-main-1736251087-926daddc590f6d0008eb72c68fb535964076b723-ede71bd9ed020334a5c130c4eb4c12c61f07df8c.profdata
+chrome-win64-main-1736261981-4e7650f1e7ec2c4656889ff83e2fce1d485ba9de-854cf508c0554d06c7af4d33a5fc9fccf188c40d.profdata
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc
index 987a1be..5ca0fbf 100644
--- a/chrome/common/chrome_features.cc
+++ b/chrome/common/chrome_features.cc
@@ -734,48 +734,6 @@
              base::FEATURE_DISABLED_BY_DEFAULT);
 #endif  // BUILDFLAG(IS_CHROMEOS)
 
-// When enabled, allows other features to use the k-Anonymity Service.
-BASE_FEATURE(kKAnonymityService,
-             "KAnonymityService",
-             base::FEATURE_ENABLED_BY_DEFAULT);
-
-// Origin to use for requests to the k-Anonymity Auth server to get trust
-// tokens.
-constexpr base::FeatureParam<std::string> kKAnonymityServiceAuthServer{
-    &kKAnonymityService, "KAnonymityServiceAuthServer",
-    "https://chromekanonymityauth-pa.googleapis.com/"};
-
-// Origin to use as a relay for OHTTP requests to the k-Anonymity Join server.
-constexpr base::FeatureParam<std::string> kKAnonymityServiceJoinRelayServer{
-    &kKAnonymityService, "KAnonymityServiceJoinRelayServer",
-    "https://google-ohttp-relay-join.fastly-edge.com/"};
-
-// Origin to use to notify the k-Anonymity Join server of group membership.
-constexpr base::FeatureParam<std::string> kKAnonymityServiceJoinServer{
-    &kKAnonymityService, "KAnonymityServiceJoinServer",
-    "https://chromekanonymity-pa.googleapis.com/"};
-
-// Minimum amount of time allowed between notifying the Join server of
-// membership in a distinct group.
-constexpr base::FeatureParam<base::TimeDelta> kKAnonymityServiceJoinInterval{
-    &kKAnonymityService, "KAnonymityServiceJoinInterval", base::Days(1)};
-
-// Origin to use as a relay for OHTTP requests to the k-Anonymity Query server.
-constexpr base::FeatureParam<std::string> kKAnonymityServiceQueryRelayServer{
-    &kKAnonymityService, "KAnonymityServiceQueryRelayServer",
-    "https://google-ohttp-relay-query.fastly-edge.com/"};
-
-// Origin to use to request k-anonymity status from the k-Anonymity Query
-// server.
-constexpr base::FeatureParam<std::string> kKAnonymityServiceQueryServer{
-    &kKAnonymityService, "KAnonymityServiceQueryServer",
-    "https://chromekanonymityquery-pa.googleapis.com/"};
-
-// Minimum amount of time allowed between requesting k-anonymity status from the
-// Query server for a distinct group.
-constexpr base::FeatureParam<base::TimeDelta> kKAnonymityServiceQueryInterval{
-    &kKAnonymityService, "KAnonymityServiceJoinInterval", base::Days(1)};
-
 // When enabled, the k-Anonymity Service will send requests to the Join and
 // Query k-anonymity servers.
 BASE_FEATURE(kKAnonymityServiceOHTTPRequests,
diff --git a/chrome/common/chrome_features.h b/chrome/common/chrome_features.h
index 0fd335f..dc2c41db 100644
--- a/chrome/common/chrome_features.h
+++ b/chrome/common/chrome_features.h
@@ -442,23 +442,6 @@
 BASE_DECLARE_FEATURE(kKioskEnableSystemWebApps);
 #endif
 
-COMPONENT_EXPORT(CHROME_FEATURES) BASE_DECLARE_FEATURE(kKAnonymityService);
-COMPONENT_EXPORT(CHROME_FEATURES)
-extern const base::FeatureParam<std::string> kKAnonymityServiceAuthServer;
-COMPONENT_EXPORT(CHROME_FEATURES)
-extern const base::FeatureParam<std::string> kKAnonymityServiceJoinRelayServer;
-COMPONENT_EXPORT(CHROME_FEATURES)
-extern const base::FeatureParam<std::string> kKAnonymityServiceJoinServer;
-COMPONENT_EXPORT(CHROME_FEATURES)
-extern const base::FeatureParam<base::TimeDelta> kKAnonymityServiceJoinInterval;
-COMPONENT_EXPORT(CHROME_FEATURES)
-extern const base::FeatureParam<std::string> kKAnonymityServiceQueryServer;
-COMPONENT_EXPORT(CHROME_FEATURES)
-extern const base::FeatureParam<std::string> kKAnonymityServiceQueryRelayServer;
-COMPONENT_EXPORT(CHROME_FEATURES)
-extern const base::FeatureParam<base::TimeDelta>
-    kKAnonymityServiceQueryInterval;
-
 COMPONENT_EXPORT(CHROME_FEATURES)
 BASE_DECLARE_FEATURE(kKAnonymityServiceOHTTPRequests);
 
diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h
index 44735afd..cd083e8 100644
--- a/chrome/common/pref_names.h
+++ b/chrome/common/pref_names.h
@@ -3554,10 +3554,6 @@
 inline constexpr char kLacrosAccessibilityCaretHighlightEnabled[] =
     "lacros.settings.a11y.caret_highlight";
 
-// A boolean pref which determines whether custom cursor color is enabled.
-inline constexpr char kLacrosAccessibilityCursorColorEnabled[] =
-    "lacros.settings.a11y.cursor_color_enabled";
-
 // A boolean pref which determines whether cursor highlighting is enabled.
 inline constexpr char kLacrosAccessibilityCursorHighlightEnabled[] =
     "lacros.settings.a11y.cursor_highlight";
diff --git a/chrome/enterprise_companion/event_logger.cc b/chrome/enterprise_companion/event_logger.cc
index c23db5b3..5dab91f 100644
--- a/chrome/enterprise_companion/event_logger.cc
+++ b/chrome/enterprise_companion/event_logger.cc
@@ -25,12 +25,15 @@
 #include "base/memory/scoped_refptr.h"
 #include "base/memory/weak_ptr.h"
 #include "base/sequence_checker.h"
+#include "base/strings/stringprintf.h"
+#include "base/system/sys_info.h"
 #include "base/task/bind_post_task.h"
 #include "base/task/sequenced_task_runner.h"
 #include "base/threading/sequence_bound.h"
 #include "base/time/clock.h"
 #include "base/time/time.h"
 #include "base/timer/timer.h"
+#include "build/build_config.h"
 #include "chrome/enterprise_companion/enterprise_companion_branding.h"
 #include "chrome/enterprise_companion/enterprise_companion_client.h"
 #include "chrome/enterprise_companion/enterprise_companion_version.h"
@@ -55,6 +58,10 @@
 #include "url/gurl.h"
 #include "url/origin.h"
 
+#if BUILDFLAG(IS_WIN)
+#include "base/win/windows_version.h"
+#endif
+
 namespace enterprise_companion {
 
 namespace {
@@ -107,6 +114,44 @@
     metadata.set_omaha_cohort_id(
         command_line->GetSwitchValueASCII(kCohortIdSwitch));
   }
+
+#if defined(ARCH_CPU_X86)
+  metadata.set_application_arch(proto::X86);
+#elif defined(ARCH_CPU_X86_64)
+  metadata.set_application_arch(proto::X86_64);
+#elif defined(ARCH_CPU_ARM64)
+  metadata.set_application_arch(proto::ARM64);
+#endif
+
+#if BUILDFLAG(IS_LINUX)
+  metadata.set_os_platform(proto::LINUX);
+#elif BUILDFLAG(IS_MAC)
+  metadata.set_os_platform(proto::MAC);
+#elif BUILDFLAG(IS_WIN)
+  metadata.set_os_platform(proto::WINDOWS);
+#endif
+
+#if BUILDFLAG(IS_WIN)
+  const base::win::OSInfo::VersionNumber v =
+      base::win::OSInfo::GetInstance()->version_number();
+  metadata.set_os_version(
+      base::StringPrintf("%u.%u.%u", v.major, v.minor, v.build));
+#elif BUILDFLAG(IS_MAC)
+  int32_t os_major = 0, os_minor = 0, os_bugfix = 0;
+  base::SysInfo::OperatingSystemVersionNumbers(&os_major, &os_minor,
+                                               &os_bugfix);
+  metadata.set_os_version(base::StringPrintf("%u.%u", os_major, os_minor));
+#endif
+
+  const std::string os_arch = base::SysInfo::OperatingSystemArchitecture();
+  if (os_arch == "x86") {
+    metadata.set_os_arch(proto::X86);
+  } else if (os_arch == "x86_64") {
+    metadata.set_os_arch(proto::X86_64);
+  } else if (os_arch == "arm64") {
+    metadata.set_os_arch(proto::ARM64);
+  }
+
   return metadata;
 }
 
diff --git a/chrome/enterprise_companion/proto/enterprise_companion_event.proto b/chrome/enterprise_companion/proto/enterprise_companion_event.proto
index c3543b0..c84375b 100644
--- a/chrome/enterprise_companion/proto/enterprise_companion_event.proto
+++ b/chrome/enterprise_companion/proto/enterprise_companion_event.proto
@@ -43,12 +43,39 @@
   }
 }
 
+enum Architecture {
+  ARCHITECTURE_UNSPECIFIED = 0;
+  X86 = 1;
+  X86_64 = 2;
+  ARM64 = 3;
+}
+
+enum Platform {
+  PLATFORM_UNSPECIFIED = 0;
+  LINUX = 1;
+  MAC = 2;
+  WINDOWS = 3;
+}
+
 message EnterpriseCompanionMetadata {
   // The version of the enterprise companion.
   string app_version = 1;
 
   // The Omaha cohort ID of the enterprise companion.
   string omaha_cohort_id = 2;
+
+  // The build architecture of the application.
+  Architecture application_arch = 3;
+
+  // The operating system platform (e.g. Mac or Windows).
+  Platform os_platform = 4;
+
+  // The operating system version; truncated to major.minor.build on Windows,
+  // major.minor on Mac, and not transmitted on other platforms.
+  string os_version = 5;
+
+  // The operating system architecture.
+  Architecture os_arch = 6;
 }
 
 // The message to serialize and include in the log request.
diff --git a/chrome/installer/mac/internal b/chrome/installer/mac/internal
index 4bac264..85c282f 160000
--- a/chrome/installer/mac/internal
+++ b/chrome/installer/mac/internal
@@ -1 +1 @@
-Subproject commit 4bac26477e63edd1db3d6fd771236798ec4adc97
+Subproject commit 85c282fe6f2763822964028cb89be7b808b07169
diff --git a/chrome/renderer/v8_unwinder.cc b/chrome/renderer/v8_unwinder.cc
index 6cbe70b..67f64ac 100644
--- a/chrome/renderer/v8_unwinder.cc
+++ b/chrome/renderer/v8_unwinder.cc
@@ -14,6 +14,7 @@
 #include <utility>
 
 #include "base/check_op.h"
+#include "base/profiler/register_context_registers.h"
 #include "build/build_config.h"
 #include "v8/include/v8-isolate.h"
 
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 86d70aa..6a1a4ea0 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -11020,8 +11020,8 @@
         "../browser/ui/views/site_data/page_specific_site_data_dialog_interactive_uitest.cc",
         "../browser/ui/views/ssl_client_certificate_selector_browsertest.cc",
         "../browser/ui/views/tabs/collaboration_messaging_page_action_icon_view_interactive_uitest.cc",
-        "../browser/ui/views/tabs/tab_drag_controller_interactive_uitest.cc",
-        "../browser/ui/views/tabs/tab_drag_controller_interactive_uitest.h",
+        "../browser/ui/views/tabs/dragging/tab_drag_controller_interactive_uitest.cc",
+        "../browser/ui/views/tabs/dragging/tab_drag_controller_interactive_uitest.h",
         "../browser/ui/views/tabs/tab_hover_card_controller_interactive_uitest.cc",
         "../browser/ui/views/test/view_event_test_base.cc",
         "../browser/ui/views/test/view_event_test_base.h",
diff --git a/chrome/test/data/webui/chromeos/BUILD.gn b/chrome/test/data/webui/chromeos/BUILD.gn
index 5973adf..a0371d7 100644
--- a/chrome/test/data/webui/chromeos/BUILD.gn
+++ b/chrome/test/data/webui/chromeos/BUILD.gn
@@ -108,7 +108,6 @@
                   ]
   deps = [
     ":chai_assert",
-    ":fake_network_config_mojom",
     ":mock_controller.m",
     ":test_browser_proxy",
     ":test_util",
@@ -119,14 +118,6 @@
   externs_list = [ "//third_party/closure_compiler/externs/chai-3.5.js" ]
 }
 
-js_library("fake_network_config_mojom") {
-  deps = [
-    "//ash/webui/common/resources:assert",
-    "//ash/webui/common/resources:promise_resolver",
-    "//ash/webui/common/resources/network:onc_mojo",
-  ]
-}
-
 js_library("mock_controller.m") {
 }
 
diff --git a/chrome/test/data/webui/chromeos/boca_ui/client_delegate_impl_test.ts b/chrome/test/data/webui/chromeos/boca_ui/client_delegate_impl_test.ts
index 52e8c728..3bb2b88 100644
--- a/chrome/test/data/webui/chromeos/boca_ui/client_delegate_impl_test.ts
+++ b/chrome/test/data/webui/chromeos/boca_ui/client_delegate_impl_test.ts
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 import {ClientDelegateFactory, getNetworkInfoMojomToUI, getSessionConfigMojomToUI, getStudentActivityMojomToUI} from 'chrome-untrusted://boca-app/app/client_delegate.js';
-import {CaptionConfig, Config, Course, Identity, OnTaskConfig, PageHandlerRemote, RemoveStudentError, SessionResult, SubmitAccessCodeError, UpdateSessionError, Window} from 'chrome-untrusted://boca-app/mojom/boca.mojom-webui.js';
+import {CaptionConfig, Config, Course, Identity, OnTaskConfig, PageHandlerRemote, RemoveStudentError, SessionResult, SubmitAccessCodeError, UpdateSessionError, ViewStudentScreenError, Window} from 'chrome-untrusted://boca-app/mojom/boca.mojom-webui.js';
 import {Url} from 'chrome-untrusted://resources/mojo/url/mojom/url.mojom-webui.js';
 import {assertDeepEquals, assertTrue} from 'chrome-untrusted://webui-test/chai_assert.js';
 
@@ -228,6 +228,11 @@
       return Promise.resolve({error: SubmitAccessCodeError.kInvalid});
     }
   }
+  override viewStudentScreen(id: string):
+      Promise<{error: ViewStudentScreenError | null}> {
+    id;
+    return Promise.resolve({error: null});
+  }
 }
 
 suite('ClientDelegateTest', function() {
@@ -500,7 +505,8 @@
               activeTab: 'google',
               isCaptionEnabled: false,
               isHandRaised: false,
-              joinMethod: 0
+              joinMethod: 0,
+              viewScreenSessionCode: 'abcd'
             }
           },
           {
@@ -510,7 +516,8 @@
               activeTab: 'youtube',
               isCaptionEnabled: false,
               isHandRaised: false,
-              joinMethod: 1
+              joinMethod: 1,
+              viewScreenSessionCode: null
             }
           }
         ];
@@ -524,7 +531,8 @@
                   activeTab: 'google',
                   isCaptionEnabled: false,
                   isHandRaised: false,
-                  joinMethod: 0
+                  joinMethod: 0,
+                  viewScreenSessionCode: 'abcd'
                 }
               },
               {
@@ -534,7 +542,8 @@
                   activeTab: 'youtube',
                   isCaptionEnabled: false,
                   isHandRaised: false,
-                  joinMethod: 1
+                  joinMethod: 1,
+                  viewScreenSessionCode: undefined
                 }
               }
             ],
@@ -585,4 +594,13 @@
         ],
         result);
   });
+
+  test(
+      'client delegate should translate data for view student screen',
+      async () => {
+        const result =
+            await clientDelegateImpl.getInstance().viewStudentScreen('1');
+        assertTrue(result);
+      });
+
 });
diff --git a/chrome/test/data/webui/chromeos/cellular_setup/activation_code_page_test.ts b/chrome/test/data/webui/chromeos/cellular_setup/activation_code_page_test.ts
index 066056f..602b051 100644
--- a/chrome/test/data/webui/chromeos/cellular_setup/activation_code_page_test.ts
+++ b/chrome/test/data/webui/chromeos/cellular_setup/activation_code_page_test.ts
@@ -53,17 +53,17 @@
     MojoInterfaceProviderImpl.getInstance().setMojoServiceRemoteForTest(
         networkConfigRemote);
     networkConfigRemote.setDeviceStateForTest({
-      ipv4Address: undefined,
-      ipv6Address: undefined,
-      imei: undefined,
-      macAddress: undefined,
+      ipv4Address: null,
+      ipv6Address: null,
+      imei: null,
+      macAddress: null,
       scanning: false,
-      simLockStatus: undefined,
-      simInfos: undefined,
+      simLockStatus: null,
+      simInfos: null,
       inhibitReason: InhibitReason.kNotInhibited,
       simAbsent: false,
       managedNetworkAvailable: false,
-      serial: undefined,
+      serial: null,
       isCarrierLocked: true,
       isFlashing: false,
       type: NetworkType.kCellular,
@@ -763,17 +763,17 @@
       'check carrier lock warning not displayed for consumer devices',
       async function() {
         networkConfigRemote.setDeviceStateForTest({
-          ipv4Address: undefined,
-          ipv6Address: undefined,
-          imei: undefined,
-          macAddress: undefined,
+          ipv4Address: null,
+          ipv6Address: null,
+          imei: null,
+          macAddress: null,
           scanning: false,
-          simLockStatus: undefined,
-          simInfos: undefined,
+          simLockStatus: null,
+          simInfos: null,
           inhibitReason: InhibitReason.kNotInhibited,
           simAbsent: false,
           managedNetworkAvailable: false,
-          serial: undefined,
+          serial: null,
           isCarrierLocked: false,
           isFlashing: false,
           type: NetworkType.kCellular,
diff --git a/chrome/test/data/webui/chromeos/cellular_setup/cellular_setup_test.ts b/chrome/test/data/webui/chromeos/cellular_setup/cellular_setup_test.ts
index bc7a9b7e..27d5858 100644
--- a/chrome/test/data/webui/chromeos/cellular_setup/cellular_setup_test.ts
+++ b/chrome/test/data/webui/chromeos/cellular_setup/cellular_setup_test.ts
@@ -42,16 +42,16 @@
 
   function init() {
     networkConfigRemote.setDeviceStateForTest({
-      ipv4Address: undefined,
-      ipv6Address: undefined,
-      imei: undefined,
-      macAddress: undefined,
+      ipv4Address: null,
+      ipv6Address: null,
+      imei: null,
+      macAddress: null,
       scanning: false,
-      simLockStatus: undefined,
+      simLockStatus: null,
       inhibitReason: InhibitReason.kNotInhibited,
       simAbsent: false,
       managedNetworkAvailable: false,
-      serial: undefined,
+      serial: null,
       isCarrierLocked: false,
       isFlashing: false,
       type: NetworkType.kCellular,
diff --git a/chrome/test/data/webui/chromeos/cellular_setup/profile_discovery_list_page_test.ts b/chrome/test/data/webui/chromeos/cellular_setup/profile_discovery_list_page_test.ts
index b5b45406..358b5c9 100644
--- a/chrome/test/data/webui/chromeos/cellular_setup/profile_discovery_list_page_test.ts
+++ b/chrome/test/data/webui/chromeos/cellular_setup/profile_discovery_list_page_test.ts
@@ -28,17 +28,17 @@
 
   async function init(isCarrierLocked: boolean) {
     networkConfigRemote.setDeviceStateForTest({
-      ipv4Address: undefined,
-      ipv6Address: undefined,
-      imei: undefined,
-      macAddress: undefined,
+      ipv4Address: null,
+      ipv6Address: null,
+      imei: null,
+      macAddress: null,
       scanning: false,
-      simLockStatus: undefined,
-      simInfos: undefined,
+      simLockStatus: null,
+      simInfos: null,
       inhibitReason: InhibitReason.kNotInhibited,
       simAbsent: false,
       managedNetworkAvailable: false,
-      serial: undefined,
+      serial: null,
       isCarrierLocked: isCarrierLocked,
       isFlashing: false,
       type: NetworkType.kCellular,
diff --git a/chrome/test/data/webui/chromeos/fake_network_config_mojom.js b/chrome/test/data/webui/chromeos/fake_network_config_mojom.js
index 216da9b..8418e325 100644
--- a/chrome/test/data/webui/chromeos/fake_network_config_mojom.js
+++ b/chrome/test/data/webui/chromeos/fake_network_config_mojom.js
@@ -9,10 +9,27 @@
 import {assert, assertNotReached} from 'chrome://resources/ash/common/assert.js';
 import {OncMojo} from 'chrome://resources/ash/common/network/onc_mojo.js';
 import {PromiseResolver} from 'chrome://resources/ash/common/promise_resolver.js';
-import {AlwaysOnVpnMode, AlwaysOnVpnProperties, ApnProperties, ApnState, CellularSimState, ConfigProperties, CrosNetworkConfigInterface, CrosNetworkConfigObserverRemote, DeviceStateProperties, FilterType, GlobalPolicy, InhibitReason, ManagedProperties, NetworkCertificate, NetworkFilter, NetworkStateProperties, NO_LIMIT, StartConnectResult, TrafficCounter, UInt32Value, VpnProvider} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
+import {AlwaysOnVpnMode, ApnState, FilterType, InhibitReason, NO_LIMIT, StartConnectResult} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
 import {ConnectionStateType, DeviceStateType, NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {Time} from 'chrome://resources/mojo/mojo/public/mojom/base/time.mojom-webui.js';
 
+/** @typedef {*} AlwaysOnVpnProperties */
+/** @typedef {*} ApnProperties */
+/** @typedef {*} CellularSimState */
+/** @typedef {*} ConfigProperties */
+/** @typedef {*} ConfigProperties */
+/** @typedef {*} CrosNetworkConfigInterface */
+/** @typedef {*} CrosNetworkConfigObserverRemote */
+/** @typedef {*} DeviceStateProperties */
+/** @typedef {*} GlobalPolicy */
+/** @typedef {*} ManagedProperties */
+/** @typedef {*} NetworkCertificate */
+/** @typedef {*} NetworkFilter */
+/** @typedef {*} NetworkStateProperties */
+/** @typedef {*} TrafficCounter */
+/** @typedef {*} UInt32Value */
+/** @typedef {*} VpnProvider */
+
 // Default cellular pin, used when locking/unlocking cellular profiles.
 export const DEFAULT_CELLULAR_PIN = '1111';
 
@@ -186,8 +203,7 @@
   }
 
   /**
-   * @param {!Array<!NetworkStateProperties>}
-   *     networks
+   * @param {!Array<!NetworkStateProperties>} networks
    */
   addNetworksForTest(networks) {
     this.networkStates_ = this.networkStates_.concat(networks);
@@ -467,8 +483,7 @@
   // networkConfig methods
 
   /**
-   * @param {!CrosNetworkConfigObserverRemote}
-   *     observer
+   * @param {!CrosNetworkConfigObserverRemote} observer
    */
   addObserver(observer) {
     this.observers_.push(observer);
diff --git a/chrome/test/data/webui/chromeos/internet_detail_dialog_test.ts b/chrome/test/data/webui/chromeos/internet_detail_dialog_test.ts
index 68712e9..643942c 100644
--- a/chrome/test/data/webui/chromeos/internet_detail_dialog_test.ts
+++ b/chrome/test/data/webui/chromeos/internet_detail_dialog_test.ts
@@ -116,16 +116,18 @@
       cellularNetwork.typeProperties.cellular.iccid = testIccid;
       // Required for networkChooseMobile to be rendered.
       cellularNetwork.typeProperties.cellular.supportNetworkScan = true;
-      cellularNetwork.typeProperties.cellular.connectedApn = connectedApn;
-      cellularNetwork.typeProperties.cellular.customApnList = customApnList;
+      cellularNetwork.typeProperties.cellular.connectedApn =
+          connectedApn || null;
+      cellularNetwork.typeProperties.cellular.customApnList =
+          customApnList || null;
     }
     // Required for connectDisconnectButton to be rendered.
     cellularNetwork.connectionState = isPrimary ?
         ConnectionStateType.kConnected :
         ConnectionStateType.kNotConnected;
-    cellularNetwork.errorState = errorState;
+    cellularNetwork.errorState = errorState || null;
     if (portalState) {
-      cellularNetwork.portalState = portalState;
+      cellularNetwork.portalState = portalState || null;
     }
 
     mojoApi.setManagedPropertiesForTest(cellularNetwork);
@@ -150,16 +152,16 @@
       deviceState: deviceState,
       inhibitReason: inhibitReason ? inhibitReason :
                                      InhibitReason.kNotInhibited,
-      simInfos: simInfos ? simInfos : undefined,
-      ipv4Address: undefined,
-      ipv6Address: undefined,
-      imei: undefined,
-      macAddress: macAddress,
+      simInfos: simInfos || null,
+      ipv4Address: null,
+      ipv6Address: null,
+      imei: null,
+      macAddress: macAddress || null,
       scanning: false,
-      simLockStatus: undefined,
+      simLockStatus: null,
       simAbsent: false,
       managedNetworkAvailable: false,
-      serial: undefined,
+      serial: null,
       isCarrierLocked: false,
       isFlashing: false,
     });
@@ -169,14 +171,14 @@
       accessPointName: string, source: ApnSource, name?: string) {
     return {
       accessPointName: accessPointName,
-      id: undefined,
+      id: null,
       authentication: ApnAuthenticationType.kAutomatic,
-      language: undefined,
-      localizedName: undefined,
-      name: name,
-      password: undefined,
-      username: undefined,
-      attach: undefined,
+      language: null,
+      localizedName: null,
+      name: name || null,
+      password: null,
+      username: null,
+      attach: null,
       state: ApnState.kEnabled,
       ipType: ApnIpType.kAutomatic,
       apnTypes: [ApnType.kDefault],
diff --git a/chrome/test/data/webui/chromeos/network/apn_list_test.ts b/chrome/test/data/webui/chromeos/network/apn_list_test.ts
index 6b8c119..f76541e7 100644
--- a/chrome/test/data/webui/chromeos/network/apn_list_test.ts
+++ b/chrome/test/data/webui/chromeos/network/apn_list_test.ts
@@ -81,14 +81,14 @@
       id?: string, source: ApnSource = ApnSource.kUi): ApnProperties {
     return {
       accessPointName: accessPointName,
-      id: id,
+      id: id || null,
       authentication: ApnAuthenticationType.kAutomatic,
-      language: undefined,
-      localizedName: undefined,
-      name: name,
-      password: undefined,
-      username: undefined,
-      attach: undefined,
+      language: null,
+      localizedName: null,
+      name: name || null,
+      password: null,
+      username: null,
+      attach: null,
       state: state,
       ipType: ApnIpType.kAutomatic,
       apnTypes: apnTypes,
@@ -101,7 +101,7 @@
     return {
       activeValue: activeValue,
       policySource: PolicySource.kNone,
-      policyValue: undefined,
+      policyValue: null,
     };
   }
 
@@ -111,33 +111,33 @@
     return {
       activationState: ActivationStateType.kUnknown,
       simLocked: false,
-      allowRoaming: undefined,
-      allowTextMessages: undefined,
+      allowRoaming: null,
+      allowTextMessages: null,
       apnList: apnList,
-      autoConnect: undefined,
-      customApnList: customApnList,
-      eid: undefined,
-      esn: undefined,
-      family: undefined,
-      firmwareRevision: undefined,
-      foundNetworks: undefined,
-      hardwareRevision: undefined,
-      homeProvider: undefined,
-      iccid: undefined,
-      imei: undefined,
-      lastGoodApn: undefined,
-      connectedApn: connectedApn,
-      manufacturer: undefined,
-      mdn: undefined,
-      meid: undefined,
-      min: undefined,
-      modelId: undefined,
-      networkTechnology: undefined,
+      autoConnect: null,
+      customApnList: customApnList || null,
+      eid: null,
+      esn: null,
+      family: null,
+      firmwareRevision: null,
+      foundNetworks: null,
+      hardwareRevision: null,
+      homeProvider: null,
+      iccid: null,
+      imei: null,
+      lastGoodApn: null,
+      connectedApn: connectedApn || null,
+      manufacturer: null,
+      mdn: null,
+      meid: null,
+      min: null,
+      modelId: null,
+      networkTechnology: null,
       simLockType: '',
-      paymentPortal: undefined,
-      roamingState: undefined,
-      selectedApn: undefined,
-      servingOperator: undefined,
+      paymentPortal: null,
+      roamingState: null,
+      selectedApn: null,
+      servingOperator: null,
       signalStrength: 0,
       supportNetworkScan: false,
     };
@@ -736,9 +736,9 @@
                       id: 'id',
                       source: ApnSource.kModb,
                       state: ApnState.kEnabled,
-                      language: undefined,
-                      localizedName: undefined,
-                      attach: undefined,
+                      language: null,
+                      localizedName: null,
+                      attach: null,
                     };
                     let apnSelectionDialog = apnList.shadowRoot!.querySelector(
                         'apn-selection-dialog');
diff --git a/chrome/test/data/webui/chromeos/network/network_choose_mobile_test.ts b/chrome/test/data/webui/chromeos/network/network_choose_mobile_test.ts
index 55d4446..dad9168 100644
--- a/chrome/test/data/webui/chromeos/network/network_choose_mobile_test.ts
+++ b/chrome/test/data/webui/chromeos/network/network_choose_mobile_test.ts
@@ -85,7 +85,7 @@
       networkId: '1',
       technology: '',
       longName: 'network_name',
-      shortName: undefined
+      shortName: null
     }];
     chooseMobile.managedProperties = managedProperties;
     chooseMobile.deviceState = getDeviceState(/* scanning= */ false);
diff --git a/chrome/test/data/webui/chromeos/network/network_config_test.ts b/chrome/test/data/webui/chromeos/network/network_config_test.ts
index 8951288..414a283d 100644
--- a/chrome/test/data/webui/chromeos/network/network_config_test.ts
+++ b/chrome/test/data/webui/chromeos/network/network_config_test.ts
@@ -382,8 +382,8 @@
       assertTrue(!!properties.typeConfig.wifi);
       properties.typeConfig.wifi.ssid = ssid;
       properties.typeConfig.wifi.security = security;
-      properties.typeConfig.wifi.passphrase = password;
-      properties.typeConfig.wifi.eap = eapConfig;
+      properties.typeConfig.wifi.passphrase = password || null;
+      properties.typeConfig.wifi.eap = eapConfig || null;
       return properties;
     }
 
diff --git a/chrome/test/data/webui/chromeos/network/network_config_vpn_test.ts b/chrome/test/data/webui/chromeos/network/network_config_vpn_test.ts
index eb677a41..9a06e7b 100644
--- a/chrome/test/data/webui/chromeos/network/network_config_vpn_test.ts
+++ b/chrome/test/data/webui/chromeos/network/network_config_vpn_test.ts
@@ -11,8 +11,8 @@
 import {NetworkConfigSelectElement} from 'chrome://resources/ash/common/network/network_config_select.js';
 import {NetworkPasswordInputElement} from 'chrome://resources/ash/common/network/network_password_input.js';
 import {OncMojo} from 'chrome://resources/ash/common/network/onc_mojo.js';
-import {ManagedEAPProperties, ManagedIPConfigProperties, ManagedIPSecProperties, ManagedL2TPProperties, ManagedString, ManagedWireGuardProperties, NetworkCertificate, VpnType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
-import {NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
+import {ManagedIPConfigProperties, ManagedIPSecProperties, ManagedL2TPProperties, ManagedString, ManagedWireGuardProperties, NetworkCertificate, VpnType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
+import {NetworkType, PolicySource} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js';
 import {flushTasks} from 'chrome://webui-test/polymer_test_util.js';
@@ -340,13 +340,21 @@
           publicKey: 'KFhwdv4+jKpSXMW6xEUVtOe4Mo8l/xOvGmshmjiHx1Y=',
           endpoint: '192.168.66.66:32000',
           allowedIps: '0.0.0.0/0,::/0',
-          presharedKey: undefined,
+          presharedKey: null,
           persistentKeepaliveInterval: 0,
         }],
+        policySource: PolicySource.kNone,
+        policyValue: null,
       };
       wg1.typeProperties.vpn.wireguard = {
-        ipAddresses: {activeValue: ['10.10.0.1', 'fd00::1']},
+        ipAddresses: {
+          activeValue: ['10.10.0.1', 'fd00::1'],
+          policySource: PolicySource.kNone,
+          policyValue: null
+        },
         peers: peers,
+        privateKey: null,
+        publicKey: null,
       } as ManagedWireGuardProperties;
       const staticIpConfig = {
         nameServers: {activeValue: ['8.8.8.8', '8.8.4.4']}
@@ -391,7 +399,7 @@
             !!configToSet.typeConfig.vpn.wireguard.peers);
         const peer = configToSet.typeConfig.vpn.wireguard.peers[0];
         assertTrue(!!peer);
-        assertEquals(undefined, peer.presharedKey);
+        assertEquals(null, peer.presharedKey);
       });
     });
   });
@@ -535,8 +543,8 @@
       assertEquals(2, props.typeConfig.vpn.ipSec.ikeVersion);
       assertFalse(props.typeConfig.vpn.ipSec.saveCredentials);
       assertEquals(kTestPsk, props.typeConfig.vpn.ipSec.psk);
-      assertEquals('', props.typeConfig.vpn.ipSec.localIdentity);
-      assertEquals('', props.typeConfig.vpn.ipSec.remoteIdentity);
+      assertEquals(null, props.typeConfig.vpn.ipSec.localIdentity);
+      assertEquals(null, props.typeConfig.vpn.ipSec.remoteIdentity);
 
       networkConfig.set('vpnSaveCredentials_', true);
       props = networkConfig.getPropertiesToSetForTesting();
@@ -752,7 +760,6 @@
         serverCaPems: {activeValue: [kCaPem]},
       };
       ikev2.typeProperties.vpn.ipSec = ipSec as ManagedIPSecProperties;
-      ManagedEAPProperties
       networkConfig = createNetworkConfigWithProperties(mojoApi_, ikev2);
       initNetworkConfigWithCerts(
           /* hasServerCa= */ true, /* hasUserCert= */ false);
@@ -977,9 +984,9 @@
         assertTrue(!!props.typeConfig.vpn.ipSec);
         assertEquals('PSK', props.typeConfig.vpn.ipSec.authenticationType);
         assertEquals(1, props.typeConfig.vpn.ipSec.ikeVersion);
-        assertEquals(undefined, props.typeConfig.vpn.ipSec.eap);
-        assertEquals(undefined, props.typeConfig.vpn.ipSec.localIdentity);
-        assertEquals(undefined, props.typeConfig.vpn.ipSec.remoteIdentity);
+        assertEquals(null, props.typeConfig.vpn.ipSec.eap);
+        assertEquals(null, props.typeConfig.vpn.ipSec.localIdentity);
+        assertEquals(null, props.typeConfig.vpn.ipSec.remoteIdentity);
         assertTrue(!!props.typeConfig.vpn.l2tp);
         assertEquals(kTestUsername, props.typeConfig.vpn.l2tp.username);
         assertTrue(props.typeConfig.vpn.ipSec.saveCredentials);
@@ -1078,9 +1085,9 @@
         assertEquals('PKCS11Id', props.typeConfig.vpn.ipSec.clientCertType);
         assertEquals(
             kUserCertId, props.typeConfig.vpn.ipSec.clientCertPkcs11Id);
-        assertEquals(undefined, props.typeConfig.vpn.ipSec.eap);
-        assertEquals(undefined, props.typeConfig.vpn.ipSec.localIdentity);
-        assertEquals(undefined, props.typeConfig.vpn.ipSec.remoteIdentity);
+        assertEquals(null, props.typeConfig.vpn.ipSec.eap);
+        assertEquals(null, props.typeConfig.vpn.ipSec.localIdentity);
+        assertEquals(null, props.typeConfig.vpn.ipSec.remoteIdentity);
         assertTrue(!!props.typeConfig.vpn.l2tp);
         assertEquals(kTestUsername, props.typeConfig.vpn.l2tp.username);
         assertTrue(props.typeConfig.vpn.ipSec.saveCredentials);
diff --git a/chrome/test/data/webui/chromeos/network/network_nameservers_test.ts b/chrome/test/data/webui/chromeos/network/network_nameservers_test.ts
index 70bd94d..c6d24890 100644
--- a/chrome/test/data/webui/chromeos/network/network_nameservers_test.ts
+++ b/chrome/test/data/webui/chromeos/network/network_nameservers_test.ts
@@ -89,16 +89,16 @@
             NetworkType.kEthernet, 'f19a0128-0b37-490a-bfc9-d04031f27d2a',
             'name');
         managedProperties.staticIpConfig = {
-          gateway: undefined,
-          ipAddress: undefined,
+          gateway: null,
+          ipAddress: null,
           nameServers: {
             activeValue: ['8.8.8.2', '8.8.8.8', '0.0.0.0', '0.0.0.0'],
             policySource: PolicySource.kNone,
-            policyValue: undefined,
+            policyValue: null,
           },
-          routingPrefix: undefined,
+          routingPrefix: null,
           type: IPConfigType.kIPv4,
-          webProxyAutoDiscoveryUrl: undefined,
+          webProxyAutoDiscoveryUrl: null,
         };
         managedProperties.ipAddressConfigType.activeValue = 'DHCP';
         managedProperties.nameServersConfigType.activeValue = 'Static';
@@ -111,7 +111,7 @@
         assertTrue(!!customNameServerInput);
         assertEquals(ipAddress, customNameServerInput.value);
 
-        managedProperties.staticIpConfig.nameServers!.activeValue =
+        managedProperties.staticIpConfig!.nameServers!.activeValue =
             ['0.0.0.2', '8.8.8.8', '0.0.0.0', '0.0.0.0'];
         flush();
 
diff --git a/chrome/test/data/webui/chromeos/network/network_siminfo_test.ts b/chrome/test/data/webui/chromeos/network/network_siminfo_test.ts
index 3a17c689..ba91b99 100644
--- a/chrome/test/data/webui/chromeos/network/network_siminfo_test.ts
+++ b/chrome/test/data/webui/chromeos/network/network_siminfo_test.ts
@@ -59,8 +59,8 @@
       type: NetworkType.kCellular,
       deviceState: DeviceStateType.kEnabled,
       inhibitReason: InhibitReason.kNotInhibited,
-      ipv4Address: undefined,
-      ipv6Address: undefined,
+      ipv4Address: null,
+      ipv6Address: null,
       imei: '',
       macAddress: '',
       scanning: false,
diff --git a/chrome/test/data/webui/chromeos/network_health/fake_network_diagnostics_routines.ts b/chrome/test/data/webui/chromeos/network_health/fake_network_diagnostics_routines.ts
index bab3a1c8..365f72bc 100644
--- a/chrome/test/data/webui/chromeos/network_health/fake_network_diagnostics_routines.ts
+++ b/chrome/test/data/webui/chromeos/network_health/fake_network_diagnostics_routines.ts
@@ -132,9 +132,10 @@
   /**
    * NOT IMPLEMENTED: getAllResult API is not currently used in the UI.
    */
-  getAllResults(): Promise<{results: Map<RoutineType, RoutineResult>}> {
+  getAllResults():
+      Promise<{results: Partial<Record<RoutineType, RoutineResult>>}> {
     return Promise.resolve({
-      results: new Map(),
+      results: {},
     });
   }
 }
diff --git a/chrome/test/data/webui/chromeos/network_health/network_health_test_utils.ts b/chrome/test/data/webui/chromeos/network_health/network_health_test_utils.ts
index 1592f54..57e3e49 100644
--- a/chrome/test/data/webui/chromeos/network_health/network_health_test_utils.ts
+++ b/chrome/test/data/webui/chromeos/network_health/network_health_test_utils.ts
@@ -39,6 +39,6 @@
     timestamp: {
       internalValue: BigInt(0),
     },
-    resultValue: undefined,
+    resultValue: null,
   };
 }
diff --git a/chrome/test/data/webui/chromeos/settings/internet_page/apn_detail_dialog_test.ts b/chrome/test/data/webui/chromeos/settings/internet_page/apn_detail_dialog_test.ts
index 3e46279..fc58bda 100644
--- a/chrome/test/data/webui/chromeos/settings/internet_page/apn_detail_dialog_test.ts
+++ b/chrome/test/data/webui/chromeos/settings/internet_page/apn_detail_dialog_test.ts
@@ -23,11 +23,11 @@
   ipType: ApnIpType.kAutomatic,
   apnTypes: [ApnType.kDefault],
   state: ApnState.kEnabled,
-  id: undefined,
-  language: undefined,
-  localizedName: undefined,
-  name: undefined,
-  attach: undefined,
+  id: null,
+  language: null,
+  localizedName: null,
+  name: null,
+  attach: null,
   source: ApnSource.kUi,
 };
 
diff --git a/chrome/test/data/webui/chromeos/settings/internet_page/apn_subpage_test.ts b/chrome/test/data/webui/chromeos/settings/internet_page/apn_subpage_test.ts
index a599cb9..8e16eaa 100644
--- a/chrome/test/data/webui/chromeos/settings/internet_page/apn_subpage_test.ts
+++ b/chrome/test/data/webui/chromeos/settings/internet_page/apn_subpage_test.ts
@@ -23,19 +23,19 @@
 
   function getDefaultDeviceStateProps(): DeviceStateProperties {
     return {
-      ipv4Address: undefined,
-      ipv6Address: undefined,
-      imei: undefined,
-      macAddress: undefined,
+      ipv4Address: null,
+      ipv6Address: null,
+      imei: null,
+      macAddress: null,
       scanning: false,
-      simLockStatus: undefined,
-      simInfos: undefined,
+      simLockStatus: null,
+      simInfos: null,
       inhibitReason: InhibitReason.kNotInhibited,
       simAbsent: false,
       deviceState: DeviceStateType.kUninitialized,
       type: NetworkType.kCellular,
       managedNetworkAvailable: false,
-      serial: undefined,
+      serial: null,
       isCarrierLocked: false,
       isFlashing: false,
     };
diff --git a/chrome/test/data/webui/chromeos/settings/internet_page/cellular_roaming_toggle_button_test.ts b/chrome/test/data/webui/chromeos/settings/internet_page/cellular_roaming_toggle_button_test.ts
index 13caa90..cbcf1ce 100644
--- a/chrome/test/data/webui/chromeos/settings/internet_page/cellular_roaming_toggle_button_test.ts
+++ b/chrome/test/data/webui/chromeos/settings/internet_page/cellular_roaming_toggle_button_test.ts
@@ -9,6 +9,7 @@
 import {CrToggleElement} from 'chrome://os-settings/os_settings.js';
 import {MojoInterfaceProviderImpl} from 'chrome://resources/ash/common/network/mojo_interface_provider.js';
 import {OncMojo} from 'chrome://resources/ash/common/network/onc_mojo.js';
+import {assertNotReached} from 'chrome://resources/js/assert.js';
 import {ManagedBoolean} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
 import {NetworkType, PolicySource} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js';
@@ -342,17 +343,8 @@
                   window.CrPolicyStrings.controlledSettingPolicy,
                   getRoamingTogglePolicyIndicatorText());
               break;
-            case PolicySource.kUserPolicyRecommended:
-            case PolicySource.kDevicePolicyRecommended:
-              assertEquals(
-                  (enforcementCase.managedPropertiesActiveValue ===
-                   enforcementCase.managedPropertiesPolicyValue) ?
-                      window.CrPolicyStrings
-                          .controlledSettingRecommendedMatches :
-                      window.CrPolicyStrings
-                          .controlledSettingRecommendedDiffers,
-                  getRoamingTogglePolicyIndicatorText());
-              break;
+            default:
+              assertNotReached();
           }
           continue;
         }
diff --git a/chrome/test/data/webui/chromeos/settings/internet_page/internet_detail_menu_test.ts b/chrome/test/data/webui/chromeos/settings/internet_page/internet_detail_menu_test.ts
index 8efdd20..555643f 100644
--- a/chrome/test/data/webui/chromeos/settings/internet_page/internet_detail_menu_test.ts
+++ b/chrome/test/data/webui/chromeos/settings/internet_page/internet_detail_menu_test.ts
@@ -252,12 +252,12 @@
       type: NetworkType.kCellular,
       deviceState: DeviceStateType.kEnabled,
       inhibitReason: InhibitReason.kConnectingToProfile,
-      ipv4Address: undefined,
-      ipv6Address: undefined,
+      ipv4Address: null,
+      ipv6Address: null,
       imei: '',
       macAddress: '',
       scanning: false,
-      simLockStatus: undefined,
+      simLockStatus: null,
       simInfos: [],
       simAbsent: false,
       managedNetworkAvailable: false,
diff --git a/chrome/test/data/webui/chromeos/settings/internet_page/internet_detail_subpage_test.ts b/chrome/test/data/webui/chromeos/settings/internet_page/internet_detail_subpage_test.ts
index 1ec92fe..4fd1c5d 100644
--- a/chrome/test/data/webui/chromeos/settings/internet_page/internet_detail_subpage_test.ts
+++ b/chrome/test/data/webui/chromeos/settings/internet_page/internet_detail_subpage_test.ts
@@ -140,19 +140,19 @@
 
   function getDefaultDeviceStateProps(): DeviceStateProperties {
     return {
-      ipv4Address: undefined,
-      ipv6Address: undefined,
-      imei: undefined,
-      macAddress: undefined,
+      ipv4Address: null,
+      ipv6Address: null,
+      imei: null,
+      macAddress: null,
       scanning: false,
-      simLockStatus: undefined,
-      simInfos: undefined,
+      simLockStatus: null,
+      simInfos: null,
       inhibitReason: InhibitReason.kNotInhibited,
       simAbsent: false,
       deviceState: DeviceStateType.kUninitialized,
       type: NetworkType.kCellular,
       managedNetworkAvailable: false,
-      serial: undefined,
+      serial: null,
       isCarrierLocked: false,
       isFlashing: false,
     };
@@ -519,9 +519,9 @@
           policySource: PolicySource.kUserPolicyEnforced,
           policyValue: '',
         },
-        manual: undefined,
-        excludeDomains: undefined,
-        pac: undefined,
+        manual: null,
+        excludeDomains: null,
+        pac: null,
       };
       mojoApi.setManagedPropertiesForTest(wifiNetwork);
 
@@ -545,9 +545,9 @@
           policySource: PolicySource.kDevicePolicyEnforced,
           policyValue: '',
         },
-        manual: undefined,
-        excludeDomains: undefined,
-        pac: undefined,
+        manual: null,
+        excludeDomains: null,
+        pac: null,
       };
       mojoApi.setManagedPropertiesForTest(wifiNetwork);
 
@@ -832,43 +832,43 @@
 
     function getDefaultManagedOpenVpnProps(): ManagedOpenVPNProperties {
       return {
-        auth: undefined,
-        authRetry: undefined,
-        authNoCache: undefined,
-        cipher: undefined,
-        clientCertPkcs11Id: undefined,
-        clientCertPattern: undefined,
-        clientCertProvisioningProfileId: undefined,
-        clientCertRef: undefined,
-        clientCertType: undefined,
-        compressionAlgorithm: undefined,
-        extraHosts: undefined,
-        ignoreDefaultRoute: undefined,
-        keyDirection: undefined,
-        nsCertType: undefined,
-        password: undefined,
-        port: undefined,
-        proto: undefined,
-        pushPeerInfo: undefined,
-        remoteCertEku: undefined,
-        remoteCertKu: undefined,
-        remoteCertTls: undefined,
-        renegSec: undefined,
-        saveCredentials: undefined,
-        serverCaPems: undefined,
-        serverCaRefs: undefined,
-        serverCertRef: undefined,
-        serverPollTimeout: undefined,
-        shaper: undefined,
-        staticChallenge: undefined,
-        tlsAuthContents: undefined,
-        tlsRemote: undefined,
-        tlsVersionMin: undefined,
-        userAuthenticationType: undefined,
-        username: undefined,
-        verb: undefined,
-        verifyHash: undefined,
-        verifyX509: undefined,
+        auth: null,
+        authRetry: null,
+        authNoCache: null,
+        cipher: null,
+        clientCertPkcs11Id: null,
+        clientCertPattern: null,
+        clientCertProvisioningProfileId: null,
+        clientCertRef: null,
+        clientCertType: null,
+        compressionAlgorithm: null,
+        extraHosts: null,
+        ignoreDefaultRoute: null,
+        keyDirection: null,
+        nsCertType: null,
+        password: null,
+        port: null,
+        proto: null,
+        pushPeerInfo: null,
+        remoteCertEku: null,
+        remoteCertKu: null,
+        remoteCertTls: null,
+        renegSec: null,
+        saveCredentials: null,
+        serverCaPems: null,
+        serverCaRefs: null,
+        serverCertRef: null,
+        serverPollTimeout: null,
+        shaper: null,
+        staticChallenge: null,
+        tlsAuthContents: null,
+        tlsRemote: null,
+        tlsVersionMin: null,
+        userAuthenticationType: null,
+        username: null,
+        verb: null,
+        verifyHash: null,
+        verifyX509: null,
       };
     }
 
@@ -880,7 +880,7 @@
       const defaultManagedStringProps = {
         activeValue: '',
         policySource: PolicySource.kNone,
-        policyValue: undefined,
+        policyValue: null,
       };
       const vpn1 = OncMojo.getDefaultManagedProperties(
           NetworkType.kVPN, 'vpn1_guid', 'vpn1');
@@ -941,9 +941,9 @@
           policySource: PolicySource.kNone,
           policyValue: [],
         },
-        ipAddresses: undefined,
-        privateKey: undefined,
-        publicKey: undefined,
+        ipAddresses: null,
+        privateKey: null,
+        publicKey: null,
       };
       wg1.staticIpConfig = {
         ipAddress: {
@@ -951,11 +951,11 @@
           policySource: PolicySource.kNone,
           policyValue: '',
         },
-        gateway: undefined,
-        nameServers: undefined,
-        routingPrefix: undefined,
+        gateway: null,
+        nameServers: null,
+        routingPrefix: null,
         type: IPConfigType.kIPv4,
-        webProxyAutoDiscoveryUrl: undefined,
+        webProxyAutoDiscoveryUrl: null,
       };
       initManagedVpn(wg1);
     }
@@ -1156,7 +1156,7 @@
           cellularNetwork.typeProperties.cellular!.paymentPortal = {
             url: 'url',
             method: '',
-            postData: undefined,
+            postData: null,
           };
           mojoApi.setManagedPropertiesForTest(cellularNetwork);
 
@@ -1814,12 +1814,12 @@
           accessPointName: '',
           id: '',
           authentication: ApnAuthenticationType.kAutomatic,
-          language: undefined,
-          localizedName: undefined,
-          name: undefined,
-          password: undefined,
-          username: undefined,
-          attach: undefined,
+          language: null,
+          localizedName: null,
+          name: null,
+          password: null,
+          username: null,
+          attach: null,
           state: ApnState.kEnabled,
           ipType: ApnIpType.kAutomatic,
           apnTypes: [],
@@ -1897,12 +1897,12 @@
               accessPointName: '',
               id: '',
               authentication: ApnAuthenticationType.kAutomatic,
-              language: undefined,
-              localizedName: undefined,
-              name: undefined,
-              password: undefined,
-              username: undefined,
-              attach: undefined,
+              language: null,
+              localizedName: null,
+              name: null,
+              password: null,
+              username: null,
+              attach: null,
               state: ApnState.kEnabled,
               ipType: ApnIpType.kAutomatic,
               apnTypes: [],
@@ -2313,10 +2313,10 @@
         connectable: false,
         connectRequested: false,
         connectionState: ConnectionStateType.kOnline,
-        errorState: undefined,
+        errorState: null,
         name: '',
         portalState: PortalState.kUnknown,
-        portalProbeUrl: undefined,
+        portalProbeUrl: null,
         priority: 0,
         proxyMode: ProxyMode.kDirect,
         prohibitedByPolicy: false,
diff --git a/chrome/test/data/webui/chromeos/settings/internet_page/internet_subpage_test.ts b/chrome/test/data/webui/chromeos/settings/internet_page/internet_subpage_test.ts
index 097c7cd..48ed92c 100644
--- a/chrome/test/data/webui/chromeos/settings/internet_page/internet_subpage_test.ts
+++ b/chrome/test/data/webui/chromeos/settings/internet_page/internet_subpage_test.ts
@@ -64,16 +64,16 @@
       type,
       deviceState,
       inhibitReason: inhibitReason || InhibitReason.MIN_VALUE,
-      simInfos: simInfos || undefined,
-      ipv4Address: undefined,
-      ipv6Address: undefined,
-      imei: undefined,
-      macAddress: undefined,
+      simInfos: simInfos || null,
+      ipv4Address: null,
+      ipv6Address: null,
+      imei: null,
+      macAddress: null,
       scanning: false,
-      simLockStatus: undefined,
+      simLockStatus: null,
       simAbsent: false,
       managedNetworkAvailable: false,
-      serial: undefined,
+      serial: null,
       isCarrierLocked: false,
       isFlashing: false,
     };
@@ -418,8 +418,8 @@
           typeState: typeStateDefaultProps,
           connectable: true,
           connectRequested: false,
-          errorState: undefined,
-          portalProbeUrl: undefined,
+          errorState: null,
+          portalProbeUrl: null,
           priority: 0,
           prohibitedByPolicy: false,
           portalState: PortalState.kUnknown,
@@ -756,16 +756,16 @@
             type: NetworkType.kTether,
             deviceState: DeviceStateType.kEnabled,
             scanning: false,
-            ipv4Address: undefined,
-            ipv6Address: undefined,
-            imei: undefined,
-            macAddress: undefined,
-            simLockStatus: undefined,
-            simInfos: undefined,
+            ipv4Address: null,
+            ipv6Address: null,
+            imei: null,
+            macAddress: null,
+            simLockStatus: null,
+            simInfos: null,
             inhibitReason: InhibitReason.kNotInhibited,
             simAbsent: false,
             managedNetworkAvailable: false,
-            serial: undefined,
+            serial: null,
             isCarrierLocked: false,
             isFlashing: false,
           });
@@ -806,16 +806,16 @@
           type: NetworkType.kTether,
           deviceState: DeviceStateType.kEnabled,
           scanning: false,
-          ipv4Address: undefined,
-          ipv6Address: undefined,
-          imei: undefined,
-          macAddress: undefined,
-          simLockStatus: undefined,
-          simInfos: undefined,
+          ipv4Address: null,
+          ipv6Address: null,
+          imei: null,
+          macAddress: null,
+          simLockStatus: null,
+          simInfos: null,
           inhibitReason: InhibitReason.kNotInhibited,
           simAbsent: false,
           managedNetworkAvailable: false,
-          serial: undefined,
+          serial: null,
           isCarrierLocked: false,
           isFlashing: false,
         });
@@ -845,16 +845,16 @@
             type: NetworkType.kTether,
             deviceState: DeviceStateType.kEnabled,
             scanning: false,
-            ipv4Address: undefined,
-            ipv6Address: undefined,
-            imei: undefined,
-            macAddress: undefined,
-            simLockStatus: undefined,
-            simInfos: undefined,
+            ipv4Address: null,
+            ipv6Address: null,
+            imei: null,
+            macAddress: null,
+            simLockStatus: null,
+            simInfos: null,
             inhibitReason: InhibitReason.kNotInhibited,
             simAbsent: false,
             managedNetworkAvailable: false,
-            serial: undefined,
+            serial: null,
             isCarrierLocked: false,
             isFlashing: false,
           });
diff --git a/chrome/test/data/webui/chromeos/settings/internet_page/network_proxy_section_test.ts b/chrome/test/data/webui/chromeos/settings/internet_page/network_proxy_section_test.ts
index 3571ab86..be0da82 100644
--- a/chrome/test/data/webui/chromeos/settings/internet_page/network_proxy_section_test.ts
+++ b/chrome/test/data/webui/chromeos/settings/internet_page/network_proxy_section_test.ts
@@ -21,25 +21,25 @@
       source: OncSource.MIN_VALUE,
       connectable: false,
       portalState: PortalState.MIN_VALUE,
-      errorState: undefined,
+      errorState: null,
       guid: '',
       ipAddressConfigType: {
         activeValue: '',
         policySource: PolicySource.MIN_VALUE,
-        policyValue: undefined,
+        policyValue: null,
       },
-      ipConfigs: undefined,
-      metered: undefined,
-      name: undefined,
+      ipConfigs: null,
+      metered: null,
+      name: null,
       nameServersConfigType: {
         activeValue: '',
         policySource: PolicySource.MIN_VALUE,
-        policyValue: undefined,
+        policyValue: null,
       },
-      priority: undefined,
-      proxySettings: undefined,
-      staticIpConfig: undefined,
-      savedIpConfig: undefined,
+      priority: null,
+      proxySettings: null,
+      staticIpConfig: null,
+      savedIpConfig: null,
       type: NetworkType.MIN_VALUE,
       typeProperties: {
         cellular: undefined,
@@ -49,8 +49,8 @@
         wifi: undefined,
       },
       trafficCounterProperties: {
-        lastResetTime: undefined,
-        friendlyDate: undefined,
+        lastResetTime: null,
+        friendlyDate: null,
         autoReset: false,
         userSpecifiedResetDay: 0,
       },
@@ -138,11 +138,11 @@
       type: {
         activeValue: 'Direct',
         policySource: PolicySource.kActiveExtension,
-        policyValue: undefined,
+        policyValue: null,
       },
-      manual: undefined,
-      excludeDomains: undefined,
-      pac: undefined,
+      manual: null,
+      excludeDomains: null,
+      pac: null,
     };
     proxySection.managedProperties = {
       ...props,
diff --git a/chrome/test/data/webui/chromeos/settings/os_a11y_page/cursor_and_touchpad_page_test.ts b/chrome/test/data/webui/chromeos/settings/os_a11y_page/cursor_and_touchpad_page_test.ts
index 83659f29..d4ab56e7 100644
--- a/chrome/test/data/webui/chromeos/settings/os_a11y_page/cursor_and_touchpad_page_test.ts
+++ b/chrome/test/data/webui/chromeos/settings/os_a11y_page/cursor_and_touchpad_page_test.ts
@@ -17,7 +17,7 @@
 import {TestDevicePageBrowserProxy} from '../device_page/test_device_page_browser_proxy.js';
 import {clearBody} from '../utils.js';
 
-const DEFAULT_BLACK_CURSOR_COLOR = 0;
+const DEFAULT_BLACK_CURSOR_COLOR = -0x1000000;
 const RED_CURSOR_COLOR = 0xd93025;
 
 /**
@@ -118,22 +118,18 @@
         cursorColorDropdown.shadowRoot!.querySelector('select');
     assert(cursorColorSelectElement);
     assertEquals(
-        'SETTINGS_DROPDOWN_NOT_FOUND_ITEM', cursorColorSelectElement.value);
+        String(DEFAULT_BLACK_CURSOR_COLOR), cursorColorSelectElement.value);
 
     // Turn cursor color to red, and verify pref is also red.
     cursorColorSelectElement.value = String(RED_CURSOR_COLOR);
     cursorColorSelectElement.dispatchEvent(new CustomEvent('change'));
     const cursorColorPref = page.getPref('settings.a11y.cursor_color');
-    const cursorColorEnabledPref =
-        page.getPref('settings.a11y.cursor_color_enabled');
     assertEquals(RED_CURSOR_COLOR, cursorColorPref.value);
-    assertTrue(cursorColorEnabledPref.value);
 
     // Turn cursor color back to default, and verify pref is also default.
     cursorColorSelectElement.value = String(DEFAULT_BLACK_CURSOR_COLOR);
     cursorColorSelectElement.dispatchEvent(new CustomEvent('change'));
     assertEquals(DEFAULT_BLACK_CURSOR_COLOR, cursorColorPref.value);
-    assertFalse(cursorColorEnabledPref.value);
   });
 
   // Only run this test when input device setting split feature flag is
diff --git a/chrome/test/data/webui/chromeos/settings/os_settings_menu/os_settings_menu_test.ts b/chrome/test/data/webui/chromeos/settings/os_settings_menu/os_settings_menu_test.ts
index e928f25b..4720303 100644
--- a/chrome/test/data/webui/chromeos/settings/os_settings_menu/os_settings_menu_test.ts
+++ b/chrome/test/data/webui/chromeos/settings/os_settings_menu/os_settings_menu_test.ts
@@ -810,19 +810,19 @@
 
     function getCellularDeviceStateProps(): OncMojo.DeviceStateProperties {
       return {
-        ipv4Address: undefined,
-        ipv6Address: undefined,
-        imei: undefined,
-        macAddress: undefined,
+        ipv4Address: null,
+        ipv6Address: null,
+        imei: null,
+        macAddress: null,
         scanning: false,
-        simLockStatus: undefined,
-        simInfos: undefined,
+        simLockStatus: null,
+        simInfos: null,
         inhibitReason: InhibitReason.kNotInhibited,
         simAbsent: false,
         deviceState: DeviceStateType.kDisabled,
         type: NetworkType.kCellular,
         managedNetworkAvailable: false,
-        serial: undefined,
+        serial: null,
         isCarrierLocked: false,
         isFlashing: false,
       };
diff --git a/chrome/test/data/webui/settings/sync_account_control_test.ts b/chrome/test/data/webui/settings/sync_account_control_test.ts
index e5750cb..1ce4298 100644
--- a/chrome/test/data/webui/settings/sync_account_control_test.ts
+++ b/chrome/test/data/webui/settings/sync_account_control_test.ts
@@ -344,102 +344,139 @@
         Router.getInstance().getRoutes().SIGN_OUT);
   });
 
-  test('signed in, has error', function() {
-    testElement.syncStatus = {
-      firstSetupInProgress: false,
-      signedInState: SignedInState.SYNCING,
-      signedInUsername: 'bar@bar.com',
-      hasError: true,
-      hasUnrecoverableError: false,
-      statusAction: StatusAction.CONFIRM_SYNC_SETTINGS,
-      disabled: false,
-    };
-    flush();
-    const userInfo = testElement.shadowRoot!.querySelector('#user-info')!;
 
-    assertTrue(
-        testElement.shadowRoot!
-            .querySelector<HTMLElement>(
-                '#sync-icon-container')!.classList.contains('sync-problem'));
-    assertTrue(!!testElement.shadowRoot!.querySelector(
-        '[icon="settings:sync-problem"]'));
-    let displayedText =
-        userInfo.querySelector<HTMLElement>('div:not([hidden])')!.textContent!;
-    assertFalse(displayedText.includes('barName'));
-    assertFalse(displayedText.includes('fooName'));
-    assertTrue(displayedText.includes('Sync isn\'t working'));
-    // The sync error button is shown to resolve the error.
-    assertTrue(isChildVisible(testElement, '#sync-error-button'));
+  test(
+      'signed in, has error with kImprovedSettingsUIOnDesktopEnabled enabled',
+      function() {
+        loadTimeData.overrideValues(
+            {isImprovedSettingsUIOnDesktopEnabled: true});
 
-    testElement.syncStatus = {
-      firstSetupInProgress: false,
-      signedInState: SignedInState.SYNCING,
-      signedInUsername: 'bar@bar.com',
-      statusAction: StatusAction.NO_ACTION,
-      hasError: false,
-      hasUnrecoverableError: false,
-      disabled: true,
-    };
+        testElement.syncStatus = {
+          firstSetupInProgress: false,
+          signedInState: SignedInState.SYNCING,
+          hasError: true,
+          hasUnrecoverableError: false,
+          statusAction: StatusAction.CONFIRM_SYNC_SETTINGS,
+          statusText: 'error text',
+          disabled: false,
+        };
+        flush();
+        const userInfo = testElement.shadowRoot!.querySelector('#user-info')!;
 
-    assertTrue(
-        testElement.shadowRoot!
-            .querySelector<HTMLElement>(
-                '#sync-icon-container')!.classList.contains('sync-disabled'));
-    assertTrue(!!testElement.shadowRoot!.querySelector('[icon=\'cr:sync\']'));
-    displayedText =
-        userInfo.querySelector<HTMLElement>('div:not([hidden])')!.textContent!;
-    assertFalse(displayedText.includes('barName'));
-    assertFalse(displayedText.includes('fooName'));
-    assertTrue(displayedText.includes('Sync disabled'));
-    assertFalse(isChildVisible(testElement, '#sync-error-button'));
+        assertTrue(testElement.shadowRoot!
+                       .querySelector<HTMLElement>('#sync-icon-container')!
+                       .classList.contains('sync-problem'));
+        assertTrue(!!testElement.shadowRoot!.querySelector(
+            '[icon="settings:sync-problem"]'));
+        const displayedText =
+            userInfo.querySelector<HTMLElement>(
+                        'div:not([hidden])')!.textContent!;
+        assertTrue(displayedText.includes('fooName'));
+        assertTrue(isChildVisible(testElement, '#sync-error-button'));
+        assertTrue(isChildVisible(testElement, '#turn-off'));
+      });
 
-    testElement.syncStatus = {
-      firstSetupInProgress: false,
-      signedInState: SignedInState.SYNCING,
-      signedInUsername: 'bar@bar.com',
-      statusAction: StatusAction.REAUTHENTICATE,
-      hasError: true,
-      hasUnrecoverableError: true,
-      disabled: false,
-    };
-    assertTrue(
-        testElement.shadowRoot!
-            .querySelector<HTMLElement>(
-                '#sync-icon-container')!.classList.contains('sync-problem'));
-    assertTrue(!!testElement.shadowRoot!.querySelector(
-        '[icon="settings:sync-problem"]'));
-    displayedText =
-        userInfo.querySelector<HTMLElement>('div:not([hidden])')!.textContent!;
-    assertFalse(displayedText.includes('barName'));
-    assertFalse(displayedText.includes('fooName'));
-    assertTrue(displayedText.includes('Sync isn\'t working'));
+  test(
+      'signed in, has error with kImprovedSettingsUIOnDesktopEnabled disabled',
+      function() {
+        loadTimeData.overrideValues(
+            {isImprovedSettingsUIOnDesktopEnabled: false});
+        testElement.syncStatus = {
+          firstSetupInProgress: false,
+          signedInState: SignedInState.SYNCING,
+          signedInUsername: 'bar@bar.com',
+          hasError: true,
+          hasUnrecoverableError: false,
+          statusAction: StatusAction.CONFIRM_SYNC_SETTINGS,
+          disabled: false,
+        };
+        flush();
+        const userInfo = testElement.shadowRoot!.querySelector('#user-info')!;
 
-    testElement.syncStatus = {
-      firstSetupInProgress: false,
-      signedInState: SignedInState.SYNCING,
-      signedInUsername: 'bar@bar.com',
-      statusAction: StatusAction.RETRIEVE_TRUSTED_VAULT_KEYS,
-      hasError: true,
-      hasPasswordsOnlyError: true,
-      hasUnrecoverableError: false,
-      disabled: false,
-    };
-    assertTrue(
-        testElement.shadowRoot!
-            .querySelector<HTMLElement>(
-                '#sync-icon-container')!.classList.contains('sync-problem'));
-    assertTrue(!!testElement.shadowRoot!.querySelector(
-        '[icon="settings:sync-problem"]'));
-    displayedText =
-        userInfo.querySelector<HTMLElement>('div:not([hidden])')!.textContent!;
-    assertFalse(displayedText.includes('barName'));
-    assertFalse(displayedText.includes('fooName'));
-    assertFalse(displayedText.includes('Sync isn\'t working'));
-    assertTrue(displayedText.includes('Password sync isn\'t working'));
-    // The sync error button is shown to resolve the error.
-    assertTrue(isChildVisible(testElement, '#sync-error-button'));
-    assertTrue(isChildVisible(testElement, '#turn-off'));
-  });
+        assertTrue(testElement.shadowRoot!
+                       .querySelector<HTMLElement>('#sync-icon-container')!
+                       .classList.contains('sync-problem'));
+        assertTrue(!!testElement.shadowRoot!.querySelector(
+            '[icon="settings:sync-problem"]'));
+        let displayedText =
+            userInfo.querySelector<HTMLElement>(
+                        'div:not([hidden])')!.textContent!;
+        assertFalse(displayedText.includes('barName'));
+        assertFalse(displayedText.includes('fooName'));
+        assertTrue(displayedText.includes('Sync isn\'t working'));
+        // The sync error button is shown to resolve the error.
+        assertTrue(isChildVisible(testElement, '#sync-error-button'));
+
+        testElement.syncStatus = {
+          firstSetupInProgress: false,
+          signedInState: SignedInState.SYNCING,
+          signedInUsername: 'bar@bar.com',
+          statusAction: StatusAction.NO_ACTION,
+          hasError: false,
+          hasUnrecoverableError: false,
+          disabled: true,
+        };
+
+        assertTrue(testElement.shadowRoot!
+                       .querySelector<HTMLElement>('#sync-icon-container')!
+                       .classList.contains('sync-disabled'));
+        assertTrue(
+            !!testElement.shadowRoot!.querySelector('[icon=\'cr:sync\']'));
+        displayedText =
+            userInfo.querySelector<HTMLElement>(
+                        'div:not([hidden])')!.textContent!;
+        assertFalse(displayedText.includes('barName'));
+        assertFalse(displayedText.includes('fooName'));
+        assertTrue(displayedText.includes('Sync disabled'));
+        assertFalse(isChildVisible(testElement, '#sync-error-button'));
+
+        testElement.syncStatus = {
+          firstSetupInProgress: false,
+          signedInState: SignedInState.SYNCING,
+          signedInUsername: 'bar@bar.com',
+          statusAction: StatusAction.REAUTHENTICATE,
+          hasError: true,
+          hasUnrecoverableError: true,
+          disabled: false,
+        };
+        assertTrue(testElement.shadowRoot!
+                       .querySelector<HTMLElement>('#sync-icon-container')!
+                       .classList.contains('sync-problem'));
+        assertTrue(!!testElement.shadowRoot!.querySelector(
+            '[icon="settings:sync-problem"]'));
+        displayedText =
+            userInfo.querySelector<HTMLElement>(
+                        'div:not([hidden])')!.textContent!;
+        assertFalse(displayedText.includes('barName'));
+        assertFalse(displayedText.includes('fooName'));
+        assertTrue(displayedText.includes('Sync isn\'t working'));
+
+        testElement.syncStatus = {
+          firstSetupInProgress: false,
+          signedInState: SignedInState.SYNCING,
+          signedInUsername: 'bar@bar.com',
+          statusAction: StatusAction.RETRIEVE_TRUSTED_VAULT_KEYS,
+          hasError: true,
+          hasPasswordsOnlyError: true,
+          hasUnrecoverableError: false,
+          disabled: false,
+        };
+        assertTrue(testElement.shadowRoot!
+                       .querySelector<HTMLElement>('#sync-icon-container')!
+                       .classList.contains('sync-problem'));
+        assertTrue(!!testElement.shadowRoot!.querySelector(
+            '[icon="settings:sync-problem"]'));
+        displayedText =
+            userInfo.querySelector<HTMLElement>(
+                        'div:not([hidden])')!.textContent!;
+        assertFalse(displayedText.includes('barName'));
+        assertFalse(displayedText.includes('fooName'));
+        assertFalse(displayedText.includes('Sync isn\'t working'));
+        assertTrue(displayedText.includes('Password sync isn\'t working'));
+        // The sync error button is shown to resolve the error.
+        assertTrue(isChildVisible(testElement, '#sync-error-button'));
+        assertTrue(isChildVisible(testElement, '#turn-off'));
+      });
 
   test(
       'user in sync paused state, kImprovedSettingsUIOnDesktop enabled',
diff --git a/chromecast/browser/cast_content_browser_client.cc b/chromecast/browser/cast_content_browser_client.cc
index 0583c59..36b70c2 100644
--- a/chromecast/browser/cast_content_browser_client.cc
+++ b/chromecast/browser/cast_content_browser_client.cc
@@ -480,8 +480,9 @@
   return cast_network_contexts_->GetSystemContext();
 }
 
-void CastContentBrowserClient::OverrideWebkitPrefs(
+void CastContentBrowserClient::OverrideWebPreferences(
     content::WebContents* web_contents,
+    content::SiteInstance& main_frame_site,
     blink::web_pref::WebPreferences* prefs) {
   prefs->allow_scripts_to_close_windows = true;
 
diff --git a/chromecast/browser/cast_content_browser_client.h b/chromecast/browser/cast_content_browser_client.h
index c8b6007..229d4ec3 100644
--- a/chromecast/browser/cast_content_browser_client.h
+++ b/chromecast/browser/cast_content_browser_client.h
@@ -182,8 +182,9 @@
                                       int child_process_id) override;
   std::string GetAcceptLangs(content::BrowserContext* context) override;
   network::mojom::NetworkContext* GetSystemNetworkContext() override;
-  void OverrideWebkitPrefs(content::WebContents* web_contents,
-                           blink::web_pref::WebPreferences* prefs) override;
+  void OverrideWebPreferences(content::WebContents* web_contents,
+                              content::SiteInstance& main_frame_site,
+                              blink::web_pref::WebPreferences* prefs) override;
   std::string GetApplicationLocale() override;
   void AllowCertificateError(
       content::WebContents* web_contents,
diff --git a/chromeos/services/network_config/public/mojom/BUILD.gn b/chromeos/services/network_config/public/mojom/BUILD.gn
index 57009101e..946f9de 100644
--- a/chromeos/services/network_config/public/mojom/BUILD.gn
+++ b/chromeos/services/network_config/public/mojom/BUILD.gn
@@ -17,9 +17,8 @@
     webui_module_path =
         "chrome://resources/mojo/chromeos/services/network_config/public/mojom"
 
-    # Used by ash/webui/common/resources/network_health, which is still using
-    # JS + Closure.
-    generate_webui_js_bindings = true
+    # Used by external clients, see chromeos/resources/BUILD.gn.
+    generate_legacy_js_bindings = true
   }
 
   public_deps = [
@@ -52,8 +51,7 @@
     webui_module_path =
         "chrome://resources/mojo/chromeos/services/network_config/public/mojom"
 
-    # Used by ash/webui/common/resources/network_health, which is still using
-    # JS + Closure.
-    generate_webui_js_bindings = true
+    # Used by external clients, see chromeos/resources/BUILD.gn.
+    generate_legacy_js_bindings = true
   }
 }
diff --git a/chromeos/services/network_health/public/mojom/BUILD.gn b/chromeos/services/network_health/public/mojom/BUILD.gn
index e78a2e1..fc5ad62a 100644
--- a/chromeos/services/network_health/public/mojom/BUILD.gn
+++ b/chromeos/services/network_health/public/mojom/BUILD.gn
@@ -24,9 +24,8 @@
     webui_module_path =
         "chrome://resources/mojo/chromeos/services/network_health/public/mojom"
 
-    # Used by ash/webui/common/resources/network_health, which is still using
-    # JS + Closure.
-    generate_webui_js_bindings = true
+    # Used by external clients, see chromeos/resources/BUILD.gn.
+    generate_legacy_js_bindings = true
   }
 }
 
@@ -44,8 +43,7 @@
     webui_module_path =
         "chrome://resources/mojo/chromeos/services/network_health/public/mojom"
 
-    # Used by ash/webui/common/resources/network_health, which is still using
-    # JS + Closure.
-    generate_webui_js_bindings = true
+    # Used by external clients, see chromeos/resources/BUILD.gn.
+    generate_legacy_js_bindings = true
   }
 }
diff --git a/clank b/clank
index 11a98e6..2638f42 160000
--- a/clank
+++ b/clank
@@ -1 +1 @@
-Subproject commit 11a98e686ad3746325e83f4357fad4b60112da74
+Subproject commit 2638f42d4957fb0d8fe71d113068a7cc2d0d79ce
diff --git a/components/bookmarks/browser/bookmark_model.h b/components/bookmarks/browser/bookmark_model.h
index 888362c..3427869 100644
--- a/components/bookmarks/browser/bookmark_model.h
+++ b/components/bookmarks/browser/bookmark_model.h
@@ -216,6 +216,14 @@
   //
   // Note: this might cause UUIDs to get reassigned for `node` or its
   // descendants, when the node is moved between local and account storages.
+  //
+  // `new_parent` may be the same as `node`'s current parent, in which case the
+  // semantics are "insert before the element currently at `index`". Suppose the
+  // initial current children of new_parent are ordered [A, B, C]:
+  // * Move(B, new_parent, 0) -> [B, A, C]
+  // * Move(B, new_parent, 1) -> [A, B, C]
+  // * Move(B, new_parent, 2) -> [A, B, C]
+  // * Move(B, new_parent, 3) -> [A, C, B]
   void Move(const BookmarkNode* node,
             const BookmarkNode* new_parent,
             size_t index);
diff --git a/components/bookmarks/browser/bookmark_model_unittest.cc b/components/bookmarks/browser/bookmark_model_unittest.cc
index 0c42551..3beedc5 100644
--- a/components/bookmarks/browser/bookmark_model_unittest.cc
+++ b/components/bookmarks/browser/bookmark_model_unittest.cc
@@ -288,8 +288,9 @@
 void VerifyNoDuplicateIDs(BookmarkModel* model) {
   ui::TreeNodeIterator<const BookmarkNode> it(model->root_node());
   std::unordered_set<int64_t> ids;
-  while (it.has_next())
+  while (it.has_next()) {
     ASSERT_TRUE(ids.insert(it.Next()->id()).second);
+  }
 }
 
 class BookmarkModelTest : public testing::Test, public BookmarkModelObserver {
@@ -514,8 +515,9 @@
     model_->AddObserver(this);
     ClearCounts();
 
-    if (!model_->root_node()->GetIndexOf(managed_node).has_value())
+    if (!model_->root_node()->GetIndexOf(managed_node).has_value()) {
       ADD_FAILURE();
+    }
 
     return managed_node;
   }
@@ -1222,6 +1224,44 @@
   EXPECT_TRUE(matches.empty());
 }
 
+TEST_F(BookmarkModelTest, MoveToSameParent) {
+  TestNode abc;
+  PopulateNodeFromString("A B C", &abc);
+  TestNode bac;
+  PopulateNodeFromString("B A C", &bac);
+  TestNode bca;
+  PopulateNodeFromString("B C A", &bca);
+
+  // Populate the parent with [a, b, c].
+  BookmarkNode* parent = AsMutable(model_->bookmark_bar_node());
+  PopulateBookmarkNode(&abc, model_.get(), parent);
+
+  // Move to current_index - 1 moves to the left: [a, b, c] -> [b, a, c]
+  ClearCounts();
+  model_->Move(parent->children()[1].get(), parent, 0);
+  VerifyModelMatchesNode(&bac, parent);
+  AssertObserverCount(0, /*moved_count=*/1, 0, 0, 0, 0, 0, 0, 0);
+
+  // Move the current_index is a no-op: [b, a, c] -> [b, a, c]
+  ClearCounts();
+  model_->Move(parent->children()[1].get(), parent, 1);
+  VerifyModelMatchesNode(&bac, parent);
+  AssertObserverCount(0, /*moved_count=*/0, 0, 0, 0, 0, 0, 0, 0);
+
+  // Move to current_index + 1 is a no-op: [b, a, c] -> [b, a, c]
+  ClearCounts();
+  model_->Move(parent->children()[1].get(), parent, 2);
+  VerifyModelMatchesNode(&bac, parent);
+  AssertObserverCount(0, /*moved_count=*/0, 0, 0, 0, 0, 0, 0, 0);
+
+  // Move to current_index + 2 moves 1 to the right: [b, a, c] -> [b, c, a]
+  // Note: this tests moving to an index that is one past the end of the list.
+  ClearCounts();
+  model_->Move(parent->children()[1].get(), parent, 3);
+  VerifyModelMatchesNode(&bca, parent);
+  AssertObserverCount(0, /*moved_count=*/1, 0, 0, 0, 0, 0, 0, 0);
+}
+
 TEST_F(BookmarkModelTest, NonMovingMoveCall) {
   const BookmarkNode* bookmark_bar_node = model_->bookmark_bar_node();
   const std::u16string kTitle(u"foo");
@@ -2753,9 +2793,8 @@
   static_cast<TestBookmarkClient*>(model_->client())
       ->SetIsSyncFeatureEnabledIncludingBookmarks(true);
 
-  auto dettached_node =
-      std::make_unique<BookmarkNode>(/*id=*/200, base::Uuid::GenerateRandomV4(),
-                                     GURL());
+  auto dettached_node = std::make_unique<BookmarkNode>(
+      /*id=*/200, base::Uuid::GenerateRandomV4(), GURL());
 
   EXPECT_TRUE(model_->IsLocalOnlyNode(*dettached_node));
 }
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/BrowserUiListMenuUtils.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/BrowserUiListMenuUtils.java
index 375fb9e9..e868182 100644
--- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/BrowserUiListMenuUtils.java
+++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/BrowserUiListMenuUtils.java
@@ -164,6 +164,38 @@
     }
 
     /**
+     * Helper function to build a list menu item. Set 0 if there is no icon or text. This ListItem
+     * is set enabled as default.
+     *
+     * @param title The text on the menu item.
+     * @param menuId Id of the menu item.
+     * @param startIconId The icon on the start of the menu item. Pass 0 for no icon.
+     * @param enabled Whether or not this menu item should be enabled.
+     * @param isTextEllipsizedAtEnd Whether or not the text in this menu item is ellipsized at the
+     *     end
+     * @return ListItem Representing an item with text or icon.
+     */
+    @NonNull
+    public static ListItem buildMenuListItemWithEllipsizedAtEnd(
+            @NonNull String title,
+            @IdRes int menuId,
+            @DrawableRes int startIconId,
+            boolean enabled,
+            boolean isTextEllipsizedAtEnd) {
+        PropertyModel.Builder builder =
+                getListItemPropertyBuilder()
+                        .with(ListMenuItemProperties.TITLE, title)
+                        .with(ListMenuItemProperties.MENU_ITEM_ID, menuId)
+                        .with(ListMenuItemProperties.START_ICON_ID, startIconId)
+                        .with(ListMenuItemProperties.ENABLED, enabled)
+                        .with(
+                                ListMenuItemProperties.IS_TEXT_ELLIPSIZED_AT_END,
+                                isTextEllipsizedAtEnd);
+
+        return new MVCListAdapter.ListItem(ListMenuItemType.MENU_ITEM, builder.build());
+    }
+
+    /**
      * Helper function to build a list menu item. Pass 0 for attributes that aren't applicable to
      * the menu item (e.g. if there is no icon or text).
      *
diff --git a/components/collaboration/public/features.cc b/components/collaboration/public/features.cc
index 8f22aad..54fd99e6 100644
--- a/components/collaboration/public/features.cc
+++ b/components/collaboration/public/features.cc
@@ -5,12 +5,17 @@
 #include "components/collaboration/public/features.h"
 
 #include "base/feature_list.h"
+#include "build/build_config.h"
 
 namespace collaboration::features {
 
 BASE_FEATURE(kCollaborationMessaging,
              "CollaborationMessaging",
+#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_IOS)
+             base::FEATURE_ENABLED_BY_DEFAULT);
+#else
              base::FEATURE_DISABLED_BY_DEFAULT);
+#endif
 
 BASE_FEATURE(kCollaborationFlowAndroid,
              "CollaborationFlowAndroid",
diff --git a/components/discardable_memory/common/discardable_shared_memory_heap.cc b/components/discardable_memory/common/discardable_shared_memory_heap.cc
index 37823f1..92df90b 100644
--- a/components/discardable_memory/common/discardable_shared_memory_heap.cc
+++ b/components/discardable_memory/common/discardable_shared_memory_heap.cc
@@ -2,10 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-#pragma check_unsafe_buffers
-#endif
-
 #include "components/discardable_memory/common/discardable_shared_memory_heap.h"
 
 #include <bit>
diff --git a/components/discardable_memory/common/discardable_shared_memory_heap.h b/components/discardable_memory/common/discardable_shared_memory_heap.h
index 9a2b5455..ec8581f 100644
--- a/components/discardable_memory/common/discardable_shared_memory_heap.h
+++ b/components/discardable_memory/common/discardable_shared_memory_heap.h
@@ -2,10 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-#pragma check_unsafe_buffers
-#endif
-
 #ifndef COMPONENTS_DISCARDABLE_MEMORY_COMMON_DISCARDABLE_SHARED_MEMORY_HEAP_H_
 #define COMPONENTS_DISCARDABLE_MEMORY_COMMON_DISCARDABLE_SHARED_MEMORY_HEAP_H_
 
diff --git a/components/omnibox/browser/BUILD.gn b/components/omnibox/browser/BUILD.gn
index 354ea41..4f218a9e 100644
--- a/components/omnibox/browser/BUILD.gn
+++ b/components/omnibox/browser/BUILD.gn
@@ -275,6 +275,8 @@
     "scored_history_match.h",
     "scoring_functor.cc",
     "scoring_functor.h",
+    "search_aggregator_suggestions_service.cc",
+    "search_aggregator_suggestions_service.h",
     "search_provider.cc",
     "search_provider.h",
     "search_scoring_signals_annotator.cc",
@@ -836,6 +838,7 @@
     "open_tab_provider_unittest.cc",
     "remote_suggestions_service_unittest.cc",
     "scored_history_match_unittest.cc",
+    "search_aggregator_suggestions_service_unittest.cc",
     "search_suggestion_parser_unittest.cc",
     "shortcuts_backend_unittest.cc",
     "shortcuts_database_unittest.cc",
diff --git a/components/omnibox/browser/search_aggregator_suggestions_service.cc b/components/omnibox/browser/search_aggregator_suggestions_service.cc
new file mode 100644
index 0000000..c614f29
--- /dev/null
+++ b/components/omnibox/browser/search_aggregator_suggestions_service.cc
@@ -0,0 +1,117 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/omnibox/browser/search_aggregator_suggestions_service.h"
+
+#include <memory>
+#include <utility>
+
+#include "base/functional/bind.h"
+#include "base/i18n/rtl.h"
+#include "base/json/json_writer.h"
+#include "base/metrics/field_trial_params.h"
+#include "base/strings/stringprintf.h"
+#include "base/values.h"
+#include "components/omnibox/browser/document_provider.h"
+#include "components/variations/net/variations_http_headers.h"
+#include "net/base/load_flags.h"
+#include "net/traffic_annotation/network_traffic_annotation.h"
+#include "services/network/public/cpp/resource_request.h"
+#include "services/network/public/cpp/shared_url_loader_factory.h"
+#include "services/network/public/cpp/simple_url_loader.h"
+
+SearchAggregatorSuggestionsService::SearchAggregatorSuggestionsService(
+    scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory)
+    : url_loader_factory_(url_loader_factory) {
+  DCHECK(url_loader_factory);
+}
+
+SearchAggregatorSuggestionsService::~SearchAggregatorSuggestionsService() =
+    default;
+
+void SearchAggregatorSuggestionsService::
+    CreateSearchAggregatorSuggestionsRequest(
+        const GURL& suggest_url,
+        const std::string& request_body,
+        CreationCallback creation_callback,
+        StartCallback start_callback,
+        CompletionCallback completion_callback) {
+  DCHECK(suggest_url.is_valid());
+
+  auto request = std::make_unique<network::ResourceRequest>();
+  request->url = suggest_url;
+  request->method = "POST";
+  request->load_flags = net::LOAD_DO_NOT_SAVE_COOKIES;
+
+  request->site_for_cookies = net::SiteForCookies::FromUrl(suggest_url);
+  variations::AppendVariationsHeaderUnknownSignedIn(
+      request->url, variations::InIncognito::kNo, request.get());
+
+  std::move(creation_callback).Run(request.get());
+
+  net::NetworkTrafficAnnotationTag traffic_annotation =
+      net::DefineNetworkTrafficAnnotation("omnibox_search_aggregator_suggest",
+                                          R"(
+        semantics {
+          sender: "Omnibox"
+          description:
+            "Request for enterprise suggestions from the omnibox."
+            "Enterprise suggestions provide enterprise specific documents"
+            "to enterprise users and are configured by enterprise admin."
+          trigger: "Signed-in enterprise user enters text in the omnibox."
+          user_data {
+            type: ACCESS_TOKEN
+            type: USER_CONTENT
+            type: SENSITIVE_URL
+          }
+          data: "The query string from the omnibox."
+          destination: GOOGLE_OWNED_SERVICE
+          internal {
+            contacts { email: "test-spark-integration@google.com" }
+          }
+          last_reviewed: "2025-01-07"
+        }
+        policy {
+          cookies_allowed: YES
+          cookies_store: "user"
+          setting:
+            "The suggest_url is set by policy through enterprise admin."
+            "Signed-in enterprise users can see this configuration in"
+            "chrome://settings/searchEngines."
+          chrome_policy {
+            SearchSuggestEnabled {
+                policy_options {mode: MANDATORY}
+                SearchSuggestEnabled: false
+            }
+        }
+      })");
+
+  StartDownloadAndTransferLoader(std::move(request), std::move(request_body),
+                                 traffic_annotation, std::move(start_callback),
+                                 std::move(completion_callback));
+}
+
+// TODO(crbug.com/385756623): Factor out this method so it can be used across
+//   document_suggestions_service and search_aggregator_suggestions_service.
+void SearchAggregatorSuggestionsService::StartDownloadAndTransferLoader(
+    std::unique_ptr<network::ResourceRequest> request,
+    std::string request_body,
+    net::NetworkTrafficAnnotationTag traffic_annotation,
+    StartCallback start_callback,
+    CompletionCallback completion_callback) {
+  if (!url_loader_factory_) {
+    return;
+  }
+
+  std::unique_ptr<network::SimpleURLLoader> loader =
+      network::SimpleURLLoader::Create(std::move(request), traffic_annotation);
+  if (!request_body.empty()) {
+    loader->AttachStringForUpload(request_body, "application/json");
+  }
+  loader->DownloadToStringOfUnboundedSizeUntilCrashAndDie(
+      url_loader_factory_.get(),
+      base::BindOnce(std::move(completion_callback), loader.get()));
+
+  std::move(start_callback).Run(std::move(loader), request_body);
+}
diff --git a/components/omnibox/browser/search_aggregator_suggestions_service.h b/components/omnibox/browser/search_aggregator_suggestions_service.h
new file mode 100644
index 0000000..39071b6
--- /dev/null
+++ b/components/omnibox/browser/search_aggregator_suggestions_service.h
@@ -0,0 +1,64 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_OMNIBOX_BROWSER_SEARCH_AGGREGATOR_SUGGESTIONS_SERVICE_H_
+#define COMPONENTS_OMNIBOX_BROWSER_SEARCH_AGGREGATOR_SUGGESTIONS_SERVICE_H_
+
+#include <memory>
+#include <string>
+
+#include "base/memory/raw_ptr.h"
+#include "base/memory/scoped_refptr.h"
+#include "base/scoped_observation.h"
+#include "components/keyed_service/core/keyed_service.h"
+#include "services/network/public/cpp/resource_request.h"
+#include "services/network/public/cpp/shared_url_loader_factory.h"
+#include "services/network/public/cpp/simple_url_loader.h"
+#include "url/gurl.h"
+
+// A service to fetch suggestions from the search aggregator endpoint URL.
+class SearchAggregatorSuggestionsService : public KeyedService {
+ public:
+  explicit SearchAggregatorSuggestionsService(
+      scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory);
+
+  ~SearchAggregatorSuggestionsService() override;
+  SearchAggregatorSuggestionsService(
+      const SearchAggregatorSuggestionsService&) = delete;
+  SearchAggregatorSuggestionsService& operator=(
+      const SearchAggregatorSuggestionsService&) = delete;
+
+  // TODO(crbug.com/385756623): Factor out callback methods so it can be used
+  //   across document_suggestions_service and
+  //   search_aggregator_suggestions_service.
+  using CreationCallback =
+      base::OnceCallback<void(network::ResourceRequest* request)>;
+  using StartCallback =
+      base::OnceCallback<void(std::unique_ptr<network::SimpleURLLoader> loader,
+                              const std::string& request_body)>;
+  using CompletionCallback =
+      base::OnceCallback<void(const network::SimpleURLLoader* source,
+                              std::unique_ptr<std::string> response_body)>;
+
+  void CreateSearchAggregatorSuggestionsRequest(
+      const GURL& suggest_url,
+      const std::string& request_body,
+      CreationCallback creation_callback,
+      StartCallback start_callback,
+      CompletionCallback completion_callback);
+
+ private:
+  // TODO(crbug.com/385756623): Factor out this method so it can be used across
+  //   document_suggestions_service and search_aggregator_suggestions_service.
+  void StartDownloadAndTransferLoader(
+      std::unique_ptr<network::ResourceRequest> request,
+      std::string request_body,
+      net::NetworkTrafficAnnotationTag traffic_annotation,
+      StartCallback start_callback,
+      CompletionCallback completion_callback);
+
+  scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_;
+};
+
+#endif  // COMPONENTS_OMNIBOX_BROWSER_SEARCH_AGGREGATOR_SUGGESTIONS_SERVICE_H_
diff --git a/components/omnibox/browser/search_aggregator_suggestions_service_unittest.cc b/components/omnibox/browser/search_aggregator_suggestions_service_unittest.cc
new file mode 100644
index 0000000..f1e1249
--- /dev/null
+++ b/components/omnibox/browser/search_aggregator_suggestions_service_unittest.cc
@@ -0,0 +1,155 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/omnibox/browser/search_aggregator_suggestions_service.h"
+
+#include "base/functional/bind.h"
+#include "base/json/json_parser.h"
+#include "base/json/json_reader.h"
+#include "base/json/json_writer.h"
+#include "base/run_loop.h"
+#include "base/strings/string_number_conversions.h"
+#include "base/strings/stringprintf.h"
+#include "base/strings/utf_string_conversions.h"
+#include "base/test/bind.h"
+#include "base/test/scoped_feature_list.h"
+#include "base/test/task_environment.h"
+#include "components/signin/public/identity_manager/identity_test_environment.h"
+#include "components/sync_preferences/testing_pref_service_syncable.h"
+#include "components/variations/net/variations_http_headers.h"
+#include "components/variations/scoped_variations_ids_provider.h"
+#include "components/variations/variations_associated_data.h"
+#include "components/variations/variations_ids_provider.h"
+#include "services/network/public/cpp/data_element.h"
+#include "services/network/public/cpp/resource_request.h"
+#include "services/network/public/cpp/shared_url_loader_factory.h"
+#include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
+#include "services/network/test/test_url_loader_factory.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace {
+
+variations::VariationID kVariationID = 123;
+
+const std::string& mock_response = base::StringPrintf({
+    R"({"querySuggestions" : [ {
+   "suggestion" : "sundar pichai",
+   "dataStore" : [ "projects1", "dataStore1", "project2", "dataStore2" ]
+   } ],
+   "peopleSuggestions" : [ {
+       "document" : {
+       "name" : "",
+       "derivedStructData" : {
+           "displayPhoto" : {
+           "url" : "example.com"
+           },
+           "name" : {
+           "family_name_lower" : "doe",
+           "familyName" : "Doe",
+           "userName" : "janedoe@example.com",
+           "givenName" : "Doe",
+           "display_name_lower" : "jane doe",
+           "displayName" : "Jane Doe",
+           "given_name_lower" : "jane"
+           },
+           "emails" : [ {"type" : "primary", "value" : "janedoe@example.com"} ]
+       }
+       },
+       "dataStore" : ""
+   } ] })"});
+
+void OnSearchAggregatorSuggestionsRequestAvailable(
+    network::ResourceRequest* request) {}
+
+void OnSearchAggregatorSuggestionsLoaderAvailable(
+    std::unique_ptr<network::SimpleURLLoader> loader,
+    const std::string& request_body) {}
+
+void OnURLLoadComplete(const network::SimpleURLLoader* source,
+                       std::unique_ptr<std::string> response_body) {}
+
+class SearchAggregatorSuggestionsServiceTest : public testing::Test {
+ public:
+  SearchAggregatorSuggestionsServiceTest()
+      : task_environment_(base::test::TaskEnvironment::MainThreadType::UI),
+        shared_url_loader_factory_(
+            base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
+                &test_url_loader_factory_)),
+        identity_test_env_(&test_url_loader_factory_, &prefs_),
+        search_aggregator_suggestions_service_(
+            new SearchAggregatorSuggestionsService(
+                shared_url_loader_factory_)) {
+    // Set up a variation.
+    variations::AssociateGoogleVariationID(
+        variations::GOOGLE_WEB_PROPERTIES_ANY_CONTEXT, "trial name",
+        "group name", kVariationID);
+    base::FieldTrialList::CreateFieldTrial("trial name", "group name")
+        ->Activate();
+  }
+  SearchAggregatorSuggestionsServiceTest(
+      const SearchAggregatorSuggestionsServiceTest&) = delete;
+  SearchAggregatorSuggestionsServiceTest& operator=(
+      const SearchAggregatorSuggestionsServiceTest&) = delete;
+
+ protected:
+  AccountInfo SetUpPrimaryAccount() {
+    auto account_info = identity_test_env_.MakePrimaryAccountAvailable(
+        "foo@gmail.com", signin::ConsentLevel::kSignin);
+    identity_test_env_.SetRefreshTokenForPrimaryAccount();
+    identity_test_env_.SetAutomaticIssueOfAccessTokens(true);
+    return account_info;
+  }
+
+  base::test::TaskEnvironment task_environment_;
+  variations::ScopedVariationsIdsProvider scoped_variations_ids_provider_{
+      variations::VariationsIdsProvider::Mode::kUseSignedInState};
+  network::TestURLLoaderFactory test_url_loader_factory_;
+  scoped_refptr<network::SharedURLLoaderFactory> shared_url_loader_factory_;
+  sync_preferences::TestingPrefServiceSyncable prefs_;
+  signin::IdentityTestEnvironment identity_test_env_;
+  std::unique_ptr<SearchAggregatorSuggestionsService>
+      search_aggregator_suggestions_service_;
+};
+
+TEST_F(SearchAggregatorSuggestionsServiceTest, ValidateRequest) {
+  SetUpPrimaryAccount();
+
+  network::ResourceRequest resource_request;
+  test_url_loader_factory_.SetInterceptor(
+      base::BindLambdaForTesting([&](const network::ResourceRequest& request) {
+        resource_request = request;
+      }));
+
+  base::Value::Dict root;
+  root.Set("query", base::Value("test"));
+  std::string test_request_body;
+  base::JSONWriter::Write(root, &test_request_body);
+  const GURL test_endpoint = GURL("https://fake_url.com");
+
+  search_aggregator_suggestions_service_
+      ->CreateSearchAggregatorSuggestionsRequest(
+          test_endpoint, test_request_body,
+          base::BindOnce(OnSearchAggregatorSuggestionsRequestAvailable),
+          base::BindOnce(OnSearchAggregatorSuggestionsLoaderAvailable),
+          base::BindOnce(OnURLLoadComplete));
+
+  base::RunLoop().RunUntilIdle();
+
+  EXPECT_TRUE(resource_request.site_for_cookies.IsEquivalent(
+      net::SiteForCookies::FromUrl(GURL(test_endpoint))))
+      << resource_request.site_for_cookies.ToDebugString();
+
+  EXPECT_EQ(resource_request.request_body->elements()->size(), 1u);
+
+  std::optional<base::Value> request_body =
+      base::JSONReader::Read(resource_request.request_body->elements()
+                                 ->at(0)
+                                 .As<network::DataElementBytes>()
+                                 .AsStringPiece());
+  std::optional<base::Value> test_request_body_value =
+      base::JSONReader::Read(test_request_body);
+  EXPECT_EQ(request_body, test_request_body_value);
+}
+
+}  // namespace
diff --git a/components/optimization_guide/internal b/components/optimization_guide/internal
index c97178e..bd36677 160000
--- a/components/optimization_guide/internal
+++ b/components/optimization_guide/internal
@@ -1 +1 @@
-Subproject commit c97178e22cfde77ce6134e69266e5ae9c5bc0b87
+Subproject commit bd3667785fe1b0b97fd32cd07c78a1145ffcd82d
diff --git a/components/page_load_metrics/browser/observers/use_counter/webdx_feature_maps.cc b/components/page_load_metrics/browser/observers/use_counter/webdx_feature_maps.cc
index 3f704a2..bf4fcff 100644
--- a/components/page_load_metrics/browser/observers/use_counter/webdx_feature_maps.cc
+++ b/components/page_load_metrics/browser/observers/use_counter/webdx_feature_maps.cc
@@ -49,12 +49,8 @@
           {WebFeature::kStreamingDeclarativeShadowDOM,
            WebDXFeature::kDeclarativeShadowDom},
           {WebFeature::kShowPickerSelect, WebDXFeature::kShowPickerSelect},
-          {WebFeature::kHiddenUntilFoundAttribute,
-           WebDXFeature::kHiddenUntilFoundAttribute},
           {WebFeature::kHTMLDetailsElementNameAttribute,
            WebDXFeature::kDetailsName},
-          {WebFeature::kElementCheckVisibility,
-           WebDXFeature::kElementCheckVisibility},
           {WebFeature::kHTMLUnsafeMethods, WebDXFeature::kParseHtmlUnsafe},
           {WebFeature::kCloseWatcherScriptConstructor,
            WebDXFeature::kClosewatcher},
@@ -265,7 +261,7 @@
           {WebFeature::kCSSSelectorPseudoFileSelectorButton,
            WebDXFeature::kFileSelectorButton},
           {WebFeature::kClipPathGeometryBox,
-           WebDXFeature::kClipPathGeometryBox},
+           WebDXFeature::kClipPathBoxes},
           {WebFeature::kActiveViewTransitionPseudo,
            WebDXFeature::kActiveViewTransition},
           {WebFeature::kSnapEvent, WebDXFeature::kScrollSnapEvents},
diff --git a/components/safe_browsing/core/common/features.cc b/components/safe_browsing/core/common/features.cc
index 90e3ed2..79e588d4 100644
--- a/components/safe_browsing/core/common/features.cc
+++ b/components/safe_browsing/core/common/features.cc
@@ -184,11 +184,6 @@
         &kExtensionTelemetryForEnterprise, "EnterpriseReportingIntervalSeconds",
         /*default_value=*/300};
 
-BASE_FEATURE(
-    kExtensionTelemetryInterceptRemoteHostsContactedInRenderer,
-    "SafeBrowsingExtensionTelmetryInterceptRemoteHostsContactedInRenderer",
-    base::FEATURE_ENABLED_BY_DEFAULT);
-
 BASE_FEATURE(kExtensionTelemetryTabsExecuteScriptSignal,
              "SafeBrowsingExtensionTelemetryTabsExecuteScriptSignal",
              base::FEATURE_ENABLED_BY_DEFAULT);
@@ -346,7 +341,6 @@
       &kEnterpriseRealTimeUrlCheckOnAndroid,
       &kExtensionTelemetryDeclarativeNetRequestActionSignal,
       &kExtensionTelemetryForEnterprise,
-      &kExtensionTelemetryInterceptRemoteHostsContactedInRenderer,
       &kExtensionTelemetryTabsExecuteScriptSignal,
       &kExternalAppRedirectTelemetry,
       &kHashPrefixRealTimeLookups,
diff --git a/components/safe_browsing/core/common/features.h b/components/safe_browsing/core/common/features.h
index 2e8e4c4..acb1f3c3 100644
--- a/components/safe_browsing/core/common/features.h
+++ b/components/safe_browsing/core/common/features.h
@@ -177,11 +177,6 @@
 // tabs.executeScript API call.
 BASE_DECLARE_FEATURE(kExtensionTelemetryTabsExecuteScriptSignal);
 
-// Enables intercepting remote hosts contacted by extensions in renderer
-// throttles.
-BASE_DECLARE_FEATURE(
-    kExtensionTelemetryInterceptRemoteHostsContactedInRenderer);
-
 // Enables reporting of external app redirects
 BASE_DECLARE_FEATURE(kExternalAppRedirectTelemetry);
 
diff --git a/components/search_engines/default_search_manager_unittest.cc b/components/search_engines/default_search_manager_unittest.cc
index ded4ec6..683d954 100644
--- a/components/search_engines/default_search_manager_unittest.cc
+++ b/components/search_engines/default_search_manager_unittest.cc
@@ -383,12 +383,6 @@
   manager->SetUserSelectedDefaultSearchEngine(*supplied_engine);
   auto* result = manager->GetDefaultSearchEngine(nullptr);
   ExpectSimilar(builtin_engine, result);
-
-  // Play definitions must not be reconciled using prepopulated_id.
-  supplied_engine->created_from_play_api = true;
-  manager->SetUserSelectedDefaultSearchEngine(*supplied_engine);
-  result = manager->GetDefaultSearchEngine(nullptr);
-  ExpectSimilar(supplied_engine.get(), result);
 }
 
 TEST_F(DefaultSearchManagerTest,
diff --git a/components/search_engines/search_engines_switches.cc b/components/search_engines/search_engines_switches.cc
index d24dfbf1..4d3160f 100644
--- a/components/search_engines/search_engines_switches.cc
+++ b/components/search_engines/search_engines_switches.cc
@@ -100,12 +100,12 @@
 COMPONENT_EXPORT(SEARCH_ENGINES_SWITCHES)
 BASE_FEATURE(kTemplateUrlReconciliation,
              "TemplateUrlReconciliation",
-             base::FEATURE_DISABLED_BY_DEFAULT);
+             base::FEATURE_ENABLED_BY_DEFAULT);
 
 const base::FeatureParam<bool> kReconcileWithAllKnownEngines(
     &kTemplateUrlReconciliation,
     "reconcile_with_all_known_engines",
-    false);
+    true);
 
 #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX)
 COMPONENT_EXPORT(SEARCH_ENGINES_SWITCHES)
diff --git a/components/search_engines/template_url_service_unittest.cc b/components/search_engines/template_url_service_unittest.cc
index 98efa48..b56349b7 100644
--- a/components/search_engines/template_url_service_unittest.cc
+++ b/components/search_engines/template_url_service_unittest.cc
@@ -326,11 +326,12 @@
       template_url_service().GetTemplateURLForKeyword(overriden_keyword);
   EXPECT_TRUE(new_play_engine);
   EXPECT_TRUE(new_play_engine->created_from_play_api());
-  EXPECT_EQ(new_play_engine->prepopulate_id(), 0);
+  EXPECT_EQ(new_play_engine->prepopulate_id(), /* bing_id */ 3);
   EXPECT_EQ(new_play_engine, template_url_service().GetDefaultSearchProvider());
 
-  // The properties are the ones coming from play, not the prepopulated ones.
-  EXPECT_EQ(new_play_engine->url(), new_engine_url_from_play);
+  // The properties are the ones coming from Chromium database: reconciliation
+  // detects matching defiition and re-uses it.
+  EXPECT_EQ(new_play_engine->url(), old_prepopulated_engine->url());
   EXPECT_EQ(new_play_engine->short_name(), new_engine_name_from_play);
 
   // Both the old prepopulated engine and the new one from play are registered.
diff --git a/components/signin/public/base/signin_metrics.cc b/components/signin/public/base/signin_metrics.cc
index 2d51ab2..0a50001e 100644
--- a/components/signin/public/base/signin_metrics.cc
+++ b/components/signin/public/base/signin_metrics.cc
@@ -174,6 +174,13 @@
                                 AccessPoint::ACCESS_POINT_MAX);
 }
 
+#if BUILDFLAG(IS_IOS)
+void LogSigninWithAccountType(SigninAccountType account_type) {
+  base::UmaHistogramEnumeration("Signin.AccountType.SigninConsent",
+                                account_type);
+}
+#endif  // BUILDFLAG(IS_IOS)
+
 void LogSyncOptInStarted(AccessPoint access_point) {
   base::UmaHistogramEnumeration("Signin.SyncOptIn.Started", access_point,
                                 AccessPoint::ACCESS_POINT_MAX);
diff --git a/components/signin/public/base/signin_metrics.h b/components/signin/public/base/signin_metrics.h
index 8053607b..436d60f 100644
--- a/components/signin/public/base/signin_metrics.h
+++ b/components/signin/public/base/signin_metrics.h
@@ -549,6 +549,20 @@
   // A managed user is signing out and the data will be cleared from the device.
   kSignoutWithClearDataForManagedUser = 1,
 };
+
+// Values of Signin.AccountType histogram. This histogram records if the user
+// uses a gmail account or a managed account when signing in.
+// These values are persisted to logs. Entries should not be renumbered and
+// numeric values should never be reused. Keep in sync with SigninAccountType in
+// tools/metrics/histograms/metadata/signin/enums.xml.
+enum class SigninAccountType {
+  // Gmail account.
+  kRegular = 0,
+  // Managed account.
+  kManaged = 1,
+  // Always the last enumerated type.
+  kMaxValue = kManaged,
+};
 #endif  // BUILDFLAG(IS_IOS)
 
 // -----------------------------------------------------------------------------
@@ -573,6 +587,11 @@
 // changes, see `signin::PrimaryAccountMutator`.
 void LogSignInStarted(AccessPoint access_point);
 
+#if BUILDFLAG(IS_IOS)
+// Records the account type when the user signs in.
+void LogSigninWithAccountType(SigninAccountType account_type);
+#endif  // BUILDFLAG(IS_IOS)
+
 // Logs sync opt-in start events and their associated access points. The
 // completion events are automatically logged when the primary account state
 // changes, see `signin::PrimaryAccountMutator`.
diff --git a/components/sync_bookmarks/bookmark_local_data_batch_uploader.cc b/components/sync_bookmarks/bookmark_local_data_batch_uploader.cc
index 293c1bd..7ebca9e5 100644
--- a/components/sync_bookmarks/bookmark_local_data_batch_uploader.cc
+++ b/components/sync_bookmarks/bookmark_local_data_batch_uploader.cc
@@ -4,11 +4,13 @@
 
 #include "components/sync_bookmarks/bookmark_local_data_batch_uploader.h"
 
+#include <cmath>
 #include <utility>
 #include <vector>
 
 #include "base/feature_list.h"
 #include "base/functional/callback.h"
+#include "base/metrics/histogram_functions.h"
 #include "base/strings/utf_string_conversions.h"
 #include "components/bookmarks/browser/bookmark_model.h"
 #include "components/bookmarks/browser/bookmark_node.h"
@@ -23,6 +25,41 @@
 #include "url/gurl.h"
 
 namespace sync_bookmarks {
+namespace {
+
+// Returns the number of descendants (folders or URLs) under `parent` (excluding
+// `parent` itself).
+size_t GetNumberOfDescendants(const bookmarks::BookmarkNode* parent) {
+  if (!parent) {
+    return 0;
+  }
+
+  ui::TreeNodeIterator<const bookmarks::BookmarkNode> iterator(parent);
+  size_t num_nodes = 0;
+  while (iterator.has_next()) {
+    num_nodes++;
+    iterator.Next();
+  }
+  return num_nodes;
+}
+
+// Returns the number of local nodes (folders or URLs) in `bookmark_model`.
+size_t GetNumberOfLocalNodes(const bookmarks::BookmarkModel* bookmark_model) {
+  CHECK(bookmark_model);
+  return GetNumberOfDescendants(bookmark_model->mobile_node()) +
+         GetNumberOfDescendants(bookmark_model->bookmark_bar_node()) +
+         GetNumberOfDescendants(bookmark_model->other_node());
+}
+
+// Returns the number of account nodes (folders or URLs) in `bookmark_model`.
+size_t GetNumberOfAccountNodes(const bookmarks::BookmarkModel* bookmark_model) {
+  CHECK(bookmark_model);
+  return GetNumberOfDescendants(bookmark_model->account_mobile_node()) +
+         GetNumberOfDescendants(bookmark_model->account_bookmark_bar_node()) +
+         GetNumberOfDescendants(bookmark_model->account_other_node());
+}
+
+}  // namespace
 
 BookmarkLocalDataBatchUploader::BookmarkLocalDataBatchUploader(
     bookmarks::BookmarkModel* bookmark_model)
@@ -79,19 +116,61 @@
     return;
   }
 
-  if (base::FeatureList::IsEnabled(
-          switches::kSyncMinimizeDeletionsDuringBookmarkBatchUpload)) {
-    LocalBookmarkToAccountMerger(bookmark_model_).MoveAndMerge();
-  } else {
-    BookmarkModelViewUsingLocalOrSyncableNodes
-        local_or_syncable_bookmark_model_view(bookmark_model_);
-    BookmarkModelViewUsingAccountNodes account_bookmark_model_view(
-        bookmark_model_);
+  const size_t num_local_nodes_before = GetNumberOfLocalNodes(bookmark_model_);
+  const size_t num_account_nodes_before =
+      GetNumberOfAccountNodes(bookmark_model_);
+  const size_t num_total_nodes_before =
+      num_local_nodes_before + num_account_nodes_before;
 
-    LocalBookmarkModelMerger(&local_or_syncable_bookmark_model_view,
-                             &account_bookmark_model_view)
-        .Merge();
-    local_or_syncable_bookmark_model_view.RemoveAllSyncableNodes();
+  {
+    base::ScopedUmaHistogramTimer scoped_timer(
+        "Bookmarks.BatchUploadDuration",
+        base::ScopedUmaHistogramTimer::ScopedHistogramTiming::kMediumTimes);
+
+    if (base::FeatureList::IsEnabled(
+            switches::kSyncMinimizeDeletionsDuringBookmarkBatchUpload)) {
+      LocalBookmarkToAccountMerger(bookmark_model_).MoveAndMerge();
+    } else {
+      BookmarkModelViewUsingLocalOrSyncableNodes
+          local_or_syncable_bookmark_model_view(bookmark_model_);
+      BookmarkModelViewUsingAccountNodes account_bookmark_model_view(
+          bookmark_model_);
+
+      LocalBookmarkModelMerger(&local_or_syncable_bookmark_model_view,
+                               &account_bookmark_model_view)
+          .Merge();
+      local_or_syncable_bookmark_model_view.RemoveAllSyncableNodes();
+    }
+  }
+
+  const size_t num_local_nodes_after = GetNumberOfLocalNodes(bookmark_model_);
+  const size_t num_account_nodes_after =
+      GetNumberOfAccountNodes(bookmark_model_);
+  const size_t num_total_nodes_after =
+      num_local_nodes_after + num_account_nodes_after;
+
+  // Batch upload should not create additional nodes.
+  CHECK_LE(num_total_nodes_after, num_total_nodes_before);
+
+  // Batch upload should, at most, deduplicate all local nodes. The number of
+  // of resulting account nodes cannot be smaller than the original number of
+  // account nodes.
+  CHECK_GE(num_account_nodes_after, num_account_nodes_before);
+  // Similarly, the number of resulting account nodes cannot be smaller than the
+  // original number of local nodes (as deduplication logic never deduplicates
+  // more than two nodes into one).
+  CHECK_GE(num_account_nodes_after, num_local_nodes_before);
+  // As a corollary, the total number of nodes can at most reduce by 50% if all
+  // local nodes are deduplicated.
+  CHECK_GE(num_total_nodes_after * 2, num_total_nodes_before);
+
+  base::UmaHistogramCounts100000("Bookmarks.BatchUploadOutcomeAccountNodes",
+                                 num_account_nodes_after);
+
+  if (num_total_nodes_before != 0) {
+    const double ratio = 1.0 * num_total_nodes_after / num_total_nodes_before;
+    base::UmaHistogramPercentage("Bookmarks.BatchUploadOutcomeRatio",
+                                 static_cast<int>(std::round(100.0 * ratio)));
   }
 }
 
diff --git a/components/sync_bookmarks/bookmark_local_data_batch_uploader_unittest.cc b/components/sync_bookmarks/bookmark_local_data_batch_uploader_unittest.cc
index b1975d32..4e4b9bc1 100644
--- a/components/sync_bookmarks/bookmark_local_data_batch_uploader_unittest.cc
+++ b/components/sync_bookmarks/bookmark_local_data_batch_uploader_unittest.cc
@@ -7,6 +7,7 @@
 #include <memory>
 #include <utility>
 
+#include "base/test/metrics/histogram_tester.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/test/test_future.h"
 #include "components/bookmarks/browser/bookmark_model.h"
@@ -365,6 +366,8 @@
 // LocalBookmarkModelMerger, this test only checks the communication between the
 // 2 layers.
 TEST_F(BookmarkLocalDataBatchUploaderTest, MigrationUploadsLocalBookmarks) {
+  base::HistogramTester histogram_tester;
+
   bookmark_model()->LoadEmptyForTest();
   bookmark_model()->CreateAccountPermanentFolders();
   bookmark_model()->AddURL(bookmark_model()->bookmark_bar_node(),
@@ -384,6 +387,15 @@
                           MatchesTitleAndUrl(u"Local", "http://local.com/")));
   EXPECT_THAT(bookmark_model()->account_mobile_node()->children(), IsEmpty());
   EXPECT_THAT(bookmark_model()->account_other_node()->children(), IsEmpty());
+
+  histogram_tester.ExpectTotalCount("Bookmarks.BatchUploadDuration", 1);
+  histogram_tester.ExpectUniqueSample(
+      "Bookmarks.BatchUploadOutcomeAccountNodes",
+      /*sample=*/2,
+      /*expected_bucket_count=*/1);
+  histogram_tester.ExpectUniqueSample("Bookmarks.BatchUploadOutcomeRatio",
+                                      /*sample=*/100,
+                                      /*expected_bucket_count=*/1);
 }
 
 }  // namespace
diff --git a/components/webdata/common/web_database.cc b/components/webdata/common/web_database.cc
index 18c8bbb4..9d81c33 100644
--- a/components/webdata/common/web_database.cc
+++ b/components/webdata/common/web_database.cc
@@ -94,7 +94,9 @@
 }
 
 WebDatabaseTable* WebDatabase::GetTable(WebDatabaseTable::TypeKey key) {
-  return tables_[key];
+  WebDatabaseTable* table = tables_[key];
+  CHECK(table);
+  return table;
 }
 
 void WebDatabase::BeginTransaction() {
diff --git a/content/browser/devtools/protocol/page_handler.cc b/content/browser/devtools/protocol/page_handler.cc
index ea4e9fe..0667e5e 100644
--- a/content/browser/devtools/protocol/page_handler.cc
+++ b/content/browser/devtools/protocol/page_handler.cc
@@ -1232,7 +1232,8 @@
 
   if (capture_beyond_viewport.value_or(false)) {
     pending_request->original_web_prefs =
-        host_->render_view_host()->GetDelegate()->GetOrCreateWebPreferences();
+        host_->render_view_host()->GetDelegate()->GetOrCreateWebPreferences(
+            host_->render_view_host());
     const blink::web_pref::WebPreferences& original_web_prefs =
         *pending_request->original_web_prefs;
     blink::web_pref::WebPreferences modified_web_prefs = original_web_prefs;
diff --git a/content/browser/fenced_frame/fenced_frame_browsertest.cc b/content/browser/fenced_frame/fenced_frame_browsertest.cc
index bb22d63..a55dbb3 100644
--- a/content/browser/fenced_frame/fenced_frame_browsertest.cc
+++ b/content/browser/fenced_frame/fenced_frame_browsertest.cc
@@ -2467,7 +2467,8 @@
          {blink::features::kFencedFramesAutomaticBeaconCredentials, {}},
          {blink::features::kFencedFramesLocalUnpartitionedDataAccess, {}},
          {blink::features::kFencedFramesCrossOriginEventReporting, {}},
-         {blink::features::kFencedFramesReportEventHeaderChanges, {}}},
+         {blink::features::kFencedFramesReportEventHeaderChanges, {}},
+         {blink::features::kFencedFramesCrossOriginAutomaticBeaconData, {}}},
         {/* disabled_features */});
   }
 
@@ -4066,8 +4067,9 @@
 class InsecureContentTestContentBrowserClient
     : public ContentBrowserTestContentBrowserClient {
  public:
-  void OverrideWebkitPrefs(WebContents* web_contents,
-                           blink::web_pref::WebPreferences* prefs) override {
+  void OverrideWebPreferences(WebContents* web_contents,
+                              SiteInstance& main_frame_site,
+                              blink::web_pref::WebPreferences* prefs) override {
     // Browser will both run and display insecure content.
     prefs->allow_running_insecure_content = true;
   }
@@ -8784,7 +8786,8 @@
                    JsReplace(R"(
               window.fence.setReportEventDataForAutomaticBeacons({
                 eventType: $1,
-                destination: $2
+                destination: $2,
+                crossOriginExposed: true,
               });
             )",
                              config.beacon_type.name, destination_list.Clone()),
@@ -8801,7 +8804,8 @@
               window.fence.setReportEventDataForAutomaticBeacons({
                 eventType: $1,
                 eventData: $2,
-                destination: $3
+                destination: $3,
+                crossOriginExposed: true,
               });
             )",
                              config.beacon_type.name, config.message.value(),
@@ -9100,7 +9104,7 @@
 }
 
 IN_PROC_BROWSER_TEST_P(FencedFrameAutomaticBeaconBrowserTest,
-                       CrossOriginToMappedURL) {
+                       CrossOriginToMappedURLWithoutOptIn) {
   Config config = {
       .starting_url = {"a.test", "/fenced_frames/title1.html"},
       .secondary_initiator_url = {"c.test", "/fenced_frames/title1.html"},
diff --git a/content/browser/guest_page_holder_impl.cc b/content/browser/guest_page_holder_impl.cc
index b0bf45b..30fd66d3 100644
--- a/content/browser/guest_page_holder_impl.cc
+++ b/content/browser/guest_page_holder_impl.cc
@@ -112,7 +112,7 @@
   return frame_tree_.controller();
 }
 
-RenderFrameHost* GuestPageHolderImpl::GetGuestMainFrame() {
+RenderFrameHostImpl* GuestPageHolderImpl::GetGuestMainFrame() {
   return frame_tree_.root()->current_frame_host();
 }
 
@@ -243,6 +243,15 @@
   return renderer_preferences_;
 }
 
+const blink::web_pref::WebPreferences&
+GuestPageHolderImpl::GetWebPreferences() {
+  if (!web_preferences_) {
+    web_preferences_ = std::make_unique<blink::web_pref::WebPreferences>(
+        owner_web_contents_->ComputeWebPreferences(GetGuestMainFrame()));
+  }
+  return *web_preferences_;
+}
+
 GuestPageHolderImpl* GuestPageHolderImpl::FromRenderFrameHost(
     RenderFrameHostImpl& render_frame_host) {
   // Escape fenced frames, looking at the outermost main frame (not escaping
diff --git a/content/browser/guest_page_holder_impl.h b/content/browser/guest_page_holder_impl.h
index 86431c1..e168b05 100644
--- a/content/browser/guest_page_holder_impl.h
+++ b/content/browser/guest_page_holder_impl.h
@@ -42,7 +42,7 @@
 
   // GuestPageHolder implementation.
   NavigationController& GetController() override;
-  RenderFrameHost* GetGuestMainFrame() override;
+  RenderFrameHostImpl* GetGuestMainFrame() override;
   bool IsAudioMuted() override;
   void SetAudioMuted(bool mute) override;
   RenderFrameHost* GetOpener() override;
@@ -77,6 +77,7 @@
   void SetAudioMutedFromWebContents(bool web_contents_muted);
 
   const blink::RendererPreferences& GetRendererPrefs();
+  const blink::web_pref::WebPreferences& GetWebPreferences();
 
   FrameTree* CreateNewWindow(WindowOpenDisposition disposition,
                              const GURL& url,
@@ -102,6 +103,7 @@
   bool audio_muted_ = false;
 
   blink::RendererPreferences renderer_preferences_;
+  std::unique_ptr<blink::web_pref::WebPreferences> web_preferences_;
 
   base::RepeatingClosureList load_stop_callbacks_for_testing_;
 
diff --git a/content/browser/interest_group/ad_auction_headers_util.cc b/content/browser/interest_group/ad_auction_headers_util.cc
index 4bfa5e8..19bb4bc 100644
--- a/content/browser/interest_group/ad_auction_headers_util.cc
+++ b/content/browser/interest_group/ad_auction_headers_util.cc
@@ -42,6 +42,7 @@
 
 const char kAdAuctionRequestHeaderKey[] = "Sec-Ad-Auction-Fetch";
 const char kAdAuctionResultResponseHeaderKey[] = "Ad-Auction-Result";
+const char kAdAuctionResultNonceResponseHeaderKey[] = "Ad-Auction-Result-Nonce";
 const char kAdAuctionSignalsResponseHeaderKey[] = "Ad-Auction-Signals";
 const char kAdAuctionAdditionalBidResponseHeaderKey[] =
     "Ad-Auction-Additional-Bid";
@@ -203,6 +204,26 @@
 // this function simple and avoid adding custom logic.
 //
 // Fuzzer: ad_auction_headers_util_fuzzer
+std::vector<std::string> ParseAdAuctionResultNonceResponseHeader(
+    const std::string& ad_auction_result_nonces) {
+  std::vector<std::string> parsed_results;
+  for (const auto& result :
+       base::SplitString(ad_auction_result_nonces, ",", base::TRIM_WHITESPACE,
+                         base::SPLIT_WANT_NONEMPTY)) {
+    base::Uuid result_uuid = base::Uuid::ParseCaseInsensitive(result);
+    if (!result_uuid.is_valid()) {
+      continue;
+    }
+    parsed_results.emplace_back(result_uuid.AsLowercaseString());
+  }
+  return parsed_results;
+}
+
+// Please note: before modifying this function, please acknowledge this is
+// processing untrusted content from a non sandboxed process. So please keep
+// this function simple and avoid adding custom logic.
+//
+// Fuzzer: ad_auction_headers_util_fuzzer
 base::expected<void, std::string> ParseAdAuctionAdditionalBidResponseHeader(
     const std::string& header_line,
     std::map<std::string, std::vector<SignedAdditionalBidWithMetadata>>&
@@ -319,6 +340,20 @@
   }
   // We intentionally leave the `Ad-Auction-Result` response header in place.
 
+  if (base::FeatureList::IsEnabled(
+          features::kFledgeBiddingAndAuctionNonceSupport)) {
+    if (std::optional<std::string> ad_auction_results =
+            headers->GetNormalizedHeader(
+                kAdAuctionResultNonceResponseHeaderKey)) {
+      for (const std::string& nonce :
+           ParseAdAuctionResultNonceResponseHeader(*ad_auction_results)) {
+        ad_auction_page_data->AddAuctionResultNonceWitnessForOrigin(
+            request_origin, nonce);
+      }
+    }
+  }
+  headers->RemoveHeader(kAdAuctionResultNonceResponseHeaderKey);
+
   if (base::FeatureList::IsEnabled(blink::features::kAdAuctionSignals)) {
     if (std::optional<std::string> ad_auction_signals =
             headers->GetNormalizedHeader(kAdAuctionSignalsResponseHeaderKey)) {
@@ -360,6 +395,7 @@
     return;
   }
   // We intentionally leave the `Ad-Auction-Result` response header in place.
+  headers->RemoveHeader(kAdAuctionResultNonceResponseHeaderKey);
   headers->RemoveHeader(kAdAuctionSignalsResponseHeaderKey);
   headers->RemoveHeader(kAdAuctionAdditionalBidResponseHeaderKey);
 }
diff --git a/content/browser/interest_group/ad_auction_headers_util.h b/content/browser/interest_group/ad_auction_headers_util.h
index 0c2df869..812727a 100644
--- a/content/browser/interest_group/ad_auction_headers_util.h
+++ b/content/browser/interest_group/ad_auction_headers_util.h
@@ -39,9 +39,10 @@
 // signals, and additional bids from their associated response headers.
 extern const char kAdAuctionRequestHeaderKey[];
 
-// Response header keys associated with auction result, signals, and
+// Response header keys associated with auction result, nonce, signals, and
 // additional bids, respectively.
 extern const char CONTENT_EXPORT kAdAuctionResultResponseHeaderKey[];
+extern const char CONTENT_EXPORT kAdAuctionResultNonceResponseHeaderKey[];
 extern const char CONTENT_EXPORT kAdAuctionSignalsResponseHeaderKey[];
 extern const char CONTENT_EXPORT kAdAuctionAdditionalBidResponseHeaderKey[];
 
@@ -75,6 +76,15 @@
 // NOTE: Exposed only for fuzz testing. This is used by
 // `ProcessAdAuctionResponseHeaders`, declared below.
 //
+// Splits and parses the `Ad-Auction-Result-Nonce` response header,
+// and returns the results. This function processes untrusted content, in an
+// unsafe language, from an unsandboxed process, hence the fuzz test coverage.
+CONTENT_EXPORT std::vector<std::string> ParseAdAuctionResultNonceResponseHeader(
+    const std::string& ad_auction_result_nonces);
+
+// NOTE: Exposed only for fuzz testing. This is used by
+// `ProcessAdAuctionResponseHeaders`, declared below.
+//
 // Splits and validates the `Ad-Auction-Additional-Bid` response header,
 // and inserts the resulting additional bids into the provided map. This
 // function processes untrusted content, in an unsafe language, from an
diff --git a/content/browser/interest_group/ad_auction_headers_util_unittest.cc b/content/browser/interest_group/ad_auction_headers_util_unittest.cc
index 855e0be..02f03cb 100644
--- a/content/browser/interest_group/ad_auction_headers_util_unittest.cc
+++ b/content/browser/interest_group/ad_auction_headers_util_unittest.cc
@@ -39,6 +39,8 @@
 
 constexpr char kLegitimateAdAuctionResponse[] =
     "ungWv48Bz-pBQUDeXa4iI7ADYaOWF3qctBD_YfIAFa0=";
+constexpr char kLegitimateAdAuctionNonceResponse[] =
+    "00000000-0000-0000-0000-000000000000";
 constexpr char kLegitimateAdAuctionSignals[] =
     R"([{"adSlot":"slot1", "sellerSignals":{"signal1":"value1"}}])";
 
@@ -357,6 +359,17 @@
                                                                  response);
   }
 
+  bool WitnessedAuctionResultNonceForOrigin(const url::Origin& origin,
+                                            const std::string& nonce) {
+    Page& page = web_contents()->GetPrimaryPage();
+
+    AdAuctionPageData* ad_auction_page_data =
+        PageUserData<AdAuctionPageData>::GetOrCreateForPage(page);
+
+    return ad_auction_page_data->WitnessedAuctionResultNonceForOrigin(origin,
+                                                                      nonce);
+  }
+
   const scoped_refptr<HeaderDirectFromSellerSignals::Result>
   ParseAndFindAdAuctionSignals(const url::Origin& origin,
                                const std::string& ad_slot) {
@@ -414,15 +427,15 @@
   headers_builder.AddHeader(kAdAuctionResultResponseHeaderKey, "alsoInvalid");
   scoped_refptr<net::HttpResponseHeaders> headers = headers_builder.Build();
 
-  // Unlike the signals and additional bid headers, the result header is not
-  // removed when it's stored in the browser.
-  EXPECT_TRUE(headers->HasHeader(kAdAuctionResultResponseHeaderKey));
-
   ProcessAdAuctionResponseHeaders(
       url::Origin::Create(GURL("https://foo1.com")),
       *static_cast<RenderFrameHostImpl*>(web_contents()->GetPrimaryMainFrame()),
       headers);
 
+  // Unlike the signals and additional bid headers, the result header is not
+  // removed when it's stored in the browser.
+  EXPECT_TRUE(headers->HasHeader(kAdAuctionResultResponseHeaderKey));
+
   EXPECT_TRUE(WitnessedAuctionResultForOrigin(
       url::Origin::Create(GURL("https://foo1.com")),
       Base64UrlDecode(kLegitimateAdAuctionResponse)));
@@ -443,16 +456,89 @@
                             "invalid-response-header");
   scoped_refptr<net::HttpResponseHeaders> headers = headers_builder.Build();
 
+  ProcessAdAuctionResponseHeaders(
+      url::Origin::Create(GURL("https://foo1.com")),
+      *static_cast<RenderFrameHostImpl*>(web_contents()->GetPrimaryMainFrame()),
+      headers);
+
   // Unlike the signals and additional bid headers, the result header is not
   // removed when it's stored in the browser.
   EXPECT_TRUE(headers->HasHeader(kAdAuctionResultResponseHeaderKey));
 
+  EXPECT_FALSE(WitnessedAuctionResultForOrigin(
+      url::Origin::Create(GURL("https://foo1.com")),
+      "invalid-response-header"));
+}
+
+class ProcessAdAuctionNonceResponseHeadersTest
+    : public ProcessAdAuctionResponseHeadersTest {
+ public:
+  ProcessAdAuctionNonceResponseHeadersTest() {
+    scoped_feature_list_.InitAndEnableFeature(
+        features::kFledgeBiddingAndAuctionNonceSupport);
+  }
+
+ private:
+  base::test::ScopedFeatureList scoped_feature_list_;
+};
+
+TEST_F(ProcessAdAuctionNonceResponseHeadersTest,
+       MultipleAdAuctionResultNonces_AllWitnessed) {
+  const char kLegitimateAdAuctionNonceResponse2[] =
+      "1000000A-0000-0000-0000-000000000000";
+  const char kLegitimateAdAuctionNonceResponse3[] =
+      "2000000b-0000-0000-0000-000000000000";
+
+  net::HttpResponseHeaders::Builder headers_builder({1, 1}, "200 OK");
+  headers_builder.AddHeader(kAdAuctionResultNonceResponseHeaderKey,
+                            kLegitimateAdAuctionNonceResponse);
+  std::string concatenated_header =
+      base::StrCat({kLegitimateAdAuctionNonceResponse2, ",", "invalid", ",",
+                    kLegitimateAdAuctionNonceResponse3});
+  headers_builder.AddHeader(kAdAuctionResultNonceResponseHeaderKey,
+                            concatenated_header);
+  headers_builder.AddHeader(kAdAuctionResultNonceResponseHeaderKey,
+                            "alsoInvalid");
+  scoped_refptr<net::HttpResponseHeaders> headers = headers_builder.Build();
+
   ProcessAdAuctionResponseHeaders(
       url::Origin::Create(GURL("https://foo1.com")),
       *static_cast<RenderFrameHostImpl*>(web_contents()->GetPrimaryMainFrame()),
       headers);
 
-  EXPECT_FALSE(WitnessedAuctionResultForOrigin(
+  // The result nonce header is removed when it's stored in the browser.
+  EXPECT_FALSE(headers->HasHeader(kAdAuctionResultNonceResponseHeaderKey));
+
+  EXPECT_TRUE(WitnessedAuctionResultNonceForOrigin(
+      url::Origin::Create(GURL("https://foo1.com")),
+      kLegitimateAdAuctionNonceResponse));
+
+  EXPECT_TRUE(WitnessedAuctionResultNonceForOrigin(
+      url::Origin::Create(GURL("https://foo1.com")),
+      // lower-case version of kLegitimateAdAuctionNonceResponse2
+      "1000000a-0000-0000-0000-000000000000"));
+
+  EXPECT_TRUE(WitnessedAuctionResultNonceForOrigin(
+      url::Origin::Create(GURL("https://foo1.com")),
+      kLegitimateAdAuctionNonceResponse3));
+}
+
+TEST_F(ProcessAdAuctionNonceResponseHeadersTest,
+       InvalidAdAuctionResultNonceResponseHeader) {
+  net::HttpResponseHeaders::Builder headers_builder({1, 1}, "200 OK");
+  headers_builder.AddHeader(kAdAuctionResultNonceResponseHeaderKey,
+                            "invalid-response-header");
+  scoped_refptr<net::HttpResponseHeaders> headers = headers_builder.Build();
+
+  ProcessAdAuctionResponseHeaders(
+      url::Origin::Create(GURL("https://foo1.com")),
+      *static_cast<RenderFrameHostImpl*>(web_contents()->GetPrimaryMainFrame()),
+      headers);
+
+  // The result header is not removed when it's stored in the browser.
+  EXPECT_FALSE(headers->HasHeader(kAdAuctionResultNonceResponseHeaderKey));
+
+  EXPECT_FALSE(WitnessedAuctionResultNonceForOrigin(
       url::Origin::Create(GURL("https://foo1.com")),
       "invalid-response-header"));
 }
@@ -849,6 +935,8 @@
   net::HttpResponseHeaders::Builder headers_builder({1, 1}, "200 OK");
   headers_builder.AddHeader(kAdAuctionResultResponseHeaderKey,
                             kLegitimateAdAuctionResponse);
+  headers_builder.AddHeader(kAdAuctionResultNonceResponseHeaderKey,
+                            kLegitimateAdAuctionNonceResponse);
   headers_builder.AddHeader(kAdAuctionSignalsResponseHeaderKey,
                             R"([{"adSlot":"slot1"}])");
   headers_builder.AddHeader(kAdAuctionAdditionalBidResponseHeaderKey,
@@ -857,8 +945,9 @@
 
   RemoveAdAuctionResponseHeaders(headers);
 
-  // Only the signals and additional bid headers are removed.
+  // Only the nonce, signals and additional bid headers are removed.
   EXPECT_TRUE(headers->HasHeader(kAdAuctionResultResponseHeaderKey));
+  EXPECT_FALSE(headers->HasHeader(kAdAuctionResultNonceResponseHeaderKey));
   EXPECT_FALSE(headers->HasHeader(kAdAuctionSignalsResponseHeaderKey));
   EXPECT_FALSE(headers->HasHeader(kAdAuctionAdditionalBidResponseHeaderKey));
 }
diff --git a/content/browser/interest_group/ad_auction_page_data.cc b/content/browser/interest_group/ad_auction_page_data.cc
index 98e9f76c..3c21593 100644
--- a/content/browser/interest_group/ad_auction_page_data.cc
+++ b/content/browser/interest_group/ad_auction_page_data.cc
@@ -51,6 +51,23 @@
   return it->second.contains(response);
 }
 
+void AdAuctionPageData::AddAuctionResultNonceWitnessForOrigin(
+    const url::Origin& origin,
+    const std::string& nonce) {
+  origin_auction_result_nonce_map_[origin].insert(nonce);
+}
+
+bool AdAuctionPageData::WitnessedAuctionResultNonceForOrigin(
+    const url::Origin& origin,
+    const std::string& nonce) const {
+  auto it = origin_auction_result_nonce_map_.find(origin);
+  if (it == origin_auction_result_nonce_map_.end()) {
+    return false;
+  }
+
+  return it->second.contains(nonce);
+}
+
 void AdAuctionPageData::AddAuctionSignalsWitnessForOrigin(
     const url::Origin& origin,
     const std::string& response) {
diff --git a/content/browser/interest_group/ad_auction_page_data.h b/content/browser/interest_group/ad_auction_page_data.h
index 9c629b2..767fcc8 100644
--- a/content/browser/interest_group/ad_auction_page_data.h
+++ b/content/browser/interest_group/ad_auction_page_data.h
@@ -92,6 +92,12 @@
   bool WitnessedAuctionResultForOrigin(const url::Origin& origin,
                                        const std::string& response) const;
 
+  void AddAuctionResultNonceWitnessForOrigin(const url::Origin& origin,
+                                             const std::string& nonce);
+
+  bool WitnessedAuctionResultNonceForOrigin(const url::Origin& origin,
+                                            const std::string& nonce) const;
+
   void AddAuctionSignalsWitnessForOrigin(const url::Origin& origin,
                                          const std::string& response);
 
@@ -136,6 +142,7 @@
       std::vector<std::string> errors);
 
   std::map<url::Origin, std::set<std::string>> origin_auction_result_map_;
+  std::map<url::Origin, std::set<std::string>> origin_auction_result_nonce_map_;
   HeaderDirectFromSellerSignals header_direct_from_seller_signals_;
   std::map<url::Origin,
            std::map<std::string, std::vector<SignedAdditionalBidWithMetadata>>>
diff --git a/content/browser/interest_group/auction_runner.cc b/content/browser/interest_group/auction_runner.cc
index 347d612..fc95413 100644
--- a/content/browser/interest_group/auction_runner.cc
+++ b/content/browser/interest_group/auction_runner.cc
@@ -377,19 +377,14 @@
     return;
   }
   config->server_response->got_response = true;
-  AdAuctionPageData* page_data = ad_auction_page_data_callback_.Run();
-  if (!page_data) {
-    // There's no page data attached so we can't decode the response. There's
-    // no way the auction can proceed.
-    FailAuction(false);
-    return;
-  }
 
   if (auction_id->is_main_auction()) {
-    auction_.HandleServerResponse(std::move(response), *page_data);
+    auction_.HandleServerResponse(std::move(response),
+                                  ad_auction_page_data_callback_);
   } else {
     auction_.HandleComponentServerResponse(auction_id->get_component_auction(),
-                                           std::move(response), *page_data);
+                                           std::move(response),
+                                           ad_auction_page_data_callback_);
   }
 }
 
diff --git a/content/browser/interest_group/bidding_and_auction_response.cc b/content/browser/interest_group/bidding_and_auction_response.cc
index 0e989ef1..9265b3f 100644
--- a/content/browser/interest_group/bidding_and_auction_response.cc
+++ b/content/browser/interest_group/bidding_and_auction_response.cc
@@ -11,6 +11,7 @@
 #include "base/containers/adapters.h"
 #include "base/containers/flat_map.h"
 #include "base/feature_list.h"
+#include "base/uuid.h"
 #include "base/values.h"
 #include "content/browser/interest_group/interest_group_features.h"
 #include "content/browser/interest_group/interest_group_pa_report_util.h"
@@ -105,6 +106,17 @@
     return std::nullopt;
   }
 
+  if (base::FeatureList::IsEnabled(
+          features::kFledgeBiddingAndAuctionNonceSupport)) {
+    const std::string* nonce = input_dict->FindString("nonce");
+    if (nonce) {
+      base::Uuid nonce_uuid = base::Uuid::ParseCaseInsensitive(*nonce);
+      if (nonce_uuid.is_valid()) {
+        output.nonce = nonce_uuid.AsLowercaseString();
+      }
+    }
+  }
+
   base::Value::Dict* error_struct = input_dict->FindDict("error");
   if (error_struct) {
     std::string* message = error_struct->FindString("message");
diff --git a/content/browser/interest_group/bidding_and_auction_response.h b/content/browser/interest_group/bidding_and_auction_response.h
index f1424b5..fb8d7618 100644
--- a/content/browser/interest_group/bidding_and_auction_response.h
+++ b/content/browser/interest_group/bidding_and_auction_response.h
@@ -169,6 +169,10 @@
   // auctions start the bidding phase.
   AuctionResult result = AuctionResult::kInvalidServerResponse;
 
+  // Nonce used to match against the Ad-Auction-Result-Nonce header in a fetch
+  // response from the seller.
+  std::optional<std::string> nonce;
+
   bool is_chaff = false;  // indicates this response should be ignored.
   // TODO(behamilton): Add support for creative dimensions to the response from
   // the Bidding and Auction server.
diff --git a/content/browser/interest_group/bidding_and_auction_response_unittest.cc b/content/browser/interest_group/bidding_and_auction_response_unittest.cc
index 2ebbc03..0f64cc1 100644
--- a/content/browser/interest_group/bidding_and_auction_response_unittest.cc
+++ b/content/browser/interest_group/bidding_and_auction_response_unittest.cc
@@ -108,6 +108,7 @@
 std::ostream& operator<<(std::ostream& os,
                          const BiddingAndAuctionResponse& response) {
   os << "BiddingAndAuctionResponse(";
+  os << "nonce: " << testing::PrintToString(response.nonce) << ",";
   os << "is_chaff: " << (response.is_chaff ? "true" : "false") << ", ";
   os << "ad_render_url: " << response.ad_render_url << ", ";
   os << "ad_components: [";
@@ -483,6 +484,7 @@
           "EqualsBiddingAndAuctionResponse(" +
               testing::PrintToString(other.get()) + ")") {
   std::vector<testing::Matcher<BiddingAndAuctionResponse>> matchers = {
+      // nonce handled below
       testing::Field("is_chaff", &BiddingAndAuctionResponse::is_chaff,
                      testing::Eq(other.get().is_chaff)),
       testing::Field("ad_render_url", &BiddingAndAuctionResponse::ad_render_url,
@@ -543,6 +545,14 @@
                      testing::Eq(other.get().triggered_updates)),
 
   };
+  if (other.get().nonce) {
+    matchers.push_back(testing::Field("nonce",
+                                      &BiddingAndAuctionResponse::nonce,
+                                      testing::Optional(*other.get().nonce)));
+  } else {
+    matchers.push_back(testing::Field(
+        "nonce", &BiddingAndAuctionResponse::nonce, testing::Eq(std::nullopt)));
+  }
   if (other.get().bid_currency) {
     matchers.push_back(
         testing::Field("bid_currency", &BiddingAndAuctionResponse::bid_currency,
@@ -667,8 +677,10 @@
 
 TEST(BiddingAndAuctionResponseTest, ParseSucceeds) {
   base::test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.InitAndEnableFeature(
-      features::kEnableBandATriggeredUpdates);
+  scoped_feature_list.InitWithFeatures(
+      /*enabled_features=*/{features::kEnableBandATriggeredUpdates,
+                            features::kFledgeBiddingAndAuctionNonceSupport},
+      /*disabled_features=*/{});
   static const struct {
     base::Value input;
     BiddingAndAuctionResponse output;
@@ -697,6 +709,32 @@
           CreateExpectedValidResponse(),
       },
       {
+          // Ignore nonce with wrong type
+          base::Value(CreateValidResponseDict().Set("nonce", 0)),
+          CreateExpectedValidResponse(),
+      },
+      {
+          // Ignore invalid nonce
+          base::Value(CreateValidResponseDict().Set("nonce", "not a UUID")),
+          CreateExpectedValidResponse(),
+      },
+      {// Nonce with valid message
+       base::Value(CreateValidResponseDict().Set(
+           "nonce", "00000000-0000-0000-0000-000000000000")),
+       []() {
+         auto response = CreateExpectedValidResponse();
+         response.nonce = "00000000-0000-0000-0000-000000000000";
+         return response;
+       }()},
+      {// Nonce converted to lowercase
+       base::Value(CreateValidResponseDict().Set(
+           "nonce", "A0000000-0000-0000-0000-000000000000")),
+       []() {
+         auto response = CreateExpectedValidResponse();
+         response.nonce = "a0000000-0000-0000-0000-000000000000";
+         return response;
+       }()},
+      {
           base::Value(CreateValidResponseDict().Set("error", "not a dict")),
           CreateExpectedValidResponse(),
       },
diff --git a/content/browser/interest_group/interest_group_auction.cc b/content/browser/interest_group/interest_group_auction.cc
index 7efa4d51..6da3772 100644
--- a/content/browser/interest_group/interest_group_auction.cc
+++ b/content/browser/interest_group/interest_group_auction.cc
@@ -3347,7 +3347,8 @@
 void InterestGroupAuction::HandleComponentServerResponse(
     uint32_t pos,
     mojo_base::BigBuffer response,
-    AdAuctionPageData& ad_auction_page_data) {
+    base::RepeatingCallback<AdAuctionPageData*()>
+        ad_auction_page_data_callback) {
   CHECK(!parent_);  // Should not be called on a component.
   auto it = component_auctions_.find(pos);
 
@@ -3358,14 +3359,16 @@
   }
 
   InterestGroupAuction* component_auction = it->second.get();
-  component_auction->HandleServerResponse(std::move(response),
-                                          ad_auction_page_data);
+  component_auction->HandleServerResponse(
+      std::move(response), std::move(ad_auction_page_data_callback));
 }
 
 void InterestGroupAuction::HandleServerResponse(
     mojo_base::BigBuffer response,
-    AdAuctionPageData& ad_auction_page_data) {
-  if (!HandleServerResponseImpl(std::move(response), ad_auction_page_data)) {
+    base::RepeatingCallback<AdAuctionPageData*()>
+        ad_auction_page_data_callback) {
+  if (!HandleServerResponseImpl(std::move(response),
+                                std::move(ad_auction_page_data_callback))) {
     DCHECK(saved_response_);
     if (bidding_and_scoring_phase_state_ == PhaseState::kDuring) {
       MaybeCompleteBiddingAndScoringPhase();
@@ -3375,25 +3378,26 @@
 
 bool InterestGroupAuction::HandleServerResponseImpl(
     mojo_base::BigBuffer response,
-    AdAuctionPageData& ad_auction_page_data) {
+    base::RepeatingCallback<AdAuctionPageData*()>
+        ad_auction_page_data_callback) {
+  bool authorized = false;
   // Check that response was witnessed by seller origin.
   std::array<uint8_t, crypto::kSHA256Length> hash =
       crypto::SHA256Hash(response);
-  if (!ad_auction_page_data.WitnessedAuctionResultForOrigin(
+  AdAuctionPageData* ad_auction_page_data = ad_auction_page_data_callback.Run();
+  if (!ad_auction_page_data) {
+    // The page is in the process of being destroyed, so fail the auction.
+    saved_response_.emplace();
+    return false;
+  }
+  if (ad_auction_page_data->WitnessedAuctionResultForOrigin(
           config_->seller,
           std::string(reinterpret_cast<char*>(hash.data()), hash.size()))) {
-    // If it wasn't witnessed then we don't know that it came from the server.
-    saved_response_.emplace();
-    base::UmaHistogramEnumeration(kInvalidServerResponseReasonUMAName,
-                                  InvalidServerResponseReason::kNotWitnessed);
-    errors_.push_back(
-        base::StrCat({"runAdAuction(): Server response was not witnessed from ",
-                      config_->seller.Serialize()}));
-    return false;
+    authorized = true;
   }
 
   AdAuctionRequestContext* request_context =
-      ad_auction_page_data.GetContextForAdAuctionRequest(
+      ad_auction_page_data->GetContextForAdAuctionRequest(
           ContextMapKey(config_->server_response->request_id, config_->seller));
   if (!request_context) {
     // The corresponding context for the requested blob couldn't be found.
@@ -3412,14 +3416,6 @@
   CHECK_EQ(request_context->seller, config_->seller);
   get_ad_auction_data_start_time_ = request_context->start_time;
 
-  // Trigger updates for buyers in the auction config.
-  if (config_->non_shared_params.interest_group_buyers.has_value()) {
-    const std::vector<url::Origin>& buyers =
-        config_->non_shared_params.interest_group_buyers.value();
-    post_auction_update_owners_.insert(post_auction_update_owners_.end(),
-                                       buyers.begin(), buyers.end());
-  }
-
   auto maybe_response =
       quiche::ObliviousHttpResponse::CreateClientObliviousResponse(
           std::string(reinterpret_cast<char*>(response.data()),
@@ -3467,7 +3463,8 @@
           // by a PageUserData and is only deleted when the page is destroyed.
           // This auction is owned by the page through a DocumentService, so it
           // will be destroyed before the decoder.
-          weak_ptr_factory_.GetWeakPtr(), base::Unretained(request_context)));
+          weak_ptr_factory_.GetWeakPtr(), base::Unretained(request_context),
+          std::move(ad_auction_page_data_callback), authorized));
   return true;
 }
 
@@ -6139,6 +6136,8 @@
 
 void InterestGroupAuction::OnDecompressedServerResponse(
     AdAuctionRequestContext* request_context,
+    base::RepeatingCallback<AdAuctionPageData*()> ad_auction_page_data_callback,
+    bool authorized,
     base::expected<mojo_base::BigBuffer, std::string> result) {
   data_decoder::DataDecoder* data_decoder =
       get_data_decoder_callback_.Run(config_->seller);
@@ -6164,7 +6163,8 @@
           // by a PageUserData and is only deleted when the page is destroyed.
           // This auction is owned by the page through a DocumentService, so
           // it will be destroyed before the decoder.
-          base::Unretained(request_context)));
+          base::Unretained(request_context),
+          std::move(ad_auction_page_data_callback), authorized));
 
   // `result` falls out of scope, deallocating the buffer with the
   // decompressed response. This is okay because `DataDecoder::ParseCbor` made
@@ -6174,8 +6174,12 @@
 
 void InterestGroupAuction::OnParsedServerResponse(
     AdAuctionRequestContext* request_context,
+    base::RepeatingCallback<AdAuctionPageData*()> ad_auction_page_data_callback,
+    bool authorized,
     data_decoder::DataDecoder::ValueOrError result) {
-  if (!OnParsedServerResponseImpl(request_context, std::move(result))) {
+  if (!OnParsedServerResponseImpl(request_context,
+                                  std::move(ad_auction_page_data_callback),
+                                  authorized, std::move(result))) {
     DCHECK(saved_response_);
 
     if (bidding_and_scoring_phase_state_ == PhaseState::kDuring) {
@@ -6186,6 +6190,8 @@
 
 bool InterestGroupAuction::OnParsedServerResponseImpl(
     AdAuctionRequestContext* request_context,
+    base::RepeatingCallback<AdAuctionPageData*()> ad_auction_page_data_callback,
+    bool authorized,
     data_decoder::DataDecoder::ValueOrError result) {
   if (!result.has_value()) {
     // We couldn't parse the CBOR of the response.
@@ -6210,6 +6216,34 @@
         InvalidServerResponseReason::kUnexpectedResponseStructure);
     return false;
   }
+  AdAuctionPageData* ad_auction_page_data = ad_auction_page_data_callback.Run();
+  if (!ad_auction_page_data) {
+    // The page is in the process of being destroyed, so fail the auction.
+    saved_response_.emplace();
+    return false;
+  }
+  if (!authorized &&
+      (!response->nonce ||
+       !ad_auction_page_data->WitnessedAuctionResultNonceForOrigin(
+           config_->seller, *response->nonce))) {
+    // If it wasn't witnessed then we don't know that it came from the server.
+    saved_response_.emplace();
+    base::UmaHistogramEnumeration(kInvalidServerResponseReasonUMAName,
+                                  InvalidServerResponseReason::kNotWitnessed);
+    errors_.push_back(
+        base::StrCat({"runAdAuction(): Server response was not witnessed from ",
+                      config_->seller.Serialize()}));
+    return false;
+  }
+
+  // Trigger updates for buyers in the auction config.
+  if (config_->non_shared_params.interest_group_buyers.has_value()) {
+    const std::vector<url::Origin>& buyers =
+        config_->non_shared_params.interest_group_buyers.value();
+    post_auction_update_owners_.insert(post_auction_update_owners_.end(),
+                                       buyers.begin(), buyers.end());
+  }
+
   if (response->error) {
     errors_.push_back(base::StrCat({"runAdAuction(): ", *response->error}));
   }
@@ -6450,7 +6484,6 @@
 void InterestGroupAuction::CreateBidFromServerResponse() {
   DCHECK(saved_response_);
   DCHECK_EQ(PhaseState::kDuring, bidding_and_scoring_phase_state_);
-
   // We require a bid for component auctions. Otherwise we use a fake value.
   if (parent_ && !saved_response_->bid) {
     saved_response_->result = AuctionResult::kInvalidServerResponse;
diff --git a/content/browser/interest_group/interest_group_auction.h b/content/browser/interest_group/interest_group_auction.h
index 4353962..1babcc8 100644
--- a/content/browser/interest_group/interest_group_auction.h
+++ b/content/browser/interest_group/interest_group_auction.h
@@ -554,12 +554,15 @@
 
   // Handles the server response for an auction.
   void HandleServerResponse(mojo_base::BigBuffer response,
-                            AdAuctionPageData& ad_auction_page_data);
+                            base::RepeatingCallback<AdAuctionPageData*()>
+                                ad_auction_page_data_callback);
 
   // Handles a server response in a component auction.
-  void HandleComponentServerResponse(uint32_t pos,
-                                     mojo_base::BigBuffer response,
-                                     AdAuctionPageData& ad_auction_page_data);
+  void HandleComponentServerResponse(
+      uint32_t pos,
+      mojo_base::BigBuffer response,
+      base::RepeatingCallback<AdAuctionPageData*()>
+          ad_auction_page_data_callback);
 
   // Creates an InterestGroupAuctionReporter, after the auction has completed.
   // Takes ownership of the `auction_config`, so that the reporter can outlive
@@ -1257,19 +1260,29 @@
   // Returns false if we need to fail the auction instead of continuing in
   // OnDecompressedServerResponse.
   bool HandleServerResponseImpl(mojo_base::BigBuffer response,
-                                AdAuctionPageData& ad_auction_page_data);
+                                base::RepeatingCallback<AdAuctionPageData*()>
+                                    ad_auction_page_data_callback);
 
   void OnDecompressedServerResponse(
       AdAuctionRequestContext* request_context,
+      base::RepeatingCallback<AdAuctionPageData*()>
+          ad_auction_page_data_callback,
+      bool authorized,
       base::expected<mojo_base::BigBuffer, std::string> result);
 
   void OnParsedServerResponse(AdAuctionRequestContext* request_context,
+                              base::RepeatingCallback<AdAuctionPageData*()>
+                                  ad_auction_page_data_callback,
+                              bool authorized,
                               data_decoder::DataDecoder::ValueOrError result);
 
   // Returns false if we need to fail the auction instead of continuing in
   // OnLoadedWinningGroup.
   bool OnParsedServerResponseImpl(
       AdAuctionRequestContext* request_context,
+      base::RepeatingCallback<AdAuctionPageData*()>
+          ad_auction_page_data_callback,
+      bool authorized,
       data_decoder::DataDecoder::ValueOrError result);
 
   void OnLoadedWinningGroup(
diff --git a/content/browser/interest_group/interest_group_features.cc b/content/browser/interest_group/interest_group_features.cc
index fbce771..f099d6feb 100644
--- a/content/browser/interest_group/interest_group_features.cc
+++ b/content/browser/interest_group/interest_group_features.cc
@@ -42,6 +42,11 @@
              "EnableBandATriggeredUpdates",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
+// Enable response authorization using the Ad-Auction-Result-Nonce header.
+BASE_FEATURE(kFledgeBiddingAndAuctionNonceSupport,
+             "FledgeBiddingAndAuctionNonceSupport",
+             base::FEATURE_ENABLED_BY_DEFAULT);
+
 // Enable the user agent header in auction requests to be overridden.
 BASE_FEATURE(kFledgeEnableUserAgentOverrides,
              "FledgeEnableUserAgentOverrides",
diff --git a/content/browser/interest_group/interest_group_features.h b/content/browser/interest_group/interest_group_features.h
index 6b8da74..1d0b9ad 100644
--- a/content/browser/interest_group/interest_group_features.h
+++ b/content/browser/interest_group/interest_group_features.h
@@ -20,6 +20,8 @@
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kEnableBandASampleDebugReports);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kEnableBandATriggeredUpdates);
 
+CONTENT_EXPORT BASE_DECLARE_FEATURE(kFledgeBiddingAndAuctionNonceSupport);
+
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kFledgeEnableUserAgentOverrides);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kFledgeEnableWALForInterestGroupStorage);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kFledgeFacilitatedTestingSignalsHeaders);
diff --git a/content/browser/navigation_transitions/back_forward_transition_animation_manager_android_browsertest.cc b/content/browser/navigation_transitions/back_forward_transition_animation_manager_android_browsertest.cc
index 51828e5..7f013d7 100644
--- a/content/browser/navigation_transitions/back_forward_transition_animation_manager_android_browsertest.cc
+++ b/content/browser/navigation_transitions/back_forward_transition_animation_manager_android_browsertest.cc
@@ -12,6 +12,7 @@
 #include "base/test/bind.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/test/test_future.h"
+#include "base/time/time.h"
 #include "cc/slim/layer.h"
 #include "cc/slim/layer_tree.h"
 #include "cc/slim/layer_tree_impl.h"
@@ -86,12 +87,18 @@
 using AnimatorState = BackForwardTransitionAnimator::State;
 using enum BackForwardTransitionAnimator::State;
 
-// The tolerance for two float to be considered equal.
-static constexpr float kFloatTolerance = 0.001f;
+// The tolerance for floats from 0 to 1.0 to be considered equal, typically
+// representing percentages.
+static constexpr float kFloatTolerance = 0.005f;
+
+// The tolerance for floats representing pixel positions to be considered equal.
+static constexpr float kPixelFloatTolerance = 0.5f;
+
+static base::TimeTicks sTick = base::TimeTicks();
 
 #define EXPECT_X_TRANSLATION(expected, actual)                    \
   EXPECT_TRANSFORM_NEAR(ViewportTranslationX(expected), (actual), \
-                        kFloatTolerance)
+                        kPixelFloatTolerance)
 
 #define EXPECT_STATE_EQ(expected, actual)                                      \
   EXPECT_EQ(expected, actual)                                                  \
@@ -106,14 +113,8 @@
 // produce one frame: the frame for the final position.
 constexpr base::TimeDelta kLongDurationBetweenFrames = base::Seconds(99);
 
-// Test parameter to run tests either with default device-scale-factor==1 or a
-// fractional (1.333) device scale factor.
-enum class DSFMode { kOne, kFractional };
-
-// Test parameter to run tests with UI laid out both left to right and right
-// to left, the latter forces the back-edge to be flipped (i.e. right edge
-// uses an animated gesture).
-enum class UILayoutDirection { kLTR, kRTL };
+// The approximate time between OnAnimate calls for a 60Hz display.
+constexpr base::TimeDelta k60HzDuration = base::Milliseconds(16);
 
 static constexpr gfx::Transform kIdentityTransform;
 
@@ -131,13 +132,10 @@
          << "," << a.fA << "].";
 }
 
-// Color values with scrim for light/dark modes.
-// The scrim is calculated as follows: 0.65 * (1 - [percent] * 0.85)
-// For example, scrim at 30% is 0.65 * (1 - 0.3 * 0.85).
-static constexpr SkColor4f kScrimColorAtStart = {0, 0, 0, 0.65f};
-static constexpr SkColor4f kScrimColorAt30 = {0, 0, 0, 0.48425f};
-static constexpr SkColor4f kScrimColorAt60 = {0, 0, 0, 0.3185f};
-static constexpr SkColor4f kScrimColorAt90 = {0, 0, 0, 0.15275f};
+constexpr SkColor4f ScrimColorAt(float progress) {
+  return {0, 0, 0, 0.65f * (1.f - progress * .85f)};
+}
+static constexpr SkColor4f kScrimColorAtStart = ScrimColorAt(0.f);
 
 int64_t GetItemSequenceNumberForNavigation(
     NavigationHandle* navigation_handle) {
@@ -160,15 +158,18 @@
       NavigationEntryImpl* destination_entry,
       const SkBitmap& embedder_bitmap,
       BackForwardTransitionAnimationManagerAndroid* animation_manager)
-      : BackForwardTransitionAnimator(web_contents_view_android,
-                                      controller,
-                                      gesture,
-                                      nav_type,
-                                      initiating_edge,
-                                      destination_entry,
-                                      embedder_bitmap,
-                                      animation_manager),
-        wcva_(web_contents_view_android) {}
+      : BackForwardTransitionAnimator(
+            web_contents_view_android,
+            controller,
+            ui::BackGestureEvent(gesture.progress(), sTick),
+            nav_type,
+            initiating_edge,
+            destination_entry,
+            embedder_bitmap,
+            animation_manager),
+        wcva_(web_contents_view_android) {
+    sTick += k60HzDuration;
+  }
 
   ~AnimatorForTesting() override {
     if (on_impl_destroyed_) {
@@ -202,9 +203,8 @@
     if (next_on_animate_callback_) {
       std::move(next_on_animate_callback_).Run();
     }
-    static base::TimeTicks tick = base::TimeTicks();
-    tick += duration_between_frames_;
-    BackForwardTransitionAnimator::OnAnimate(tick);
+    BackForwardTransitionAnimator::OnAnimate(sTick);
+    sTick += duration_between_frames_;
   }
   void DirectlyCallOnAnimate(base::TimeTicks frame_time) {
     BackForwardTransitionAnimator::OnAnimate(frame_time);
@@ -270,10 +270,7 @@
     pause_on_animate_at_state_ = State::kDisplayingCrossFadeAnimation;
   }
 
-  void UnpauseAnimation() {
-    pause_on_animate_at_state_ = std::nullopt;
-    OnAnimate(base::TimeTicks{});
-  }
+  void ClearPauseAtState() { pause_on_animate_at_state_ = std::nullopt; }
 
   void set_intercept_render_frame_metadata_changed(bool intercept) {
     intercept_render_frame_metadata_changed_ = intercept;
@@ -457,6 +454,23 @@
         web_contents()->GetBackForwardTransitionAnimationManager());
   }
 
+  void GestureProgressWaitForAnimate(float progress) {
+    TestFuture<void> gesture_on_animate_call;
+    ASSERT_TRUE(GetAnimator());
+    GetAnimator()->set_next_on_animate_callback(
+        gesture_on_animate_call.GetCallback());
+    GetAnimationManager()->OnGestureProgressed(
+        ui::BackGestureEvent(progress, sTick));
+    EXPECT_TRUE(gesture_on_animate_call.Wait());
+  }
+
+  void UnpauseAnimation() {
+    GetAnimator()->ClearPauseAtState();
+    // Calling OnAnimate from the manager destroys the animator if it reaches a
+    // terminal state.
+    GetAnimationManager()->OnAnimate(base::TimeTicks());
+  }
+
   GURL RedURL() const { return embedded_test_server()->GetURL("/red.html"); }
 
   GURL GreenURL() const {
@@ -612,12 +626,29 @@
   base::test::ScopedFeatureList scoped_feature_list_;
 };
 
+// Test parameter to run tests either with default device-scale-factor==1 or a
+// fractional (1.333) device scale factor.
+enum class DSFMode { kOne, kFractional };
+
+// Test parameter to run tests with UI laid out both left to right and right
+// to left, the latter forces the back-edge to be flipped (i.e. right edge
+// uses an animated gesture).
+enum class UILayoutDirection { kLTR, kRTL };
+
+typedef std::tuple<UILayoutDirection, DSFMode> DirectionDSF;
+
+void PrintTo(const DirectionDSF& v, std::ostream* os) {
+  *os << base::StrCat(
+      {std::get<0>(v) == UILayoutDirection::kLTR ? "LTR" : "RTL",
+       std::get<1>(v) == DSFMode::kOne ? "" : "FractionalDSF"});
+}
+
 // Basic tests which will be run both with a swipe from the left edge as well as
 // a swipe from the right edge with an RTL UI direction. Tests from the right
 // edge also force the UI to use an RTL direction.
 class BackForwardTransitionAnimationManagerBothEdgeBrowserTest
     : public BackForwardTransitionAnimationManagerBrowserTest,
-      public WithParamInterface<std::tuple<UILayoutDirection, DSFMode>> {
+      public WithParamInterface<DirectionDSF> {
  public:
   BackForwardTransitionAnimationManagerBothEdgeBrowserTest() {
     scoped_feature_list_.Reset();
@@ -675,10 +706,11 @@
   GetAnimationManager()->OnGestureStarted(ui::BackGestureEvent(0), BackEdge(),
                                           NavType::kBackward);
   ASSERT_TRUE(GetAnimator());
+  GetAnimator()->set_duration_between_frames(k60HzDuration);
 
-  GetAnimationManager()->OnGestureProgressed(ui::BackGestureEvent(0.3));
-  GetAnimationManager()->OnGestureProgressed(ui::BackGestureEvent(0.6));
-  GetAnimationManager()->OnGestureProgressed(ui::BackGestureEvent(0.9));
+  GestureProgressWaitForAnimate(0.3);
+  GestureProgressWaitForAnimate(0.6);
+  GestureProgressWaitForAnimate(0.9);
 
   TestFrameNavigationObserver back_to_red(web_contents());
   {
@@ -716,7 +748,7 @@
                                           NavType::kBackward);
   ASSERT_TRUE(GetAnimator());
 
-  GetAnimationManager()->OnGestureProgressed(ui::BackGestureEvent(0.9));
+  GestureProgressWaitForAnimate(0.9f);
 
   {
     TestFuture<AnimatorState> destroyed;
@@ -749,14 +781,16 @@
 
   GetAnimationManager()->OnGestureStarted(ui::BackGestureEvent(0), BackEdge(),
                                           NavType::kBackward);
+  GetAnimator()->set_duration_between_frames(k60HzDuration);
 
   // The gesture should have created and attached a screenshot layer with a
   // child scrim layer, under the live page.
   ASSERT_EQ("[Screenshot[Scrim],LivePage]", ChildrenInOrder(*GetViewLayer()));
 
-  // In a back navigation, the screenshot starts off-screen in the direction the
-  // swipe is coming from and moves to the viewport origin. Therefore we expect
-  // it to be at `(1-progress) * initial_position` at all times.
+  // In a back navigation, the screenshot starts off-screen in the
+  // TestScreenshotTransformScrimColorForwardNavigationdirection the swipe is
+  // coming from and moves to the viewport origin. Therefore we expect it to be
+  // at `(1-progress) * initial_position` at all times.
   float initial_position = BackEdge() == SwipeEdge::LEFT
                                ? PhysicsModel::kScreenshotInitialPositionRatio
                                : -PhysicsModel::kScreenshotInitialPositionRatio;
@@ -765,39 +799,35 @@
       ColorsNear(kScrimColorAtStart, GetScrimLayer()->background_color()));
   EXPECT_X_TRANSLATION(initial_position, GetScreenshotLayer()->transform());
 
-  GetAnimationManager()->OnGestureProgressed(ui::BackGestureEvent(0.3));
-  EXPECT_TRUE(ColorsNear(kScrimColorAt30, GetScrimLayer()->background_color()));
-  EXPECT_X_TRANSLATION(initial_position * 0.7,
+  // The position and screen color lags behind the input, due to filtering.
+  GestureProgressWaitForAnimate(0.3f);
+  EXPECT_TRUE(
+      ColorsNear(ScrimColorAt(0.206f), GetScrimLayer()->background_color()));
+  EXPECT_X_TRANSLATION(initial_position * 0.794f,
                        GetScreenshotLayer()->transform());
 
-  GetAnimationManager()->OnGestureProgressed(ui::BackGestureEvent(0.6));
-  EXPECT_TRUE(ColorsNear(kScrimColorAt60, GetScrimLayer()->background_color()));
-  EXPECT_X_TRANSLATION(initial_position * 0.4,
+  GestureProgressWaitForAnimate(0.6f);
+  EXPECT_TRUE(
+      ColorsNear(ScrimColorAt(0.324f), GetScrimLayer()->background_color()));
+  EXPECT_X_TRANSLATION(initial_position * 0.676f,
                        GetScreenshotLayer()->transform());
 
-  GetAnimationManager()->OnGestureProgressed(ui::BackGestureEvent(0.9));
-  EXPECT_TRUE(ColorsNear(kScrimColorAt90, GetScrimLayer()->background_color()));
-  EXPECT_X_TRANSLATION(initial_position * 0.1,
+  GestureProgressWaitForAnimate(0.9f);
+  EXPECT_TRUE(
+      ColorsNear(ScrimColorAt(0.553f), GetScrimLayer()->background_color()));
+  EXPECT_X_TRANSLATION(initial_position * 0.447f,
                        GetScreenshotLayer()->transform());
 
-  GetAnimationManager()->OnGestureProgressed(ui::BackGestureEvent(0.6));
-  EXPECT_TRUE(ColorsNear(kScrimColorAt60, GetScrimLayer()->background_color()));
-  EXPECT_X_TRANSLATION(initial_position * 0.4,
+  GestureProgressWaitForAnimate(0.6f);
+  EXPECT_TRUE(
+      ColorsNear(ScrimColorAt(0.622f), GetScrimLayer()->background_color()));
+  EXPECT_X_TRANSLATION(initial_position * 0.378f,
                        GetScreenshotLayer()->transform());
 
-  GetAnimationManager()->OnGestureProgressed(ui::BackGestureEvent(0.3));
-  EXPECT_TRUE(ColorsNear(kScrimColorAt30, GetScrimLayer()->background_color()));
-  EXPECT_X_TRANSLATION(initial_position * 0.7,
-                       GetScreenshotLayer()->transform());
-
-  GetAnimationManager()->OnGestureProgressed(ui::BackGestureEvent(0.6));
-  EXPECT_TRUE(ColorsNear(kScrimColorAt60, GetScrimLayer()->background_color()));
-  EXPECT_X_TRANSLATION(initial_position * 0.4,
-                       GetScreenshotLayer()->transform());
-
-  GetAnimationManager()->OnGestureProgressed(ui::BackGestureEvent(0.9));
-  EXPECT_TRUE(ColorsNear(kScrimColorAt90, GetScrimLayer()->background_color()));
-  EXPECT_X_TRANSLATION(initial_position * 0.1,
+  GestureProgressWaitForAnimate(0.3f);
+  EXPECT_TRUE(
+      ColorsNear(ScrimColorAt(0.522f), GetScrimLayer()->background_color()));
+  EXPECT_X_TRANSLATION(initial_position * 0.478f,
                        GetScreenshotLayer()->transform());
 }
 
@@ -828,6 +858,7 @@
 
   GetAnimationManager()->OnGestureStarted(ui::BackGestureEvent(0),
                                           ForwardEdge(), NavType::kForward);
+  GetAnimator()->set_duration_between_frames(k60HzDuration);
 
   // In a forward navigation, the screenshot starts off-screen at the viewport
   // edge where the gesture is initiated. It in the direction of the swipe over
@@ -839,39 +870,34 @@
 
   EXPECT_X_TRANSLATION(0, GetLivePageLayer()->transform());
 
-  GetAnimationManager()->OnGestureProgressed(ui::BackGestureEvent(0.3));
-  EXPECT_TRUE(ColorsNear(kScrimColorAt30, GetScrimLayer()->background_color()));
-  EXPECT_X_TRANSLATION(start_position + total_distance * 0.3,
+  GestureProgressWaitForAnimate(0.3f);
+  EXPECT_TRUE(
+      ColorsNear(ScrimColorAt(0.206f), GetScrimLayer()->background_color()));
+  EXPECT_X_TRANSLATION(start_position + total_distance * 0.206f,
                        GetScreenshotLayer()->transform());
 
-  GetAnimationManager()->OnGestureProgressed(ui::BackGestureEvent(0.6));
-  EXPECT_TRUE(ColorsNear(kScrimColorAt60, GetScrimLayer()->background_color()));
-  EXPECT_X_TRANSLATION(start_position + total_distance * 0.6,
+  GestureProgressWaitForAnimate(0.6f);
+  EXPECT_TRUE(
+      ColorsNear(ScrimColorAt(0.324f), GetScrimLayer()->background_color()));
+  EXPECT_X_TRANSLATION(start_position + total_distance * 0.324f,
                        GetScreenshotLayer()->transform());
 
-  GetAnimationManager()->OnGestureProgressed(ui::BackGestureEvent(0.9));
-  EXPECT_TRUE(ColorsNear(kScrimColorAt90, GetScrimLayer()->background_color()));
-  EXPECT_X_TRANSLATION(start_position + total_distance * 0.9,
+  GestureProgressWaitForAnimate(0.9f);
+  EXPECT_TRUE(
+      ColorsNear(ScrimColorAt(0.553f), GetScrimLayer()->background_color()));
+  EXPECT_X_TRANSLATION(start_position + total_distance * 0.553f,
                        GetScreenshotLayer()->transform());
 
-  GetAnimationManager()->OnGestureProgressed(ui::BackGestureEvent(0.6));
-  EXPECT_TRUE(ColorsNear(kScrimColorAt60, GetScrimLayer()->background_color()));
-  EXPECT_X_TRANSLATION(start_position + total_distance * 0.6,
+  GestureProgressWaitForAnimate(0.6f);
+  EXPECT_TRUE(
+      ColorsNear(ScrimColorAt(0.622f), GetScrimLayer()->background_color()));
+  EXPECT_X_TRANSLATION(start_position + total_distance * 0.622f,
                        GetScreenshotLayer()->transform());
 
-  GetAnimationManager()->OnGestureProgressed(ui::BackGestureEvent(0.3));
-  EXPECT_TRUE(ColorsNear(kScrimColorAt30, GetScrimLayer()->background_color()));
-  EXPECT_X_TRANSLATION(start_position + total_distance * 0.3,
-                       GetScreenshotLayer()->transform());
-
-  GetAnimationManager()->OnGestureProgressed(ui::BackGestureEvent(0.6));
-  EXPECT_TRUE(ColorsNear(kScrimColorAt60, GetScrimLayer()->background_color()));
-  EXPECT_X_TRANSLATION(start_position + total_distance * 0.6,
-                       GetScreenshotLayer()->transform());
-
-  GetAnimationManager()->OnGestureProgressed(ui::BackGestureEvent(0.9));
-  EXPECT_TRUE(ColorsNear(kScrimColorAt90, GetScrimLayer()->background_color()));
-  EXPECT_X_TRANSLATION(start_position + total_distance * 0.9,
+  GestureProgressWaitForAnimate(0.3f);
+  EXPECT_TRUE(
+      ColorsNear(ScrimColorAt(0.522f), GetScrimLayer()->background_color()));
+  EXPECT_X_TRANSLATION(start_position + total_distance * 0.522f,
                        GetScreenshotLayer()->transform());
 }
 
@@ -881,24 +907,40 @@
 
   GetAnimationManager()->OnGestureStarted(ui::BackGestureEvent(0), BackEdge(),
                                           NavType::kBackward);
+  GetAnimator()->set_duration_between_frames(k60HzDuration);
+
   ASSERT_TRUE(GetScrimLayer());
   EXPECT_TRUE(
       ColorsNear(kScrimColorAtStart, GetScrimLayer()->background_color()));
 
-  GetAnimationManager()->OnGestureProgressed(ui::BackGestureEvent(0.3));
-  EXPECT_TRUE(ColorsNear(kScrimColorAt30, GetScrimLayer()->background_color()));
+  GestureProgressWaitForAnimate(0.3f);
+  EXPECT_TRUE(
+      ColorsNear(ScrimColorAt(0.206f), GetScrimLayer()->background_color()));
 
-  GetAnimationManager()->OnGestureProgressed(ui::BackGestureEvent(0.6));
-  EXPECT_TRUE(ColorsNear(kScrimColorAt60, GetScrimLayer()->background_color()));
+  GestureProgressWaitForAnimate(0.6f);
+  EXPECT_TRUE(
+      ColorsNear(ScrimColorAt(0.324f), GetScrimLayer()->background_color()));
 
-  GetAnimationManager()->OnGestureProgressed(ui::BackGestureEvent(0.9));
-  EXPECT_TRUE(ColorsNear(kScrimColorAt90, GetScrimLayer()->background_color()));
+  GestureProgressWaitForAnimate(0.9f);
+  EXPECT_TRUE(
+      ColorsNear(ScrimColorAt(0.553f), GetScrimLayer()->background_color()));
 
-  GetAnimationManager()->OnGestureProgressed(ui::BackGestureEvent(0.3));
-  EXPECT_TRUE(ColorsNear(kScrimColorAt30, GetScrimLayer()->background_color()));
+  GestureProgressWaitForAnimate(0.6f);
+  EXPECT_TRUE(
+      ColorsNear(ScrimColorAt(0.622f), GetScrimLayer()->background_color()));
 
-  GetAnimationManager()->OnGestureProgressed(ui::BackGestureEvent(0.6));
-  EXPECT_TRUE(ColorsNear(kScrimColorAt60, GetScrimLayer()->background_color()));
+  GestureProgressWaitForAnimate(0.3f);
+  EXPECT_TRUE(
+      ColorsNear(ScrimColorAt(0.522f), GetScrimLayer()->background_color()));
+
+  // Continues to estabilize around 0.3.
+  GestureProgressWaitForAnimate(0.3f);
+  EXPECT_TRUE(
+      ColorsNear(ScrimColorAt(0.4373f), GetScrimLayer()->background_color()));
+
+  GestureProgressWaitForAnimate(0.3f);
+  EXPECT_TRUE(
+      ColorsNear(ScrimColorAt(0.39f), GetScrimLayer()->background_color()));
 }
 
 // Tests the translation of the live page as the gesture is progressed in both
@@ -910,6 +952,7 @@
 
   GetAnimationManager()->OnGestureStarted(ui::BackGestureEvent(0), BackEdge(),
                                           NavType::kBackward);
+  GetAnimator()->set_duration_between_frames(k60HzDuration);
 
   // In a back navigation, the live page starts off at the viewport origin and
   // moves in the direction of the swipe to a maximum defined by the "commit
@@ -920,26 +963,39 @@
 
   EXPECT_X_TRANSLATION(0, GetLivePageLayer()->transform());
 
-  GetAnimationManager()->OnGestureProgressed(ui::BackGestureEvent(0.3));
-  EXPECT_X_TRANSLATION(final_position * 0.3, GetLivePageLayer()->transform());
+  // The position lags behind the input, due to filtering.
+  GestureProgressWaitForAnimate(0.3f);
+  EXPECT_X_TRANSLATION(final_position * 0.206f,
+                       GetLivePageLayer()->transform());
 
-  GetAnimationManager()->OnGestureProgressed(ui::BackGestureEvent(0.6));
-  EXPECT_X_TRANSLATION(final_position * 0.6, GetLivePageLayer()->transform());
+  GestureProgressWaitForAnimate(0.6f);
+  EXPECT_X_TRANSLATION(final_position * 0.324f,
+                       GetLivePageLayer()->transform());
 
-  GetAnimationManager()->OnGestureProgressed(ui::BackGestureEvent(0.9));
-  EXPECT_X_TRANSLATION(final_position * 0.9, GetLivePageLayer()->transform());
+  GestureProgressWaitForAnimate(0.9f);
+  EXPECT_X_TRANSLATION(final_position * 0.553f,
+                       GetLivePageLayer()->transform());
 
-  GetAnimationManager()->OnGestureProgressed(ui::BackGestureEvent(0.6));
-  EXPECT_X_TRANSLATION(final_position * 0.6, GetLivePageLayer()->transform());
+  // The translation continues catching up to the input.
+  GestureProgressWaitForAnimate(0.9f);
+  EXPECT_X_TRANSLATION(final_position * 0.732f,
+                       GetLivePageLayer()->transform());
 
-  GetAnimationManager()->OnGestureProgressed(ui::BackGestureEvent(0.3));
-  EXPECT_X_TRANSLATION(final_position * 0.3, GetLivePageLayer()->transform());
+  GestureProgressWaitForAnimate(0.6f);
+  EXPECT_X_TRANSLATION(final_position * 0.713f,
+                       GetLivePageLayer()->transform());
 
-  GetAnimationManager()->OnGestureProgressed(ui::BackGestureEvent(0.6));
-  EXPECT_X_TRANSLATION(final_position * 0.6, GetLivePageLayer()->transform());
+  GestureProgressWaitForAnimate(0.3f);
+  EXPECT_X_TRANSLATION(final_position * 0.575f,
+                       GetLivePageLayer()->transform());
 
-  GetAnimationManager()->OnGestureProgressed(ui::BackGestureEvent(0.9));
-  EXPECT_X_TRANSLATION(final_position * 0.9, GetLivePageLayer()->transform());
+  GestureProgressWaitForAnimate(0.6f);
+  EXPECT_X_TRANSLATION(final_position * 0.547f,
+                       GetLivePageLayer()->transform());
+
+  GestureProgressWaitForAnimate(0.9f);
+  EXPECT_X_TRANSLATION(final_position * 0.664f,
+                       GetLivePageLayer()->transform());
 }
 
 // Tests the translation of the live page as the gesture is progressed in both
@@ -969,6 +1025,7 @@
 
   GetAnimationManager()->OnGestureStarted(ui::BackGestureEvent(0),
                                           ForwardEdge(), NavType::kForward);
+  GetAnimator()->set_duration_between_frames(k60HzDuration);
 
   // In a forward navigation, the live page starts off at the viewport origin
   // and moves in the direction of the swipe the same amount as the screenshot
@@ -979,26 +1036,34 @@
 
   EXPECT_X_TRANSLATION(0, GetLivePageLayer()->transform());
 
-  GetAnimationManager()->OnGestureProgressed(ui::BackGestureEvent(0.3));
-  EXPECT_X_TRANSLATION(final_position * 0.3, GetLivePageLayer()->transform());
+  // The position lags behind the input, due to filtering.
+  GestureProgressWaitForAnimate(0.3f);
+  EXPECT_X_TRANSLATION(final_position * 0.206f,
+                       GetLivePageLayer()->transform());
 
-  GetAnimationManager()->OnGestureProgressed(ui::BackGestureEvent(0.6));
-  EXPECT_X_TRANSLATION(final_position * 0.6, GetLivePageLayer()->transform());
+  GestureProgressWaitForAnimate(0.6f);
+  EXPECT_X_TRANSLATION(final_position * 0.324f,
+                       GetLivePageLayer()->transform());
 
-  GetAnimationManager()->OnGestureProgressed(ui::BackGestureEvent(0.9));
-  EXPECT_X_TRANSLATION(final_position * 0.9, GetLivePageLayer()->transform());
+  GestureProgressWaitForAnimate(0.9f);
+  EXPECT_X_TRANSLATION(final_position * 0.553f,
+                       GetLivePageLayer()->transform());
 
-  GetAnimationManager()->OnGestureProgressed(ui::BackGestureEvent(0.6));
-  EXPECT_X_TRANSLATION(final_position * 0.6, GetLivePageLayer()->transform());
+  GestureProgressWaitForAnimate(0.6f);
+  EXPECT_X_TRANSLATION(final_position * 0.622f,
+                       GetLivePageLayer()->transform());
 
-  GetAnimationManager()->OnGestureProgressed(ui::BackGestureEvent(0.3));
-  EXPECT_X_TRANSLATION(final_position * 0.3, GetLivePageLayer()->transform());
+  GestureProgressWaitForAnimate(0.3f);
+  EXPECT_X_TRANSLATION(final_position * 0.522f,
+                       GetLivePageLayer()->transform());
 
-  GetAnimationManager()->OnGestureProgressed(ui::BackGestureEvent(0.6));
-  EXPECT_X_TRANSLATION(final_position * 0.6, GetLivePageLayer()->transform());
+  GestureProgressWaitForAnimate(0.6f);
+  EXPECT_X_TRANSLATION(final_position * 0.515f,
+                       GetLivePageLayer()->transform());
 
-  GetAnimationManager()->OnGestureProgressed(ui::BackGestureEvent(0.9));
-  EXPECT_X_TRANSLATION(final_position * 0.9, GetLivePageLayer()->transform());
+  GestureProgressWaitForAnimate(0.9f);
+  EXPECT_X_TRANSLATION(final_position * 0.651f,
+                       GetLivePageLayer()->transform());
 }
 
 // Tests a forward navigation creates the expected layers and puts them in the
@@ -1055,7 +1120,7 @@
   {
     TestFuture<void> did_invoke;
     GetAnimator()->set_on_invoke_animation_displayed(did_invoke.GetCallback());
-    GetAnimator()->UnpauseAnimation();
+    UnpauseAnimation();
     ASSERT_TRUE(did_invoke.Wait());
 
     // A clone of the old page should be removed. The screenshot should remain
@@ -1089,7 +1154,7 @@
   ASSERT_EQ("[Screenshot[Scrim],LivePage]", ChildrenInOrder(*GetViewLayer()));
   ASSERT_EQ(GetScrimLayer()->background_color().fA, 0.65f);
 
-  GetAnimationManager()->OnGestureProgressed(ui::BackGestureEvent(0.9));
+  GestureProgressWaitForAnimate(0.9f);
 
   TestFuture<void> did_cancel;
   TestFuture<AnimatorState> destroyed;
@@ -1263,13 +1328,7 @@
     BackForwardTransitionAnimationManagerBothEdgeBrowserTest,
     Combine(Values(UILayoutDirection::kLTR, UILayoutDirection::kRTL),
             Values(DSFMode::kOne, DSFMode::kFractional)),
-    [](const TestParamInfo<
-        BackForwardTransitionAnimationManagerBothEdgeBrowserTest::ParamType>&
-           info) {
-      return base::StrCat(
-          {std::get<0>(info.param) == UILayoutDirection::kLTR ? "LTR" : "RTL",
-           std::get<1>(info.param) == DSFMode::kOne ? "" : "FractionalDSF"});
-    });
+    testing::PrintToStringParamName());
 
 // Runs a transition in a ViewTransition enabled page. Ensures view transition
 // does not run.
@@ -1391,44 +1450,58 @@
 
   GetAnimationManager()->OnGestureStarted(ui::BackGestureEvent(0),
                                           SwipeEdge::LEFT, NavType::kBackward);
+  GetAnimator()->set_duration_between_frames(k60HzDuration);
 
   // live page layer with screenshot underneath, and the rounded rectangle is
   // above the scrim.
   ASSERT_EQ("[Screenshot[Scrim,RRect[Favicon]],LivePage]",
             ChildrenInOrder(*GetViewLayer()));
 
-  GetAnimationManager()->OnGestureProgressed(ui::BackGestureEvent(0.2));
+  GestureProgressWaitForAnimate(0.2f);
   auto expected_bg_color = web_contents()
                                ->GetDelegate()
                                ->GetBackForwardTransitionFallbackUXConfig()
                                .background_color;
   EXPECT_EQ(GetScreenshotLayer()->background_color(), expected_bg_color);
-  EXPECT_TRUE(base::IsApproximatelyEqual(GetRRectLayer()->opacity(), 0.f,
-                                         kFloatTolerance));
+  EXPECT_NEAR(GetRRectLayer()->opacity(), 0.f, kFloatTolerance);
   // Opacity value isn't propagated into the subtree.
-  EXPECT_TRUE(base::IsApproximatelyEqual(GetFaviconLayer()->opacity(), 1.f,
-                                         kFloatTolerance));
+  EXPECT_NEAR(GetFaviconLayer()->opacity(), 1.f, kFloatTolerance);
 
-  GetAnimationManager()->OnGestureProgressed(ui::BackGestureEvent(0.5));
+  // Due to input filtering and the drag curve, the opacity output lags behind
+  // the gesture progress.
+  GestureProgressWaitForAnimate(0.4f);
   EXPECT_EQ(GetScreenshotLayer()->background_color(), expected_bg_color);
-  EXPECT_TRUE(base::IsApproximatelyEqual(GetRRectLayer()->opacity(), 0.7f,
-                                         kFloatTolerance));
-  EXPECT_TRUE(base::IsApproximatelyEqual(GetFaviconLayer()->opacity(), 1.f,
-                                         kFloatTolerance));
+  EXPECT_NEAR(GetRRectLayer()->opacity(), 0.f, kFloatTolerance);
+  EXPECT_NEAR(GetFaviconLayer()->opacity(), 1.f, kFloatTolerance);
 
-  GetAnimationManager()->OnGestureProgressed(ui::BackGestureEvent(0.8));
+  GestureProgressWaitForAnimate(0.6f);
   EXPECT_EQ(GetScreenshotLayer()->background_color(), expected_bg_color);
-  EXPECT_TRUE(base::IsApproximatelyEqual(GetRRectLayer()->opacity(), 1.f,
-                                         kFloatTolerance));
-  EXPECT_TRUE(base::IsApproximatelyEqual(GetFaviconLayer()->opacity(), 1.f,
-                                         kFloatTolerance));
+  EXPECT_NEAR(GetRRectLayer()->opacity(), 0.199f, kFloatTolerance);
+  EXPECT_NEAR(GetFaviconLayer()->opacity(), 1.f, kFloatTolerance);
 
-  GetAnimationManager()->OnGestureProgressed(ui::BackGestureEvent(0.3));
+  GestureProgressWaitForAnimate(0.7f);
   EXPECT_EQ(GetScreenshotLayer()->background_color(), expected_bg_color);
-  EXPECT_TRUE(base::IsApproximatelyEqual(GetRRectLayer()->opacity(), 0.02f,
-                                         kFloatTolerance));
-  EXPECT_TRUE(base::IsApproximatelyEqual(GetFaviconLayer()->opacity(), 1.f,
-                                         kFloatTolerance));
+  EXPECT_NEAR(GetRRectLayer()->opacity(), 0.713f, kFloatTolerance);
+  EXPECT_NEAR(GetFaviconLayer()->opacity(), 1.f, kFloatTolerance);
+
+  GestureProgressWaitForAnimate(0.8f);
+  EXPECT_EQ(GetScreenshotLayer()->background_color(), expected_bg_color);
+  EXPECT_NEAR(GetRRectLayer()->opacity(), 1.f, kFloatTolerance);
+  EXPECT_NEAR(GetFaviconLayer()->opacity(), 1.f, kFloatTolerance);
+
+  // Reversing the gesture lowers the opacity again.
+
+  GestureProgressWaitForAnimate(0.4f);
+  EXPECT_EQ(GetScreenshotLayer()->background_color(), expected_bg_color);
+  EXPECT_NEAR(GetRRectLayer()->opacity(), 0.986f, kFloatTolerance);
+  EXPECT_NEAR(GetFaviconLayer()->opacity(), 1.f, kFloatTolerance);
+
+  GestureProgressWaitForAnimate(0.2f);
+  EXPECT_EQ(GetScreenshotLayer()->background_color(), expected_bg_color);
+  EXPECT_NEAR(GetRRectLayer()->opacity(), 0.540f, kFloatTolerance);
+  EXPECT_NEAR(GetFaviconLayer()->opacity(), 1.f, kFloatTolerance);
+
+  GetAnimator()->set_duration_between_frames(kLongDurationBetweenFrames);
 
   TestFrameNavigationObserver back_navigation(web_contents());
 
@@ -1637,7 +1710,7 @@
     EXPECT_STATE_EQ(kDisplayingCancelAnimation, GetAnimator()->state());
     // Force the cancel animation to finish playing, by unpausing it and
     // calling OnAnimate on it.
-    GetAnimator()->UnpauseAnimation();
+    UnpauseAnimation();
 
     ASSERT_TRUE(did_cancel.Wait());
     ASSERT_TRUE(nav_to_blue.WaitForNavigationFinished());
@@ -1706,7 +1779,7 @@
   // child scrim layer, under the live page.
   ASSERT_EQ("[Screenshot[Scrim],LivePage]", ChildrenInOrder(*GetViewLayer()));
 
-  GetAnimator()->UnpauseAnimation();
+  UnpauseAnimation();
   ASSERT_TRUE(destroyed.Wait());
   EXPECT_STATE_EQ(kAnimationFinished, destroyed.Get());
   ASSERT_EQ(web_contents()->GetController().GetLastCommittedEntry()->GetURL(),
@@ -1971,7 +2044,8 @@
 
   GetAnimationManager()->OnGestureStarted(ui::BackGestureEvent(0),
                                           SwipeEdge::LEFT, NavType::kBackward);
-  GetAnimationManager()->OnGestureProgressed(ui::BackGestureEvent(0.6));
+  GestureProgressWaitForAnimate(0.6f);
+  EXPECT_STATE_EQ(kStarted, GetAnimator()->state());
 
   TestFuture<void> did_cross_fade;
   TestFuture<void> did_invoke;
@@ -2169,7 +2243,7 @@
     ASSERT_TRUE(nav_to_blue.WaitForNavigationFinished());
   }
 
-  GetAnimator()->UnpauseAnimation();
+  UnpauseAnimation();
   EXPECT_TRUE(invoke_played.Wait());
   ASSERT_TRUE(destroyed.Wait());
   EXPECT_STATE_EQ(kAnimationFinished, destroyed.Get());
@@ -2538,8 +2612,8 @@
 
 INSTANTIATE_TEST_SUITE_P(All,
                          BackForwardTransitionAnimationManagerEventsTest,
-                         testing::Values<std::string>("navigate", "popstate"),
-                         [](const testing::TestParamInfo<std::string> info) {
+                         Values<std::string>("navigate", "popstate"),
+                         [](const TestParamInfo<std::string> info) {
                            return info.param;
                          });
 
@@ -2838,7 +2912,7 @@
   EXPECT_TRUE(dialog_shown.Wait());
   EXPECT_STATE_EQ(kDisplayingCancelAnimation, GetAnimator()->state());
   EXPECT_TRUE(dialog_manager->RunBeforeUnloadCallback(false, u"title"));
-  GetAnimator()->UnpauseAnimation();
+  UnpauseAnimation();
 
   EXPECT_TRUE(did_cancel.Wait());
   EXPECT_TRUE(destroyed.Wait());
@@ -2903,7 +2977,7 @@
   ASSERT_FALSE(did_invoke.IsReady());
   ASSERT_FALSE(did_cancel.IsReady());
 
-  GetAnimator()->UnpauseAnimation();
+  UnpauseAnimation();
   ASSERT_TRUE(destroyed.Wait());
   EXPECT_STATE_EQ(kAnimationFinished, destroyed.Get());
 
@@ -3090,7 +3164,7 @@
   ASSERT_TRUE(did_invoke.Wait());
   EXPECT_STATE_EQ(kDisplayingCrossFadeAnimation, GetAnimator()->state());
 
-  GetAnimator()->UnpauseAnimation();
+  UnpauseAnimation();
   ASSERT_TRUE(nav_to_blue.WaitForNavigationFinished());
   ASSERT_TRUE(destroyed.Wait());
   EXPECT_STATE_EQ(kAnimationFinished, destroyed.Get());
@@ -3992,7 +4066,7 @@
   ASSERT_TRUE(dialog_shown.Wait());
   EXPECT_STATE_EQ(kDisplayingCancelAnimation, GetAnimator()->state());
   ASSERT_TRUE(dialog_manager->RunBeforeUnloadCallback(false, u"title"));
-  GetAnimator()->UnpauseAnimation();
+  UnpauseAnimation();
 
   ASSERT_TRUE(cancel_displayed.Wait());
   ASSERT_TRUE(destroyed.Wait());
@@ -4057,7 +4131,7 @@
   EXPECT_TRUE(beforeunload_complete.Wait());
   EXPECT_STATE_EQ(kDisplayingCancelAnimation, GetAnimator()->state());
 
-  GetAnimator()->UnpauseAnimation();
+  UnpauseAnimation();
 
   ASSERT_TRUE(NavigateToURL(web_contents(), BlueURL()));
 
diff --git a/content/browser/navigation_transitions/back_forward_transition_animator.cc b/content/browser/navigation_transitions/back_forward_transition_animator.cc
index 58fafe25..7a3237d 100644
--- a/content/browser/navigation_transitions/back_forward_transition_animator.cc
+++ b/content/browser/navigation_transitions/back_forward_transition_animator.cc
@@ -7,6 +7,7 @@
 #include "base/memory/scoped_refptr.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/numerics/ranges.h"
+#include "base/time/time.h"
 #include "cc/slim/layer.h"
 #include "cc/slim/solid_color_layer.h"
 #include "cc/slim/surface_layer.h"
@@ -28,8 +29,11 @@
 #include "content/public/browser/web_contents_delegate.h"
 #include "third_party/blink/public/common/web_preferences/web_preferences.h"
 #include "ui/android/window_android.h"
+#include "ui/base/prediction/linear_resampling.h"
+#include "ui/base/prediction/one_euro_filter.h"
 #include "ui/display/screen.h"
 #include "ui/events/back_gesture_event.h"
+#include "ui/gfx/geometry/point_f.h"
 
 namespace content {
 
@@ -51,6 +55,13 @@
 
 static constexpr base::TimeDelta kDismissScreenshotAfter = base::Seconds(4);
 
+static constexpr double kOneEuroFilterMincutoff =
+    ui::OneEuroFilter::kDefaultMincutoff;
+// Beta is in a different scale than the default because the filter for the
+// animator deals with small values (0 to 1.0).
+static constexpr double kOneEuroFilterBeta =
+    ui::OneEuroFilter::kDefaultBeta * 100.;
+
 void ResetTransformForLayer(cc::slim::Layer* layer) {
   CHECK(layer);
   auto transform = layer->transform();
@@ -425,7 +436,7 @@
 BackForwardTransitionAnimator::BackForwardTransitionAnimator(
     WebContentsViewAndroid* web_contents_view_android,
     NavigationControllerImpl* controller,
-    const ui::BackGestureEvent& gesture,
+    const ui::BackGestureEvent& first_gesture,
     NavigationDirection nav_direction,
     SwipeEdge initiating_edge,
     NavigationEntryImpl* destination_entry,
@@ -443,7 +454,9 @@
                                ->GetDipScale()),
       physics_model_(GetViewportWidthPx(),
                      web_contents_view_android->GetNativeView()->GetDipScale()),
-      latest_progress_gesture_(gesture) {
+      input_predictor_(std::make_unique<ui::LinearResampling>()),
+      input_filter_(std::make_unique<ui::OneEuroFilter>(kOneEuroFilterMincutoff,
+                                                        kOneEuroFilterBeta)) {
   if (ShouldUseFallbackScreenshot(animation_manager_, destination_entry)) {
     fallback_ux_ = {
         .color_config = animation_manager_->web_contents_view_android()
@@ -455,7 +468,7 @@
     };
   }
   state_ = State::kStarted;
-  SetupForScreenshotPreview(std::move(embedder_content));
+  SetupForScreenshotPreview(std::move(embedder_content), first_gesture);
   ProcessState();
 }
 
@@ -469,18 +482,17 @@
   // swiped.
   CHECK(IsGreaterThanOrEqual(gesture.progress(), 0.f));
   CHECK(IsLessThanOrEqual(gesture.progress(), 1.f));
-
-  float progress_delta =
-      gesture.progress() - latest_progress_gesture_.progress();
-  const float movement = progress_delta * GetViewportWidthPx();
-  latest_progress_gesture_ = gesture;
-
-  const PhysicsModel::Result result =
-      physics_model_.OnGestureProgressed(movement, base::TimeTicks::Now());
-  CHECK(!result.done);
-  // The gesture animations are never considered "finished".
-  bool animations_finished = SetLayerTransformationAndTickEffect(result);
-  CHECK(!animations_finished);
+  gfx::PointF progress_position(gesture.progress(), 0.f);
+  ui::InputPredictor::InputData input(progress_position, gesture.time());
+  input_predictor_->Update(input);
+  if (input_predictor_->HasPrediction()) {
+    animation_manager_->web_contents_view_android()
+        ->GetTopLevelNativeWindow()
+        ->SetNeedsAnimate();
+  } else {
+    // Animate the layers now for a new trajectory.
+    OnAnimateGestureProgressed(gesture);
+  }
 }
 
 void BackForwardTransitionAnimator::OnGestureCancelled() {
@@ -557,6 +569,15 @@
   bool animation_finished = false;
 
   switch (state_) {
+    case State::kStarted:
+      // This state of the animation is purely driven by the progress of the
+      // user gesture.
+      if (auto input = input_predictor_->GeneratePrediction(frame_begin_time)) {
+        input_filter_->Filter(input->time_stamp, &input->pos);
+        OnAnimateGestureProgressed(
+            ui::BackGestureEvent(input->pos.x(), input->time_stamp));
+      }
+      break;
     case State::kDisplayingCancelAnimation: {
       PhysicsModel::Result result = physics_model_.OnAnimate(frame_begin_time);
       std::ignore = SetLayerTransformationAndTickEffect(result);
@@ -594,7 +615,6 @@
       animation_finished = effect_.keyframe_models().empty();
       break;
     }
-    case State::kStarted:
     case State::kWaitingForBeforeUnloadUserInteraction:
     case State::kWaitingForNewRendererToDraw:
     case State::kWaitingForContentForNavigationEntryShown:
@@ -1410,6 +1430,8 @@
         },
         this, effect_);
   }
+  // The effect is assumed to start at time zero.
+  effect_.Tick(base::TimeTicks());
 }
 
 void BackForwardTransitionAnimator::InitializeEffectForCrossfadeAnimation() {
@@ -1420,6 +1442,20 @@
   AddLinearModelToEffect(kCrossFadeAnimation, this, effect_);
 }
 
+// Called by OnAnimate when the user is still executing the gesture.
+void BackForwardTransitionAnimator::OnAnimateGestureProgressed(
+    const ui::BackGestureEvent& gesture) {
+  float progress = std::clamp(gesture.progress(), 0.f, 1.f);
+  const float movement = (progress - latest_progress_) * GetViewportWidthPx();
+  latest_progress_ = progress;
+  const PhysicsModel::Result result =
+      physics_model_.OnGestureProgressed(movement, gesture.time());
+  CHECK(!result.done);
+  // The gesture animations are never considered "finished".
+  bool animations_finished = SetLayerTransformationAndTickEffect(result);
+  CHECK(!animations_finished);
+}
+
 void BackForwardTransitionAnimator::AdvanceAndProcessState(State state) {
   CHECK(CanAdvanceTo(state_, state))
       << "Cannot advance from " << StateToString(state_) << " to "
@@ -1572,7 +1608,8 @@
 }
 
 void BackForwardTransitionAnimator::SetupForScreenshotPreview(
-    SkBitmap embedder_content) {
+    SkBitmap embedder_content,
+    const ui::BackGestureEvent& first_gesture) {
   NavigationControllerImpl* nav_controller =
       animation_manager_->navigation_controller();
   int entry_index =
@@ -1653,7 +1690,7 @@
 
   // Calling `OnGestureProgressed` manually. This will ask the physics model to
   // move the layers to their respective initial positions.
-  OnGestureProgressed(latest_progress_gesture_);
+  OnGestureProgressed(first_gesture);
 }
 
 void BackForwardTransitionAnimator::SetupProgressBar() {
diff --git a/content/browser/navigation_transitions/back_forward_transition_animator.h b/content/browser/navigation_transitions/back_forward_transition_animator.h
index 7038b37c..91e1f023 100644
--- a/content/browser/navigation_transitions/back_forward_transition_animator.h
+++ b/content/browser/navigation_transitions/back_forward_transition_animator.h
@@ -26,6 +26,11 @@
 class UIResourceLayer;
 }
 
+namespace ui {
+class InputFilter;
+class InputPredictor;
+}  // namespace ui
+
 namespace content {
 
 class NavigationControllerImpl;
@@ -274,7 +279,7 @@
   BackForwardTransitionAnimator(
       WebContentsViewAndroid* web_contents_view_android,
       NavigationControllerImpl* controller,
-      const ui::BackGestureEvent& gesture,
+      const ui::BackGestureEvent& first_gesture,
       BackForwardTransitionAnimationManager::NavigationDirection nav_direction,
       ui::BackGestureEventSwipeEdge initiating_edge,
       NavigationEntryImpl* destination_entry,
@@ -352,14 +357,19 @@
   void InitializeEffectForGestureProgressAnimation();
   void InitializeEffectForCrossfadeAnimation();
 
+  // Animates a frame while the user is swiping across the screen.
+  void OnAnimateGestureProgressed(const ui::BackGestureEvent& gesture);
+
   // Advance current `state_` to `state`.
   void AdvanceAndProcessState(State state);
 
   // Let this manager respond to the current `state_`.
   void ProcessState();
 
-  // Initializes the `ui_resource_layer_` and sets up the layer tree.
-  void SetupForScreenshotPreview(SkBitmap embedder_content);
+  // Initializes the `ui_resource_layer_` and sets up the layer tree and the
+  // easing input curve.
+  void SetupForScreenshotPreview(SkBitmap embedder_content,
+                                 const ui::BackGestureEvent& first_gesture);
 
   // Sets the progress bar shown during the invoke phase of the animation.
   void SetupProgressBar();
@@ -558,8 +568,15 @@
   // screenshot.
   PhysicsModel physics_model_;
 
-  // Set by the latest `OnGestureProgressed()`.
-  ui::BackGestureEvent latest_progress_gesture_;
+  // Used to resample the input at the time of vsync.
+  std::unique_ptr<ui::InputPredictor> input_predictor_;
+
+  // Used to smoothen out deltas curve.
+  std::unique_ptr<ui::InputFilter> input_filter_;
+
+  // Set by the latest `OnAnimateGestureProgressed()`, after resampling and
+  // filtering.
+  float latest_progress_ = 0.f;
 
   // The indeterminate progress bar shown during the invoke animation.
   std::unique_ptr<ProgressBar> progress_bar_;
diff --git a/content/browser/navigation_transitions/physics_model.cc b/content/browser/navigation_transitions/physics_model.cc
index 6c3842aa..0fd6bfb5 100644
--- a/content/browser/navigation_transitions/physics_model.cc
+++ b/content/browser/navigation_transitions/physics_model.cc
@@ -4,6 +4,7 @@
 
 #include "content/browser/navigation_transitions/physics_model.h"
 
+#include <algorithm>
 #include <numbers>
 #include <vector>
 
@@ -15,8 +16,9 @@
 // TODO(liuwilliam): The velocity and positions should have the same direction.
 //
 // Notes:
-// - Directions: for offsets/positions, the right edge direction is "+" and the
-//   left is "-"; for velocities, the right edge direction is "-" and the left
+// - Directions: for offsets/positions and the velocity of the cancel spring,
+//   the right edge direction is "+" and the left is "-"; for commit pending and
+//   invoke spring velocities, the right edge direction for is "-" and the left
 //   is "+".
 // - The physics model internally operates in the normalized viewport space
 //   while takes/returns physical pixel values as input/output. The spacial
@@ -464,7 +466,7 @@
          kTargetCommitPendingRatio * movement_viewport;
 }
 
-float PhysicsModel::CalculateVelocity() {
+float PhysicsModel::CalculateVelocity(base::TimeTicks time) {
   float velocity = 0;
 
   std::vector<float> timestamps;
@@ -472,20 +474,11 @@
   timestamps.reserve(touch_points_history_.size());
   positions.reserve(touch_points_history_.size());
   for (const auto& p : touch_points_history_) {
-    timestamps.push_back(
-        (base::TimeTicks::Now() - p.timestamp).InMillisecondsF());
+    timestamps.push_back((time - p.timestamp).InMillisecondsF());
     positions.push_back(p.position_viewport);
   }
   SolveLeastSquare(timestamps, positions, &velocity);
-
-  const float sign = velocity >= 0.f ? 1.f : -1.f;
-  velocity = std::abs(velocity);
-
-  velocity = std::max(velocity, 1.0f);
-  velocity = std::min(velocity, 2.5f);
-  velocity = std::max(velocity, 0.3f);
-
-  return velocity * sign;
+  return velocity;
 }
 
 void PhysicsModel::RecordCommitPendingAccelerationStartIfNeeded(
@@ -518,15 +511,13 @@
       // We can only reach here for once, and once only.
       CHECK(last_request_animation_frame_.is_null());
       StartAnimating(request_animation_frame);
-      float finger_vel = CalculateVelocity();
+      float finger_vel = CalculateVelocity(request_animation_frame);
       if (navigation_state_ == NavigationState::kCancelled ||
           navigation_state_ == NavigationState::kBeforeUnloadShown) {
         animation_driver_ = Driver::kSpringCancel;
-        // TODO(crbug.com/40945408): Least square can interpolate the
-        // velocity in the wrong direction if the user swipes to the invoke
-        // direction in the "cancel region" of the screen. For now, just use a
-        // constant velocity.
-        spring_cancel_->set_initial_velocity(1.f);
+        // The sign of the velocities from the drag curve and the cancel spring
+        // have opposite semantics, so we need to multiply by -1.
+        spring_cancel_->set_initial_velocity(-finger_vel);
       } else if (navigation_state_ == NavigationState::kCommitted) {
         animation_driver_ = Driver::kSpringInvoke;
         spring_invoke_->set_initial_velocity(finger_vel);
@@ -630,7 +621,7 @@
     spring_commit_pending_->set_initial_velocity(0.f);
   }
   if (!IsValidVelocity(spring_cancel_->initial_velocity())) {
-    spring_cancel_->set_initial_velocity(1.f);
+    spring_cancel_->set_initial_velocity(-1.f);
   }
 }
 
diff --git a/content/browser/navigation_transitions/physics_model.h b/content/browser/navigation_transitions/physics_model.h
index eaa95cee..a5cd4511 100644
--- a/content/browser/navigation_transitions/physics_model.h
+++ b/content/browser/navigation_transitions/physics_model.h
@@ -132,7 +132,7 @@
   // Interpolates the velocity based off `touch_points_history_`. Used to set
   // the initial velocity of the spring model when the physics model switches
   // from drag cruve to any of the spring models.
-  float CalculateVelocity();
+  float CalculateVelocity(base::TimeTicks time);
 
   // Record `commit_pending_acceleration_start_`, if needed.
   void RecordCommitPendingAccelerationStartIfNeeded(
diff --git a/content/browser/navigation_transitions/physics_model_unittest.cc b/content/browser/navigation_transitions/physics_model_unittest.cc
index 1b3e5f0..f12a8537 100644
--- a/content/browser/navigation_transitions/physics_model_unittest.cc
+++ b/content/browser/navigation_transitions/physics_model_unittest.cc
@@ -7,6 +7,7 @@
 #include <memory>
 
 #include "base/numerics/ranges.h"
+#include "base/time/time.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -173,12 +174,12 @@
               // bounce.
               SpringConfig{
                   .timestamp = NextTimeTickAfter(base::Milliseconds(100)),
-                  .expected = {.foreground_offset_physical = 1042.11,
+                  .expected = {.foreground_offset_physical = 1034.51,
                                .background_offset_physical = 0,
                                .done = false}},
               SpringConfig{
                   .timestamp = NextTimeTickAfter(base::Milliseconds(100)),
-                  .expected = {.foreground_offset_physical = 1078.67,
+                  .expected = {.foreground_offset_physical = 1078.25,
                                .background_offset_physical = 0,
                                .done = false}},
               SpringConfig{
@@ -234,14 +235,14 @@
                                .done = false}},
               SpringConfig{
                   .timestamp = NextTimeTickAfter(base::Milliseconds(100)),
-                  .expected = {.foreground_offset_physical = 1055.37,
-                               .background_offset_physical = 0,
+                  .expected = {.foreground_offset_physical = 1047.77f,
+                               .background_offset_physical = 0.f,
                                .done = false}},
               SpringConfig{
                   .timestamp = NextTimeTickAfter(base::Milliseconds(100)),
-                  .expected = {.foreground_offset_physical = 1079.2,
+                  .expected = {.foreground_offset_physical = 1078.77f,
                                .background_offset_physical = 0,
-                               .done = true}},
+                               .done = false}},
               SpringConfig{
                   .timestamp = NextTimeTickAfter(base::Milliseconds(100)),
                   .expected = {.foreground_offset_physical =
@@ -273,7 +274,7 @@
 // finger lifts from the screen BEFORE the commit-stop position.
 TEST_F(PhysicsModelUnittest, ProgressCommitStopInvoke_LiftBeforeCommitStop) {
   const TestConfig config{
-      .gesture_progressed = NineGestureProgressed(base::Milliseconds(100)),
+      .gesture_progressed = NineGestureProgressed(base::Milliseconds(50)),
       .commit_stop =
           {
               SpringConfig{
@@ -283,39 +284,44 @@
                                .done = false}},
               SpringConfig{
                   .timestamp = NextTimeTickAfter(base::Milliseconds(50)),
-                  .expected = {.foreground_offset_physical = 867.43,
-                               .background_offset_physical = -14.87,
+                  .expected = {.foreground_offset_physical = 835.502f,
+                               .background_offset_physical = -24.264f,
                                .done = false}},
               SpringConfig{
                   .timestamp = NextTimeTickAfter(base::Milliseconds(50)),
-                  .expected = {.foreground_offset_physical = 924.33,
-                               .background_offset_physical = 0,
+                  .expected = {.foreground_offset_physical = 881.257f,
+                               .background_offset_physical = -10.807f,
                                .done = false}},
               SpringConfig{
                   .timestamp = NextTimeTickAfter(base::Milliseconds(50)),
-                  .expected = {.foreground_offset_physical = 951.18,
-                               .background_offset_physical = 0,
+                  .expected = {.foreground_offset_physical = 908.63f,
+                               .background_offset_physical = -2.756f,
                                .done = false}},
               SpringConfig{
                   .timestamp = NextTimeTickAfter(base::Milliseconds(50)),
-                  .expected = {.foreground_offset_physical = 959.68,
-                               .background_offset_physical = 0,
+                  .expected = {.foreground_offset_physical = 923.264f,
+                               .background_offset_physical = 0.f,
+                               .done = false}},
+              SpringConfig{
+                  .timestamp = NextTimeTickAfter(base::Milliseconds(50)),
+                  .expected = {.foreground_offset_physical = 929.668f,
+                               .background_offset_physical = 0.f,
+                               .done = false}},
+              SpringConfig{
+                  .timestamp = NextTimeTickAfter(base::Milliseconds(50)),
+                  .expected = {.foreground_offset_physical = 931.177f,
+                               .background_offset_physical = 0.f,
                                .done = false}},
               // The commit-stop spring is bouncing back (towards the left).
               SpringConfig{
                   .timestamp = NextTimeTickAfter(base::Milliseconds(50)),
-                  .expected = {.foreground_offset_physical = 958.07,
+                  .expected = {.foreground_offset_physical = 930.092f,
                                .background_offset_physical = 0,
                                .done = false}},
               SpringConfig{
                   .timestamp = NextTimeTickAfter(base::Milliseconds(50)),
-                  .expected = {.foreground_offset_physical = 951.75,
-                               .background_offset_physical = 0,
-                               .done = false}},
-              SpringConfig{
-                  .timestamp = NextTimeTickAfter(base::Milliseconds(50)),
-                  .expected = {.foreground_offset_physical = 944.00,
-                               .background_offset_physical = 0,
+                  .expected = {.foreground_offset_physical = 927.892f,
+                               .background_offset_physical = 0.f,
                                .done = false}},
           },
       .cancel = {},
@@ -323,24 +329,104 @@
           {
               SpringConfig{
                   .timestamp = NextTimeTickAfter(base::Milliseconds(100)),
-                  .expected = {.foreground_offset_physical = 1060.61,
-                               .background_offset_physical = 0,
+                  .expected = {.foreground_offset_physical = 1057.78f,
+                               .background_offset_physical = 0.f,
                                .done = false}},
               SpringConfig{
                   .timestamp = NextTimeTickAfter(base::Milliseconds(100)),
-                  .expected = {.foreground_offset_physical = 1079.26,
-                               .background_offset_physical = 0,
+                  .expected = {.foreground_offset_physical = 1079.14f,
+                               .background_offset_physical = 0.f,
                                .done = true}},
               SpringConfig{
                   .timestamp = NextTimeTickAfter(base::Milliseconds(100)),
                   .expected = {.foreground_offset_physical =
                                    kScreenWidthForTesting,
-                               .background_offset_physical = 0,
+                               .background_offset_physical = 0.f,
                                .done = true}},
               SpringConfig{
                   .timestamp = NextTimeTickAfter(base::Milliseconds(100)),
                   .expected = {.foreground_offset_physical =
                                    kScreenWidthForTesting,
+                               .background_offset_physical = 0.f,
+                               .done = true}},
+          },
+  };
+
+  for (const auto& gesture_progress : config.gesture_progressed) {
+    // [float, base::TimeTicks]
+    auto [movement, timestamp] = gesture_progress.movement_timestamp;
+    PhysicsModel::Result r =
+        physics_model()->OnGestureProgressed(movement, timestamp);
+    EXPECT_EQ(r, gesture_progress.expected);
+  }
+
+  physics_model()->SwitchSpringForReason(
+      PhysicsModel::SwitchSpringReason::kGestureInvoked);
+
+  for (const auto& commit_stop : config.commit_stop) {
+    PhysicsModel::Result r = physics_model()->OnAnimate(commit_stop.timestamp);
+    EXPECT_EQ(r, commit_stop.expected);
+  }
+
+  physics_model()->OnNavigationFinished(/*navigation_committed=*/true);
+
+  for (const auto& invoke : config.invoke) {
+    PhysicsModel::Result r = physics_model()->OnAnimate(invoke.timestamp);
+    EXPECT_EQ(r, invoke.expected);
+  }
+}
+
+TEST_F(PhysicsModelUnittest, ProgressCommitStopInvoke_OneGesture) {
+  const TestConfig config{
+      .gesture_progressed =
+          {
+              FingerDragCurveConfig{
+                  .movement_timestamp = {700.f, NextTimeTickAfter(
+                                                    base::Milliseconds(0))},
+                  .expected =
+                      PhysicsModel::Result{.foreground_offset_physical = 595,
+                                           .background_offset_physical = -95,
+                                           .done = false}},
+          },
+      .commit_stop =
+          {
+              // The speed is initially assumed as zero, because there aren't
+              // enough data points.
+              SpringConfig{
+                  .timestamp = NextTimeTickAfter(base::Milliseconds(100)),
+                  .expected = {.foreground_offset_physical = 595,
+                               .background_offset_physical = -95,
+                               .done = false}},
+              // Then it picks up.
+              SpringConfig{
+                  .timestamp = NextTimeTickAfter(base::Milliseconds(100)),
+                  .expected = {.foreground_offset_physical = 673.327,
+                               .background_offset_physical = -71.9627,
+                               .done = false}},
+              SpringConfig{
+                  .timestamp = NextTimeTickAfter(base::Milliseconds(100)),
+                  .expected = {.foreground_offset_physical = 787.81,
+                               .background_offset_physical = -38.2911,
+                               .done = false}},
+          },
+      .cancel = {},
+      .invoke =
+          {
+              // Swings to the right, then stops.
+              SpringConfig{
+                  .timestamp = NextTimeTickAfter(base::Milliseconds(100)),
+                  .expected = {.foreground_offset_physical = 1038.56,
+                               .background_offset_physical = 0,
+                               .done = false}},
+              SpringConfig{
+                  .timestamp = NextTimeTickAfter(base::Milliseconds(100)),
+                  .expected = {.foreground_offset_physical = 1078.42,
+                               .background_offset_physical = 0,
+                               .done = false}},
+              SpringConfig{
+                  .timestamp = NextTimeTickAfter(base::Milliseconds(100)),
+                  .expected = {.foreground_offset_physical =
+                                   kScreenWidthForTesting,
                                .background_offset_physical = 0,
                                .done = true}},
           },
@@ -375,7 +461,7 @@
 TEST_F(PhysicsModelUnittest, ProgressCommitStopInvoke_LiftAfterCommitStop) {
   const TestConfig config{
       // Ten gestures: simulate the finger moves from 0px to 1000px.
-      .gesture_progressed = TenGestureProgressed(base::Milliseconds(100)),
+      .gesture_progressed = TenGestureProgressed(base::Milliseconds(50)),
       .commit_stop =
           {
               SpringConfig{
@@ -385,39 +471,39 @@
                                .done = false}},
               SpringConfig{
                   .timestamp = NextTimeTickAfter(base::Milliseconds(50)),
-                  .expected = {.foreground_offset_physical = 945.85,
-                               .background_offset_physical = 0,
+                  .expected = {.foreground_offset_physical = 913.929f,
+                               .background_offset_physical = -1.198f,
                                .done = false}},
               SpringConfig{
                   .timestamp = NextTimeTickAfter(base::Milliseconds(50)),
-                  .expected = {.foreground_offset_physical = 988.71,
-                               .background_offset_physical = 0,
+                  .expected = {.foreground_offset_physical = 945.645f,
+                               .background_offset_physical = 0.f,
                                .done = false}},
               SpringConfig{
                   .timestamp = NextTimeTickAfter(base::Milliseconds(50)),
-                  .expected = {.foreground_offset_physical = 999.83,
-                               .background_offset_physical = 0,
+                  .expected = {.foreground_offset_physical = 957.281f,
+                               .background_offset_physical = 0.f,
                                .done = false}},
               SpringConfig{
                   .timestamp = NextTimeTickAfter(base::Milliseconds(50)),
-                  .expected = {.foreground_offset_physical = 993.94,
-                               .background_offset_physical = 0,
+                  .expected = {.foreground_offset_physical = 957.525f,
+                               .background_offset_physical = 0.f,
                                .done = false}},
               // The commit-stop spring is bouncing back (towards the left).
               SpringConfig{
                   .timestamp = NextTimeTickAfter(base::Milliseconds(50)),
-                  .expected = {.foreground_offset_physical = 980.58,
-                               .background_offset_physical = 0,
+                  .expected = {.foreground_offset_physical = 952.183f,
+                               .background_offset_physical = 0.f,
                                .done = false}},
               SpringConfig{
                   .timestamp = NextTimeTickAfter(base::Milliseconds(50)),
-                  .expected = {.foreground_offset_physical = 965.43,
-                               .background_offset_physical = 0,
+                  .expected = {.foreground_offset_physical = 944.857f,
+                               .background_offset_physical = 0.f,
                                .done = false}},
               SpringConfig{
                   .timestamp = NextTimeTickAfter(base::Milliseconds(50)),
-                  .expected = {.foreground_offset_physical = 951.49,
-                               .background_offset_physical = 0,
+                  .expected = {.foreground_offset_physical = 937.577f,
+                               .background_offset_physical = 0.f,
                                .done = false}},
           },
       .cancel = {},
@@ -425,13 +511,13 @@
           {
               SpringConfig{
                   .timestamp = NextTimeTickAfter(base::Milliseconds(100)),
-                  .expected = {.foreground_offset_physical = 1060.75,
-                               .background_offset_physical = 0,
+                  .expected = {.foreground_offset_physical = 1058.59f,
+                               .background_offset_physical = 0.f,
                                .done = false}},
               SpringConfig{
                   .timestamp = NextTimeTickAfter(base::Milliseconds(100)),
-                  .expected = {.foreground_offset_physical = 1079.25,
-                               .background_offset_physical = 0,
+                  .expected = {.foreground_offset_physical = 1079.16f,
+                               .background_offset_physical = 0.f,
                                .done = true}},
               SpringConfig{
                   .timestamp = NextTimeTickAfter(base::Milliseconds(100)),
@@ -476,29 +562,42 @@
 // the screen BEFORE the commit-stop position.
 TEST_F(PhysicsModelUnittest, ProgressCancel_LiftBeforeCommitStop) {
   const TestConfig config{
-      .gesture_progressed = NineGestureProgressed(base::Milliseconds(100)),
+      .gesture_progressed = NineGestureProgressed(base::Milliseconds(10)),
       .commit_stop = {},
       .cancel =
           {
               SpringConfig{
-                  .timestamp = NextTimeTickAfter(base::Milliseconds(100)),
+                  .timestamp = NextTimeTickAfter(base::Milliseconds(10)),
                   .expected = {.foreground_offset_physical = 765,
                                .background_offset_physical = -45,
                                .done = false}},
+              // Due to gesture speed, the foreground initially continues to
+              // move right.
               SpringConfig{
-                  .timestamp = NextTimeTickAfter(base::Milliseconds(100)),
-                  .expected = {.foreground_offset_physical = 111.73,
-                               .background_offset_physical = -237.14,
+                  .timestamp = NextTimeTickAfter(base::Milliseconds(10)),
+                  .expected = {.foreground_offset_physical = 797.577f,
+                               .background_offset_physical = -35.419f,
+                               .done = false}},
+              // And then bounces to the left.
+              SpringConfig{
+                  .timestamp = NextTimeTickAfter(base::Milliseconds(10)),
+                  .expected = {.foreground_offset_physical = 756.449f,
+                               .background_offset_physical = -47.515f,
                                .done = false}},
               SpringConfig{
                   .timestamp = NextTimeTickAfter(base::Milliseconds(100)),
-                  .expected = {.foreground_offset_physical = 0,
-                               .background_offset_physical = -270,
+                  .expected = {.foreground_offset_physical = 71.895f,
+                               .background_offset_physical = -248.854f,
+                               .done = false}},
+              SpringConfig{
+                  .timestamp = NextTimeTickAfter(base::Milliseconds(100)),
+                  .expected = {.foreground_offset_physical = 0.f,
+                               .background_offset_physical = -270.f,
                                .done = true}},
               SpringConfig{
                   .timestamp = NextTimeTickAfter(base::Milliseconds(100)),
-                  .expected = {.foreground_offset_physical = 0,
-                               .background_offset_physical = -270,
+                  .expected = {.foreground_offset_physical = 0.f,
+                               .background_offset_physical = -270.f,
                                .done = true}},
           },
       .invoke = {},
@@ -531,23 +630,23 @@
           {
               SpringConfig{
                   .timestamp = NextTimeTickAfter(base::Milliseconds(100)),
-                  .expected = {.foreground_offset_physical = 850,
-                               .background_offset_physical = -20,
+                  .expected = {.foreground_offset_physical = 850.f,
+                               .background_offset_physical = -20.f,
                                .done = false}},
               SpringConfig{
                   .timestamp = NextTimeTickAfter(base::Milliseconds(100)),
-                  .expected = {.foreground_offset_physical = 122.91,
-                               .background_offset_physical = -233.85,
+                  .expected = {.foreground_offset_physical = 115.395f,
+                               .background_offset_physical = -236.06f,
                                .done = false}},
               SpringConfig{
                   .timestamp = NextTimeTickAfter(base::Milliseconds(100)),
-                  .expected = {.foreground_offset_physical = 0,
-                               .background_offset_physical = -270,
+                  .expected = {.foreground_offset_physical = 0.f,
+                               .background_offset_physical = -270.f,
                                .done = true}},
               SpringConfig{
                   .timestamp = NextTimeTickAfter(base::Milliseconds(100)),
-                  .expected = {.foreground_offset_physical = 0,
-                               .background_offset_physical = -270,
+                  .expected = {.foreground_offset_physical = 0.f,
+                               .background_offset_physical = -270.f,
                                .done = true}},
           },
       .invoke = {},
@@ -575,33 +674,79 @@
 // that the commit-pending spring hasn't played a single frame.
 TEST_F(PhysicsModelUnittest, ProgressAndCancelNav) {
   const TestConfig config{
-      .gesture_progressed = NineGestureProgressed(base::Milliseconds(100)),
+      .gesture_progressed =
+          {
+              FingerDragCurveConfig{
+                  .movement_timestamp = {100.f, NextTimeTickAfter(
+                                                    base::Milliseconds(0))},
+                  .expected =
+                      PhysicsModel::Result{.foreground_offset_physical = 85,
+                                           .background_offset_physical = -245,
+                                           .done = false}},
+              FingerDragCurveConfig{
+                  .movement_timestamp = {100.f, NextTimeTickAfter(
+                                                    base::Milliseconds(20))},
+                  .expected =
+                      PhysicsModel::Result{.foreground_offset_physical = 170,
+                                           .background_offset_physical = -220,
+                                           .done = false}},
+              FingerDragCurveConfig{
+                  .movement_timestamp = {100.f, NextTimeTickAfter(
+                                                    base::Milliseconds(20))},
+                  .expected =
+                      PhysicsModel::Result{.foreground_offset_physical = 255,
+                                           .background_offset_physical = -195,
+                                           .done = false}},
+              FingerDragCurveConfig{
+                  .movement_timestamp = {-100.f, NextTimeTickAfter(
+                                                     base::Milliseconds(20))},
+                  .expected =
+                      PhysicsModel::Result{.foreground_offset_physical = 170,
+                                           .background_offset_physical = -220,
+                                           .done = false}},
+              FingerDragCurveConfig{
+                  .movement_timestamp = {-100.f, NextTimeTickAfter(
+                                                     base::Milliseconds(20))},
+                  .expected =
+                      PhysicsModel::Result{.foreground_offset_physical = 85,
+                                           .background_offset_physical = -245,
+                                           .done = false}},
+              FingerDragCurveConfig{
+                  .movement_timestamp = {-80.f, NextTimeTickAfter(
+                                                    base::Milliseconds(20))},
+                  .expected =
+                      PhysicsModel::Result{.foreground_offset_physical = 17,
+                                           .background_offset_physical = -265,
+                                           .done = false}},
+          },
       .commit_stop = {},
       .cancel =
           {
               SpringConfig{
-                  .timestamp = NextTimeTickAfter(base::Milliseconds(50)),
-                  .expected = {.foreground_offset_physical = 765,
-                               .background_offset_physical = -45,
+                  .timestamp = NextTimeTickAfter(base::Milliseconds(10)),
+                  .expected = {.foreground_offset_physical = 17,
+                               .background_offset_physical = -265,
+                               .done = false}},
+              // The spring moves the foreground to the left from the first
+              // iteration.
+              SpringConfig{
+                  .timestamp = NextTimeTickAfter(base::Milliseconds(10)),
+                  .expected = {.foreground_offset_physical = 9.006f,
+                               .background_offset_physical = -267.351,
                                .done = false}},
               SpringConfig{
-                  .timestamp = NextTimeTickAfter(base::Milliseconds(50)),
-                  .expected = {.foreground_offset_physical = 416.61,
-                               .background_offset_physical = -147.47,
+                  .timestamp = NextTimeTickAfter(base::Milliseconds(10)),
+                  .expected = {.foreground_offset_physical = 3.791f,
+                               .background_offset_physical = -268.885f,
                                .done = false}},
               SpringConfig{
-                  .timestamp = NextTimeTickAfter(base::Milliseconds(50)),
-                  .expected = {.foreground_offset_physical = 111.73,
-                               .background_offset_physical = -237.14,
-                               .done = false}},
+                  .timestamp = NextTimeTickAfter(base::Milliseconds(10)),
+                  .expected = {.foreground_offset_physical = 0.545f,
+                               .background_offset_physical = -269.84f,
+                               .done = true}},
               SpringConfig{
-                  .timestamp = NextTimeTickAfter(base::Milliseconds(50)),
-                  .expected = {.foreground_offset_physical = 17.45,
-                               .background_offset_physical = -264.87,
-                               .done = false}},
-              SpringConfig{
-                  .timestamp = NextTimeTickAfter(base::Milliseconds(50)),
-                  .expected = {.foreground_offset_physical = 0,
+                  .timestamp = NextTimeTickAfter(base::Milliseconds(10)),
+                  .expected = {.foreground_offset_physical = 0.f,
                                .background_offset_physical = -270,
                                .done = true}},
           },
@@ -632,51 +777,51 @@
 // back.
 TEST_F(PhysicsModelUnittest, ProgressCommitPendingAndCancelNav) {
   const TestConfig config{
-      .gesture_progressed = NineGestureProgressed(base::Milliseconds(100)),
+      .gesture_progressed = NineGestureProgressed(base::Milliseconds(25)),
       .commit_stop =
           {
               SpringConfig{
                   .timestamp = NextTimeTickAfter(base::Milliseconds(100)),
-                  .expected = {.foreground_offset_physical = 765,
-                               .background_offset_physical = -45,
+                  .expected = {.foreground_offset_physical = 765.f,
+                               .background_offset_physical = -45.f,
                                .done = false}},
               SpringConfig{
                   .timestamp = NextTimeTickAfter(base::Milliseconds(100)),
-                  .expected = {.foreground_offset_physical = 924.33,
-                               .background_offset_physical = 0,
+                  .expected = {.foreground_offset_physical = 960.412f,
+                               .background_offset_physical = 0.f,
                                .done = false}},
               SpringConfig{
                   .timestamp = NextTimeTickAfter(base::Milliseconds(100)),
-                  .expected = {.foreground_offset_physical = 959.68,
-                               .background_offset_physical = 0,
+                  .expected = {.foreground_offset_physical = 990.197f,
+                               .background_offset_physical = 0.f,
                                .done = false}},
               SpringConfig{
                   .timestamp = NextTimeTickAfter(base::Milliseconds(100)),
-                  .expected = {.foreground_offset_physical = 951.75,
-                               .background_offset_physical = 0,
+                  .expected = {.foreground_offset_physical = 968.978f,
+                               .background_offset_physical = 0.f,
                                .done = false}},
           },
       .cancel =
           {
               SpringConfig{
                   .timestamp = NextTimeTickAfter(base::Milliseconds(50)),
-                  .expected = {.foreground_offset_physical = 511.11,
-                               .background_offset_physical = -119.67,
+                  .expected = {.foreground_offset_physical = 519.829f,
+                               .background_offset_physical = -117.109f,
                                .done = false}},
               SpringConfig{
                   .timestamp = NextTimeTickAfter(base::Milliseconds(50)),
-                  .expected = {.foreground_offset_physical = 136.29,
-                               .background_offset_physical = -229.91,
+                  .expected = {.foreground_offset_physical = 138.558f,
+                               .background_offset_physical = -229.248f,
                                .done = false}},
               SpringConfig{
                   .timestamp = NextTimeTickAfter(base::Milliseconds(50)),
-                  .expected = {.foreground_offset_physical = 21.12,
-                               .background_offset_physical = -263.79,
+                  .expected = {.foreground_offset_physical = 21.457f,
+                               .background_offset_physical = -263.689f,
                                .done = false}},
               SpringConfig{
-                  .timestamp = NextTimeTickAfter(base::Milliseconds(50)),
-                  .expected = {.foreground_offset_physical = 0,
-                               .background_offset_physical = -270,
+                  .timestamp = NextTimeTickAfter(base::Milliseconds(100)),
+                  .expected = {.foreground_offset_physical = 0.f,
+                               .background_offset_physical = -270.f,
                                .done = true}},
           },
       .invoke = {},
diff --git a/content/browser/renderer_host/frame_tree_node.cc b/content/browser/renderer_host/frame_tree_node.cc
index 25db812f..9480fef 100644
--- a/content/browser/renderer_host/frame_tree_node.cc
+++ b/content/browser/renderer_host/frame_tree_node.cc
@@ -889,17 +889,6 @@
   return true;
 }
 
-bool FrameTreeNode::VerifyUserActivation() {
-  DCHECK(base::FeatureList::IsEnabled(
-             features::kBrowserVerifiedUserActivationMouse) ||
-         base::FeatureList::IsEnabled(
-             features::kBrowserVerifiedUserActivationKeyboard));
-
-  return render_manager_.current_frame_host()
-      ->GetRenderWidgetHost()
-      ->RemovePendingUserActivationIfAvailable();
-}
-
 bool FrameTreeNode::UpdateUserActivationState(
     blink::mojom::UserActivationUpdateType update_type,
     blink::mojom::UserActivationNotificationType notification_type) {
@@ -911,19 +900,6 @@
     case blink::mojom::UserActivationUpdateType::kNotifyActivation:
       update_result = NotifyUserActivation(notification_type);
       break;
-    case blink::mojom::UserActivationUpdateType::
-        kNotifyActivationPendingBrowserVerification: {
-      if (VerifyUserActivation()) {
-        update_result = NotifyUserActivation(
-            blink::mojom::UserActivationNotificationType::kInteraction);
-        update_type = blink::mojom::UserActivationUpdateType::kNotifyActivation;
-      } else {
-        // TODO(crbug.com/40091540): We need to decide what to do when
-        // user activation verification failed. NOTREACHED here will make all
-        // unrelated tests that inject event to renderer fail.
-        return false;
-      }
-    } break;
     case blink::mojom::UserActivationUpdateType::kNotifyActivationStickyOnly:
       update_result = NotifyUserActivationStickyOnly();
       break;
diff --git a/content/browser/renderer_host/render_frame_host_impl.cc b/content/browser/renderer_host/render_frame_host_impl.cc
index 779835d1..5c61422 100644
--- a/content/browser/renderer_host/render_frame_host_impl.cc
+++ b/content/browser/renderer_host/render_frame_host_impl.cc
@@ -1168,25 +1168,58 @@
                                 outcome);
 }
 
+// Traverse up a frame tree, starting at `rfh`, until finding a RFH whose
+// associated fenced document data matches the expected criteria. Namely, it
+// must contain automatic beacon data for the provided `event_type`, and if
+// `is_same_origin` is set to false (i.e. the frame initiating an automatic
+// beacon is cross-origin to the mapped URL of the root frame's fenced frame
+// config), the data must be marked as cross-origin exposed.
 FencedDocumentData* GetFencedDocumentData(
     RenderFrameHostImpl* rfh,
-    blink::mojom::AutomaticBeaconType event_type) {
-  while (rfh) {
+    blink::mojom::AutomaticBeaconType event_type,
+    bool is_same_origin) {
+  // Traverse up to but not past a URN iframe root.
+  for (; rfh; rfh = rfh->frame_tree_node()->HasFencedFrameProperties()
+                        ? nullptr
+                        : rfh->GetParent()) {
     FencedDocumentData* fenced_document_data =
         FencedDocumentData::GetForCurrentDocument(rfh);
-    if (fenced_document_data &&
-        fenced_document_data->GetAutomaticBeaconInfo(event_type)) {
+    if (!fenced_document_data) {
+      continue;
+    }
+
+    const std::optional<AutomaticBeaconInfo> beacon_info =
+        fenced_document_data->GetAutomaticBeaconInfo(event_type);
+    if (!beacon_info) {
+      continue;
+    }
+
+    // Check if the beacon data is usable based on whether the data needs to be
+    // cross-origin exposed. If the feature flag is not enabled, unconditionally
+    // return the document data, even if it means returning non-cross origin
+    // exposed data for a cross-origin automatic beacon (which would result in
+    // no data being sent).
+    if (is_same_origin || beacon_info->cross_origin_exposed ||
+        !base::FeatureList::IsEnabled(
+            blink::features::kFencedFramesCrossOriginAutomaticBeaconData)) {
       return fenced_document_data;
     }
-    // Don't traverse past a URN iframe root.
-    if (rfh->frame_tree_node()->HasFencedFrameProperties()) {
-      return nullptr;
-    }
-    rfh = rfh->GetParent();
   }
   return nullptr;
 }
 
+bool FencedFrameAutomaticBeaconsAllowed(RenderFrameHostImpl* rfh) {
+  if (!rfh->GetLastResponseHead() || !rfh->GetLastResponseHead()->headers) {
+    return false;
+  }
+
+  std::optional<std::string> allow =
+      rfh->GetLastResponseHead()->headers->GetNormalizedHeader(
+          "Allow-Fenced-Frame-Automatic-Beacons");
+
+  return allow && base::EqualsCaseInsensitiveASCII(*allow, "true");
+}
+
 bool NewProcessUsedForNavigationWhenSameSiteProcessExists(
     RenderFrameHostImpl* committing_frame) {
   RoutingIDFrameMap* frames = g_routing_id_frame_map.Pointer();
@@ -9793,25 +9826,27 @@
   if (!properties.has_value() || !properties->fenced_frame_reporter()) {
     return;
   }
+  bool is_same_origin =
+      properties->mapped_url().has_value() &&
+      initiator_rfh->GetLastCommittedOrigin().IsSameOriginWith(
+          url::Origin::Create(
+              properties->mapped_url()->GetValueIgnoringVisibility()));
   FencedDocumentData* fenced_document_data = nullptr;
   std::optional<AutomaticBeaconInfo> info;
-  fenced_document_data = GetFencedDocumentData(initiator_rfh, event_type);
+  fenced_document_data =
+      GetFencedDocumentData(initiator_rfh, event_type, is_same_origin);
   if (fenced_document_data) {
     info = fenced_document_data->GetAutomaticBeaconInfo(event_type);
   }
 
   // The initiator of the navigation can opt-in to sending automatic beacons
   // when they are served using the `Allow-Fenced-Frame-Automatic-Beacons=true`
-  // HTTP response header. A cross-origin document can only opt in through the
-  // header.
-  const bool initiator_allows_fenced_frame_automatic_beacons =
-      initiator_rfh->GetLastResponseHead() &&
-      initiator_rfh->GetLastResponseHead()->headers && [&]() -> bool {
-    std::optional<std::string> allow =
-        initiator_rfh->GetLastResponseHead()->headers->GetNormalizedHeader(
-            "Allow-Fenced-Frame-Automatic-Beacons");
-    return allow && base::EqualsCaseInsensitiveASCII(*allow, "true");
-  }();
+  // HTTP response header. This is used when automatic beacon data lives in a
+  // different document as an alternative to opting in via setting automatic
+  // beacon data itself, or when there is no data to be sent as part of the
+  // beacon.
+  bool initiator_allows_fenced_frame_automatic_beacons =
+      FencedFrameAutomaticBeaconsAllowed(initiator_rfh);
 
   // If there is no automatic beacon declared and no opt-in through a header,
   // don't send an automatic beacon.
@@ -9840,11 +9875,6 @@
   // Beacons can be sent when the initiator document is cross-origin with the
   // fenced frame config's mapped url, but only if the document opts in through
   // a header.
-  bool is_same_origin =
-      properties->mapped_url().has_value() &&
-      initiator_rfh->GetLastCommittedOrigin().IsSameOriginWith(
-          url::Origin::Create(
-              properties->mapped_url()->GetValueIgnoringVisibility()));
   if (!is_same_origin && !initiator_allows_fenced_frame_automatic_beacons) {
     RecordAutomaticBeaconOutcome(
         blink::AutomaticBeaconOutcome::kNotSameOriginNotOptedIn);
@@ -10029,10 +10059,20 @@
       !GetLastCommittedOrigin().IsSameOriginWith(
           url::Origin::Create(fenced_frame_properties->mapped_url()
                                   ->GetValueIgnoringVisibility()))) {
-    mojo::ReportBadMessage(
-        "Automatic beacon data can only be set from frames that registered "
-        "reporting metadata.");
-    return;
+    if (!base::FeatureList::IsEnabled(
+            blink::features::kFencedFramesCrossOriginAutomaticBeaconData)) {
+      mojo::ReportBadMessage(
+          "Automatic beacon data can only be set from frames that registered "
+          "reporting metadata.");
+      return;
+    }
+    if (!cross_origin_exposed) {
+      mojo::ReportBadMessage(
+          "This document is cross-origin to the document that contains "
+          "reporting metadata, but setReportEventDataForAutomaticBeacons() was "
+          "not called with crossOriginExposed=true.");
+      return;
+    }
   }
 
   // Ad components cannot set event data for automatic beacons.
diff --git a/content/browser/renderer_host/render_view_host_delegate.h b/content/browser/renderer_host/render_view_host_delegate.h
index 664374b..73f8dbe7 100644
--- a/content/browser/renderer_host/render_view_host_delegate.h
+++ b/content/browser/renderer_host/render_view_host_delegate.h
@@ -94,8 +94,8 @@
   // WebPreferences. If we want to guarantee that the value reflects the current
   // state of the WebContents, NotifyPreferencesChanged() should be called
   // before calling this.
-  virtual const blink::web_pref::WebPreferences&
-  GetOrCreateWebPreferences() = 0;
+  virtual const blink::web_pref::WebPreferences& GetOrCreateWebPreferences(
+      RenderViewHostImpl* render_view_host) = 0;
 
   // Sets the WebPreferences for the WebContents associated with this
   // RenderViewHost to |prefs| and send the new value to all renderers in the
diff --git a/content/browser/renderer_host/render_view_host_impl.cc b/content/browser/renderer_host/render_view_host_impl.cc
index 1dc9195..0b5f5002 100644
--- a/content/browser/renderer_host/render_view_host_impl.cc
+++ b/content/browser/renderer_host/render_view_host_impl.cc
@@ -450,7 +450,7 @@
   mojom::CreateViewParamsPtr params = mojom::CreateViewParams::New();
 
   params->renderer_preferences = delegate_->GetRendererPrefs(this);
-  params->web_preferences = delegate_->GetOrCreateWebPreferences();
+  params->web_preferences = delegate_->GetOrCreateWebPreferences(this);
   params->color_provider_colors = delegate_->GetColorProviderColorMaps();
   params->opener_frame_token = opener_frame_token;
   params->replication_state =
@@ -766,7 +766,7 @@
 RenderViewHostImpl::GetWebkitPreferencesForWidget() {
   if (!delegate_)
     return blink::web_pref::WebPreferences();
-  return delegate_->GetOrCreateWebPreferences();
+  return delegate_->GetOrCreateWebPreferences(this);
 }
 
 void RenderViewHostImpl::RenderViewCreated(
@@ -908,7 +908,7 @@
     if (!will_send_web_preferences_callback_for_testing_.is_null()) {
       will_send_web_preferences_callback_for_testing_.Run();
     }
-    broadcast->UpdateWebPreferences(delegate_->GetOrCreateWebPreferences());
+    broadcast->UpdateWebPreferences(delegate_->GetOrCreateWebPreferences(this));
   }
 }
 
diff --git a/content/browser/renderer_host/render_widget_host_impl.cc b/content/browser/renderer_host/render_widget_host_impl.cc
index 7ba8c01..9999cf0 100644
--- a/content/browser/renderer_host/render_widget_host_impl.cc
+++ b/content/browser/renderer_host/render_widget_host_impl.cc
@@ -20,7 +20,6 @@
 #include "base/containers/contains.h"
 #include "base/debug/alias.h"
 #include "base/debug/dump_without_crashing.h"
-#include "base/feature_list.h"
 #include "base/files/file_path.h"
 #include "base/functional/bind.h"
 #include "base/functional/callback_helpers.h"
@@ -595,10 +594,6 @@
   GetRenderInputRouter()->SetView(view);
 }
 
-// static
-const base::TimeDelta RenderWidgetHostImpl::kActivationNotificationExpireTime =
-    base::Milliseconds(300);
-
 RenderProcessHost* RenderWidgetHostImpl::GetProcess() {
   return agent_scheduling_group_->GetProcess();
 }
@@ -1507,8 +1502,6 @@
   if (view_) {
     view_->DidNavigate();
   }
-
-  ClearPendingUserActivation();
 }
 
 void RenderWidgetHostImpl::StartNewContentRenderingTimeout() {
@@ -2554,7 +2547,6 @@
 
 void RenderWidgetHostImpl::NotifyObserversOfInputEvent(
     const WebInputEvent& event) {
-  AddPendingUserActivation(event);
   for (auto& observer : input_event_observers_) {
     observer.OnInputEvent(*this, event);
   }
@@ -3289,35 +3281,6 @@
   }
 }
 
-void RenderWidgetHostImpl::AddPendingUserActivation(
-    const WebInputEvent& event) {
-  if ((base::FeatureList::IsEnabled(
-           features::kBrowserVerifiedUserActivationMouse) &&
-       event.GetType() == WebInputEvent::Type::kMouseDown) ||
-      (base::FeatureList::IsEnabled(
-           features::kBrowserVerifiedUserActivationKeyboard) &&
-       (event.GetType() == WebInputEvent::Type::kKeyDown ||
-        event.GetType() == WebInputEvent::Type::kRawKeyDown))) {
-    pending_user_activation_timer_.Start(
-        FROM_HERE, kActivationNotificationExpireTime,
-        base::BindOnce(&RenderWidgetHostImpl::ClearPendingUserActivation,
-                       base::Unretained(this)));
-    pending_user_activation_counter_++;
-  }
-}
-
-void RenderWidgetHostImpl::ClearPendingUserActivation() {
-  pending_user_activation_counter_ = 0;
-  pending_user_activation_timer_.Stop();
-}
-
-bool RenderWidgetHostImpl::RemovePendingUserActivationIfAvailable() {
-  if (pending_user_activation_counter_ > 0) {
-    pending_user_activation_counter_--;
-    return true;
-  }
-  return false;
-}
 
 const mojo::AssociatedRemote<blink::mojom::FrameWidget>&
 RenderWidgetHostImpl::GetAssociatedFrameWidget() {
diff --git a/content/browser/renderer_host/render_widget_host_impl.h b/content/browser/renderer_host/render_widget_host_impl.h
index 56670ed6..5307d55 100644
--- a/content/browser/renderer_host/render_widget_host_impl.h
+++ b/content/browser/renderer_host/render_widget_host_impl.h
@@ -903,12 +903,6 @@
   // Marks all views in the frame tree as evicted.
   std::vector<viz::SurfaceId> CollectSurfaceIdsForEviction();
 
-  // This function validates a renderer's attempt to activate frames. It
-  // removes one pending user activation if available and returns true;
-  // otherwise, it returns false.  See comments on
-  // Add/ClearPendingUserActivation() for details.
-  bool RemovePendingUserActivationIfAvailable();
-
   const mojo::AssociatedRemote<blink::mojom::FrameWidget>&
   GetAssociatedFrameWidget();
 
@@ -1067,7 +1061,6 @@
                            DoNotAcceptPopupBoundsUntilScreenRectsAcked);
   FRIEND_TEST_ALL_PREFIXES(RenderWidgetHostTest,
                            DontPostponeInputEventAckTimeout);
-  FRIEND_TEST_ALL_PREFIXES(RenderWidgetHostTest, PendingUserActivationTimeout);
   FRIEND_TEST_ALL_PREFIXES(RenderWidgetHostTest, RendererExitedNoDrag);
   FRIEND_TEST_ALL_PREFIXES(RenderWidgetHostTest,
                            StopAndStartInputEventAckTimeout);
@@ -1239,23 +1232,11 @@
   // TODO(oshima): Update the comment when the migration is completed.
   gfx::PointF ConvertWindowPointToViewport(const gfx::PointF& window_point);
 
-  // The following functions are used to keep track of pending user activation
-  // events, which are input events (e.g., mousedown or keydown) that allow a
-  // renderer to gain user activation.  AddPendingUserActivation() increments
-  // |pending_user_activation_counter_| and sets a timer, which allows the
-  // renderer to claim user activation within
-  // |kActivationNotificationExpireTime| ms.  ClearPendingUserActivation()
-  // clears the counter and is called after navigations or timeouts.
-  void AddPendingUserActivation(const blink::WebInputEvent& event);
-  void ClearPendingUserActivation();
 
   // Dispatch any buffered FrameSink requests from the renderer if the widget
   // has a view and is the owner for the FrameSinkId assigned to it.
   void MaybeDispatchBufferedFrameSinkRequest();
 
-  // An expiry time for resetting the pending_user_activation_timer_.
-  static const base::TimeDelta kActivationNotificationExpireTime;
-
   raw_ptr<FrameTree> frame_tree_;
 
   // RenderWidgetHost are either:
@@ -1554,11 +1535,6 @@
   bool sent_autoscroll_scroll_begin_ = false;
   gfx::PointF autoscroll_start_position_;
 
-  // Counter for possible-activation-triggering input event.
-  int pending_user_activation_counter_ = 0;
-  // This timer resets |pending_user_activation_counter_| after a short delay.
-  // See comments on Add/ClearPendingUserActivation().
-  base::OneShotTimer pending_user_activation_timer_;
 
   input::InputRouterImpl::RequestMouseLockCallback request_pointer_lock_callback_;
 
diff --git a/content/browser/renderer_host/render_widget_host_unittest.cc b/content/browser/renderer_host/render_widget_host_unittest.cc
index 2d4ca3a3..d5d80035 100644
--- a/content/browser/renderer_host/render_widget_host_unittest.cc
+++ b/content/browser/renderer_host/render_widget_host_unittest.cc
@@ -2309,38 +2309,6 @@
   EXPECT_TRUE(host_->new_content_rendering_timeout_fired());
 }
 
-TEST_F(RenderWidgetHostTest, PendingUserActivationTimeout) {
-  base::test::ScopedFeatureList scoped_feature_list_;
-  scoped_feature_list_.InitWithFeatures(
-      {features::kBrowserVerifiedUserActivationMouse,
-       features::kBrowserVerifiedUserActivationKeyboard},
-      {});
-
-  // One event allows one activation notification.
-  SimulateMouseEvent(WebInputEvent::Type::kMouseDown);
-  EXPECT_TRUE(host_->RemovePendingUserActivationIfAvailable());
-  EXPECT_FALSE(host_->RemovePendingUserActivationIfAvailable());
-
-  // Mouse move and up does not increase pending user activation counter.
-  SimulateMouseEvent(WebInputEvent::Type::kMouseMove);
-  SimulateMouseEvent(WebInputEvent::Type::kMouseUp);
-  EXPECT_FALSE(host_->RemovePendingUserActivationIfAvailable());
-
-  // 2 events allow 2 activation notifications.
-  SimulateMouseEvent(WebInputEvent::Type::kMouseDown);
-  SimulateKeyboardEvent(WebInputEvent::Type::kKeyDown);
-  EXPECT_TRUE(host_->RemovePendingUserActivationIfAvailable());
-  EXPECT_TRUE(host_->RemovePendingUserActivationIfAvailable());
-  EXPECT_FALSE(host_->RemovePendingUserActivationIfAvailable());
-
-  // Timer reset the pending activation.
-  SimulateMouseEvent(WebInputEvent::Type::kMouseDown);
-  SimulateMouseEvent(WebInputEvent::Type::kMouseDown);
-  task_environment_.FastForwardBy(
-      RenderWidgetHostImpl::kActivationNotificationExpireTime);
-  EXPECT_FALSE(host_->RemovePendingUserActivationIfAvailable());
-}
-
 // Tests that fling events are not dispatched when the wheel event is consumed.
 TEST_F(RenderWidgetHostTest, NoFlingEventsWhenLastScrollEventConsumed) {
   // Simulate a consumed wheel event.
diff --git a/content/browser/service_worker/service_worker_browsertest.cc b/content/browser/service_worker/service_worker_browsertest.cc
index 7184b158..ef7ddf7 100644
--- a/content/browser/service_worker/service_worker_browsertest.cc
+++ b/content/browser/service_worker/service_worker_browsertest.cc
@@ -493,8 +493,9 @@
     return data_saver_enabled_;
   }
 
-  void OverrideWebkitPrefs(WebContents* web_contents,
-                           blink::web_pref::WebPreferences* prefs) override {
+  void OverrideWebPreferences(WebContents* web_contents,
+                              SiteInstance& main_frame_site,
+                              blink::web_pref::WebPreferences* prefs) override {
     prefs->data_saver_enabled = data_saver_enabled_;
   }
 
diff --git a/content/browser/service_worker/service_worker_version_browsertest.cc b/content/browser/service_worker/service_worker_version_browsertest.cc
index 49886bad..7690c5db 100644
--- a/content/browser/service_worker/service_worker_version_browsertest.cc
+++ b/content/browser/service_worker/service_worker_version_browsertest.cc
@@ -778,8 +778,9 @@
     return data_saver_enabled_;
   }
 
-  void OverrideWebkitPrefs(WebContents* web_contents,
-                           blink::web_pref::WebPreferences* prefs) override {
+  void OverrideWebPreferences(WebContents* web_contents,
+                              SiteInstance& main_frame_site,
+                              blink::web_pref::WebPreferences* prefs) override {
     prefs->data_saver_enabled = data_saver_enabled_;
   }
 
diff --git a/content/browser/site_per_process_browsertest.cc b/content/browser/site_per_process_browsertest.cc
index 6cda8dc0..47afc760 100644
--- a/content/browser/site_per_process_browsertest.cc
+++ b/content/browser/site_per_process_browsertest.cc
@@ -11581,8 +11581,9 @@
   EnableForceZoomContentClient& operator=(const EnableForceZoomContentClient&) =
       delete;
 
-  void OverrideWebkitPrefs(WebContents* web_contents,
-                           blink::web_pref::WebPreferences* prefs) override {
+  void OverrideWebPreferences(WebContents* web_contents,
+                              SiteInstance& main_frame_site,
+                              blink::web_pref::WebPreferences* prefs) override {
     prefs->force_enable_zoom = true;
   }
 };
@@ -12562,8 +12563,9 @@
   DoubleTapZoomContentBrowserClient& operator=(
       const DoubleTapZoomContentBrowserClient&) = delete;
 
-  void OverrideWebkitPrefs(
+  void OverrideWebPreferences(
       content::WebContents* web_contents,
+      SiteInstance& main_frame_site,
       blink::web_pref::WebPreferences* web_prefs) override {
     web_prefs->double_tap_to_zoom_enabled = true;
   }
diff --git a/content/browser/site_per_process_hit_test_browsertest.cc b/content/browser/site_per_process_hit_test_browsertest.cc
index 0487ef56..a7990eb8 100644
--- a/content/browser/site_per_process_hit_test_browsertest.cc
+++ b/content/browser/site_per_process_hit_test_browsertest.cc
@@ -872,27 +872,6 @@
   }
 };
 
-//
-// SitePerProcessUserActivationHitTestBrowserTest
-//
-
-class SitePerProcessUserActivationHitTestBrowserTest
-    : public SitePerProcessHitTestBrowserTest {
- public:
-  SitePerProcessUserActivationHitTestBrowserTest() {}
-
- protected:
-  void SetUpCommandLine(base::CommandLine* command_line) override {
-    SitePerProcessBrowserTestBase::SetUpCommandLine(command_line);
-    ui::PlatformEventSource::SetIgnoreNativePlatformEvents(true);
-    feature_list_.InitAndEnableFeature(
-        features::kBrowserVerifiedUserActivationMouse);
-  }
-
- private:
-  base::test::ScopedFeatureList feature_list_;
-};
-
 // Restrict to Aura to we can use routable MouseWheel event via
 // RenderWidgetHostViewAura::OnScrollEvent().
 #if defined(USE_AURA)
@@ -6895,96 +6874,6 @@
   }
 }
 
-// TODO(crbug.com/40804367): This flakes badly on debug & sanitizer
-// builds on almost all platforms, and on Mac and Android.
-IN_PROC_BROWSER_TEST_F(SitePerProcessUserActivationHitTestBrowserTest,
-                       DISABLED_RenderWidgetUserActivationStateTest) {
-  GURL main_url(embedded_test_server()->GetURL(
-      "foo.com", "/frame_tree/page_with_positioned_frame.html"));
-  EXPECT_TRUE(NavigateToURL(shell(), main_url));
-
-  FrameTreeNode* root = web_contents()->GetPrimaryFrameTree().root();
-  FrameTreeNode* child = root->child_at(0);
-  ASSERT_EQ(
-      " Site A ------------ proxies for B\n"
-      "   +--Site B ------- proxies for A\n"
-      "Where A = http://foo.com/\n"
-      "      B = http://baz.com/",
-      DepictFrameTree(root));
-
-  WaitForHitTestData(child->current_frame_host());
-
-  RenderWidgetHostMouseEventMonitor main_frame_monitor(
-      root->current_frame_host()->GetRenderWidgetHost());
-  RenderWidgetHostMouseEventMonitor child_frame_monitor(
-      child->current_frame_host()->GetRenderWidgetHost());
-
-  RenderWidgetHostViewBase* rwhv_root = static_cast<RenderWidgetHostViewBase*>(
-      root->current_frame_host()->GetRenderWidgetHost()->GetView());
-  RenderWidgetHostViewBase* rwhv_child = static_cast<RenderWidgetHostViewBase*>(
-      child->current_frame_host()->GetRenderWidgetHost()->GetView());
-
-  // Send a mouse down event to main frame.
-  blink::WebMouseEvent mouse_event(
-      blink::WebInputEvent::Type::kMouseDown,
-      blink::WebInputEvent::kNoModifiers,
-      blink::WebInputEvent::GetStaticTimeStampForTests());
-  mouse_event.button = blink::WebPointerProperties::Button::kLeft;
-  mouse_event.click_count = 1;
-  main_frame_monitor.ResetEventReceived();
-
-  gfx::PointF click_point(10, 10);
-  DispatchMouseEventAndWaitUntilDispatch(web_contents(), mouse_event, rwhv_root,
-                                         click_point, rwhv_root, click_point);
-  EXPECT_TRUE(main_frame_monitor.EventWasReceived());
-  base::RunLoop().RunUntilIdle();
-
-  // Wait for root frame gets activated.
-  while (!root->HasTransientUserActivation()) {
-    base::RunLoop loop;
-    base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
-        FROM_HERE, loop.QuitClosure());
-    loop.Run();
-  }
-  // Child frame doesn't have user activation.
-  EXPECT_FALSE(child->HasTransientUserActivation());
-  // Root frame's pending activation state has been cleared by activation.
-  EXPECT_FALSE(root->current_frame_host()
-                   ->GetRenderWidgetHost()
-                   ->RemovePendingUserActivationIfAvailable());
-
-  // Clear the activation state.
-  root->UpdateUserActivationState(
-      blink::mojom::UserActivationUpdateType::kClearActivation,
-      blink::mojom::UserActivationNotificationType::kTest);
-
-  // Send a mouse down to child frame.
-  mouse_event.SetType(blink::WebInputEvent::Type::kMouseDown);
-  child_frame_monitor.ResetEventReceived();
-  DispatchMouseEventAndWaitUntilDispatch(web_contents(), mouse_event,
-                                         rwhv_child, click_point, rwhv_child,
-                                         click_point);
-  EXPECT_TRUE(child_frame_monitor.EventWasReceived());
-  base::RunLoop().RunUntilIdle();
-
-  // Wait for child frame to get activated.
-  while (!child->HasTransientUserActivation()) {
-    base::RunLoop loop;
-    base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
-        FROM_HERE, loop.QuitClosure());
-    loop.Run();
-  }
-  // With UAV2, ancestor frames get activated too.
-  EXPECT_TRUE(root->HasTransientUserActivation());
-  // Both child frame and root frame don't have allowed_activation state
-  EXPECT_FALSE(root->current_frame_host()
-                   ->GetRenderWidgetHost()
-                   ->RemovePendingUserActivationIfAvailable());
-  EXPECT_FALSE(child->current_frame_host()
-                   ->GetRenderWidgetHost()
-                   ->RemovePendingUserActivationIfAvailable());
-}
-
 class SitePerProcessHitTestDataGenerationBrowserTest
     : public SitePerProcessHitTestBrowserTest {
  public:
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc
index 5a68302..28bcc8d9 100644
--- a/content/browser/web_contents/web_contents_impl.cc
+++ b/content/browser/web_contents/web_contents_impl.cc
@@ -3362,8 +3362,10 @@
       &WebContentsObserver::DidChangeVisibleSecurityState);
 }
 
-const blink::web_pref::WebPreferences WebContentsImpl::ComputeWebPreferences() {
+const blink::web_pref::WebPreferences WebContentsImpl::ComputeWebPreferences(
+    RenderFrameHostImpl* main_frame) {
   OPTIONAL_TRACE_EVENT0("browser", "WebContentsImpl::ComputeWebPreferences");
+  CHECK(main_frame->is_main_frame());
 
   blink::web_pref::WebPreferences prefs;
 
@@ -3540,13 +3542,14 @@
 #endif  // BUILDFLAG(IS_ANDROID)
 
   // GuestViews in the same StoragePartition need to find each other's frames.
-  prefs.renderer_wide_named_frame_lookup = IsGuest();
+  prefs.renderer_wide_named_frame_lookup =
+      IsGuest() || main_frame->frame_tree()->is_guest();
 
   if (command_line.HasSwitch(switches::kHideScrollbars)) {
     prefs.hide_scrollbars = true;
   }
-
-  GetContentClient()->browser()->OverrideWebkitPrefs(this, &prefs);
+  GetContentClient()->browser()->OverrideWebPreferences(
+      this, *main_frame->GetSiteInstance(), &prefs);
   return prefs;
 }
 
@@ -3560,7 +3563,7 @@
     return;
   }
   updating_web_preferences_ = true;
-  SetWebPreferences(ComputeWebPreferences());
+  SetWebPreferences(ComputeWebPreferences(GetPrimaryMainFrame()));
 #if BUILDFLAG(IS_ANDROID)
   for (FrameTreeNode* node : primary_frame_tree_.Nodes()) {
     RenderFrameHostImpl* rfh = node->current_frame_host();
@@ -7011,6 +7014,10 @@
     max_loaded_frame_count_ = GetFrameTreeSize(&primary_frame_tree_);
   }
 
+  // TODO(crbug.com/40202416): MPArch GuestView: We might need to look up the
+  // preferences for the navigation here and adjust the guest, but for now
+  // SetWebPreferences does not adjust the guest frame tree so we look for the
+  // preferences matching the primary main frame.
   if (web_preferences_) {
     // Update the WebPreferences for this WebContents that depends on changes
     // that might occur during navigation. This will only update the preferences
@@ -7018,7 +7025,8 @@
     // that needs to stay the same after navigations).
     bool value_changed_due_to_override =
         GetContentClient()->browser()->OverrideWebPreferencesAfterNavigation(
-            this, web_preferences_.get());
+            this, *GetPrimaryMainFrame()->GetSiteInstance(),
+            web_preferences_.get());
     // We need to update the WebPreferences value on the renderer if the value
     // is changed due to the override above, or if the navigation is served from
     // the back-forward cache, because the WebPreferences value stored in the
@@ -8654,6 +8662,16 @@
   return renderer_preferences_;
 }
 
+const blink::web_pref::WebPreferences&
+WebContentsImpl::GetOrCreateWebPreferences(
+    RenderViewHostImpl* render_view_host) {
+  if (auto* guest = GuestPageHolderImpl::FromRenderFrameHost(
+          *render_view_host->frame_tree()->GetMainFrame())) {
+    return guest->GetWebPreferences();
+  }
+  return GetOrCreateWebPreferences();
+}
+
 RenderFrameHostImpl* WebContentsImpl::GetOuterWebContentsFrame() {
   if (GetOuterDelegateFrameTreeNodeId().is_null()) {
     return nullptr;
diff --git a/content/browser/web_contents/web_contents_impl.h b/content/browser/web_contents/web_contents_impl.h
index f985ea5..0e2c4ab 100644
--- a/content/browser/web_contents/web_contents_impl.h
+++ b/content/browser/web_contents/web_contents_impl.h
@@ -941,6 +941,8 @@
       const std::optional<std::u16string>& untrusted_stack_trace) override;
   const blink::RendererPreferences& GetRendererPrefs(
       RenderViewHostImpl* render_view_host) override;
+  const blink::web_pref::WebPreferences& GetOrCreateWebPreferences(
+      RenderViewHostImpl* render_view_host) override;
   void DidReceiveInputEvent(RenderWidgetHostImpl* render_widget_host,
                             const blink::WebInputEvent& event) override;
   bool ShouldIgnoreWebInputEvents(const blink::WebInputEvent& event) override;
@@ -1497,7 +1499,8 @@
   // Recomputes only the "fast" preferences (those not requiring slow
   // platform/device polling); the remaining "slow" ones are recomputed only if
   // the preference cache is empty.
-  const blink::web_pref::WebPreferences ComputeWebPreferences();
+  const blink::web_pref::WebPreferences ComputeWebPreferences(
+      RenderFrameHostImpl* main_frame);
 
   // Certain WebXr modes integrate with Viz as a compositor directly, and thus
   // have their own FrameSinkId that typically renders fullscreen, obscuring
diff --git a/content/browser/web_contents/web_contents_observer_browsertest.cc b/content/browser/web_contents/web_contents_observer_browsertest.cc
index 3e22abd..bbe2368 100644
--- a/content/browser/web_contents/web_contents_observer_browsertest.cc
+++ b/content/browser/web_contents/web_contents_observer_browsertest.cc
@@ -889,7 +889,7 @@
  protected:
   void SetUpCommandLine(base::CommandLine* command_line) override {
     WebContentsObserverBrowserTest::SetUpCommandLine(command_line);
-    // ShellContentBrowserClient::OverrideWebkitPrefs() overrides the
+    // ShellContentBrowserClient::OverrideWebPreferences() overrides the
     // prefers-color-scheme according to switches::kForceDarkMode command line.
     if (GetParam() == blink::mojom::PreferredColorScheme::kDark)
       command_line->AppendSwitch(switches::kForceDarkMode);
diff --git a/content/child/runtime_features.cc b/content/child/runtime_features.cc
index 91637a9..10b62df 100644
--- a/content/child/runtime_features.cc
+++ b/content/child/runtime_features.cc
@@ -194,10 +194,6 @@
           {wf::EnableBackgroundFetch, raw_ref(features::kBackgroundFetch)},
           {wf::EnableBoundaryEventDispatchTracksNodeRemoval,
            raw_ref(blink::features::kBoundaryEventDispatchTracksNodeRemoval)},
-          {wf::EnableBrowserVerifiedUserActivationKeyboard,
-           raw_ref(features::kBrowserVerifiedUserActivationKeyboard)},
-          {wf::EnableBrowserVerifiedUserActivationMouse,
-           raw_ref(features::kBrowserVerifiedUserActivationMouse)},
           {wf::EnableCompositeBGColorAnimation,
            raw_ref(features::kCompositeBGColorAnimation)},
           {wf::EnableCooperativeScheduling,
diff --git a/content/common/features.cc b/content/common/features.cc
index d731cbb..f9c613b 100644
--- a/content/common/features.cc
+++ b/content/common/features.cc
@@ -65,11 +65,6 @@
              base::FEATURE_ENABLED_BY_DEFAULT);
 #endif
 
-// When enabled, keyboard user activation will be verified by the browser side.
-BASE_FEATURE(kBrowserVerifiedUserActivationKeyboard,
-             "BrowserVerifiedUserActivationKeyboard",
-             base::FEATURE_DISABLED_BY_DEFAULT);
-
 // If enabled, changes to the zoom level are temporary and are forgotten when
 // the tab is closed. If disabled, changes to the zoom level persist, as though
 // the user affected them through the browser's UX.
diff --git a/content/common/features.h b/content/common/features.h
index 8cbb478c..2223543 100644
--- a/content/common/features.h
+++ b/content/common/features.h
@@ -20,7 +20,6 @@
 BASE_DECLARE_FEATURE(kBeforeUnloadBrowserResponseQueue);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(
     kBlockInsecurePrivateNetworkRequestsFromUnknown);
-CONTENT_EXPORT BASE_DECLARE_FEATURE(kBrowserVerifiedUserActivationKeyboard);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kCapturedSurfaceControlTemporaryZoom);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kCanvas2DImageChromium);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kCompositeClipPathAnimation);
diff --git a/content/public/android/java/src/org/chromium/content/browser/input/CursorAnchorInfoController.java b/content/public/android/java/src/org/chromium/content/browser/input/CursorAnchorInfoController.java
index 8e69893e..3ab95bbf 100644
--- a/content/public/android/java/src/org/chromium/content/browser/input/CursorAnchorInfoController.java
+++ b/content/public/android/java/src/org/chromium/content/browser/input/CursorAnchorInfoController.java
@@ -32,6 +32,7 @@
 
     /** An interface to mock out composing text retrieval from ImeAdapter. */
     public interface ComposingTextDelegate {
+        @Nullable
         CharSequence getText();
 
         int getSelectionStart();
diff --git a/content/public/android/java/src/org/chromium/content/browser/input/ImeAdapterImpl.java b/content/public/android/java/src/org/chromium/content/browser/input/ImeAdapterImpl.java
index 6a2d65a..04b8f01 100644
--- a/content/public/android/java/src/org/chromium/content/browser/input/ImeAdapterImpl.java
+++ b/content/public/android/java/src/org/chromium/content/browser/input/ImeAdapterImpl.java
@@ -65,6 +65,7 @@
 import org.chromium.blink_public.web.WebTextInputMode;
 import org.chromium.build.annotations.NullMarked;
 import org.chromium.build.annotations.Nullable;
+import org.chromium.build.annotations.RequiresNonNull;
 import org.chromium.content.browser.GestureListenerManagerImpl;
 import org.chromium.content.browser.WindowEventObserver;
 import org.chromium.content.browser.WindowEventObserverManager;
@@ -168,8 +169,7 @@
     private int mLastSelectionStart;
     private int mLastSelectionEnd;
 
-    @SuppressWarnings("NullAway.Init")
-    private String mLastText;
+    private @Nullable String mLastText;
 
     private int mLastCompositionStart;
     private int mLastCompositionEnd;
@@ -288,7 +288,7 @@
                         wrapper,
                         new CursorAnchorInfoController.ComposingTextDelegate() {
                             @Override
-                            public CharSequence getText() {
+                            public @Nullable CharSequence getText() {
                                 return mLastText;
                             }
 
@@ -448,6 +448,7 @@
         if (mInputConnectionFactory == null) return null;
         View containerView = getContainerView();
         if (DEBUG_LOGS) Log.i(TAG, "Last text: " + mLastText);
+        assert mLastText != null;
         setInputConnection(
                 mInputConnectionFactory.initializeAndGet(
                         containerView,
@@ -551,6 +552,7 @@
         return modifiers;
     }
 
+    @RequiresNonNull("mLastText")
     private void updateInputStateForStylusWriting() {
         if (mWebContents.getStylusWritingHandler() == null) return;
         mWebContents
@@ -1285,6 +1287,7 @@
         View containerView = getContainerView();
         if (!ViewUtils.hasFocus(containerView)) ViewUtils.requestFocus(containerView);
 
+        assert mLastText != null;
         updateInputStateForStylusWriting();
         return mWebContents.getStylusWritingHandler().shouldInitiateStylusWriting();
     }
diff --git a/content/public/android/java/src/org/chromium/content/browser/input/TextSuggestionsPopupWindow.java b/content/public/android/java/src/org/chromium/content/browser/input/TextSuggestionsPopupWindow.java
index 95735fc6..c96be86 100644
--- a/content/public/android/java/src/org/chromium/content/browser/input/TextSuggestionsPopupWindow.java
+++ b/content/public/android/java/src/org/chromium/content/browser/input/TextSuggestionsPopupWindow.java
@@ -10,6 +10,7 @@
 import android.text.style.TextAppearanceSpan;
 import android.view.View;
 
+import org.chromium.build.annotations.Initializer;
 import org.chromium.build.annotations.NullMarked;
 import org.chromium.build.annotations.Nullable;
 import org.chromium.content.R;
@@ -21,7 +22,6 @@
  */
 @NullMarked
 public class TextSuggestionsPopupWindow extends SuggestionsPopupWindow {
-    @SuppressWarnings("NullAway.Init")
     private SuggestionInfo[] mSuggestionInfos;
 
     private TextAppearanceSpan mPrefixSpan;
@@ -47,6 +47,7 @@
     }
 
     /** Shows the text suggestion menu at the specified coordinates (relative to the viewport). */
+    @Initializer
     public void show(
             double caretX,
             double caretY,
diff --git a/content/public/android/java/src/org/chromium/content/browser/selection/SmartSelectionClient.java b/content/public/android/java/src/org/chromium/content/browser/selection/SmartSelectionClient.java
index 01d59e4..5888dbc5 100644
--- a/content/public/android/java/src/org/chromium/content/browser/selection/SmartSelectionClient.java
+++ b/content/public/android/java/src/org/chromium/content/browser/selection/SmartSelectionClient.java
@@ -20,6 +20,7 @@
 
 import org.chromium.base.ObserverList;
 import org.chromium.base.UserData;
+import org.chromium.build.annotations.Initializer;
 import org.chromium.build.annotations.NullMarked;
 import org.chromium.build.annotations.Nullable;
 import org.chromium.content.browser.webcontents.WebContentsImpl;
@@ -60,10 +61,8 @@
 
     private long mNativeSmartSelectionClient;
 
-    @SuppressWarnings("NullAway.Init")
     private SmartSelectionProvider mProvider;
 
-    @SuppressWarnings("NullAway.Init")
     private ResultCallback mCallback;
 
     private @Nullable SmartSelectionEventProcessor mSmartSelectionEventProcessor;
@@ -103,6 +102,7 @@
                 SmartSelectionClientJni.get().init(SmartSelectionClient.this, webContents);
     }
 
+    @Initializer
     private void setCallback(ResultCallback callback, WebContents webContents) {
         mCallback = callback;
         mProvider =
diff --git a/content/public/android/java/src/org/chromium/content_public/browser/StylusWritingHandler.java b/content/public/android/java/src/org/chromium/content_public/browser/StylusWritingHandler.java
index e73b8cf..f978b21 100644
--- a/content/public/android/java/src/org/chromium/content_public/browser/StylusWritingHandler.java
+++ b/content/public/android/java/src/org/chromium/content_public/browser/StylusWritingHandler.java
@@ -37,17 +37,18 @@
 
     /**
      * Update current input state parameters to stylus writing system.
-     *  @param text the input text
+     *
+     * @param text the input text
      * @param selectionStart the input selection start offset
      * @param selectionEnd the input selection end offset
      */
-    default void updateInputState(String text, int selectionStart, int selectionEnd) {}
+    default void updateInputState(@Nullable String text, int selectionStart, int selectionEnd) {}
 
     /**
      * Notify focused node has changed in web page.
      *
      * @param editableBoundsOnScreenDip the Editable element bounds Rect in dip
-     * @param isEditable     is true if focused node is of editable type.
+     * @param isEditable is true if focused node is of editable type.
      * @param currentView the {@link View} in which the focused node changed.
      */
     default @Nullable EditorBoundsInfo onFocusedNodeChanged(
diff --git a/content/public/browser/content_browser_client.cc b/content/public/browser/content_browser_client.cc
index f252c04..5bad637 100644
--- a/content/public/browser/content_browser_client.cc
+++ b/content/public/browser/content_browser_client.cc
@@ -493,6 +493,7 @@
 
 bool ContentBrowserClient::OverrideWebPreferencesAfterNavigation(
     WebContents* web_contents,
+    SiteInstance& main_frame_site,
     blink::web_pref::WebPreferences* prefs) {
   return false;
 }
diff --git a/content/public/browser/content_browser_client.h b/content/public/browser/content_browser_client.h
index 25a2aec8..c700b15 100644
--- a/content/public/browser/content_browser_client.h
+++ b/content/public/browser/content_browser_client.h
@@ -1375,18 +1375,23 @@
   virtual DirectSocketsDelegate* GetDirectSocketsDelegate();
 #endif
 
-  // Called by WebContents to override the WebKit preferences that are used by
+  // Called by WebContents to override the web preferences that are used by
   // the renderer. The content layer will add its own settings, and then it's up
-  // to the embedder to update it if it wants.
-  virtual void OverrideWebkitPrefs(WebContents* web_contents,
-                                   blink::web_pref::WebPreferences* prefs) {}
+  // to the embedder to update it if it wants. `main_frame_site` is the
+  // `SiteInstance` of the closest main frame. This can be called on inner frame
+  // trees, and `main_frame_site` will not match the primary main frame's site.
+  virtual void OverrideWebPreferences(WebContents* web_contents,
+                                      SiteInstance& main_frame_site,
+                                      blink::web_pref::WebPreferences* prefs) {}
 
-  // Similar to OverrideWebkitPrefs, but is only called after navigations. Some
-  // attributes in WebPreferences might need its value updated after navigation,
-  // and this method will give the opportunity for embedder to update them.
-  // Returns true if some values |prefs| changed due to embedder override.
+  // Similar to OverrideWebPreferences, but is only called after navigations.
+  // Some attributes in WebPreferences might need their values updated after
+  // navigation, and this method will give the opportunity for the embedder to
+  // update them. Returns true if some values in `prefs` changed due to embedder
+  // override.
   virtual bool OverrideWebPreferencesAfterNavigation(
       WebContents* web_contents,
+      SiteInstance& main_frame_site,
       blink::web_pref::WebPreferences* prefs);
 
   // Notifies that BrowserURLHandler has been created, so that the embedder can
diff --git a/content/public/browser/web_contents.h b/content/public/browser/web_contents.h
index e9c6a19..24b17da5 100644
--- a/content/public/browser/web_contents.h
+++ b/content/public/browser/web_contents.h
@@ -1327,7 +1327,7 @@
   // This means if there's any value previously set through SetWebPreferences
   // which does not have special recomputation logic in either
   // WebContentsImpl::ComputeWebPreferences or
-  // ContentBrowserClient::OverrideWebkitPrefs, it will return back to its
+  // ContentBrowserClient::OverrideWebPreferences, it will return back to its
   // default value whenever this function is called.
   virtual void NotifyPreferencesChanged() = 0;
 
@@ -1340,7 +1340,7 @@
   // be overridden. if there's any value previously set through
   // SetWebPreferences which does not have special recomputation logic in either
   // WebContentsImpl::ComputeWebPreferences or
-  // ContentBrowserClient::OverrideWebkitPrefs, it will return back to its
+  // ContentBrowserClient::OverrideWebPreferences, it will return back to its
   // default value, which might be different from the value we set it to here.
   // If you want to use this function outside of tests, consider adding
   // recomputation logic in either of those functions.
diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc
index e8cf9a5..fbb11a93 100644
--- a/content/public/common/content_features.cc
+++ b/content/public/common/content_features.cc
@@ -167,11 +167,6 @@
              "BrokerFileOperationsOnDiskCacheInNetworkService",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
-// When enabled, mouse user activation will be verified by the browser side.
-BASE_FEATURE(kBrowserVerifiedUserActivationMouse,
-             "BrowserVerifiedUserActivationMouse",
-             base::FEATURE_DISABLED_BY_DEFAULT);
-
 // Allows pages with cache-control:no-store to enter the back/forward cache.
 // Feature params can specify whether pages with cache-control:no-store can be
 // restored if cookies change / if HTTPOnly cookies change.
diff --git a/content/public/common/content_features.h b/content/public/common/content_features.h
index 568f10f79..55a9150 100644
--- a/content/public/common/content_features.h
+++ b/content/public/common/content_features.h
@@ -58,7 +58,6 @@
     kBlockInsecurePrivateNetworkRequestsDeprecationTrial);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(
     kBrokerFileOperationsOnDiskCacheInNetworkService);
-CONTENT_EXPORT BASE_DECLARE_FEATURE(kBrowserVerifiedUserActivationMouse);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kCacheControlNoStoreEnterBackForwardCache);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kCapturedSurfaceControlStickyPermissions);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kCapturedSurfaceControlKillswitch);
diff --git a/content/public/test/fenced_frame_test_util.cc b/content/public/test/fenced_frame_test_util.cc
index 2568d17..abc9c390 100644
--- a/content/public/test/fenced_frame_test_util.cc
+++ b/content/public/test/fenced_frame_test_util.cc
@@ -64,7 +64,8 @@
        {blink::features::kFencedFramesLocalUnpartitionedDataAccess, {}},
        {blink::features::kFencedFramesCrossOriginEventReporting, {}},
        {blink::features::kFencedFramesReportEventHeaderChanges, {}},
-       {blink::features::kExemptUrlFromNetworkRevocationForTesting, {}}},
+       {blink::features::kExemptUrlFromNetworkRevocationForTesting, {}},
+       {blink::features::kFencedFramesCrossOriginAutomaticBeaconData, {}}},
       {/* disabled_features */});
 }
 
diff --git a/content/shell/browser/shell_content_browser_client.cc b/content/shell/browser/shell_content_browser_client.cc
index 24e086b..0a452d4 100644
--- a/content/shell/browser/shell_content_browser_client.cc
+++ b/content/shell/browser/shell_content_browser_client.cc
@@ -572,8 +572,9 @@
   return new ShellSpeechRecognitionManagerDelegate();
 }
 
-void ShellContentBrowserClient::OverrideWebkitPrefs(
+void ShellContentBrowserClient::OverrideWebPreferences(
     WebContents* web_contents,
+    SiteInstance& main_frame_site,
     blink::web_pref::WebPreferences* prefs) {
   if (base::CommandLine::ForCurrentProcess()->HasSwitch(
           switches::kForceDarkMode)) {
diff --git a/content/shell/browser/shell_content_browser_client.h b/content/shell/browser/shell_content_browser_client.h
index 71dc7b7..c04b6484 100644
--- a/content/shell/browser/shell_content_browser_client.h
+++ b/content/shell/browser/shell_content_browser_client.h
@@ -103,8 +103,9 @@
       std::unique_ptr<ClientCertificateDelegate> delegate) override;
   SpeechRecognitionManagerDelegate* CreateSpeechRecognitionManagerDelegate()
       override;
-  void OverrideWebkitPrefs(WebContents* web_contents,
-                           blink::web_pref::WebPreferences* prefs) override;
+  void OverrideWebPreferences(WebContents* web_contents,
+                              SiteInstance& main_frame_site,
+                              blink::web_pref::WebPreferences* prefs) override;
   std::unique_ptr<content::DevToolsManagerDelegate>
   CreateDevToolsManagerDelegate() override;
   void ExposeInterfacesToRenderer(
diff --git a/content/test/fuzzer/ad_auction_headers_util_fuzzer.cc b/content/test/fuzzer/ad_auction_headers_util_fuzzer.cc
index d87beef..952d117 100644
--- a/content/test/fuzzer/ad_auction_headers_util_fuzzer.cc
+++ b/content/test/fuzzer/ad_auction_headers_util_fuzzer.cc
@@ -28,6 +28,7 @@
   std::string header_value(reinterpret_cast<const char*>(data), size);
 
   ParseAdAuctionResultResponseHeader(header_value);
+  ParseAdAuctionResultNonceResponseHeader(header_value);
 
   std::map<std::string, std::vector<SignedAdditionalBidWithMetadata>> output;
   base::expected<void, std::string> result =
diff --git a/content/test/test_render_view_host.cc b/content/test/test_render_view_host.cc
index a231310c..66e3d34 100644
--- a/content/test/test_render_view_host.cc
+++ b/content/test/test_render_view_host.cc
@@ -493,8 +493,10 @@
 
 blink::web_pref::WebPreferences
 TestRenderViewHost::TestComputeWebPreferences() {
-  return static_cast<WebContentsImpl*>(WebContents::FromRenderViewHost(this))
-      ->ComputeWebPreferences();
+  auto* web_contents_impl =
+      static_cast<WebContentsImpl*>(WebContents::FromRenderViewHost(this));
+  return web_contents_impl->ComputeWebPreferences(
+      web_contents_impl->GetPrimaryMainFrame());
 }
 
 bool TestRenderViewHost::IsTestRenderViewHost() const {
diff --git a/content/web_test/browser/web_test_content_browser_client.cc b/content/web_test/browser/web_test_content_browser_client.cc
index 5d41015..3735a52c 100644
--- a/content/web_test/browser/web_test_content_browser_client.cc
+++ b/content/web_test/browser/web_test_content_browser_client.cc
@@ -400,11 +400,12 @@
       std::move(receiver));
 }
 
-void WebTestContentBrowserClient::OverrideWebkitPrefs(
+void WebTestContentBrowserClient::OverrideWebPreferences(
     WebContents* web_contents,
+    SiteInstance& main_frame_site,
     blink::web_pref::WebPreferences* prefs) {
   if (WebTestControlHost::Get())
-    WebTestControlHost::Get()->OverrideWebkitPrefs(prefs);
+    WebTestControlHost::Get()->OverrideWebPreferences(prefs);
 }
 
 std::vector<std::unique_ptr<content::NavigationThrottle>>
diff --git a/content/web_test/browser/web_test_content_browser_client.h b/content/web_test/browser/web_test_content_browser_client.h
index 3a6f32f..e621274 100644
--- a/content/web_test/browser/web_test_content_browser_client.h
+++ b/content/web_test/browser/web_test_content_browser_client.h
@@ -70,8 +70,9 @@
   void RegisterAssociatedInterfaceBindersForRenderFrameHost(
       RenderFrameHost& render_frame_host,
       blink::AssociatedInterfaceRegistry& associated_registry) override;
-  void OverrideWebkitPrefs(WebContents* web_contents,
-                           blink::web_pref::WebPreferences* prefs) override;
+  void OverrideWebPreferences(WebContents* web_contents,
+                              SiteInstance& main_frame_site,
+                              blink::web_pref::WebPreferences* prefs) override;
   std::vector<std::unique_ptr<content::NavigationThrottle>>
   CreateThrottlesForNavigation(
       content::NavigationHandle* navigation_handle) override;
diff --git a/content/web_test/browser/web_test_control_host.cc b/content/web_test/browser/web_test_control_host.cc
index 541ef401..2b0f41b 100644
--- a/content/web_test/browser/web_test_control_host.cc
+++ b/content/web_test/browser/web_test_control_host.cc
@@ -831,7 +831,7 @@
   temp_path_ = temp_path;
 }
 
-void WebTestControlHost::OverrideWebkitPrefs(
+void WebTestControlHost::OverrideWebPreferences(
     blink::web_pref::WebPreferences* prefs) {
   if (should_override_prefs_) {
     *prefs = prefs_;
diff --git a/content/web_test/browser/web_test_control_host.h b/content/web_test/browser/web_test_control_host.h
index 4f43f18..c14e559 100644
--- a/content/web_test/browser/web_test_control_host.h
+++ b/content/web_test/browser/web_test_control_host.h
@@ -133,7 +133,7 @@
   void DidCreateOrAttachWebContents(WebContents* web_contents);
 
   void SetTempPath(const base::FilePath& temp_path);
-  void OverrideWebkitPrefs(blink::web_pref::WebPreferences* prefs);
+  void OverrideWebPreferences(blink::web_pref::WebPreferences* prefs);
   void OpenURL(const GURL& url);
   bool IsMainWindow(WebContents* web_contents) const;
   std::unique_ptr<BluetoothChooser> RunBluetoothChooser(
diff --git a/docs/code_reviews.md b/docs/code_reviews.md
index 6513fd7..97ce07b 100644
--- a/docs/code_reviews.md
+++ b/docs/code_reviews.md
@@ -40,15 +40,15 @@
 
 #### Expectations for all reviewers
 
-  * Aim to provide some kind of actionable response within 24 hours of receipt
-    (not counting weekends and holidays). This doesn't mean you have to do a
-    complete review, but you should be able to give some initial feedback,
-    request more time, or suggest another reviewer.
+*   As a reviewer, aim to provide actionable feedback 3 times per work day. The
+    expectation is that if you're in the same time zone as the CL author, there
+    are 3 review iterations. If there is a time zone divide, aim for 2 review
+    iterations.
 
-  * Use the status field in Gerrit settings to indicate if you're away and when
+*   Use the status field in Gerrit settings to indicate if you're away and when
     you'll be back.
 
-  * Don't generally discourage people from sending you code reviews. This
+*   Don't generally discourage people from sending you code reviews. This
     includes using a blanket "slow" in your status field.
 
 ## OWNERS files
diff --git a/docs/security/security-considerations-for-browser-ui.md b/docs/security/security-considerations-for-browser-ui.md
index c944a78..bad194c 100644
--- a/docs/security/security-considerations-for-browser-ui.md
+++ b/docs/security/security-considerations-for-browser-ui.md
@@ -19,8 +19,12 @@
 Traditionally, web browsers try to maintain a line of death between trustworthy
 browser chrome and untrustworthy web content. Trustworthy browser UI should
 appear above the line of death, or at least be anchored to or overlap it.
-[This blog post](https://textslashplain.com/2017/01/14/the-line-of-death/) contains
-an excellent overview of this concept, including some of its shortcomings.
+[This blog post](https://textslashplain.com/2017/01/14/the-line-of-death/)
+contains an excellent overview of this concept, including some of its
+shortcomings. Our research also shows that this concept is not well understood
+by users. The position of a given piece of UI is less important than other
+factors, such as familiarity and visual cues (for example, the presence of logos
+or account names).
 
 Maintaining an understandable and consistent distinction between browser UI and
 web content is more of an art than a science. If you are building a new browser
@@ -100,8 +104,8 @@
 them to click in a specific location), and at the last minute they remove the
 occluding UI and the click falls through to the `victim.com` frame, causing the
 user to take some unintentional action on `victim.com`. Keyjacking is a similar
-attack except the user's keypress rather than click falls through to the occluded
-UI. This category of attack is also sometimes called "UI redressing".
+attack except the user's keypress rather than click falls through to the
+occluded UI. This category of attack is also sometimes called "UI redressing".
 
 Clickjacking is mostly under control on the web, but it hasn't been
 systematically tackled for browser UI, and many browser UI surfaces are
@@ -137,15 +141,16 @@
 If multiple clicks/gestures aren't feasible, consider introducing a short delay
 between when the browser UI is shown and the call-to-action activates. For
 example, if the user must click a button to grant a permission, introduce a
-delay before the button becomes active once the permission prompt is
-shown. Chrome uses short and long delays in various UI:
+delay before the button becomes active once the permission prompt is shown.
+Chrome uses short and long delays in various UI:
 
-- For large security-sensitive browser surfaces like interstitials, three
-seconds is typically considered a delay that is long enough to let the user
-notice that the UI is showing without being too disruptive to the typical user
-experience.
+-   For large security-sensitive browser surfaces like interstitials, three
+    seconds is typically considered a delay that is long enough to let the user
+    notice that the UI is showing without being too disruptive to the typical
+    user experience.
 
-- For smaller UI surfaces such as dialog boxes, a shorter delay like 500ms can
-be more practical. [`InputEventActivationProtector`](
-ui/views/input_event_activation_protector.h) is a helper class that ignores UI
-events that happen within 500ms of the sensitive UI being displayed.
+-   For smaller UI surfaces such as dialog boxes, a shorter delay like 500ms can
+    be more practical.
+    [`InputEventActivationProtector`](ui/views/input_event_activation_protector.h)
+    is a helper class that ignores UI events that happen within 500ms of the
+    sensitive UI being displayed.
diff --git a/extensions/browser/api/declarative_net_request/indexed_rule_unittest.cc b/extensions/browser/api/declarative_net_request/indexed_rule_unittest.cc
index d54302d..50a63bd 100644
--- a/extensions/browser/api/declarative_net_request/indexed_rule_unittest.cc
+++ b/extensions/browser/api/declarative_net_request/indexed_rule_unittest.cc
@@ -2,13 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/351564777): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "extensions/browser/api/declarative_net_request/indexed_rule.h"
 
+#include <array>
 #include <memory>
 #include <optional>
 #include <utility>
@@ -74,14 +70,15 @@
 using IndexedRuleTest = ::testing::Test;
 
 TEST_F(IndexedRuleTest, IDParsing) {
-  struct {
+  struct Cases {
     const int id;
     const ParseResult expected_result;
-  } cases[] = {
+  };
+  auto cases = std::to_array<Cases>({
       {kMinValidID - 1, ParseResult::ERROR_INVALID_RULE_ID},
       {kMinValidID, ParseResult::SUCCESS},
       {kMinValidID + 1, ParseResult::SUCCESS},
-  };
+  });
   for (size_t i = 0; i < std::size(cases); ++i) {
     SCOPED_TRACE(base::StringPrintf("Testing case[%" PRIuS "]", i));
     dnr_api::Rule rule = CreateGenericParsedRule();
@@ -99,13 +96,14 @@
 }
 
 TEST_F(IndexedRuleTest, PriorityParsing) {
-  struct {
+  struct Cases {
     dnr_api::RuleActionType action_type;
     std::optional<int> priority;
     const ParseResult expected_result;
     // Only valid if |expected_result| is SUCCESS.
     const uint32_t expected_priority;
-  } cases[] = {
+  };
+  auto cases = std::to_array<Cases>({
       {dnr_api::RuleActionType::kRedirect, kMinValidPriority - 1,
        ParseResult::ERROR_INVALID_RULE_PRIORITY, kDefaultPriority},
       {dnr_api::RuleActionType::kRedirect, kMinValidPriority,
@@ -122,7 +120,7 @@
        ParseResult::ERROR_INVALID_RULE_PRIORITY, kDefaultPriority},
       {dnr_api::RuleActionType::kBlock, kMinValidPriority, ParseResult::SUCCESS,
        kMinValidPriority},
-  };
+  });
 
   for (size_t i = 0; i < std::size(cases); ++i) {
     SCOPED_TRACE(base::StringPrintf("Testing case[%" PRIuS "]", i));
@@ -148,12 +146,13 @@
 }
 
 TEST_F(IndexedRuleTest, OptionsParsing) {
-  struct {
+  struct Cases {
     const dnr_api::DomainType domain_type;
     const dnr_api::RuleActionType action_type;
     std::optional<bool> is_url_filter_case_sensitive;
     const uint8_t expected_options;
-  } cases[] = {
+  };
+  auto cases = std::to_array<Cases>({
       {dnr_api::DomainType::kNone, dnr_api::RuleActionType::kBlock,
        std::nullopt,
        flat_rule::OptionFlag_APPLIES_TO_THIRD_PARTY |
@@ -166,7 +165,7 @@
        flat_rule::OptionFlag_IS_ALLOWLIST |
            flat_rule::OptionFlag_APPLIES_TO_FIRST_PARTY |
            flat_rule::OptionFlag_IS_CASE_INSENSITIVE},
-  };
+  });
 
   for (size_t i = 0; i < std::size(cases); ++i) {
     SCOPED_TRACE(base::StringPrintf("Testing case[%" PRIuS "]", i));
@@ -188,13 +187,14 @@
 TEST_F(IndexedRuleTest, ResourceTypesParsing) {
   using ResourceTypeVec = std::vector<dnr_api::ResourceType>;
 
-  struct {
+  struct Cases {
     std::optional<ResourceTypeVec> resource_types;
     std::optional<ResourceTypeVec> excluded_resource_types;
     const ParseResult expected_result;
     // Only valid if |expected_result| is SUCCESS.
     const uint16_t expected_element_types;
-  } cases[] = {
+  };
+  auto cases = std::to_array<Cases>({
       {std::nullopt, std::nullopt, ParseResult::SUCCESS,
        flat_rule::ElementType_ANY & ~flat_rule::ElementType_MAIN_FRAME},
       {std::nullopt, ResourceTypeVec({dnr_api::ResourceType::kScript}),
@@ -228,7 +228,7 @@
        flat_rule::ElementType_NONE},
       {ResourceTypeVec({dnr_api::ResourceType::kScript}), ResourceTypeVec(),
        ParseResult::SUCCESS, flat_rule::ElementType_SCRIPT},
-  };
+  });
 
   for (size_t i = 0; i < std::size(cases); ++i) {
     SCOPED_TRACE(base::StringPrintf("Testing case[%" PRIuS "]", i));
@@ -249,7 +249,7 @@
 }
 
 TEST_F(IndexedRuleTest, UrlFilterParsing) {
-  struct {
+  struct Cases {
     std::optional<std::string> input_url_filter;
 
     // Only valid if |expected_result| is SUCCESS.
@@ -259,7 +259,8 @@
     const std::string expected_url_pattern;
 
     const ParseResult expected_result;
-  } cases[] = {
+  };
+  auto cases = std::to_array<Cases>({
       {std::nullopt, flat_rule::UrlPatternType_SUBSTRING,
        flat_rule::AnchorType_NONE, flat_rule::AnchorType_NONE, "",
        ParseResult::SUCCESS},
@@ -301,7 +302,8 @@
       // Url pattern starting with the domain anchor followed by a wildcard.
       {"||*xyz", flat_rule::UrlPatternType_WILDCARDED,
        flat_rule::AnchorType_SUBDOMAIN, flat_rule::AnchorType_NONE, "",
-       ParseResult::ERROR_INVALID_URL_FILTER}};
+       ParseResult::ERROR_INVALID_URL_FILTER},
+  });
 
   for (size_t i = 0; i < std::size(cases); ++i) {
     SCOPED_TRACE(base::StringPrintf("Testing case[%" PRIuS "]", i));
@@ -353,14 +355,15 @@
 
 TEST_F(IndexedRuleTest, DomainsParsing) {
   using DomainVec = std::vector<std::string>;
-  struct {
+  struct Cases {
     std::optional<DomainVec> domains;
     std::optional<DomainVec> excluded_domains;
     const ParseResult expected_result;
     // Only valid if |expected_result| is SUCCESS.
     const DomainVec expected_domains;
     const DomainVec expected_excluded_domains;
-  } cases[] = {
+  };
+  auto cases = std::to_array<Cases>({
       {std::nullopt, std::nullopt, ParseResult::SUCCESS, {}, {}},
       {{{}}, std::nullopt, ParseResult::ERROR_EMPTY_DOMAINS_LIST, {}, {}},
       {std::nullopt, {{}}, ParseResult::SUCCESS, {}, {}},
@@ -387,7 +390,7 @@
        ParseResult::SUCCESS,
        {"xn--36c-tfa.com"},
        {}},
-  };
+  });
 
   for (size_t i = 0; i < std::size(cases); ++i) {
     SCOPED_TRACE(base::StringPrintf("Testing case[%" PRIuS "]", i));
@@ -495,16 +498,18 @@
 }
 
 TEST_F(IndexedRuleTest, RedirectUrlParsing) {
-  struct {
+  struct Cases {
     const char* redirect_url;
     const ParseResult expected_result;
     // Only valid if |expected_result| is SUCCESS.
     const std::string expected_redirect_url;
-  } cases[] = {
+  };
+  auto cases = std::to_array<Cases>({
       {"", ParseResult::ERROR_INVALID_REDIRECT_URL, ""},
       {"http://google.com", ParseResult::SUCCESS, "http://google.com"},
       {"/relative/url?q=1", ParseResult::ERROR_INVALID_REDIRECT_URL, ""},
-      {"abc", ParseResult::ERROR_INVALID_REDIRECT_URL, ""}};
+      {"abc", ParseResult::ERROR_INVALID_REDIRECT_URL, ""},
+  });
 
   for (size_t i = 0; i < std::size(cases); ++i) {
     SCOPED_TRACE(base::StringPrintf("Testing case[%" PRIuS "]", i));
@@ -524,11 +529,12 @@
 }
 
 TEST_F(IndexedRuleTest, RedirectParsing) {
-  struct {
+  struct Cases {
     std::string redirect_dictionary_json;
     ParseResult expected_result;
     std::optional<std::string> expected_redirect_url;
-  } cases[] = {
+  };
+  auto cases = std::to_array<Cases>({
       // clang-format off
     {
       "{}",
@@ -641,8 +647,8 @@
           "username": "user"
         }
       })", ParseResult::SUCCESS, std::nullopt
-    }
-  };
+    },
+  });
   // clang-format on
 
   for (size_t i = 0; i < std::size(cases); ++i) {
@@ -799,13 +805,14 @@
 TEST_F(IndexedRuleTest, InvalidAllowAllRequestsResourceType) {
   using ResourceTypeVec = std::vector<dnr_api::ResourceType>;
 
-  struct {
+  struct Cases {
     ResourceTypeVec resource_types;
     ResourceTypeVec excluded_resource_types;
     const ParseResult expected_result;
     // Only valid if |expected_result| is SUCCESS.
     const uint16_t expected_element_types;
-  } cases[] = {
+  };
+  auto cases = std::to_array<Cases>({
       {{}, {}, ParseResult::ERROR_INVALID_ALLOW_ALL_REQUESTS_RESOURCE_TYPE, 0},
       {{dnr_api::ResourceType::kSubFrame},
        {dnr_api::ResourceType::kScript},
@@ -823,7 +830,7 @@
        {},
        ParseResult::SUCCESS,
        flat_rule::ElementType_MAIN_FRAME},
-  };
+  });
 
   for (size_t i = 0; i < std::size(cases); ++i) {
     SCOPED_TRACE(base::StringPrintf("Testing case[%" PRIuS "]", i));
@@ -865,11 +872,12 @@
   // A copy-able version of dnr_api::ModifyHeaderInfo is used for ease of
   // specifying test cases because elements are copied when initializing a
   // vector from an array.
-  struct {
+  struct Cases {
     std::optional<RawHeaderInfoList> request_headers;
     std::optional<RawHeaderInfoList> response_headers;
     ParseResult expected_result;
-  } cases[] = {
+  };
+  auto cases = std::to_array<Cases>({
       // Raise an error if no headers are specified.
       {std::nullopt, std::nullopt,
        ParseResult::ERROR_NO_HEADERS_TO_MODIFY_SPECIFIED},
@@ -935,7 +943,7 @@
        RawHeaderInfoList(
            {{dnr_api::HeaderOperation::kAppend, "set-cookie", "abcd"}}),
        ParseResult::SUCCESS},
-  };
+  });
 
   for (size_t i = 0; i < std::size(cases); ++i) {
     SCOPED_TRACE(base::StringPrintf("Testing case[%" PRIuS "]", i));
@@ -993,13 +1001,14 @@
 TEST_F(IndexedRuleTest, RequestMethodsParsing) {
   using RequestMethodVec = std::vector<dnr_api::RequestMethod>;
 
-  struct {
+  struct Cases {
     std::optional<RequestMethodVec> request_methods;
     std::optional<RequestMethodVec> excluded_request_methods;
     const ParseResult expected_result;
     // Only valid if `expected_result` is SUCCESS.
     const uint16_t expected_request_methods_mask;
-  } cases[] = {
+  };
+  auto cases = std::to_array<Cases>({
       {std::nullopt, std::nullopt, ParseResult::SUCCESS,
        flat_rule::RequestMethod_ANY},
       {std::nullopt, RequestMethodVec({dnr_api::RequestMethod::kPut}),
@@ -1022,7 +1031,8 @@
       {{{}},
        std::nullopt,
        ParseResult::ERROR_EMPTY_REQUEST_METHODS_LIST,
-       flat_rule::RequestMethod_NONE}};
+       flat_rule::RequestMethod_NONE},
+  });
 
   for (size_t i = 0; i < std::size(cases); ++i) {
     SCOPED_TRACE(base::StringPrintf("Testing case[%" PRIuS "]", i));
@@ -1045,7 +1055,7 @@
 
 TEST_F(IndexedRuleTest, TabID) {
   using IntVec = std::vector<int>;
-  struct {
+  struct Cases {
     std::optional<IntVec> tab_ids;
     std::optional<IntVec> excluded_tab_ids;
     RulesetID ruleset_id;
@@ -1054,7 +1064,8 @@
     // Only relevant if `expected_result` is ParseResult::SUCCESS.
     base::flat_set<int> expected_tab_ids;
     base::flat_set<int> expected_excluded_tab_ids;
-  } cases[] = {
+  };
+  auto cases = std::to_array<Cases>({
       {std::nullopt, std::nullopt, kSessionRulesetID, ParseResult::SUCCESS},
       {IntVec(), IntVec({3, 4, 4}), kSessionRulesetID,
        ParseResult::ERROR_EMPTY_TAB_IDS_LIST},
@@ -1076,7 +1087,7 @@
        ParseResult::ERROR_TAB_IDS_ON_NON_SESSION_RULE},
       {IntVec({1, 2}), IntVec({3}), kMinValidStaticRulesetID,
        ParseResult::ERROR_TAB_IDS_ON_NON_SESSION_RULE},
-  };
+  });
 
   for (size_t i = 0; i < std::size(cases); ++i) {
     SCOPED_TRACE(base::StringPrintf("Testing case[%" PRIuS "]", i));
@@ -1135,11 +1146,12 @@
 
   using HeaderValues = std::vector<std::string>;
   using HeaderInfoList = std::vector<RawHeaderInfo>;
-  struct {
+  struct Cases {
     std::optional<HeaderInfoList> response_headers;
     std::optional<HeaderInfoList> excluded_response_headers;
     ParseResult expected_result;
-  } cases[] = {
+  };
+  auto cases = std::to_array<Cases>({
       // No response headers included or excluded; should parse successfully.
       {std::nullopt, std::nullopt, ParseResult::SUCCESS},
 
@@ -1202,7 +1214,7 @@
        HeaderInfoList({{"repeated-header", HeaderValues({"excluded-value"}),
                         std::nullopt}}),
        ParseResult::SUCCESS},
-  };
+  });
 
   auto get_header_info_matcher = [](const RawHeaderInfo& info) {
     return testing::AllOf(
@@ -1266,11 +1278,12 @@
   };
 
   using ModifyHeaderInfoList = std::vector<RawModifyHeaderInfo>;
-  struct {
+  struct Cases {
     std::optional<ModifyHeaderInfoList> request_headers_to_modify;
     std::optional<ModifyHeaderInfoList> response_headers_to_modify;
     ParseResult expected_result;
-  } cases[] = {
+  };
+  auto cases = std::to_array<Cases>({
       // Two test cases here: one for a rule that tries to modify request
       // headers, one for response headers. The first rule is disallowed since
       // request headers cannot be further modified when it comes time to match
@@ -1284,7 +1297,7 @@
        ModifyHeaderInfoList(
            {{dnr_api::HeaderOperation::kSet, "response-header", "new-value"}}),
        ParseResult::SUCCESS},
-  };
+  });
 
   for (size_t i = 0; i < std::size(cases); ++i) {
     SCOPED_TRACE(base::StringPrintf("Testing case[%" PRIuS "]", i));
@@ -1334,11 +1347,12 @@
 // Test parsing for regex filters and substitutions inside ModifyHeaderInfo.
 TEST_F(IndexedHeaderSubstitutionRuleTest,
        ModifyHeaderInfoRegexFilterAndSubstitutionParsing) {
-  struct {
+  struct Cases {
     std::optional<std::string> regex_filter;
     std::optional<std::string> regex_substitution;
     ParseResult expected_result;
-  } cases[] = {
+  };
+  auto cases = std::to_array<Cases>({
       // Test valid cases:
       {"bad-cookie", std::nullopt, ParseResult::SUCCESS},
       {"bad-cookie", "good-cookie=phew", ParseResult::SUCCESS},
@@ -1358,7 +1372,7 @@
       {R"(^http://google\.com?q1=(.*)&q2=(.*))",
        R"(https://redirect.com?&q1=\1&q2=\3)",
        ParseResult::ERROR_INVALID_REGEX_SUBSTITUTION},
-  };
+  });
 
   for (size_t i = 0; i < std::size(cases); ++i) {
     SCOPED_TRACE(base::StringPrintf("Testing case[%" PRIuS "]", i));
diff --git a/extensions/browser/api/declarative_net_request/ruleset_matcher_unittest.cc b/extensions/browser/api/declarative_net_request/ruleset_matcher_unittest.cc
index 973a9eb..3a97b322 100644
--- a/extensions/browser/api/declarative_net_request/ruleset_matcher_unittest.cc
+++ b/extensions/browser/api/declarative_net_request/ruleset_matcher_unittest.cc
@@ -2,13 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/351564777): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "extensions/browser/api/declarative_net_request/ruleset_matcher.h"
 
+#include <array>
 #include <limits>
 #include <optional>
 #include <utility>
@@ -832,14 +828,15 @@
 // Ensures that RulesetMatcher combines the results of regex and filter-list
 // style redirect rules correctly.
 TEST_F(RulesetMatcherTest, RegexAndFilterListRules_RedirectPriority) {
-  struct {
+  struct RuleInfo {
     size_t id;
     size_t priority;
     const char* action_type;
     const char* filter;
     bool is_regex_rule;
     std::optional<std::string> redirect_url;
-  } rule_info[] = {
+  };
+  auto rule_info = std::to_array<RuleInfo>({
       {1, 1, "redirect", "filter.com", false, "http://redirect_filter.com"},
       {2, 1, "upgradeScheme", "regex\\.com", true, std::nullopt},
       {3, 9, "redirect", "common1.com", false, "http://common1_filter.com"},
@@ -848,7 +845,7 @@
       {6, 9, "upgradeScheme", "common2\\.com", true, std::nullopt},
       {7, 10, "redirect", "abc\\.com", true, "http://example1.com"},
       {8, 9, "redirect", "abc", true, "http://example2.com"},
-  };
+  });
 
   std::vector<TestRule> rules;
   for (const auto& info : rule_info) {
@@ -1367,16 +1364,19 @@
 // Ensures that GetBeforeRequestAction correctly incorporates allowAllRequests
 // rules.
 TEST_F(AllowAllRequestsTest, GetBeforeRequestAction) {
-  struct {
+  struct RuleData {
     int id;
     int priority;
     std::string action_type;
     std::string url_filter;
     bool is_regex_rule;
-  } rule_data[] = {{1, 1, "allowAllRequests", "google", true},
-                   {2, 3, "block", "||match", false},
-                   {3, 2, "allowAllRequests", "match1", true},
-                   {4, 4, "allowAllRequests", "match2", false}};
+  };
+  auto rule_data = std::to_array<RuleData>({
+      {1, 1, "allowAllRequests", "google", true},
+      {2, 3, "block", "||match", false},
+      {3, 2, "allowAllRequests", "match1", true},
+      {4, 4, "allowAllRequests", "match2", false},
+  });
 
   std::vector<TestRule> test_rules;
   for (const auto& rule : rule_data) {
@@ -1639,12 +1639,13 @@
                             CreateTemporarySource(), &matcher));
   ASSERT_TRUE(matcher);
 
-  struct {
+  struct Cases {
     std::string url;
     std::optional<RequestAction> expected_before_request_action;
     std::optional<RequestAction> expected_headers_received_action;
     std::optional<std::string> expected_redirect_url;
-  } cases[] = {
+  };
+  auto cases = std::to_array<Cases>({
       // The request to google.com will match `before_request_rule` for
       // GetBeforeRequestAction and `url_response_headers_rule` because of its
       // higher priority for GetOnHeadersReceivedAction.
@@ -1662,7 +1663,7 @@
        CreateRequestActionForTesting(RequestAction::Type::REDIRECT,
                                      kMinValidID + 2, kMinValidPriority + 1),
        std::string("http://regexmatch.com")},
-  };
+  });
 
   for (size_t i = 0; i < std::size(cases); ++i) {
     SCOPED_TRACE(base::StringPrintf("Testing case[%" PRIuS "]", i));
@@ -1734,11 +1735,12 @@
                                     CreateTemporarySource(), &matcher));
   ASSERT_TRUE(matcher);
 
-  struct {
+  struct Cases {
     std::string url;
     std::string response_headers;
     std::optional<RequestAction> expected_action;
-  } cases[] = {
+  };
+  auto cases = std::to_array<Cases>({
       // No match for a non-matching URL.
       {"http://nomatch.com", "HTTP/1.0 200 OK\r\nKey1: Value1\r\n",
        std::nullopt},
@@ -1807,7 +1809,7 @@
        "HTTP/1.0 200 OK\r\ncontent-type: application/pdf; charset=utf-8\r\n",
        CreateRequestActionForTesting(RequestAction::Type::COLLAPSE,
                                      kMinValidID + 2)},
-  };
+  });
 
   for (size_t i = 0; i < std::size(cases); ++i) {
     SCOPED_TRACE(base::StringPrintf("Testing case[%" PRIuS "]", i));
diff --git a/extensions/browser/api/web_request/extension_web_request_event_router.cc b/extensions/browser/api/web_request/extension_web_request_event_router.cc
index 8b1b8b74..0ba569e 100644
--- a/extensions/browser/api/web_request/extension_web_request_event_router.cc
+++ b/extensions/browser/api/web_request/extension_web_request_event_router.cc
@@ -905,18 +905,6 @@
 
   const bool is_incognito_context = browser_context->IsOffTheRecord();
 
-  // CRX requests information can be intercepted here.
-  // May be null for browser-initiated requests such as navigations.
-  if (request->initiator) {
-    const std::string& scheme = request->initiator->scheme();
-    const ExtensionId& extension_id = request->initiator->host();
-    const GURL& request_url = request->url;
-    if (scheme == extensions::kExtensionScheme) {
-      ExtensionsBrowserClient::Get()->NotifyExtensionRemoteHostContacted(
-          browser_context, extension_id, request_url);
-    }
-  }
-
   // Whether to initialized `blocked_requests_`.
   bool initialize_blocked_requests = false;
 
diff --git a/extensions/browser/api/web_request/web_request_api.cc b/extensions/browser/api/web_request/web_request_api.cc
index a64a23f..45f5fbed 100644
--- a/extensions/browser/api/web_request/web_request_api.cc
+++ b/extensions/browser/api/web_request/web_request_api.cc
@@ -445,21 +445,6 @@
     }
 #endif
 
-    // Create a proxy URLLoader even when there is no CRX
-    // installed with webRequest permissions. This allows the extension
-    // requests to be intercepted for CRX telemetry service if enabled.
-    // Only proxy if the new RHC interception logic is disabled.
-    // TODO(crbug.com/40913716): Clean up collection logic here once new RHC
-    // interception logic is fully launched.
-    const std::string& request_scheme = request_initiator.scheme();
-    if (extensions::kExtensionScheme == request_scheme &&
-        ExtensionsBrowserClient::Get()->IsExtensionTelemetryServiceEnabled(
-            browser_context) &&
-        !base::FeatureList::IsEnabled(
-            safe_browsing::
-                kExtensionTelemetryInterceptRemoteHostsContactedInRenderer)) {
-      decision = ProxyDecision::kWillProxyForTelemetry;
-    }
     if (decision == ProxyDecision::kWillNotProxy) {
       return decision;
     }
@@ -551,8 +536,7 @@
     mojo::PendingRemote<network::mojom::WebSocketHandshakeClient>
         handshake_client) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  DCHECK(MayHaveProxies() || MayHaveWebsocketProxiesForExtensionTelemetry() ||
-         IsAvailableToWebViewEmbedderFrame(frame));
+  DCHECK(MayHaveProxies() || IsAvailableToWebViewEmbedderFrame(frame));
 
   content::BrowserContext* browser_context =
       frame->GetProcess()->GetBrowserContext();
@@ -608,16 +592,6 @@
   return web_request_extension_count_ > 0;
 }
 
-bool WebRequestAPI::MayHaveWebsocketProxiesForExtensionTelemetry() const {
-  // TODO(crbug.com/40913716): Clean up once new RHC interception logic is fully
-  // launched.
-  return ExtensionsBrowserClient::Get()->IsExtensionTelemetryServiceEnabled(
-             browser_context_) &&
-         !base::FeatureList::IsEnabled(
-             safe_browsing::
-                 kExtensionTelemetryInterceptRemoteHostsContactedInRenderer);
-}
-
 bool WebRequestAPI::IsAvailableToWebViewEmbedderFrame(
     content::RenderFrameHost* render_frame_host) const {
 #if BUILDFLAG(ENABLE_GUEST_VIEW)
diff --git a/extensions/browser/api/web_request/web_request_api.h b/extensions/browser/api/web_request/web_request_api.h
index e9f10ef..f1b4018 100644
--- a/extensions/browser/api/web_request/web_request_api.h
+++ b/extensions/browser/api/web_request/web_request_api.h
@@ -261,14 +261,6 @@
   // installed to support the API.
   bool MayHaveProxies() const;
 
-  // Indicates whether or not WebRequestAPI may have one or more proxies
-  // installed to support intercepting websocket connections for extension
-  // telemetry.
-  // TODO(psarouthakis): This is here for the current implementation, but
-  // will be refactored to live somewhere else so that we don't have to
-  // create a full proxy just for telemetry.
-  bool MayHaveWebsocketProxiesForExtensionTelemetry() const;
-
   // Indicates whether the WebRequestAPI is available to a RenderFrameHost
   // that embeds a WebView instance.
   bool IsAvailableToWebViewEmbedderFrame(
diff --git a/extensions/browser/computed_hashes_unittest.cc b/extensions/browser/computed_hashes_unittest.cc
index 5ba81ec..12a2e60 100644
--- a/extensions/browser/computed_hashes_unittest.cc
+++ b/extensions/browser/computed_hashes_unittest.cc
@@ -3,6 +3,9 @@
 // found in the LICENSE file.
 
 #include "extensions/browser/computed_hashes.h"
+
+#include <array>
+
 #include "base/base64.h"
 #include "base/files/file_path.h"
 #include "base/files/scoped_temp_dir.h"
@@ -141,9 +144,9 @@
   std::string content2;
   for (int i = 0; i < 500; i++)
     content2 += "hello world";
-  const char* content2_expected_hashes[] = {
-      "bvtt5hXo8xvHrlzGAhhoqPL/r+4zJXHx+6wAvkv15V8=",
-      "lTD45F7P6I/HOdi8u7FLRA4qzAYL+7xSNVeusG6MJI0="};
+  auto content2_expected_hashes = std::to_array<const char*>(
+      {"bvtt5hXo8xvHrlzGAhhoqPL/r+4zJXHx+6wAvkv15V8=",
+       "lTD45F7P6I/HOdi8u7FLRA4qzAYL+7xSNVeusG6MJI0="});
   std::vector<std::string> hashes2 =
       ComputedHashes::GetHashesForContent(content2, block_size);
   ASSERT_EQ(2u, hashes2.size());
diff --git a/extensions/browser/extensions_browser_client.cc b/extensions/browser/extensions_browser_client.cc
index 697c0da..7ad5652 100644
--- a/extensions/browser/extensions_browser_client.cc
+++ b/extensions/browser/extensions_browser_client.cc
@@ -164,11 +164,6 @@
         const GURL& request_url,
         const GURL& redirect_url) const {}
 
-void ExtensionsBrowserClient::NotifyExtensionRemoteHostContacted(
-    content::BrowserContext* context,
-    const ExtensionId& extension_id,
-    const GURL& url) const {}
-
 bool ExtensionsBrowserClient::IsUsbDeviceAllowedByPolicy(
     content::BrowserContext* context,
     const ExtensionId& extension_id,
diff --git a/extensions/browser/extensions_browser_client.h b/extensions/browser/extensions_browser_client.h
index 60ac7c5..6102c2c 100644
--- a/extensions/browser/extensions_browser_client.h
+++ b/extensions/browser/extensions_browser_client.h
@@ -473,14 +473,6 @@
       const GURL& request_url,
       const GURL& redirect_url) const;
 
-  // TODO(zackhan): This is a temporary implementation of notifying the
-  // extension telemetry service when there are web requests initiated from
-  // chrome extensions. Its usefulness will be evaluated.
-  virtual void NotifyExtensionRemoteHostContacted(
-      content::BrowserContext* context,
-      const ExtensionId& extension_id,
-      const GURL& url) const;
-
   // Return true if the USB device is allowed by policy.
   virtual bool IsUsbDeviceAllowedByPolicy(content::BrowserContext* context,
                                           const ExtensionId& extension_id,
diff --git a/extensions/common/features/simple_feature_unittest.cc b/extensions/common/features/simple_feature_unittest.cc
index fc0c236d..5a0738c 100644
--- a/extensions/common/features/simple_feature_unittest.cc
+++ b/extensions/common/features/simple_feature_unittest.cc
@@ -6,6 +6,7 @@
 
 #include <stddef.h>
 
+#include <array>
 #include <memory>
 #include <string>
 #include <vector>
@@ -98,7 +99,7 @@
 };
 
 TEST_F(SimpleFeatureTest, IsAvailableNullCase) {
-  const IsAvailableTestData tests[] = {
+  const auto tests = std::to_array<IsAvailableTestData>({
       {"", Manifest::TYPE_UNKNOWN, ManifestLocation::kInvalidLocation,
        Feature::UNSPECIFIED_PLATFORM, -1, kUnspecifiedContextId,
        Feature::IS_AVAILABLE},
@@ -119,7 +120,8 @@
        Feature::IS_AVAILABLE},
       {"", Manifest::TYPE_UNKNOWN, ManifestLocation::kInvalidLocation,
        Feature::UNSPECIFIED_PLATFORM, 25, kUnspecifiedContextId,
-       Feature::IS_AVAILABLE}};
+       Feature::IS_AVAILABLE},
+  });
 
   SimpleFeature feature;
   for (const auto& test : tests) {
@@ -457,7 +459,7 @@
   EXPECT_EQ("", error);
   ASSERT_TRUE(extension.get());
 
-  const FeatureSessionTypeTestData kTestData[] = {
+  const auto kTestData = std::to_array<FeatureSessionTypeTestData>({
       {"kiosk_feature in kiosk session",
        Feature::IS_AVAILABLE,
        mojom::FeatureSessionType::kKiosk,
@@ -532,7 +534,8 @@
       {"feature with kiosk session type in auto-launched kiosk session",
        Feature::IS_AVAILABLE,
        mojom::FeatureSessionType::kAutolaunchedKiosk,
-       {mojom::FeatureSessionType::kKiosk}}};
+       {mojom::FeatureSessionType::kKiosk}},
+  });
 
   for (const auto& entry : kTestData) {
     std::unique_ptr<base::AutoReset<mojom::FeatureSessionType>> current_session(
diff --git a/extensions/common/file_util_unittest.cc b/extensions/common/file_util_unittest.cc
index f1e45f8..7c017b0 100644
--- a/extensions/common/file_util_unittest.cc
+++ b/extensions/common/file_util_unittest.cc
@@ -2,15 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/351564777): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "extensions/common/file_util.h"
 
 #include <stddef.h>
 
+#include <array>
 #include <optional>
 #include <string_view>
 #include <utility>
@@ -364,8 +360,8 @@
   base::ScopedTempDir temp;
   ASSERT_TRUE(temp.CreateUniqueTempDir());
 
-  static const base::FilePath::CharType* const folders[] = {
-      kLocaleFolder, kPlatformSpecificFolder};
+  static const auto folders = std::to_array<const base::FilePath::CharType*>(
+      {kLocaleFolder, kPlatformSpecificFolder});
 
   for (size_t i = 0; i < std::size(folders); i++) {
     base::FilePath src_path = temp.GetPath().Append(folders[i]);
@@ -716,29 +712,30 @@
   struct TestCase {
     const char* url;
     const char* expected_relative_path;
-  } test_cases[] = {
-    {URL_PREFIX "simple.html", "simple.html"},
-    {URL_PREFIX "directory/to/file.html", "directory/to/file.html"},
-    {URL_PREFIX "escape%20spaces.html", "escape spaces.html"},
-    {URL_PREFIX "%C3%9Cber.html",
-     "\xC3\x9C"
-     "ber.html"},
-#if BUILDFLAG(IS_WIN)
-    {URL_PREFIX "C%3A/simple.html", ""},
-#endif
-    {URL_PREFIX "////simple.html", "simple.html"},
-    {URL_PREFIX "/simple.html", "simple.html"},
-    {URL_PREFIX "\\simple.html", "simple.html"},
-    {URL_PREFIX "\\\\foo\\simple.html", "foo/simple.html"},
-    // Escaped file paths result in failure.
-    {URL_PREFIX "..%2f..%2fsimple.html", ""},
-    // Escaped things that look like escaped file paths, on the other hand,
-    // should work.
-    {URL_PREFIX "..%252f..%252fsimple.html", "..%2f..%2fsimple.html"},
-    // This is a UTF-8 lock icon, which is unsafe to display in the omnibox, but
-    // is a valid, if unusual, file name.
-    {URL_PREFIX "%F0%9F%94%93.html", "\xF0\x9F\x94\x93.html"},
   };
+  auto test_cases = std::to_array<TestCase>({
+      {URL_PREFIX "simple.html", "simple.html"},
+      {URL_PREFIX "directory/to/file.html", "directory/to/file.html"},
+      {URL_PREFIX "escape%20spaces.html", "escape spaces.html"},
+      {URL_PREFIX "%C3%9Cber.html",
+       "\xC3\x9C"
+       "ber.html"},
+#if BUILDFLAG(IS_WIN)
+      {URL_PREFIX "C%3A/simple.html", ""},
+#endif
+      {URL_PREFIX "////simple.html", "simple.html"},
+      {URL_PREFIX "/simple.html", "simple.html"},
+      {URL_PREFIX "\\simple.html", "simple.html"},
+      {URL_PREFIX "\\\\foo\\simple.html", "foo/simple.html"},
+      // Escaped file paths result in failure.
+      {URL_PREFIX "..%2f..%2fsimple.html", ""},
+      // Escaped things that look like escaped file paths, on the other hand,
+      // should work.
+      {URL_PREFIX "..%252f..%252fsimple.html", "..%2f..%2fsimple.html"},
+      // This is a UTF-8 lock icon, which is unsafe to display in the omnibox,
+      // but is a valid, if unusual, file name.
+      {URL_PREFIX "%F0%9F%94%93.html", "\xF0\x9F\x94\x93.html"},
+  });
 #undef URL_PREFIX
 
   for (size_t i = 0; i < std::size(test_cases); ++i) {
diff --git a/fuchsia_web/webengine/browser/web_engine_content_browser_client.cc b/fuchsia_web/webengine/browser/web_engine_content_browser_client.cc
index d3d50be..edf02d2 100644
--- a/fuchsia_web/webengine/browser/web_engine_content_browser_client.cc
+++ b/fuchsia_web/webengine/browser/web_engine_content_browser_client.cc
@@ -190,8 +190,9 @@
   return embedder_support::GetUserAgentMetadata();
 }
 
-void WebEngineContentBrowserClient::OverrideWebkitPrefs(
+void WebEngineContentBrowserClient::OverrideWebPreferences(
     content::WebContents* web_contents,
+    content::SiteInstance& main_frame_site,
     blink::web_pref::WebPreferences* web_prefs) {
   // Disable WebSQL support since it is being removed from the web platform
   // and does not work. See crbug.com/1317431.
diff --git a/fuchsia_web/webengine/browser/web_engine_content_browser_client.h b/fuchsia_web/webengine/browser/web_engine_content_browser_client.h
index 2f204ff5..77ecf12 100644
--- a/fuchsia_web/webengine/browser/web_engine_content_browser_client.h
+++ b/fuchsia_web/webengine/browser/web_engine_content_browser_client.h
@@ -34,8 +34,10 @@
   std::string GetProduct() override;
   std::string GetUserAgent() override;
   blink::UserAgentMetadata GetUserAgentMetadata() override;
-  void OverrideWebkitPrefs(content::WebContents* web_contents,
-                           blink::web_pref::WebPreferences* web_prefs) override;
+  void OverrideWebPreferences(
+      content::WebContents* web_contents,
+      content::SiteInstance& main_frame_site,
+      blink::web_pref::WebPreferences* web_prefs) override;
   void RegisterBrowserInterfaceBindersForFrame(
       content::RenderFrameHost* render_frame_host,
       mojo::BinderMapWithContext<content::RenderFrameHost*>* map) override;
diff --git a/gpu/command_buffer/client/fenced_allocator_test.cc b/gpu/command_buffer/client/fenced_allocator_test.cc
index 77c9385..f69a8f8 100644
--- a/gpu/command_buffer/client/fenced_allocator_test.cc
+++ b/gpu/command_buffer/client/fenced_allocator_test.cc
@@ -9,8 +9,11 @@
 
 // This file contains the tests for the FencedAllocator class.
 
+#include "gpu/command_buffer/client/fenced_allocator.h"
+
 #include <stdint.h>
 
+#include <array>
 #include <memory>
 
 #include "base/functional/bind.h"
@@ -19,7 +22,6 @@
 #include "base/run_loop.h"
 #include "base/test/task_environment.h"
 #include "gpu/command_buffer/client/cmd_buffer_helper.h"
-#include "gpu/command_buffer/client/fenced_allocator.h"
 #include "gpu/command_buffer/service/command_buffer_direct.h"
 #include "gpu/command_buffer/service/mocks.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -125,7 +127,7 @@
   CHECK_EQ(kAllocCount * kSize, kBufferSize);
 
   // Allocate several buffers to fill in the memory.
-  FencedAllocator::Offset offsets[kAllocCount];
+  std::array<FencedAllocator::Offset, kAllocCount> offsets;
   for (unsigned int i = 0; i < kAllocCount; ++i) {
     offsets[i] = allocator_->Alloc(kSize);
     EXPECT_NE(FencedAllocator::kInvalidOffset, offsets[i]);
@@ -167,7 +169,7 @@
   CHECK_EQ(kAllocCount * kSize, kBufferSize);
 
   // Allocate several buffers to fill in the memory.
-  FencedAllocator::Offset offsets[kAllocCount];
+  std::array<FencedAllocator::Offset, kAllocCount> offsets;
   for (unsigned int i = 0; i < kAllocCount; ++i) {
     offsets[i] = allocator_->Alloc(kSize);
     EXPECT_NE(FencedAllocator::kInvalidOffset, offsets[i]);
@@ -215,7 +217,7 @@
   CHECK_EQ(kAllocCount * kSize, kBufferSize);
 
   // Allocate several buffers to fill in the memory.
-  FencedAllocator::Offset offsets[kAllocCount];
+  std::array<FencedAllocator::Offset, kAllocCount> offsets;
   for (unsigned int i = 0; i < kAllocCount; ++i) {
     offsets[i] = allocator_->Alloc(kSize);
     EXPECT_NE(FencedAllocator::kInvalidOffset, offsets[i]);
@@ -478,7 +480,7 @@
   CHECK_EQ(kAllocCount * kSize, kBufferSize);
 
   // Allocate several buffers to fill in the memory.
-  void* pointers[kAllocCount];
+  std::array<void*, kAllocCount> pointers;
   for (unsigned int i = 0; i < kAllocCount; ++i) {
     pointers[i] = allocator_->Alloc(kSize);
     EXPECT_TRUE(pointers[i]);
@@ -518,7 +520,7 @@
   CHECK_EQ(kAllocCount * kSize, kBufferSize);
 
   // Allocate several buffers to fill in the memory.
-  void* pointers[kAllocCount];
+  std::array<void*, kAllocCount> pointers;
   for (unsigned int i = 0; i < kAllocCount; ++i) {
     pointers[i] = allocator_->Alloc(kSize);
     EXPECT_TRUE(pointers[i]);
diff --git a/gpu/command_buffer/client/mapped_memory_unittest.cc b/gpu/command_buffer/client/mapped_memory_unittest.cc
index 205fd04..98dcf168 100644
--- a/gpu/command_buffer/client/mapped_memory_unittest.cc
+++ b/gpu/command_buffer/client/mapped_memory_unittest.cc
@@ -12,6 +12,7 @@
 #include <stddef.h>
 #include <stdint.h>
 
+#include <array>
 #include <list>
 #include <memory>
 
@@ -201,7 +202,7 @@
   CHECK(kAllocCount * kSize == kBufferSize * 2);
 
   // Allocate several buffers across multiple chunks.
-  void *pointers[kAllocCount];
+  std::array<void*, kAllocCount> pointers;
   for (unsigned int i = 0; i < kAllocCount; ++i) {
     int32_t id = -1;
     unsigned int offset = 0xFFFFFFFFu;
diff --git a/gpu/command_buffer/client/query_tracker_unittest.cc b/gpu/command_buffer/client/query_tracker_unittest.cc
index fd8e91a..caf183ebe 100644
--- a/gpu/command_buffer/client/query_tracker_unittest.cc
+++ b/gpu/command_buffer/client/query_tracker_unittest.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 // Tests for the QueryTracker.
 
 #include "gpu/command_buffer/client/query_tracker.h"
@@ -15,6 +10,7 @@
 #include <stddef.h>
 #include <stdint.h>
 
+#include <array>
 #include <memory>
 #include <vector>
 
@@ -61,8 +57,8 @@
 };
 
 TEST_F(QuerySyncManagerTest, Basic) {
-  QuerySyncManager::QueryInfo infos[4];
-  memset(&infos, 0xBD, sizeof(infos));
+  std::array<QuerySyncManager::QueryInfo, 4> infos;
+  memset(&infos, 0xBD, infos.size() * sizeof(infos[0]));
 
   for (size_t ii = 0; ii < std::size(infos); ++ii) {
     EXPECT_TRUE(sync_manager_->Alloc(&infos[ii]));
@@ -78,8 +74,8 @@
 }
 
 TEST_F(QuerySyncManagerTest, DontFree) {
-  QuerySyncManager::QueryInfo infos[4];
-  memset(&infos, 0xBD, sizeof(infos));
+  std::array<QuerySyncManager::QueryInfo, 4> infos;
+  memset(&infos, 0xBD, infos.size() * sizeof(infos[0]));
 
   for (size_t ii = 0; ii < std::size(infos); ++ii) {
     EXPECT_TRUE(sync_manager_->Alloc(&infos[ii]));
diff --git a/gpu/command_buffer/client/raster_implementation_unittest.cc b/gpu/command_buffer/client/raster_implementation_unittest.cc
index dec1103..2eef962f 100644
--- a/gpu/command_buffer/client/raster_implementation_unittest.cc
+++ b/gpu/command_buffer/client/raster_implementation_unittest.cc
@@ -16,6 +16,7 @@
 #include <stddef.h>
 #include <stdint.h>
 
+#include <array>
 #include <memory>
 
 #include "base/compiler_specific.h"
@@ -380,14 +381,15 @@
   //  GL_COMMANDS_COMPLETED_CHROMIUM,
   //  GL_CURRENT_QUERY_EXT
 
-  GLuint expected_ids[2] = {1, 2};  // These must match what's actually genned.
+  std::array<GLuint, 2> expected_ids = {
+      1, 2};  // These must match what's actually genned.
   struct GenCmds {
     cmds::GenQueriesEXTImmediate gen;
     GLuint data[2];
   };
   GenCmds expected_gen_cmds;
   expected_gen_cmds.gen.Init(std::size(expected_ids), &expected_ids[0]);
-  GLuint ids[std::size(expected_ids)] = {};
+  std::array<GLuint, std::size(expected_ids)> ids = {};
   gl_->GenQueriesEXT(std::size(expected_ids), &ids[0]);
   EXPECT_EQ(0,
             memcmp(&expected_gen_cmds, commands_, sizeof(expected_gen_cmds)));
diff --git a/gpu/command_buffer/client/ring_buffer_test.cc b/gpu/command_buffer/client/ring_buffer_test.cc
index a7a937b..25b64858 100644
--- a/gpu/command_buffer/client/ring_buffer_test.cc
+++ b/gpu/command_buffer/client/ring_buffer_test.cc
@@ -7,6 +7,8 @@
 #pragma allow_unsafe_buffers
 #endif
 
+#include <array>
+
 // This file contains the tests for the RingBuffer class.
 
 #include "gpu/command_buffer/client/ring_buffer.h"
@@ -160,7 +162,7 @@
 
   delay_set_token_ = true;
   // Allocate several buffers to fill in the memory.
-  int32_t tokens[kAllocCount];
+  std::array<int32_t, kAllocCount> tokens;
   for (unsigned int ii = 0; ii < kAllocCount; ++ii) {
     void* pointer = allocator_->Alloc(kSize);
     EXPECT_GE(kBufferSize,
diff --git a/gpu/command_buffer/common/id_allocator_test.cc b/gpu/command_buffer/common/id_allocator_test.cc
index a4faf03d..fa9fc7f2 100644
--- a/gpu/command_buffer/common/id_allocator_test.cc
+++ b/gpu/command_buffer/common/id_allocator_test.cc
@@ -2,16 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/351564777): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 // This file has the unit tests for the IdAllocator class.
 
+#include "gpu/command_buffer/common/id_allocator.h"
+
 #include <stdint.h>
 
-#include "gpu/command_buffer/common/id_allocator.h"
+#include <array>
+
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace gpu {
@@ -61,7 +59,7 @@
 
   // Allocate a significant number of resources.
   const unsigned int kNumResources = 100;
-  ResourceId ids[kNumResources];
+  std::array<ResourceId, kNumResources> ids;
   for (unsigned int i = 0; i < kNumResources; ++i) {
     ids[i] = allocator->AllocateID();
     EXPECT_TRUE(allocator->InUse(ids[i]));
diff --git a/gpu/command_buffer/service/common_decoder_unittest.cc b/gpu/command_buffer/service/common_decoder_unittest.cc
index d4d388b..a3a0b78 100644
--- a/gpu/command_buffer/service/common_decoder_unittest.cc
+++ b/gpu/command_buffer/service/common_decoder_unittest.cc
@@ -7,13 +7,15 @@
 #pragma allow_unsafe_buffers
 #endif
 
+#include "gpu/command_buffer/service/common_decoder.h"
+
 #include <stddef.h>
 #include <stdint.h>
 
+#include <array>
 #include <memory>
 
 #include "gpu/command_buffer/client/client_test_helper.h"
-#include "gpu/command_buffer/service/common_decoder.h"
 #include "gpu/command_buffer/service/mocks.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -230,7 +232,7 @@
 
 TEST_F(CommonDecoderTest, SetBucketDataImmediate) {
   cmd::SetBucketSize size_cmd;
-  int8_t buffer[1024];
+  std::array<int8_t, 1024> buffer;
   cmd::SetBucketDataImmediate& cmd =
       *reinterpret_cast<cmd::SetBucketDataImmediate*>(&buffer);
 
diff --git a/gpu/command_buffer/tests/gl_cube_map_texture_unittest.cc b/gpu/command_buffer/tests/gl_cube_map_texture_unittest.cc
index 33bb027..211742daa 100644
--- a/gpu/command_buffer/tests/gl_cube_map_texture_unittest.cc
+++ b/gpu/command_buffer/tests/gl_cube_map_texture_unittest.cc
@@ -10,6 +10,7 @@
 #include <GLES2/gl2.h>
 #include <stdint.h>
 
+#include <array>
 #include <memory>
 
 #include "base/containers/heap_array.h"
@@ -20,11 +21,14 @@
 namespace gpu {
 
 namespace {
-const GLenum kCubeMapTextureTargets[] = {
-    GL_TEXTURE_CUBE_MAP_POSITIVE_X, GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
-    GL_TEXTURE_CUBE_MAP_POSITIVE_Y, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
-    GL_TEXTURE_CUBE_MAP_POSITIVE_Z, GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
-};
+const auto kCubeMapTextureTargets = std::to_array<GLenum>({
+    GL_TEXTURE_CUBE_MAP_POSITIVE_X,
+    GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
+    GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
+    GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
+    GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
+    GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
+});
 }  // namespace
 
 // A collection of tests that exercise the cube map texture.
diff --git a/gpu/command_buffer/tests/gl_ext_multisample_compatibility_unittest.cc b/gpu/command_buffer/tests/gl_ext_multisample_compatibility_unittest.cc
index baf88a1..f4756e35 100644
--- a/gpu/command_buffer/tests/gl_ext_multisample_compatibility_unittest.cc
+++ b/gpu/command_buffer/tests/gl_ext_multisample_compatibility_unittest.cc
@@ -2,16 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include <GLES2/gl2.h>
 #include <GLES2/gl2ext.h>
 #include <GLES2/gl2extchromium.h>
 #include <stdint.h>
 
+#include <array>
 #include <memory>
 
 #include "base/containers/contains.h"
@@ -51,11 +47,28 @@
     GLuint vbo = 0;
     glGenBuffers(1, &vbo);
     glBindBuffer(GL_ARRAY_BUFFER, vbo);
-    static float vertices[] = {
-        1.0f,  1.0f, -1.0f, 1.0f,  -1.0f, -1.0f, -1.0f, 1.0f, -1.0f,
-        -1.0f, 1.0f, -1.0f, -1.0f, -1.0f, 1.0f,  -1.0f, 1.0f, 1.0f,
-    };
-    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
+    static auto vertices = std::to_array<float>({
+        1.0f,
+        1.0f,
+        -1.0f,
+        1.0f,
+        -1.0f,
+        -1.0f,
+        -1.0f,
+        1.0f,
+        -1.0f,
+        -1.0f,
+        1.0f,
+        -1.0f,
+        -1.0f,
+        -1.0f,
+        1.0f,
+        -1.0f,
+        1.0f,
+        1.0f,
+    });
+    glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(vertices[0]),
+                 vertices.data(), GL_STATIC_DRAW);
     glEnableVertexAttribArray(position_loc);
     glVertexAttribPointer(position_loc, 2, GL_FLOAT, GL_FALSE, 0, 0);
 
@@ -168,7 +181,7 @@
   // values. These might be due to different MSAA sample counts causing
   // different samples to hit.  Other option is driver bugs. Just test that
   // disabling multisample causes a difference.
-  std::unique_ptr<uint8_t[]> results[3];
+  std::array<std::unique_ptr<uint8_t[]>, 3> results;
   const GLint kResultSize = kWidth * kHeight * 4;
   for (int pass = 0; pass < 3; pass++) {
     PrepareForDraw();
@@ -230,7 +243,7 @@
   // even approximate sample values is not that easy.  Thus, just test
   // representative positions which have fractional pixels, inspecting that
   // normal rendering is different to SAMPLE_ALPHA_TO_ONE rendering.
-  std::unique_ptr<uint8_t[]> results[3];
+  std::array<std::unique_ptr<uint8_t[]>, 3> results;
   const GLint kResultSize = kWidth * kHeight * 4;
 
   for (int pass = 0; pass < 3; ++pass) {
diff --git a/gpu/command_buffer/tests/gl_helper_benchmark.cc b/gpu/command_buffer/tests/gl_helper_benchmark.cc
index 04daa3f..ae503e0 100644
--- a/gpu/command_buffer/tests/gl_helper_benchmark.cc
+++ b/gpu/command_buffer/tests/gl_helper_benchmark.cc
@@ -2,10 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
+#include <array>
 
 // This file looks like a unit test, but it contains benchmarks and test
 // utilities intended for manual evaluation of the scalers in
@@ -46,17 +43,17 @@
 
 namespace {
 
-GLHelper::ScalerQuality kQualities[] = {
+auto kQualities = std::to_array<GLHelper::ScalerQuality>({
     GLHelper::SCALER_QUALITY_BEST,
     GLHelper::SCALER_QUALITY_GOOD,
     GLHelper::SCALER_QUALITY_FAST,
-};
+});
 
-const char* const kQualityNames[] = {
+const auto kQualityNames = std::to_array<const char*>({
     "best",
     "good",
     "fast",
-};
+});
 
 }  // namespace
 
@@ -95,10 +92,28 @@
 };
 
 TEST_F(GLHelperBenchmark, ScaleBenchmark) {
-  int output_sizes[] = {1920, 1080, 1249, 720,  // Output size on pixel
-                        256,  144};
-  int input_sizes[] = {3200, 2040, 2560, 1476,  // Pixel tab size
-                       1920, 1080, 1280, 720,  800, 480, 256, 144};
+  auto output_sizes = std::to_array<int>({
+      1920,
+      1080,
+      1249,
+      720,  // Output size on pixel
+      256,
+      144,
+  });
+  auto input_sizes = std::to_array<int>({
+      3200,
+      2040,
+      2560,
+      1476,  // Pixel tab size
+      1920,
+      1080,
+      1280,
+      720,
+      800,
+      480,
+      256,
+      144,
+  });
 
   for (size_t q = 0; q < std::size(kQualities); q++) {
     for (size_t outsize = 0; outsize < std::size(output_sizes); outsize += 2) {
diff --git a/gpu/command_buffer/tests/gl_helper_unittest.cc b/gpu/command_buffer/tests/gl_helper_unittest.cc
index 2931118..af833ef9 100644
--- a/gpu/command_buffer/tests/gl_helper_unittest.cc
+++ b/gpu/command_buffer/tests/gl_helper_unittest.cc
@@ -14,6 +14,7 @@
 #include <GLES2/gl2extchromium.h>
 
 #include <algorithm>
+#include <array>
 #include <cmath>
 #include <memory>
 #include <string>
@@ -43,17 +44,17 @@
 
 namespace {
 
-GLHelper::ScalerQuality kQualities[] = {
+auto kQualities = std::to_array<GLHelper::ScalerQuality>({
     GLHelper::SCALER_QUALITY_BEST,
     GLHelper::SCALER_QUALITY_GOOD,
     GLHelper::SCALER_QUALITY_FAST,
-};
+});
 
-const char* kQualityNames[] = {
+auto kQualityNames = std::to_array<const char*>({
     "best",
     "good",
     "fast",
-};
+});
 
 }  // namespace
 
@@ -1360,7 +1361,20 @@
 
 // Validate that all scaling generates valid pipelines.
 TEST_F(GLHelperTest, ValidateScalerPipelines) {
-  int sizes[] = {7, 99, 128, 256, 512, 719, 720, 721, 1920, 2011, 3217, 4096};
+  auto sizes = std::to_array<int>({
+      7,
+      99,
+      128,
+      256,
+      512,
+      719,
+      720,
+      721,
+      1920,
+      2011,
+      3217,
+      4096,
+  });
   for (size_t q = 0; q < std::size(kQualities); q++) {
     for (size_t x = 0; x < std::size(sizes); x++) {
       for (size_t y = 0; y < std::size(sizes); y++) {
diff --git a/gpu/command_buffer/tests/gl_pointcoord_unittest.cc b/gpu/command_buffer/tests/gl_pointcoord_unittest.cc
index 737e708..53b2850 100644
--- a/gpu/command_buffer/tests/gl_pointcoord_unittest.cc
+++ b/gpu/command_buffer/tests/gl_pointcoord_unittest.cc
@@ -6,6 +6,8 @@
 #include <GLES2/gl2ext.h>
 #include <stdint.h>
 
+#include <array>
+
 #include "build/build_config.h"
 #include "gpu/command_buffer/tests/gl_manager.h"
 #include "gpu/command_buffer/tests/gl_test_utils.h"
@@ -39,13 +41,18 @@
   GLuint vbo = 0;
   glGenBuffers(1, &vbo);
   glBindBuffer(GL_ARRAY_BUFFER, vbo);
-  float vertices[] = {
-    -0.5f + pixel_offset, -0.5f + pixel_offset,
-     0.5f + pixel_offset, -0.5f + pixel_offset,
-    -0.5f + pixel_offset,  0.5f + pixel_offset,
-     0.5f + pixel_offset,  0.5f + pixel_offset,
-  };
-  glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
+  auto vertices = std::to_array<float>({
+      -0.5f + pixel_offset,
+      -0.5f + pixel_offset,
+      0.5f + pixel_offset,
+      -0.5f + pixel_offset,
+      -0.5f + pixel_offset,
+      0.5f + pixel_offset,
+      0.5f + pixel_offset,
+      0.5f + pixel_offset,
+  });
+  glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(float),
+               vertices.data(), GL_STATIC_DRAW);
   glEnableVertexAttribArray(position_location);
   glVertexAttribPointer(position_location, 2, GL_FLOAT, GL_FALSE, 0, 0);
 
@@ -101,7 +108,7 @@
   GLint position_loc = glGetAttribLocation(program, "a_position");
   GLint pointsize_loc = glGetUniformLocation(program, "u_pointsize");
 
-  GLint range[2] = { 0, 0 };
+  std::array<GLint, 2> range = {0, 0};
   glGetIntegerv(GL_ALIASED_POINT_SIZE_RANGE, &range[0]);
   GLint max_point_size = range[1];
   EXPECT_GE(max_point_size, 1);
@@ -149,6 +156,3 @@
 }
 
 }  // namespace gpu
-
-
-
diff --git a/gpu/command_buffer/tests/gl_virtual_contexts_unittest.cc b/gpu/command_buffer/tests/gl_virtual_contexts_unittest.cc
index adcbe7b6..d14b132 100644
--- a/gpu/command_buffer/tests/gl_virtual_contexts_unittest.cc
+++ b/gpu/command_buffer/tests/gl_virtual_contexts_unittest.cc
@@ -12,6 +12,8 @@
 #include <GLES2/gl2extchromium.h>
 #include <stdint.h>
 
+#include <array>
+
 #include "base/memory/raw_ptr.h"
 #include "build/build_config.h"
 #include "gpu/command_buffer/tests/gl_manager.h"
@@ -168,11 +170,11 @@
     raw_ptr<GLManager> manager;
   };
   const int kNumTests = 3;
-  TestInfo tests[] = {
-    { kSize0, { 255, 0, 0, 0, }, &gl_real_, },
-    { kSize1, { 0, 255, 0, 0, }, &gl1_, },
-    { kSize2, { 0, 0, 255, 0, }, &gl2_, },
-  };
+  auto tests = std::to_array<TestInfo>({
+      {kSize0, {255, 0, 0, 0}, &gl_real_},
+      {kSize1, {0, 255, 0, 0}, &gl1_},
+      {kSize2, {0, 0, 255, 0}, &gl2_},
+  });
 
   for (int ii = 0; ii < kNumTests; ++ii) {
     const TestInfo& test = tests[ii];
diff --git a/headless/lib/browser/headless_content_browser_client.cc b/headless/lib/browser/headless_content_browser_client.cc
index d52f189..db5915d 100644
--- a/headless/lib/browser/headless_content_browser_client.cc
+++ b/headless/lib/browser/headless_content_browser_client.cc
@@ -158,8 +158,9 @@
   return std::make_unique<HeadlessBrowserMainParts>(*browser_);
 }
 
-void HeadlessContentBrowserClient::OverrideWebkitPrefs(
+void HeadlessContentBrowserClient::OverrideWebPreferences(
     content::WebContents* web_contents,
+    content::SiteInstance& main_frame_site,
     blink::web_pref::WebPreferences* prefs) {
   prefs->lazy_load_enabled = browser_->options()->lazy_load_enabled;
 
diff --git a/headless/lib/browser/headless_content_browser_client.h b/headless/lib/browser/headless_content_browser_client.h
index b3d871de..4383dda 100644
--- a/headless/lib/browser/headless_content_browser_client.h
+++ b/headless/lib/browser/headless_content_browser_client.h
@@ -33,8 +33,9 @@
   // content::ContentBrowserClient implementation:
   std::unique_ptr<content::BrowserMainParts> CreateBrowserMainParts(
       bool is_integration_test) override;
-  void OverrideWebkitPrefs(content::WebContents* web_contents,
-                           blink::web_pref::WebPreferences* prefs) override;
+  void OverrideWebPreferences(content::WebContents* web_contents,
+                              content::SiteInstance& main_frame_site,
+                              blink::web_pref::WebPreferences* prefs) override;
   void RegisterBrowserInterfaceBindersForFrame(
       content::RenderFrameHost* render_frame_host,
       mojo::BinderMapWithContext<content::RenderFrameHost*>* map) override;
diff --git a/infra/config/generated/builders/ci/Mac Builder/targets/chromium.mac.json b/infra/config/generated/builders/ci/Mac Builder/targets/chromium.mac.json
index 40c776b..2dec5f79 100644
--- a/infra/config/generated/builders/ci/Mac Builder/targets/chromium.mac.json
+++ b/infra/config/generated/builders/ci/Mac Builder/targets/chromium.mac.json
@@ -1915,6 +1915,7 @@
         "name": "browser_tests",
         "swarming": {
           "dimensions": {
+            "cores": 12,
             "cpu": "x86-64",
             "os": "Mac-12"
           },
diff --git a/infra/config/generated/builders/ci/Mac12 Tests/targets/chromium.mac.json b/infra/config/generated/builders/ci/Mac12 Tests/targets/chromium.mac.json
index 838e5d0..6e403b2 100644
--- a/infra/config/generated/builders/ci/Mac12 Tests/targets/chromium.mac.json
+++ b/infra/config/generated/builders/ci/Mac12 Tests/targets/chromium.mac.json
@@ -195,6 +195,7 @@
         "name": "browser_tests",
         "swarming": {
           "dimensions": {
+            "cores": 12,
             "cpu": "x86-64",
             "os": "Mac-12"
           },
diff --git a/infra/config/generated/builders/ci/ios-blink-dbg-fyi/properties.json b/infra/config/generated/builders/ci/ios-blink-dbg-fyi/properties.json
index 5ca988f9..0d48b08 100644
--- a/infra/config/generated/builders/ci/ios-blink-dbg-fyi/properties.json
+++ b/infra/config/generated/builders/ci/ios-blink-dbg-fyi/properties.json
@@ -73,5 +73,5 @@
   },
   "builder_group": "chromium.fyi",
   "recipe": "chromium",
-  "xcode_build_version": "15f31d"
+  "xcode_build_version": "16b40"
 }
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/ios-blink-dbg-fyi/targets/chromium.fyi.json b/infra/config/generated/builders/ci/ios-blink-dbg-fyi/targets/chromium.fyi.json
index 3a12cbea..35764137 100644
--- a/infra/config/generated/builders/ci/ios-blink-dbg-fyi/targets/chromium.fyi.json
+++ b/infra/config/generated/builders/ci/ios-blink-dbg-fyi/targets/chromium.fyi.json
@@ -13,7 +13,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -42,7 +42,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -61,7 +61,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -90,7 +90,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -109,7 +109,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -138,7 +138,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -158,7 +158,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -187,7 +187,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -209,7 +209,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -238,7 +238,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -259,7 +259,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -288,7 +288,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -307,7 +307,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -336,7 +336,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -355,7 +355,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -384,7 +384,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -403,7 +403,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -432,7 +432,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -451,7 +451,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -480,7 +480,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -499,7 +499,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -528,7 +528,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -547,7 +547,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -576,7 +576,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -598,7 +598,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -632,7 +632,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -654,7 +654,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -688,7 +688,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -707,7 +707,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -736,7 +736,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -755,7 +755,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -784,7 +784,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -803,7 +803,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -832,7 +832,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -851,7 +851,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -880,7 +880,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -899,7 +899,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -928,7 +928,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -947,7 +947,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -976,7 +976,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -995,7 +995,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -1024,7 +1024,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -1043,7 +1043,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -1072,7 +1072,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -1094,7 +1094,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -1123,7 +1123,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -1145,7 +1145,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -1174,7 +1174,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -1195,7 +1195,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -1224,7 +1224,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -1245,7 +1245,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -1274,7 +1274,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -1295,7 +1295,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -1324,7 +1324,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -1345,7 +1345,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -1374,7 +1374,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -1395,7 +1395,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -1424,7 +1424,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -1445,7 +1445,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -1474,7 +1474,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -1495,7 +1495,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -1524,7 +1524,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -1545,7 +1545,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -1574,7 +1574,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -1595,7 +1595,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -1624,7 +1624,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -1645,7 +1645,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -1674,7 +1674,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -1693,7 +1693,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -1722,7 +1722,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -1741,7 +1741,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -1770,7 +1770,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -1789,7 +1789,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -1818,7 +1818,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -1837,7 +1837,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -1866,7 +1866,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -1885,7 +1885,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -1914,7 +1914,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -1933,7 +1933,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -1962,7 +1962,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -1981,7 +1981,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -2010,7 +2010,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -2029,7 +2029,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -2058,7 +2058,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -2077,7 +2077,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -2106,7 +2106,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -2125,7 +2125,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -2154,7 +2154,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -2173,7 +2173,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -2202,7 +2202,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -2221,7 +2221,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -2250,7 +2250,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -2269,7 +2269,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -2298,7 +2298,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -2317,7 +2317,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -2346,7 +2346,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -2367,7 +2367,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -2396,7 +2396,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -2417,7 +2417,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -2446,7 +2446,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -2465,7 +2465,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -2494,7 +2494,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -2513,7 +2513,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -2542,7 +2542,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -2561,7 +2561,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -2590,7 +2590,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -2609,7 +2609,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -2638,7 +2638,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -2657,7 +2657,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -2686,7 +2686,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -2705,7 +2705,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -2734,7 +2734,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -2755,7 +2755,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -2784,7 +2784,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -2805,7 +2805,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -2834,7 +2834,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -2853,7 +2853,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -2882,7 +2882,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -2901,7 +2901,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -2930,7 +2930,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -2949,7 +2949,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -2978,7 +2978,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -2997,7 +2997,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -3026,7 +3026,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -3045,7 +3045,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -3074,7 +3074,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -3093,7 +3093,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -3122,7 +3122,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -3141,7 +3141,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -3170,7 +3170,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -3189,7 +3189,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -3218,7 +3218,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -3237,7 +3237,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -3266,7 +3266,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -3285,7 +3285,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -3314,7 +3314,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -3335,7 +3335,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -3364,7 +3364,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -3385,7 +3385,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -3414,7 +3414,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -3439,7 +3439,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -3468,7 +3468,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -3493,7 +3493,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -3522,7 +3522,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -3547,7 +3547,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -3576,7 +3576,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -3601,7 +3601,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -3630,7 +3630,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -3649,7 +3649,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -3678,7 +3678,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -3697,7 +3697,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -3726,7 +3726,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -3747,7 +3747,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -3776,7 +3776,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -3797,7 +3797,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -3826,7 +3826,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -3845,7 +3845,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -3874,7 +3874,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -3893,7 +3893,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -3922,7 +3922,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -3941,7 +3941,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -3970,7 +3970,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -3989,7 +3989,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -4018,7 +4018,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -4037,7 +4037,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -4066,7 +4066,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -4085,7 +4085,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -4114,7 +4114,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -4133,7 +4133,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -4162,7 +4162,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -4181,7 +4181,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -4210,7 +4210,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -4229,7 +4229,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -4258,7 +4258,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -4277,7 +4277,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -4306,7 +4306,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -4325,7 +4325,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -4354,7 +4354,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -4373,7 +4373,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -4402,7 +4402,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -4421,7 +4421,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -4450,7 +4450,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -4469,7 +4469,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -4498,7 +4498,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -4517,7 +4517,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -4546,7 +4546,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -4565,7 +4565,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -4594,7 +4594,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -4613,7 +4613,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -4642,7 +4642,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -4661,7 +4661,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -4690,7 +4690,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -4709,7 +4709,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -4738,7 +4738,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -4757,7 +4757,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -4786,7 +4786,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -4806,7 +4806,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -4835,7 +4835,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -4855,7 +4855,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -4884,7 +4884,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -4903,7 +4903,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -4932,7 +4932,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -4951,7 +4951,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -4980,7 +4980,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -4999,7 +4999,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -5028,7 +5028,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -5047,7 +5047,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -5076,7 +5076,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -5095,7 +5095,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -5124,7 +5124,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -5143,7 +5143,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -5172,7 +5172,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -5194,7 +5194,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -5223,7 +5223,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -5245,7 +5245,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -5274,7 +5274,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -5293,7 +5293,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -5322,7 +5322,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -5341,7 +5341,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -5370,7 +5370,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -5389,7 +5389,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -5418,7 +5418,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -5437,7 +5437,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -5466,7 +5466,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
diff --git a/infra/config/generated/builders/try/ios-blink-dbg-fyi/targets/chromium.fyi.json b/infra/config/generated/builders/try/ios-blink-dbg-fyi/targets/chromium.fyi.json
index 3a12cbea..35764137 100644
--- a/infra/config/generated/builders/try/ios-blink-dbg-fyi/targets/chromium.fyi.json
+++ b/infra/config/generated/builders/try/ios-blink-dbg-fyi/targets/chromium.fyi.json
@@ -13,7 +13,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -42,7 +42,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -61,7 +61,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -90,7 +90,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -109,7 +109,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -138,7 +138,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -158,7 +158,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -187,7 +187,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -209,7 +209,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -238,7 +238,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -259,7 +259,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -288,7 +288,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -307,7 +307,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -336,7 +336,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -355,7 +355,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -384,7 +384,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -403,7 +403,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -432,7 +432,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -451,7 +451,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -480,7 +480,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -499,7 +499,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -528,7 +528,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -547,7 +547,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -576,7 +576,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -598,7 +598,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -632,7 +632,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -654,7 +654,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -688,7 +688,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -707,7 +707,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -736,7 +736,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -755,7 +755,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -784,7 +784,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -803,7 +803,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -832,7 +832,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -851,7 +851,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -880,7 +880,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -899,7 +899,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -928,7 +928,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -947,7 +947,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -976,7 +976,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -995,7 +995,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -1024,7 +1024,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -1043,7 +1043,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -1072,7 +1072,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -1094,7 +1094,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -1123,7 +1123,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -1145,7 +1145,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -1174,7 +1174,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -1195,7 +1195,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -1224,7 +1224,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -1245,7 +1245,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -1274,7 +1274,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -1295,7 +1295,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -1324,7 +1324,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -1345,7 +1345,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -1374,7 +1374,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -1395,7 +1395,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -1424,7 +1424,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -1445,7 +1445,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -1474,7 +1474,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -1495,7 +1495,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -1524,7 +1524,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -1545,7 +1545,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -1574,7 +1574,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -1595,7 +1595,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -1624,7 +1624,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -1645,7 +1645,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -1674,7 +1674,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -1693,7 +1693,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -1722,7 +1722,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -1741,7 +1741,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -1770,7 +1770,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -1789,7 +1789,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -1818,7 +1818,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -1837,7 +1837,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -1866,7 +1866,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -1885,7 +1885,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -1914,7 +1914,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -1933,7 +1933,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -1962,7 +1962,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -1981,7 +1981,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -2010,7 +2010,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -2029,7 +2029,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -2058,7 +2058,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -2077,7 +2077,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -2106,7 +2106,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -2125,7 +2125,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -2154,7 +2154,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -2173,7 +2173,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -2202,7 +2202,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -2221,7 +2221,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -2250,7 +2250,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -2269,7 +2269,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -2298,7 +2298,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -2317,7 +2317,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -2346,7 +2346,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -2367,7 +2367,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -2396,7 +2396,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -2417,7 +2417,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -2446,7 +2446,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -2465,7 +2465,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -2494,7 +2494,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -2513,7 +2513,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -2542,7 +2542,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -2561,7 +2561,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -2590,7 +2590,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -2609,7 +2609,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -2638,7 +2638,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -2657,7 +2657,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -2686,7 +2686,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -2705,7 +2705,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -2734,7 +2734,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -2755,7 +2755,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -2784,7 +2784,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -2805,7 +2805,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -2834,7 +2834,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -2853,7 +2853,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -2882,7 +2882,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -2901,7 +2901,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -2930,7 +2930,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -2949,7 +2949,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -2978,7 +2978,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -2997,7 +2997,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -3026,7 +3026,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -3045,7 +3045,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -3074,7 +3074,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -3093,7 +3093,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -3122,7 +3122,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -3141,7 +3141,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -3170,7 +3170,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -3189,7 +3189,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -3218,7 +3218,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -3237,7 +3237,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -3266,7 +3266,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -3285,7 +3285,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -3314,7 +3314,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -3335,7 +3335,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -3364,7 +3364,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -3385,7 +3385,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -3414,7 +3414,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -3439,7 +3439,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -3468,7 +3468,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -3493,7 +3493,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -3522,7 +3522,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -3547,7 +3547,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -3576,7 +3576,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -3601,7 +3601,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -3630,7 +3630,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -3649,7 +3649,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -3678,7 +3678,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -3697,7 +3697,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -3726,7 +3726,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -3747,7 +3747,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -3776,7 +3776,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -3797,7 +3797,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -3826,7 +3826,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -3845,7 +3845,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -3874,7 +3874,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -3893,7 +3893,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -3922,7 +3922,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -3941,7 +3941,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -3970,7 +3970,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -3989,7 +3989,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -4018,7 +4018,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -4037,7 +4037,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -4066,7 +4066,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -4085,7 +4085,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -4114,7 +4114,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -4133,7 +4133,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -4162,7 +4162,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -4181,7 +4181,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -4210,7 +4210,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -4229,7 +4229,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -4258,7 +4258,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -4277,7 +4277,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -4306,7 +4306,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -4325,7 +4325,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -4354,7 +4354,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -4373,7 +4373,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -4402,7 +4402,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -4421,7 +4421,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -4450,7 +4450,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -4469,7 +4469,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -4498,7 +4498,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -4517,7 +4517,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -4546,7 +4546,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -4565,7 +4565,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -4594,7 +4594,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -4613,7 +4613,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -4642,7 +4642,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -4661,7 +4661,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -4690,7 +4690,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -4709,7 +4709,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -4738,7 +4738,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -4757,7 +4757,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -4786,7 +4786,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -4806,7 +4806,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -4835,7 +4835,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -4855,7 +4855,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -4884,7 +4884,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -4903,7 +4903,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -4932,7 +4932,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -4951,7 +4951,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -4980,7 +4980,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -4999,7 +4999,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -5028,7 +5028,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -5047,7 +5047,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -5076,7 +5076,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -5095,7 +5095,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -5124,7 +5124,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -5143,7 +5143,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -5172,7 +5172,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -5194,7 +5194,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -5223,7 +5223,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -5245,7 +5245,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -5274,7 +5274,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -5293,7 +5293,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -5322,7 +5322,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -5341,7 +5341,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -5370,7 +5370,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -5389,7 +5389,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -5418,7 +5418,7 @@
               "path": "Runtime-ios-17.5"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
@@ -5437,7 +5437,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "15f31d",
+          "16b40",
           "--xctest"
         ],
         "merge": {
@@ -5466,7 +5466,7 @@
               "path": "Runtime-ios-18.0"
             },
             {
-              "name": "xcode_ios_15f31d",
+              "name": "xcode_ios_16b40",
               "path": "Xcode.app"
             }
           ],
diff --git a/infra/config/generated/builders/try/mac12-tests/targets/chromium.mac.json b/infra/config/generated/builders/try/mac12-tests/targets/chromium.mac.json
index ab5c35d..4a37390 100644
--- a/infra/config/generated/builders/try/mac12-tests/targets/chromium.mac.json
+++ b/infra/config/generated/builders/try/mac12-tests/targets/chromium.mac.json
@@ -217,6 +217,7 @@
         "name": "browser_tests",
         "swarming": {
           "dimensions": {
+            "cores": 12,
             "cpu": "x86-64",
             "os": "Mac-12"
           },
diff --git a/infra/config/generated/builders/try/mac_chromium_compile_rel_ng/targets/chromium.mac.json b/infra/config/generated/builders/try/mac_chromium_compile_rel_ng/targets/chromium.mac.json
index 40c776b..2dec5f79 100644
--- a/infra/config/generated/builders/try/mac_chromium_compile_rel_ng/targets/chromium.mac.json
+++ b/infra/config/generated/builders/try/mac_chromium_compile_rel_ng/targets/chromium.mac.json
@@ -1915,6 +1915,7 @@
         "name": "browser_tests",
         "swarming": {
           "dimensions": {
+            "cores": 12,
             "cpu": "x86-64",
             "os": "Mac-12"
           },
diff --git a/infra/config/generated/luci/cr-buildbucket.cfg b/infra/config/generated/luci/cr-buildbucket.cfg
index 6070824..d88fbb9 100644
--- a/infra/config/generated/luci/cr-buildbucket.cfg
+++ b/infra/config/generated/luci/cr-buildbucket.cfg
@@ -51931,8 +51931,8 @@
       priority: 35
       execution_timeout_secs: 10800
       caches {
-        name: "xcode_ios_15f31d"
-        path: "xcode_ios_15f31d.app"
+        name: "xcode_ios_16b40"
+        path: "xcode_ios_16b40.app"
       }
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
diff --git a/infra/config/subprojects/chromium/ci/chromium.fyi.star b/infra/config/subprojects/chromium/ci/chromium.fyi.star
index 963d4f8d..351f0a89 100644
--- a/infra/config/subprojects/chromium/ci/chromium.fyi.star
+++ b/infra/config/subprojects/chromium/ci/chromium.fyi.star
@@ -1957,7 +1957,7 @@
             "mac_default_arm64",
             "mac_toolchain",
             "out_dir_arg",
-            "xcode_15_beta",
+            "xcode_16_main",
             "xctest",
         ],
     ),
@@ -1968,7 +1968,6 @@
         short_name = "ios-blk",
     ),
     execution_timeout = 3 * time.hour,
-    xcode = xcode.x15betabots,
 )
 
 fyi_ios_builder(
diff --git a/infra/config/subprojects/chromium/ci/chromium.mac.star b/infra/config/subprojects/chromium/ci/chromium.mac.star
index 09a387d..d456988 100644
--- a/infra/config/subprojects/chromium/ci/chromium.mac.star
+++ b/infra/config/subprojects/chromium/ci/chromium.mac.star
@@ -733,6 +733,9 @@
             "browser_tests": targets.mixin(
                 ci_only = True,
                 swarming = targets.swarming(
+                    dimensions = {
+                        "cores": 12,
+                    },
                     # crbug.com/1361887
                     shards = 20,
                 ),
diff --git a/infra/inclusive_language_presubmit_exempt_dirs.txt b/infra/inclusive_language_presubmit_exempt_dirs.txt
index a163055..fd839e1 100644
--- a/infra/inclusive_language_presubmit_exempt_dirs.txt
+++ b/infra/inclusive_language_presubmit_exempt_dirs.txt
@@ -65,7 +65,6 @@
 chrome/browser/support_tool/ash 1 1
 chrome/browser/sync/test/integration 1 1
 chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox 1 1
-chrome/browser/ui/webui/ash/parent_access 1 1
 chrome/browser/ui/webui/settings 1 1
 chrome/browser/win 2 1
 chromecast 1 1
@@ -147,6 +146,7 @@
 components/signin/public/base 2 2
 components/signin/public/identity_manager 1 1
 components/strictmode/android/java/src/org/chromium/components/strictmode 4 3
+components/supervised_user/core/browser/proto 1 1
 components/sync/engine/nigori 1 1
 components/test/data/autofill/heuristics/input 10 7
 components/test/data/browsing_topics 1 1
@@ -432,7 +432,7 @@
 third_party/blink/web_tests/external/wpt/css/mediaqueries 1 1
 third_party/blink/web_tests/external/wpt/docs 2 1
 third_party/blink/web_tests/external/wpt/docs/reviewing-tests 5 2
-third_party/blink/web_tests/external/wpt/docs/writing-tests 22 7
+third_party/blink/web_tests/external/wpt/docs/writing-tests 23 8
 third_party/blink/web_tests/external/wpt/dom/traversal 1 1
 third_party/blink/web_tests/external/wpt/encrypted-media/content 5 5
 third_party/blink/web_tests/external/wpt/feature-policy/resources 1 1
@@ -657,15 +657,15 @@
 third_party/rust/chromium_crates_io/vendor/codespan-reporting-0.11.1 2 1
 third_party/rust/chromium_crates_io/vendor/codespan-reporting-0.11.1/examples 1 1
 third_party/rust/chromium_crates_io/vendor/crc32fast-1.4.2/.github/workflows 2 1
-third_party/rust/chromium_crates_io/vendor/cxx-1.0.135 1 1
-third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book 1 1
-third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/src 3 1
-third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/.github/workflows 4 3
-third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src 4 1
+third_party/rust/chromium_crates_io/vendor/cxx-1.0.136 1 1
+third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book 1 1
+third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/src 3 1
+third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/.github/workflows 4 3
+third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src 4 1
 third_party/rust/chromium_crates_io/vendor/either-1.13.0/.github/workflows 1 1
 third_party/rust/chromium_crates_io/vendor/flate2-1.0.35 33 2
 third_party/rust/chromium_crates_io/vendor/getrandom-0.2.15 5 1
-third_party/rust/chromium_crates_io/vendor/glob-0.3.1/.github/workflows 1 1
+third_party/rust/chromium_crates_io/vendor/glob-0.3.2/.github/workflows 2 2
 third_party/rust/chromium_crates_io/vendor/hex-0.4.3 1 1
 third_party/rust/chromium_crates_io/vendor/itertools-0.11.0/.github/workflows 1 1
 third_party/rust/chromium_crates_io/vendor/itoa-1.0.14 2 1
@@ -680,8 +680,8 @@
 third_party/rust/chromium_crates_io/vendor/proc-macro2-1.0.92/.github/workflows 2 1
 third_party/rust/chromium_crates_io/vendor/prost-0.13.4 2 1
 third_party/rust/chromium_crates_io/vendor/qr_code-2.0.0 1 1
-third_party/rust/chromium_crates_io/vendor/quote-1.0.37 1 1
-third_party/rust/chromium_crates_io/vendor/quote-1.0.37/.github/workflows 2 1
+third_party/rust/chromium_crates_io/vendor/quote-1.0.38 1 1
+third_party/rust/chromium_crates_io/vendor/quote-1.0.38/.github/workflows 2 1
 third_party/rust/chromium_crates_io/vendor/rand-0.8.5 9 2
 third_party/rust/chromium_crates_io/vendor/rand_chacha-0.3.1 4 1
 third_party/rust/chromium_crates_io/vendor/rand_core-0.6.4 4 1
@@ -700,17 +700,17 @@
 third_party/rust/chromium_crates_io/vendor/regex-syntax-0.8.5 2 2
 third_party/rust/chromium_crates_io/vendor/relative-path-1.9.3/src 1 1
 third_party/rust/chromium_crates_io/vendor/rustc_version-0.4.1/.github/workflows 1 1
-third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18 2 1
-third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/.github/workflows 2 1
-third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/src 1 1
+third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19 2 1
+third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/.github/workflows 2 1
+third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/src 1 1
 third_party/rust/chromium_crates_io/vendor/ryu-1.0.18 2 1
 third_party/rust/chromium_crates_io/vendor/ryu-1.0.18/.github/workflows 2 1
 third_party/rust/chromium_crates_io/vendor/ryu-1.0.18/src 1 1
 third_party/rust/chromium_crates_io/vendor/semver-1.0.24 1 1
 third_party/rust/chromium_crates_io/vendor/semver-1.0.24/.github/workflows 2 1
-third_party/rust/chromium_crates_io/vendor/serde-1.0.216 1 1
-third_party/rust/chromium_crates_io/vendor/serde-1.0.216/src 1 1
-third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216 1 1
+third_party/rust/chromium_crates_io/vendor/serde-1.0.217 1 1
+third_party/rust/chromium_crates_io/vendor/serde-1.0.217/src 1 1
+third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217 1 1
 third_party/rust/chromium_crates_io/vendor/serde_json-1.0.134 6 1
 third_party/rust/chromium_crates_io/vendor/serde_json-1.0.134/.github/workflows 1 1
 third_party/rust/chromium_crates_io/vendor/serde_json_lenient-0.2.4 1 1
@@ -719,8 +719,8 @@
 third_party/rust/chromium_crates_io/vendor/static_assertions-1.1.0/src 2 1
 third_party/rust/chromium_crates_io/vendor/strum-0.25.0/src 1 1
 third_party/rust/chromium_crates_io/vendor/strum_macros-0.25.3 1 1
-third_party/rust/chromium_crates_io/vendor/syn-2.0.91 1 1
-third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src 2 1
+third_party/rust/chromium_crates_io/vendor/syn-2.0.95 1 1
+third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src 2 1
 third_party/rust/chromium_crates_io/vendor/termcolor-1.4.1/.github/workflows 3 1
 third_party/rust/chromium_crates_io/vendor/unicode-ident-1.0.14 1 1
 third_party/rust/chromium_crates_io/vendor/unicode-ident-1.0.14/.github/workflows 2 1
diff --git a/internal b/internal
index 30bfae1..b11d521 160000
--- a/internal
+++ b/internal
@@ -1 +1 @@
-Subproject commit 30bfae1f40eec5b253fda18c43cd86625561ec4a
+Subproject commit b11d5217eddb9b5182b1025baa30fe8d3749fb5b
diff --git a/ios/PRESUBMIT.py b/ios/PRESUBMIT.py
index 3ad9ec9..7e3489312 100644
--- a/ios/PRESUBMIT.py
+++ b/ios/PRESUBMIT.py
@@ -8,6 +8,7 @@
 """
 
 import os
+import xml.etree.ElementTree as ElementTree
 
 NULLABILITY_PATTERN = r'(nonnull|nullable|_Nullable|_Nonnull)'
 TODO_PATTERN = r'TO[D]O\(([^\)]*)\)'
@@ -267,6 +268,46 @@
 
     return [output_api.PresubmitError(warning_message)]
 
+
+def _IsAlphabeticallySortedXML(file):
+    """Check that the `file` is alphabetically sorted"""
+    parser = ElementTree.XMLParser(target=ElementTree.TreeBuilder(
+        insert_comments=True))
+    with open(file, 'r') as xml_file:
+        tree = ElementTree.parse(xml_file, parser)
+    root = tree.getroot()
+
+    original_tree_string = ElementTree.tostring(root, encoding='utf8')
+
+    messages_element = tree.findall('.//messages')[0]
+    messages = messages_element.findall('message')
+    messages.sort(key=lambda message: message.attrib["name"])
+    for message in messages:
+        messages_element.remove(message)
+    for message in messages:
+        messages_element.append(message)
+    ordered_tree_string = ElementTree.tostring(root, encoding='utf8')
+    return ordered_tree_string == original_tree_string
+
+
+def _CheckOrderedStringFile(input_api, output_api):
+    """ Checks that the string files are alphabetically ordered"""
+    errors = []
+    for f in input_api.AffectedFiles():
+        if not f.LocalPath().endswith("_strings.grd"):
+            continue
+        if not _IsAlphabeticallySortedXML(f.AbsoluteLocalPath()):
+            errors.append('  python3 ios/tools/order_string_file.py ' +
+                          f.LocalPath())
+
+    if not errors:
+        return []
+    warning_message = '\n'.join(
+        ['Files not alphabetically sorted, try running:'] + errors) + '\n'
+
+    return [output_api.PresubmitPromptWarning(warning_message)]
+
+
 def CheckChangeOnUpload(input_api, output_api):
     results = []
     results.extend(_CheckBugInToDo(input_api, output_api))
@@ -276,4 +317,5 @@
     results.extend(_CheckHasNoBoxedBOOL(input_api, output_api))
     results.extend(_CheckNoTearDownEGTest(input_api, output_api))
     results.extend(_CheckCanImproveTestUsingExpectNSEQ(input_api, output_api))
+    results.extend(_CheckOrderedStringFile(input_api, output_api))
     return results
diff --git a/ios/chrome/app/strings/ios_chromium_strings.grd b/ios/chrome/app/strings/ios_chromium_strings.grd
index e2717548..a71bb4a 100644
--- a/ios/chrome/app/strings/ios_chromium_strings.grd
+++ b/ios/chrome/app/strings/ios_chromium_strings.grd
@@ -231,6 +231,12 @@
       <message name="IDS_IOS_CONSISTENCY_PROMO_DEFAULT_ACCOUNT_TITLE" desc="Dialog title to invite the user to sign-in on the web, related to IDS_IOS_CONSISTENCY_PROMO_DEFAULT_ACCOUNT_TITLE.">
         Sign in to Chromium
       </message>
+      <message name="IDS_IOS_CONTEXTUAL_PANEL_BRANDING_ACCESSIBILITY_LABEL" desc="Accessibility text for the title of the Contextual Panel screen.">
+        From Chromium
+      </message>
+    <message name="IDS_IOS_CONTEXTUAL_PANEL_BRANDING_TITLE" desc="Branded title on the Contextual Panel screen. The string is lowercase on purpose.">
+        chromium
+      </message>
       <message name="IDS_IOS_CREDENTIAL_PROVIDER_PROMO_INITIAL_SUBTITLE" desc="Subtitle text of the inital step view of Credential Provider Exention promo. [iOS only]">
         To easily get your saved passwords in your other apps, use Chromium for AutoFill
       </message>
@@ -327,6 +333,9 @@
       <message name="IDS_IOS_ENTERPRISE_SYNC_DISABLED_MESSAGE_WITH_UNO" desc="Message displayed in a prompt when saving data (like bookmarks/reading list/passwords...) is disabled due to an enterprise policy. Related with IDS_IOS_ENTERPRISE_SYNC_DISABLED_TITLE_UNO.">
         Your organization turned off the ability to use and save Chromium data in your Google Account. New bookmarks, passwords, and more will be saved only to this device.
       </message>
+      <message name="IDS_IOS_EXPANDED_MANUAL_FILL_VIEW_ACCESSIBILITY_ANNOUNCEMENT" desc="Accessibility announcement read by VoiceOver when the expanded manual fill view is shown.">
+         Chromium Autofill expanded view
+      </message>
       <message name="IDS_IOS_FACE_ID_USAGE_DESCRIPTION" desc="Specifies the reason for using the device's Face ID capabilities.">
         Chromium keeps your sensitive data secure with Face ID.
       </message>
@@ -416,6 +425,24 @@
       <message name="IDS_IOS_IDENTITY_ERROR_INFOBAR_MAKE_SURE_YOU_CAN_ALWAYS_USE_CHROME_DATA_MESSAGE" desc="The error message in the identity error info bar related to making sure your can always use Chromium data in your Google account. [iOS only]">
         Make sure you can always use the Chromium data in your Google Account
       </message>
+      <message name="IDS_IOS_IDLE_TIMEOUT_CONTINUE_USING_CHROME" desc="Button label to indicate browser activity and stop the browser from running idle timeout actions.">
+         Continue using Chromium
+      </message>
+      <message name="IDS_IOS_IDLE_TIMEOUT_SUBTITLE_WITHOUT_CLEAR_DATA" desc="Subtitle of the idle timeout policy dialog explaining when the idle action usually happens.">
+          {THRESHOLD, plural,
+          =1 {This happens when Chromium isn't used for {THRESHOLD} minute}
+          other {This happens when Chromium isn't used for {THRESHOLD} minutes}}
+      </message>
+      <message name="IDS_IOS_IDLE_TIMEOUT_SUBTITLE_WITH_CLEAR_DATA" desc="Subtitle of the idle timeout policy dialog explaining when the idle action usually happens. It also informs the user that browsing data will be cleared.">
+          {THRESHOLD, plural,
+            =1 {This happens when Chromium isn't used for {THRESHOLD} minute. This could include history and autofill.}
+            other {This happens when Chromium isn't used for {THRESHOLD} minutes. This could include history and autofill.}}
+      </message>
+      <message name="IDS_IOS_IDLE_TIMEOUT_SUBTITLE_WITH_CLEAR_DATA_ON_SIGNOUT" desc="Subtitle of the idle timeout policy dialog explaining when the idle action usually happens. It also informs the user that data will be cleared when they are signed out.">
+          {THRESHOLD, plural,
+            =1 {This happens when Chromium isn't used for {THRESHOLD} minute. Data saved only to this device while you were signed in will be deleted. This could include history and passwords.}
+            other {This happens when Chromium isn't used for {THRESHOLD} minutes. Data saved only to this device while you were signed in will be deleted. This could include history and passwords.}}
+      </message>
       <message name="IDS_IOS_INCOGNITO_INTERSTITIAL_OPEN_IN_CHROME" desc="Button to open a link from an external app in a regular tab rather than in Incognito mode. [iOS only]">
         Open in Chromium
       </message>
@@ -593,15 +620,15 @@
       <message name="IDS_IOS_MAGIC_STACK_TIP_LENS_TRANSLATE_TITLE" desc="The title of the use Lens for translation tip for the Magic Stack.">
         Translate
       </message>
+      <message name="IDS_IOS_MAGIC_STACK_TIP_SAFE_BROWSING_TITLE" desc="The title of the Safe Browsing tip for the Magic Stack.">
+        Get Chromium's Strongest Security
+      </message>
       <message name="IDS_IOS_MAGIC_STACK_TIP_SAVE_PASSWORDS_TUTORIAL_STEP_2" desc="The second step of the Save Passwords tutorial for the Magic Stack.">
         Chromium will offer to save your password.
       </message>
       <message name="IDS_IOS_MAGIC_STACK_TIP_SAVE_PASSWORD_TITLE" desc="The title of the Save Password tip for the Magic Stack.">
         Save Your Passwords in Chromium
       </message>
-      <message name="IDS_IOS_MAGIC_STACK_TIP_SAFE_BROWSING_TITLE" desc="The title of the Safe Browsing tip for the Magic Stack.">
-        Get Chromium's Strongest Security
-      </message>
       <message name="IDS_IOS_MAGIC_STACK_TIP_SET_UP_COMPLETION_DESCRIPTION" desc="The description of the Set Up List completion for the Magic Stack.">
         Check back here for more useful tips to get the most out of Chromium.
       </message>
@@ -679,18 +706,18 @@
       <message name="IDS_IOS_NOTIFICATIONS_TIPS_SETUPLIST_CONTINUATION_TITLE" desc="Text for the title of a Tips notification that encourages the user to complete the Set Up List">
         Finish setting up Chromium
       </message>
-      <message name="IDS_IOS_NOTIFICATIONS_TIPS_SIGNIN_TITLE" desc="Text for the title of a Tips notification that encourages the user to sign in to their account">
-        Chromium Tip: Sign in to Chromium
-      </message>
       <message name="IDS_IOS_NOTIFICATIONS_TIPS_SIGNIN_BODY" desc="Text for the body of a Tips notification that encourages the user to sign in to their account">
         Sign in with your Google Account to sync your passwords, bookmarks, and more.
       </message>
-      <message name="IDS_IOS_NOTIFICATIONS_TIPS_WHATS_NEW_TITLE" desc="Text for the title of a Tips notification that takes the user to the Whats New page">
-        What's New in Chromium
+      <message name="IDS_IOS_NOTIFICATIONS_TIPS_SIGNIN_TITLE" desc="Text for the title of a Tips notification that encourages the user to sign in to their account">
+        Chromium Tip: Sign in to Chromium
       </message>
       <message name="IDS_IOS_NOTIFICATIONS_TIPS_WHATS_NEW_BODY" desc="Text for the body of a Tips notification that takes the user to the Whats New page">
         Explore new features that help you get the most out of Chromium.
       </message>
+      <message name="IDS_IOS_NOTIFICATIONS_TIPS_WHATS_NEW_TITLE" desc="Text for the title of a Tips notification that takes the user to the Whats New page">
+        What's New in Chromium
+      </message>
       <message name="IDS_IOS_OVERFLOW_MENU_SHARE_CHROME" desc="The iOS menu item for opening a share sheet with the URL to the Chrome app in the iOS app store" meaning="[iOS only] [Length: Unlimited]">
         Share Chromium
       </message>
@@ -826,13 +853,13 @@
       <message name="IDS_IOS_SAFE_BROWSING_ENHANCED_PROTECTION_FOOTER" desc="Footer for Safe Browsing enhanced protection mode.">
         Learn more about <ph name="BEGIN_LINK">BEGIN_LINK</ph>how Chromium keeps your data private<ph name="END_LINK">END_LINK</ph>
       </message>
-      <message name="IDS_IOS_SAFE_BROWSING_STANDARD_PROTECTION_BULLET_TWO" desc="Second bullet point under the Safe Browsing standard protection mode.">
-        Checks URLs with a list of unsafe sites stored in Chromium. If a site tries to steal your password, or when you download a harmful file, Chromium may also send URLs, including bits of page content, to Safe Browsing.
-      </message>
       <message name="IDS_IOS_SAFE_BROWSING_ENHANCED_PROTECTION_INFOBAR_DESCRIPTION" desc="The Enhanced Safe Browsing infobar promo's description.">Chromium recommends enhanced protection</message>
       <message name="IDS_IOS_SAFE_BROWSING_ENHANCED_PROTECTION_INLINE_PROMO_DESCRIPTION" desc="The Enhanced Safe Browsing inline promo's description.">
           Get Chromium's strongest security from dangerous sites
       </message>
+      <message name="IDS_IOS_SAFE_BROWSING_STANDARD_PROTECTION_BULLET_TWO" desc="Second bullet point under the Safe Browsing standard protection mode.">
+        Checks URLs with a list of unsafe sites stored in Chromium. If a site tries to steal your password, or when you download a harmful file, Chromium may also send URLs, including bits of page content, to Safe Browsing.
+      </message>
       <message name="IDS_IOS_SAFE_BROWSING_STANDARD_PROTECTION_LEAK_CHECK_FRIENDLIER_SUMMARY" desc="Friendlier summary for the switch toggling whether Chrome should check that entered credentials have been part of a leak.">
         When you use a password, Chromium warns you if it has been published online. When doing this, your passwords and usernames are encrypted, so they can’t be read by anyone, including Google.
       </message>
@@ -1127,33 +1154,6 @@
       <message name="IDS_SEND_TAB_TO_SELF_SIGN_IN_PROMO_LABEL" desc="Text when a signed out user attempts to use send-tab-to-self, then sees a sign-in promo.">
         To send this tab to another device, sign in to Chromium on both devices.
       </message>
-      <message name="IDS_IOS_IDLE_TIMEOUT_SUBTITLE_WITHOUT_CLEAR_DATA" desc="Subtitle of the idle timeout policy dialog explaining when the idle action usually happens.">
-          {THRESHOLD, plural,
-          =1 {This happens when Chromium isn't used for {THRESHOLD} minute}
-          other {This happens when Chromium isn't used for {THRESHOLD} minutes}}
-      </message>
-      <message name="IDS_IOS_IDLE_TIMEOUT_SUBTITLE_WITH_CLEAR_DATA" desc="Subtitle of the idle timeout policy dialog explaining when the idle action usually happens. It also informs the user that browsing data will be cleared.">
-          {THRESHOLD, plural,
-            =1 {This happens when Chromium isn't used for {THRESHOLD} minute. This could include history and autofill.}
-            other {This happens when Chromium isn't used for {THRESHOLD} minutes. This could include history and autofill.}}
-      </message>
-      <message name="IDS_IOS_IDLE_TIMEOUT_SUBTITLE_WITH_CLEAR_DATA_ON_SIGNOUT" desc="Subtitle of the idle timeout policy dialog explaining when the idle action usually happens. It also informs the user that data will be cleared when they are signed out.">
-          {THRESHOLD, plural,
-            =1 {This happens when Chromium isn't used for {THRESHOLD} minute. Data saved only to this device while you were signed in will be deleted. This could include history and passwords.}
-            other {This happens when Chromium isn't used for {THRESHOLD} minutes. Data saved only to this device while you were signed in will be deleted. This could include history and passwords.}}
-      </message>
-      <message name="IDS_IOS_IDLE_TIMEOUT_CONTINUE_USING_CHROME" desc="Button label to indicate browser activity and stop the browser from running idle timeout actions.">
-         Continue using Chromium
-      </message>
-      <message name="IDS_IOS_EXPANDED_MANUAL_FILL_VIEW_ACCESSIBILITY_ANNOUNCEMENT" desc="Accessibility announcement read by VoiceOver when the expanded manual fill view is shown.">
-         Chromium Autofill expanded view
-      </message>
-      <message name="IDS_IOS_CONTEXTUAL_PANEL_BRANDING_TITLE" desc="Branded title on the Contextual Panel screen. The string is lowercase on purpose.">
-        chromium
-      </message>
-      <message name="IDS_IOS_CONTEXTUAL_PANEL_BRANDING_ACCESSIBILITY_LABEL" desc="Accessibility text for the title of the Contextual Panel screen.">
-        From Chromium
-      </message>
-    </messages>
+      </messages>
   </release>
-</grit>
+</grit>
\ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_google_chrome_strings.grd b/ios/chrome/app/strings/ios_google_chrome_strings.grd
index 3e8d552..5e5462c 100644
--- a/ios/chrome/app/strings/ios_google_chrome_strings.grd
+++ b/ios/chrome/app/strings/ios_google_chrome_strings.grd
@@ -231,6 +231,12 @@
       <message name="IDS_IOS_CONSISTENCY_PROMO_DEFAULT_ACCOUNT_TITLE" desc="Dialog title to invite the user to sign-in on the web.">
         Sign in to Chrome
       </message>
+      <message name="IDS_IOS_CONTEXTUAL_PANEL_BRANDING_ACCESSIBILITY_LABEL" desc="Accessibility text for the title of the Contextual Panel screen.">
+        From Chrome
+      </message>
+    <message name="IDS_IOS_CONTEXTUAL_PANEL_BRANDING_TITLE" desc="Branded title on the Contextual Panel screen. The string is lowercase on purpose.">
+        chrome
+      </message>
       <message name="IDS_IOS_CREDENTIAL_PROVIDER_PROMO_INITIAL_SUBTITLE" desc="Subtitle text of the inital step view of Credential Provider Exention promo. [iOS only]">
         To easily get your saved passwords in your other apps, use Chrome for AutoFill
       </message>
@@ -327,6 +333,9 @@
       <message name="IDS_IOS_ENTERPRISE_SYNC_DISABLED_MESSAGE_WITH_UNO" desc="Message displayed in a prompt when saving data (like bookmarks/reading list/passwords...) is disabled due to an enterprise policy. Related with IDS_IOS_ENTERPRISE_SYNC_DISABLED_TITLE_UNO.">
         Your organization turned off the ability to use and save Chrome data in your Google Account. New bookmarks, passwords, and more will be saved only to this device.
       </message>
+      <message name="IDS_IOS_EXPANDED_MANUAL_FILL_VIEW_ACCESSIBILITY_ANNOUNCEMENT" desc="Accessibility announcement read by VoiceOver when the expanded manual fill view is shown.">
+         Chrome Autofill expanded view
+      </message>
       <message name="IDS_IOS_FACE_ID_USAGE_DESCRIPTION" desc="Specifies the reason for using the device's Face ID capabilities.">
         Chrome keeps your sensitive data secure with Face ID.
       </message>
@@ -416,6 +425,24 @@
       <message name="IDS_IOS_IDENTITY_ERROR_INFOBAR_MAKE_SURE_YOU_CAN_ALWAYS_USE_CHROME_DATA_MESSAGE" desc="The error message in the identity error info bar related to making sure your can always use Chromium data in your Google account. [iOS only]">
         Make sure you can always use the Chrome data in your Google Account
       </message>
+      <message name="IDS_IOS_IDLE_TIMEOUT_CONTINUE_USING_CHROME" desc="Button label to indicate browser activity and stop the browser from running idle timeout actions.">
+         Continue using Chrome
+      </message>
+      <message name="IDS_IOS_IDLE_TIMEOUT_SUBTITLE_WITHOUT_CLEAR_DATA" desc="Subtitle of the idle timeout policy dialog explaining when the idle action usually happens.">
+          {THRESHOLD, plural,
+          =1 {This happens when Chrome isn't used for {THRESHOLD} minute}
+          other {This happens when Chrome isn't used for {THRESHOLD} minutes}}
+      </message>
+      <message name="IDS_IOS_IDLE_TIMEOUT_SUBTITLE_WITH_CLEAR_DATA" desc="Subtitle of the idle timeout policy dialog explaining when the idle action usually happens.">
+          {THRESHOLD, plural,
+            =1 {This happens when Chrome isn't used for {THRESHOLD} minute. This could include history and autofill.}
+            other {This happens when Chrome isn't used for {THRESHOLD} minutes. This could include history and autofill.}}
+      </message>
+      <message name="IDS_IOS_IDLE_TIMEOUT_SUBTITLE_WITH_CLEAR_DATA_ON_SIGNOUT" desc="Subtitle of the idle timeout policy dialog explaining when the idle action usually happens. It also informs the user that data will be cleared when they are signed out.">
+          {THRESHOLD, plural,
+            =1 {This happens when Chrome isn't used for {THRESHOLD} minute. Data saved only to this device while you were signed in will be deleted. This could include history and passwords.}
+            other {This happens when Chrome isn't used for {THRESHOLD} minutes. Data saved only to this device while you were signed in will be deleted. This could include history and passwords.}}
+      </message>
       <message name="IDS_IOS_INCOGNITO_INTERSTITIAL_OPEN_IN_CHROME" desc="Button to open a link from an external app in a regular tab rather than in Incognito mode. [iOS only]">
         Open in Chrome
       </message>
@@ -593,15 +620,15 @@
       <message name="IDS_IOS_MAGIC_STACK_TIP_LENS_TRANSLATE_TITLE" desc="The title of the use Lens for translation tip for the Magic Stack.">
         Translate with Google Lens
       </message>
+      <message name="IDS_IOS_MAGIC_STACK_TIP_SAFE_BROWSING_TITLE" desc="The title of the Safe Browsing tip for the Magic Stack.">
+        Get Chrome's Strongest Security
+      </message>
       <message name="IDS_IOS_MAGIC_STACK_TIP_SAVE_PASSWORDS_TUTORIAL_STEP_2" desc="The second step of the Save Passwords tutorial for the Magic Stack.">
         Chrome will offer to save your password.
       </message>
       <message name="IDS_IOS_MAGIC_STACK_TIP_SAVE_PASSWORD_TITLE" desc="The title of the Save Password tip for the Magic Stack.">
         Save Your Passwords in Chrome
       </message>
-      <message name="IDS_IOS_MAGIC_STACK_TIP_SAFE_BROWSING_TITLE" desc="The title of the Safe Browsing tip for the Magic Stack.">
-        Get Chrome's Strongest Security
-      </message>
       <message name="IDS_IOS_MAGIC_STACK_TIP_SET_UP_COMPLETION_DESCRIPTION" desc="The description of the Set Up List completion for the Magic Stack.">
         Check back here for more useful tips to get the most out of Chrome.
       </message>
@@ -679,18 +706,18 @@
       <message name="IDS_IOS_NOTIFICATIONS_TIPS_SETUPLIST_CONTINUATION_TITLE" desc="Text for the title of a Tips notification that encourages the user to complete the Set Up List">
         Finish setting up Chrome
       </message>
-      <message name="IDS_IOS_NOTIFICATIONS_TIPS_SIGNIN_TITLE" desc="Text for the title of a Tips notification that encourages the user to sign in to their account">
-        Chrome Tip: Sign in to Chrome
-      </message>
       <message name="IDS_IOS_NOTIFICATIONS_TIPS_SIGNIN_BODY" desc="Text for the body of a Tips notification that encourages the user to sign in to their account">
         Sign in with your Google Account to sync your passwords, bookmarks, and more.
       </message>
-      <message name="IDS_IOS_NOTIFICATIONS_TIPS_WHATS_NEW_TITLE" desc="Text for the title of a Tips notification that takes the user to the Whats New page">
-        What's New in Chrome
+      <message name="IDS_IOS_NOTIFICATIONS_TIPS_SIGNIN_TITLE" desc="Text for the title of a Tips notification that encourages the user to sign in to their account">
+        Chrome Tip: Sign in to Chrome
       </message>
       <message name="IDS_IOS_NOTIFICATIONS_TIPS_WHATS_NEW_BODY" desc="Text for the body of a Tips notification that takes the user to the Whats New page">
         Explore new features that help you get the most out of Chrome.
       </message>
+      <message name="IDS_IOS_NOTIFICATIONS_TIPS_WHATS_NEW_TITLE" desc="Text for the title of a Tips notification that takes the user to the Whats New page">
+        What's New in Chrome
+      </message>
       <message name="IDS_IOS_OVERFLOW_MENU_SHARE_CHROME" desc="The iOS menu item for opening a share sheet with the URL to the Chrome app in the iOS app store" meaning="[iOS only] [Length: Unlimited]">
         Share Chrome
       </message>
@@ -829,16 +856,16 @@
       <message name="IDS_IOS_SAFE_BROWSING_ENHANCED_PROTECTION_FOOTER" desc="Footer for Safe Browsing enhanced protection mode.">
         Learn more about <ph name="BEGIN_LINK">BEGIN_LINK</ph>how Chrome keeps your data private<ph name="END_LINK">END_LINK</ph>
       </message>
+      <message name="IDS_IOS_SAFE_BROWSING_ENHANCED_PROTECTION_INFOBAR_DESCRIPTION" desc="The Enhanced Safe Browsing infobar promo's description.">Chrome recommends enhanced protection</message>
+      <message name="IDS_IOS_SAFE_BROWSING_ENHANCED_PROTECTION_INLINE_PROMO_DESCRIPTION" desc="The Enhanced Safe Browsing inline promo's description.">
+          Get Chrome's strongest security from dangerous sites
+      </message>
       <message name="IDS_IOS_SAFE_BROWSING_STANDARD_PROTECTION_BULLET_TWO" desc="Second bullet point under the Safe Browsing standard protection mode.">
         Checks URLs with a list of unsafe sites stored in Chrome. If a site tries to steal your password, or when you download a harmful file, Chrome may also send URLs, including bits of page content, to Safe Browsing.
       </message>
       <message name="IDS_IOS_SAFE_BROWSING_STANDARD_PROTECTION_BULLET_TWO_PROXY" desc="Second bullet point under the Safe Browsing standard protection mode.">
         Sends an obfuscated portion of the URL to Google through a privacy server that hides your IP address. If a site tries to steal your password, or when you download a harmful file, Chrome may also send URLs, including bits of page content, to Google.
       </message>
-      <message name="IDS_IOS_SAFE_BROWSING_ENHANCED_PROTECTION_INFOBAR_DESCRIPTION" desc="The Enhanced Safe Browsing infobar promo's description.">Chrome recommends enhanced protection</message>
-      <message name="IDS_IOS_SAFE_BROWSING_ENHANCED_PROTECTION_INLINE_PROMO_DESCRIPTION" desc="The Enhanced Safe Browsing inline promo's description.">
-          Get Chrome's strongest security from dangerous sites
-      </message>
       <message name="IDS_IOS_SAFE_BROWSING_STANDARD_PROTECTION_LEAK_CHECK_FRIENDLIER_SUMMARY" desc="Friendlier summary for the switch toggling whether Chrome should check that entered credentials have been part of a leak.">
         When you use a password, Chrome warns you if it has been published online. When doing this, your passwords and usernames are encrypted, so they can’t be read by anyone, including Google.
       </message>
@@ -1133,33 +1160,6 @@
       <message name="IDS_SEND_TAB_TO_SELF_SIGN_IN_PROMO_LABEL" desc="Text when a signed out user attempts to use send-tab-to-self, then sees a sign-in promo.">
         To send this tab to another device, sign in to Chrome on both devices.
       </message>
-      <message name="IDS_IOS_IDLE_TIMEOUT_SUBTITLE_WITHOUT_CLEAR_DATA" desc="Subtitle of the idle timeout policy dialog explaining when the idle action usually happens.">
-          {THRESHOLD, plural,
-          =1 {This happens when Chrome isn't used for {THRESHOLD} minute}
-          other {This happens when Chrome isn't used for {THRESHOLD} minutes}}
-      </message>
-      <message name="IDS_IOS_IDLE_TIMEOUT_SUBTITLE_WITH_CLEAR_DATA" desc="Subtitle of the idle timeout policy dialog explaining when the idle action usually happens.">
-          {THRESHOLD, plural,
-            =1 {This happens when Chrome isn't used for {THRESHOLD} minute. This could include history and autofill.}
-            other {This happens when Chrome isn't used for {THRESHOLD} minutes. This could include history and autofill.}}
-      </message>
-      <message name="IDS_IOS_IDLE_TIMEOUT_SUBTITLE_WITH_CLEAR_DATA_ON_SIGNOUT" desc="Subtitle of the idle timeout policy dialog explaining when the idle action usually happens. It also informs the user that data will be cleared when they are signed out.">
-          {THRESHOLD, plural,
-            =1 {This happens when Chrome isn't used for {THRESHOLD} minute. Data saved only to this device while you were signed in will be deleted. This could include history and passwords.}
-            other {This happens when Chrome isn't used for {THRESHOLD} minutes. Data saved only to this device while you were signed in will be deleted. This could include history and passwords.}}
-      </message>
-      <message name="IDS_IOS_IDLE_TIMEOUT_CONTINUE_USING_CHROME" desc="Button label to indicate browser activity and stop the browser from running idle timeout actions.">
-         Continue using Chrome
-      </message>
-      <message name="IDS_IOS_EXPANDED_MANUAL_FILL_VIEW_ACCESSIBILITY_ANNOUNCEMENT" desc="Accessibility announcement read by VoiceOver when the expanded manual fill view is shown.">
-         Chrome Autofill expanded view
-      </message>
-      <message name="IDS_IOS_CONTEXTUAL_PANEL_BRANDING_TITLE" desc="Branded title on the Contextual Panel screen. The string is lowercase on purpose.">
-        chrome
-      </message>
-      <message name="IDS_IOS_CONTEXTUAL_PANEL_BRANDING_ACCESSIBILITY_LABEL" desc="Accessibility text for the title of the Contextual Panel screen.">
-        From Chrome
-      </message>
-    </messages>
+      </messages>
   </release>
-</grit>
+</grit>
\ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings.grd b/ios/chrome/app/strings/ios_strings.grd
index bd38221..a6a2d018 100644
--- a/ios/chrome/app/strings/ios_strings.grd
+++ b/ios/chrome/app/strings/ios_strings.grd
@@ -1,3 +1,4 @@
+<?xml version='1.0' encoding='UTF-8'?>
 <grit base_dir="." latest_public_release="0" current_release="1" output_all_resource_defines="false" source_lang_id="en" enc_check="möl">
   <!--
   This file contains definition of resources that will be translated for each
@@ -140,39 +141,6 @@
   </translations>
   <release seq="1">
     <messages fallback_to_english="true">
-      <message name="IDS_IOS_AI_PROTOTYPING_HEADER" translateable="false" desc="Header for AI prototyping menu [Length: unlimited].">
-        AI Prototyping
-      </message>
-      <message name="IDS_IOS_AI_PROTOTYPING_ON_DEVICE_SUBMIT" translateable="false" desc="On device submit button text for AI prototyping menu [Length: unlimited].">
-        On Device Submit
-      </message>
-      <message name="IDS_IOS_AI_PROTOTYPING_NAME_PLACEHOLDER" translateable="false" desc="Name placeholder text for AI prototyping menu [Length: unlimited].">
-        Insert your name... (Optional)
-      </message>
-      <message name="IDS_IOS_AI_PROTOTYPING_QUERY_PLACEHOLDER" translateable="false" desc="Query placeholder text for AI prototyping menu [Length: unlimited].">
-        Insert your query...
-      </message>
-      <message name="IDS_IOS_AI_PROTOTYPING_SERVER_SIDE_SUBMIT" translateable="false" desc="Server side submit button text for AI prototyping menu [Length: unlimited].">
-        Server Side Submit
-      </message>
-      <message name="IDS_IOS_AI_PROTOTYPING_TAB_ORGANIZATION_GROUP_TABS_BUTTON" translateable="false" desc="The label for the button that executes the Tab Organization query [Length: unlimited].">
-        Group tabs
-      </message>
-      <message name="IDS_IOS_AI_PROTOTYPING_TAB_ORGANIZATION_GROUPING_STRATEGY_DOMAIN" translateable="false" desc="Label for the Domain Based grouping strategy of Tab Organization [Length: unlimited].">
-        Domain based
-      </message>
-      <message name="IDS_IOS_AI_PROTOTYPING_TAB_ORGANIZATION_GROUPING_STRATEGY_LABEL" translateable="false" desc="Label for the grouping strategy section of Tab Organization [Length: unlimited].">
-        Grouping strategy
-      </message>
-      <message name="IDS_IOS_AI_PROTOTYPING_TAB_ORGANIZATION_GROUPING_STRATEGY_TASK" translateable="false" desc="Label for the Task Based grouping strategy of Tab Organization [Length: unlimited].">
-        Task based
-      </message>
-      <message name="IDS_IOS_AI_PROTOTYPING_TAB_ORGANIZATION_GROUPING_STRATEGY_TOPIC" translateable="false" desc="Label for the Topic Based grouping strategy of Tab Organization [Length: unlimited].">
-        Topic based
-      </message>
-      <message name="IDS_IOS_AI_PROTOTYPING_TAB_ORGANIZATION_HEADER" translateable="false" desc="Header for AI prototyping menu's tab organization page [Length: unlimited].">
-        Tab Organization
-      </message>
       <message name="IDS_IOS_ACCNAME_CLEAR_TEXT" desc="The accessibility label for the clear text button in the location bar [Length: unlimited].">
         Clear text
       </message>
@@ -209,12 +177,12 @@
       <message name="IDS_IOS_ACCOUNT_MENU_EDIT_ACCOUNT_LIST" desc="In account menu, context menu entry. It opens the view to edit the list of accounts. [iOS only]">
         Manage accounts on this device
       </message>
-      <message name="IDS_IOS_ACCOUNT_PICKER_SUBMIT_TAPPED_ACCESSIBILITY_LABEL" desc="Accessibility label of the Submit button after it is tapped, during which a spinner replaces the button text. This is spoken by VoiceOver. [iOS only]" meaning="Accessibility label of the Submit button after it is tapped, during which a spinner replaces the button text. This is spoken by VoiceOver. [iOS only]">
-        Action in progress…
-      </message>
       <message name="IDS_IOS_ACCOUNT_MENU_SWITCH_CONFIRMATION_TITLE" desc="The snackbar message title to confirm the signed-in account after a successful account switch. [iOS only]">
         Signed in as <ph name="USER">$1<ex>Jane Doe</ex></ph>
       </message>
+      <message name="IDS_IOS_ACCOUNT_PICKER_SUBMIT_TAPPED_ACCESSIBILITY_LABEL" desc="Accessibility label of the Submit button after it is tapped, during which a spinner replaces the button text. This is spoken by VoiceOver. [iOS only]" meaning="Accessibility label of the Submit button after it is tapped, during which a spinner replaces the button text. This is spoken by VoiceOver. [iOS only]">
+        Action in progress…
+      </message>
       <message name="IDS_IOS_ACCOUNT_TABLE_ENTER_PASSPHRASE_MESSAGE" desc="The error message to show in the account table when there is a passphrase error. [iOS only]">
         Sync is not working. To start sync enter your passphrase.
       </message>
@@ -296,6 +264,39 @@
       <message name="IDS_IOS_ADVANCED_SIGNIN_SETTINGS_CANCEL_SYNC_ALERT_MESSAGE" desc="Alert title to ask if the user really wants to cancel sign-in and sync.">
         Cancel sync? You can turn on sync anytime in settings.
       </message>
+      <message name="IDS_IOS_AI_PROTOTYPING_HEADER" translateable="false" desc="Header for AI prototyping menu [Length: unlimited].">
+        AI Prototyping
+      </message>
+      <message name="IDS_IOS_AI_PROTOTYPING_NAME_PLACEHOLDER" translateable="false" desc="Name placeholder text for AI prototyping menu [Length: unlimited].">
+        Insert your name... (Optional)
+      </message>
+      <message name="IDS_IOS_AI_PROTOTYPING_ON_DEVICE_SUBMIT" translateable="false" desc="On device submit button text for AI prototyping menu [Length: unlimited].">
+        On Device Submit
+      </message>
+      <message name="IDS_IOS_AI_PROTOTYPING_QUERY_PLACEHOLDER" translateable="false" desc="Query placeholder text for AI prototyping menu [Length: unlimited].">
+        Insert your query...
+      </message>
+      <message name="IDS_IOS_AI_PROTOTYPING_SERVER_SIDE_SUBMIT" translateable="false" desc="Server side submit button text for AI prototyping menu [Length: unlimited].">
+        Server Side Submit
+      </message>
+      <message name="IDS_IOS_AI_PROTOTYPING_TAB_ORGANIZATION_GROUPING_STRATEGY_DOMAIN" translateable="false" desc="Label for the Domain Based grouping strategy of Tab Organization [Length: unlimited].">
+        Domain based
+      </message>
+      <message name="IDS_IOS_AI_PROTOTYPING_TAB_ORGANIZATION_GROUPING_STRATEGY_LABEL" translateable="false" desc="Label for the grouping strategy section of Tab Organization [Length: unlimited].">
+        Grouping strategy
+      </message>
+      <message name="IDS_IOS_AI_PROTOTYPING_TAB_ORGANIZATION_GROUPING_STRATEGY_TASK" translateable="false" desc="Label for the Task Based grouping strategy of Tab Organization [Length: unlimited].">
+        Task based
+      </message>
+      <message name="IDS_IOS_AI_PROTOTYPING_TAB_ORGANIZATION_GROUPING_STRATEGY_TOPIC" translateable="false" desc="Label for the Topic Based grouping strategy of Tab Organization [Length: unlimited].">
+        Topic based
+      </message>
+      <message name="IDS_IOS_AI_PROTOTYPING_TAB_ORGANIZATION_GROUP_TABS_BUTTON" translateable="false" desc="The label for the button that executes the Tab Organization query [Length: unlimited].">
+        Group tabs
+      </message>
+      <message name="IDS_IOS_AI_PROTOTYPING_TAB_ORGANIZATION_HEADER" translateable="false" desc="Header for AI prototyping menu's tab organization page [Length: unlimited].">
+        Tab Organization
+      </message>
       <message name="IDS_IOS_ALLOW_AUTOMATIC_PASSKEY_UPGRADES" desc="Title for the switch item in password manager settings that can be toggled allowing users to automatically upgrade their passwords to passkeys. Refer to Glossary for the meaning of 'passkey', do not translate it as 'password'. [iOS only]">
         Allow automatic passkey upgrades
       </message>
@@ -326,6 +327,9 @@
           =1 {{domain} and 1 other}
           other {{domain} and {count} others}}
       </message>
+      <message name="IDS_IOS_AUTOFILL_ACCNAME_AUTOFILL_DATA" desc="The accessible name for the button in the keyboard accessory shown when filling out forms used to open the expanded view to see all autofill data. This is spoken by VoiceOver. [Length: unlimited] [iOS only]">
+        See all autofill data
+      </message>
       <message name="IDS_IOS_AUTOFILL_ACCNAME_HIDE_KEYBOARD" desc="The accessible name for the hide keyboard button in the keyboard accessory shown when filling out forms. [Length: unlimited] [iOS only]">
         Hide keyboard
       </message>
@@ -335,33 +339,18 @@
       <message name="IDS_IOS_AUTOFILL_ACCNAME_PREVIOUS_FIELD" desc="The accessible name for the previous field button in the keyboard accessory shown when filling out forms. [Length: unlimited] [iOS only]">
         Previous field
       </message>
-      <message name="IDS_IOS_AUTOFILL_ACCNAME_AUTOFILL_DATA" desc="The accessible name for the button in the keyboard accessory shown when filling out forms used to open the expanded view to see all autofill data. This is spoken by VoiceOver. [Length: unlimited] [iOS only]">
-        See all autofill data
-      </message>
-      <message name="IDS_IOS_AUTOFILL_PASSWORD_AUTOFILL_DATA" desc="The accessible name for the button in the keyboard accessory shown when filling out forms used to open the expanded view to see password autofill data. This is spoken by VoiceOver. [Length: unlimited] [iOS only]">
-        Passwords
-      </message>
-      <message name="IDS_IOS_AUTOFILL_CREDIT_CARD_AUTOFILL_DATA" desc="The accessible name for the button in the keyboard accessory shown when filling out forms used to open the expanded view to see credit card autofill data. This is spoken by VoiceOver. [Length: unlimited] [iOS only]">
-        Payment methods
-      </message>
-      <message name="IDS_IOS_AUTOFILL_PASSWORD_NO_USERNAME" desc="Text shown for a password suggestion in the keyboard accessory when the user did not save a username along with the password.">
-        No Username ••••••
-      </message>
-      <message name="IDS_IOS_AUTOFILL_ADDRESS_AUTOFILL_DATA" desc="The accessible name for the button in the keyboard accessory shown when filling out forms used to open the expanded view to see address autofill data. This is spoken by VoiceOver. [Length: unlimited] [iOS only]">
-        Addresses and more
-      </message>
       <message name="IDS_IOS_AUTOFILL_ACCNAME_SUGGESTION" desc="The accessible description of a suggestion shown in the Autofill keyboard acessory. [Length: unlimited] [iOS only]">
         <ph name="VALUE">$1<ex>John Smith</ex></ph>, <ph name="ADDITIONAL_INFO">$2<ex>1234 Main St., Springfield, IL 62711</ex></ph>
       </message>
-      <message name="IDS_IOS_AUTOFILL_SUGGESTION_INDEX_VALUE" desc="The accessibility value of a suggestion shown in the Autofill keyboard acessory to indicate the position of the focused suggestion in the list of suggestions. [Length: unlimited] [iOS only]">
-        <ph name="INDEX">$1<ex>1</ex></ph> of <ph name="NUM_SUGGESTIONS">$2<ex>5</ex></ph>
-      </message>
       <message name="IDS_IOS_AUTOFILL_ADDRESS1" desc="Title of the field of a profile address representing the first line of the address. [Length: 15em] [iOS only]">
         Address 1
       </message>
       <message name="IDS_IOS_AUTOFILL_ADDRESS2" desc="Title of the field of a profile address representing the second line of the address. [Length: 15em] [iOS only]">
         Address 2
       </message>
+      <message name="IDS_IOS_AUTOFILL_ADDRESS_AUTOFILL_DATA" desc="The accessible name for the button in the keyboard accessory shown when filling out forms used to open the expanded view to see address autofill data. This is spoken by VoiceOver. [Length: unlimited] [iOS only]">
+        Addresses and more
+      </message>
       <message name="IDS_IOS_AUTOFILL_ADDRESS_OPTIONS_AVAILABLE_ACCESSIBILITY_ANNOUNCEMENT" is_accessibility_with_no_ui="true" desc="The accessibility announcement to indicate the number of options available to the user above the keyboard in relation to addresses. This announcement is triggered when the user enters edit mode in an address-related form field and has options available in the keyboard accessory for autofill purposes. According to the number of available options, the string goes from singular to plural. [iOS only]">
         {count, plural,
            =1 {{count} option for address available above your keyboard.}
@@ -393,6 +382,9 @@
       <message name="IDS_IOS_AUTOFILL_COUNTRY" desc="Title of the field of a profile address representing the country/nation of the address. [Length: 15em] [iOS only]">
         Country
       </message>
+      <message name="IDS_IOS_AUTOFILL_CREDIT_CARD_AUTOFILL_DATA" desc="The accessible name for the button in the keyboard accessory shown when filling out forms used to open the expanded view to see credit card autofill data. This is spoken by VoiceOver. [Length: unlimited] [iOS only]">
+        Payment methods
+      </message>
       <message name="IDS_IOS_AUTOFILL_DEPENDENT_LOCALITY" desc="Title of the field of a profile address representing the neighborhood. A dependent locality is a subunit of a locality, where a 'locality' is roughly equivalent to a city. Examples of dependent localities include inner-city districts and suburbs. Only used in certain countries, like Brazil and Mexico, for example. [Length: 15em] [iOS only]">
         Neighborhood
       </message>
@@ -438,6 +430,12 @@
       <message name="IDS_IOS_AUTOFILL_NICKNAME" desc="Title of the field representing the user defined nickname of a credit card. [Length: 15em] [iOS only]">
         Card nickname
       </message>
+      <message name="IDS_IOS_AUTOFILL_PASSWORD_AUTOFILL_DATA" desc="The accessible name for the button in the keyboard accessory shown when filling out forms used to open the expanded view to see password autofill data. This is spoken by VoiceOver. [Length: unlimited] [iOS only]">
+        Passwords
+      </message>
+      <message name="IDS_IOS_AUTOFILL_PASSWORD_NO_USERNAME" desc="Text shown for a password suggestion in the keyboard accessory when the user did not save a username along with the password.">
+        No Username ••••••
+      </message>
       <message name="IDS_IOS_AUTOFILL_PASSWORD_OPTIONS_AVAILABLE_ACCESSIBILITY_ANNOUNCEMENT" is_accessibility_with_no_ui="true" desc="The accessibility announcement to indicate the number of options available to the user above the keyboard in relation to passwords. This announcement is triggered when the user enters edit mode in a password-related form field and has options available in the keyboard accessory for autofill purposes. According to the number of available options, the string goes from singular to plural. [iOS only]">
         {count, plural,
            =1 {{count} option for password available above your keyboard.}
@@ -475,6 +473,9 @@
       <message name="IDS_IOS_AUTOFILL_STATE" desc="Title of the field of a profile address representing the state/county/district/oblast of the address. [Length: 15em] [iOS only]">
         State / County
       </message>
+      <message name="IDS_IOS_AUTOFILL_SUGGESTION_INDEX_VALUE" desc="The accessibility value of a suggestion shown in the Autofill keyboard acessory to indicate the position of the focused suggestion in the list of suggestions. [Length: unlimited] [iOS only]">
+        <ph name="INDEX">$1<ex>1</ex></ph> of <ph name="NUM_SUGGESTIONS">$2<ex>5</ex></ph>
+      </message>
       <message name="IDS_IOS_AUTOFILL_WALLET_SERVER_NAME" desc="The name of the data source for non-local card and address info. Title case. 'Google Pay' should not be translated as it is the product name. [Length: 15em] [iOS only]">
         Google Pay
       </message>
@@ -513,11 +514,6 @@
           =1 {Bookmark saved}
           other {{count} bookmarks saved}}
       </message>
-      <message name="IDS_IOS_BOOKMARKS_SAVED" desc="This confirmation message is intended to help users understand that multiple bookmarks have been saved. The confirmation message appears at the bottom of the page after users bulk add bookmarks, telling them how many bookmarks they've added. The tone should be informative.">
-          {count, plural,
-          =1 {Bookmark saved}
-          other {Bookmarks saved}}
-      </message>
       <message name="IDS_IOS_BOOKMARKS_BULK_SAVED_ACCOUNT" desc="This confirmation message is intended to help users understand that multiple bookmarks have been saved in their account. The confirmation message appears at the bottom of the page after users bulk add bookmarks, telling them how many bookmarks they've added into their account. The tone should be informative.">
           {count, plural,
           =1 {Bookmark saved in your Google Account, {email}}
@@ -558,6 +554,11 @@
       <message name="IDS_IOS_BOOKMARKS_PROFILE_SECTION_TITLE" desc="This string appears on a page of saved bookmarks. It is the heading for a category. The categories indicate where a bookmark is saved: in this string, the bookmarks are saved locally on the user's device. This is a shortened version of the noun phrase: 'Bookmarks that are only on your device'. If your language permits it, you can omit 'Bookmarks' because it is already at the top of the page. [Length: 40em.] [iOS only]" meaning="Bookmarks that are only on your device">
         Only on this device
       </message>
+      <message name="IDS_IOS_BOOKMARKS_SAVED" desc="This confirmation message is intended to help users understand that multiple bookmarks have been saved. The confirmation message appears at the bottom of the page after users bulk add bookmarks, telling them how many bookmarks they've added. The tone should be informative.">
+          {count, plural,
+          =1 {Bookmark saved}
+          other {Bookmarks saved}}
+      </message>
       <message name="IDS_IOS_BOOKMARK_ACTION_DELETE" desc="Title of the action that deletes a bookmark in the bookmark action sheet. [Length: 30em.] [iOS only]">
         Delete
       </message>
@@ -689,46 +690,46 @@
       <message name="IDS_IOS_BOOKMARK_NEW_ZERO_ITEM_LABEL" desc="Text that indicates that a user has selected zero bookmarks for editing. [Length: 30em.]">
         0 selected
       </message>
-      <message name="IDS_IOS_BOOKMARK_PAGE_SAVED_FOLDER" desc="This confirmation message is intended to help users understand that a bookmark has been saved in Chrome. These users are not signed in to a Google Account and are not syncing their data, so we do not specify where the bookmark is saved. The confirmation message appears at the bottom of the page after users choose to bookmark a page. The tone should be informative.">
-          {count, plural,
-          =1 {Bookmark saved to "{title}"}
-          other {Bookmarks saved to "{title}"}}
-      </message>
       <message name="IDS_IOS_BOOKMARK_PAGE_BULK_SAVED_FOLDER" desc="This confirmation message is intended to help users understand that a bookmark has been saved in Chrome. These users are not signed in to a Google Account and are not syncing their data, so we do not specify where the bookmark is saved. The confirmation message appears at the bottom of the page after users choose to bookmark a page. The tone should be informative.">
           {count, plural,
           =1 {Bookmark saved to "{title}"}
           other {{count} bookmarks saved to "{title}"}}
       </message>
-      <message name="IDS_IOS_BOOKMARK_PAGE_SAVED_FOLDER_TO_DEVICE" desc="This confirmation message is intended to help users understand that a bookmark has been saved in Chrome. These users are not signed in to a Google Account and are not syncing their data, so we do not specify where the bookmark is saved. The confirmation message appears at the bottom of the page after users choose to bookmark a page. The tone should be informative.">
-          {count, plural,
-          =1 {Bookmark saved to "{title}". It is saved only to this device.}
-          other {Bookmarks saved to "{title}". They are only saved to this device.}}
-      </message>
       <message name="IDS_IOS_BOOKMARK_PAGE_BULK_SAVED_FOLDER_TO_DEVICE" desc="This confirmation message is intended to help users understand that a bookmark has been saved in Chrome. These users are not signed in to a Google Account and are not syncing their data, so we do not specify where the bookmark is saved. The confirmation message appears at the bottom of the page after users choose to bookmark a page. The tone should be informative.">
           {count, plural,
           =1 {Bookmark saved to "{title}". It is saved only to this device.}
           other {{count} bookmarks saved to "{title}". They are saved only to this device.}}
       </message>
-      <message name="IDS_IOS_BOOKMARK_PAGE_SAVED_INTO_ACCOUNT" desc="This confirmation message is intended to help users understand that a bookmark has been saved in their Google Account. The confirmation message appears at the bottom of the page after users choose to bookmark a page. The tone should be informative.">
-          {count, plural,
-          =1 {Bookmark saved in your Google Account, {email}}
-          other {Bookmarks saved in your Google Account, {email}}}
-      </message>
       <message name="IDS_IOS_BOOKMARK_PAGE_BULK_SAVED_INTO_ACCOUNT" desc="This confirmation message is intended to help users understand that a bookmark has been saved in their Google Account. The confirmation message appears at the bottom of the page after users choose to bookmark a page. The tone should be informative.">
           {count, plural,
           =1 {Bookmark saved in your Google Account, {email}}
           other {{count} bookmarks saved in your Google Account, {email}}}
       </message>
-      <message name="IDS_IOS_BOOKMARK_PAGE_SAVED_INTO_ACCOUNT_FOLDER" desc="This confirmation message is intended to help users understand that a bookmark has been saved to a particular folder in their Google Account. The confirmation message appears at the bottom of the page after users choose to bookmark a page. The tone should be informative.">
-         {count, plural,
-         =1 {Bookmark saved to "{title}" in your account, {email}}
-         other {Bookmarks saved to "{title}" in your account, {email}}}
-      </message>
       <message name="IDS_IOS_BOOKMARK_PAGE_BULK_SAVED_INTO_ACCOUNT_FOLDER" desc="This confirmation message is intended to help users understand that a bookmark has been saved to a particular folder in their Google Account. The confirmation message appears at the bottom of the page after users choose to bookmark a page. The tone should be informative.">
          {count, plural,
          =1 {Bookmark saved to "{title}" in your account, {email}}
          other {{count} bookmarks saved to "{title}" in your account, {email}}}
       </message>
+      <message name="IDS_IOS_BOOKMARK_PAGE_SAVED_FOLDER" desc="This confirmation message is intended to help users understand that a bookmark has been saved in Chrome. These users are not signed in to a Google Account and are not syncing their data, so we do not specify where the bookmark is saved. The confirmation message appears at the bottom of the page after users choose to bookmark a page. The tone should be informative.">
+          {count, plural,
+          =1 {Bookmark saved to "{title}"}
+          other {Bookmarks saved to "{title}"}}
+      </message>
+      <message name="IDS_IOS_BOOKMARK_PAGE_SAVED_FOLDER_TO_DEVICE" desc="This confirmation message is intended to help users understand that a bookmark has been saved in Chrome. These users are not signed in to a Google Account and are not syncing their data, so we do not specify where the bookmark is saved. The confirmation message appears at the bottom of the page after users choose to bookmark a page. The tone should be informative.">
+          {count, plural,
+          =1 {Bookmark saved to "{title}". It is saved only to this device.}
+          other {Bookmarks saved to "{title}". They are only saved to this device.}}
+      </message>
+      <message name="IDS_IOS_BOOKMARK_PAGE_SAVED_INTO_ACCOUNT" desc="This confirmation message is intended to help users understand that a bookmark has been saved in their Google Account. The confirmation message appears at the bottom of the page after users choose to bookmark a page. The tone should be informative.">
+          {count, plural,
+          =1 {Bookmark saved in your Google Account, {email}}
+          other {Bookmarks saved in your Google Account, {email}}}
+      </message>
+      <message name="IDS_IOS_BOOKMARK_PAGE_SAVED_INTO_ACCOUNT_FOLDER" desc="This confirmation message is intended to help users understand that a bookmark has been saved to a particular folder in their Google Account. The confirmation message appears at the bottom of the page after users choose to bookmark a page. The tone should be informative.">
+         {count, plural,
+         =1 {Bookmark saved to "{title}" in your account, {email}}
+         other {Bookmarks saved to "{title}" in your account, {email}}}
+      </message>
       <message name="IDS_IOS_BOOKMARK_SNACKBAR_EDIT_BOOKMARK" desc="This string is found on a button that takes the user to the Edit Bookmark screen when the user taps it. The button is on a confirmation message that users see when they save a bookmark to their device or in their Google Account. This text is a verb and is short for the longer phrase 'edit the bookmark.' The tone should be informative. [CHAR_LIMIT=15]">
         Edit
       </message>
@@ -818,6 +819,12 @@
           =1 {Item saved in your Google Account, {email}}
           other {Items saved in your Google Account, {email}}}
       </message>
+      <message name="IDS_IOS_CALL_OMNIBOX_ACTION" desc="Call suggestion action button [iOS only]">
+        Call
+      </message>
+      <message name="IDS_IOS_CALL_OMNIBOX_ACTION_ACCESSIBILITY_LABEL" desc="The accessibility label for the Call suggestion action button [iOS only]">
+        Connect with a business by initiating a phone call
+      </message>
       <message name="IDS_IOS_CAMERA_USAGE_DESCRIPTION" desc="Specifies the reason for accessing the user's camera while the app is in use [Length: unlimited] [iOS only].">
         This lets you take and upload photos, as well as scan QR codes
       </message>
@@ -833,12 +840,6 @@
       <message name="IDS_IOS_CANCEL_PASSWORD_MOVE" desc="Cancel button inside the password conflict action sheet when the user is trying to move a password to their google account store [iOS only]">
         Cancel
       </message>
-      <message name="IDS_IOS_CALL_OMNIBOX_ACTION" desc="Call suggestion action button [iOS only]">
-        Call
-      </message>
-      <message name="IDS_IOS_CALL_OMNIBOX_ACTION_ACCESSIBILITY_LABEL" desc="The accessibility label for the Call suggestion action button [iOS only]">
-        Connect with a business by initiating a phone call
-      </message>
       <message name="IDS_IOS_CARD_STACK_SCROLLED_NOTIFICATION" desc="The accessibility description for page scrolled notification [iOS only]">
         <ph name="INCOGNITO">$1<ex>Incognito</ex></ph> Tabs <ph name="FIRST_VISIBLE_TAB">$2<ex>3</ex></ph> through <ph name="LAST_VISIBLE_TAB">$3<ex>5</ex></ph> of <ph name="NUMBER_OF_OPEN_TABS">$4<ex>12</ex></ph>
       </message>
@@ -899,12 +900,12 @@
       <message name="IDS_IOS_CLEAR_BROWSING_DATA_TIME_RANGE_OPTION_BEGINNING_OF_TIME" desc="Label of a time range option. This is used to specify that the user wishes to clear their browsing data since the beginning of time. In titlecase.">
         All time
       </message>
-      <message name="IDS_IOS_CLEAR_BROWSING_DATA_TIME_RANGE_OPTION_LAST_FOUR_WEEKS" desc="Label of a time range option. This is used to specify that the user wishes to clear their browsing data for the last 4 weeks. In titlecase.">
-        Last 4 weeks
-      </message>
       <message name="IDS_IOS_CLEAR_BROWSING_DATA_TIME_RANGE_OPTION_LAST_15_MINUTES" desc="Label of a time range option. This is used to specify that the user wishes to clear their browsing data for the last 15 minutes. In titlecase.">
         Last 15 minutes
       </message>
+      <message name="IDS_IOS_CLEAR_BROWSING_DATA_TIME_RANGE_OPTION_LAST_FOUR_WEEKS" desc="Label of a time range option. This is used to specify that the user wishes to clear their browsing data for the last 4 weeks. In titlecase.">
+        Last 4 weeks
+      </message>
       <message name="IDS_IOS_CLEAR_BROWSING_DATA_TIME_RANGE_OPTION_OLDER_THAN_30_DAYS" desc="Label of a time range option. This is used to specify that the user wishes to clear their browsing data that is older than 30 days. In titlecase.">
         Older than 30 days
       </message>
@@ -938,9 +939,15 @@
       <message name="IDS_IOS_CLEAR_SAVED_PASSWORDS" desc="Label for the option in settings to clear saved passwords. In titlecase. [Length: 20em] [iOS only]">
         Saved passwords
       </message>
+      <message name="IDS_IOS_CLOSE_ALERT_BUTTON_LABEL" desc="Label of a button which will close the popup message with the full URL in the web context menu. [iOS only]">
+        Close
+      </message>
       <message name="IDS_IOS_CLOSE_TABS" desc="Label for the option in settings to close open tabs. In titlecase. [Length: 20em] [iOS only]">
         Tabs
       </message>
+      <message name="IDS_IOS_COLLAPSED_PRIMARY_TOOLBAR_BUTTON" desc="The accessibility label for the collapsed toolbar button in primary toolbar. [iOS only].">
+        Collapsed primary toolbar button
+      </message>
       <message name="IDS_IOS_COMPROMISED_PASSWORD_ISSUES_DESCRIPTION" desc="Header displayed on the password manager screen displaying credentials that have been leaked or phished [iOS only]">
         Some of your saved passwords were exposed in a non-Google data breach. <ph name="BEGIN_LINK">BEGIN_LINK</ph>Learn more<ph name="END_LINK">END_LINK</ph>
       </message>
@@ -968,12 +975,12 @@
       <message name="IDS_IOS_CONFIRM_CLEAR_BUTTON_TITLE" desc="Title for the UIAlertController indicating browsing data selected will be removed. [Length: 20em] [iOS only]">
         The items you selected will be removed.
       </message>
-      <message name="IDS_IOS_CONFIRM_PASSWORD_DELETION" desc="Label of a confirmation dialogue button which allows the user to confirm deletion of a stored password. [Length: one line] [iOS only]">
-        Delete password
-      </message>
       <message name="IDS_IOS_CONFIRM_PASSKEY_DELETION" desc="Label of a confirmation dialogue button which allows the user to confirm deletion of a stored passkey. [Length: one line] [iOS only]">
         Delete passkey
       </message>
+      <message name="IDS_IOS_CONFIRM_PASSWORD_DELETION" desc="Label of a confirmation dialogue button which allows the user to confirm deletion of a stored password. [Length: one line] [iOS only]">
+        Delete password
+      </message>
       <message name="IDS_IOS_CONFIRM_PASSWORD_EDIT" desc="Confirm button inside confirmation alert when the user is trying to edit password [iOS only]" meaning="Save edited password">
         Save password
       </message>
@@ -1020,6 +1027,9 @@
       <message name="IDS_IOS_CONTENT_CONTEXT_CLOSEALLTABSANDGROUPS" desc="The iOS context menu item for closing all the tabs and the groups in the grid. [iOS only]">
         Close All Tabs and Groups
       </message>
+      <message name="IDS_IOS_CONTENT_CONTEXT_CLOSEGROUP" desc="The iOS context menu item for closing a tab group. [iOS only]">
+        Close Group
+      </message>
       <message name="IDS_IOS_CONTENT_CONTEXT_CLOSEOTHERTABS" desc="The iOS context menu item for closing all the tabs except the currently selected one.">
         Close Other Tabs
       </message>
@@ -1029,9 +1039,6 @@
       <message name="IDS_IOS_CONTENT_CONTEXT_CLOSETAB" desc="The iOS context menu item for closing a tab. [iOS only]" meaning="Close the current tab.">
         Close Tab
       </message>
-      <message name="IDS_IOS_CONTENT_CONTEXT_CLOSEGROUP" desc="The iOS context menu item for closing a tab group. [iOS only]">
-        Close Group
-      </message>
       <message name="IDS_IOS_CONTENT_CONTEXT_COPY" desc="The iOS menu item for copying a link's URL into the pasteboard. Shorter than the desktop version [iOS only]">
         Copy link URL
       </message>
@@ -1050,18 +1057,6 @@
       <message name="IDS_IOS_CONTENT_CONTEXT_NEWTABINGROUP" desc="The iOS context menu item for adding a new tab in a tab group. [iOS only]">
         New Tab in Group
       </message>
-      <message name="IDS_IOS_CONTENT_CONTEXT_OPENLENSOVERLAY" desc="The iOS menu item for openning lens overlay.">
-        Search screen with Google Lens
-      </message>
-      <message name="IDS_IOS_CONTENT_CONTEXT_SHARELOCALGROUP" desc="The iOS context menu item for sharing a local tab group. [iOS only]">
-        Share Group
-      </message>
-      <message name="IDS_IOS_CONTENT_NOTIFICATION_SNACKBAR_ACTION_MANAGE" desc="Text for the Chrome content notifications confirmation snackbar action.">
-        Manage
-      </message>
-      <message name="IDS_IOS_CONTENT_NOTIFICATION_SNACKBAR_TITLE" desc="Title for the Chrome content notifications confirmation snackbar.">
-        You'll now receive content notifications
-      </message>
       <message name="IDS_IOS_CONTENT_CONTEXT_OPEN" desc="The iOS menu item for opening a link. Shorter than the desktop version [Length: 25em] [iOS only]">
         Open
       </message>
@@ -1074,11 +1069,8 @@
       <message name="IDS_IOS_CONTENT_CONTEXT_OPENINNEWWINDOW" desc="The iOS menu item for opening a link in a new window. [iOS only]">
         Open in New Window
       </message>
-      <message name="IDS_IOS_CONTENT_CONTEXT_OPENLINKNEWINCOGNITOTAB" desc="The iOS menu item for opening a link in a new Incognito tab. Shorter than the desktop version [Length: 25em] [iOS only]">
-        Open in new Incognito tab
-      </message>
-      <message name="IDS_IOS_CONTENT_CONTEXT_OPENLINKNEWTAB" desc="The iOS menu item for opening a link in another tab. Shorter than the desktop version [iOS only]">
-        Open in New Tab
+      <message name="IDS_IOS_CONTENT_CONTEXT_OPENLENSOVERLAY" desc="The iOS menu item for openning lens overlay.">
+        Search screen with Google Lens
       </message>
       <message name="IDS_IOS_CONTENT_CONTEXT_OPENLINKINNEWTABGROUP" desc="The iOS context menu item for opening a link in new tab group. [iOS only]">
         Open in New Tab Group
@@ -1086,6 +1078,15 @@
        <message name="IDS_IOS_CONTENT_CONTEXT_OPENLINKINTABGROUP" desc="The iOS context menu item for opening a link in a tab group. [iOS only]">
         Open in Tab Group
       </message>
+      <message name="IDS_IOS_CONTENT_CONTEXT_OPENLINKNEWINCOGNITOTAB" desc="The iOS menu item for opening a link in a new Incognito tab. Shorter than the desktop version [Length: 25em] [iOS only]">
+        Open in new Incognito tab
+      </message>
+      <message name="IDS_IOS_CONTENT_CONTEXT_OPENLINKNEWTAB" desc="The iOS menu item for opening a link in another tab. Shorter than the desktop version [iOS only]">
+        Open in New Tab
+      </message>
+      <message name="IDS_IOS_CONTENT_CONTEXT_OPENMANAGEINNEWTAB" desc="The iOS menu item for managing a selected item. [iOS only]">
+        Manage
+      </message>
       <message name="IDS_IOS_CONTENT_CONTEXT_OPEN_ALL_LINKS" desc="The iOS menu item for opening a list of links in new tabs. Shorter than the desktop version [iOS only]">
         Open All
       </message>
@@ -1107,6 +1108,9 @@
       <message name="IDS_IOS_CONTENT_CONTEXT_SELECTTABS" desc="The iOS context menu item for entering into the selection mode, where users can select tabs to perform bulk actions on them.[iOS only]">
         Select Tabs
       </message>
+      <message name="IDS_IOS_CONTENT_CONTEXT_SHARELOCALGROUP" desc="The iOS context menu item for sharing a local tab group. [iOS only]">
+        Share Group
+      </message>
       <message name="IDS_IOS_CONTENT_CONTEXT_UNGROUP" desc="The iOS context menu item for ungrouping a tab group. [iOS only]">
         Ungroup
       </message>
@@ -1116,24 +1120,21 @@
       <message name="IDS_IOS_CONTENT_COPYIMAGE_ALERT_COPYING" desc="The title of the alert while the image to be copied is being downloaded.">
         Copying…
       </message>
-      <message name="IDS_IOS_CONTENT_NOTIFICATIONS_PERMISSION_REDIRECT_ALERT_CANCEL" desc="The label for the alert's cancel button">
-        No, thanks
+      <message name="IDS_IOS_CONTENT_NOTIFICATIONS_CONTENT_SETTINGS_FOOTER_TEXT" desc="The label for the notification settings footer for content notifications.">
+        News, sports, and content based on your interests.
       </message>
       <message name="IDS_IOS_CONTENT_NOTIFICATIONS_CONTENT_SETTINGS_TOGGLE_TITLE" desc="The label for the notification settings item title for content notifications.">
         Personalized content
       </message>
-      <message name="IDS_IOS_CONTENT_NOTIFICATIONS_PERSONALIZED_NEWS_SETTINGS_TOGGLE_TITLE" desc="The label for the notification settings item title for sports notifications.">
-        Personalized news
-      </message>
-      <message name="IDS_IOS_CONTENT_NOTIFICATIONS_SPORTS_SETTINGS_TOGGLE_TITLE" desc="The label for the notification settings item title for sports notifications.">
-        Sports
-      </message>
-      <message name="IDS_IOS_CONTENT_NOTIFICATIONS_CONTENT_SETTINGS_FOOTER_TEXT" desc="The label for the notification settings footer for content notifications.">
-        News, sports, and content based on your interests.
+      <message name="IDS_IOS_CONTENT_NOTIFICATIONS_PERMISSION_REDIRECT_ALERT_CANCEL" desc="The label for the alert's cancel button">
+        No, thanks
       </message>
       <message name="IDS_IOS_CONTENT_NOTIFICATIONS_PERMISSION_REDIRECT_ALERT_REDIRECT" desc="The label for the alert's redirect to the iOS Settings.">
         Go to Settings…
       </message>
+      <message name="IDS_IOS_CONTENT_NOTIFICATIONS_PERSONALIZED_NEWS_SETTINGS_TOGGLE_TITLE" desc="The label for the notification settings item title for sports notifications.">
+        Personalized news
+      </message>
       <message name="IDS_IOS_CONTENT_NOTIFICATIONS_PROMO_PRIMARY_BUTTON" desc="Text for the Notifications promo primary button.">
         Yes, I'm in
       </message>
@@ -1143,14 +1144,17 @@
       <message name="IDS_IOS_CONTENT_NOTIFICATIONS_PROMO_TEXT" desc="Text for the Notifications promo.">
         Would you like notifications for news, sports, and more based on your interests?
       </message>
+      <message name="IDS_IOS_CONTENT_NOTIFICATIONS_SEND_FEEDBACK" desc="Send feedback action on long tap for content notifications.">
+        Send feedback
+      </message>
       <message name="IDS_IOS_CONTENT_NOTIFICATIONS_SETTINGS_ALERT_MESSAGE" desc="Text for the Notifications UI Alert Prompt that redirects the user to the iOS push notifications permission page">
         To get updates about content that matters to you, turn on notification in your iOS settings.
       </message>
       <message name="IDS_IOS_CONTENT_NOTIFICATIONS_SETTINGS_ALERT_TITLE" desc="Title for the Notifications UI Alert Prompt that redirects the user to the iOS push notifications permission page">
         Turn on notifications?
       </message>
-      <message name="IDS_IOS_CONTENT_NOTIFICATIONS_SEND_FEEDBACK" desc="Send feedback action on long tap for content notifications.">
-        Send feedback
+      <message name="IDS_IOS_CONTENT_NOTIFICATIONS_SPORTS_SETTINGS_TOGGLE_TITLE" desc="The label for the notification settings item title for sports notifications.">
+        Sports
       </message>
       <message name="IDS_IOS_CONTENT_NOTIFICATION_FULL_PAGE_PROMO_PRIMARY_BUTTON_TEXT" desc="Text for the Notifications promo secondary button.">
           Turn on notifications..
@@ -1167,6 +1171,12 @@
       <message name="IDS_IOS_CONTENT_NOTIFICATION_FULL_PAGE_PROMO_TITLE" desc="Text for the Notifications promo title.">
           Get content that matters to you
       </message>
+      <message name="IDS_IOS_CONTENT_NOTIFICATION_SNACKBAR_ACTION_MANAGE" desc="Text for the Chrome content notifications confirmation snackbar action.">
+        Manage
+      </message>
+      <message name="IDS_IOS_CONTENT_NOTIFICATION_SNACKBAR_TITLE" desc="Title for the Chrome content notifications confirmation snackbar.">
+        You'll now receive content notifications
+      </message>
       <message name="IDS_IOS_CONTENT_SETTINGS_TITLE" desc="Title for content settings dialog [Length: 29em] [iOS only]">
         Content settings
       </message>
@@ -1227,6 +1237,36 @@
       <message name="IDS_IOS_CONTENT_SUGGESTIONS_PARCEL_TRACKING_MODULE_TITLE" desc="The Parcel Tracking module title on the Home surface [Length: 10em]">
         Package tracking
       </message>
+      <message name="IDS_IOS_CONTENT_SUGGESTIONS_PRICE_TRACKING_PROMO_ALLOW" desc="Label indicating user can allow price tracking notifications">
+          Allow price tracking notifications…
+      </message>
+      <message name="IDS_IOS_CONTENT_SUGGESTIONS_PRICE_TRACKING_PROMO_DESCRIPTION" desc="Description for Price Tracking Promotion in Magic Stack">
+          Keep up with price drops on all the products you track.
+      </message>
+      <message name="IDS_IOS_CONTENT_SUGGESTIONS_PRICE_TRACKING_PROMO_HIDE_CARD" desc="Button text indicating price tracking promo module can be removed">
+        Hide "Get Price Tracking Notifications"
+      </message>
+      <message name="IDS_IOS_CONTENT_SUGGESTIONS_PRICE_TRACKING_PROMO_SETTINGS_TURN_ON_NOTIFICATIONS_ACCEPT" desc="Button text indicating the user can accept turning on price tracking notifications in settings">
+          Go to Settings...
+      </message>
+      <message name="IDS_IOS_CONTENT_SUGGESTIONS_PRICE_TRACKING_PROMO_SETTINGS_TURN_ON_NOTIFICATIONS_DENY" desc="Button text indicating the user can deny turning on price tracking notifications in settings">
+          No, Thanks
+      </message>
+      <message name="IDS_IOS_CONTENT_SUGGESTIONS_PRICE_TRACKING_PROMO_SETTINGS_TURN_ON_NOTIFICATIONS_TEXT" desc="Text indicating the user needs to go to settings to turn on notifications (because they have previously turned it off)">
+          To get price tracking notifications, turn on notifications in your iOS Settings.
+      </message>
+      <message name="IDS_IOS_CONTENT_SUGGESTIONS_PRICE_TRACKING_PROMO_SETTINGS_TURN_ON_NOTIFICATIONS_TITLE" desc="Title indicating the user needs to go to settings to turn on notifications (because they have previously turned it off)">
+          Turn on notifications?
+      </message>
+      <message name="IDS_IOS_CONTENT_SUGGESTIONS_PRICE_TRACKING_PROMO_SNACKBAR_MANAGE" desc="Snackbar action enabling management of price tracking notifications">
+          Manage
+      </message>
+      <message name="IDS_IOS_CONTENT_SUGGESTIONS_PRICE_TRACKING_PROMO_SNACKBAR_TITLE" desc="Snackbar title indicating price tracking notifications have been turned on">
+          Price tracking notifications turned on
+      </message>
+      <message name="IDS_IOS_CONTENT_SUGGESTIONS_PRICE_TRACKING_PROMO_TITLE" desc="Title for Price Tracking Promotion in Magic Stack">
+          Get price tracking notifications
+      </message>
       <message name="IDS_IOS_CONTENT_SUGGESTIONS_READING_LIST" desc="The Reading List title on the new tab page [Length: 10em]">
         Reading list
       </message>
@@ -1257,21 +1297,21 @@
       <message name="IDS_IOS_CONTENT_SUGGESTIONS_WHATS_NEW" desc="The What's New title on the new tab page [Length: 10em]">
         What's New
       </message>
-      <message name="IDS_IOS_CONTEXT_MENU_SEARCHIMAGEWITHGOOGLE" desc="Context menu text for option to search an image with Google [Length: 25em] [iOS only]">
+      <message name="IDS_IOS_CONTEXTUAL_PANEL_SAMPLE_MODEL_ENTRYPOINT_IPH_TEXT" desc="The body text for the in-product help bubble of the Contextual Panel's sample model entry point, used for demo purposes">
+        Sample rich in-product help for the Contextual Panel, which should appear multiple times a day.
+      </message>
+      <message name="IDS_IOS_CONTEXTUAL_PANEL_SAMPLE_MODEL_ENTRYPOINT_IPH_TITLE" desc="The title for the in-product help bubble of the Contextual Panel's sample model entry point, used for demo purposes">
+        Sample bubble
+      </message>
+            <message name="IDS_IOS_CONTEXTUAL_PANEL_SAMPLE_MODEL_ENTRYPOINT_MESSAGE" desc="Message appearing as the entry point for the Contextual Panel's sample model, used as a demo of the entrypoint (appears in the omnibox)">
+        Large entry point
+      </message>
+            <message name="IDS_IOS_CONTEXT_MENU_SEARCHIMAGEWITHGOOGLE" desc="Context menu text for option to search an image with Google [Length: 25em] [iOS only]">
         Search Image with Google
       </message>
       <message name="IDS_IOS_CONTEXT_MENU_SEARCHWEBFORIMAGE" desc="Context menu text for option to perform a search for image [Length: 25em] [iOS only]">
         Search <ph name="SEARCH_ENGINE">$1<ex>Google</ex></ph> for this image
       </message>
-      <message name="IDS_IOS_CONTEXTUAL_PANEL_SAMPLE_MODEL_ENTRYPOINT_MESSAGE" desc="Message appearing as the entry point for the Contextual Panel's sample model, used as a demo of the entrypoint (appears in the omnibox)">
-        Large entry point
-      </message>
-            <message name="IDS_IOS_CONTEXTUAL_PANEL_SAMPLE_MODEL_ENTRYPOINT_IPH_TITLE" desc="The title for the in-product help bubble of the Contextual Panel's sample model entry point, used for demo purposes">
-        Sample bubble
-      </message>
-            <message name="IDS_IOS_CONTEXTUAL_PANEL_SAMPLE_MODEL_ENTRYPOINT_IPH_TEXT" desc="The body text for the in-product help bubble of the Contextual Panel's sample model entry point, used for demo purposes">
-        Sample rich in-product help for the Contextual Panel, which should appear multiple times a day.
-      </message>
       <message name="IDS_IOS_COOKIES_ALLOW_ALL" desc="Label that informs the user that no cookies are blocked">
         Allow all
       </message>
@@ -1290,6 +1330,9 @@
       <message name="IDS_IOS_COPY_VERSION_HINT" desc="The accessibility hint for the label showing the Chrome version. [iOS only]">
         Double tap to copy.
       </message>
+      <message name="IDS_IOS_CREDENTIAL_PROVIDER_PASSKEY_SAVED" desc="Notification that a newly created passkey was synced to the user's account. [iOS only]">
+        Passkey saved
+      </message>
       <message name="IDS_IOS_CREDENTIAL_PROVIDER_PROMO_GO_TO_SETTINGS" desc="Text of the primary button in the 'Learn More' step view of the Credential Provider Exention Promo. [iOS only]">
         Go to Settings…
       </message>
@@ -1308,18 +1351,21 @@
       <message name="IDS_IOS_CREDENTIAL_PROVIDER_PROMO_REMIND_ME_LATER" desc="Text of the tertiary button in the inital step and 'Learn More' step views of the Credential Provider Exention Promo. [iOS only]">
         Remind me later
       </message>
+      <message name="IDS_IOS_CREDENTIAL_PROVIDER_VIEW_PASSKEY" desc="Button label to view a recently created passkey in the password manager. [iOS only]">
+        View
+      </message>
       <message name="IDS_IOS_CREDIT_CARD_SETTINGS_ADD_PAYMENT_METHOD_TITLE" desc="Title of the view that allow user to enter the details for a new credit card to add it to the list the credit cards. [iOS only]">
           Add payment method
       </message>
       <message name="IDS_IOS_DATA_NOT_UPLOADED_DIALOG_BUTTON" desc="Button of a dialog that is shown when the user starts to sign out; the user chooses to sync some or all data types, but some data hasn't been saved in their Google Account yet (for example, if there was an error). This string follows the heading 'Some Data Isn't Saved Yet' and the body text 'Some of your Chrome data hasn't been saved to your Google Account yet. Try waiting a few minutes before signing out. If you sign out now, this data will be deleted.'; the user can choose to tap on the buttons 'Cancel' or 'Delete and Sign Out'. If the user chooses to continue to sign out, then any of their data (such as bookmarks, passwords, history, settings, and more) that isn't saved in their account will be deleted. The tone should be helpful and instructive. [iOS only]">
         Delete and sign out
       </message>
-      <message name="IDS_IOS_DATA_NOT_UPLOADED_SWITCH_DIALOG_BUTTON" desc="Button of a dialog that is shown when the user starts to switch accounts; the user chooses to sync some or all data types, but some data hasn't been saved in their Google Account yet (for example, if there was an error). This string follows the heading 'Some data isn't saved yet' or the heading ‘Unsaved account data will be deleted’; the user can choose to tap on the buttons 'Cancel' or 'Delete and Switch'. If the user chooses to continue to switch accounts, then any of their data (such as bookmarks, passwords, history, settings, and more) that isn't saved in their account will be deleted. The tone should be helpful and instructive. [iOS only]">
-                Switch and Delete
-      </message>
       <message name="IDS_IOS_DATA_NOT_UPLOADED_DIALOG_TITLE" desc="Title of a dialog that is shown when the user starts to sign out; the user chooses to sync some or all data types, but some data hasn't been saved in their Google Account yet (for example, if there was an error). This string precedes the body text 'Some of your Chrome data hasn't been saved to your Google Account yet. Try waiting a few minutes before signing out. If you sign out now, this data will be deleted.', and the user can choose to tap on the buttons 'Cancel' or 'Delete and Sign Out'. If the user chooses to continue to sign out, then any of their data (such as bookmarks, passwords, history, settings, and more) that isn't saved in their account will be deleted. The tone should be helpful and instructive. [iOS only]">
         Some data isn't saved yet
       </message>
+      <message name="IDS_IOS_DATA_NOT_UPLOADED_SWITCH_DIALOG_BUTTON" desc="Button of a dialog that is shown when the user starts to switch accounts; the user chooses to sync some or all data types, but some data hasn't been saved in their Google Account yet (for example, if there was an error). This string follows the heading 'Some data isn't saved yet' or the heading ‘Unsaved account data will be deleted’; the user can choose to tap on the buttons 'Cancel' or 'Delete and Switch'. If the user chooses to continue to switch accounts, then any of their data (such as bookmarks, passwords, history, settings, and more) that isn't saved in their account will be deleted. The tone should be helpful and instructive. [iOS only]">
+                Switch and Delete
+      </message>
       <message name="IDS_IOS_DEFAULT_BROWSER_PROMO_PRIMARY_BUTTON_TEXT" desc="Text of button that will take users to iOS settings, where they can change the default browser. Used in the default browser promos [iOS only]">
         Go to Settings…
       </message>
@@ -1365,9 +1411,6 @@
       <message name="IDS_IOS_DELETE_ACTION_TITLE" desc="Title of the action used to delete a selected item. Item types include, for example, a Bookmark or an History Entry. [iOS only]">
         Delete
       </message>
-      <message name="IDS_IOS_PASSWORD_SETTINGS_DELETE_ALL_SAVED_CREDENTIALS" desc="Button that user can press to delete all saved credentials. [iOS only]">
-        Delete all data
-      </message>
       <message name="IDS_IOS_DELETE_BROWSING_DATA_BOTTOM_SHEET_FOOTER" desc="Footer message in the delete browsing data bottom sheet which informs the user they can seperately delete their search history and/or other forms of activity at the 2 links provided.">
         <ph name="BEGIN_LINK">BEGIN_LINK</ph>Search history<ph name="END_LINK">END_LINK</ph> and <ph name="BEGIN_LINK">BEGIN_LINK</ph>other forms of activity<ph name="END_LINK">END_LINK</ph> may be saved in your Google Account.
       </message>
@@ -1394,23 +1437,20 @@
       <message name="IDS_IOS_DELETE_BROWSING_DATA_SUMMARY_NO_DATA" desc="Placeholder for the browsing data summary when there is no browsing data to delete. [iOS only]">
         None
       </message>
-      <message name="IDS_IOS_DELETE_BROWSING_DATA_SUMMARY_PAYMENT_METHODS" desc="Summary of the payment methods to be deleted when deleting browsing data. [iOS only]">
-       {COUNT, plural,
-          =1 {1 payment method}
-          other {# payment methods}}
-      </message>
       <message name="IDS_IOS_DELETE_BROWSING_DATA_SUMMARY_PASSWORDS" desc="Summary of the passwords to be deleted when deleting browsing data. [iOS only]">
        {COUNT, plural,
           =1 {1 password}
           other {# passwords}}
       </message>
+      <message name="IDS_IOS_DELETE_BROWSING_DATA_SUMMARY_PAYMENT_METHODS" desc="Summary of the payment methods to be deleted when deleting browsing data. [iOS only]">
+       {COUNT, plural,
+          =1 {1 payment method}
+          other {# payment methods}}
+      </message>
       <message name="IDS_IOS_DELETE_BROWSING_DATA_SUMMARY_SEPARATOR" desc="Text/punctuation that separates items in a list. For example, this is used in a list of browsing data items descriptions, e.g. '1 Site, Site Data, 2 passwords'.">
         <!-- IDS_IOS_DELETE_BROWSING_DATA_SUMMARY_SEPARATOR should include a space after the comma. This is achieved by adding ''' after the space. -->
         , '''
       </message>
-      <message name="IDS_IOS_DELETE_BROWSING_DATA_SUMMARY_SITE_DATA" desc="Summary of the site data to be deleted when deleting browsing data. Should be lower case since it's shown in a list of browsing data items descriptions. [iOS only]">
-       site data
-      </message>
       <message name="IDS_IOS_DELETE_BROWSING_DATA_SUMMARY_SITES" desc="Summary of the sites to be deleted when deleting browsing data. [iOS only]">
        {COUNT, plural,
           =1 {1 site}
@@ -1421,6 +1461,9 @@
           =1 {1 site (more on synced devices)}
           other {# sites (more on synced devices)}}
       </message>
+      <message name="IDS_IOS_DELETE_BROWSING_DATA_SUMMARY_SITE_DATA" desc="Summary of the site data to be deleted when deleting browsing data. Should be lower case since it's shown in a list of browsing data items descriptions. [iOS only]">
+       site data
+      </message>
       <message name="IDS_IOS_DELETE_BROWSING_DATA_SUMMARY_SUGGESTIONS" desc="Summary of the suggestions to be deleted when deleting browsing data. [iOS only]">
        {COUNT, plural,
           =1 {1 other}
@@ -1542,6 +1585,21 @@
       <message name="IDS_IOS_DISMISS_WARNING_DIALOG_TITLE" desc="Title of the dialog presented to the user when they want to dismiss a compromised password warning. [iOS only]" meaning="Title-cased">
         Dismiss warning?
       </message>
+      <message name="IDS_IOS_DOCKING_EDIT_HOME_SCREEN_LOTTIE_INSTRUCTION" desc="Title of the instruction shown in the Docking Promo Lottie, which describes the Edit Home Screen text when the user long presses on the Chrome app.">
+        Edit Home Screen
+      </message>
+      <message name="IDS_IOS_DOCKING_PROMO_NO_THANKS_BUTTON_TITLE" desc="Title of the button that dismisses the Docking Promo.">
+        No Thanks
+      </message>
+      <message name="IDS_IOS_DOCKING_PROMO_PRIMARY_BUTTON_TITLE" desc="Title of the primary button in the Docking Promo, which confirms the promo has been seen by the user.">
+        Got it
+      </message>
+      <message name="IDS_IOS_DOCKING_PROMO_SECONDARY_BUTTON_TITLE" desc="Title of the secondary button in the Docking Promo, which schedules the Docking Promo for display at a later time, i.e. Remind Me Later functionality.">
+        Remind me later
+      </message>
+      <message name="IDS_IOS_DOCKING_PROMO_SECOND_INSTRUCTION" desc="Title of the second step instruction shown in the Docking Promo, which tells users to drag the app icon to their iOS dock.">
+        Drag it to the dock at the bottom of your Home Screen
+      </message>
       <message name="IDS_IOS_DOWNLOAD_CALENDAR_FILE_WARNING_MESSAGE" desc="Warning message displayed inside an alert before downloading a calendar file.[iOS only]">
           This website wants to download a file and add it to your calendar.
       </message>
@@ -1599,24 +1657,18 @@
       <message name="IDS_IOS_DOWNLOAD_MANAGER_DOWNLOAD_TO_FILES" desc="Button to start downloading a file to Files e.g. download to local storage. Files is a product name i.e. the Files app on iOS devices and the correct localized version of the product name should be used. [Length: 15em] [iOS only]" meaning="Button to start downloading a file to Files e.g. download to local storage. Files is a product name i.e. the Files app on iOS devices and the correct localized version of the product name should be used. [Length: 15em] [iOS only]">
         Files
       </message>
+      <message name="IDS_IOS_DOWNLOAD_MANAGER_FAILED_ACCESSIBILITY_ANNOUNCEMENT" desc="The accessibility announcement read by Voice Over when the download has failed. [Length: unlimited] [iOS only]">
+        Download failed
+      </message>
+      <message name="IDS_IOS_DOWNLOAD_MANAGER_FILENAME_PERIOD" desc="Label for the download manager when the download has completed. It ends with a period since it is followed with another sentence. [iOS only]" meaning="Label for the download manager when the download has completed. [iOS only]">
+        <ph name="FILENAME">$1<ex>image.jpeg</ex></ph>.
+      </message>
       <message name="IDS_IOS_DOWNLOAD_MANAGER_FILENAME_WITH_SIZE" desc="Label for the download manager when the download has completed. It includes the size of the downloaded file. [iOS only]" meaning="Label for the download manager when the download has completed. It includes the size of the downloaded file. [iOS only]">
         <ph name="FILENAME">$1<ex>image.jpeg</ex></ph> (<ph name="FILESIZE">$2<ex>4 MB</ex></ph>)
       </message>
       <message name="IDS_IOS_DOWNLOAD_MANAGER_FILENAME_WITH_SIZE_PERIOD" desc="Label for the download manager when the download has completed. It includes the size of the downloaded file. It ends with a period since it is followed with another sentence. [iOS only]" meaning="Label for the download manager when the download has completed. It includes the size of the downloaded file. [iOS only]">
         <ph name="FILENAME">$1<ex>image.jpeg</ex></ph> (<ph name="FILESIZE">$2<ex>4 MB</ex></ph>).
       </message>
-      <message name="IDS_IOS_DOWNLOAD_MANAGER_FILENAME_PERIOD" desc="Label for the download manager when the download has completed. It ends with a period since it is followed with another sentence. [iOS only]" meaning="Label for the download manager when the download has completed. [iOS only]">
-        <ph name="FILENAME">$1<ex>image.jpeg</ex></ph>.
-      </message>
-      <message name="IDS_IOS_DOWNLOAD_MANAGER_SAVED_TO_DRIVE" desc="Label for the file having been downloaded to Drive. [iOS only]" meaning="Label for the file having been downloaded to Drive. [iOS only]">
-        Saved in Drive for <ph name="USER_EMAIL">$1<ex>peter.parker@gmail.com</ex></ph>.
-      </message>
-      <message name="IDS_IOS_DOWNLOAD_MANAGER_SAVING_TO_DRIVE" desc="Label for the file being downloaded to Drive. [iOS only]" meaning="Label for the file being downloaded to Drive. [iOS only]">
-        Saving in Drive for <ph name="USER_EMAIL">$1<ex>peter.parker@gmail.com</ex></ph>.
-      </message>
-      <message name="IDS_IOS_DOWNLOAD_MANAGER_FAILED_ACCESSIBILITY_ANNOUNCEMENT" desc="The accessibility announcement read by Voice Over when the download has failed. [Length: unlimited] [iOS only]">
-        Download failed
-      </message>
       <message name="IDS_IOS_DOWNLOAD_MANAGER_GET_THE_APP" desc="Button to install the Drive app, after a file was downloaded and saved to Drive. [Length: 25em] [iOS only]">
         Get the app
       </message>
@@ -1656,12 +1708,18 @@
       <message name="IDS_IOS_DOWNLOAD_MANAGER_RETRY_DOWNLOAD" desc="Button to retry downloading a file once a previous attempt to download the file failed. [Length: 25em] [iOS only]">
         Retry download
       </message>
-      <message name="IDS_IOS_DOWNLOAD_MANAGER_SAVE_ELLIPSIS" desc="The title of the SAVE… button in the download manager when multiple destinations are available for a download. Tapping the 'SAVE…' button presents the file destination picker. [30em]" meaning="The title of the SAVE… button in the download manager when multiple destinations are available for a download. Tapping the 'SAVE…' button presents the file destination picker. [30em]">
-        Save…
+      <message name="IDS_IOS_DOWNLOAD_MANAGER_SAVED_TO_DRIVE" desc="Label for the file having been downloaded to Drive. [iOS only]" meaning="Label for the file having been downloaded to Drive. [iOS only]">
+        Saved in Drive for <ph name="USER_EMAIL">$1<ex>peter.parker@gmail.com</ex></ph>.
       </message>
       <message name="IDS_IOS_DOWNLOAD_MANAGER_SAVE_ACCESSIBILITY_LABEL" desc="Accessibility label (read by VoiceOver) for the SAVE… button in the download manager when multiple destinations are available for a download. Tapping the 'SAVE…' button presents the file destination picker. [30em]" meaning="Accessibility label for the SAVE… button in the download manager when multiple destinations are available for a download. Tapping the 'SAVE…' button presents the file destination picker. [30em]">
         Save file
       </message>
+      <message name="IDS_IOS_DOWNLOAD_MANAGER_SAVE_ELLIPSIS" desc="The title of the SAVE… button in the download manager when multiple destinations are available for a download. Tapping the 'SAVE…' button presents the file destination picker. [30em]" meaning="The title of the SAVE… button in the download manager when multiple destinations are available for a download. Tapping the 'SAVE…' button presents the file destination picker. [30em]">
+        Save…
+      </message>
+      <message name="IDS_IOS_DOWNLOAD_MANAGER_SAVING_TO_DRIVE" desc="Label for the file being downloaded to Drive. [iOS only]" meaning="Label for the file being downloaded to Drive. [iOS only]">
+        Saving in Drive for <ph name="USER_EMAIL">$1<ex>peter.parker@gmail.com</ex></ph>.
+      </message>
       <message name="IDS_IOS_DOWNLOAD_MANAGER_STOP" desc="The title of Stop button in the Stop Download? confirmation dialog [30em]">
         Stop
       </message>
@@ -1689,11 +1747,23 @@
       <message name="IDS_IOS_DOWNLOAD_MOBILECONFIG_FILE_WARNING_TITLE" desc="Title of the alert displaying a warning message before downloading a .mobileconfig file.[iOS only]">
           Configuration profile available
       </message>
+      <message name="IDS_IOS_DOWNLOAD_RESTRICTION_SNACKBAR_BUTTON_TEXT" desc="The text of the snackbar button to dismiss the snackbar. [iOS only]">
+          GOT IT
+      </message>
       <message name="IDS_IOS_DOWNLOAD_RESTRICTION_SNACKBAR_TEXT" desc="The snackbar message to inform users that the download is blocked. [iOS only]">
           Saving files is blocked by your organization
       </message>
-      <message name="IDS_IOS_DOWNLOAD_RESTRICTION_SNACKBAR_BUTTON_TEXT" desc="The text of the snackbar button to dismiss the snackbar. [iOS only]">
-          GOT IT
+      <message name="IDS_IOS_DRIVE_ADD_ACCOUNT" desc="In Title Case: Title of the context menu entry to add another account to choose drive files from. [iOS only]">
+        Add Account
+      </message>
+      <message name="IDS_IOS_DRIVE_FILE_PICKER_ALERT_DISCARD_SELECTION" desc="Title of a button inside an alert asking the user to confirm whether they really want to discard and cancel their file selection. This button discards and cancel the file selection. [iOS only]">
+          Discard selection
+      </message>
+      <message name="IDS_IOS_DRIVE_FILE_PICKER_ALERT_DISCARD_SELECTION_TITLE" desc="Title for an alert asking the user to confirm whether they really want to discard and cancel their file selection. [iOS only]">
+          Are you sure you want to discard your selection?
+      </message>
+      <message name="IDS_IOS_DRIVE_FILE_PICKER_ALERT_KEEP_SELECTION" desc="Title of a button inside an alert asking the user to confirm whether they really want to discard and cancel their file selection. This button keeps the selection. [iOS only]">
+          Keep selection
       </message>
       <message name="IDS_IOS_DRIVE_FILE_PICKER_ALERT_THIS_FILE_COUND_NOT_BE_OPENED" desc="Title for an alert which is presented when a file selected by the user cannot be opened in the Drive file picker. [iOS only]">
           <ph name="FILENAME">$1<ex>image.jpeg</ex></ph> couldn't be opened
@@ -1701,14 +1771,8 @@
       <message name="IDS_IOS_DRIVE_FILE_PICKER_ALERT_TRY_AGAIN" desc="Title for an alert button to try again the selection of a file in the Drive file picker. The alert is presented when a file selected by the user couldn't be opened. [iOS only]">
           Try Again
       </message>
-      <message name="IDS_IOS_DRIVE_FILE_PICKER_ALERT_DISCARD_SELECTION_TITLE" desc="Title for an alert asking the user to confirm whether they really want to discard and cancel their file selection. [iOS only]">
-          Are you sure you want to discard your selection?
-      </message>
-      <message name="IDS_IOS_DRIVE_FILE_PICKER_ALERT_DISCARD_SELECTION" desc="Title of a button inside an alert asking the user to confirm whether they really want to discard and cancel their file selection. This button discards and cancel the file selection. [iOS only]">
-          Discard selection
-      </message>
-      <message name="IDS_IOS_DRIVE_FILE_PICKER_ALERT_KEEP_SELECTION" desc="Title of a button inside an alert asking the user to confirm whether they really want to discard and cancel their file selection. This button keeps the selection. [iOS only]">
-          Keep selection
+      <message name="IDS_IOS_DRIVE_FILE_PICKER_COMPUTERS" desc="Title for Computers folder in the drive file picker table. [iOS only]" meaning="The title corresponds to the Computers folder in Google Drive, hence the translation must be similar. [iOS only]">
+       Computers
       </message>
       <message name="IDS_IOS_DRIVE_FILE_PICKER_CONFIRM" desc="Title for a button that confirms the file selection in a file picker. [iOS only]">
           Confirm
@@ -1716,35 +1780,8 @@
       <message name="IDS_IOS_DRIVE_FILE_PICKER_EMPTY_FOLDER_MESSAGE" desc="The message to display when a Drive folder is empty. [iOS only]">
         This folder is empty
       </message>
-      <message name="IDS_IOS_DRIVE_FILE_PICKER_NO_MATCHING_RESULTS_MESSAGE" desc="The message to display when a Drive search/filter yields an empty list of results. [iOS only]">
-        No matching results
-      </message>
-      <message name="IDS_IOS_DRIVE_FILE_PICKER_MY_DRIVE" desc="Title for My Drive folder in the drive file picker table. [iOS only]" meaning="The title corresponds to the My Drive folder in Google Drive, the translation must be similar. [iOS only]">
-        My Drive
-      </message>
-      <message name="IDS_IOS_DRIVE_FILE_PICKER_SHARED_DRIVES" desc="Title for Shared Drives folder in the drive file picker table. [iOS only]" meaning="The title corresponds to the Shared Drives folder in Google Drive, hence the translation must be similar. [iOS only]">
-        Shared Drives
-      </message>
-      <message name="IDS_IOS_DRIVE_FILE_PICKER_COMPUTERS" desc="Title for Computers folder in the drive file picker table. [iOS only]" meaning="The title corresponds to the Computers folder in Google Drive, hence the translation must be similar. [iOS only]">
-       Computers
-      </message>
-      <message name="IDS_IOS_DRIVE_FILE_PICKER_STARRED" desc="Title for Starred folder in the drive file picker table. [iOS only]" meaning="The title corresponds to the Starred folder in Google Drive, hence the translation must be similar. [iOS only]">
-      Starred
-      </message>
-     <message name="IDS_IOS_DRIVE_FILE_PICKER_RECENT" desc="Title for Recent folder in the drive file picker table. [iOS only]" meaning="The title corresponds to the Recent folder in Google Drive, hence the translation must be similar. [iOS only]">
-      Recent
-      </message>
-     <message name="IDS_IOS_DRIVE_FILE_PICKER_SHARED_WITH_ME" desc="Title for Shared With Me folder in the drive file picker table. [iOS only]" meaning="The title corresponds to the Shared With Me folder in Google Drive, hence the translation must be similar. [iOS only]">
-       Shared With Me
-     </message>
-     <message name="IDS_IOS_DRIVE_FILE_PICKER_FILTER_ENABLE_ALL_TITLE" desc="Title for a button that makes all files selectable in a file picker, regardless of the types accepted by a form. [iOS only]" meaning="Title for a button that makes all files selectable in a file picker, regardless of the types accepted by a form. [iOS only]">
-          Enable All
-     </message>
-      <message name="IDS_IOS_DRIVE_FILE_PICKER_FILTER_ENABLE_ALL_DESCRIPTION" desc="Description for a button that makes all files selectable in a file picker, regardless of the types accepted by a form. [iOS only]" meaning="Description for a button that makes all files selectable in a file picker, regardless of the types accepted by a form. [iOS only]">
-          Include file extensions not specified by the website
-      </message>
-      <message name="IDS_IOS_DRIVE_FILE_PICKER_FILTER_MORE_OPTIONS" desc="Title for a menu which contains more options to filter elements in a picker. [iOS only]" meaning="Title for a menu which contains more options to filter elements in a picker. [iOS only]">
-          More Options
+      <message name="IDS_IOS_DRIVE_FILE_PICKER_FILTER_ALL_FILES" desc="Title for a button that shows all files regardless of their type. [iOS only]" meaning="Title for a button that shows all files regardless of their type. [iOS only]">
+          All Files
       </message>
       <message name="IDS_IOS_DRIVE_FILE_PICKER_FILTER_ARCHIVES" desc="Title for a button that hides all files except archive files. [iOS only]" meaning="Title for a button that hides all files except archive files. [iOS only]">
           Archives
@@ -1752,22 +1789,46 @@
       <message name="IDS_IOS_DRIVE_FILE_PICKER_FILTER_AUDIO" desc="Title for a button that hides all files except audio files. [iOS only]" meaning="Title for a button that hides all files except audio files. [iOS only]">
           Audio
       </message>
-      <message name="IDS_IOS_DRIVE_FILE_PICKER_FILTER_VIDEOS" desc="Title for a button that hides all files except video files. [iOS only]" meaning="Title for a button that hides all files except video files. [iOS only]">
-          Videos
+      <message name="IDS_IOS_DRIVE_FILE_PICKER_FILTER_ENABLE_ALL_DESCRIPTION" desc="Description for a button that makes all files selectable in a file picker, regardless of the types accepted by a form. [iOS only]" meaning="Description for a button that makes all files selectable in a file picker, regardless of the types accepted by a form. [iOS only]">
+          Include file extensions not specified by the website
       </message>
+      <message name="IDS_IOS_DRIVE_FILE_PICKER_FILTER_ENABLE_ALL_TITLE" desc="Title for a button that makes all files selectable in a file picker, regardless of the types accepted by a form. [iOS only]" meaning="Title for a button that makes all files selectable in a file picker, regardless of the types accepted by a form. [iOS only]">
+          Enable All
+     </message>
       <message name="IDS_IOS_DRIVE_FILE_PICKER_FILTER_IMAGES" desc="Title for a button that hides all files except image and photo files. [iOS only]" meaning="Title for a button that hides all files except image and photo files. [iOS only]">
           Photos &amp; Images
       </message>
+      <message name="IDS_IOS_DRIVE_FILE_PICKER_FILTER_MORE_OPTIONS" desc="Title for a menu which contains more options to filter elements in a picker. [iOS only]" meaning="Title for a menu which contains more options to filter elements in a picker. [iOS only]">
+          More Options
+      </message>
       <message name="IDS_IOS_DRIVE_FILE_PICKER_FILTER_PDF" desc="Title for a button that hides all files except PDF files. [iOS only]" meaning="Title for a button that hides all files except PDF files. [iOS only]">
           PDFs
       </message>
-      <message name="IDS_IOS_DRIVE_FILE_PICKER_FILTER_ALL_FILES" desc="Title for a button that shows all files regardless of their type. [iOS only]" meaning="Title for a button that shows all files regardless of their type. [iOS only]">
-          All Files
+      <message name="IDS_IOS_DRIVE_FILE_PICKER_FILTER_VIDEOS" desc="Title for a button that hides all files except video files. [iOS only]" meaning="Title for a button that hides all files except video files. [iOS only]">
+          Videos
       </message>
-      <message name="IDS_IOS_DRIVE_FILE_PICKER_RECENT_TITLE" desc="Title of a section where recent Drive items are presented. [iOS only]" meaning="Title of a section where recent Drive items are presented. [iOS only]">
+      <message name="IDS_IOS_DRIVE_FILE_PICKER_MY_DRIVE" desc="Title for My Drive folder in the drive file picker table. [iOS only]" meaning="The title corresponds to the My Drive folder in Google Drive, the translation must be similar. [iOS only]">
+        My Drive
+      </message>
+      <message name="IDS_IOS_DRIVE_FILE_PICKER_NO_MATCHING_RESULTS_MESSAGE" desc="The message to display when a Drive search/filter yields an empty list of results. [iOS only]">
+        No matching results
+      </message>
+      <message name="IDS_IOS_DRIVE_FILE_PICKER_RECENT" desc="Title for Recent folder in the drive file picker table. [iOS only]" meaning="The title corresponds to the Recent folder in Google Drive, hence the translation must be similar. [iOS only]">
+      Recent
+      </message>
+     <message name="IDS_IOS_DRIVE_FILE_PICKER_RECENT_TITLE" desc="Title of a section where recent Drive items are presented. [iOS only]" meaning="Title of a section where recent Drive items are presented. [iOS only]">
           Recent
       </message>
-      <message name="IDS_IOS_DRIVE_FILE_PICKER_SUBTITLE_MODIFIED" desc="Subtitle of a Drive item indicating when the item was last modified. [iOS only]" meaning="Subtitle of a Drive item indicating when the item was last modified. [iOS only]">
+      <message name="IDS_IOS_DRIVE_FILE_PICKER_SHARED_DRIVES" desc="Title for Shared Drives folder in the drive file picker table. [iOS only]" meaning="The title corresponds to the Shared Drives folder in Google Drive, hence the translation must be similar. [iOS only]">
+        Shared Drives
+      </message>
+      <message name="IDS_IOS_DRIVE_FILE_PICKER_SHARED_WITH_ME" desc="Title for Shared With Me folder in the drive file picker table. [iOS only]" meaning="The title corresponds to the Shared With Me folder in Google Drive, hence the translation must be similar. [iOS only]">
+       Shared With Me
+     </message>
+     <message name="IDS_IOS_DRIVE_FILE_PICKER_STARRED" desc="Title for Starred folder in the drive file picker table. [iOS only]" meaning="The title corresponds to the Starred folder in Google Drive, hence the translation must be similar. [iOS only]">
+      Starred
+      </message>
+     <message name="IDS_IOS_DRIVE_FILE_PICKER_SUBTITLE_MODIFIED" desc="Subtitle of a Drive item indicating when the item was last modified. [iOS only]" meaning="Subtitle of a Drive item indicating when the item was last modified. [iOS only]">
           Modified <ph name="LAST_MODIFICATION_DATE">$1<ex>22 Dec 2022</ex></ph>
       </message>
       <message name="IDS_IOS_DRIVE_FILE_PICKER_SUBTITLE_OPENED" desc="Subtitle of a Drive item indicating when the item was last opened. [iOS only]" meaning="Subtitle of a Drive item indicating when the item was last opened. [iOS only]">
@@ -1776,18 +1837,15 @@
       <message name="IDS_IOS_DRIVE_FILE_PICKER_SUBTITLE_SHARED_WITH_ME" desc="Subtitle of a Drive item shared to the user indicating when the item was shared. [iOS only]" meaning="Subtitle of a Drive item shared to the user indicating when the item was shared. [iOS only]">
           Shared with me <ph name="SHARED_WITH_ME_DATE">$1<ex>22 Dec 2022</ex></ph>
       </message>
-      <message name="IDS_IOS_DRIVE_SORT_BY_NAME" desc="Title of the context menu entry to sort Drive items by name. [iOS only]">
-          Name
-      </message>
       <message name="IDS_IOS_DRIVE_SORT_BY_MODIFICATION" desc="Title of the context menu entry to sort Drive items by modification time. [iOS only]">
           Last Modified
       </message>
+      <message name="IDS_IOS_DRIVE_SORT_BY_NAME" desc="Title of the context menu entry to sort Drive items by name. [iOS only]">
+          Name
+      </message>
       <message name="IDS_IOS_DRIVE_SORT_BY_OPENING" desc="Title of the context menu entry to sort Drive items by opening time. [iOS only]">
           Last Opened
       </message>
-      <message name="IDS_IOS_DRIVE_ADD_ACCOUNT" desc="In Title Case: Title of the context menu entry to add another account to choose drive files from. [iOS only]">
-        Add Account
-      </message>
       <message name="IDS_IOS_EDIT_ACTION_TITLE" desc="Title of the action used to edit a selected item. [iOS only]">
         Edit
       </message>
@@ -1815,9 +1873,6 @@
       <message name="IDS_IOS_ENTERPRISE_MANAGED_BY_YOUR_ORGANIZATION" desc="Text displayed to inform the user that the browser is managed by Enterprise policies (without link). [iOS only]">
         Managed by your organization
       </message>
-      <message name="IDS_IOS_ENTERPRISE_SWITCH_TO_MANAGED_WIDE_SCREEN" desc="The snackbar message subtitle to confirm the signed-in account after a successful account switch. For enterprise users, we remind them that their Google Account is managed by their company, school, or organization. This string does not have line break, so terminal punctuation is required for sentence fragments. [iOS only]">
-        <ph name="EMAIL">$1<ex>johndoe@acme.com</ex></ph>. Managed by your organization.
-      </message>
       <message name="IDS_IOS_ENTERPRISE_MANAGED_INFO" desc="Text displayed to inform the user that the browser is managed by one or more Enterprise policies. [iOS only]">
         Managed by your organization. Some features may be unavailable. <ph name="BEGIN_LINK">BEGIN_LINK</ph>Learn more<ph name="END_LINK">END_LINK</ph>
       </message>
@@ -1855,26 +1910,26 @@
       <message name="IDS_IOS_ENTERPRISE_PROFILE_CREATION_ACCOUNT_KEEP_BROWSING_DATA_NO" desc="Message displayed on the managed profile creation screen in a table view item telling the user that they will bring their existing browsing data separate in the managed profile they will create.">
        No
       </message>
-      <message name="IDS_IOS_ENTERPRISE_PROFILE_CREATION_ACCOUNT_KEEP_BROWSING_DATA_YES" desc="Message displayed on the managed profile creation screen in a table view item telling the user that they will be keeping their existing browsing data separate from the managed profile they will create.">
-       Yes
-      </message>
-      <message name="IDS_IOS_ENTERPRISE_PROFILE_CREATION_ACCOUNT_KEEP_BROWSING_DATA_SEPARATE_TITLE" desc="Message displayed on the managed profile creation screen in a table view item telling the user that they will bring their existing browsing data separate in the managed profile they will create.">
-       Yes, keep it separate
+      <message name="IDS_IOS_ENTERPRISE_PROFILE_CREATION_ACCOUNT_KEEP_BROWSING_DATA_SEPARATE_PAGE_SUBTITLE" desc="Message displayed on a screen where the user is asked what they want to do with their existing browsing data.">
+      Choose what to do with the existing browsing data on this device, like passwords, history, and more.
       </message>
       <message name="IDS_IOS_ENTERPRISE_PROFILE_CREATION_ACCOUNT_KEEP_BROWSING_DATA_SEPARATE_SUBTITLE" desc="Message displayed on the managed profile creation screen in a table view item telling the user that they will bring their existing browsing data separate in the managed profile they will create.">
        Your existing browsing data will be available upon signing out of <ph name="USER_EMAIL">$1</ph>. It won’t be saved in this account.
       </message>
-      <message name="IDS_IOS_ENTERPRISE_PROFILE_CREATION_ACCOUNT_MERGE_BROWSING_DATA_TITLE" desc="Message displayed on the managed profile creation screen in a table view item telling the user that they will be keeping their existing browsing data separate from the managed profile they will create.">
-       No, move it into your work space
+      <message name="IDS_IOS_ENTERPRISE_PROFILE_CREATION_ACCOUNT_KEEP_BROWSING_DATA_SEPARATE_TITLE" desc="Message displayed on the managed profile creation screen in a table view item telling the user that they will bring their existing browsing data separate in the managed profile they will create.">
+       Yes, keep it separate
+      </message>
+      <message name="IDS_IOS_ENTERPRISE_PROFILE_CREATION_ACCOUNT_KEEP_BROWSING_DATA_YES" desc="Message displayed on the managed profile creation screen in a table view item telling the user that they will be keeping their existing browsing data separate from the managed profile they will create.">
+       Yes
+      </message>
+      <message name="IDS_IOS_ENTERPRISE_PROFILE_CREATION_ACCOUNT_MANAGEMENT_DISCLAIMER" desc="Message displayed in the secondary button on a screen where the user is asked to create a work profile.">
+       The account <ph name="USER_EMAIL">$1</ph> is managed by <ph name="HOSTED_DOMAIN">$2</ph>, which can view some information. <ph name="BEGIN_LINK">BEGIN_LINK</ph>Learn more<ph name="END_LINK">END_LINK</ph>
       </message>
       <message name="IDS_IOS_ENTERPRISE_PROFILE_CREATION_ACCOUNT_MERGE_BROWSING_DATA_SUBTITLE" desc="Message displayed on the managed profile creation screen in a table view item telling the user that they will be keeping their existing browsing data separate from the managed profile they will create.">
        Existing browsing data will be linked to <ph name="USER_EMAIL">$1</ph>. This data may be viewable by your organization.
       </message>
-      <message name="IDS_IOS_ENTERPRISE_PROFILE_CREATION_ACCOUNT_KEEP_BROWSING_DATA_SEPARATE_PAGE_SUBTITLE" desc="Message displayed on a screen where the user is asked what they want to do with their existing browsing data.">
-      Choose what to do with the existing browsing data on this device, like passwords, history, and more.
-      </message>
-      <message name="IDS_IOS_ENTERPRISE_PROFILE_CREATION_ACCOUNT_MANAGEMENT_DISCLAIMER" desc="Message displayed in the secondary button on a screen where the user is asked to create a work profile.">
-       The account <ph name="USER_EMAIL">$1</ph> is managed by <ph name="HOSTED_DOMAIN">$2</ph>, which can view some information. <ph name="BEGIN_LINK">BEGIN_LINK</ph>Learn more<ph name="END_LINK">END_LINK</ph>
+      <message name="IDS_IOS_ENTERPRISE_PROFILE_CREATION_ACCOUNT_MERGE_BROWSING_DATA_TITLE" desc="Message displayed on the managed profile creation screen in a table view item telling the user that they will be keeping their existing browsing data separate from the managed profile they will create.">
+       No, move it into your work space
       </message>
       <message name="IDS_IOS_ENTERPRISE_PROFILE_CREATION_CANCEL" meaning="Button label to avoid using a managed profile" desc="Message displayed in the secondary button on a screen where the user is asked to create a work profile.">
        Cancel
@@ -1882,27 +1937,27 @@
       <message name="IDS_IOS_ENTERPRISE_PROFILE_CREATION_CONTINUE" meaning="Button label to continue with a managed profile" desc="Message displayed in the primary button on a screen where the user is asked to create a work profile.">
        Continue
       </message>
-      <message name="IDS_IOS_ENTERPRISE_PROFILE_CREATION_TITLE" desc="Message displayed in the secondary button on a screen where the user is asked to create a work profile.">
-       A separate space for work
-      </message>
-      <message name="IDS_IOS_ENTERPRISE_PROFILE_CREATION_LEARN_MORE_TITLE" desc="Title of the screen where the user learns more about their managed account.">
-        Managed Account
+      <message name="IDS_IOS_ENTERPRISE_PROFILE_CREATION_LEARN_MORE_BROWSER_INFORMATION_SUBTITLE" desc="Message of a section of the learn more screen about how the administrator manages the browser and can access browser information.">
+        Your organization may need to see and manage browsing data tied to your managed account, such as your browsing history and passwords.
       </message>
       <message name="IDS_IOS_ENTERPRISE_PROFILE_CREATION_LEARN_MORE_BROWSER_INFORMATION_TITLE" desc="Title of a section of the learn more screen about how the administrator manages the browser and can access browser information.">
         Browser Information
       </message>
-      <message name="IDS_IOS_ENTERPRISE_PROFILE_CREATION_LEARN_MORE_BROWSER_INFORMATION_SUBTITLE" desc="Message of a section of the learn more screen about how the administrator manages the browser and can access browser information.">
-        Your organization may need to see and manage browsing data tied to your managed account, such as your browsing history and passwords.
+      <message name="IDS_IOS_ENTERPRISE_PROFILE_CREATION_LEARN_MORE_DEVICE_INFORMATION_SUBTITLE" desc="Message of a section of the learn more screen about how the administrator manages the browser and can access device information.">
+        To make sure this device can be used safely, your organization may need to see information about its operating system, browser, settings and what software is installed on the device.
       </message>
       <message name="IDS_IOS_ENTERPRISE_PROFILE_CREATION_LEARN_MORE_DEVICE_INFORMATION_TITLE" desc="Title of a section of the learn more screen about how the administrator manages the browser and can access device information.">
         Device Information
       </message>
-      <message name="IDS_IOS_ENTERPRISE_PROFILE_CREATION_LEARN_MORE_DEVICE_INFORMATION_SUBTITLE" desc="Message of a section of the learn more screen about how the administrator manages the browser and can access device information.">
-        To make sure this device can be used safely, your organization may need to see information about its operating system, browser, settings and what software is installed on the device.
-      </message>
       <message name="IDS_IOS_ENTERPRISE_PROFILE_CREATION_LEARN_MORE_HEADER" desc="Header of the learn more screen telling the user that their account is managed by an organization that can view some information.">
        The account <ph name="USER_EMAIL">$1</ph> is managed by <ph name="HOSTED_DOMAIN">$2</ph>, which can view some information, including
       </message>
+      <message name="IDS_IOS_ENTERPRISE_PROFILE_CREATION_LEARN_MORE_TITLE" desc="Title of the screen where the user learns more about their managed account.">
+        Managed Account
+      </message>
+      <message name="IDS_IOS_ENTERPRISE_PROFILE_CREATION_TITLE" desc="Message displayed in the secondary button on a screen where the user is asked to create a work profile.">
+       A separate space for work
+      </message>
       <message name="IDS_IOS_ENTERPRISE_RESTRICTED_ACCOUNTS_TO_PATTERNS_MESSAGE" desc="Text displayed in the popover to inform the user that the browser is managed by Enterprise policies. (Restrict Accounts To Patterns) [iOS only]">
           Your organization allows you to sign in only with certain accounts. Accounts that aren't allowed are hidden.
       </message>
@@ -1918,9 +1973,24 @@
       <message name="IDS_IOS_ENTERPRISE_SIGNED_OUT_MESSAGE_WITH_UNO" desc="Message displayed in a prompt when the user is signed out due to browser sign-in becoming disabled by policy. Related with IDS_IOS_ENTERPRISE_SIGNED_OUT.">
         Your organization turned off sign-in. New bookmarks, passwords, and more will be saved only to this device.
       </message>
+      <message name="IDS_IOS_ENTERPRISE_SWITCH_TO_MANAGED_WIDE_SCREEN" desc="The snackbar message subtitle to confirm the signed-in account after a successful account switch. For enterprise users, we remind them that their Google Account is managed by their company, school, or organization. This string does not have line break, so terminal punctuation is required for sentence fragments. [iOS only]">
+        <ph name="EMAIL">$1<ex>johndoe@acme.com</ex></ph>. Managed by your organization.
+      </message>
       <message name="IDS_IOS_ENTERPRISE_SYNC_DISABLED_TITLE_WITH_UNO" desc="Message displayed in a prompt when saving data (like bookmarks/reading list/passwords…) is disabled due to an enterprise policy. Related with IDS_IOS_ENTERPRISE_SYNC_DISABLED_MESSAGE_UNO.">
         Some features no longer available
       </message>
+      <message name="IDS_IOS_EXPANDED_MANUAL_FILL_ADDRESS_TAB_ACCESSIBILITY_LABEL" desc="Accessibility label of the expanded manual fill view's address tab.">
+        Addresses and more
+      </message>
+      <message name="IDS_IOS_EXPANDED_MANUAL_FILL_CLOSE_BUTTON_ACCESSIBILITY_LABEL" desc="Accessibility label of the expanded manual fill view's close button.">
+        Dismiss expanded view
+      </message>
+      <message name="IDS_IOS_EXPANDED_MANUAL_FILL_PASSWORD_TAB_ACCESSIBILITY_LABEL" desc="Accessibility label of the expanded manual fill view's password tab.">
+        Passwords
+      </message>
+      <message name="IDS_IOS_EXPANDED_MANUAL_FILL_PAYMENT_TAB_ACCESSIBILITY_LABEL" desc="Accessibility label of the expanded manual fill view's payment method tab.">
+        Payment methods
+      </message>
       <message name="IDS_IOS_EXPORT_PASSWORDS" desc="Button that the user can press to export passwords. [Length: 22em] [iOS only]">
         Export passwords…
       </message>
@@ -1984,24 +2054,6 @@
       <message name="IDS_IOS_FEED_SORT_PUBLISHER" desc="Sort by publisher label text in feed sort menu.">
         Sort by publisher
       </message>
-      <message name="IDS_IOS_FIRST_RUN_SEGMENTED_DEFAULT_BROWSER_ANDROID_SWITCHER_SUBTITLE_IPAD" desc="Subtitle for Default Browser promo shown during First Run Experience to users identified as Cross Device Desktop Users on iPad">
-        Get the best from the mobile browser you know and love on your iPad.
-      </message>
-      <message name="IDS_IOS_FIRST_RUN_SEGMENTED_DEFAULT_BROWSER_ANDROID_SWITCHER_SUBTITLE_IPHONE" desc="Subtitle for Default Browser promo shown during First Run Experience to users identified as Cross Device Desktop Users on iPhone">
-        Get the best from the mobile browser you know and love on your iPhone.
-      </message>
-      <message name="IDS_IOS_FIRST_RUN_SEGMENTED_DEFAULT_BROWSER_DESKTOP_USER_SUBTITLE_IPAD" desc="Subtitle for Default Browser promo shown during First Run Experience to users identified as Cross Device Desktop Users on iPad">
-        Get the best from the desktop browser you know and love on your iPad.
-      </message>
-      <message name="IDS_IOS_FIRST_RUN_SEGMENTED_DEFAULT_BROWSER_DESKTOP_USER_SUBTITLE_IPHONE" desc="Subtitle for Default Browser promo shown during First Run Experience to users identified as Cross Device Desktop Users on iPhone">
-        Get the best from the desktop browser you know and love on your iPhone.
-      </message>
-      <message name="IDS_IOS_FIRST_RUN_SEGMENTED_DEFAULT_BROWSER_DEVICE_SWITCHER_TITLE_IPAD" desc="Title for Default Browser promo shown during First Run Experience to users identified as Cross Device Desktop Users on IPad">
-        The browser you love now on iPad
-      </message>
-      <message name="IDS_IOS_FIRST_RUN_SEGMENTED_DEFAULT_BROWSER_DEVICE_SWITCHER_TITLE_IPHONE" desc="Title for Default Browser promo shown during First Run Experience to users identified as Cross Device Desktop Users on iPhone">
-        The browser you love now on iOS
-      </message>
       <message name="IDS_IOS_FIRSTRUN_TERMS_TITLE" desc="Title for the Terms of Service page shown to user on First Run. [Length: 20em] [iOS only]">
         Terms of service
       </message>
@@ -2047,6 +2099,24 @@
       <message name="IDS_IOS_FIRST_RUN_SCREEN_READ_MORE" desc="The label on the primary button of some screens in the first run experience if the content requires scrolling to the end [iOS only]">
         More
       </message>
+      <message name="IDS_IOS_FIRST_RUN_SEGMENTED_DEFAULT_BROWSER_ANDROID_SWITCHER_SUBTITLE_IPAD" desc="Subtitle for Default Browser promo shown during First Run Experience to users identified as Cross Device Desktop Users on iPad">
+        Get the best from the mobile browser you know and love on your iPad.
+      </message>
+      <message name="IDS_IOS_FIRST_RUN_SEGMENTED_DEFAULT_BROWSER_ANDROID_SWITCHER_SUBTITLE_IPHONE" desc="Subtitle for Default Browser promo shown during First Run Experience to users identified as Cross Device Desktop Users on iPhone">
+        Get the best from the mobile browser you know and love on your iPhone.
+      </message>
+      <message name="IDS_IOS_FIRST_RUN_SEGMENTED_DEFAULT_BROWSER_DESKTOP_USER_SUBTITLE_IPAD" desc="Subtitle for Default Browser promo shown during First Run Experience to users identified as Cross Device Desktop Users on iPad">
+        Get the best from the desktop browser you know and love on your iPad.
+      </message>
+      <message name="IDS_IOS_FIRST_RUN_SEGMENTED_DEFAULT_BROWSER_DESKTOP_USER_SUBTITLE_IPHONE" desc="Subtitle for Default Browser promo shown during First Run Experience to users identified as Cross Device Desktop Users on iPhone">
+        Get the best from the desktop browser you know and love on your iPhone.
+      </message>
+      <message name="IDS_IOS_FIRST_RUN_SEGMENTED_DEFAULT_BROWSER_DEVICE_SWITCHER_TITLE_IPAD" desc="Title for Default Browser promo shown during First Run Experience to users identified as Cross Device Desktop Users on IPad">
+        The browser you love now on iPad
+      </message>
+      <message name="IDS_IOS_FIRST_RUN_SEGMENTED_DEFAULT_BROWSER_DEVICE_SWITCHER_TITLE_IPHONE" desc="Title for Default Browser promo shown during First Run Experience to users identified as Cross Device Desktop Users on iPhone">
+        The browser you love now on iOS
+      </message>
       <message name="IDS_IOS_FIRST_RUN_SIGNIN_BENEFITS_SUBTITLE_SHORT" desc="This string is on a promotion about signing in to Chrome with the user's Google Account. It explains the overarching user benefit of signing in (access to bookmarks, passwords, history, settings, etc.). We want users to understand why signing in is beneficial, and click 'Continue as name' to sign in to their Google Account. The tone should be informative and lightweight.">
         Sign in to get your bookmarks, passwords, and more on all your devices.
       </message>
@@ -2059,12 +2129,12 @@
       <message name="IDS_IOS_FIRST_RUN_SIGNIN_DONT_SIGN_IN" desc="Button on the very first screen of Chrome to continue without signing into Chrome. [iOS only]">
         Don’t sign in
       </message>
-      <message name="IDS_IOS_FIRST_RUN_SIGNIN_STAY_SIGNED_OUT" desc="Button on the sign in screen of the FRE to stay signed out on Chrome. [iOS only]">
-        Stay signed out
-      </message>
       <message name="IDS_IOS_FIRST_RUN_SIGNIN_SIGN_IN_ACTION" desc="Button on the very first screen of Chrome for users to sign in when there is no Google Account on the device. [iOS only]">
         Sign in…
       </message>
+      <message name="IDS_IOS_FIRST_RUN_SIGNIN_STAY_SIGNED_OUT" desc="Button on the sign in screen of the FRE to stay signed out on Chrome. [iOS only]">
+        Stay signed out
+      </message>
       <message name="IDS_IOS_FIRST_RUN_SYNC_SCREEN_PRIMARY_ACTION" desc="The primary action string on the sync screen presented to the user on First Run [iOS only]">
         Turn on sync
       </message>
@@ -2098,9 +2168,6 @@
       <message name="IDS_IOS_GENERIC_PASSKIT_ERROR" desc="Generic error message on failure reading a PassKit object. [Length: 60em] [iOS only]">
         Sorry, your Pass cannot be installed to Passbook at this time.
       </message>
-      <message name="IDS_IOS_GO_TO_LENS" desc="Text of the primary button to go to the Lens camera experience. [iOS only]">
-        Go to Lens
-      </message>
       <message name="IDS_IOS_GOOGLE_ACCOUNTS_MANAGEMENT_FROM_ACCOUNT_SETTINGS_TITLE" desc="Title of a page that shows all accounts on the user's device and lets them add, remove and otherwise manage their accounts. Avoid long strings given the limited space between surrounding buttons.">
         Accounts on this device
       </message>
@@ -2209,6 +2276,9 @@
       <message name="IDS_IOS_GOOGLE_SYNC_SETTINGS_TITLE" desc="Title for the view in the Settings for enabling/disabling Sync. [Length: 26em] [iOS only]">
         Sync
       </message>
+      <message name="IDS_IOS_GO_TO_LENS" desc="Text of the primary button to go to the Lens camera experience. [iOS only]">
+        Go to Lens
+      </message>
       <message name="IDS_IOS_HELP_ACCESSIBILITY_LABEL" desc="Used as the accessibility label read by screen readers for a Help button. [iOS only]">
         Help
       </message>
@@ -2323,18 +2393,18 @@
       <message name="IDS_IOS_IDENTITY_DISC_WITH_EMAIL" desc="The content description for a toolbar button displaying user profile picture. Tapping on this button navigates to 'Sync and Google services' page in settings [iOS only].">
         Signed in as <ph name="USER_EMAIL">$1<ex>peter.parker@gmail.com</ex></ph>. Opens settings.
       </message>
-      <message name="IDS_IOS_IDENTITY_DISC_WITH_NAME_AND_EMAIL" desc="The content description for a toolbar button displaying user profile picture. Tapping on this button navigates to 'Sync and Google services' page in settings [iOS only].">
-        Signed in as <ph name="USER_NAME">$1<ex>Peter Parker</ex></ph>. <ph name="USER_EMAIL">$2<ex>peter.parker@gmail.com</ex></ph>. Opens settings.
-      </message>
       <message name="IDS_IOS_IDENTITY_DISC_WITH_EMAIL_OPEN_ACCOUNT_MENU" desc="The content description for a toolbar button displaying user profile picture. Tapping on this button opens the account menu [iOS only].">
           Signed in as <ph name="USER_EMAIL">$1<ex>peter.parker@gmail.com</ex></ph>. Open account menu.
       </message>
-      <message name="IDS_IOS_IDENTITY_DISC_WITH_NAME_AND_EMAIL_OPEN_ACCOUNT_MENU" desc="The content description for a toolbar button displaying user profile picture. Tapping on this button opens the account menu [iOS only].">
-          Signed in as <ph name="USER_NAME">$1<ex>Peter Parker</ex></ph>. <ph name="USER_EMAIL">$2<ex>peter.parker@gmail.com</ex></ph>. Open account menu.
-      </message>
       <message name="IDS_IOS_IDENTITY_DISC_WITH_EMAIL_OPEN_ACCOUNT_MENU_WITH_ERROR" desc="The content description for a toolbar button displaying user profile picture. Tapping on this button opens the account menu [iOS only].">
           Signed in as <ph name="USER_EMAIL">$1<ex>peter.parker@gmail.com</ex></ph>. Google Account error. Open account menu.
       </message>
+      <message name="IDS_IOS_IDENTITY_DISC_WITH_NAME_AND_EMAIL" desc="The content description for a toolbar button displaying user profile picture. Tapping on this button navigates to 'Sync and Google services' page in settings [iOS only].">
+        Signed in as <ph name="USER_NAME">$1<ex>Peter Parker</ex></ph>. <ph name="USER_EMAIL">$2<ex>peter.parker@gmail.com</ex></ph>. Opens settings.
+      </message>
+      <message name="IDS_IOS_IDENTITY_DISC_WITH_NAME_AND_EMAIL_OPEN_ACCOUNT_MENU" desc="The content description for a toolbar button displaying user profile picture. Tapping on this button opens the account menu [iOS only].">
+          Signed in as <ph name="USER_NAME">$1<ex>Peter Parker</ex></ph>. <ph name="USER_EMAIL">$2<ex>peter.parker@gmail.com</ex></ph>. Open account menu.
+      </message>
       <message name="IDS_IOS_IDENTITY_DISC_WITH_NAME_AND_EMAIL_OPEN_ACCOUNT_MENU_WITH_ERROR" desc="The content description for a toolbar button displaying user profile picture. Tapping on this button opens the account menu [iOS only].">
           Signed in as <ph name="USER_NAME">$1<ex>Peter Parker</ex></ph>. <ph name="USER_EMAIL">$2<ex>peter.parker@gmail.com</ex></ph>. Google Account error. Open account menu.
       </message>
@@ -2356,6 +2426,57 @@
       <message name="IDS_IOS_IDENTITY_ERROR_INFOBAR_VERIFY_ITS_YOU_TITLE" desc="The title of the identity error info bar when identity verification is needed. [iOS only]">
         Verify it's you
       </message>
+      <message name="IDS_IOS_IDLE_TIMEOUT_ALL_ACTIONS_SNACKBAR_MESSAGE" desc="Title of the idle timeout policy dialog when browsing data is about to be cleared, tabs will be closed and the user will be signed out.">
+        Tabs were closed and browsing data was deleted. You were signed out
+      </message>
+      <message name="IDS_IOS_IDLE_TIMEOUT_ALL_ACTIONS_TITLE" desc="Title of the idle timeout policy dialog when browsing data is about to be cleared, tabs will be closed and the user will be signed out.">
+          You'll be signed out, tabs will be closed, browsing data deleted
+      </message>
+      <message name="IDS_IOS_IDLE_TIMEOUT_CLEAR_DATA_AND_SIGNOUT_SNACKBAR_MESSAGE" desc="Title of the idle timeout policy dialog when browsing data is about to be cleared and the user will be signed out.">
+        You were signed out; browsing data was deleted
+      </message>
+      <message name="IDS_IOS_IDLE_TIMEOUT_CLEAR_DATA_AND_SIGNOUT_TITLE" desc="Title of the idle timeout policy dialog when browsing data is about to be cleared and the user will be signed out.">
+        You'll be signed out and browsing data will be deleted
+      </message>
+      <message name="IDS_IOS_IDLE_TIMEOUT_CLEAR_DATA_SNACKBAR_MESSAGE" desc="Title of the idle timeout policy dialog when browsing data is about to be cleared.">
+        Browsing data was deleted
+      </message>
+      <message name="IDS_IOS_IDLE_TIMEOUT_CLEAR_DATA_TITLE" desc="Title of the idle timeout policy dialog when browsing data is about to be cleared.">
+        Your browsing data will be deleted
+      </message>
+      <message name="IDS_IOS_IDLE_TIMEOUT_CLOSE_TABS_AND_CLEAR_DATA_SNACKBAR_MESSAGE" desc="Title of the idle timeout policy dialog when tabs are about to be closed and browsing data about to be deleted.">
+        Tabs were closed and browsing data deleted
+      </message>
+      <message name="IDS_IOS_IDLE_TIMEOUT_CLOSE_TABS_AND_CLEAR_DATA_TITLE" desc="Title of the idle timeout policy dialog when tabs are about to be closed and browsing data about to be deleted.">
+        Your tabs will be closed and browsing data deleted
+      </message>
+      <message name="IDS_IOS_IDLE_TIMEOUT_CLOSE_TABS_AND_SIGNOUT_SNACKBAR_MESSAGE" desc="Title of the idle timeout policy dialog when tabs are about to be closed and the user to be signed out.">
+        Tabs were closed; you were signed out
+      </message>
+      <message name="IDS_IOS_IDLE_TIMEOUT_CLOSE_TABS_AND_SIGNOUT_TITLE" desc="Title of the idle timeout policy dialog when tabs are about to be closed and the user to be signed out.">
+        You'll be signed out and tabs will be closed
+      </message>
+      <message name="IDS_IOS_IDLE_TIMEOUT_CLOSE_TABS_SNACKBAR_MESSAGE" desc="Title of the idle timeout policy dialog when tabs are about to be closed.">
+        Tabs were closed
+      </message>
+      <message name="IDS_IOS_IDLE_TIMEOUT_CLOSE_TABS_TITLE" desc="Title of the idle timeout policy dialog when tabs are about to be closed.">
+        Your tabs will be closed
+      </message>
+      <message name="IDS_IOS_IDLE_TIMEOUT_CONFIRMATION_DIALOG_REMAINING_TIME_LABEL" desc="Time remaining until the idle timeout confirmation dialog disappears">
+        {TIME, plural,
+                =0 {Time Remaining: {TIME} seconds}
+                =1 {Time Remaining: {TIME} second}
+                other {Time Remaining: {TIME} seconds}}
+      </message>
+      <message name="IDS_IOS_IDLE_TIMEOUT_DIALOG_ACCESSIBILITY_LABEL" desc="Accessibility label the voiceover uses when the idle timeout confirmation dialog is shown.">
+        Idle timeout dialog
+      </message>
+      <message name="IDS_IOS_IDLE_TIMEOUT_SIGNOUT_SNACKBAR_MESSAGE" desc="Title of the idle timeout policy dialog when the user is about to be signed out.">
+        You were signed out
+      </message>
+      <message name="IDS_IOS_IDLE_TIMEOUT_SIGNOUT_TITLE" desc="Title of the idle timeout policy dialog when the user is about to be signed out.">
+        You'll be signed out
+      </message>
       <message name="IDS_IOS_INACTIVE_TABS_BUTTON_SUBTITLE" desc="Subtitle of the button in the Tab Grid that opens the grid of inactive tabs.">
         Tabs not used for <ph name="THRESHOLD">$1<ex>14</ex></ph> days
       </message>
@@ -2411,6 +2532,26 @@
       <message name="IDS_IOS_INCOGNITO_INTERSTITIAL_URL_READ_MORE_BUTTON" desc="Button to unfold a URL which is being truncated, so as to let the user read more of the URL. [iOS only]">
         more
       </message>
+      <message name="IDS_IOS_INCOGNITO_LOCK_DO_NOT_HIDE" desc="Incognito lock setting option to disable hiding Incognito tabs. This appears in the incognito lock settings page under privacy and security. [iOS only]">
+       Don't hide
+      </message>
+      <message name="IDS_IOS_INCOGNITO_LOCK_HIDE_WITH_REAUTH" desc="Incognito lock setting option to enable hiding/locking Incognito tabs with a biometric authentication, e.g. Passcode, Face ID or Touch ID. This appears in the incognito lock settings page under privacy and security. [iOS only]">
+       Lock immediately with <ph name="BIOMETRIC_AUTHENITCATION_TYPE">$1<ex>Face ID</ex></ph>
+      </message>
+      <message name="IDS_IOS_INCOGNITO_LOCK_HIDE_WITH_SOFT_LOCK_DESCRIPTION" desc="Description for enabling Incognito soft lock setting. This appears in the incognito lock settings page under privacy and security. [iOS only]">
+       When you return, tabs are blurred until you tap to continue
+      </message>
+      <message name="IDS_IOS_INCOGNITO_LOCK_HIDE_WITH_SOFT_LOCK_TITLE" desc="Incognito lock setting option to enable hiding Incognito tabs with a soft lock.  This appears in the incognito lock settings page under privacy and security. [iOS only]">
+       {count, plural,
+          =1 {Hide after 1 minute}
+          other {Hide after {count} minutes}}
+      </message>
+      <message name="IDS_IOS_INCOGNITO_LOCK_SETTING_NAME" desc="Name of the Setting to protect Incognito tabs with either soft lock or biometric authentication, e.g. Face ID or Touch ID. [iOS only]">
+       Hide Incognito tabs
+      </message>
+      <message name="IDS_IOS_INCOGNITO_LOCK_SETTING_STATE_REAUTH" desc="The state of the incognito lock setting when it is set to lock with biometric authentication, e.g. Passcode, Face ID or Touch ID. This is displayed on the privacy and security page in settings. [iOS only]">
+       <ph name="BIOMETRIC_AUTHENITCATION_TYPE">$1<ex>Face ID</ex></ph>
+      </message>
       <message name="IDS_IOS_INCOGNITO_REAUTH_CLOSE_INCOGNITO_TABS" desc="Button to close all Incognito tabs on a screen that blocks Incognito tabs until unlocked. [iOS only]">
         Close Incognito tabs
       </message>
@@ -2561,7 +2702,16 @@
       <message name="IDS_IOS_KEYBOARD_FIRST_TAB" desc="The title of the keyboard shortcut to open the first tab." meaning="Used as a command title in the iPad command menu.">
         Go to first tab
       </message>
-      <message name="IDS_IOS_KEYBOARD_GO_TO_TAB_GRID" desc="The title of the keyboard shortcut to open the Tab Switcher." meaning="Used as a command title in the iPad command menu.">
+      <message name="IDS_IOS_KEYBOARD_GO_TO_INCOGNITO_TAB_GRID" desc="The title of the keyboard shortcut to go to the incognito tab grid from the tab grid menu." meaning="Used as a command title in the iPad command menu.">
+        Incognito tab grid
+      </message>
+      <message name="IDS_IOS_KEYBOARD_GO_TO_REGULAR_TAB_GRID" desc="The title of the keyboard shortcut to go to the regular tab grid from the tab grid menu." meaning="Used as a command title in the iPad command menu.">
+        Regular tab grid
+      </message>
+      <message name="IDS_IOS_KEYBOARD_GO_TO_REMOTE_TAB_GRID" desc="The title of the keyboard shortcut to go to the remote tab grid from the tab grid menu." meaning="Used as a command title in the iPad command menu.">
+        Remote tab grid
+      </message>
+    <message name="IDS_IOS_KEYBOARD_GO_TO_TAB_GRID" desc="The title of the keyboard shortcut to open the Tab Switcher." meaning="Used as a command title in the iPad command menu.">
         Go to tab switcher
       </message>
       <message name="IDS_IOS_KEYBOARD_HISTORY" desc="Title of the menu listing history-related keyboard shortcuts." meaning="Used as a menu title in the iPad command menu.">
@@ -2657,12 +2807,6 @@
       <message name="IDS_IOS_LANGUAGE_SETTINGS_TRANSLATE_SWITCH_TITLE" desc="Title for the switch to enable or disable translation in the language settings page. [Length: 30em] [iOS only]" meaning="Turning this switch on enables offering translation and turning it off disables offering translation.">
         Translate pages
       </message>
-      <message name="IDS_IOS_LENS_KEYBOARD_IPH_TEXT" desc="Text the IPH for the Lens button in the keyboard.">
-        You can search images and what you see.
-      </message>
-      <message name="IDS_IOS_LENS_LEARN_MORE" desc="The title for the overflow menu option leading to the 'Learn More' page for Lens Overlay [iOS only].">
-        Learn more
-      </message>
       <message name="IDS_IOS_LENS_ALERT_CLOSE_ACTION" desc="The close button title for the Lens network connection alert [iOS only].">
         Close
       </message>
@@ -2672,6 +2816,39 @@
       <message name="IDS_IOS_LENS_ALERT_TITLE" desc="The title for the alert informing the user that something when wrong with Lens because of the network connection [iOS only].">
         Something went wrong
       </message>
+      <message name="IDS_IOS_LENS_KEYBOARD_IPH_TEXT" desc="Text the IPH for the Lens button in the keyboard.">
+        You can search images and what you see.
+      </message>
+      <message name="IDS_IOS_LENS_LEARN_MORE" desc="The title for the overflow menu option leading to the 'Learn More' page for Lens Overlay [iOS only].">
+        Learn more
+      </message>
+      <message name="IDS_IOS_LENS_OVERLAY_CONSENT_ACCEPT_TERMS_BUTTON_TITLE" desc="The accept terms button title for the lens overlay consent dialog [iOS only].">
+        Continue
+      </message>
+      <message name="IDS_IOS_LENS_OVERLAY_CONSENT_DENY_TERMS_BUTTON_TITLE" desc="The deny terms button title for the lens overlay consent dialog [iOS only].">
+        Cancel
+      </message>
+      <message name="IDS_IOS_LENS_OVERLAY_CONSENT_DESCRIPTION" desc="The description for the lens overlay consent dialog [iOS only].">
+        When you use Google Lens, a screenshot of the page is sent to Google.
+      </message>
+      <message name="IDS_IOS_LENS_OVERLAY_CONSENT_LEARN_MORE" desc="The lens overlay consent dialog learn more about google lens link title [iOS only].">
+        Learn more about Google Lens
+      </message>
+      <message name="IDS_IOS_LENS_OVERLAY_CONSENT_TITLE" desc="The title for the lens overlay consent dialog. [iOS only].">
+        Tap or highlight to search anything with Google Lens
+      </message>
+      <message name="IDS_IOS_LENS_OVERLAY_ENTRYPOINT_BUTTON_ACCESSIBILITY_LABEL" desc=" The Lesn overlay entrypoint button accessibility label [iOS only].">
+        Search your screen with Google Lens
+      </message>
+      <message name="IDS_IOS_LENS_OVERLAY_GO_TO_NEW_TAB" desc="Call to action to go to a tab that has just been opened in the background.">
+        Go to tab
+      </message>
+      <message name="IDS_IOS_LENS_OVERLAY_NEW_TAB_MESSAGE" desc="Message displayed when a context menu selection resuls in a new tab openening in the background [iOS only].">
+        Your selection opened in a new tab
+      </message>
+      <message name="IDS_IOS_LENS_OVERLAY_TOOLTIP_TEXT" desc="The Lens overlay tooltip displayed text.">
+        Search your screen
+      </message>
       <message name="IDS_IOS_LENS_PROMO_INSTRUCTIONS_STEP1" desc="The text for step 1 in the Lens Promo instructions view.">
         Go to your homepage or keyboard
       </message>
@@ -2696,33 +2873,6 @@
       <message name="IDS_IOS_LENS_PROMO_TITLE" desc="The title text for a Lens promo view.">
         Search with Lens
       </message>
-      <message name="IDS_IOS_LENS_OVERLAY_CONSENT_ACCEPT_TERMS_BUTTON_TITLE" desc="The accept terms button title for the lens overlay consent dialog [iOS only].">
-        Continue
-      </message>
-      <message name="IDS_IOS_LENS_OVERLAY_CONSENT_DENY_TERMS_BUTTON_TITLE" desc="The deny terms button title for the lens overlay consent dialog [iOS only].">
-        Cancel
-      </message>
-      <message name="IDS_IOS_LENS_OVERLAY_CONSENT_DESCRIPTION" desc="The description for the lens overlay consent dialog [iOS only].">
-        When you use Google Lens, a screenshot of the page is sent to Google.
-      </message>
-      <message name="IDS_IOS_LENS_OVERLAY_CONSENT_LEARN_MORE" desc="The lens overlay consent dialog learn more about google lens link title [iOS only].">
-        Learn more about Google Lens
-      </message>
-      <message name="IDS_IOS_LENS_OVERLAY_CONSENT_TITLE" desc="The title for the lens overlay consent dialog. [iOS only].">
-        Tap or highlight to search anything with Google Lens
-      </message>
-      <message name="IDS_IOS_LENS_OVERLAY_ENTRYPOINT_BUTTON_ACCESSIBILITY_LABEL" desc=" The Lesn overlay entrypoint button accessibility label [iOS only].">
-        Search your screen with Google Lens
-      </message>
-      <message name="IDS_IOS_LENS_OVERLAY_NEW_TAB_MESSAGE" desc="Message displayed when a context menu selection resuls in a new tab openening in the background [iOS only].">
-        Your selection opened in a new tab
-      </message>
-      <message name="IDS_IOS_LENS_OVERLAY_GO_TO_NEW_TAB" desc="Call to action to go to a tab that has just been opened in the background.">
-        Go to tab
-      </message>
-      <message name="IDS_IOS_LENS_OVERLAY_TOOLTIP_TEXT" desc="The Lens overlay tooltip displayed text.">
-        Search your screen
-      </message>
       <message name="IDS_IOS_LINK_TO_TEXT_ERROR_DESCRIPTION" desc="Description message in the alert dialog shown when link-to-text link generation failed. [iOS only]">
         A link to the highlight can not be created.
       </message>
@@ -2759,21 +2909,18 @@
       <message name="IDS_IOS_MAGIC_STACK_SEE_MORE" desc="The See More button in Magic Stack modules to show a detailed view. [Length: 10em]">
         See more
       </message>
-      <message name="IDS_IOS_MAGIC_STACK_TURN_ON_NOTIFICATIONS" desc="The notifications opt-in button in Magic Stack modules">
-        Turn On Notifications
+      <message name="IDS_IOS_MAGIC_STACK_TIP_ADDRESS_BAR_DESCRIPTION" desc="The description of the Address Bar Position tip for the Magic Stack.">
+        Switch the position of your address bar for a customized experience.
       </message>
       <message name="IDS_IOS_MAGIC_STACK_TIP_ADDRESS_BAR_TITLE" desc="The title of the Address Bar Position tip for the Magic Stack.">
         Choose Address Bar Position
       </message>
-      <message name="IDS_IOS_MAGIC_STACK_TIP_ADDRESS_BAR_DESCRIPTION" desc="The description of the Address Bar Position tip for the Magic Stack.">
-        Switch the position of your address bar for a customized experience.
+      <message name="IDS_IOS_MAGIC_STACK_TIP_AUTOFILL_PASSWORDS_DESCRIPTION" desc="The description of the Autofill Saved Passwords tip for the Magic Stack.">
+        Quickly sign in to sites and apps with your saved passwords.
       </message>
       <message name="IDS_IOS_MAGIC_STACK_TIP_AUTOFILL_PASSWORDS_TITLE" desc="The title of the Autofill Saved Passwords tip for the Magic Stack.">
         Autofill Saved Passwords
       </message>
-      <message name="IDS_IOS_MAGIC_STACK_TIP_AUTOFILL_PASSWORDS_DESCRIPTION" desc="The description of the Autofill Saved Passwords tip for the Magic Stack.">
-        Quickly sign in to sites and apps with your saved passwords.
-      </message>
       <message name="IDS_IOS_MAGIC_STACK_TIP_AUTOFILL_PASSWORDS_TUTORIAL_STEP_1" desc="The first step of the Autofill Saved Passwords tutorial for the Magic Stack.">
         On a site where you've saved a password, tap the sign-in password field.
       </message>
@@ -2784,10 +2931,10 @@
         Tap "Use Password" to sign in securely.
       </message>
       <message name="IDS_IOS_MAGIC_STACK_TIP_CONTEXT_MENU_HIDE_CHROME_TIPS" desc="The description of the Hide Chrome Tips button located in the Chrome Tips Magic Stack context menu.">
-        Hide "<ph name= "Module_Name"><ex>Chrome Tips</ex>$1</ph>"
+        Hide "<ph name="Module_Name"><ex>Chrome Tips</ex>$1</ph>"
       </message>
       <message name="IDS_IOS_MAGIC_STACK_TIP_CONTEXT_MENU_TURN_ON_NOTIFICATIONS" desc="The description of the Turn On Chrome Tips button located in the Chrome Tips Magic Stack context menu.">
-        Turn on notifications for <ph name= "Module_Name"><ex>Chrome Tips</ex>$1</ph>
+        Turn on notifications for <ph name="Module_Name"><ex>Chrome Tips</ex>$1</ph>
       </message>
       <message name="IDS_IOS_MAGIC_STACK_TIP_GOT_IT" desc="Button label to dismiss a full-screen tip promo triggered via the Magic Stack.">
         Got It
@@ -2801,6 +2948,9 @@
       <message name="IDS_IOS_MAGIC_STACK_TIP_LENS_TRANSLATE_DESCRIPTION" desc="The description of the use Lens for translation tip for the Magic Stack.">
         Translate text in your photos or your surroundings with your camera.
       </message>
+      <message name="IDS_IOS_MAGIC_STACK_TIP_SAFE_BROWSING_DESCRIPTION" desc="The description of the Safe Browsing tip for the Magic Stack.">
+        Add an extra layer of protection against online threats.
+      </message>
       <message name="IDS_IOS_MAGIC_STACK_TIP_SAVE_PASSWORDS_TUTORIAL_STEP_1" desc="The first step of the Save Passwords tutorial for the Magic Stack.">
         Sign in to a website.
       </message>
@@ -2810,9 +2960,6 @@
       <message name="IDS_IOS_MAGIC_STACK_TIP_SAVE_PASSWORD_DESCRIPTION" desc="The description of the Save Password tip for the Magic Stack.">
         Save your passwords to easily sign in to sites and apps.
       </message>
-      <message name="IDS_IOS_MAGIC_STACK_TIP_SAFE_BROWSING_DESCRIPTION" desc="The description of the Safe Browsing tip for the Magic Stack.">
-        Add an extra layer of protection against online threats.
-      </message>
       <message name="IDS_IOS_MAGIC_STACK_TIP_SET_UP_COMPLETION_TITLE" desc="The title of the Set Up List completion for the Magic Stack.">
         You're all set up
       </message>
@@ -2822,14 +2969,8 @@
       <message name="IDS_IOS_MAGIC_STACK_TIP_TUTORIAL_TITLE" desc="The title of the full-screen tutorial for a Magic Stack tip.">
         How do I use this feature?
       </message>
-      <message name="IDS_IOS_MANAGE_STORAGE_ALERT_TITLE" desc="Title of an alert presented when the user tries to select a destination for an upload, without sufficient storage space in the destination. [iOS only]">
-        Your storage is full
-      </message>
-      <message name="IDS_IOS_MANAGE_STORAGE_ALERT_MESSAGE" desc="Message of an alert presented when the user tries to select a destination for an upload, without sufficient storage space in the destination. [iOS only]">
-        To download files, photos, and more you need more storage space.
-      </message>
-      <message name="IDS_IOS_MANAGE_STORAGE_ALERT_MANAGE_STORAGE_BUTTON" desc="Label of the primary action button in an alert presented when the user tries to select a destination for an upload, without sufficient storage space in the destination. The button opens a page where the user can manage their storage space. [iOS only] [Length: 12em]" meaning="Label of the primary action button in an alert presented when the user tries to select a destination for an upload, without sufficient storage space in the destination. The button opens a page where the user can manage their storage space. [iOS only] [Length: 12em]">
-        Manage storage
+      <message name="IDS_IOS_MAGIC_STACK_TURN_ON_NOTIFICATIONS" desc="The notifications opt-in button in Magic Stack modules">
+        Turn On Notifications
       </message>
       <message name="IDS_IOS_MANAGED_SIGNIN_ACCEPT_BUTTON" desc="The title of the Accept button of the Sign in to a managed account dialog. [40em]">
         Accept and sign in
@@ -2843,6 +2984,15 @@
       <message name="IDS_IOS_MANAGE_DATA_IN_YOUR_ACCOUNT_DESCRIPTION" desc="Subtitle for the cell to open 'Data from Chromium sync' web page where the user can control all their data data from sync.">
         Review your account data
       </message>
+      <message name="IDS_IOS_MANAGE_STORAGE_ALERT_MANAGE_STORAGE_BUTTON" desc="Label of the primary action button in an alert presented when the user tries to select a destination for an upload, without sufficient storage space in the destination. The button opens a page where the user can manage their storage space. [iOS only] [Length: 12em]" meaning="Label of the primary action button in an alert presented when the user tries to select a destination for an upload, without sufficient storage space in the destination. The button opens a page where the user can manage their storage space. [iOS only] [Length: 12em]">
+        Manage storage
+      </message>
+      <message name="IDS_IOS_MANAGE_STORAGE_ALERT_MESSAGE" desc="Message of an alert presented when the user tries to select a destination for an upload, without sufficient storage space in the destination. [iOS only]">
+        To download files, photos, and more you need more storage space.
+      </message>
+      <message name="IDS_IOS_MANAGE_STORAGE_ALERT_TITLE" desc="Title of an alert presented when the user tries to select a destination for an upload, without sufficient storage space in the destination. [iOS only]">
+        Your storage is full
+      </message>
       <message name="IDS_IOS_MANAGE_SYNC_DATA_FROM_CHROME_SYNC_DESCRIPTION" desc="Subtitle for the cell to open 'Data from Chromium sync' web page where the user can control all their data data from sync.">
         Review your synced data
       </message>
@@ -2855,24 +3005,53 @@
       <message name="IDS_IOS_MANAGE_SYNC_GOOGLE_ACTIVITY_CONTROLS_TITLE" desc="Title for the cell to open 'Google Activity Controls' dialog.">
         Google Activity Controls
       </message>
+      <message name="IDS_IOS_MANAGE_SYNC_PERSONALIZE_GOOGLE_SERVICES_DESCRIPTION" desc="This is the subtitle of a setting that directs users to other settings where they can control how Chrome history can be used to personalize other Google services. This subtitle appears in Chrome’s Advanced Sync settings, after the “Personalization &amp; linking” or “Personalization” string.">
+        Control how browsing history is used with your other data across Google services
+      </message>
       <message name="IDS_IOS_MANAGE_SYNC_PERSONALIZE_GOOGLE_SERVICES_TITLE" desc="This is the title of a setting that directs users to other settings where they can control how Chrome history can be used to personalize other Google services. It appears in Chrome’s Advanced Sync settings and is before the “Control how browsing history is used with your other data across Google services” string. [CHAR_LIMIT=30]">
         Personalization
       </message>
       <message name="IDS_IOS_MANAGE_SYNC_PERSONALIZE_GOOGLE_SERVICES_TITLE_EEA" desc="This is the title of a setting that directs users to other settings where they can control how Chrome history can be used to personalize other Google services. It appears in Chrome’s Advanced Sync settings and is before the “Control how browsing history is used with your other data across Google services” string. “Linking” refers to the ability to link Google services; this verb should align with the verb for the branded term “linked Google services” in Glossary Manager: https://localization.google.com/glossary/termset?gid=27517723&amp;tsid=517bace2. [CHAR_LIMIT=30]">
         Personalization &amp; linking
       </message>
-      <message name="IDS_IOS_MANAGE_SYNC_PERSONALIZE_GOOGLE_SERVICES_DESCRIPTION" desc="This is the subtitle of a setting that directs users to other settings where they can control how Chrome history can be used to personalize other Google services. This subtitle appears in Chrome’s Advanced Sync settings, after the “Personalization &amp; linking” or “Personalization” string.">
-        Control how browsing history is used with your other data across Google services
-      </message>
       <message name="IDS_IOS_MANAGE_SYNC_SETTINGS_TITLE" desc="Title for the view in the Settings for enabling/disabling Sync. [iOS only]">
         Manage Sync
       </message>
       <message name="IDS_IOS_MANAGE_YOUR_GOOGLE_ACCOUNT_TITLE" desc="Title for the view in the Settings to open 'Google Account' web page.">
         Manage your Google Account
       </message>
+      <message name="IDS_IOS_MANUAL_FALLBACK_ADDRESS_CELL_INDEX" desc="Accessibility label for the address suggestions in the manual fallback view to indicate the position of the address suggestion in the list of address suggestions.">
+        {count, plural,
+             =1 {{position} of {count} address}
+             other {{position} of {count} addresses}}
+      </message>
       <message name="IDS_IOS_MANUAL_FALLBACK_ADD_PAYMENT_METHOD" desc="The title for the button in the manual fallback UI that takes the user to the add new credit card screen through settings. In this screen, the user can input their card details and save them.">
         Add payment method…
       </message>
+      <message name="IDS_IOS_MANUAL_FALLBACK_AUTOFILL_FORM_BUTTON_ACCESSIBILITY_LABEL" desc="Accessibility label for the button displayed in the password, payment method and address manual fallback cells, which allows the user to fill the current form with the autofill data. In contrast to all the other buttons on this screen (which fill a field), this button fills the entire form. This label is ending with the accessibility label of the cell the button is displayed in.">
+        Autofill form with <ph name="CELL_ACCESSIBILITY_LABEL">$1<ex>1 of 3 passwords, twitter.com</ex></ph>
+      </message>
+      <message name="IDS_IOS_MANUAL_FALLBACK_AUTOFILL_FORM_BUTTON_TITLE" desc="Title of the button displayed in the password, payment method and address manual fallback cells, which allows the user to fill the current form with the autofill data. In contrast to all the other buttons on this screen (which fill a field), this button fills the entire form.">
+        Autofill form
+      </message>
+      <message name="IDS_IOS_MANUAL_FALLBACK_CARDHOLDER_CHIP_ACCESSIBILITY_LABEL" desc="Accessibility label for the cardholder chip button displayed in the payment method manual fallback screen and that's allowing the user to autofill a specific form field with their payment method's cardholder'.">
+        Autofill the cardholder <ph name="NAME">$1<ex>Jane Doe</ex></ph>
+      </message>
+      <message name="IDS_IOS_MANUAL_FALLBACK_CARD_NUMBER_CHIP_ACCESSIBILITY_LABEL" desc="Accessibility label for the card number chip button displayed in the payment method manual fallback screen and that's allowing the user to autofill a specific form field with their card number.">
+        Autofill the card number ending in <ph name="LAST_DIGITS">$1<ex>1234</ex></ph>
+      </message>
+      <message name="IDS_IOS_MANUAL_FALLBACK_CHIP_ACCESSIBILITY_LABEL" desc="Accessibility label for the chip buttons displayed in the manual fallback screen and that are allowing the user to autofill a specific form field. This label will be followed by the title of the chip button (e.g., 'Autofill janedoe@google.com' for an email address chip).">
+        Autofill <ph name="VALUE">$1<ex>Jane</ex></ph>
+      </message>
+      <message name="IDS_IOS_MANUAL_FALLBACK_CVC_CHIP_ACCESSIBILITY_LABEL" desc="Accessibility label for the CVC chip button displayed in the payment method manual fallback screen and that's allowing the user to autofill a specific form field with their payment method's CVC.">
+        Autofill the CVC
+      </message>
+      <message name="IDS_IOS_MANUAL_FALLBACK_EXPIRATION_MONTH_CHIP_ACCESSIBILITY_LABEL" desc="Accessibility label for the expiration month chip button displayed in the payment method manual fallback screen and that's allowing the user to autofill a specific form field with their payment method's expiration month.">
+        Autofill the expiration month <ph name="MONTH">$1<ex>04</ex></ph>
+      </message>
+      <message name="IDS_IOS_MANUAL_FALLBACK_EXPIRATION_YEAR_CHIP_ACCESSIBILITY_LABEL" desc="Accessibility label for the expiration year chip button displayed in the payment method manual fallback screen and that's allowing the user to autofill a specific form field with their payment method's expiration year.">
+        Autofill the expiration year <ph name="YEAR">$1<ex>26</ex></ph>
+      </message>
       <message name="IDS_IOS_MANUAL_FALLBACK_MANAGE_ADDRESSES" desc="The title for the button in the manual fallback UI that takes the user to the addresses settings. In this screen they see all the addresses and can erase them. [30em]">
         Manage addresses…
       </message>
@@ -2909,6 +3088,19 @@
       <message name="IDS_IOS_MANUAL_FALLBACK_NO_USERNAME" desc="The title for disabled buttons on the manual fallback passwords UI when a credential doesn't contains a username. [30em]">
         No username
       </message>
+      <message name="IDS_IOS_MANUAL_FALLBACK_PASSWORD_CELL_INDEX" desc="Accessibility label for the password suggestions in the manual fallback view to indicate the position of the password suggestion in the list of password suggestions.">
+        {count, plural,
+             =1 {{position} of {count} password}
+             other {{position} of {count} passwords}}
+      </message>
+      <message name="IDS_IOS_MANUAL_FALLBACK_PASSWORD_CHIP_ACCESSIBILITY_LABEL" desc="Accessibility label for the password chip button displayed in the password manual fallback screen and that's allowing the user to autofill their password on a specific form field.">
+        Autofill the password
+      </message>
+      <message name="IDS_IOS_MANUAL_FALLBACK_PAYMENT_CELL_INDEX" desc="Accessibility label for the payment method suggestions in the manual fallback view to indicate the position of the payment method suggestion in the list of payment method suggestions.">
+        {count, plural,
+             =1 {{position} of {count} payment method}
+             other {{position} of {count} payment methods}}
+      </message>
       <message name="IDS_IOS_MANUAL_FALLBACK_SELECT_PASSWORD_DIALOG_MESSAGE" desc="The contents of a dialog asking the user to confirm they trust the current site before selecting a saved password to fill.">
         If you trust <ph name="SITE">$1<ex>example.com</ex></ph>, you can use a saved password to sign in.
       </message>
@@ -2921,18 +3113,21 @@
       <message name="IDS_IOS_MANUAL_FALLBACK_SHOW_ADDRESSES" desc="Label for the addresses icon in manual fallback. Read by Text To Speech" meaning="Voice Over will read this to the user followed by 'Button' when this button is focused.">
         Addresses
       </message>
-      <message name="IDS_IOS_MANUAL_FALLBACK_SHOW_PAYMENT_METHODS" desc="Label for the payment methods icon in manual fallback. Read by Text To Speech" meaning="Voice Over will read this to the user followed by 'Button' when this button is focused.">
-        Payment methods
-      </message>
       <message name="IDS_IOS_MANUAL_FALLBACK_SHOW_KEYBOARD" desc="Label for the keyboard icon in manual fallback. Read by Text To Speech" meaning="Voice Over will read this to the user followed by 'button' when this button is focused.">
         Keyboard
       </message>
       <message name="IDS_IOS_MANUAL_FALLBACK_SHOW_PASSWORDS" desc="Label for the password icon in manual fallback. Read by Text To Speech" meaning="Voice Over will read this to the user followed by 'button' when this button is focused.">
         Passwords
       </message>
+      <message name="IDS_IOS_MANUAL_FALLBACK_SHOW_PAYMENT_METHODS" desc="Label for the payment methods icon in manual fallback. Read by Text To Speech" meaning="Voice Over will read this to the user followed by 'Button' when this button is focused.">
+        Payment methods
+      </message>
       <message name="IDS_IOS_MANUAL_FALLBACK_SUGGEST_STRONG_PASSWORD_WITH_DOTS" desc="The title for the button in the manual fallback passwords UI that is used to trigger password generation on the active field. 'Strong' refers to the fact that the password is randomly-generated, and thus hard to guess and unlikely to be reused. [30em]">
         Suggest strong password…
       </message>
+      <message name="IDS_IOS_MANUAL_FALLBACK_THREE_DOT_MENU_BUTTON_ACCESSIBILITY_LABEL" desc="Accessibility label for the 3-dot menu button displayed in the manual fallback entity cells, which allows to take action on the entity (e.g., edit the entity). This label is ending with the accessibility label of the cell the button is displayed in.">
+        More options for <ph name="CELL_ACCESSIBILITY_LABEL">$1<ex>1 of 3 passwords, twitter.com</ex></ph>
+      </message>
       <message name="IDS_IOS_MICROPHONE_USAGE_DESCRIPTION" desc="Specifies the reason for accessing the user's microphone while the app is in use [Length: unlimited] [iOS only].">
         This lets you search using your voice
       </message>
@@ -3011,18 +3206,15 @@
       <message name="IDS_IOS_NEW_TAB_RECENT_TABS" desc="The header of the panel containing the list of recently closed tabs and the tabs synced from other devices.[Length: 17em]">
         Recent tabs
       </message>
-      <message name="IDS_IOS_NOTIFICATIONS_TITLE" desc="Title for Notifications settings menu.">
-        Notifications
-      </message>
-      <message name="IDS_IOS_NOTIFICATIONS_ALERT_TITLE" desc="Title for the Notifications UI Alert Prompt that redirects the user to the iOS push notifications permission page">
-        Turn on notifications?
-      </message>
       <message name="IDS_IOS_NOTIFICATIONS_ALERT_CANCEL" desc="The label for the alert's cancel button">
         No, thanks
       </message>
       <message name="IDS_IOS_NOTIFICATIONS_ALERT_GO_TO_SETTINGS" desc="The label for the alert's redirect to the iOS Settings.">
         Go to Settings…
       </message>
+      <message name="IDS_IOS_NOTIFICATIONS_ALERT_TITLE" desc="Title for the Notifications UI Alert Prompt that redirects the user to the iOS push notifications permission page">
+        Turn on notifications?
+      </message>
       <message name="IDS_IOS_NOTIFICATIONS_CONFIRMATION_MESSAGE" desc="The snackbar message that confirms that notifications have been turned on.">
         <ph name="FEATURE_NAME">$1<ex>Chromium Tips</ex></ph> notifications turned on
       </message>
@@ -3032,6 +3224,9 @@
       <message name="IDS_IOS_NOTIFICATIONS_MANAGE_SETTINGS" desc="The label for a button that takes the user to the app's Notifications Settings page.">
         Manage
       </message>
+      <message name="IDS_IOS_NOTIFICATIONS_OPT_IN_ENABLE_BUTTON" desc="The text for the button in notifications opt-in screen that enables the selected notifications.">
+        Turn on notifications
+      </message>
       <message name="IDS_IOS_NOTIFICATIONS_OPT_IN_PRICE_TRACKING_TOGGLE_MESSAGE" desc="The label for the notification opt-in toggle message for price tracking notifications.">
         Receive price drop alerts for products you track.
       </message>
@@ -3041,9 +3236,6 @@
       <message name="IDS_IOS_NOTIFICATIONS_OPT_IN_TITLE" desc="The title of the screen that prompts to select which notifications to opt-in to.">
         Choose the notifications you want to receive
       </message>
-      <message name="IDS_IOS_NOTIFICATIONS_OPT_IN_ENABLE_BUTTON" desc="The text for the button in notifications opt-in screen that enables the selected notifications.">
-        Turn on notifications
-      </message>
       <message name="IDS_IOS_NOTIFICATIONS_TIPS_ENHANCED_SAFE_BROWSING_BODY" desc="Text for the body of a Tips notification that encourages the user to enable Enhanced Safe Browsing">
         Add an extra layer of protection against online threats.
       </message>
@@ -3053,6 +3245,9 @@
       <message name="IDS_IOS_NOTIFICATIONS_TIPS_OMNIBOX_POSITION_BODY" desc="Text for the body of a Tips notification that reminds the user to set their preferred omnibox position">
         Switch the position of your address bar for a customized experience.
       </message>
+      <message name="IDS_IOS_NOTIFICATIONS_TITLE" desc="Title for Notifications settings menu.">
+        Notifications
+      </message>
       <message name="IDS_IOS_NTP_FEED_SIGNIN_FULL_PROMO_BODY" desc="The text on the body of the new tab page Feed Signin Promo, explaining that users will see more relevant content if they enable sync. [iOS only]">
         Sync for the most relevant content based on your interests.
       </message>
@@ -3089,6 +3284,12 @@
       <message name="IDS_IOS_OMNIBOX_PEDAL_SUBTITLE_VIEW_CHROME_HISTORY" desc="Subtitle for the View Your Chrome History acceleration pedal in the omnibox that should correspond to the path to History">
        Menu → History
       </message>
+      <message name="IDS_IOS_OMNIBOX_PLACEHOLDER_IMAGE_SEARCH" desc="The placeholder text displayed in the omnibox to refine an image search.">
+       Add to your search
+      </message>
+      <message name="IDS_IOS_OMNIBOX_PLACEHOLDER_SEARCH_ONLY" desc="The placeholder text of the omnibox in search only mode.">
+        Search <ph name="SEARCH_PROVIDER">$1<ex>Google</ex></ph>
+      </message>
       <message name="IDS_IOS_OMNIBOX_POPUP_APPEND" desc="Label for the accessibility action for the address and search bar autocomplete suggestion. It replaces the text in the search bar by the suggestion. [Read by Text-to-Speech]">
         Refine
       </message>
@@ -3107,12 +3308,6 @@
       <message name="IDS_IOS_OMNIBOX_POSITION_PROMO_VALIDATE" desc="Text in the validation button of the omnibox position choice screen promo.">
        Set position
       </message>
-      <message name="IDS_IOS_OMNIBOX_PLACEHOLDER_IMAGE_SEARCH" desc="The placeholder text displayed in the omnibox to refine an image search.">
-       Add to your search
-      </message>
-      <message name="IDS_IOS_OMNIBOX_PLACEHOLDER_SEARCH_ONLY" desc="The placeholder text of the omnibox in search only mode.">
-        Search <ph name="SEARCH_PROVIDER">$1<ex>Google</ex></ph>
-      </message>
       <message name="IDS_IOS_OPEN_ANOTHER_APP_ALLOW" desc="Text on the button, when tapped will allow opening an external application. [iOS only]">
        Allow
       </message>
@@ -3131,12 +3326,6 @@
       <message name="IDS_IOS_OPEN_CHROME_SETTINGS" desc="Text of the primary button to open chrome settings page. [iOS only]">
         Open Settings
       </message>
-      <message name="IDS_IOS_OPEN_PASSWORD_MANAGER" desc="Text of the primary button to open chrome password manager. [iOS only]">
-        Open Password Manager
-      </message>
-      <message name="IDS_IOS_OPEN_PDF" desc="Label of the button that lets users open a pdf file in chrome. [Length: 15em] [iOS only]">
-        Open
-      </message>
       <message name="IDS_IOS_OPEN_IN" desc="Label of the button that lets users open a document in another application. [Length: 15em] [iOS only]">
         Open in…
       </message>
@@ -3161,6 +3350,12 @@
       <message name="IDS_IOS_OPEN_IOS_SETTINGS" desc="Text of the primary button to open iOS settings page. [iOS only]">
         Go to Settings…
       </message>
+      <message name="IDS_IOS_OPEN_PASSWORD_MANAGER" desc="Text of the primary button to open chrome password manager. [iOS only]">
+        Open Password Manager
+      </message>
+      <message name="IDS_IOS_OPEN_PDF" desc="Label of the button that lets users open a pdf file in chrome. [Length: 15em] [iOS only]">
+        Open
+      </message>
       <message name="IDS_IOS_OPEN_REPEATEDLY_ANOTHER_APP" desc="Alert to let the user know that the website is trying repeatedly to open another application. [iOS only]">
         This site is repeatedly trying to open another application.
       </message>
@@ -3395,12 +3590,12 @@
       <message name="IDS_IOS_OVERSCROLL_RELOAD_LABEL" desc="The text to use for the tooltip for the overscroll reload action. [Length: 20em] [iOS only]">
         Reload
       </message>
-      <message name="IDS_IOS_PAGE_INFO_CONNECTION" desc="Title of the button opening the connection information (in page info)">
-        Connection
-      </message>
       <message name="IDS_IOS_PAGE_INFO_ABOUT_THIS_PAGE" desc="Title of the button opening the About This Page (in page info)">
         About this page
       </message>
+      <message name="IDS_IOS_PAGE_INFO_CONNECTION" desc="Title of the button opening the connection information (in page info)">
+        Connection
+      </message>
       <message name="IDS_IOS_PAGE_INFO_OFFLINE_PAGE" desc="Message to display in the page info when the page you are on is an offline page.">
         This page has been saved to your Reading List.
       </message>
@@ -3551,6 +3746,9 @@
       <message name="IDS_IOS_PARTIAL_TRANSLATE_SWITCH_FULL_PAGE_TRANSLATION" desc="Title of the alert proposing to switch to full page translation if partial translate fails.">
         Switch to full Page translation
       </message>
+      <message name="IDS_IOS_PASSKEY_CREATION_DATE" desc="Passkey creation date. [iOS only]">
+        Created on <ph name="Date"><ex>2023/12/31</ex>$1</ph>
+      </message>
       <message name="IDS_IOS_PASSWORD_BOTTOM_SHEET_CONTINUE" desc="The action button to use the selected credentials to fill the username on a username only form without password.">
         Continue
       </message>
@@ -3601,7 +3799,7 @@
       <message name="IDS_IOS_PASSWORD_CHECKUP_HOMEPAGE_COMPROMISED_PASSWORDS_SUBTITLE" desc="Subitle for the compromised passwords item in the Password Checkup Homepage when there are compromised passwords. [iOS only]">
         You should change these now
       </message>
-      <message name="IDS_IOS_PASSWORD_CHECKUP_HOMEPAGE_COMPROMISED_PASSWORDS_TITLE" desc="Title for the compromised passwords item in the Password Checkup Homepage. [Length: 16em] [iOS only]" >
+      <message name="IDS_IOS_PASSWORD_CHECKUP_HOMEPAGE_COMPROMISED_PASSWORDS_TITLE" desc="Title for the compromised passwords item in the Password Checkup Homepage. [Length: 16em] [iOS only]">
         {count, plural,
           =0 {No compromised passwords}
           =1 {{count} compromised password}
@@ -3777,6 +3975,29 @@
       <message name="IDS_IOS_PASSWORD_SETTINGS_CHANGE_PIN_SET_UP_PASSCODE_CONTENT" desc="Message informing the user that in order to change their password manager PIN, a passcode or screen lock needs to be set up on the device. [iOS only]">
         To change your PIN, first set up a passcode on your device.
       </message>
+      <message name="IDS_IOS_PASSWORD_SETTINGS_CREDENTIAL_DELETION_TEXT" desc="Section title in password settings, explaining to the user what data will be deleted. [iOS Only]">
+        Passwords, passkeys, and other data will be permanently deleted from Google Password Manager
+      </message>
+      <message name="IDS_IOS_PASSWORD_SETTINGS_DELETE_ALL_CREDENTIALS_DESCRIPTION" desc="Description of the confirmation alert when the user tap delete all data button. [iOS only]">
+        {password, plural,
+               =0 {{passkey, plural,
+                        =1 {If you continue, your 1 passkey and other data will be permanently deleted from Google Password Manager. Any accounts you created for sites or apps won't be deleted.}
+                        other {If you continue, your {passkey} passkeys and other data will be permanently deleted from Google Password Manager. Any accounts you created for sites or apps won't be deleted.}}}
+               =1 {{passkey, plural,
+                        =0 {If you continue, your 1 password and other data will be permanently deleted from Google Password Manager. Any accounts you created for sites or apps won't be deleted.}
+                        =1 {If you continue, your 1 password, 1 passkey, and other data will be permanently deleted from Google Password Manager. Any accounts you created for sites or apps won't be deleted.}
+                        other {If you continue, your 1 password, {passkeys} passkeys, and other data will be permanently deleted from Google Password Manager. Any accounts you created for sites or apps won't be deleted.}}}
+               other {{passkey, plural,
+                           =0 {If you continue, your {password} passwords and other data will be permanently deleted from Google Password Manager. Any accounts you created for sites or apps won't be deleted.}
+                           =1 {If you continue, your {password} passwords, 1 passkey, and other data will be permanently deleted from Google Password Manager. Any accounts you created for sites or apps won't be deleted.}
+                           other {If you continue, your {password} passwords, {passkey} passkeys, and other data will be permanently deleted from Google Password Manager. Any accounts you created for sites or apps won't be deleted.}}}}
+      </message>
+      <message name="IDS_IOS_PASSWORD_SETTINGS_DELETE_ALL_CREDENTIALS_TITLE" desc="Title of the confirmation alert when the user tap delete all data button. [iOS only]">
+        You're about to delete your Google Password Manager data
+      </message>
+      <message name="IDS_IOS_PASSWORD_SETTINGS_DELETE_ALL_SAVED_CREDENTIALS" desc="Button that user can press to delete all saved credentials. [iOS only]">
+        Delete all data
+      </message>
       <message name="IDS_IOS_PASSWORD_SETTINGS_GOOGLE_PASSWORD_MANAGER_PIN_DESCRIPTION" desc="Help text explaining the functionality of a PIN for Google Password Manager. Refer to Glossary for the meaning of 'passkey', do not translate it as 'password'. [iOS Only]">
         Helps you access saved passkeys on any device
       </message>
@@ -3798,26 +4019,6 @@
       <message name="IDS_IOS_PASSWORD_SETTINGS_ON_DEVICE_ENCRYPTION_SET_UP" desc="Section title in settings &gt; password, allowing user to opt-in. [iOS Only]">
         Set up…
       </message>
-      <message name="IDS_IOS_PASSWORD_SETTINGS_CREDENTIAL_DELETION_TEXT" desc="Section title in password settings, explaining to the user what data will be deleted. [iOS Only]">
-        Passwords, passkeys, and other data will be permanently deleted from Google Password Manager
-      </message>
-      <message name="IDS_IOS_PASSWORD_SETTINGS_DELETE_ALL_CREDENTIALS_TITLE" desc="Title of the confirmation alert when the user tap delete all data button. [iOS only]">
-        You're about to delete your Google Password Manager data
-      </message>
-      <message name="IDS_IOS_PASSWORD_SETTINGS_DELETE_ALL_CREDENTIALS_DESCRIPTION" desc="Description of the confirmation alert when the user tap delete all data button. [iOS only]">
-        {password, plural,
-               =0 {{passkey, plural,
-                        =1 {If you continue, your 1 passkey and other data will be permanently deleted from Google Password Manager. Any accounts you created for sites or apps won't be deleted.}
-                        other {If you continue, your {passkey} passkeys and other data will be permanently deleted from Google Password Manager. Any accounts you created for sites or apps won't be deleted.}}}
-               =1 {{passkey, plural,
-                        =0 {If you continue, your 1 password and other data will be permanently deleted from Google Password Manager. Any accounts you created for sites or apps won't be deleted.}
-                        =1 {If you continue, your 1 password, 1 passkey, and other data will be permanently deleted from Google Password Manager. Any accounts you created for sites or apps won't be deleted.}
-                        other {If you continue, your 1 password, {passkeys} passkeys, and other data will be permanently deleted from Google Password Manager. Any accounts you created for sites or apps won't be deleted.}}}
-               other {{passkey, plural,
-                           =0 {If you continue, your {password} passwords and other data will be permanently deleted from Google Password Manager. Any accounts you created for sites or apps won't be deleted.}
-                           =1 {If you continue, your {password} passwords, 1 passkey, and other data will be permanently deleted from Google Password Manager. Any accounts you created for sites or apps won't be deleted.}
-                           other {If you continue, your {password} passwords, {passkey} passkeys, and other data will be permanently deleted from Google Password Manager. Any accounts you created for sites or apps won't be deleted.}}}}
-      </message>
       <message name="IDS_IOS_PASSWORD_SETTINGS_PASSWORD_PLACEHOLDER_TEXT" desc="Placeholder text for the password field when adding a new credential manually via settings [Length: 10em]">
         password
       </message>
@@ -3982,12 +4183,12 @@
       <message name="IDS_IOS_PERMISSIONS_MICROPHONE" desc="Usually used to show whether user has enabled a site's permission to use the device microphone.">
         Microphone
       </message>
-      <message name="IDS_IOS_PERSONALIZE_GOOGLE_SERVICES_WAA_TITLE" desc="This string is found on a link in Chrome’s Advanced Sync settings. When the user taps it, the link takes the user to “Web &amp; App Activity” in the Google Account’s Activity Controls. The link is on a subpage from Chrome’s Advanced Sync settings. This text should match the branded term “Web &amp; App Activity” in Glossary Manager: https://localization.google.com/glossary/termset?gid=27517723&amp;tsid=77d3b75.">
-        Web &amp; App activity
-      </message>
       <message name="IDS_IOS_PERSONALIZE_GOOGLE_SERVICES_LINKED_SERVICES_TITLE" desc="This string is found on a subpage from Chrome’s Advanced Sync settings. When the user taps it, the link takes the user to “Linked Google services” in the Google Account’s Data &amp; privacy settings. The link is on a setting that users see in Chrome’s Advanced Sync settings. This text should match the branded term “linked Google services” in Glossary Manager: https://localization.google.com/glossary/termset?gid=27517723&amp;tsid=517bace2.">
         Linked Google services
       </message>
+      <message name="IDS_IOS_PERSONALIZE_GOOGLE_SERVICES_WAA_TITLE" desc="This string is found on a link in Chrome’s Advanced Sync settings. When the user taps it, the link takes the user to “Web &amp; App Activity” in the Google Account’s Activity Controls. The link is on a subpage from Chrome’s Advanced Sync settings. This text should match the branded term “Web &amp; App Activity” in Glossary Manager: https://localization.google.com/glossary/termset?gid=27517723&amp;tsid=77d3b75.">
+        Web &amp; App activity
+      </message>
       <message name="IDS_IOS_PHONE_CALL_BUTTON" desc="Text in the confirmation dialog button that will initiate a phone call for the presented number. [Length: 10em] [iOS only]">
         Call
       </message>
@@ -3997,12 +4198,12 @@
       <message name="IDS_IOS_PHONE_NUMBER_ADD_TO_CONTACTS" desc="Title for the action prompting the user to a phone number to their contacts">
         Add to contacts
       </message>
-      <message name="IDS_IOS_PHONE_NUMBER_CANCEL" desc="Title for the button to dismiss the country code view controller">
-        Cancel
-      </message>
       <message name="IDS_IOS_PHONE_NUMBER_CALL" desc="Title for the action prompting the user to call a phone number">
         Call
       </message>
+      <message name="IDS_IOS_PHONE_NUMBER_CANCEL" desc="Title for the button to dismiss the country code view controller">
+        Cancel
+      </message>
       <message name="IDS_IOS_PHONE_NUMBER_COUNTRY_CODE" desc="Title of the country code view controller, this view will provide the user with a list of country codes that the user can choose one to add as a prefix of a phone number" meaning="Title of the country code view controller, this view will provide the user with a list of country codes that the user can choose one to add as a prefix of a phone number">
         Country code
       </message>
@@ -4087,6 +4288,9 @@
       <message name="IDS_IOS_POST_RESTORE_SIGN_IN_FULLSCREEN_SECONDARY_ACTION" desc="The secondary action text of the fullscreen, post restore sign-in promo. [iOS only]">
         Don't sign in
       </message>
+      <message name="IDS_IOS_PRICE_INSIGHTS_PRICE_TRACK_UNSUBSCRIBE_ERROR_ALERT_DESCRIPTION" desc="The description that informs the user that an error occurred during the price tracking unsubscription process.">
+          Couldn't untrack the price.
+      </message>
       <message name="IDS_IOS_PRICE_NOTIFICAITONS_PRICE_TRACK_TRACKABLE_ITEM_IS_TRACKED" desc="Table element description explaining that the current website contains an item that the user is already tracking">
         You're already tracking this product.
       </message>
@@ -4129,9 +4333,6 @@
       <message name="IDS_IOS_PRICE_NOTIFICATIONS_PRICE_TRACK_SUBSCRIBE_ERROR_ALERT_DESCRIPTION" desc="The description that informs the user that an error occurred during the price tracking subscription process.">
           Couldn't track the price.
       </message>
-      <message name="IDS_IOS_PRICE_INSIGHTS_PRICE_TRACK_UNSUBSCRIBE_ERROR_ALERT_DESCRIPTION" desc="The description that informs the user that an error occurred during the price tracking unsubscription process.">
-          Couldn't untrack the price.
-      </message>
       <message name="IDS_IOS_PRICE_NOTIFICATIONS_PRICE_TRACK_TITLE" desc="Title for Price Notifications table view.">
         Price Tracking
       </message>
@@ -4162,36 +4363,6 @@
       <message name="IDS_IOS_PRICE_NOTIFICATIONS_SETTINGS_ALERT_TITLE" desc="Title for Price Notifications UI Alert Prompt displayed from the settings menu that redirects the user to the iOS push notifications permission page.">
           Turn on price alerts?
       </message>
-      <message name="IDS_IOS_CONTENT_SUGGESTIONS_PRICE_TRACKING_PROMO_ALLOW" desc="Label indicating user can allow price tracking notifications">
-          Allow price tracking notifications…
-      </message>
-      <message name="IDS_IOS_CONTENT_SUGGESTIONS_PRICE_TRACKING_PROMO_DESCRIPTION" desc="Description for Price Tracking Promotion in Magic Stack">
-          Keep up with price drops on all the products you track.
-      </message>
-      <message name="IDS_IOS_CONTENT_SUGGESTIONS_PRICE_TRACKING_PROMO_TITLE" desc="Title for Price Tracking Promotion in Magic Stack">
-          Get price tracking notifications
-      </message>
-      <message name="IDS_IOS_CONTENT_SUGGESTIONS_PRICE_TRACKING_PROMO_SNACKBAR_TITLE" desc="Snackbar title indicating price tracking notifications have been turned on">
-          Price tracking notifications turned on
-      </message>
-      <message name="IDS_IOS_CONTENT_SUGGESTIONS_PRICE_TRACKING_PROMO_SETTINGS_TURN_ON_NOTIFICATIONS_TITLE" desc="Title indicating the user needs to go to settings to turn on notifications (because they have previously turned it off)">
-          Turn on notifications?
-      </message>
-      <message name="IDS_IOS_CONTENT_SUGGESTIONS_PRICE_TRACKING_PROMO_SETTINGS_TURN_ON_NOTIFICATIONS_TEXT" desc="Text indicating the user needs to go to settings to turn on notifications (because they have previously turned it off)">
-          To get price tracking notifications, turn on notifications in your iOS Settings.
-      </message>
-      <message name="IDS_IOS_CONTENT_SUGGESTIONS_PRICE_TRACKING_PROMO_SETTINGS_TURN_ON_NOTIFICATIONS_ACCEPT" desc="Button text indicating the user can accept turning on price tracking notifications in settings">
-          Go to Settings...
-      </message>
-      <message name="IDS_IOS_CONTENT_SUGGESTIONS_PRICE_TRACKING_PROMO_SETTINGS_TURN_ON_NOTIFICATIONS_DENY" desc="Button text indicating the user can deny turning on price tracking notifications in settings">
-          No, Thanks
-      </message>
-      <message name="IDS_IOS_CONTENT_SUGGESTIONS_PRICE_TRACKING_PROMO_HIDE_CARD" desc="Button text indicating price tracking promo module can be removed">
-        Hide "Get Price Tracking Notifications"
-      </message>
-      <message name="IDS_IOS_CONTENT_SUGGESTIONS_PRICE_TRACKING_PROMO_SNACKBAR_MANAGE" desc="Snackbar action enabling management of price tracking notifications">
-          Manage
-      </message>
       <message name="IDS_IOS_PRINT_PDF_ERROR_SUBTITLE" desc="Message of a popup window indicating that the printing operation did not succeed. [Length: 100em] [iOS only]">
         Make sure you have a network connection, and try again.
       </message>
@@ -4213,12 +4384,12 @@
       <message name="IDS_IOS_PRIVACY_GUIDE_HISTORY_SYNC_ACROSS_DEVICES" desc="Bullet point for the 'History sync' switch in the 'When on' section">
         You'll have your history on all your synced devices so you can continue what you were doing
       </message>
-      <message name="IDS_IOS_PRIVACY_GUIDE_HISTORY_SYNC_GOOGLE_SEARCH" desc="Bullet point for the 'History sync' switch in the 'When on' section">
-        If Google is also your default search engine, you'll see better, contextually relevant suggestions
-      </message>
       <message name="IDS_IOS_PRIVACY_GUIDE_HISTORY_SYNC_GOOGLE_ACCOUNT" desc="Bullet point for the 'History sync' switch in the 'Things to consider' section">
         The URLs you visit are saved to your Google Account
       </message>
+      <message name="IDS_IOS_PRIVACY_GUIDE_HISTORY_SYNC_GOOGLE_SEARCH" desc="Bullet point for the 'History sync' switch in the 'When on' section">
+        If Google is also your default search engine, you'll see better, contextually relevant suggestions
+      </message>
       <message name="IDS_IOS_PRIVACY_GUIDE_LETS_GO_BUTTON" desc="Text for the 'Let's go' button on the Welcome step of the Privacy Guide.">
         Let's go
       </message>
@@ -4261,12 +4432,12 @@
       <message name="IDS_IOS_PRIVACY_SAFE_BROWSING_ENHANCED_PROTECTION_FRIENDLIER_SUMMARY" desc="Friendlier summary for Privacy Safe Browsing enhanced protection mode.">
         Real-time, proactive protection against dangerous sites, downloads, and extensions that’s based on your browsing data getting sent to Google
       </message>
-      <message name="IDS_IOS_PRIVACY_SAFE_BROWSING_ENHANCED_PROTECTION_SUMMARY_UPDATED" desc="Summary for Privacy Safe Browsing enhanced protection mode.">
-        Real-time, AI-powered protection against dangerous sites, downloads, and extensions that’s based on your browsing data getting sent to Google
-      </message>
       <message name="IDS_IOS_PRIVACY_SAFE_BROWSING_ENHANCED_PROTECTION_SUMMARY" desc="Summary for Privacy Safe Browsing enhanced protection mode.">
         Faster, proactive protection against dangerous websites, downloads, and extensions. Warns you about password breaches. Requires browsing data to be sent to Google.
       </message>
+      <message name="IDS_IOS_PRIVACY_SAFE_BROWSING_ENHANCED_PROTECTION_SUMMARY_UPDATED" desc="Summary for Privacy Safe Browsing enhanced protection mode.">
+        Real-time, AI-powered protection against dangerous sites, downloads, and extensions that’s based on your browsing data getting sent to Google
+      </message>
       <message name="IDS_IOS_PRIVACY_SAFE_BROWSING_ENHANCED_PROTECTION_TITLE" desc="Title for Privacy Safe Browsing enhanced protection mode.">
         Enhanced protection
       </message>
@@ -4315,13 +4486,13 @@
       <message name="IDS_IOS_PROMINENCE_NOTIFICATION_SETTINGS_NOTIFICATION_CENTER_TEXT" desc="Text in contextual image of prominent notification settings alert matching the 'Notification Center' selection in the app notification settings page. [iOS only]">
         Notification Center
       </message>
-            <message name="IDS_IOS_PROMINENCE_NOTIFICATION_SETTINGS_OPEN_SETTINGS_BUTTON" desc="Button text in prominence notification alert that takes users to the app's notification setting. [iOS only]">
-            Go to Settings...
-      </message>
             <message name="IDS_IOS_PROMINENCE_NOTIFICATION_SETTINGS_NO_THANKS_BUTTON" desc="Button text in prominence notification alert for the user to say 'No thanks'. [iOS only]">
             No thanks
       </message>
-      <message name="IDS_IOS_PROMOS_MANAGER_ALERT_PROMO_DEFAULT_CANCEL_BUTTON_TEXT" desc="The default text for the cancel button alert promo. [iOS only]">
+      <message name="IDS_IOS_PROMINENCE_NOTIFICATION_SETTINGS_OPEN_SETTINGS_BUTTON" desc="Button text in prominence notification alert that takes users to the app's notification setting. [iOS only]">
+            Go to Settings...
+      </message>
+            <message name="IDS_IOS_PROMOS_MANAGER_ALERT_PROMO_DEFAULT_CANCEL_BUTTON_TEXT" desc="The default text for the cancel button alert promo. [iOS only]">
         Cancel
       </message>
       <message name="IDS_IOS_PROMOS_MANAGER_ALERT_PROMO_DEFAULT_PRIMARY_BUTTON_TEXT" desc="The default text for the primary button alert promo. [iOS only]">
@@ -4775,9 +4946,6 @@
       <message name="IDS_IOS_SAVE_PASSWORD_TO_ACCOUNT_STORE_DESCRIPTION" desc="Description of save password in google account action. [iOS only]" meaning="Telling user that current password is in local device store and suggesting moving it to their google account store.">
         This password is saved only to this device. To use it on your other devices, save it in your Google Account, <ph name="EMAIL">$1<ex>johndoe@gmail.com</ex></ph>.
       </message>
-      <message name="IDS_IOS_SAVE_TO_DRIVE_ACCOUNT_PICKER_TITLE" desc="Dialog title to invite the user to pick a destination for their download (e.g. Files or Drive) and if applicable (e.g. they choose Drive) an account to save a file as. [iOS only]">
-        Save in…
-      </message>
       <message name="IDS_IOS_SAVE_TO_DRIVE_ACCOUNT_PICKER_BODY" desc="Text when a user attempts to download a file and is eligible to save it to Google Drive, then is presented with the account picker dialog to select a destination for their download, and if applicable e.g. they choose Drive as a destination, which account they want to use to save the file. [iOS only]" meaning="Text when a user attempts to download a file and is eligible to save it to Google Drive, then is presented with the account picker dialog to select a destination for their download, and if applicable e.g. they choose Drive as a destination, which account they want to use to save the file. [iOS only]">
         Choose where to save <ph name="FILENAME">$1<ex>file.zip</ex></ph>
       </message>
@@ -4787,11 +4955,8 @@
       <message name="IDS_IOS_SAVE_TO_DRIVE_ACCOUNT_PICKER_SUBMIT" desc="Dialog primary button label to validate the account picked to save a file to Google Drive. [iOS only]" meaning="This button saves the file to the user's Google Drive storage i.e. this means 'Save' as in 'Save in Google Drive'.">
         Save
       </message>
-      <message name="IDS_IOS_SAVE_TO_PHOTOS_ACCOUNT_PICKER_GOOGLE_PHOTOS_TITLE" desc="The title of the save to photos account picker. [iOS only]" meaning="This title represents the `Google Photos` brand, and the current string represents the `Photos` part of the brand's' name.">
-        Photos
-      </message>
-      <message name="IDS_IOS_SAVE_TO_PHOTOS_ACCOUNT_PICKER_THIS_ACCOUNT_EVERY_TIME" desc="Switch label to let the user choose whether they want to save to their current account every time. [iOS only]">
-        Save to this account every time
+      <message name="IDS_IOS_SAVE_TO_DRIVE_ACCOUNT_PICKER_TITLE" desc="Dialog title to invite the user to pick a destination for their download (e.g. Files or Drive) and if applicable (e.g. they choose Drive) an account to save a file as. [iOS only]">
+        Save in…
       </message>
       <message name="IDS_IOS_SAVE_TO_PHOTOS_ACCOUNT_PICKER_ASK_EVERY_TIME" desc="Switch label to let the user choose whether they want to pick an account every time. [iOS only]">
         Ask which account to use every time
@@ -4799,9 +4964,15 @@
       <message name="IDS_IOS_SAVE_TO_PHOTOS_ACCOUNT_PICKER_BODY" desc="Text when a user attempts to save an image to Google Photos, then is presented with the account picker dialog to select which account they want to use to save the image. [iOS only]">
         Select the account you want to use to save <ph name="FILENAME">$1<ex>image.jpeg</ex></ph> - <ph name="FILESIZE">$2<ex>4 MB</ex></ph>
       </message>
+      <message name="IDS_IOS_SAVE_TO_PHOTOS_ACCOUNT_PICKER_GOOGLE_PHOTOS_TITLE" desc="The title of the save to photos account picker. [iOS only]" meaning="This title represents the `Google Photos` brand, and the current string represents the `Photos` part of the brand's' name.">
+        Photos
+      </message>
       <message name="IDS_IOS_SAVE_TO_PHOTOS_ACCOUNT_PICKER_SUBMIT" desc="Dialog primary button label to validate the account picked to save an image to Google Photos. [iOS only]" meaning="This button saves the image to the user's Google Photos library i.e. this means 'Save' as in 'Save in Google Photos'.">
         Save
       </message>
+      <message name="IDS_IOS_SAVE_TO_PHOTOS_ACCOUNT_PICKER_THIS_ACCOUNT_EVERY_TIME" desc="Switch label to let the user choose whether they want to save to their current account every time. [iOS only]">
+        Save to this account every time
+      </message>
       <message name="IDS_IOS_SAVE_TO_PHOTOS_ACCOUNT_PICKER_TITLE" desc="Dialog title to invite the user to pick an account to save an image to Google Photos. [iOS only]">
         Save in Google Photos
       </message>
@@ -4892,6 +5063,18 @@
       <message name="IDS_IOS_SEGMENTED_DEFAULT_BROWSER_VIDEO_PROMO_DEVICE_SWITCHER_TITLE" desc="Title for the segmented generic default browser promo view, shown to users identified as Desktop Users or Android switchers.">
         Get the best from the Browser you love
       </message>
+      <message name="IDS_IOS_SEND_TAB_PROMO_ALLOW_BUTTON" desc="Text for the Allow button for the Send Tab to Self promo Magic Stack module.">
+        Allow Tabs Notifications…
+      </message>
+      <message name="IDS_IOS_SEND_TAB_PROMO_BODY" desc="Body text for the Send Tab to Self promo Magic Stack module.">
+        Open tabs received from your other devices from the lock screen.
+      </message>
+      <message name="IDS_IOS_SEND_TAB_PROMO_FEATURE_NAME_FOR_SNACKBAR" desc="Send Tab to Self feature name for snackbar message that is displayed after enabling Send Tab push notifications from the Magic Stack module.">
+        Received Tabs
+      </message>
+      <message name="IDS_IOS_SEND_TAB_PROMO_TITLE" desc="Title for the Send Tab to Self promo Magic Stack module.">
+        Get Tabs Notifications
+      </message>
       <message name="IDS_IOS_SEND_TAB_TO_SELF_HIDE_CONTEXT_MENU_DESCRIPTION" desc="Description for the long-press context menu hide action of the send tab to self module.">
         Hide "<ph name="Module_Name"><ex>Get Tabs Notifications</ex>$1</ph>"
       </message>
@@ -4901,18 +5084,6 @@
       <message name="IDS_IOS_SEND_TAB_TO_SELF_NOTIFICATION_SETTINGS_TITLE" desc="Title text of the Send Tabs notifications entry in the Notification Settings Screen.">
         Tabs
       </message>
-      <message name="IDS_IOS_SEND_TAB_PROMO_ALLOW_BUTTON" desc="Text for the Allow button for the Send Tab to Self promo Magic Stack module.">
-        Allow Tabs Notifications…
-      </message>
-      <message name="IDS_IOS_SEND_TAB_PROMO_FEATURE_NAME_FOR_SNACKBAR" desc="Send Tab to Self feature name for snackbar message that is displayed after enabling Send Tab push notifications from the Magic Stack module.">
-        Received Tabs
-      </message>
-      <message name="IDS_IOS_SEND_TAB_PROMO_BODY" desc="Body text for the Send Tab to Self promo Magic Stack module.">
-        Open tabs received from your other devices from the lock screen.
-      </message>
-      <message name="IDS_IOS_SEND_TAB_PROMO_TITLE" desc="Title for the Send Tab to Self promo Magic Stack module.">
-        Get Tabs Notifications
-      </message>
       <message name="IDS_IOS_SEND_TAB_TO_SELF_SNACKBAR_MESSAGE" desc="Message briefly displayed at the bottom of the screen to the user to inform that the tab is being sent to the target device. [Length: 35em]" meaning="The is being sent to the target device. [Length: 35em]">
         Sending to <ph name="DEVICE_NAME">$1<ex>IPhone</ex></ph>…
       </message>
@@ -4931,18 +5102,6 @@
       <message name="IDS_IOS_SEND_TAB_TO_SELF_TARGET_DEVICE_TITLE" desc="Title for the Send Tab To Self modal dialog that chooses the device to which the current tab will be sent. [iOS only]">
         Send webpage
       </message>
-      <message name="IDS_IOS_SET_UP_LIST_ADDRESS_BAR_LONG_DESCRIPTION" desc="The description for the Set Up List item that encourages users to select the position of their address bar.">
-        Pick the position of your address bar that works best for you.
-      </message>
-      <message name="IDS_IOS_SET_UP_LIST_ADDRESS_BAR_SHORT_DESCRIPTION" desc="The description for the Set Up List item that encourages users to select the position of their address bar (used when the Set Up List is in compact mode).">
-        Select the position that works best for you.
-      </message>
-      <message name="IDS_IOS_SET_UP_LIST_ADDRESS_BAR_TITLE" desc="The title of the Set Up List item that encourages users to select the position of their address bar.">
-        Choose Address Bar Position
-      </message>
-      <message name="IDS_IOS_SET_UP_LIST_DOCK_CHROME_LONG_DESCRIPTION" desc="Description for the Set Up List item that encourages the user to add Chrome to their iOS dock.">
-        Get faster access from your Home Screen.
-      </message>
       <message name="IDS_IOS_SETTINGS_ADD_PASSWORD_DESCRIPTION" desc="Footer text shown when the user is trying to add a new credential manually via settings [iOS only]" meaning="Telling user to ensure provided password matches password on the website.">
         Make sure you're saving your current password for this site.
       </message>
@@ -5208,6 +5367,15 @@
       <message name="IDS_IOS_SETTING_OPENED_IN_ANOTHER_WINDOW" desc="Generic status label displayed in Settings to show that a setting cannot be edited because it is currently being opened for edit in another window. [Length: keep it short.] [iOS only]" meaning="The setting is opened for edit in another window.">
         Opened elsewhere
       </message>
+      <message name="IDS_IOS_SET_UP_LIST_ADDRESS_BAR_LONG_DESCRIPTION" desc="The description for the Set Up List item that encourages users to select the position of their address bar.">
+        Pick the position of your address bar that works best for you.
+      </message>
+      <message name="IDS_IOS_SET_UP_LIST_ADDRESS_BAR_SHORT_DESCRIPTION" desc="The description for the Set Up List item that encourages users to select the position of their address bar (used when the Set Up List is in compact mode).">
+        Select the position that works best for you.
+      </message>
+      <message name="IDS_IOS_SET_UP_LIST_ADDRESS_BAR_TITLE" desc="The title of the Set Up List item that encourages users to select the position of their address bar.">
+        Choose Address Bar Position
+      </message>
       <message name="IDS_IOS_SET_UP_LIST_ALL_SET_TITLE" desc="Title for the Set Up List item that tells the user they have completed all tasks.">
         You're all set
       </message>
@@ -5232,6 +5400,9 @@
       <message name="IDS_IOS_SET_UP_LIST_DEFAULT_BROWSER_SHORT_DESCRIPTION" desc="Shortened description for the Set Up List item that encourages the user to set Chrome as their default browser.">
         Easily open links in other apps.
       </message>
+      <message name="IDS_IOS_SET_UP_LIST_DOCK_CHROME_LONG_DESCRIPTION" desc="Description for the Set Up List item that encourages the user to add Chrome to their iOS dock.">
+        Get faster access from your Home Screen.
+      </message>
       <message name="IDS_IOS_SET_UP_LIST_EXPAND" desc="Accessibility label for the button to expand the Set Up List.">
         Expand list
       </message>
@@ -5304,17 +5475,14 @@
       <message name="IDS_IOS_SHARE_BUTTON_LABEL" desc="Label of a button which will initiate a share flow. [iOS only]">
         Share…
       </message>
-      <message name="IDS_IOS_SHARE_KIT_MANAGE_DISCLAIMER" desc="Disclaimer for managing a tab group.">
-        Anyone with the link can edit all tabs.
+      <message name="IDS_IOS_SHARE_EMAIL_COMPLETE" desc="Message shown when email share has been sent. [Length: Unknown. Keep it short.] [iOS only]">
+        Mail sent.
       </message>
-      <message name="IDS_IOS_SHARE_KIT_SHARE_GROUP_DISCLAIMER" desc="Disclaimer for sharing a tab group.">
-        Anyone with the link can edit all tabs, so share wisely. Link expires in 48 hours.
+      <message name="IDS_IOS_SHARE_FACEBOOK_COMPLETE" desc="Message shown when Facebook share has been posted. [Length: Unknown. Keep it short.] [iOS only]">
+        Facebook post completed.
       </message>
-      <message name="IDS_IOS_SHARE_KIT_SHARE_GROUP_DISCLAIMER_LINK" desc="The link part of the disclaimer for sharing a tab group.">
-        Learn about shared tab groups
-      </message>
-      <message name="IDS_IOS_SHARE_KIT_SHARE_GROUP_TITLE" desc="The title for sharing a tab group.">
-        Share "<ph name="GROUP_NAME">$1<ex>Vacation</ex></ph>" Tab Group
+      <message name="IDS_IOS_SHARE_GPLUS_COMPLETE" desc="Message shown when Google+ share has been posted. [Length: Unknown. Keep it short.] [iOS only]">
+        Google+ post completed.
       </message>
       <message name="IDS_IOS_SHARE_KIT_JOIN_ALERT_EXPIRED_ACTION_TITLE" desc="The title of the button in the alert displayed when the shared link has expired.">
         Got it
@@ -5328,20 +5496,17 @@
       <message name="IDS_IOS_SHARE_KIT_JOIN_TAB_GROUP" desc="The type of element that the user will be opening when trying to join a shared group. Used in the context 'Join and open *tab group* with Ali'" meaning="You are trying to join a shared tab group">
         tab group
       </message>
-      <message name="IDS_IOS_SHOW_FULL_URL_BUTTON_ACCESSIBILITY_LABEL" desc="Accessibility Label of a button which will initiate the popup message with the full URL in the web context menu. [iOS only]">
-        Show full URL
+      <message name="IDS_IOS_SHARE_KIT_MANAGE_DISCLAIMER" desc="Disclaimer for managing a tab group.">
+        Anyone with the link can edit all tabs.
       </message>
-      <message name="IDS_IOS_CLOSE_ALERT_BUTTON_LABEL" desc="Label of a button which will close the popup message with the full URL in the web context menu. [iOS only]">
-        Close
+      <message name="IDS_IOS_SHARE_KIT_SHARE_GROUP_DISCLAIMER" desc="Disclaimer for sharing a tab group.">
+        Anyone with the link can edit all tabs, so share wisely. Link expires in 48 hours.
       </message>
-      <message name="IDS_IOS_SHARE_EMAIL_COMPLETE" desc="Message shown when email share has been sent. [Length: Unknown. Keep it short.] [iOS only]">
-        Mail sent.
+      <message name="IDS_IOS_SHARE_KIT_SHARE_GROUP_DISCLAIMER_LINK" desc="The link part of the disclaimer for sharing a tab group.">
+        Learn about shared tab groups
       </message>
-      <message name="IDS_IOS_SHARE_FACEBOOK_COMPLETE" desc="Message shown when Facebook share has been posted. [Length: Unknown. Keep it short.] [iOS only]">
-        Facebook post completed.
-      </message>
-      <message name="IDS_IOS_SHARE_GPLUS_COMPLETE" desc="Message shown when Google+ share has been posted. [Length: Unknown. Keep it short.] [iOS only]">
-        Google+ post completed.
+      <message name="IDS_IOS_SHARE_KIT_SHARE_GROUP_TITLE" desc="The title for sharing a tab group.">
+        Share "<ph name="GROUP_NAME">$1<ex>Vacation</ex></ph>" Tab Group
       </message>
       <message name="IDS_IOS_SHARE_LINK_TO_TEXT" desc="Option that appears in the iOS Edit Menu when highlighting text (alongside options like Copy, Paste, and Share). When selected, this generates a special URL that will open the current page and jump to/highlight the user's current selection. The user will then have the chance to share this special URL through the normal iOS sharing menu.">
         Create link
@@ -5400,9 +5565,21 @@
       <message name="IDS_IOS_SHOW_ALL_PASSWORDS" desc="Button title in the keyboard accessory bar to open the list of all saved passwords. [Length: 20em] [iOS only]">
         Show all…
       </message>
+      <message name="IDS_IOS_SHOW_DETAILS_ACTION_TITLE" desc="Title of the action used to show the details of a selected item. [iOS only]">
+        Show Details
+      </message>
+      <message name="IDS_IOS_SHOW_FULL_URL_BUTTON_ACCESSIBILITY_LABEL" desc="Accessibility Label of a button which will initiate the popup message with the full URL in the web context menu. [iOS only]">
+        Show full URL
+      </message>
       <message name="IDS_IOS_SHOW_LINK_PREVIEWS" desc="Title for the view and option in Settings for showing link previews. [Length: unlimited] [iOS only]" meaning="Title for the Chrome Settings option for showing link previews. [Length: unlimited]">
         Show link previews
       </message>
+      <message name="IDS_IOS_SHOW_PASSKEY_CREATION_DATE" desc="Label indicating that the text displayed below is the date at which the passkey was created. [Length: 20em] [iOS only]">
+        Passkey
+      </message>
+      <message name="IDS_IOS_SHOW_PASSKEY_DISPLAY_NAME" desc="Label indicating that the text displayed below is the display name (usually a legal name, as opposed to username, which is usually an email address) to which a saved passkey corresponds. [Length: 20em] [iOS only]">
+        Display name
+      </message>
       <message name="IDS_IOS_SHOW_PASSWORD_VIEW_FEDERATION" desc="Label indicating that the text displayed below is the hostname of the identity provider used for the displayed credential. [Length: to fit on one line] [iOS only]">
         Signed in with
       </message>
@@ -5421,30 +5598,15 @@
       <message name="IDS_IOS_SHOW_PASSWORD_VIEW_USERNAME" desc="Label indicating that the text displayed below is the username to which a saved password corresponds. The password is displayed in the same view, but under a different label. [Length: 20em] [iOS only]">
         Username
       </message>
-      <message name="IDS_IOS_SHOW_PASSKEY_DISPLAY_NAME" desc="Label indicating that the text displayed below is the display name (usually a legal name, as opposed to username, which is usually an email address) to which a saved passkey corresponds. [Length: 20em] [iOS only]">
-        Display name
-      </message>
-      <message name="IDS_IOS_SHOW_PASSKEY_CREATION_DATE" desc="Label indicating that the text displayed below is the date at which the passkey was created. [Length: 20em] [iOS only]">
-        Passkey
-      </message>
-      <message name="IDS_IOS_PASSKEY_CREATION_DATE" desc="Passkey creation date. [iOS only]">
-        Created on <ph name="Date"><ex>2023/12/31</ex>$1</ph>
-      </message>
-      <message name="IDS_IOS_CREDENTIAL_PROVIDER_PASSKEY_SAVED" desc="Notification that a newly created passkey was synced to the user's account. [iOS only]">
-        Passkey saved
-      </message>
-      <message name="IDS_IOS_CREDENTIAL_PROVIDER_VIEW_PASSKEY" desc="Button label to view a recently created passkey in the password manager. [iOS only]">
-        View
-      </message>
       <message name="IDS_IOS_SIGNIN_ACCOUNT_NOTIFICATION_TITLE_WITH_USERNAME" desc="Notification title for the user's signed-in state that includes the user's full name [iOS only]">
       Signed in as <ph name="USER">$1<ex>Jane Doe</ex></ph>
       </message>
-      <message name="IDS_IOS_SIGNIN_ACCOUNT_PICKER_DESCRIPTION_WITH_NAME_AND_EMAIL" is_accessibility_with_no_ui="true" desc="The content description for the account picker. Opens the 'Choose an account' dialog.">
-        <ph name="NAME">$1<ex>John Doe</ex></ph>, <ph name="EMAIL">$2<ex>john.doe@example.com</ex></ph> currently selected. Choose an account.
-      </message>
       <message name="IDS_IOS_SIGNIN_ACCOUNT_PICKER_DESCRIPTION_WITH_EMAIL" is_accessibility_with_no_ui="true" desc="The content description for the account picker. Opens the 'Choose an account' dialog. Used when the user's name is not available.">
         <ph name="EMAIL">$1<ex>john.doe@example.com</ex></ph> currently selected. Choose an account.
       </message>
+      <message name="IDS_IOS_SIGNIN_ACCOUNT_PICKER_DESCRIPTION_WITH_NAME_AND_EMAIL" is_accessibility_with_no_ui="true" desc="The content description for the account picker. Opens the 'Choose an account' dialog.">
+        <ph name="NAME">$1<ex>John Doe</ex></ph>, <ph name="EMAIL">$2<ex>john.doe@example.com</ex></ph> currently selected. Choose an account.
+      </message>
       <message name="IDS_IOS_SIGNIN_PROMO_BOOKMARKS" desc="This string is on a promo intended to promote signing in to Chrome with the user's Google Account. It appears on the Bookmarks page when the user is not signed in. We want users to read this promo and click 'Continue as name' to sign in to their Google Account. The tone should be informative and lightweight. [Length: 90em]">
         Sign in to get your bookmarks on all your devices.
       </message>
@@ -5493,6 +5655,9 @@
       <message name="IDS_IOS_SIGNIN_SNACKBAR_UNDO" desc="This string is found on a button that signs the user out when the user taps it. It is on a confirmation message that users see when they sign in to Chrome with their Google Account. This text is a verb and is short for the longer phrase 'Undo my sign-in.' The tone should be informative. [Length: 15em] [iOS only]">
         Undo
       </message>
+      <message name="IDS_IOS_SIGNOUT_AND_DELETE_DIALOG_SIGN_OUT_BUTTON" desc="This button signs the user out. Related to IDS_IOS_SIGNOUT_DIALOG_TITLE [iOS only].">
+        Sign Out and Delete
+      </message>
       <message name="IDS_IOS_SIGNOUT_AND_DISALLOW_SIGNIN_CLEARS_DATA_MESSAGE_WITH_MANAGED_ACCOUNT" desc="Text to inform the managed user about why their their device data is being cleared on signout. [iOS only]">
         After you sign out, unsaved data will be deleted from this device. This could include passwords, history, and more.
       </message>
@@ -5502,14 +5667,11 @@
       <message name="IDS_IOS_SIGNOUT_CLEARS_DATA_DIALOG_MESSAGE_WITH_MANAGED_ACCOUNT" desc="Text to inform the managed user about why their their device data is being cleared on signout. [iOS only]">
           To protect your organization's security, unsaved data will be deleted from this device. This could include passwords, history, and more.
       </message>
-      <message name="IDS_IOS_SIGNOUT_CLOSES_TABS_AND_CLEARS_DATA_DIALOG_MESSAGE_WITH_MANAGED_ACCOUNT" desc="Text to inform the managed user about why their their device data is being cleared on signout. [iOS only]">
-      Tabs will be closed, and data deleted could include passwords, browsing history, cookies, and more.
-      </message>
       <message name="IDS_IOS_SIGNOUT_CLEARS_DATA_DIALOG_TITLE_WITH_MANAGED_ACCOUNT" desc="The signout dialog title. This is the new dialog that is used when the user have a managed account (other than gmail account) [iOS only].">
         Sign out? Unsaved account data will be deleted.
       </message>
-      <message name="IDS_IOS_SWITCH_CLEARS_DATA_DIALOG_TITLE_WITH_MANAGED_ACCOUNT" desc="The switch dialog title. This is the new dialog that is used when the user have a managed account (other than gmail account) [iOS only].">
-        Switch accounts? Unsaved account data will be deleted.
+      <message name="IDS_IOS_SIGNOUT_CLOSES_TABS_AND_CLEARS_DATA_DIALOG_MESSAGE_WITH_MANAGED_ACCOUNT" desc="Text to inform the managed user about why their their device data is being cleared on signout. [iOS only]">
+      Tabs will be closed, and data deleted could include passwords, browsing history, cookies, and more.
       </message>
       <message name="IDS_IOS_SIGNOUT_DIALOG_CLEAR_DATA_BUTTON" desc="This button signs the user out and delete all the data from the user device. The data remain in their Google account. Related to IDS_IOS_SIGNOUT_DIALOG_TITLE [iOS only].">
         Clear data
@@ -5529,9 +5691,6 @@
       <message name="IDS_IOS_SIGNOUT_DIALOG_SIGN_OUT_BUTTON" desc="This button signs the user out. Related to IDS_IOS_SIGNOUT_DIALOG_TITLE [iOS only].">
         Sign out
       </message>
-      <message name="IDS_IOS_SIGNOUT_AND_DELETE_DIALOG_SIGN_OUT_BUTTON" desc="This button signs the user out. Related to IDS_IOS_SIGNOUT_DIALOG_TITLE [iOS only].">
-        Sign Out and Delete
-      </message>
       <message name="IDS_IOS_SIGN_IN_AGAIN" desc="Title displayed when there is an authentication failure in sign-in and the user needs to attempt to sign in again. [Length: 20em] [iOS only]">
         Sign in again
       </message>
@@ -5628,12 +5787,12 @@
       <message name="IDS_IOS_SPOTLIGHT_OPEN_TAB_LABEL" desc="Tag label title displayed for opent tabs spotlight items. [iOS only]">
         Open Tab
       </message>
-      <message name="IDS_IOS_SUGGESTED_STRONG_PASSWORD" desc="Text that shows a suggested generated password at user's request [Length: unlimited] [iOS only]">
-        Use strong password:
-      </message>
       <message name="IDS_IOS_SUGGESTED_PASSWORD" desc="Text that shows a suggested generated password at user's request [Length: unlimited] [iOS only]">
         Use suggested password:
       </message>
+      <message name="IDS_IOS_SUGGESTED_STRONG_PASSWORD" desc="Text that shows a suggested generated password at user's request [Length: unlimited] [iOS only]">
+        Use strong password:
+      </message>
       <message name="IDS_IOS_SUGGESTIONS_DONE" desc="Label of the navigation bar button to close the view.">
         Done
       </message>
@@ -5652,16 +5811,19 @@
       <message name="IDS_IOS_SWIPE_RIGHT_TO_INCOGNITO_IPH_VOICEOVER" desc="The voice over announcement for the full screen in-product help for swipe right to see incognito tabs on regular tabs grid.">
         You can scroll left to browse in Incognito.
       </message>
-      <message name="IDS_IOS_SWITCH_PROFILE_CURRENT_PROFILE_TITLE" desc="Title for the switch profile developer panel in Settings->Switch Profile [iOS only]">
+      <message name="IDS_IOS_SWITCH_CLEARS_DATA_DIALOG_TITLE_WITH_MANAGED_ACCOUNT" desc="The switch dialog title. This is the new dialog that is used when the user have a managed account (other than gmail account) [iOS only].">
+        Switch accounts? Unsaved account data will be deleted.
+      </message>
+      <message name="IDS_IOS_SWITCH_PROFILE_CURRENT_PROFILE_TITLE" desc="Title for the switch profile developer panel in Settings-&gt;Switch Profile [iOS only]">
         Current profile
       </message>
       <message name="IDS_IOS_SWITCH_PROFILE_MANAGEMENT_SETTINGS" desc="Title for the switch profile developer management panel in settings [iOS only]">
         Switch profile
       </message>
-      <message name="IDS_IOS_SWITCH_PROFILE_SWITCH_SUBTITLE" desc="Subtitle for the switch profile developer panel in Settings->Switch Profile giving the list of loaded profiles [iOS only]">
+      <message name="IDS_IOS_SWITCH_PROFILE_SWITCH_SUBTITLE" desc="Subtitle for the switch profile developer panel in Settings-&gt;Switch Profile giving the list of loaded profiles [iOS only]">
         This list contains all loaded profiles.
       </message>
-      <message name="IDS_IOS_SWITCH_PROFILE_SWITCH_TITLE" desc="Title for the switch profile developer panel in Settings->Switch Profile giving the list of loaded profiles [iOS only]">
+      <message name="IDS_IOS_SWITCH_PROFILE_SWITCH_TITLE" desc="Title for the switch profile developer panel in Settings-&gt;Switch Profile giving the list of loaded profiles [iOS only]">
         Switch to another profile
       </message>
       <message name="IDS_IOS_SYNC_ADDRESSES_DIALOG_CONTINUE" desc="Action of a dialog to enable saving addresses to the Google Account. If the user chose to continue, addresses will start syncing.">
@@ -5757,26 +5919,6 @@
       <message name="IDS_IOS_TABS_MANAGEMENT_SETTINGS" desc="Title for the tabs management panel in settings [Length: 30em] [iOS only]">
         Tabs
       </message>
-      <message name="IDS_IOS_INCOGNITO_LOCK_SETTING_STATE_REAUTH" desc="The state of the incognito lock setting when it is set to lock with biometric authentication, e.g. Passcode, Face ID or Touch ID. This is displayed on the privacy and security page in settings. [iOS only]">
-       <ph name="BIOMETRIC_AUTHENITCATION_TYPE">$1<ex>Face ID</ex></ph>
-      </message>
-      <message name="IDS_IOS_INCOGNITO_LOCK_SETTING_NAME" desc="Name of the Setting to protect Incognito tabs with either soft lock or biometric authentication, e.g. Face ID or Touch ID. [iOS only]">
-       Hide Incognito tabs
-      </message>
-      <message name="IDS_IOS_INCOGNITO_LOCK_DO_NOT_HIDE" desc="Incognito lock setting option to disable hiding Incognito tabs. This appears in the incognito lock settings page under privacy and security. [iOS only]">
-       Don't hide
-      </message>
-      <message name="IDS_IOS_INCOGNITO_LOCK_HIDE_WITH_SOFT_LOCK_TITLE" desc="Incognito lock setting option to enable hiding Incognito tabs with a soft lock.  This appears in the incognito lock settings page under privacy and security. [iOS only]">
-       {count, plural,
-          =1 {Hide after 1 minute}
-          other {Hide after {count} minutes}}
-      </message>
-      <message name="IDS_IOS_INCOGNITO_LOCK_HIDE_WITH_SOFT_LOCK_DESCRIPTION" desc="Description for enabling Incognito soft lock setting. This appears in the incognito lock settings page under privacy and security. [iOS only]">
-       When you return, tabs are blurred until you tap to continue
-      </message>
-      <message name="IDS_IOS_INCOGNITO_LOCK_HIDE_WITH_REAUTH" desc="Incognito lock setting option to enable hiding/locking Incognito tabs with a biometric authentication, e.g. Passcode, Face ID or Touch ID. This appears in the incognito lock settings page under privacy and security. [iOS only]">
-       Lock immediately with <ph name="BIOMETRIC_AUTHENITCATION_TYPE">$1<ex>Face ID</ex></ph>
-      </message>
       <message name="IDS_IOS_TABS_SEARCH_OPEN_TABS_COUNT" desc="The number of the open tabs found as search results in the tab grid.">
         <ph name="COUNT">$1<ex>2</ex></ph> found
       </message>
@@ -5882,9 +6024,6 @@
       <message name="IDS_IOS_TAB_GRID_REGULAR_TABS_TITLE" desc="The accessibility label of the Regular Tabs page (as opposed to the Incognito Tabs page) in the tab grid UI. [iOS only]">
         Open tabs
       </message>
-      <message name="IDS_IOS_TAB_GRID_REGULAR_TABS_WITH_GROUPS_TITLE" desc="The accessibility label of the Regular Tabs page (as opposed to the Incognito Tabs page) in the tab grid UI when Tab Groups are enabled. [iOS only]">
-        Open tabs and tab groups
-      </message>
       <message name="IDS_IOS_TAB_GRID_REGULAR_TABS_UNAVAILABLE_MESSAGE" desc="Message shown in the Regular Tabs page of the tab grid when the IncognitoModeAvailability enterprise policy is set to forced. [iOS only]">
         Your organization requires you to browse privately.
 <ph name="BEGIN_LINK">BEGIN_LINK</ph>Learn more<ph name="END_LINK">END_LINK</ph>
@@ -5892,6 +6031,9 @@
       <message name="IDS_IOS_TAB_GRID_REGULAR_TABS_UNAVAILABLE_TITLE" desc="Title shown above a message in the Regular Tabs page of the tab grid when the IncognitoModeAvailability enterprise policy is set to forced. [iOS only]">
         Only Incognito mode is available
       </message>
+      <message name="IDS_IOS_TAB_GRID_REGULAR_TABS_WITH_GROUPS_TITLE" desc="The accessibility label of the Regular Tabs page (as opposed to the Incognito Tabs page) in the tab grid UI when Tab Groups are enabled. [iOS only]">
+        Open tabs and tab groups
+      </message>
       <message name="IDS_IOS_TAB_GRID_REMOTE_TABS_TITLE" desc="The accessibility label of the Remote Tabs page in the tab grid UI. [iOS only]">
         Tabs from other devices
       </message>
@@ -5938,6 +6080,9 @@
       <message name="IDS_IOS_TAB_GRID_UNDO_CLOSE_ALL_BUTTON" desc="Title of the button in the tab grid UI that revert the close all action recently taken by the user. [iOS only]">
         Undo
       </message>
+      <message name="IDS_IOS_TAB_GROUPS_PANEL_CELL_ACCESSIBILITY_LABEL_FORMAT" desc="Format for the accessibility label of a cell in the Tab Groups panel in Tab Grid. [iOS only]">
+        Open <ph name="GROUP_TITLE">$1<ex>Travel</ex></ph>, group of <ph name="NUMBER_OF_TABS">$2<ex>4 Tabs</ex></ph>, <ph name="CREATION_TEXT">$3<ex>created 3 days ago</ex></ph>
+      </message>
       <message name="IDS_IOS_TAB_GROUP_ACTIVITY_LABEL_USER_ADDED_TEXT" desc="Text in the label that indicates a user added a tab in a shared tab group.">
         Added
       </message>
@@ -5950,29 +6095,26 @@
       <message name="IDS_IOS_TAB_GROUP_CELL_ACCESSIBILITY_TITLE" desc="Accessibility label, giving context to screen reader when users navigate the tab grouping cell in the tab grid. This is spoken by VoiceOver.">
         Tab group, <ph name="GROUP_TITLE">$1<ex>Group name</ex></ph>, <ph name="TABS_NUMBER">$2<ex>4</ex></ph> tabs.
       </message>
-      <message name="IDS_IOS_TAB_GROUP_CONFIRMATION_DELETE_MESSAGE_WITH_EMAIL" desc="Message of the confirmation to delete a tab group in the action sheet. This text is displayed when a user is signed in to Chrome with their account.">
-        This will delete the group from all devices signed into <ph name="USER_EMAIL">$1<ex>peter.parker@gmail.com</ex></ph>.
-      </message>
       <message name="IDS_IOS_TAB_GROUP_CONFIRMATION_DELETE_MESSAGE_WITHOUT_EMAIL" desc="Message of the confirmation to delete a tab group in the action sheet. This text is displayed when a user is not signed in.">
         This will permanently delete the group from your device.
       </message>
+      <message name="IDS_IOS_TAB_GROUP_CONFIRMATION_DELETE_MESSAGE_WITH_EMAIL" desc="Message of the confirmation to delete a tab group in the action sheet. This text is displayed when a user is signed in to Chrome with their account.">
+        This will delete the group from all devices signed into <ph name="USER_EMAIL">$1<ex>peter.parker@gmail.com</ex></ph>.
+      </message>
       <message name="IDS_IOS_TAB_GROUP_CONFIRMATION_DELETE_TITLE" desc="Title of the confirmation to delete a tab group in the action sheet.">
         Delete tab group?
       </message>
       <message name="IDS_IOS_TAB_GROUP_CONFIRMATION_LAST_TAB_MOVE_TITLE" desc="Title of the confirmation to move the last tab of a group and delete the group.">
         Remove tab and delete group?
       </message>
-      <message name="IDS_IOS_TAB_GROUP_CONFIRMATION_UNGROUP_TITLE" desc="Title of the confirmation to delete a tab group in the action sheet.">
-        Ungroup tab group?
+      <message name="IDS_IOS_TAB_GROUP_CONFIRMATION_UNGROUP_MESSAGE_WITHOUT_EMAIL" desc="Message of the confirmation to delete a tab group in the action sheet. This text is displayed when a user is not signed in.">
+        The tabs will remain open on this device but the group will be permanently deleted.
       </message>
       <message name="IDS_IOS_TAB_GROUP_CONFIRMATION_UNGROUP_MESSAGE_WITH_EMAIL" desc="Message of the confirmation to delete a tab group in the action sheet. This text is displayed when a user is signed in to Chrome with their account.">
         The tabs will remain open on this device but the group will be deleted from all devices signed into <ph name="USER_EMAIL">$1<ex>peter.parker@gmail.com</ex></ph>.
       </message>
-      <message name="IDS_IOS_TAB_GROUP_CONFIRMATION_UNGROUP_MESSAGE_WITHOUT_EMAIL" desc="Message of the confirmation to delete a tab group in the action sheet. This text is displayed when a user is not signed in.">
-        The tabs will remain open on this device but the group will be permanently deleted.
-      </message>
-      <message name="IDS_IOS_TAB_GROUP_THREE_DOT_MENU_BUTTON_ACCESSIBILITY_LABEL" desc="Accessibility label for the 3-dot menu button displayed in the tab group view.">
-        More options
+      <message name="IDS_IOS_TAB_GROUP_CONFIRMATION_UNGROUP_TITLE" desc="Title of the confirmation to delete a tab group in the action sheet.">
+        Ungroup tab group?
       </message>
       <message name="IDS_IOS_TAB_GROUP_CREATION_ACCESSIBILITY_COLOR_SELECTION" desc="Accessibility label, giving context to screen reader when users navigate the color list in the tab group creation screen. This is spoken by VoiceOver.">
         Tab group color <ph name="COLOR"><ex>yellow</ex>$1</ph>
@@ -5980,12 +6122,12 @@
       <message name="IDS_IOS_TAB_GROUP_CREATION_BUTTON" desc="Label of the button to create a tab group. [iOS only]">
         Create group
       </message>
-      <message name="IDS_IOS_TAB_GROUP_CREATION_DONE" desc="Label of the button to finalize edition of a tab group. [iOS only]">
-        Done
-      </message>
       <message name="IDS_IOS_TAB_GROUP_CREATION_DATE" desc="Subtitle shown in tab group view to display the creation date of the group. [iOS only]">
         Created <ph name="Date"><ex>2023/12/31</ex>$1</ph>
       </message>
+      <message name="IDS_IOS_TAB_GROUP_CREATION_DONE" desc="Label of the button to finalize edition of a tab group. [iOS only]">
+        Done
+      </message>
       <message name="IDS_IOS_TAB_GROUP_CREATION_PLACEHOLDER" desc="Placeholder shown in tab group creation view to indicate to the user the expected action which is to type the name of the group currently created. [iOS only]">
         Name group
       </message>
@@ -6011,8 +6153,8 @@
         =1 {1 tab}
         other {{count} tabs}}
       </message>
-      <message name="IDS_IOS_TAB_GROUPS_PANEL_CELL_ACCESSIBILITY_LABEL_FORMAT" desc="Format for the accessibility label of a cell in the Tab Groups panel in Tab Grid. [iOS only]">
-        Open <ph name="GROUP_TITLE">$1<ex>Travel</ex></ph>, group of <ph name="NUMBER_OF_TABS">$2<ex>4 Tabs</ex></ph>, <ph name="CREATION_TEXT">$3<ex>created 3 days ago</ex></ph>
+      <message name="IDS_IOS_TAB_GROUP_THREE_DOT_MENU_BUTTON_ACCESSIBILITY_LABEL" desc="Accessibility label for the 3-dot menu button displayed in the tab group view.">
+        More options
       </message>
       <message name="IDS_IOS_TAB_RESUMPTION_CONTEXT_MENU_DESCRIPTION" desc="Description for the long-press context menu of the module that presents the last opened tab, on the new tab page.">
         Hide "Continue with this tab"
@@ -6044,24 +6186,24 @@
       <message name="IDS_IOS_TAB_STRIP_LEAVE_TAB_SWITCHER" desc="The accessibility label of the tab strip button to leave the tab switcher. The tab switcher is a view showing the opened tabs, and allows users to switch, close, and open new tabs. [iOS only]">
         Leave tab switcher
       </message>
-      <message name="IDS_IOS_TAB_STRIP_TAB_CELL_VOICE_OVER_VALUE" desc="Accessibility value to let the user know the position of the currently focused tab compared to the others. Read by Text-to-Speech">
-        Tab. <ph name="TAB_INDEX">$1<ex>3</ex></ph> of <ph name="NUMBER_OF_TABS">$2<ex>27</ex></ph>.
-      </message>
       <message name="IDS_IOS_TAB_STRIP_TAB_CELL_IN_GROUP_VOICE_OVER_VALUE" desc="Accessibility value to let the user know the position of the currently focused grouped tab compared to the others. Read by Text-to-Speech">
         Tab group tab. <ph name="TAB_INDEX_IN_GROUP">$1<ex>3</ex></ph> of <ph name="NUMBER_OF_TABS_IN_GROUP">$2<ex>27</ex></ph>.
       </message>
+      <message name="IDS_IOS_TAB_STRIP_TAB_CELL_VOICE_OVER_VALUE" desc="Accessibility value to let the user know the position of the currently focused tab compared to the others. Read by Text-to-Speech">
+        Tab. <ph name="TAB_INDEX">$1<ex>3</ex></ph> of <ph name="NUMBER_OF_TABS">$2<ex>27</ex></ph>.
+      </message>
       <message name="IDS_IOS_TAB_STRIP_TAB_GROUP_COLLAPSE" desc="The accessibility label for collapsing an expanded tab group. [iOS only]">
         Collapse tab group.
       </message>
       <message name="IDS_IOS_TAB_STRIP_TAB_GROUP_EXPAND" desc="The accessibility label for expanding a collapsed tab group. [iOS only]">
         Expand tab group.
       </message>
-      <message name="IDS_IOS_TAB_SWITCHER_CLOSE_TAB" desc="The accessibility label for the closing of a selected tab. [iOS only]">
-        Close tab.
-      </message>
       <message name="IDS_IOS_TAB_SWITCHER_CLOSE_GROUP" desc="The accessibility label for the closing of a selected tab group. [iOS only]">
         Close group.
       </message>
+      <message name="IDS_IOS_TAB_SWITCHER_CLOSE_TAB" desc="The accessibility label for the closing of a selected tab. [iOS only]">
+        Close tab.
+      </message>
       <message name="IDS_IOS_TAB_SWITCHER_CREATE_NEW_INCOGNITO_TAB" desc="The accessibility label for the button that creates new Incognito tabs. [iOS only]">
         Create new Incognito tab.
       </message>
@@ -6176,12 +6318,12 @@
       <message name="IDS_IOS_TOOLBAR_OPEN_NEW_TAB_INCOGNITO" desc="The accessibility label for the toolbar open new tab button in Incognito mode and out of a tab group [iOS only].">
         New Incognito tab
       </message>
-      <message name="IDS_IOS_TOOLBAR_OPEN_NEW_TAB_IN_GROUP" desc="The accessibility label for the toolbar open new tab button in Regular mode and inside a tab group [iOS only].">
-        New tab in group
-      </message>
       <message name="IDS_IOS_TOOLBAR_OPEN_NEW_TAB_INCOGNITO_IN_GROUP" desc="The accessibility label for the toolbar open new tab button in Incognito mode and inside a tab group [iOS only].">
         New Incognito tab in group
       </message>
+      <message name="IDS_IOS_TOOLBAR_OPEN_NEW_TAB_IN_GROUP" desc="The accessibility label for the toolbar open new tab button in Regular mode and inside a tab group [iOS only].">
+        New tab in group
+      </message>
       <message name="IDS_IOS_TOOLBAR_SEARCH" desc="Label of the button allowing the user to focus the address bar when tapped. As usual, when the address bar is focused, the user can type a URL or a text to be searched on the internet. Read by Text-to-Speech." meaning="Search the internet. Read by Text-to-Speech.">
         Search
       </message>
@@ -6221,6 +6363,12 @@
       <message name="IDS_IOS_TOOLS_MENU_CLOSE_TAB" desc="The iOS menu item for closing a tab [iOS only]" meaning="[Length: unlimited]">
         Close Tab
       </message>
+      <message name="IDS_IOS_TOOLS_MENU_CUSTOMIZATION_IPH" desc="The text on an IPH for the iOS menu telling users they can customize the menu">
+        Customize your menu
+      </message>
+      <message name="IDS_IOS_TOOLS_MENU_CUSTOMIZE_FOLLOW" desc="The iOS menu item for customizing the follow item. [iOS only]" meaning="[iOS only] Overflow menu item">
+        Follow
+      </message>
       <message name="IDS_IOS_TOOLS_MENU_DOWNLOADS" desc="The iOS menu item for opening the downloads folder [iOS only]" meaning="[Length: 16em] [iOS only] This is a feature name in title case.">
         Downloads
       </message>
@@ -6236,9 +6384,6 @@
       <message name="IDS_IOS_TOOLS_MENU_FIND_IN_PAGE" desc="The iOS menu item for searching in the current page [iOS only]" meaning="Open the Find In Page menu [Length: unlimited]">
         Find in Page…
       </message>
-      <message name="IDS_IOS_TOOLS_MENU_CUSTOMIZE_FOLLOW" desc="The iOS menu item for customizing the follow item. [iOS only]" meaning="[iOS only] Overflow menu item">
-        Follow
-      </message>
       <message name="IDS_IOS_TOOLS_MENU_FOLLOW" desc="The iOS menu item for following web content. [iOS only]">
         Follow <ph name="DOMAIN_NAME">$1<ex>google.com</ex></ph>
       </message>
@@ -6263,9 +6408,6 @@
       <message name="IDS_IOS_TOOLS_MENU_NEW_INCOGNITO_TAB" desc="The iOS menu item for opening a new Incognito tab [iOS only]" meaning="Tools menu entry to create a new Incognito tab. [Length: Unlimited]">
         New Incognito Tab
       </message>
-      <message name="IDS_IOS_TOOLS_MENU_CUSTOMIZATION_IPH" desc="The text on an IPH for the iOS menu telling users they can customize the menu">
-        Customize your menu
-      </message>
       <message name="IDS_IOS_TOOLS_MENU_NEW_SEARCH" desc="The iOS menu item for opening a new tab and doing a new search in that tab." meaning="Do a new search in a new tab">
         New Search
       </message>
@@ -6670,12 +6812,12 @@
       <message name="IDS_IOS_WHATS_NEW_INCOGNITO_TABS_FROM_OTHER_APPS_TITLE" desc="Open in incognito tabs from other apps title displayed in What's New. [iOS only]">
         Open links from other apps in Incognito
       </message>
-      <message name="IDS_IOS_WHATS_NEW_IPH_TEXT" desc="An in product help message to inform the user about the feature What's New.">
-        Explore new features and tips in What’s New
-      </message>
       <message name="IDS_IOS_WHATS_NEW_IPHONE_ONLY_TITLE" desc="Title of a label in the What's New instructions notifies the user that the feature is exclusively available on iPhone.">
         Only available on iPhone
       </message>
+      <message name="IDS_IOS_WHATS_NEW_IPH_TEXT" desc="An in product help message to inform the user about the feature What's New.">
+        Explore new features and tips in What’s New
+      </message>
       <message name="IDS_IOS_WHATS_NEW_LEARN_MORE_ACTION_TITLE" desc="Label of the button for users to learn more about a feature or a chrome tip.">
         Learn more
       </message>
@@ -6727,6 +6869,9 @@
       <message name="IDS_SAVE_PASSWORD_FOOTER_DISPLAYING_USER_EMAIL" desc="The footer text of the infobar that offers user to save/update a password to Chrome; also display's current user's email.">
         You can use saved passwords on any device. They're saved to Google Password Manager for <ph name="EMAIL">$1<ex>johndoe@gmail.com</ex></ph>.
       </message>
+      <message name="IDS_SEARCH_ENGINE_CHOICE_DEFAULT_HINT" desc="Announcement for screen reader users. This string is announced when the user interacts with the 'Set as Default' button at the bottom of the 'Choose Your Search Engine' choice screen. The text provides a hint that the user needs to choose a search engine from the list on this screen before they can press this button.">
+        Choose a search engine from the list.
+      </message>
       <message name="IDS_SEND_TAB_TO_SELF_INFOBAR_MESSAGE" desc="The message text for the infobar when a user receives a shared tab from another device.">
         Tab received.
       </message>
@@ -6766,150 +6911,6 @@
       <message name="IDS_UNITS_MEASUREMENTS_VOLUME" desc="Title of the button that allows the user to use and convert volume type units" meaning="Button menu entry that allows the user to change the unit category to Volume.">
         Volume
       </message>
-      <message name="IDS_IOS_IDLE_TIMEOUT_DIALOG_ACCESSIBILITY_LABEL" desc="Accessibility label the voiceover uses when the idle timeout confirmation dialog is shown.">
-        Idle timeout dialog
-      </message>
-      <message name="IDS_IOS_IDLE_TIMEOUT_SIGNOUT_TITLE" desc="Title of the idle timeout policy dialog when the user is about to be signed out.">
-        You'll be signed out
-      </message>
-      <message name="IDS_IOS_IDLE_TIMEOUT_CLOSE_TABS_TITLE" desc="Title of the idle timeout policy dialog when tabs are about to be closed.">
-        Your tabs will be closed
-      </message>
-      <message name="IDS_IOS_IDLE_TIMEOUT_CLEAR_DATA_TITLE" desc="Title of the idle timeout policy dialog when browsing data is about to be cleared.">
-        Your browsing data will be deleted
-      </message>
-      <message name="IDS_IOS_IDLE_TIMEOUT_CLOSE_TABS_AND_SIGNOUT_TITLE" desc="Title of the idle timeout policy dialog when tabs are about to be closed and the user to be signed out.">
-        You'll be signed out and tabs will be closed
-      </message>
-      <message name="IDS_IOS_IDLE_TIMEOUT_CLOSE_TABS_AND_CLEAR_DATA_TITLE" desc="Title of the idle timeout policy dialog when tabs are about to be closed and browsing data about to be deleted.">
-        Your tabs will be closed and browsing data deleted
-      </message>
-      <message name="IDS_IOS_IDLE_TIMEOUT_CLEAR_DATA_AND_SIGNOUT_TITLE" desc="Title of the idle timeout policy dialog when browsing data is about to be cleared and the user will be signed out.">
-        You'll be signed out and browsing data will be deleted
-      </message>
-      <message name="IDS_IOS_IDLE_TIMEOUT_ALL_ACTIONS_TITLE" desc="Title of the idle timeout policy dialog when browsing data is about to be cleared, tabs will be closed and the user will be signed out.">
-          You'll be signed out, tabs will be closed, browsing data deleted
-      </message>
-      <message name="IDS_IOS_IDLE_TIMEOUT_CONFIRMATION_DIALOG_REMAINING_TIME_LABEL" desc="Time remaining until the idle timeout confirmation dialog disappears">
-        {TIME, plural,
-                =0 {Time Remaining: {TIME} seconds}
-                =1 {Time Remaining: {TIME} second}
-                other {Time Remaining: {TIME} seconds}}
-      </message>
-      <message name="IDS_IOS_IDLE_TIMEOUT_SIGNOUT_SNACKBAR_MESSAGE" desc="Title of the idle timeout policy dialog when the user is about to be signed out.">
-        You were signed out
-      </message>
-      <message name="IDS_IOS_IDLE_TIMEOUT_CLOSE_TABS_SNACKBAR_MESSAGE" desc="Title of the idle timeout policy dialog when tabs are about to be closed.">
-        Tabs were closed
-      </message>
-      <message name="IDS_IOS_IDLE_TIMEOUT_CLEAR_DATA_SNACKBAR_MESSAGE" desc="Title of the idle timeout policy dialog when browsing data is about to be cleared.">
-        Browsing data was deleted
-      </message>
-      <message name="IDS_IOS_IDLE_TIMEOUT_CLOSE_TABS_AND_SIGNOUT_SNACKBAR_MESSAGE" desc="Title of the idle timeout policy dialog when tabs are about to be closed and the user to be signed out.">
-        Tabs were closed; you were signed out
-      </message>
-      <message name="IDS_IOS_IDLE_TIMEOUT_CLOSE_TABS_AND_CLEAR_DATA_SNACKBAR_MESSAGE" desc="Title of the idle timeout policy dialog when tabs are about to be closed and browsing data about to be deleted.">
-        Tabs were closed and browsing data deleted
-      </message>
-      <message name="IDS_IOS_IDLE_TIMEOUT_CLEAR_DATA_AND_SIGNOUT_SNACKBAR_MESSAGE" desc="Title of the idle timeout policy dialog when browsing data is about to be cleared and the user will be signed out.">
-        You were signed out; browsing data was deleted
-      </message>
-      <message name="IDS_IOS_IDLE_TIMEOUT_ALL_ACTIONS_SNACKBAR_MESSAGE" desc="Title of the idle timeout policy dialog when browsing data is about to be cleared, tabs will be closed and the user will be signed out.">
-        Tabs were closed and browsing data was deleted. You were signed out
-      </message>
-      <message name="IDS_IOS_DOCKING_EDIT_HOME_SCREEN_LOTTIE_INSTRUCTION" desc="Title of the instruction shown in the Docking Promo Lottie, which describes the Edit Home Screen text when the user long presses on the Chrome app.">
-        Edit Home Screen
-      </message>
-      <message name="IDS_IOS_DOCKING_PROMO_NO_THANKS_BUTTON_TITLE" desc="Title of the button that dismisses the Docking Promo.">
-        No Thanks
-      </message>
-      <message name="IDS_IOS_DOCKING_PROMO_PRIMARY_BUTTON_TITLE" desc="Title of the primary button in the Docking Promo, which confirms the promo has been seen by the user.">
-        Got it
-      </message>
-      <message name="IDS_IOS_DOCKING_PROMO_SECOND_INSTRUCTION" desc="Title of the second step instruction shown in the Docking Promo, which tells users to drag the app icon to their iOS dock.">
-        Drag it to the dock at the bottom of your Home Screen
-      </message>
-      <message name="IDS_IOS_DOCKING_PROMO_SECONDARY_BUTTON_TITLE" desc="Title of the secondary button in the Docking Promo, which schedules the Docking Promo for display at a later time, i.e. Remind Me Later functionality.">
-        Remind me later
-      </message>
-      <message name="IDS_IOS_EXPANDED_MANUAL_FILL_CLOSE_BUTTON_ACCESSIBILITY_LABEL" desc="Accessibility label of the expanded manual fill view's close button.">
-        Dismiss expanded view
-      </message>
-      <message name="IDS_IOS_EXPANDED_MANUAL_FILL_PASSWORD_TAB_ACCESSIBILITY_LABEL" desc="Accessibility label of the expanded manual fill view's password tab.">
-        Passwords
-      </message>
-      <message name="IDS_IOS_EXPANDED_MANUAL_FILL_PAYMENT_TAB_ACCESSIBILITY_LABEL" desc="Accessibility label of the expanded manual fill view's payment method tab.">
-        Payment methods
-      </message>
-      <message name="IDS_IOS_EXPANDED_MANUAL_FILL_ADDRESS_TAB_ACCESSIBILITY_LABEL" desc="Accessibility label of the expanded manual fill view's address tab.">
-        Addresses and more
-      </message>
-      <message name="IDS_SEARCH_ENGINE_CHOICE_DEFAULT_HINT" desc="Announcement for screen reader users. This string is announced when the user interacts with the 'Set as Default' button at the bottom of the 'Choose Your Search Engine' choice screen. The text provides a hint that the user needs to choose a search engine from the list on this screen before they can press this button.">
-        Choose a search engine from the list.
-      </message>
-      <message name="IDS_IOS_MANUAL_FALLBACK_THREE_DOT_MENU_BUTTON_ACCESSIBILITY_LABEL" desc="Accessibility label for the 3-dot menu button displayed in the manual fallback entity cells, which allows to take action on the entity (e.g., edit the entity). This label is ending with the accessibility label of the cell the button is displayed in.">
-        More options for <ph name="CELL_ACCESSIBILITY_LABEL">$1<ex>1 of 3 passwords, twitter.com</ex></ph>
-      </message>
-      <message name="IDS_IOS_MANUAL_FALLBACK_AUTOFILL_FORM_BUTTON_ACCESSIBILITY_LABEL" desc="Accessibility label for the button displayed in the password, payment method and address manual fallback cells, which allows the user to fill the current form with the autofill data. In contrast to all the other buttons on this screen (which fill a field), this button fills the entire form. This label is ending with the accessibility label of the cell the button is displayed in.">
-        Autofill form with <ph name="CELL_ACCESSIBILITY_LABEL">$1<ex>1 of 3 passwords, twitter.com</ex></ph>
-      </message>
-      <message name="IDS_IOS_MANUAL_FALLBACK_AUTOFILL_FORM_BUTTON_TITLE" desc="Title of the button displayed in the password, payment method and address manual fallback cells, which allows the user to fill the current form with the autofill data. In contrast to all the other buttons on this screen (which fill a field), this button fills the entire form.">
-        Autofill form
-      </message>
-      <message name="IDS_IOS_SHOW_DETAILS_ACTION_TITLE" desc="Title of the action used to show the details of a selected item. [iOS only]">
-        Show Details
-      </message>
-      <message name="IDS_IOS_MANUAL_FALLBACK_ADDRESS_CELL_INDEX" desc="Accessibility label for the address suggestions in the manual fallback view to indicate the position of the address suggestion in the list of address suggestions.">
-        {count, plural,
-             =1 {{position} of {count} address}
-             other {{position} of {count} addresses}}
-      </message>
-      <message name="IDS_IOS_MANUAL_FALLBACK_PASSWORD_CELL_INDEX" desc="Accessibility label for the password suggestions in the manual fallback view to indicate the position of the password suggestion in the list of password suggestions.">
-        {count, plural,
-             =1 {{position} of {count} password}
-             other {{position} of {count} passwords}}
-      </message>
-      <message name="IDS_IOS_MANUAL_FALLBACK_PAYMENT_CELL_INDEX" desc="Accessibility label for the payment method suggestions in the manual fallback view to indicate the position of the payment method suggestion in the list of payment method suggestions.">
-        {count, plural,
-             =1 {{position} of {count} payment method}
-             other {{position} of {count} payment methods}}
-      </message>
-      <message name="IDS_IOS_MANUAL_FALLBACK_CHIP_ACCESSIBILITY_LABEL" desc="Accessibility label for the chip buttons displayed in the manual fallback screen and that are allowing the user to autofill a specific form field. This label will be followed by the title of the chip button (e.g., 'Autofill janedoe@google.com' for an email address chip).">
-        Autofill <ph name="VALUE">$1<ex>Jane</ex></ph>
-      </message>
-      <message name="IDS_IOS_MANUAL_FALLBACK_PASSWORD_CHIP_ACCESSIBILITY_LABEL" desc="Accessibility label for the password chip button displayed in the password manual fallback screen and that's allowing the user to autofill their password on a specific form field.">
-        Autofill the password
-      </message>
-      <message name="IDS_IOS_MANUAL_FALLBACK_CARD_NUMBER_CHIP_ACCESSIBILITY_LABEL" desc="Accessibility label for the card number chip button displayed in the payment method manual fallback screen and that's allowing the user to autofill a specific form field with their card number.">
-        Autofill the card number ending in <ph name="LAST_DIGITS">$1<ex>1234</ex></ph>
-      </message>
-      <message name="IDS_IOS_MANUAL_FALLBACK_EXPIRATION_MONTH_CHIP_ACCESSIBILITY_LABEL" desc="Accessibility label for the expiration month chip button displayed in the payment method manual fallback screen and that's allowing the user to autofill a specific form field with their payment method's expiration month.">
-        Autofill the expiration month <ph name="MONTH">$1<ex>04</ex></ph>
-      </message>
-      <message name="IDS_IOS_MANUAL_FALLBACK_EXPIRATION_YEAR_CHIP_ACCESSIBILITY_LABEL" desc="Accessibility label for the expiration year chip button displayed in the payment method manual fallback screen and that's allowing the user to autofill a specific form field with their payment method's expiration year.">
-        Autofill the expiration year <ph name="YEAR">$1<ex>26</ex></ph>
-      </message>
-      <message name="IDS_IOS_MANUAL_FALLBACK_CARDHOLDER_CHIP_ACCESSIBILITY_LABEL" desc="Accessibility label for the cardholder chip button displayed in the payment method manual fallback screen and that's allowing the user to autofill a specific form field with their payment method's cardholder'.">
-        Autofill the cardholder <ph name="NAME">$1<ex>Jane Doe</ex></ph>
-      </message>
-      <message name="IDS_IOS_MANUAL_FALLBACK_CVC_CHIP_ACCESSIBILITY_LABEL" desc="Accessibility label for the CVC chip button displayed in the payment method manual fallback screen and that's allowing the user to autofill a specific form field with their payment method's CVC.">
-        Autofill the CVC
-      </message>
-      <message name="IDS_IOS_CONTENT_CONTEXT_OPENMANAGEINNEWTAB" desc="The iOS menu item for managing a selected item. [iOS only]">
-        Manage
-      </message>
-      <message name="IDS_IOS_COLLAPSED_PRIMARY_TOOLBAR_BUTTON" desc="The accessibility label for the collapsed toolbar button in primary toolbar. [iOS only].">
-        Collapsed primary toolbar button
-      </message>
-      <message name="IDS_IOS_KEYBOARD_GO_TO_INCOGNITO_TAB_GRID" desc="The title of the keyboard shortcut to go to the incognito tab grid from the tab grid menu." meaning="Used as a command title in the iPad command menu.">
-        Incognito tab grid
-      </message>
-      <message name="IDS_IOS_KEYBOARD_GO_TO_REGULAR_TAB_GRID" desc="The title of the keyboard shortcut to go to the regular tab grid from the tab grid menu." meaning="Used as a command title in the iPad command menu.">
-        Regular tab grid
-      </message>
-      <message name="IDS_IOS_KEYBOARD_GO_TO_REMOTE_TAB_GRID" desc="The title of the keyboard shortcut to go to the remote tab grid from the tab grid menu." meaning="Used as a command title in the iPad command menu.">
-        Remote tab grid
-      </message>
-    </messages>
+      </messages>
   </release>
-</grit>
+</grit>
\ No newline at end of file
diff --git a/ios/chrome/browser/authentication/ui_bundled/authentication_flow/authentication_flow.mm b/ios/chrome/browser/authentication/ui_bundled/authentication_flow/authentication_flow.mm
index 97ac70df..6017beb 100644
--- a/ios/chrome/browser/authentication/ui_bundled/authentication_flow/authentication_flow.mm
+++ b/ios/chrome/browser/authentication/ui_bundled/authentication_flow/authentication_flow.mm
@@ -69,20 +69,6 @@
   DONE
 };
 
-// Values of Signin.AccountType histogram. This histogram records if the user
-// uses a gmail account or a managed account when signing in.
-// These values are persisted to logs. Entries should not be renumbered and
-// numeric values should never be reused. Keep in sync with SigninAccountType in
-// tools/metrics/histograms/metadata/signin/enums.xml.
-enum class SigninAccountType {
-  // Gmail account.
-  kRegular = 0,
-  // Managed account.
-  kManaged = 1,
-  // Always the last enumerated type.
-  kMaxValue = kManaged,
-};
-
 enum class CancelationReason {
   // Not canceled.
   kNotCanceled,
@@ -491,10 +477,11 @@
 - (void)completeWithSuccessStep {
   DCHECK(_signInCompletion)
       << "`completeSignInWithResult` should not be called twice.";
-  base::UmaHistogramEnumeration("Signin.AccountType.SigninConsent",
-                                _identityToSignInHostedDomain.length > 0
-                                    ? SigninAccountType::kManaged
-                                    : SigninAccountType::kRegular);
+  signin_metrics::SigninAccountType accountType =
+      (_identityToSignInHostedDomain.length > 0)
+          ? signin_metrics::SigninAccountType::kManaged
+          : signin_metrics::SigninAccountType::kRegular;
+  signin_metrics::LogSigninWithAccountType(accountType);
   SigninCompletionCallback signInCompletion = _signInCompletion;
   _signInCompletion = nil;
   signInCompletion(SigninCoordinatorResult::SigninCoordinatorResultSuccess);
diff --git a/ios/chrome/browser/authentication/ui_bundled/authentication_flow/authentication_flow_unittest.mm b/ios/chrome/browser/authentication/ui_bundled/authentication_flow/authentication_flow_unittest.mm
index 835f359d..419efa3 100644
--- a/ios/chrome/browser/authentication/ui_bundled/authentication_flow/authentication_flow_unittest.mm
+++ b/ios/chrome/browser/authentication/ui_bundled/authentication_flow/authentication_flow_unittest.mm
@@ -53,14 +53,6 @@
 NSString* const kFakeClientID = @"fake_client_id";
 NSString* const kFakeUserAffiliationID = @"fake_user_affiliation_id";
 
-// Duplicated from
-// ios/chrome/browser/authentication/ui_bundled/authentication_flow.mm, which
-// is fine since the enum values should never be renumbered.
-enum class SigninAccountType {
-  kRegular = 0,
-  kManaged = 1,
-};
-
 class AuthenticationFlowTest : public PlatformTest {
  protected:
   void SetUp() override {
@@ -267,8 +259,9 @@
 
   SignIn(identity1_, signin_metrics::AccessPoint::ACCESS_POINT_START_PAGE);
 
-  histogram_tester_.ExpectUniqueSample("Signin.AccountType.SigninConsent",
-                                       SigninAccountType::kRegular, 1);
+  histogram_tester_.ExpectUniqueSample(
+      "Signin.AccountType.SigninConsent",
+      signin_metrics::SigninAccountType::kRegular, 1);
 }
 
 // Tests a Sign In of a normal account on the same profile using a navigatiion
@@ -284,8 +277,9 @@
 
   SignIn(identity1_, signin_metrics::AccessPoint::ACCESS_POINT_START_PAGE);
 
-  histogram_tester_.ExpectUniqueSample("Signin.AccountType.SigninConsent",
-                                       SigninAccountType::kRegular, 1);
+  histogram_tester_.ExpectUniqueSample(
+      "Signin.AccountType.SigninConsent",
+      signin_metrics::SigninAccountType::kRegular, 1);
 }
 
 // Tests the fetch managed status failure case.
@@ -325,8 +319,9 @@
 
   SignIn(managed_identity1_,
          signin_metrics::AccessPoint::ACCESS_POINT_SUPERVISED_USER);
-  histogram_tester_.ExpectUniqueSample("Signin.AccountType.SigninConsent",
-                                       SigninAccountType::kManaged, 1);
+  histogram_tester_.ExpectUniqueSample(
+      "Signin.AccountType.SigninConsent",
+      signin_metrics::SigninAccountType::kManaged, 1);
   EXPECT_EQ(1, managed_confirmation_dialog_shown_count_);
 }
 
@@ -352,8 +347,9 @@
 
   SignIn(managed_identity1_,
          signin_metrics::AccessPoint::ACCESS_POINT_SUPERVISED_USER);
-  histogram_tester_.ExpectUniqueSample("Signin.AccountType.SigninConsent",
-                                       SigninAccountType::kManaged, 1);
+  histogram_tester_.ExpectUniqueSample(
+      "Signin.AccountType.SigninConsent",
+      signin_metrics::SigninAccountType::kManaged, 1);
   EXPECT_EQ(0, managed_confirmation_dialog_shown_count_);
 }
 
diff --git a/ios/chrome/browser/authentication/ui_bundled/signin/signin_coordinator_egtest.mm b/ios/chrome/browser/authentication/ui_bundled/signin/signin_coordinator_egtest.mm
index 35fc2a0..1c840d54 100644
--- a/ios/chrome/browser/authentication/ui_bundled/signin/signin_coordinator_egtest.mm
+++ b/ios/chrome/browser/authentication/ui_bundled/signin/signin_coordinator_egtest.mm
@@ -74,14 +74,6 @@
 
 namespace {
 
-// Duplicated from
-// ios/chrome/browser/authentication/ui_bundled/authentication_flow.mm, which is
-// fine since the enum values should never be renumbered.
-enum class SigninAccountType {
-  kRegular = 0,
-  kManaged = 1,
-};
-
 // Label used to find the 'Learn more' link.
 NSString* const kLearnMoreLabel = @"Learn More";
 
@@ -101,7 +93,8 @@
                  }];
 }
 
-void ExpectSigninConsentHistogram(SigninAccountType signinAccountType) {
+void ExpectSigninConsentHistogram(
+    signin_metrics::SigninAccountType signinAccountType) {
   NSError* error = [MetricsAppInterface
       expectTotalCount:1
           forHistogram:@"Signin.AccountType.SigninConsent"];
@@ -173,7 +166,7 @@
 
   // Check `fakeIdentity` is signed-in.
   [SigninEarlGrey verifySignedInWithFakeIdentity:fakeIdentity];
-  ExpectSigninConsentHistogram(SigninAccountType::kRegular);
+  ExpectSigninConsentHistogram(signin_metrics::SigninAccountType::kRegular);
 }
 
 // Tests that opening the sign-in screen from the Settings and signing in works
@@ -299,7 +292,7 @@
 
   // Check `fakeIdentity` is signed-in.
   [SigninEarlGrey verifySignedInWithFakeIdentity:fakeIdentity];
-  ExpectSigninConsentHistogram(SigninAccountType::kManaged);
+  ExpectSigninConsentHistogram(signin_metrics::SigninAccountType::kManaged);
 
   [SigninEarlGreyUI signOut];
 }
@@ -312,7 +305,7 @@
 
   // Check `fakeIdentity` is signed-in.
   [SigninEarlGrey verifySignedInWithFakeIdentity:fakeIdentity];
-  ExpectSigninConsentHistogram(SigninAccountType::kManaged);
+  ExpectSigninConsentHistogram(signin_metrics::SigninAccountType::kManaged);
 
   [ChromeEarlGreyUI openSettingsMenu];
 
diff --git a/ios/chrome/browser/first_run/ui_bundled/BUILD.gn b/ios/chrome/browser/first_run/ui_bundled/BUILD.gn
index 14c1e7a1..2ba5303 100644
--- a/ios/chrome/browser/first_run/ui_bundled/BUILD.gn
+++ b/ios/chrome/browser/first_run/ui_bundled/BUILD.gn
@@ -7,7 +7,12 @@
     "features.h",
     "features.mm",
   ]
-  deps = [ "//base" ]
+  deps = [
+    "//base",
+    "//components/search_engines",
+    "//ios/chrome/browser/search_engines/model",
+    "//ios/chrome/browser/shared/model/profile",
+  ]
 }
 
 source_set("field_trial") {
diff --git a/ios/chrome/browser/first_run/ui_bundled/features.h b/ios/chrome/browser/first_run/ui_bundled/features.h
index e97d938..2f7a8845 100644
--- a/ios/chrome/browser/first_run/ui_bundled/features.h
+++ b/ios/chrome/browser/first_run/ui_bundled/features.h
@@ -7,6 +7,8 @@
 
 #import "base/feature_list.h"
 
+class ProfileIOS;
+
 namespace first_run {
 
 // Enum to represent arms of feature kUpdatedFirstRunSequence.
@@ -25,8 +27,10 @@
 extern const char kUpdatedFirstRunSequenceParam[];
 
 // Returns which variation of the kUpdatedFirstRunSequence feature is enabled or
-// `kDisabled` if the feature is disabled.
-UpdatedFRESequenceVariationType GetUpdatedFRESequenceVariation();
+// `kDisabled` if the feature is disabled. This feature is disabled for EEA
+// countries.
+UpdatedFRESequenceVariationType GetUpdatedFRESequenceVariation(
+    ProfileIOS* profile);
 
 }  // namespace first_run
 
diff --git a/ios/chrome/browser/first_run/ui_bundled/features.mm b/ios/chrome/browser/first_run/ui_bundled/features.mm
index 24cbd27..804449bc 100644
--- a/ios/chrome/browser/first_run/ui_bundled/features.mm
+++ b/ios/chrome/browser/first_run/ui_bundled/features.mm
@@ -5,6 +5,10 @@
 #import "ios/chrome/browser/first_run/ui_bundled/features.h"
 
 #import "base/metrics/field_trial_params.h"
+#import "components/search_engines/search_engine_choice/search_engine_choice_service.h"
+#import "components/search_engines/search_engine_choice/search_engine_choice_utils.h"
+#import "ios/chrome/browser/search_engines/model/search_engine_choice_service_factory.h"
+#import "ios/chrome/browser/shared/model/profile/profile_ios.h"
 
 namespace first_run {
 
@@ -14,8 +18,14 @@
 
 const char kUpdatedFirstRunSequenceParam[] = "updated-first-run-sequence-param";
 
-UpdatedFRESequenceVariationType GetUpdatedFRESequenceVariation() {
-  if (!base::FeatureList::IsEnabled(kUpdatedFirstRunSequence)) {
+UpdatedFRESequenceVariationType GetUpdatedFRESequenceVariation(
+    ProfileIOS* profile) {
+  BOOL excluded_country = search_engines::IsEeaChoiceCountry(
+      ios::SearchEngineChoiceServiceFactory::GetForProfile(profile)
+          ->GetCountryId());
+
+  if (!base::FeatureList::IsEnabled(kUpdatedFirstRunSequence) ||
+      excluded_country) {
     return UpdatedFRESequenceVariationType::kDisabled;
   }
   return static_cast<UpdatedFRESequenceVariationType>(
diff --git a/ios/tools/order_string_file.py b/ios/tools/order_string_file.py
new file mode 100644
index 0000000..1cedac73
--- /dev/null
+++ b/ios/tools/order_string_file.py
@@ -0,0 +1,46 @@
+# Copyright 2025 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+"""Script to alphabetically order string messages
+
+This script alphabetically orders the messages in the
+.grd file passed in argument.
+"""
+
+import xml.etree.ElementTree as ElementTree
+import sys
+
+
+# Alphabetically sort the file given as first argument
+def SortFile(file_path):
+    parser = ElementTree.XMLParser(target=ElementTree.TreeBuilder(
+        insert_comments=True))
+    with open(file_path, 'r') as xml_file:
+        try:
+            tree = ElementTree.parse(xml_file, parser)
+        except ElementTree.ParseError:
+            print("ERROR while parsing (wrongly formatted file?):\n" +
+                  file_path)
+            return -1
+
+    root = tree.getroot()
+    messages_element = tree.findall('.//messages')[0]
+    messages = messages_element.findall('message')
+    messages.sort(key=lambda message: message.attrib["name"])
+    for message in messages:
+        messages_element.remove(message)
+    for message in messages:
+        messages_element.append(message)
+    tree.write(file_path, encoding="UTF-8", xml_declaration=True)
+
+
+def main(args):
+    if len(args) == 0:
+        print("ERROR: Pass the path to the file to order.")
+        return -1
+    for paths in args:
+        SortFile(paths)
+
+
+if __name__ == "__main__":
+    sys.exit(main(sys.argv[1:]))
diff --git a/ios_internal b/ios_internal
index f622666..c7edd0f 160000
--- a/ios_internal
+++ b/ios_internal
@@ -1 +1 @@
-Subproject commit f622666c2d3e428fc7eed7c570bb629f049ea497
+Subproject commit c7edd0f42e54c80ca27602846639c13933b2b7c8
diff --git a/media/base/android/java/src/org/chromium/media/MediaCodecUtil.java b/media/base/android/java/src/org/chromium/media/MediaCodecUtil.java
index cdb063d..63b2ceb 100644
--- a/media/base/android/java/src/org/chromium/media/MediaCodecUtil.java
+++ b/media/base/android/java/src/org/chromium/media/MediaCodecUtil.java
@@ -74,7 +74,7 @@
 
         @SuppressWarnings("deprecation")
         private int getCodecCount() {
-            if (hasNewMediaCodecList()) return mCodecList.length;
+            if (mCodecList != null) return mCodecList.length;
             try {
                 return MediaCodecList.getCodecCount();
             } catch (RuntimeException e) {
@@ -86,16 +86,11 @@
 
         @SuppressWarnings("deprecation")
         private MediaCodecInfo getCodecInfoAt(int index) {
-            if (hasNewMediaCodecList()) return mCodecList[index];
+            if (mCodecList != null) return mCodecList[index];
             return MediaCodecList.getCodecInfoAt(index);
         }
 
-        private boolean hasNewMediaCodecList() {
-            return mCodecList != null;
-        }
-
-        @SuppressWarnings("NullAway.Init")
-        private MediaCodecInfo[] mCodecList;
+        private MediaCodecInfo @Nullable [] mCodecList;
 
         private class CodecInfoIterator implements Iterator<MediaCodecInfo> {
             private int mPosition;
@@ -224,7 +219,7 @@
         }
 
         MediaCodecListHelper codecListHelper = new MediaCodecListHelper();
-        if (codecListHelper.hasNewMediaCodecList()) {
+        if (codecListHelper.mCodecList != null) {
             for (MediaCodecInfo info : codecListHelper) {
                 if (info.isEncoder()) continue;
 
diff --git a/media/capture/mojom/video_capture_types.mojom b/media/capture/mojom/video_capture_types.mojom
index c0388dc..993841b 100644
--- a/media/capture/mojom/video_capture_types.mojom
+++ b/media/capture/mojom/video_capture_types.mojom
@@ -166,7 +166,7 @@
   kCrosHalV3DeviceDelegateWrongNumberOfStreamsConfigured,
   kCrosHalV3DeviceDelegateFailedToGetDefaultRequestSettings,
   kCrosHalV3BufferManagerHalRequestedTooManyBuffers,
-  kCrosHalV3BufferManagerFailedToCreateGpuMemoryBuffer,
+  kCrosHalV3BufferManagerFailedToCreateMappableSI,
   kCrosHalV3BufferManagerFailedToMapGpuMemoryBuffer,
   kCrosHalV3BufferManagerUnsupportedVideoPixelFormat,
   kCrosHalV3BufferManagerFailedToDupFd,
diff --git a/media/capture/mojom/video_capture_types_mojom_traits.cc b/media/capture/mojom/video_capture_types_mojom_traits.cc
index bf7c0272..149ca77 100644
--- a/media/capture/mojom/video_capture_types_mojom_traits.cc
+++ b/media/capture/mojom/video_capture_types_mojom_traits.cc
@@ -495,9 +495,9 @@
       return media::mojom::VideoCaptureError::
           kCrosHalV3BufferManagerHalRequestedTooManyBuffers;
     case media::VideoCaptureError::
-        kCrosHalV3BufferManagerFailedToCreateGpuMemoryBuffer:
+        kCrosHalV3BufferManagerFailedToCreateMappableSI:
       return media::mojom::VideoCaptureError::
-          kCrosHalV3BufferManagerFailedToCreateGpuMemoryBuffer;
+          kCrosHalV3BufferManagerFailedToCreateMappableSI;
     case media::VideoCaptureError::
         kCrosHalV3BufferManagerFailedToMapGpuMemoryBuffer:
       return media::mojom::VideoCaptureError::
@@ -1031,9 +1031,9 @@
           kCrosHalV3BufferManagerHalRequestedTooManyBuffers;
       return true;
     case media::mojom::VideoCaptureError::
-        kCrosHalV3BufferManagerFailedToCreateGpuMemoryBuffer:
+        kCrosHalV3BufferManagerFailedToCreateMappableSI:
       *output = media::VideoCaptureError::
-          kCrosHalV3BufferManagerFailedToCreateGpuMemoryBuffer;
+          kCrosHalV3BufferManagerFailedToCreateMappableSI;
       return true;
     case media::mojom::VideoCaptureError::
         kCrosHalV3BufferManagerFailedToMapGpuMemoryBuffer:
diff --git a/media/capture/video/DEPS b/media/capture/video/DEPS
index d6dd043..b8428df 100644
--- a/media/capture/video/DEPS
+++ b/media/capture/video/DEPS
@@ -17,4 +17,7 @@
   "video_capture_effects_processor_unittest\.cc": [
     "+components/viz/test",
   ],
+  "video_capture_device_client_unittest.cc": [
+    "+components/viz/test/test_context_provider.h",
+  ],
 }
diff --git a/media/capture/video/android/java/src/org/chromium/media/VideoCapture.java b/media/capture/video/android/java/src/org/chromium/media/VideoCapture.java
index 843cc99..ab6185bf 100644
--- a/media/capture/video/android/java/src/org/chromium/media/VideoCapture.java
+++ b/media/capture/video/android/java/src/org/chromium/media/VideoCapture.java
@@ -4,6 +4,8 @@
 
 package org.chromium.media;
 
+import static org.chromium.build.NullUtil.assumeNonNull;
+
 import android.content.Context;
 import android.graphics.ImageFormat;
 import android.hardware.display.DisplayManager;
@@ -50,8 +52,7 @@
     // individual implementations.
     protected boolean mInvertDeviceOrientationReadings;
 
-    @SuppressWarnings("NullAway.Init")
-    protected VideoCaptureFormat mCaptureFormat;
+    protected @Nullable VideoCaptureFormat mCaptureFormat;
 
     protected final int mId;
     // Native callback context variable.
@@ -146,21 +147,25 @@
 
     @CalledByNative
     public final int queryWidth() {
+        assumeNonNull(mCaptureFormat);
         return mCaptureFormat.mWidth;
     }
 
     @CalledByNative
     public final int queryHeight() {
+        assumeNonNull(mCaptureFormat);
         return mCaptureFormat.mHeight;
     }
 
     @CalledByNative
     public final int queryFrameRate() {
+        assumeNonNull(mCaptureFormat);
         return mCaptureFormat.mFramerate;
     }
 
     @CalledByNative
     public final int getColorspace() {
+        assumeNonNull(mCaptureFormat);
         switch (mCaptureFormat.mPixelFormat) {
             case ImageFormat.YV12:
                 return AndroidImageFormat.YV12;
diff --git a/media/capture/video/chromeos/DEPS b/media/capture/video/chromeos/DEPS
index e28bf0c..a0caf2eb 100644
--- a/media/capture/video/chromeos/DEPS
+++ b/media/capture/video/chromeos/DEPS
@@ -16,4 +16,7 @@
   "camera_hal_delegate_unittest.cc": [
     "+components/viz/test/test_context_provider.h",
   ],
+  "request_manager_unittest.cc": [
+    "+components/viz/test/test_context_provider.h",
+  ],
 }
diff --git a/media/capture/video/chromeos/camera_app_device_impl.cc b/media/capture/video/chromeos/camera_app_device_impl.cc
index ab8b7650..e971c840 100644
--- a/media/capture/video/chromeos/camera_app_device_impl.cc
+++ b/media/capture/video/chromeos/camera_app_device_impl.cc
@@ -177,7 +177,7 @@
 }
 
 void CameraAppDeviceImpl::MaybeDetectDocumentCorners(
-    std::unique_ptr<gpu::GpuMemoryBufferImpl> gmb,
+    scoped_refptr<gpu::ClientSharedImage> shared_image,
     VideoRotation rotation) {
   {
     base::AutoLock lock(document_corners_observers_lock_);
@@ -188,8 +188,8 @@
   mojo_task_runner_->PostTask(
       FROM_HERE,
       base::BindOnce(&CameraAppDeviceImpl::DetectDocumentCornersOnMojoThread,
-                     weak_ptr_factory_for_mojo_.GetWeakPtr(), std::move(gmb),
-                     rotation));
+                     weak_ptr_factory_for_mojo_.GetWeakPtr(),
+                     std::move(shared_image), rotation));
 }
 
 bool CameraAppDeviceImpl::IsMultipleStreamsEnabled() {
@@ -387,7 +387,7 @@
 }
 
 void CameraAppDeviceImpl::DetectDocumentCornersOnMojoThread(
-    std::unique_ptr<gpu::GpuMemoryBufferImpl> image,
+    scoped_refptr<gpu::ClientSharedImage> shared_image,
     VideoRotation rotation) {
   DCHECK(mojo_task_runner_->BelongsToCurrentThread());
 
@@ -396,12 +396,14 @@
     return;
   }
 
-  DCHECK(image);
-  if (!image->Map()) {
+  CHECK(shared_image);
+
+  auto scoped_mapping = shared_image->Map();
+  if (!scoped_mapping) {
     LOG(ERROR) << "Failed to map frame buffer";
     return;
   }
-  auto frame_size = image->GetSize();
+  auto frame_size = scoped_mapping->Size();
   int width = frame_size.width();
   int height = frame_size.height();
 
@@ -415,11 +417,10 @@
   auto* uv_data = y_data + kDetectionWidth * kDetectionHeight;
 
   int status = libyuv::NV12Scale(
-      static_cast<uint8_t*>(image->memory(0)), image->stride(0),
-      static_cast<uint8_t*>(image->memory(1)), image->stride(1), width, height,
-      y_data, kDetectionWidth, uv_data, kDetectionWidth, kDetectionWidth,
-      kDetectionHeight, libyuv::FilterMode::kFilterNone);
-  image->Unmap();
+      scoped_mapping->GetMemoryForPlane(0).data(), scoped_mapping->Stride(0),
+      scoped_mapping->GetMemoryForPlane(1).data(), scoped_mapping->Stride(1),
+      width, height, y_data, kDetectionWidth, uv_data, kDetectionWidth,
+      kDetectionWidth, kDetectionHeight, libyuv::FilterMode::kFilterNone);
   if (status != 0) {
     LOG(ERROR) << "Failed to scale buffer";
     return;
diff --git a/media/capture/video/chromeos/camera_app_device_impl.h b/media/capture/video/chromeos/camera_app_device_impl.h
index 30bd69d..723c8ce 100644
--- a/media/capture/video/chromeos/camera_app_device_impl.h
+++ b/media/capture/video/chromeos/camera_app_device_impl.h
@@ -30,12 +30,6 @@
 #include "ui/gfx/geometry/size.h"
 #include "ui/gfx/range/range.h"
 
-namespace gpu {
-
-class GpuMemoryBufferImpl;
-
-}  // namespace gpu
-
 namespace media {
 
 class CameraDeviceContext;
@@ -106,10 +100,11 @@
   // opened camera.  Used to configure and query camera frame rotation.
   void SetCameraDeviceContext(CameraDeviceContext* device_context);
 
-  // Detect document corners on the frame given by its gpu memory buffer if it
-  // is supported.
-  void MaybeDetectDocumentCorners(std::unique_ptr<gpu::GpuMemoryBufferImpl> gmb,
-                                  VideoRotation rotation);
+  // Detect document corners on the frame given by its mappable shared image if
+  // it is supported.
+  void MaybeDetectDocumentCorners(
+      scoped_refptr<gpu::ClientSharedImage> shared_image,
+      VideoRotation rotation);
 
   bool IsMultipleStreamsEnabled();
 
@@ -158,7 +153,7 @@
   bool IsCloseToPreviousDetectionRequest();
 
   void DetectDocumentCornersOnMojoThread(
-      std::unique_ptr<gpu::GpuMemoryBufferImpl> image,
+      scoped_refptr<gpu::ClientSharedImage> shared_image,
       VideoRotation rotation);
 
   void OnDetectedDocumentCornersOnMojoThread(
diff --git a/media/capture/video/chromeos/camera_device_context.cc b/media/capture/video/chromeos/camera_device_context.cc
index 95ada7d..2d863bd0 100644
--- a/media/capture/video/chromeos/camera_device_context.cc
+++ b/media/capture/video/chromeos/camera_device_context.cc
@@ -105,9 +105,9 @@
       std::move(metadata));
 }
 
-void CameraDeviceContext::SubmitCapturedGpuMemoryBuffer(
+void CameraDeviceContext::SubmitCapturedImage(
     ClientType client_type,
-    gfx::GpuMemoryBuffer* buffer,
+    scoped_refptr<gpu::ClientSharedImage> shared_image,
     const VideoCaptureFormat& frame_format,
     base::TimeTicks reference_time,
     base::TimeDelta timestamp) {
@@ -117,9 +117,10 @@
     return;
   }
 
-  client->second->OnIncomingCapturedGfxBuffer(
-      buffer, frame_format, GetCameraFrameRotation(), reference_time, timestamp,
-      /*capture_begin_timestamp=*/std::nullopt, /*metadata=*/std::nullopt);
+  client->second->OnIncomingCapturedImage(
+      std::move(shared_image), frame_format, GetCameraFrameRotation(),
+      reference_time, timestamp, /*capture_begin_timestamp=*/std::nullopt,
+      /*metadata=*/std::nullopt);
 }
 
 void CameraDeviceContext::SetSensorOrientation(int sensor_orientation) {
diff --git a/media/capture/video/chromeos/camera_device_context.h b/media/capture/video/chromeos/camera_device_context.h
index 72748fd..5cc9f65 100644
--- a/media/capture/video/chromeos/camera_device_context.h
+++ b/media/capture/video/chromeos/camera_device_context.h
@@ -16,6 +16,10 @@
 #include "media/capture/video/video_capture_device.h"
 #include "ui/gfx/color_space.h"
 
+namespace gpu {
+class ClientSharedImage;
+}
+
 namespace media {
 
 enum class ClientType : uint32_t {
@@ -135,15 +139,15 @@
       const VideoFrameMetadata& metadata);
 
   // Submits the captured camera frame through a locally-allocated
-  // GpuMemoryBuffer.  The captured buffer would be submitted through
-  // |client_->OnIncomingCapturedGfxBuffer|, which would perform buffer copy
+  // image.  The captured buffer would be submitted through
+  // |client_->OnIncomingCapturedImage|, which would perform buffer copy
   // and/or format conversion to an I420 SharedMemory-based video capture buffer
   // for client consumption.
-  void SubmitCapturedGpuMemoryBuffer(ClientType client_type,
-                                     gfx::GpuMemoryBuffer* buffer,
-                                     const VideoCaptureFormat& frame_format,
-                                     base::TimeTicks reference_time,
-                                     base::TimeDelta timestamp);
+  void SubmitCapturedImage(ClientType client_type,
+                           scoped_refptr<gpu::ClientSharedImage> shared_image,
+                           const VideoCaptureFormat& frame_format,
+                           base::TimeTicks reference_time,
+                           base::TimeDelta timestamp);
 
   void SetSensorOrientation(int sensor_orientation);
 
diff --git a/media/capture/video/chromeos/camera_device_delegate_unittest.cc b/media/capture/video/chromeos/camera_device_delegate_unittest.cc
index 0360cee9..746880b 100644
--- a/media/capture/video/chromeos/camera_device_delegate_unittest.cc
+++ b/media/capture/video/chromeos/camera_device_delegate_unittest.cc
@@ -31,7 +31,6 @@
 #include "media/capture/video/chromeos/mock_vendor_tag_ops.h"
 #include "media/capture/video/chromeos/mock_video_capture_client.h"
 #include "media/capture/video/chromeos/video_capture_device_factory_chromeos.h"
-#include "media/capture/video/mock_gpu_memory_buffer_manager.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
 #include "mojo/public/cpp/bindings/receiver.h"
@@ -168,8 +167,6 @@
   CameraDeviceDelegateTest& operator=(const CameraDeviceDelegateTest&) = delete;
 
   void SetUp() override {
-    VideoCaptureDeviceFactoryChromeOS::SetGpuBufferManager(
-        &mock_gpu_memory_buffer_manager_);
     test_sii_ = base::MakeRefCounted<gpu::TestSharedImageInterface>();
     test_sii_->UseTestGMBInSharedImageCreationWithBufferUsage();
     VideoCaptureDeviceFactoryChromeOS::SetSharedImageInterface(test_sii_);
@@ -432,9 +429,6 @@
         .WillOnce(
             Invoke(this, &CameraDeviceDelegateTest::ConfigureFakeStreams));
 
-    // CameraBufferFactory::ResolveStreamBufferFormat() is now using
-    // ::CreateSharedImage() instead of ::CreateGpuMemoryBuffer(). Hence adding
-    // some expectations here.
     EXPECT_CALL(*test_sii_,
                 DoCreateSharedImage(
                     _, viz::MultiPlaneFormat::kNV12, gpu::kNullSurfaceHandle,
@@ -447,28 +441,16 @@
         .Times(AtMost(1));
     EXPECT_CALL(*test_sii_,
                 DoCreateSharedImage(
+                    gfx::Size(kDefaultWidth, kDefaultHeight),
+                    viz::MultiPlaneFormat::kNV12, gpu::kNullSurfaceHandle,
+                    gfx::BufferUsage::VEA_READ_CAMERA_AND_CPU_READ_WRITE))
+        .Times(1);
+    EXPECT_CALL(*test_sii_,
+                DoCreateSharedImage(
                     gfx::Size(kJpegMaxBufferSize, 1),
                     viz::SinglePlaneFormat::kR_8, gpu::kNullSurfaceHandle,
                     gfx::BufferUsage::CAMERA_AND_CPU_READ_WRITE))
         .Times(AtMost(1));
-
-    // Note that ::CreateGpuMemoryBuffer() is currently being used by
-    // StreamBufferManager.
-    ON_CALL(mock_gpu_memory_buffer_manager_,
-            CreateGpuMemoryBuffer(_, gfx::BufferFormat::R_8,
-                                  gfx::BufferUsage::CAMERA_AND_CPU_READ_WRITE,
-                                  gpu::kNullSurfaceHandle, nullptr))
-        .WillByDefault(Invoke(&unittest_internal::MockGpuMemoryBufferManager::
-                                  CreateFakeGpuMemoryBuffer));
-    EXPECT_CALL(mock_gpu_memory_buffer_manager_,
-                CreateGpuMemoryBuffer(
-                    gfx::Size(kDefaultWidth, kDefaultHeight),
-                    gfx::BufferFormat::YUV_420_BIPLANAR,
-                    gfx::BufferUsage::VEA_READ_CAMERA_AND_CPU_READ_WRITE,
-                    gpu::kNullSurfaceHandle, nullptr))
-        .Times(1)
-        .WillOnce(Invoke(&unittest_internal::MockGpuMemoryBufferManager::
-                             CreateFakeGpuMemoryBuffer));
   }
 
   void SetUpExpectationUntilCapturing(
@@ -562,7 +544,6 @@
 
   testing::StrictMock<unittest_internal::MockCameraModule> mock_camera_module_;
   testing::NiceMock<unittest_internal::MockVendorTagOps> mock_vendor_tag_ops_;
-  unittest_internal::MockGpuMemoryBufferManager mock_gpu_memory_buffer_manager_;
   scoped_refptr<gpu::TestSharedImageInterface> test_sii_;
 
   testing::StrictMock<MockCameraDevice> mock_camera_device_;
diff --git a/media/capture/video/chromeos/mock_video_capture_client.cc b/media/capture/video/chromeos/mock_video_capture_client.cc
index 56366f6..32c56d4 100644
--- a/media/capture/video/chromeos/mock_video_capture_client.cc
+++ b/media/capture/video/chromeos/mock_video_capture_client.cc
@@ -56,8 +56,8 @@
     std::move(frame_cb_).Run();
 }
 
-void MockVideoCaptureClient::OnIncomingCapturedGfxBuffer(
-    gfx::GpuMemoryBuffer* buffer,
+void MockVideoCaptureClient::OnIncomingCapturedImage(
+    scoped_refptr<gpu::ClientSharedImage> shared_image,
     const VideoCaptureFormat& frame_format,
     int clockwise_rotation,
     base::TimeTicks reference_time,
@@ -65,8 +65,8 @@
     std::optional<base::TimeTicks> capture_begin_time,
     const std::optional<media::VideoFrameMetadata>& metadata,
     int frame_feedback_id) {
-  ASSERT_TRUE(buffer);
-  ASSERT_GT(buffer->GetSize().width() * buffer->GetSize().height(), 0);
+  ASSERT_TRUE(shared_image);
+  ASSERT_FALSE(shared_image->size().IsEmpty());
   if (frame_cb_)
     std::move(frame_cb_).Run();
 }
diff --git a/media/capture/video/chromeos/mock_video_capture_client.h b/media/capture/video/chromeos/mock_video_capture_client.h
index ec3e43ba..e9d449c2 100644
--- a/media/capture/video/chromeos/mock_video_capture_client.h
+++ b/media/capture/video/chromeos/mock_video_capture_client.h
@@ -52,8 +52,8 @@
       std::optional<base::TimeTicks> capture_begin_time,
       const std::optional<media::VideoFrameMetadata>& metadata,
       int frame_feedback_id) override;
-  void OnIncomingCapturedGfxBuffer(
-      gfx::GpuMemoryBuffer* buffer,
+  void OnIncomingCapturedImage(
+      scoped_refptr<gpu::ClientSharedImage> shared_image,
       const VideoCaptureFormat& frame_format,
       int clockwise_rotation,
       base::TimeTicks reference_time,
diff --git a/media/capture/video/chromeos/request_manager.cc b/media/capture/video/chromeos/request_manager.cc
index ae4d3d8..616f9f5 100644
--- a/media/capture/video/chromeos/request_manager.cc
+++ b/media/capture/video/chromeos/request_manager.cc
@@ -1122,8 +1122,11 @@
         CameraAppDeviceBridgeImpl::GetInstance()->GetWeakCameraAppDevice(
             device_id_);
     if (camera_app_device && stream_type == StreamType::kPreviewOutput) {
+      // TODO(crbug.com/359601431): Get shared image directly from the
+      // |buffer->handle_provider| once all VideoCaptureBufferTracker are
+      // converted to create MappableSI.
       camera_app_device->MaybeDetectDocumentCorners(
-          stream_buffer_manager_->CreateGpuMemoryBuffer(
+          stream_buffer_manager_->CreateSharedImageFromGmbHandle(
               buffer->handle_provider->GetGpuMemoryBufferHandle(), format,
               gfx::BufferUsage::VEA_READ_CAMERA_AND_CPU_READ_WRITE),
           metadata.transformation->rotation);
@@ -1136,11 +1139,10 @@
     // new video buffer.
     stream_buffer_manager_->ReserveBuffer(stream_type);
   } else {
-    gfx::GpuMemoryBuffer* gmb = stream_buffer_manager_->GetGpuMemoryBufferById(
-        stream_type, buffer_ipc_id);
-    CHECK(gmb);
-    device_context_->SubmitCapturedGpuMemoryBuffer(
-        client_type, gmb,
+    auto shared_image =
+        stream_buffer_manager_->GetSharedImageById(stream_type, buffer_ipc_id);
+    device_context_->SubmitCapturedImage(
+        client_type, std::move(shared_image),
         stream_buffer_manager_->GetStreamCaptureFormat(stream_type),
         pending_result.reference_time, pending_result.timestamp);
     stream_buffer_manager_->ReleaseBufferFromCaptureResult(stream_type,
@@ -1154,20 +1156,20 @@
   CaptureResult& pending_result = pending_results_[frame_number];
   gfx::Size buffer_dimension =
       stream_buffer_manager_->GetBufferDimension(stream_type);
-  gfx::GpuMemoryBuffer* gmb = stream_buffer_manager_->GetGpuMemoryBufferById(
-      stream_type, buffer_ipc_id);
-  CHECK(gmb);
-  if (!gmb->Map()) {
+  auto shared_image =
+      stream_buffer_manager_->GetSharedImageById(stream_type, buffer_ipc_id);
+  CHECK(shared_image);
+  auto scoped_mapping = shared_image->Map();
+  if (!scoped_mapping) {
     device_context_->SetErrorState(
         media::VideoCaptureError::
-            kCrosHalV3BufferManagerFailedToCreateGpuMemoryBuffer,
-        FROM_HERE, "Failed to map GPU memory buffer");
+            kCrosHalV3BufferManagerFailedToCreateMappableSI,
+        FROM_HERE, "Failed to map the shared image.");
     return;
   }
-  absl::Cleanup unmap_gmb = [gmb] { gmb->Unmap(); };
-
   const Camera3JpegBlob* header = reinterpret_cast<Camera3JpegBlob*>(
-      reinterpret_cast<const uintptr_t>(gmb->memory(0)) +
+      reinterpret_cast<const uintptr_t>(
+          scoped_mapping->GetMemoryForPlane(0).data()) +
       buffer_dimension.width() - sizeof(Camera3JpegBlob));
   if (header->jpeg_blob_id != kCamera3JpegBlobId) {
     device_context_->SetErrorState(
@@ -1178,7 +1180,7 @@
   // Still capture result from HALv3 already has orientation info in EXIF,
   // so just provide 0 as screen rotation in |blobify_callback_| parameters.
   mojom::BlobPtr blob = blobify_callback_.Run(
-      reinterpret_cast<const uint8_t*>(gmb->memory(0)), header->jpeg_size,
+      scoped_mapping->GetMemoryForPlane(0).data(), header->jpeg_size,
       stream_buffer_manager_->GetStreamCaptureFormat(stream_type), 0);
   if (blob) {
     if (stream_type == StreamType::kJpegOutput &&
diff --git a/media/capture/video/chromeos/request_manager_unittest.cc b/media/capture/video/chromeos/request_manager_unittest.cc
index ba27524f..a77ac2d 100644
--- a/media/capture/video/chromeos/request_manager_unittest.cc
+++ b/media/capture/video/chromeos/request_manager_unittest.cc
@@ -19,13 +19,14 @@
 #include "base/task/single_thread_task_runner.h"
 #include "base/test/task_environment.h"
 #include "base/threading/thread.h"
+#include "components/viz/common/resources/shared_image_format_utils.h"
+#include "components/viz/test/test_context_provider.h"
 #include "media/capture/video/blob_utils.h"
 #include "media/capture/video/chromeos/camera_buffer_factory.h"
 #include "media/capture/video/chromeos/camera_device_context.h"
 #include "media/capture/video/chromeos/camera_device_delegate.h"
 #include "media/capture/video/chromeos/mock_video_capture_client.h"
 #include "media/capture/video/chromeos/stream_buffer_manager.h"
-#include "media/capture/video/mock_gpu_memory_buffer_manager.h"
 #include "mojo/public/cpp/bindings/remote.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -79,16 +80,26 @@
 class FakeCameraBufferFactory : public CameraBufferFactory {
  public:
   FakeCameraBufferFactory() {
-    gpu_memory_buffer_manager_ =
-        std::make_unique<unittest_internal::MockGpuMemoryBufferManager>();
+    test_sii_ = base::MakeRefCounted<gpu::TestSharedImageInterface>();
+    test_sii_->UseTestGMBInSharedImageCreationWithBufferUsage();
   }
-  std::unique_ptr<gfx::GpuMemoryBuffer> CreateGpuMemoryBuffer(
+
+  scoped_refptr<gpu::ClientSharedImage> CreateSharedImage(
       const gfx::Size& size,
       gfx::BufferFormat format,
-      gfx::BufferUsage usage) override {
-    return unittest_internal::MockGpuMemoryBufferManager::
-        CreateFakeGpuMemoryBuffer(size, format, usage, gpu::kNullSurfaceHandle,
-                                  nullptr);
+      gfx::BufferUsage usage,
+      const gfx::ColorSpace& color_space) override {
+    // Setting some default usage in order to get a mappable shared image.
+    constexpr auto si_usage = gpu::SHARED_IMAGE_USAGE_CPU_WRITE_ONLY |
+                              gpu::SHARED_IMAGE_USAGE_DISPLAY_READ;
+    auto shared_image = test_sii_->CreateSharedImage(
+        {viz::GetSharedImageFormat(format), size, color_space,
+         gpu::SharedImageUsageSet(si_usage), "FakeCameraBufferFactory"},
+        gpu::kNullSurfaceHandle, usage);
+    if (!shared_image) {
+      LOG(ERROR) << "Failed to create shared image.";
+    }
+    return shared_image;
   }
 
   ChromiumPixelFormat ResolveStreamBufferFormat(
@@ -99,8 +110,7 @@
   }
 
  private:
-  std::unique_ptr<unittest_internal::MockGpuMemoryBufferManager>
-      gpu_memory_buffer_manager_;
+  scoped_refptr<gpu::TestSharedImageInterface> test_sii_;
 };
 
 }  // namespace
diff --git a/media/capture/video/chromeos/stream_buffer_manager.cc b/media/capture/video/chromeos/stream_buffer_manager.cc
index e495f87e..4b493e5 100644
--- a/media/capture/video/chromeos/stream_buffer_manager.cc
+++ b/media/capture/video/chromeos/stream_buffer_manager.cc
@@ -17,7 +17,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/stringprintf.h"
 #include "base/trace_event/trace_event.h"
-#include "gpu/ipc/common/gpu_memory_buffer_support.h"
+#include "gpu/command_buffer/client/client_shared_image.h"
 #include "media/capture/video/chromeos/camera_buffer_factory.h"
 #include "media/capture/video/chromeos/camera_metadata_utils.h"
 #include "media/capture/video/chromeos/pixel_format_utils.h"
@@ -39,11 +39,7 @@
     : device_context_(device_context),
       buffer_observer_(std::move(buffer_observer)),
       video_capture_use_gmb_(video_capture_use_gmb),
-      camera_buffer_factory_(std::move(camera_buffer_factory)) {
-  if (video_capture_use_gmb_) {
-    gmb_support_ = std::make_unique<gpu::GpuMemoryBufferSupport>();
-  }
-}
+      camera_buffer_factory_(std::move(camera_buffer_factory)) {}
 
 StreamBufferManager::~StreamBufferManager() {
   DestroyCurrentStreamsAndBuffers();
@@ -57,7 +53,7 @@
   }
 }
 
-gfx::GpuMemoryBuffer* StreamBufferManager::GetGpuMemoryBufferById(
+scoped_refptr<gpu::ClientSharedImage> StreamBufferManager::GetSharedImageById(
     StreamType stream_type,
     uint64_t buffer_ipc_id) {
   auto& stream_context = stream_context_[stream_type];
@@ -67,7 +63,7 @@
     LOG(ERROR) << "Invalid buffer: " << key << " for stream: " << stream_type;
     return nullptr;
   }
-  return it->second.gmb.get();
+  return it->second.shared_image;
 }
 
 std::optional<StreamBufferManager::Buffer>
@@ -102,12 +98,16 @@
   const std::optional<gfx::BufferFormat> gfx_format =
       PixFormatVideoToGfx(format->pixel_format);
   DCHECK(gfx_format);
-  const auto& original_gmb = buffer_pair.gmb;
-  if (!original_gmb->Map()) {
-    DLOG(WARNING) << "Failed to map original buffer";
+  const auto& original_shared_image = buffer_pair.shared_image;
+  std::unique_ptr<gpu::ClientSharedImage::ScopedMapping>
+      original_scoped_mapping;
+  if (original_shared_image) {
+    original_scoped_mapping = original_shared_image->Map();
+  }
+  if (!original_scoped_mapping) {
+    LOG(WARNING) << "Failed to map original shared image.";
     return std::move(buffer_pair.vcd_buffer);
   }
-  absl::Cleanup unmap_original_gmb = [&original_gmb] { original_gmb->Unmap(); };
 
   const size_t original_width = stream_context->buffer_dimension.width();
   const size_t original_height = stream_context->buffer_dimension.height();
@@ -139,14 +139,17 @@
     // We can reuse the original buffer in this case because the size is same.
     // Note that libyuv can in-place rotate the Y-plane by 180 degrees.
     libyuv::NV12ToI420Rotate(
-        static_cast<uint8_t*>(original_gmb->memory(0)), original_gmb->stride(0),
-        static_cast<uint8_t*>(original_gmb->memory(1)), original_gmb->stride(1),
-        static_cast<uint8_t*>(original_gmb->memory(0)), original_gmb->stride(0),
-        temp_u, temp_uv_width, temp_v, temp_uv_width, original_width,
-        original_height, translate_rotation(rotation));
+        original_scoped_mapping->GetMemoryForPlane(0).data(),
+        original_scoped_mapping->Stride(0),
+        original_scoped_mapping->GetMemoryForPlane(1).data(),
+        original_scoped_mapping->Stride(1),
+        original_scoped_mapping->GetMemoryForPlane(0).data(),
+        original_scoped_mapping->Stride(0), temp_u, temp_uv_width, temp_v,
+        temp_uv_width, original_width, original_height,
+        translate_rotation(rotation));
     libyuv::MergeUVPlane(temp_u, temp_uv_width, temp_v, temp_uv_width,
-                         static_cast<uint8_t*>(original_gmb->memory(1)),
-                         original_gmb->stride(1), temp_uv_width,
+                         original_scoped_mapping->GetMemoryForPlane(1).data(),
+                         original_scoped_mapping->Stride(1), temp_uv_width,
                          temp_uv_height);
     return std::move(buffer_pair.vcd_buffer);
   }
@@ -161,26 +164,35 @@
     return std::move(buffer_pair.vcd_buffer);
   }
 
-  auto rotated_gmb = gmb_support_->CreateGpuMemoryBufferImplFromHandle(
-      rotated_buffer.handle_provider->GetGpuMemoryBufferHandle(),
-      format->frame_size, *gfx_format, stream_context->buffer_usage,
-      base::NullCallback());
-
-  if (!rotated_gmb || !rotated_gmb->Map()) {
-    DLOG(WARNING) << "Failed to map rotated buffer";
+  // TODO(crbug.com/359601431): Get shared image directly from the
+  // |rotated_buffer->handle_provider| once all VideoCaptureBufferTracker are
+  // converted to create MappableSI.
+  auto rotated_shared_image =
+      camera_buffer_factory_->CreateSharedImageFromGmbHandle(
+          rotated_buffer.handle_provider->GetGpuMemoryBufferHandle(),
+          format->frame_size, *gfx_format, stream_context->buffer_usage);
+  std::unique_ptr<gpu::ClientSharedImage::ScopedMapping> rotated_scoped_mapping;
+  if (rotated_shared_image) {
+    rotated_scoped_mapping = rotated_shared_image->Map();
+  }
+  if (!rotated_scoped_mapping) {
+    LOG(WARNING) << "Failed to map rotated shared image.";
     return std::move(buffer_pair.vcd_buffer);
   }
-  absl::Cleanup unmap_rotated_gmb = [&rotated_gmb] { rotated_gmb->Unmap(); };
 
-  libyuv::NV12ToI420Rotate(
-      static_cast<uint8_t*>(original_gmb->memory(0)), original_gmb->stride(0),
-      static_cast<uint8_t*>(original_gmb->memory(1)), original_gmb->stride(1),
-      static_cast<uint8_t*>(rotated_gmb->memory(0)), rotated_gmb->stride(0),
-      temp_u, temp_uv_height, temp_v, temp_uv_height, original_width,
-      original_height, translate_rotation(rotation));
+  libyuv::NV12ToI420Rotate(original_scoped_mapping->GetMemoryForPlane(0).data(),
+                           original_scoped_mapping->Stride(0),
+                           original_scoped_mapping->GetMemoryForPlane(1).data(),
+                           original_scoped_mapping->Stride(1),
+                           rotated_scoped_mapping->GetMemoryForPlane(0).data(),
+                           rotated_scoped_mapping->Stride(0), temp_u,
+                           temp_uv_height, temp_v, temp_uv_height,
+                           original_width, original_height,
+                           translate_rotation(rotation));
   libyuv::MergeUVPlane(temp_u, temp_uv_height, temp_v, temp_uv_height,
-                       static_cast<uint8_t*>(rotated_gmb->memory(1)),
-                       rotated_gmb->stride(1), temp_uv_height, temp_uv_width);
+                       rotated_scoped_mapping->GetMemoryForPlane(1).data(),
+                       rotated_scoped_mapping->Stride(1), temp_uv_height,
+                       temp_uv_width);
   return std::move(rotated_buffer);
 }
 
@@ -336,7 +348,8 @@
   stream_context->free_buffers.pop();
   buffer_info.ipc_id = GetBufferIpcId(stream_type, key);
   buffer_info.dimension = stream_context->buffer_dimension;
-  buffer_info.gpu_memory_buffer_handle = it->second.gmb->CloneHandle();
+  buffer_info.gpu_memory_buffer_handle =
+      it->second.shared_image->CloneGpuMemoryBufferHandle();
   buffer_info.drm_format = drm_format;
   buffer_info.hal_pixel_format = stream_context_[stream_type]->stream->format;
   buffer_info.modifier =
@@ -365,16 +378,20 @@
          stream_context_.end();
 }
 
-std::unique_ptr<gpu::GpuMemoryBufferImpl>
-StreamBufferManager::CreateGpuMemoryBuffer(gfx::GpuMemoryBufferHandle handle,
-                                           const VideoCaptureFormat& format,
-                                           gfx::BufferUsage buffer_usage) {
-  std::optional<gfx::BufferFormat> gfx_format =
+scoped_refptr<gpu::ClientSharedImage>
+StreamBufferManager::CreateSharedImageFromGmbHandle(
+    gfx::GpuMemoryBufferHandle handle,
+    const VideoCaptureFormat& format,
+    gfx::BufferUsage buffer_usage) {
+  std::optional<gfx::BufferFormat> buffer_format =
       PixFormatVideoToGfx(format.pixel_format);
-  DCHECK(gfx_format);
-  return gmb_support_->CreateGpuMemoryBufferImplFromHandle(
-      std::move(handle), format.frame_size, *gfx_format, buffer_usage,
-      base::NullCallback());
+  CHECK(buffer_format);
+  auto shared_image = camera_buffer_factory_->CreateSharedImageFromGmbHandle(
+      std::move(handle), format.frame_size, *buffer_format, buffer_usage);
+  if (!shared_image) {
+    LOG(ERROR) << "Failed to create mappable shared image.";
+  }
+  return shared_image;
 }
 
 // static
@@ -402,27 +419,28 @@
   if (!gfx_format) {
     device_context_->SetErrorState(
         media::VideoCaptureError::
-            kCrosHalV3BufferManagerFailedToCreateGpuMemoryBuffer,
-        FROM_HERE, "Unsupported video pixel format");
+            kCrosHalV3BufferManagerFailedToCreateMappableSI,
+        FROM_HERE, "Unsupported video pixel format.");
     return;
   }
-  auto gmb = camera_buffer_factory_->CreateGpuMemoryBuffer(
+  auto shared_image = camera_buffer_factory_->CreateSharedImage(
       stream_context->buffer_dimension, *gfx_format,
       stream_context->buffer_usage);
-  if (!gmb) {
+  if (!shared_image) {
     device_context_->SetErrorState(
         media::VideoCaptureError::
-            kCrosHalV3BufferManagerFailedToCreateGpuMemoryBuffer,
-        FROM_HERE, "Failed to allocate GPU memory buffer");
+            kCrosHalV3BufferManagerFailedToCreateMappableSI,
+        FROM_HERE, "Failed to create mappable shared image.");
     return;
   }
-  // All the GpuMemoryBuffers are allocated from the factory in bulk when the
+
+  // All the shared_images are allocated from the factory in bulk when the
   // streams are configured.  Here we simply use the sequence of the allocated
   // buffer as the buffer id.
   int key = stream_context->buffers.size() + 1;
   stream_context->free_buffers.push(key);
-  stream_context->buffers.insert(
-      std::make_pair(key, BufferPair(std::move(gmb), std::nullopt)));
+  stream_context->buffers.emplace(
+      key, BufferPair(std::move(shared_image), std::nullopt));
 }
 
 void StreamBufferManager::ReserveBufferFromPool(StreamType stream_type) {
@@ -432,8 +450,8 @@
   if (!gfx_format) {
     device_context_->SetErrorState(
         media::VideoCaptureError::
-            kCrosHalV3BufferManagerFailedToCreateGpuMemoryBuffer,
-        FROM_HERE, "Unsupported video pixel format");
+            kCrosHalV3BufferManagerFailedToCreateMappableSI,
+        FROM_HERE, "Unsupported video pixel format.");
     return;
   }
   Buffer vcd_buffer;
@@ -444,7 +462,7 @@
           client_type, stream_context->buffer_dimension,
           stream_context->capture_format.pixel_format, &vcd_buffer,
           &require_new_buffer_id, &retire_old_buffer_id)) {
-    DLOG(WARNING) << "Failed to reserve video capture buffer";
+    DLOG(WARNING) << "Failed to reserve video capture buffer.";
     return;
   }
   // TODO(b/333813928): This is a temporary solution to fix the cros camera
@@ -456,14 +474,25 @@
         client_type, GetBufferIpcId(stream_type, retire_old_buffer_id));
   }
 
-  auto gmb = gmb_support_->CreateGpuMemoryBufferImplFromHandle(
+  // TODO(crbug.com/359601431): Get shared image directly from the
+  // |vcd_buffer.handle_provider| once all VideoCaptureBufferTracker are
+  // converted to create MappableSI.
+  auto shared_image = camera_buffer_factory_->CreateSharedImageFromGmbHandle(
       vcd_buffer.handle_provider->GetGpuMemoryBufferHandle(),
       stream_context->buffer_dimension, *gfx_format,
-      stream_context->buffer_usage, base::NullCallback());
+      stream_context->buffer_usage);
+  if (!shared_image) {
+    device_context_->SetErrorState(
+        media::VideoCaptureError::
+            kCrosHalV3BufferManagerFailedToCreateMappableSI,
+        FROM_HERE, "Failed to create mappable shared image.");
+    return;
+  }
 
   if (kEnableBufferSynchronizationWithCameraService &&
       require_new_buffer_id != VideoCaptureBufferPool::kInvalidId) {
-    gfx::GpuMemoryBufferHandle gpu_memory_buffer_handle = gmb->CloneHandle();
+    gfx::GpuMemoryBufferHandle gpu_memory_buffer_handle =
+        shared_image->CloneGpuMemoryBufferHandle();
     gfx::NativePixmapHandle& native_pixmap_handle =
         gpu_memory_buffer_handle.native_pixmap_handle;
     auto buffer_handle = cros::mojom::CameraBufferHandle::New();
@@ -495,8 +524,8 @@
   }
   stream_context->free_buffers.push(vcd_buffer.id);
   const int id = vcd_buffer.id;
-  stream_context->buffers.insert(
-      std::make_pair(id, BufferPair(std::move(gmb), std::move(vcd_buffer))));
+  stream_context->buffers.insert(std::make_pair(
+      id, BufferPair(std::move(shared_image), std::move(vcd_buffer))));
 }
 
 void StreamBufferManager::DestroyCurrentStreamsAndBuffers() {
@@ -504,13 +533,14 @@
 }
 
 StreamBufferManager::BufferPair::BufferPair(
-    std::unique_ptr<gfx::GpuMemoryBuffer> input_gmb,
+    scoped_refptr<gpu::ClientSharedImage> input_shared_image,
     std::optional<Buffer> input_vcd_buffer)
-    : gmb(std::move(input_gmb)), vcd_buffer(std::move(input_vcd_buffer)) {}
+    : shared_image(std::move(input_shared_image)),
+      vcd_buffer(std::move(input_vcd_buffer)) {}
 
 StreamBufferManager::BufferPair::BufferPair(
     StreamBufferManager::BufferPair&& other) {
-  gmb = std::move(other.gmb);
+  shared_image = std::move(other.shared_image);
   vcd_buffer = std::move(other.vcd_buffer);
 }
 
diff --git a/media/capture/video/chromeos/stream_buffer_manager.h b/media/capture/video/chromeos/stream_buffer_manager.h
index 9e0ba8de..bfd2baf 100644
--- a/media/capture/video/chromeos/stream_buffer_manager.h
+++ b/media/capture/video/chromeos/stream_buffer_manager.h
@@ -26,16 +26,11 @@
 #include "media/capture/video_capture_types.h"
 
 namespace gfx {
-
 class GpuMemoryBuffer;
-
 }  // namespace gfx
 
 namespace gpu {
-
-class GpuMemoryBufferImpl;
-class GpuMemoryBufferSupport;
-
+class ClientSharedImage;
 }  // namespace gpu
 
 namespace media {
@@ -67,8 +62,9 @@
 
   void ReserveBuffer(StreamType stream_type);
 
-  gfx::GpuMemoryBuffer* GetGpuMemoryBufferById(StreamType stream_type,
-                                               uint64_t buffer_ipc_id);
+  scoped_refptr<gpu::ClientSharedImage> GetSharedImageById(
+      StreamType stream_type,
+      uint64_t buffer_ipc_id);
 
   // Acquires the VCD client buffer specified by |stream_type| and
   // |buffer_ipc_id|, with optional rotation applied.  |rotation| is the
@@ -117,7 +113,9 @@
 
   bool IsRecordingSupported();
 
-  std::unique_ptr<gpu::GpuMemoryBufferImpl> CreateGpuMemoryBuffer(
+  // TODO(crbug.com/359601431): Remove this method once shared image is used
+  // directly from the VideoCaptureDevice::Client::HandleProvider.
+  scoped_refptr<gpu::ClientSharedImage> CreateSharedImageFromGmbHandle(
       gfx::GpuMemoryBufferHandle handle,
       const VideoCaptureFormat& format,
       gfx::BufferUsage buffer_usage);
@@ -127,18 +125,18 @@
 
   // BufferPair holding up to two types of handles of a stream buffer.
   struct BufferPair {
-    BufferPair(std::unique_ptr<gfx::GpuMemoryBuffer> gmb,
+    BufferPair(scoped_refptr<gpu::ClientSharedImage> shared_image,
                std::optional<Buffer> vcd_buffer);
     BufferPair(BufferPair&& other);
     ~BufferPair();
-    // The GpuMemoryBuffer interface of the stream buffer.
-    //   - When the VCD runs SharedMemory-based VideoCapture buffer, |gmb| is
-    //     allocated by StreamBufferManager locally.
-    //   - When the VCD runs GpuMemoryBuffer-based VideoCapture buffer, |gmb| is
-    //     constructed from |vcd_buffer| below.
-    std::unique_ptr<gfx::GpuMemoryBuffer> gmb;
+    // The Mappable shared image interface of the stream buffer.
+    //   - When the VCD runs SharedMemory-based VideoCapture buffer,
+    //   |shared_image| is allocated by StreamBufferManager locally.
+    //   - When the VCD runs native GpuMemoryBuffer-based VideoCapture buffer,
+    //   |shared_image| is constructed from |vcd_buffer| below.
+    scoped_refptr<gpu::ClientSharedImage> shared_image;
     // The VCD buffer reserved from the VCD buffer pool.  This is only set when
-    // the VCD runs GpuMemoryBuffer-based VideoCapture buffer.
+    // the VCD runs native GpuMemoryBuffer-based VideoCapture buffer.
     std::optional<Buffer> vcd_buffer;
   };
 
@@ -182,8 +180,6 @@
 
   bool video_capture_use_gmb_;
 
-  std::unique_ptr<gpu::GpuMemoryBufferSupport> gmb_support_;
-
   std::unique_ptr<CameraBufferFactory> camera_buffer_factory_;
 
   base::WeakPtrFactory<StreamBufferManager> weak_ptr_factory_{this};
diff --git a/media/capture/video/fuchsia/video_capture_device_fuchsia_test.cc b/media/capture/video/fuchsia/video_capture_device_fuchsia_test.cc
index ebcf17d..7ed0450 100644
--- a/media/capture/video/fuchsia/video_capture_device_fuchsia_test.cc
+++ b/media/capture/video/fuchsia/video_capture_device_fuchsia_test.cc
@@ -157,8 +157,8 @@
                               int frame_feedback_id) override {
     NOTREACHED();
   }
-  void OnIncomingCapturedGfxBuffer(
-      gfx::GpuMemoryBuffer* buffer,
+  void OnIncomingCapturedImage(
+      scoped_refptr<gpu::ClientSharedImage> shared_image,
       const VideoCaptureFormat& frame_format,
       int clockwise_rotation,
       base::TimeTicks reference_time,
diff --git a/media/capture/video/linux/v4l2_capture_delegate_gpu_helper_unittest.cc b/media/capture/video/linux/v4l2_capture_delegate_gpu_helper_unittest.cc
index 3175e86a..dbc3873f 100644
--- a/media/capture/video/linux/v4l2_capture_delegate_gpu_helper_unittest.cc
+++ b/media/capture/video/linux/v4l2_capture_delegate_gpu_helper_unittest.cc
@@ -45,8 +45,8 @@
                               const std::optional<VideoFrameMetadata>& metadata,
                               int frame_feedback_id = 0) override {}
 
-  void OnIncomingCapturedGfxBuffer(
-      gfx::GpuMemoryBuffer* buffer,
+  void OnIncomingCapturedImage(
+      scoped_refptr<gpu::ClientSharedImage> shared_image,
       const VideoCaptureFormat& frame_format,
       int clockwise_rotation,
       base::TimeTicks reference_time,
diff --git a/media/capture/video/linux/v4l2_capture_delegate_unittest.cc b/media/capture/video/linux/v4l2_capture_delegate_unittest.cc
index c2ff2a19..40631a3a 100644
--- a/media/capture/video/linux/v4l2_capture_delegate_unittest.cc
+++ b/media/capture/video/linux/v4l2_capture_delegate_unittest.cc
@@ -255,8 +255,8 @@
                               const std::optional<VideoFrameMetadata>& metadata,
                               int frame_feedback_id = 0) override {}
 
-  void OnIncomingCapturedGfxBuffer(
-      gfx::GpuMemoryBuffer* buffer,
+  void OnIncomingCapturedImage(
+      scoped_refptr<gpu::ClientSharedImage> shared_image,
       const VideoCaptureFormat& frame_format,
       int clockwise_rotation,
       base::TimeTicks reference_time,
diff --git a/media/capture/video/mock_video_capture_device_client.cc b/media/capture/video/mock_video_capture_device_client.cc
index b27b885..f9a1da1 100644
--- a/media/capture/video/mock_video_capture_device_client.cc
+++ b/media/capture/video/mock_video_capture_device_client.cc
@@ -130,7 +130,7 @@
           [raw_result_ptr](const media::VideoCaptureFormat& frame_format) {
             raw_result_ptr->fake_frame_captured_callback_.Run(frame_format);
           })));
-  ON_CALL(*result, OnIncomingCapturedGfxBuffer)
+  ON_CALL(*result, OnIncomingCapturedImage)
       .WillByDefault(WithArgs<1>(Invoke(
           [raw_result_ptr](const media::VideoCaptureFormat& frame_format) {
             raw_result_ptr->fake_frame_captured_callback_.Run(frame_format);
diff --git a/media/capture/video/mock_video_capture_device_client.h b/media/capture/video/mock_video_capture_device_client.h
index 6c50a31..6103f71 100644
--- a/media/capture/video/mock_video_capture_device_client.h
+++ b/media/capture/video/mock_video_capture_device_client.h
@@ -36,8 +36,8 @@
                int frame_feedback_id),
               (override));
   MOCK_METHOD(void,
-              OnIncomingCapturedGfxBuffer,
-              (gfx::GpuMemoryBuffer * buffer,
+              OnIncomingCapturedImage,
+              (scoped_refptr<gpu::ClientSharedImage> shared_image,
                const VideoCaptureFormat& frame_format,
                int clockwise_rotation,
                base::TimeTicks reference_time,
diff --git a/media/capture/video/video_capture_device.cc b/media/capture/video/video_capture_device.cc
index 5be46b16..4be7b07 100644
--- a/media/capture/video/video_capture_device.cc
+++ b/media/capture/video/video_capture_device.cc
@@ -99,18 +99,18 @@
                          /*frame_feedback_id=*/0);
 }
 
-void VideoCaptureDevice::Client::OnIncomingCapturedGfxBuffer(
-    gfx::GpuMemoryBuffer* buffer,
+void VideoCaptureDevice::Client::OnIncomingCapturedImage(
+    scoped_refptr<gpu::ClientSharedImage> shared_image,
     const VideoCaptureFormat& frame_format,
     int clockwise_rotation,
     base::TimeTicks reference_time,
     base::TimeDelta timestamp,
     std::optional<base::TimeTicks> capture_begin_timestamp,
     const std::optional<VideoFrameMetadata>& metadata) {
-  OnIncomingCapturedGfxBuffer(buffer, frame_format, clockwise_rotation,
-                              reference_time, timestamp,
-                              capture_begin_timestamp, metadata,
-                              /*frame_feedback_id=*/0);
+  OnIncomingCapturedImage(std::move(shared_image), frame_format,
+                          clockwise_rotation, reference_time, timestamp,
+                          capture_begin_timestamp, metadata,
+                          /*frame_feedback_id=*/0);
 }
 
 VideoCaptureDevice::~VideoCaptureDevice() = default;
diff --git a/media/capture/video/video_capture_device.h b/media/capture/video/video_capture_device.h
index 3a6cf5c..68e1569 100644
--- a/media/capture/video/video_capture_device.h
+++ b/media/capture/video/video_capture_device.h
@@ -44,6 +44,10 @@
 class Location;
 }  // namespace base
 
+namespace gpu {
+class ClientSharedImage;
+}
+
 namespace media {
 
 class CAPTURE_EXPORT VideoFrameConsumerFeedbackObserver {
@@ -210,15 +214,15 @@
         const std::optional<VideoFrameMetadata>& metadata);
 
     // Captured a new video frame, data for which is stored in the
-    // GpuMemoryBuffer pointed to by |buffer|.  The format of the frame is
-    // described by |frame_format|.  Since the memory buffer pointed to by
-    // |buffer| may be allocated with some size/address alignment requirement,
-    // this method takes into consideration the size and offset of each plane in
-    // |buffer| when creating the content of the output buffer.
-    // |clockwise_rotation|, |reference_time|, |timestamp|, and
+    // shared image pointed to by |shared_image|.  The format of the frame is
+    // described by |frame_format|.  Since the shared image pointed to by
+    // |shared_image| may be allocated with some size/address alignment
+    // requirement, this method takes into consideration the size and offset of
+    // each plane in |shared_image| when creating the content of the output
+    // buffer. |clockwise_rotation|, |reference_time|, |timestamp|, and
     // |frame_feedback_id| serve the same purposes as in OnIncomingCapturedData.
-    virtual void OnIncomingCapturedGfxBuffer(
-        gfx::GpuMemoryBuffer* buffer,
+    virtual void OnIncomingCapturedImage(
+        scoped_refptr<gpu::ClientSharedImage> shared_image,
         const VideoCaptureFormat& frame_format,
         int clockwise_rotation,
         base::TimeTicks reference_time,
@@ -227,8 +231,8 @@
         const std::optional<VideoFrameMetadata>& metadata,
         int frame_feedback_id) = 0;
     // Convenience wrapper that passes in 0 as |frame_feedback_id|.
-    void OnIncomingCapturedGfxBuffer(
-        gfx::GpuMemoryBuffer* buffer,
+    void OnIncomingCapturedImage(
+        scoped_refptr<gpu::ClientSharedImage> shared_image,
         const VideoCaptureFormat& frame_format,
         int clockwise_rotation,
         base::TimeTicks reference_time,
diff --git a/media/capture/video/video_capture_device_client.cc b/media/capture/video/video_capture_device_client.cc
index ccce265..f22eeec 100644
--- a/media/capture/video/video_capture_device_client.cc
+++ b/media/capture/video/video_capture_device_client.cc
@@ -619,8 +619,8 @@
       capture_begin_timestamp, gfx::Rect(dimensions), metadata);
 }
 
-void VideoCaptureDeviceClient::OnIncomingCapturedGfxBuffer(
-    gfx::GpuMemoryBuffer* buffer,
+void VideoCaptureDeviceClient::OnIncomingCapturedImage(
+    scoped_refptr<gpu::ClientSharedImage> shared_image,
     const VideoCaptureFormat& frame_format,
     int clockwise_rotation,
     base::TimeTicks reference_time,
@@ -644,8 +644,8 @@
     return;
   }
 
-  int destination_width = buffer->GetSize().width();
-  int destination_height = buffer->GetSize().height();
+  int destination_width = shared_image->size().width();
+  int destination_height = shared_image->size().height();
   if (clockwise_rotation == 90 || clockwise_rotation == 270)
     std::swap(destination_width, destination_height);
 
@@ -671,23 +671,25 @@
   GetI420BufferAccess(output_buffer, dimensions, &y_plane_data, &u_plane_data,
                       &v_plane_data, &y_plane_stride, &uv_plane_stride);
 
-  if (!buffer->Map()) {
-    LOG(ERROR) << "Failed to map GPU memory buffer";
+  auto scoped_mapping = shared_image->Map();
+  if (!scoped_mapping) {
+    LOG(ERROR) << "Failed to map shared image.";
     receiver_->OnFrameDropped(
         VideoCaptureFrameDropReason::kGpuMemoryBufferMapFailed);
     return;
   }
-  absl::Cleanup scoped_unmap = [buffer] { buffer->Unmap(); };
 
   int ret = -EINVAL;
   switch (frame_format.pixel_format) {
     case PIXEL_FORMAT_NV12:
       ret = libyuv::NV12ToI420Rotate(
-          reinterpret_cast<uint8_t*>(buffer->memory(0)), buffer->stride(0),
-          reinterpret_cast<uint8_t*>(buffer->memory(1)), buffer->stride(1),
-          y_plane_data, y_plane_stride, u_plane_data, uv_plane_stride,
-          v_plane_data, uv_plane_stride, buffer->GetSize().width(),
-          buffer->GetSize().height(), rotation_mode);
+          scoped_mapping->GetMemoryForPlane(0).data(),
+          scoped_mapping->Stride(0),
+          scoped_mapping->GetMemoryForPlane(1).data(),
+          scoped_mapping->Stride(1), y_plane_data, y_plane_stride, u_plane_data,
+          uv_plane_stride, v_plane_data, uv_plane_stride,
+          scoped_mapping->Size().width(), scoped_mapping->Size().height(),
+          rotation_mode);
       break;
 
     default:
diff --git a/media/capture/video/video_capture_device_client.h b/media/capture/video/video_capture_device_client.h
index 755f12e..562625f9 100644
--- a/media/capture/video/video_capture_device_client.h
+++ b/media/capture/video/video_capture_device_client.h
@@ -30,6 +30,10 @@
 #include "media/capture/video/video_capture_effects_processor.h"
 #endif  // BUILDFLAG(ENABLE_VIDEO_EFFECTS)
 
+namespace gpu {
+class ClientSharedImage;
+}
+
 namespace media {
 class VideoCaptureBufferPool;
 class VideoFrameReceiver;
@@ -117,8 +121,8 @@
       std::optional<base::TimeTicks> capture_begin_timestamp,
       const std::optional<VideoFrameMetadata>& metadata,
       int frame_feedback_id) override;
-  void OnIncomingCapturedGfxBuffer(
-      gfx::GpuMemoryBuffer* buffer,
+  void OnIncomingCapturedImage(
+      scoped_refptr<gpu::ClientSharedImage> shared_image,
       const VideoCaptureFormat& frame_format,
       int clockwise_rotation,
       base::TimeTicks reference_time,
diff --git a/media/capture/video/video_capture_device_client_unittest.cc b/media/capture/video/video_capture_device_client_unittest.cc
index 4fb342e..b1b6b09e 100644
--- a/media/capture/video/video_capture_device_client_unittest.cc
+++ b/media/capture/video/video_capture_device_client_unittest.cc
@@ -18,12 +18,13 @@
 #include "base/time/time.h"
 #include "build/build_config.h"
 #include "build/chromeos_buildflags.h"
+#include "components/viz/common/resources/shared_image_format.h"
+#include "components/viz/test/test_context_provider.h"
 #include "media/base/limits.h"
 #include "media/base/video_frame.h"
 #include "media/base/video_types.h"
 #include "media/capture/mojom/video_capture_buffer.mojom.h"
 #include "media/capture/mojom/video_effects_manager.mojom.h"
-#include "media/capture/video/mock_gpu_memory_buffer_manager.h"
 #include "media/capture/video/mock_video_frame_receiver.h"
 #include "media/capture/video/video_capture_buffer_pool_impl.h"
 #include "media/capture/video/video_capture_buffer_tracker.h"
@@ -57,6 +58,10 @@
 
 namespace {
 
+// Setting some default usage in order to get a mappable shared image.
+constexpr auto si_usage = gpu::SHARED_IMAGE_USAGE_CPU_WRITE_ONLY |
+                          gpu::SHARED_IMAGE_USAGE_DISPLAY_READ;
+
 #if BUILDFLAG(IS_CHROMEOS_ASH)
 std::unique_ptr<VideoCaptureJpegDecoder> ReturnNullPtrAsJpecDecoder() {
   return nullptr;
@@ -169,8 +174,7 @@
 
  protected:
   base::test::TaskEnvironment task_environment_;
-  std::unique_ptr<unittest_internal::MockGpuMemoryBufferManager>
-      gpu_memory_buffer_manager_;
+  scoped_refptr<gpu::TestSharedImageInterface> test_sii_;
   // Will be nullopt until `Init()` has been called:
   std::optional<video_effects::FakeVideoEffectsProcessor>
       fake_video_effects_processor_;
@@ -187,8 +191,8 @@
   void Init(scoped_refptr<VideoCaptureBufferPoolImpl> buffer_pool) {
     auto controller = std::make_unique<NiceMock<MockVideoFrameReceiver>>();
     receiver_ = controller.get();
-    gpu_memory_buffer_manager_ =
-        std::make_unique<unittest_internal::MockGpuMemoryBufferManager>();
+    test_sii_ = base::MakeRefCounted<gpu::TestSharedImageInterface>();
+    test_sii_->UseTestGMBInSharedImageCreationWithBufferUsage();
 #if BUILDFLAG(IS_CHROMEOS_ASH)
     device_client_ = std::make_unique<VideoCaptureDeviceClient>(
         std::move(controller), buffer_pool,
@@ -241,11 +245,13 @@
   const gfx::Size kBufferDimensions(10, 10);
   const VideoCaptureFormat kFrameFormatNV12(
       kBufferDimensions, 30.0f /*frame_rate*/, PIXEL_FORMAT_NV12);
-  std::unique_ptr<gfx::GpuMemoryBuffer> buffer =
-      gpu_memory_buffer_manager_->CreateFakeGpuMemoryBuffer(
-          kBufferDimensions, gfx::BufferFormat::YUV_420_BIPLANAR,
-          gfx::BufferUsage::VEA_READ_CAMERA_AND_CPU_READ_WRITE,
-          gpu::kNullSurfaceHandle, nullptr);
+
+  auto shared_image = test_sii_->CreateSharedImage(
+      {viz::MultiPlaneFormat::kNV12, kBufferDimensions, gfx::ColorSpace(),
+       gpu::SharedImageUsageSet(si_usage), "VideoCaptureDeviceClientTest"},
+      gpu::kNullSurfaceHandle,
+      gfx::BufferUsage::VEA_READ_CAMERA_AND_CPU_READ_WRITE);
+
   {
     InSequence s;
     const int expected_buffer_id = 0;
@@ -255,8 +261,9 @@
                     Field(&ReadyFrameInBuffer::buffer_id, expected_buffer_id)));
     EXPECT_CALL(*receiver_, OnBufferRetired(expected_buffer_id));
   }
-  device_client_->VideoCaptureDevice::Client::OnIncomingCapturedGfxBuffer(
-      buffer.get(), kFrameFormatNV12, 0 /*clockwise rotation*/,
+
+  device_client_->VideoCaptureDevice::Client::OnIncomingCapturedImage(
+      std::move(shared_image), kFrameFormatNV12, 0 /*clockwise rotation*/,
       base::TimeTicks(), base::TimeDelta(),
       /*capture_begin_timestamp=*/std::nullopt, /*metadata=*/std::nullopt);
 
@@ -315,11 +322,12 @@
 
   for (const auto& effect_variant : kEffectVariants) {
     metadata.background_blur = effect_variant;
-    std::unique_ptr<gfx::GpuMemoryBuffer> buffer =
-        gpu_memory_buffer_manager_->CreateFakeGpuMemoryBuffer(
-            kBufferDimensions, gfx::BufferFormat::YUV_420_BIPLANAR,
-            gfx::BufferUsage::VEA_READ_CAMERA_AND_CPU_READ_WRITE,
-            gpu::kNullSurfaceHandle, nullptr);
+
+    auto shared_image = test_sii_->CreateSharedImage(
+        {viz::MultiPlaneFormat::kNV12, kBufferDimensions, gfx::ColorSpace(),
+         gpu::SharedImageUsageSet(si_usage), "VideoCaptureDeviceClientTest"},
+        gpu::kNullSurfaceHandle,
+        gfx::BufferUsage::VEA_READ_CAMERA_AND_CPU_READ_WRITE);
 
     EXPECT_CALL(
         *receiver_,
@@ -328,8 +336,8 @@
             Pointee(Field(&mojom::VideoFrameInfo::metadata,
                           Field(&media::VideoFrameMetadata::background_blur,
                                 CreateOptionalMatcher(effect_variant)))))));
-    device_client_->VideoCaptureDevice::Client::OnIncomingCapturedGfxBuffer(
-        buffer.get(), kFrameFormatNV12, 0 /*clockwise rotation*/,
+    device_client_->VideoCaptureDevice::Client::OnIncomingCapturedImage(
+        std::move(shared_image), kFrameFormatNV12, 0 /*clockwise rotation*/,
         base::TimeTicks(), base::TimeDelta(),
         /*capture_begin_timestamp=*/std::nullopt, metadata);
     Mock::VerifyAndClearExpectations(receiver_);
@@ -372,12 +380,14 @@
                         Field(&media::VideoFrameMetadata::capture_begin_time,
                               Optional(expected_timestamp)))))));
   auto resolution = gfx::Size(32, 32);
-  auto buffer = gpu_memory_buffer_manager_->CreateFakeGpuMemoryBuffer(
-      resolution, gfx::BufferFormat::YUV_420_BIPLANAR,
-      gfx::BufferUsage::SCANOUT_CAMERA_READ_WRITE, gpu::kNullSurfaceHandle,
-      nullptr);
-  device_client_->VideoCaptureDevice::Client::OnIncomingCapturedGfxBuffer(
-      buffer.get(), VideoCaptureFormat(resolution, 30.0f, PIXEL_FORMAT_NV12), 0,
+
+  auto shared_image = test_sii_->CreateSharedImage(
+      {viz::MultiPlaneFormat::kNV12, resolution, gfx::ColorSpace(),
+       gpu::SharedImageUsageSet(si_usage), "VideoCaptureDeviceClientTest"},
+      gpu::kNullSurfaceHandle, gfx::BufferUsage::SCANOUT_CAMERA_READ_WRITE);
+  device_client_->VideoCaptureDevice::Client::OnIncomingCapturedImage(
+      std::move(shared_image),
+      VideoCaptureFormat(resolution, 30.0f, PIXEL_FORMAT_NV12), 0,
       base::TimeTicks(), base::TimeDelta(), expected_timestamp,
       /*metadata=*/std::nullopt);
 
@@ -562,12 +572,11 @@
   for (const auto& size_and_rotation : kSizeAndRotationsNV12) {
     params.requested_format = VideoCaptureFormat(
         size_and_rotation.input_resolution, 30.0f, PIXEL_FORMAT_NV12);
-    std::unique_ptr<gfx::GpuMemoryBuffer> buffer =
-        gpu_memory_buffer_manager_->CreateFakeGpuMemoryBuffer(
-            size_and_rotation.input_resolution,
-            gfx::BufferFormat::YUV_420_BIPLANAR,
-            gfx::BufferUsage::SCANOUT_CAMERA_READ_WRITE,
-            gpu::kNullSurfaceHandle, nullptr);
+    auto shared_image = test_sii_->CreateSharedImage(
+        {viz::MultiPlaneFormat::kNV12, size_and_rotation.input_resolution,
+         gfx::ColorSpace(), gpu::SharedImageUsageSet(si_usage),
+         "VideoCaptureDeviceClientTest"},
+        gpu::kNullSurfaceHandle, gfx::BufferUsage::SCANOUT_CAMERA_READ_WRITE);
 
     gfx::Size coded_size;
     EXPECT_CALL(*receiver_, MockOnFrameReadyInBuffer)
@@ -575,9 +584,9 @@
         .WillOnce(Invoke([&coded_size](ReadyFrameInBuffer frame) {
           coded_size = frame.frame_info->coded_size;
         }));
-    device_client_->VideoCaptureDevice::Client::OnIncomingCapturedGfxBuffer(
-        buffer.get(), params.requested_format, size_and_rotation.rotation,
-        base::TimeTicks(), base::TimeDelta(),
+    device_client_->VideoCaptureDevice::Client::OnIncomingCapturedImage(
+        std::move(shared_image), params.requested_format,
+        size_and_rotation.rotation, base::TimeTicks(), base::TimeDelta(),
         /*capture_begin_timestamp=*/std::nullopt, /*metadata=*/std::nullopt);
 
     EXPECT_EQ(coded_size.width(), size_and_rotation.output_resolution.width());
diff --git a/media/capture/video/video_capture_device_unittest.cc b/media/capture/video/video_capture_device_unittest.cc
index 7a0b56c2..9aff107 100644
--- a/media/capture/video/video_capture_device_unittest.cc
+++ b/media/capture/video/video_capture_device_unittest.cc
@@ -344,13 +344,14 @@
                   base::BindOnce(&VideoCaptureDeviceTest::OnFrameCaptured,
                                  base::Unretained(this), frame_format));
             })));
-    ON_CALL(*result, OnIncomingCapturedGfxBuffer)
+    ON_CALL(*result, OnIncomingCapturedImage)
         .WillByDefault(WithArgs<0, 1>(
-            Invoke([this](gfx::GpuMemoryBuffer* buffer,
+            Invoke([this](scoped_refptr<gpu::ClientSharedImage> shared_image,
                           const media::VideoCaptureFormat& frame_format) {
-              ASSERT_TRUE(buffer);
-              ASSERT_GT(buffer->GetSize().width() * buffer->GetSize().height(),
-                        0);
+              ASSERT_TRUE(shared_image);
+              ASSERT_GT(
+                  shared_image->size().width() * shared_image->size().height(),
+                  0);
               main_thread_task_runner_->PostTask(
                   FROM_HERE,
                   base::BindOnce(&VideoCaptureDeviceTest::OnFrameCaptured,
diff --git a/media/capture/video/win/video_capture_device_mf_win_unittest.cc b/media/capture/video/win/video_capture_device_mf_win_unittest.cc
index 3c54662..f83e6ec 100644
--- a/media/capture/video/win/video_capture_device_mf_win_unittest.cc
+++ b/media/capture/video/win/video_capture_device_mf_win_unittest.cc
@@ -78,8 +78,8 @@
                               const std::optional<VideoFrameMetadata>& metadata,
                               int frame_feedback_id) override {}
 
-  void OnIncomingCapturedGfxBuffer(
-      gfx::GpuMemoryBuffer* buffer,
+  void OnIncomingCapturedImage(
+      scoped_refptr<gpu::ClientSharedImage> shared_image,
       const VideoCaptureFormat& frame_format,
       int clockwise_rotation,
       base::TimeTicks reference_time,
diff --git a/media/capture/video_capture_types.h b/media/capture/video_capture_types.h
index f2b75f5b2..53e8077 100644
--- a/media/capture/video_capture_types.h
+++ b/media/capture/video_capture_types.h
@@ -108,7 +108,7 @@
   kCrosHalV3DeviceDelegateWrongNumberOfStreamsConfigured = 43,
   kCrosHalV3DeviceDelegateFailedToGetDefaultRequestSettings = 44,
   kCrosHalV3BufferManagerHalRequestedTooManyBuffers = 45,
-  kCrosHalV3BufferManagerFailedToCreateGpuMemoryBuffer = 46,
+  kCrosHalV3BufferManagerFailedToCreateMappableSI = 46,
   kCrosHalV3BufferManagerFailedToMapGpuMemoryBuffer = 47,
   kCrosHalV3BufferManagerUnsupportedVideoPixelFormat = 48,
   kCrosHalV3BufferManagerFailedToDupFd = 49,
diff --git a/media/filters/ffmpeg_video_decoder_unittest.cc b/media/filters/ffmpeg_video_decoder_unittest.cc
index f6f72ab..06ba8dc 100644
--- a/media/filters/ffmpeg_video_decoder_unittest.cc
+++ b/media/filters/ffmpeg_video_decoder_unittest.cc
@@ -162,37 +162,6 @@
     return DecodeMultipleFrames(input_buffers);
   }
 
-  // Decodes |i_frame_buffer_| and then decodes the data contained in
-  // the file named |test_file_name|. This function expects both buffers
-  // to decode to frames that are the same size.
-  void DecodeIFrameThenTestFile(const std::string& test_file_name,
-                                int expected_width,
-                                int expected_height,
-                                size_t expected_frames = 2u) {
-    Initialize();
-    scoped_refptr<DecoderBuffer> buffer = ReadTestDataFile(test_file_name);
-
-    InputBuffers input_buffers;
-    input_buffers.push_back(i_frame_buffer_);
-    input_buffers.push_back(buffer);
-    input_buffers.push_back(end_of_stream_buffer_);
-
-    DecoderStatus status = DecodeMultipleFrames(input_buffers);
-
-    EXPECT_TRUE(status.is_ok());
-    ASSERT_EQ(expected_frames, output_frames_.size());
-
-    gfx::Size original_size = kVisibleRect.size();
-    EXPECT_EQ(original_size.width(),
-              output_frames_[0]->visible_rect().size().width());
-    EXPECT_EQ(original_size.height(),
-              output_frames_[0]->visible_rect().size().height());
-    EXPECT_EQ(expected_width,
-              output_frames_[1]->visible_rect().size().width());
-    EXPECT_EQ(expected_height,
-              output_frames_[1]->visible_rect().size().height());
-  }
-
   DecoderStatus Decode(scoped_refptr<DecoderBuffer> buffer) {
     DecoderStatus status;
     EXPECT_CALL(*this, DecodeDone(_)).WillOnce(SaveArg<0>(&status));
@@ -305,13 +274,44 @@
 // Decode |i_frame_buffer_| and then a smaller frame and verify the output size
 // was adjusted.
 TEST_F(FFmpegVideoDecoderTest, DecodeFrame_Smaller) {
-  DecodeIFrameThenTestFile("red-green.h264", 80, 128, /*expected_frames=*/4);
+  Initialize();
+
+  InputBuffers input_buffers;
+  input_buffers.push_back(
+      ReadTestDataFile("bear-320x192-baseline-frame-0.h264"));
+  input_buffers.push_back(i_frame_buffer_);
+  input_buffers.push_back(end_of_stream_buffer_);
+
+  DecoderStatus status = DecodeMultipleFrames(input_buffers);
+
+  EXPECT_TRUE(status.is_ok());
+  ASSERT_EQ(2u, output_frames_.size());
+
+  constexpr gfx::Size kExpectedSize(320, 192);
+  EXPECT_EQ(kExpectedSize, output_frames_[0]->visible_rect().size());
+  EXPECT_EQ(kVisibleRect.size(), output_frames_[1]->visible_rect().size());
 }
 
 // Decode |i_frame_buffer_| and then a larger frame and verify the output size
 // was adjusted.
 TEST_F(FFmpegVideoDecoderTest, DecodeFrame_Larger) {
-  DecodeIFrameThenTestFile("bear-320x192-baseline-frame-0.h264", 320, 192);
+  Initialize();
+
+  InputBuffers input_buffers;
+  input_buffers.push_back(i_frame_buffer_);
+  input_buffers.push_back(
+      ReadTestDataFile("bear-320x192-baseline-frame-0.h264"));
+  input_buffers.push_back(end_of_stream_buffer_);
+
+  DecoderStatus status = DecodeMultipleFrames(input_buffers);
+
+  EXPECT_TRUE(status.is_ok());
+  ASSERT_EQ(2u, output_frames_.size());
+
+  EXPECT_EQ(kVisibleRect.size(), output_frames_[0]->visible_rect().size());
+
+  constexpr gfx::Size kExpectedSize(320, 192);
+  EXPECT_EQ(kExpectedSize, output_frames_[1]->visible_rect().size());
 }
 
 // Test resetting when decoder has initialized but not decoded.
diff --git a/mojo/public/tools/bindings/generators/ts_templates/module_definition.tmpl b/mojo/public/tools/bindings/generators/ts_templates/module_definition.tmpl
index f96517a1..69672fb 100644
--- a/mojo/public/tools/bindings/generators/ts_templates/module_definition.tmpl
+++ b/mojo/public/tools/bindings/generators/ts_templates/module_definition.tmpl
@@ -2,7 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-{% if not for_bindings_internals -%}
+{% if not for_bindings_internals and
+   (interfaces|length > 0 or structs|length > 0 or unions|length > 0
+    or enums|length > 0) -%}
 import {mojo} from '{{bindings_library_path}}';
 {%- endif %}
 
diff --git a/net/android/java/src/org/chromium/net/HttpNegotiateAuthenticator.java b/net/android/java/src/org/chromium/net/HttpNegotiateAuthenticator.java
index 6be257a..ea949e8 100644
--- a/net/android/java/src/org/chromium/net/HttpNegotiateAuthenticator.java
+++ b/net/android/java/src/org/chromium/net/HttpNegotiateAuthenticator.java
@@ -74,25 +74,35 @@
      */
     static class RequestData {
         /** Native object to post the result to. */
-        public long nativeResultObject;
+        public final long nativeResultObject;
 
         /** Reference to the account manager to use for the various requests. */
-        @SuppressWarnings("NullAway.Init")
-        public AccountManager accountManager;
+        public final AccountManager accountManager;
 
         /** Authenticator-specific options for the request, used for AccountManager#getAuthToken. */
-        public @Nullable Bundle options;
+        public final Bundle options;
 
         /** Desired token type, used for AccountManager#getAuthToken. */
-        public @Nullable String authTokenType;
+        public final String authTokenType;
 
         /** Account to fetch an auth token for. */
         public @Nullable Account account;
+
+        RequestData(
+                long nativeResultObject,
+                AccountManager accountManager,
+                Bundle options,
+                String authTokenType) {
+            this.nativeResultObject = nativeResultObject;
+            this.accountManager = accountManager;
+            this.options = options;
+            this.authTokenType = authTokenType;
+        }
     }
 
     /**
-     * Expects to receive a single account as result, and uses that account to request a token
-     * from the {@link AccountManager} provided via the {@link RequestData}
+     * Expects to receive a single account as result, and uses that account to request a token from
+     * the {@link AccountManager} provided via the {@link RequestData}
      */
     @VisibleForTesting
     class GetAccountsCallback implements AccountManagerCallback<Account[]> {
@@ -253,8 +263,8 @@
 
     /**
      * @param nativeResultObject The C++ object used to return the result. For correct C++ memory
-     *            management we must call HttpNegotiateAuthenticatorJni.get().setResult precisely
-     * once with this object.
+     *     management we must call HttpNegotiateAuthenticatorJni.get().setResult precisely once with
+     *     this object.
      * @param principal The principal (must be host based).
      * @param authToken The incoming auth token.
      * @param canDelegate True if we can delegate.
@@ -264,27 +274,27 @@
     void getNextAuthToken(
             final long nativeResultObject,
             final String principal,
-            String authToken,
+            @Nullable String authToken,
             boolean canDelegate) {
         assert principal != null;
 
         Context applicationContext = ContextUtils.getApplicationContext();
-        RequestData requestData = new RequestData();
-        requestData.authTokenType = HttpNegotiateConstants.SPNEGO_TOKEN_TYPE_BASE + principal;
-        requestData.accountManager = AccountManager.get(applicationContext);
-        requestData.nativeResultObject = nativeResultObject;
-        String features[] = {HttpNegotiateConstants.SPNEGO_FEATURE};
+        String[] features = {HttpNegotiateConstants.SPNEGO_FEATURE};
 
-        requestData.options = new Bundle();
+        Bundle options = new Bundle();
         if (authToken != null) {
-            requestData.options.putString(
-                    HttpNegotiateConstants.KEY_INCOMING_AUTH_TOKEN, authToken);
+            options.putString(HttpNegotiateConstants.KEY_INCOMING_AUTH_TOKEN, authToken);
         }
         if (mSpnegoContext != null) {
-            requestData.options.putBundle(
-                    HttpNegotiateConstants.KEY_SPNEGO_CONTEXT, mSpnegoContext);
+            options.putBundle(HttpNegotiateConstants.KEY_SPNEGO_CONTEXT, mSpnegoContext);
         }
-        requestData.options.putBoolean(HttpNegotiateConstants.KEY_CAN_DELEGATE, canDelegate);
+        options.putBoolean(HttpNegotiateConstants.KEY_CAN_DELEGATE, canDelegate);
+        RequestData requestData =
+                new RequestData(
+                        nativeResultObject,
+                        AccountManager.get(applicationContext),
+                        options,
+                        HttpNegotiateConstants.SPNEGO_TOKEN_TYPE_BASE + principal);
 
         Activity activity = ApplicationStatus.getLastTrackedFocusedActivity();
         if (activity == null) {
diff --git a/net/android/java/src/org/chromium/net/NetworkChangeNotifierAutoDetect.java b/net/android/java/src/org/chromium/net/NetworkChangeNotifierAutoDetect.java
index 5e1dd475..b56e907b 100644
--- a/net/android/java/src/org/chromium/net/NetworkChangeNotifierAutoDetect.java
+++ b/net/android/java/src/org/chromium/net/NetworkChangeNotifierAutoDetect.java
@@ -44,6 +44,7 @@
 import org.chromium.base.TraceEvent;
 import org.chromium.base.metrics.ScopedSysTraceEvent;
 import org.chromium.build.BuildConfig;
+import org.chromium.build.annotations.EnsuresNonNull;
 import org.chromium.build.annotations.EnsuresNonNullIf;
 import org.chromium.build.annotations.NullMarked;
 import org.chromium.build.annotations.NullUnmarked;
@@ -248,11 +249,8 @@
             return networkInfo;
         }
 
-        /**
-         * Returns connection type and status information about the current
-         * default network.
-         */
-        NetworkState getNetworkState(WifiManagerDelegate wifiManagerDelegate) {
+        /** Returns connection type and status information about the current default network. */
+        NetworkState getNetworkState(@Nullable WifiManagerDelegate wifiManagerDelegate) {
             Network network = null;
             NetworkInfo networkInfo;
             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
@@ -313,7 +311,7 @@
                         networkInfo.getType(),
                         networkInfo.getSubtype(),
                         false,
-                        wifiManagerDelegate.getWifiSsid(),
+                        assumeNonNull(wifiManagerDelegate).getWifiSsid(),
                         false,
                         "");
             }
@@ -965,8 +963,7 @@
     // mConnectivityManagerDelegates and mWifiManagerDelegate are only non-final for testing.
     private ConnectivityManagerDelegate mConnectivityManagerDelegate;
 
-    @SuppressWarnings("NullAway.Init")
-    private WifiManagerDelegate mWifiManagerDelegate;
+    private @Nullable WifiManagerDelegate mWifiManagerDelegate;
 
     // mNetworkCallback and mNetworkRequest are only non-null in Android L and above.
     // mNetworkCallback will be null if ConnectivityManager.registerNetworkCallback() ever fails.
@@ -974,7 +971,6 @@
     private NetworkRequest mNetworkRequest;
     private boolean mRegistered;
 
-    @SuppressWarnings("NullAway.Init")
     private NetworkState mNetworkState;
 
     // When a BroadcastReceiver is registered for a sticky broadcast that has been sent out at
@@ -1242,6 +1238,7 @@
      * TODO(crbug.com/40936429): migrate external callers to getCurrentNetworkState() and make this
      * method private (to be called only when updates are received from the system.)
      */
+    @EnsuresNonNull("mNetworkState")
     public void updateCurrentNetworkState() {
         try (ScopedSysTraceEvent event =
                 ScopedSysTraceEvent.scoped(
@@ -1308,8 +1305,8 @@
     public long[] getNetworksAndTypes() {
         try (ScopedSysTraceEvent event =
                 ScopedSysTraceEvent.scoped("NetworkChangeNotifierAutoDetect.getNetworksAndTypes")) {
-            final Network networks[] = getAllNetworksFiltered(mConnectivityManagerDelegate, null);
-            final long networksAndTypes[] = new long[networks.length * 2];
+            final Network[] networks = getAllNetworksFiltered(mConnectivityManagerDelegate, null);
+            final long[] networksAndTypes = new long[networks.length * 2];
             int index = 0;
             for (Network network : networks) {
                 networksAndTypes[index++] = networkToNetId(network);
diff --git a/net/android/junit/src/org/chromium/net/HttpNegotiateAuthenticatorTest.java b/net/android/junit/src/org/chromium/net/HttpNegotiateAuthenticatorTest.java
index 67b0339..56a4d1b 100644
--- a/net/android/junit/src/org/chromium/net/HttpNegotiateAuthenticatorTest.java
+++ b/net/android/junit/src/org/chromium/net/HttpNegotiateAuthenticatorTest.java
@@ -62,9 +62,12 @@
         manifest = Config.NONE,
         shadows = {HttpNegotiateAuthenticatorTest.ExtendedShadowAccountManager.class})
 public class HttpNegotiateAuthenticatorTest {
+    private static final long MOCK_NATIVE_POINTER = 42;
+    private static final String MOCK_TOKEN_TYPE = "foo";
+
     /**
-     * User the AccountManager to inject a mock instance.
-     * Note: Shadow classes need to be public and static.
+     * User the AccountManager to inject a mock instance. Note: Shadow classes need to be public and
+     * static.
      */
     @Implements(AccountManager.class)
     public static class ExtendedShadowAccountManager extends ShadowAccountManager {
@@ -176,9 +179,9 @@
     public void testGetAccountCallback() {
         String type = "Dummy_Account";
         HttpNegotiateAuthenticator authenticator = createAuthenticator(type);
-        RequestData requestData = new RequestData();
-        requestData.nativeResultObject = 42;
-        requestData.accountManager = sMockAccountManager;
+        Bundle options = new Bundle();
+        RequestData requestData =
+                new RequestData(MOCK_NATIVE_POINTER, sMockAccountManager, options, MOCK_TOKEN_TYPE);
         GetAccountsCallback callback = authenticator.new GetAccountsCallback(requestData);
 
         // Should fail because there are no accounts
@@ -196,8 +199,8 @@
         verify(sMockAccountManager)
                 .getAuthToken(
                         eq(testAccount),
-                        (String) isNull(),
-                        (Bundle) isNull(),
+                        eq(MOCK_TOKEN_TYPE),
+                        eq(options),
                         eq(true),
                         any(HttpNegotiateAuthenticator.GetTokenCallback.class),
                         any(Handler.class));
@@ -220,15 +223,13 @@
     public void testGetTokenCallbackWithIntent() {
         String type = "Dummy_Account";
         HttpNegotiateAuthenticator authenticator = createAuthenticator(type);
-        RequestData requestData = new RequestData();
-        requestData.nativeResultObject = 42;
-        requestData.authTokenType = "foo";
+        Bundle options = new Bundle();
+        options.putParcelable(AccountManager.KEY_INTENT, new Intent());
+        RequestData requestData =
+                new RequestData(MOCK_NATIVE_POINTER, sMockAccountManager, options, MOCK_TOKEN_TYPE);
         requestData.account = new Account("a", type);
-        requestData.accountManager = sMockAccountManager;
-        Bundle b = new Bundle();
-        b.putParcelable(AccountManager.KEY_INTENT, new Intent());
 
-        authenticator.new GetTokenCallback(requestData).run(makeFuture(b));
+        authenticator.new GetTokenCallback(requestData).run(makeFuture(options));
         verifyNoMoreInteractions(sMockAccountManager);
 
         // Verify that the broadcast receiver is registered
@@ -245,8 +246,8 @@
         verify(sMockAccountManager)
                 .getAuthToken(
                         eq(new Account("a", type)),
-                        eq("foo"),
-                        (Bundle) isNull(),
+                        eq(MOCK_TOKEN_TYPE),
+                        eq(options),
                         eq(true),
                         any(HttpNegotiateAuthenticator.GetTokenCallback.class),
                         (Handler) isNull());
diff --git a/remoting/base/crash/crashpad_linux.cc b/remoting/base/crash/crashpad_linux.cc
index cbddcecb..c7efe03 100644
--- a/remoting/base/crash/crashpad_linux.cc
+++ b/remoting/base/crash/crashpad_linux.cc
@@ -30,6 +30,10 @@
 const base::FilePath::CharType kChromotingCrashpadDatabasePath[] =
     FILE_PATH_LITERAL("crashpad");
 
+// Maximum number of crash reports to log. Reports are sorted by timestamp so
+// the most recent N reports will be logged.
+const int kMaxReportsToLog = 2;
+
 class CrashpadLinux {
  public:
   CrashpadLinux();
@@ -47,6 +51,10 @@
   bool GetCrashpadHandlerPath(base::FilePath* handler_path);
   base::FilePath GetCrashpadDatabasePath();
   void LogCrashReportInfo(const CrashReportDatabase::Report& report);
+  void SortAndLogCrashReports(std::vector<CrashReportDatabase::Report>& reports,
+                              std::string report_type,
+                              size_t max_reports);
+
   bool InitializeCrashpadDatabase(base::FilePath database_path);
 
   std::unique_ptr<CrashReportDatabase> database_;
@@ -78,6 +86,30 @@
            << " (attempts: " << report.upload_attempts << ")";
 }
 
+void CrashpadLinux::SortAndLogCrashReports(
+    std::vector<CrashReportDatabase::Report>& reports,
+    std::string report_type,
+    size_t max_reports) {
+  size_t num_reports = reports.size();
+  if (num_reports > max_reports) {
+    HOST_LOG << report_type << " crash reports: " << num_reports
+             << " (most recent " << max_reports << " shown)";
+  } else {
+    HOST_LOG << report_type << " crash reports: " << num_reports;
+  }
+
+  // Sort so most recent reports are first.
+  std::sort(reports.begin(), reports.end(),
+            [](CrashReportDatabase::Report const& a,
+               CrashReportDatabase::Report const& b) {
+              return a.creation_time > b.creation_time;
+            });
+  for (size_t i = 0; i < reports.size() && i < max_reports; ++i) {
+    const auto& report = reports[i];
+    LogCrashReportInfo(report);
+  }
+}
+
 bool CrashpadLinux::InitializeCrashpadDatabase(base::FilePath database_path) {
   base::File::Error error;
   if (!base::CreateDirectoryAndGetError(database_path, &error)) {
@@ -96,10 +128,7 @@
   std::vector<CrashReportDatabase::Report> completed_reports;
   status = database_->GetCompletedReports(&completed_reports);
   if (status == CrashReportDatabase::OperationStatus::kNoError) {
-    HOST_LOG << "Completed crash reports: " << completed_reports.size();
-    for (const auto& report : completed_reports) {
-      LogCrashReportInfo(report);
-    }
+    SortAndLogCrashReports(completed_reports, "Completed", kMaxReportsToLog);
   } else {
     LOG(ERROR) << "Unable to read completed crash reports: " << status;
   }
@@ -107,10 +136,7 @@
   std::vector<CrashReportDatabase::Report> pending_reports;
   status = database_->GetPendingReports(&pending_reports);
   if (status == CrashReportDatabase::OperationStatus::kNoError) {
-    HOST_LOG << "Pending crash reports: " << pending_reports.size();
-    for (const auto& report : pending_reports) {
-      LogCrashReportInfo(report);
-    }
+    SortAndLogCrashReports(pending_reports, "Pending", kMaxReportsToLog);
   } else {
     LOG(ERROR) << "Unable to read pending crash reports: " << status;
   }
diff --git a/sandbox/policy/features.cc b/sandbox/policy/features.cc
index 76e52825..e19bb854 100644
--- a/sandbox/policy/features.cc
+++ b/sandbox/policy/features.cc
@@ -120,10 +120,10 @@
              base::FEATURE_DISABLED_BY_DEFAULT);
 
 // Filters most environment variables out for kService and kServiceWithJit
-// sandboxed processes.
+// sandboxed processes. Flag retained as a kill-switch.
 BASE_FEATURE(kWinSboxFilterServiceEnvironment,
              "WinSboxFilterServiceEnvironment",
-             base::FEATURE_DISABLED_BY_DEFAULT);
+             base::FEATURE_ENABLED_BY_DEFAULT);
 #endif  // BUILDFLAG(IS_WIN)
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
diff --git a/sandbox/win/src/handle_closer_agent.cc b/sandbox/win/src/handle_closer_agent.cc
index 35feb23..e1fa5e0 100644
--- a/sandbox/win/src/handle_closer_agent.cc
+++ b/sandbox/win/src/handle_closer_agent.cc
@@ -2,19 +2,15 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/351564777): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "sandbox/win/src/handle_closer_agent.h"
 
 #include <Windows.h>
-#include <winnls.h>
 
 #include <stddef.h>
+#include <winnls.h>
 
 #include "base/check.h"
+#include "base/containers/heap_array.h"
 #include "base/containers/span.h"
 #include "base/logging.h"
 #include "base/win/static_constants.h"
@@ -170,22 +166,21 @@
 
   // The system call will return only handles up to the buffer size so add a
   // margin of error of an additional 1000 handles.
-  std::vector<char> buffer((handle_count + 1000) * sizeof(uint32_t));
+  auto handles = base::HeapArray<uint32_t>::WithSize(handle_count + 1000);
   DWORD return_length;
   NTSTATUS status = GetNtExports()->QueryInformationProcess(
       ::GetCurrentProcess(), static_cast<PROCESSINFOCLASS>(ProcessHandleTable),
-      buffer.data(), static_cast<ULONG>(buffer.size()), &return_length);
+      handles.data(), static_cast<ULONG>(handles.size() * sizeof(uint32_t)),
+      &return_length);
 
   if (!NT_SUCCESS(status)) {
     ::SetLastError(GetLastErrorFromNtStatus(status));
     return false;
   }
-  DCHECK(buffer.size() >= return_length);
-  DCHECK((buffer.size() % sizeof(uint32_t)) == 0);
 
-  base::span<uint32_t> handle_values(reinterpret_cast<uint32_t*>(buffer.data()),
-                                     return_length / sizeof(uint32_t));
-  for (uint32_t handle_value : handle_values) {
+  CHECK(handles.size() * sizeof(uint32_t) >= return_length);
+  for (const uint32_t handle_value :
+       handles.subspan(0, return_length / sizeof(uint32_t))) {
     HANDLE handle = base::win::Uint32ToHandle(handle_value);
     auto type_name = GetTypeNameFromHandle(handle);
     if (type_name) {
diff --git a/services/network/private_network_access_checker.cc b/services/network/private_network_access_checker.cc
index b2a63a57..04bc24b 100644
--- a/services/network/private_network_access_checker.cc
+++ b/services/network/private_network_access_checker.cc
@@ -189,9 +189,7 @@
     return Result::kBlockedByLoadOption;
   }
 
-  if (is_potentially_trustworthy_same_origin_ &&
-      base::FeatureList::IsEnabled(
-          features::kLocalNetworkAccessAllowPotentiallyTrustworthySameOrigin)) {
+  if (is_potentially_trustworthy_same_origin_) {
     return Result::kAllowedPotentiallyTrustworthySameOrigin;
   }
 
diff --git a/services/network/private_network_access_checker_unittest.cc b/services/network/private_network_access_checker_unittest.cc
index 399368e..079be15 100644
--- a/services/network/private_network_access_checker_unittest.cc
+++ b/services/network/private_network_access_checker_unittest.cc
@@ -8,11 +8,9 @@
 
 #include "base/strings/strcat.h"
 #include "base/test/metrics/histogram_tester.h"
-#include "base/test/scoped_feature_list.h"
 #include "net/base/ip_address.h"
 #include "net/base/ip_endpoint.h"
 #include "net/base/transport_info.h"
-#include "services/network/public/cpp/features.h"
 #include "services/network/public/cpp/resource_request.h"
 #include "services/network/public/mojom/client_security_state.mojom-shared.h"
 #include "services/network/public/mojom/client_security_state.mojom.h"
@@ -165,10 +163,6 @@
 
 TEST(PrivateNetworkAccessCheckerTest,
      CheckAllowedPotentiallyTrustworthySameOrigin) {
-  base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(
-      features::kLocalNetworkAccessAllowPotentiallyTrustworthySameOrigin);
-
   base::HistogramTester histogram_tester;
 
   ResourceRequest request;
@@ -193,10 +187,6 @@
 
 TEST(PrivateNetworkAccessCheckerTest,
      CheckDisallowedPotentiallyTrustworthyCrossOrigin) {
-  base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(
-      features::kLocalNetworkAccessAllowPotentiallyTrustworthySameOrigin);
-
   base::HistogramTester histogram_tester;
 
   ResourceRequest request;
@@ -220,10 +210,6 @@
 }
 
 TEST(PrivateNetworkAccessCheckerTest, CheckDisallowedUntrustworthySameOrigin) {
-  base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(
-      features::kLocalNetworkAccessAllowPotentiallyTrustworthySameOrigin);
-
   base::HistogramTester histogram_tester;
 
   ResourceRequest request;
@@ -247,10 +233,6 @@
 
 TEST(PrivateNetworkAccessCheckerTest,
      CheckDisallowedPotentiallyTrustworthyCrossOriginAfterResetForRedirect) {
-  base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(
-      features::kLocalNetworkAccessAllowPotentiallyTrustworthySameOrigin);
-
   base::HistogramTester histogram_tester;
 
   ResourceRequest request;
@@ -275,10 +257,6 @@
 
 TEST(PrivateNetworkAccessCheckerTest,
      CheckAllowedPotentiallyTrustworthySameOriginAfterResetForRedirect) {
-  base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(
-      features::kLocalNetworkAccessAllowPotentiallyTrustworthySameOrigin);
-
   base::HistogramTester histogram_tester;
 
   ResourceRequest request;
diff --git a/services/network/public/cpp/features.cc b/services/network/public/cpp/features.cc
index 56885c1de..b650a39 100644
--- a/services/network/public/cpp/features.cc
+++ b/services/network/public/cpp/features.cc
@@ -208,12 +208,6 @@
              "PrivateNetworkAccessPreflightShortTimeout",
              base::FEATURE_ENABLED_BY_DEFAULT);
 
-// Allow potentially trustworthy same origin local network requests without
-// preflights.
-BASE_FEATURE(kLocalNetworkAccessAllowPotentiallyTrustworthySameOrigin,
-             "LocalNetworkAccessAllowPotentiallyTrustworthySameOrigin",
-             base::FEATURE_ENABLED_BY_DEFAULT);
-
 // When kPrivateNetworkAccessPermissionPrompt is enabled, public secure websites
 // are allowed to access private insecure subresources with user's permission.
 BASE_FEATURE(kPrivateNetworkAccessPermissionPrompt,
diff --git a/services/network/public/cpp/features.h b/services/network/public/cpp/features.h
index 32ce788..721eb36 100644
--- a/services/network/public/cpp/features.h
+++ b/services/network/public/cpp/features.h
@@ -75,9 +75,6 @@
 BASE_DECLARE_FEATURE(kPrivateNetworkAccessPreflightShortTimeout);
 
 COMPONENT_EXPORT(NETWORK_CPP)
-BASE_DECLARE_FEATURE(kLocalNetworkAccessAllowPotentiallyTrustworthySameOrigin);
-
-COMPONENT_EXPORT(NETWORK_CPP)
 BASE_DECLARE_FEATURE(kPrivateNetworkAccessPermissionPrompt);
 
 // If enabled, then the network service will parse the Cookie-Indices header.
diff --git a/services/webnn/coreml/graph_builder_coreml.cc b/services/webnn/coreml/graph_builder_coreml.cc
index b72515909..a86729e 100644
--- a/services/webnn/coreml/graph_builder_coreml.cc
+++ b/services/webnn/coreml/graph_builder_coreml.cc
@@ -48,6 +48,7 @@
 #include "services/webnn/public/cpp/context_properties.h"
 #include "services/webnn/public/cpp/operand_descriptor.h"
 #include "services/webnn/public/cpp/supported_data_types.h"
+#include "services/webnn/public/cpp/supported_tensors.h"
 #include "services/webnn/public/cpp/webnn_errors.h"
 #include "services/webnn/public/mojom/webnn_error.mojom.h"
 #include "services/webnn/public/mojom/webnn_graph.mojom.h"
@@ -1001,21 +1002,24 @@
        // DequantizeLinear is not implemented.
        /*dequantize_linear_input=*/{},
        /*dequantize_linear_scale=*/{},
-       /*add_input=*/kFloatsAndInt32,
-       /*sub_input=*/kFloatsAndInt32,
-       /*mul_input=*/kFloatsAndInt32,
-       /*div_input=*/kFloatsAndInt32,
-       /*max_input=*/kFloatsAndInt32,
-       /*min_input=*/kFloatsAndInt32,
-       /*pow_input=*/kFloatsAndInt32,
-       /*equal_input=*/kFloatsAndInt32,
-       /*greater_input=*/kFloatsAndInt32,
-       /*greater_or_equal_input=*/kFloatsAndInt32,
-       /*lesser_input=*/kFloatsAndInt32,
-       /*lesser_or_equal_input=*/kFloatsAndInt32,
-       /*logical_and_input=*/DataTypeConstraint::kUint8,
-       /*logical_or_input=*/DataTypeConstraint::kUint8,
-       /*logical_xor_input=*/DataTypeConstraint::kUint8,
+       /*add_input=*/{kFloatsAndInt32, SupportedRanks::UpTo(5)},
+       /*sub_input=*/{kFloatsAndInt32, SupportedRanks::UpTo(5)},
+       /*mul_input=*/{kFloatsAndInt32, SupportedRanks::UpTo(5)},
+       /*div_input=*/{kFloatsAndInt32, SupportedRanks::UpTo(5)},
+       /*max_input=*/{kFloatsAndInt32, SupportedRanks::UpTo(5)},
+       /*min_input=*/{kFloatsAndInt32, SupportedRanks::UpTo(5)},
+       /*pow_input=*/{kFloatsAndInt32, SupportedRanks::UpTo(5)},
+       /*equal_input=*/{kFloatsAndInt32, SupportedRanks::UpTo(5)},
+       /*greater_input=*/{kFloatsAndInt32, SupportedRanks::UpTo(5)},
+       /*greater_or_equal_input=*/{kFloatsAndInt32, SupportedRanks::UpTo(5)},
+       /*lesser_input=*/{kFloatsAndInt32, SupportedRanks::UpTo(5)},
+       /*lesser_or_equal_input=*/{kFloatsAndInt32, SupportedRanks::UpTo(5)},
+       /*logical_and_input=*/
+       {DataTypeConstraint::kUint8, SupportedRanks::UpTo(5)},
+       /*logical_or_input=*/
+       {DataTypeConstraint::kUint8, SupportedRanks::UpTo(5)},
+       /*logical_xor_input=*/
+       {DataTypeConstraint::kUint8, SupportedRanks::UpTo(5)},
        /*logical_not_input=*/DataTypeConstraint::kUint8,
        /*logical_output=*/DataTypeConstraint::kUint8,
        /*abs_input=*/kFloatsAndInt32,
@@ -1063,7 +1067,7 @@
        // LstmCell is implemented with lstm, they should have the same
        // constraints.
        /*lstm_cell_input=*/DataTypeConstraint::kFloat16To32,
-       /*matmul_input=*/kFloatsAndInt32,
+       /*matmul_input=*/{kFloatsAndInt32, SupportedRanks::UpTo(5)},
        /*pad_input=*/DataTypeConstraint::kFloat16To32,
        /*average_pool2d_input=*/DataTypeConstraint::kFloat16To32,
        /*l2_pool2d_input=*/DataTypeConstraint::kFloat16To32,
@@ -2038,92 +2042,95 @@
 
   switch (kind) {
     case mojom::ElementWiseBinary::Kind::kAdd: {
-      CHECK(
-          context_properties_.data_type_limits.add_input.Has(input_data_type));
+      CHECK(context_properties_.data_type_limits.add_input.data_types.Has(
+          input_data_type));
       op_type_name = kOpAddTypeName;
       break;
     }
     case mojom::ElementWiseBinary::Kind::kDiv: {
-      CHECK(
-          context_properties_.data_type_limits.div_input.Has(input_data_type));
+      CHECK(context_properties_.data_type_limits.div_input.data_types.Has(
+          input_data_type));
       op_type_name = kOpDivideTypeName;
       break;
     }
     case mojom::ElementWiseBinary::Kind::kMul: {
-      CHECK(
-          context_properties_.data_type_limits.mul_input.Has(input_data_type));
+      CHECK(context_properties_.data_type_limits.mul_input.data_types.Has(
+          input_data_type));
       op_type_name = kOpMultiplyTypeName;
       break;
     }
     case mojom::ElementWiseBinary::Kind::kSub: {
-      CHECK(
-          context_properties_.data_type_limits.sub_input.Has(input_data_type));
+      CHECK(context_properties_.data_type_limits.sub_input.data_types.Has(
+          input_data_type));
       op_type_name = kOpSubtractTypeName;
       break;
     }
     case mojom::ElementWiseBinary::Kind::kMax: {
-      CHECK(
-          context_properties_.data_type_limits.max_input.Has(input_data_type));
+      CHECK(context_properties_.data_type_limits.max_input.data_types.Has(
+          input_data_type));
       op_type_name = kOpMaximumTypeName;
       break;
     }
     case mojom::ElementWiseBinary::Kind::kMin: {
-      CHECK(
-          context_properties_.data_type_limits.min_input.Has(input_data_type));
+      CHECK(context_properties_.data_type_limits.min_input.data_types.Has(
+          input_data_type));
       op_type_name = kOpMinimumTypeName;
       break;
     }
     case mojom::ElementWiseBinary::Kind::kPow: {
-      CHECK(
-          context_properties_.data_type_limits.pow_input.Has(input_data_type));
+      CHECK(context_properties_.data_type_limits.pow_input.data_types.Has(
+          input_data_type));
       op_type_name = kOpPowerTypeName;
       break;
     }
     case mojom::ElementWiseBinary::Kind::kEqual: {
-      CHECK(context_properties_.data_type_limits.equal_input.Has(
+      CHECK(context_properties_.data_type_limits.equal_input.data_types.Has(
           input_data_type));
       op_type_name = kOpLogicalEqual;
       break;
     }
     case mojom::ElementWiseBinary::Kind::kGreater: {
-      CHECK(context_properties_.data_type_limits.greater_input.Has(
+      CHECK(context_properties_.data_type_limits.greater_input.data_types.Has(
           input_data_type));
       op_type_name = kOpLogicalGreater;
       break;
     }
     case mojom::ElementWiseBinary::Kind::kGreaterOrEqual: {
-      CHECK(context_properties_.data_type_limits.greater_or_equal_input.Has(
-          input_data_type));
+      CHECK(context_properties_.data_type_limits.greater_or_equal_input
+                .data_types.Has(input_data_type));
       op_type_name = kOpLogicalGreaterEqual;
       break;
     }
     case mojom::ElementWiseBinary::Kind::kLesser: {
-      CHECK(context_properties_.data_type_limits.lesser_input.Has(
+      CHECK(context_properties_.data_type_limits.lesser_input.data_types.Has(
           input_data_type));
       op_type_name = kOpLogicalLess;
       break;
     }
     case mojom::ElementWiseBinary::Kind::kLesserOrEqual: {
-      CHECK(context_properties_.data_type_limits.lesser_or_equal_input.Has(
-          input_data_type));
+      CHECK(context_properties_.data_type_limits.lesser_or_equal_input
+                .data_types.Has(input_data_type));
       op_type_name = kOpLogicalLessEqual;
       break;
     }
     case mojom::ElementWiseBinary::Kind::kLogicalAnd: {
-      CHECK(context_properties_.data_type_limits.logical_and_input.Has(
-          input_data_type));
+      CHECK(
+          context_properties_.data_type_limits.logical_and_input.data_types.Has(
+              input_data_type));
       op_type_name = kOpLogicalAnd;
       break;
     }
     case mojom::ElementWiseBinary::Kind::kLogicalOr: {
-      CHECK(context_properties_.data_type_limits.logical_or_input.Has(
-          input_data_type));
+      CHECK(
+          context_properties_.data_type_limits.logical_or_input.data_types.Has(
+              input_data_type));
       op_type_name = kOpLogicalOr;
       break;
     }
     case mojom::ElementWiseBinary::Kind::kLogicalXor: {
-      CHECK(context_properties_.data_type_limits.logical_xor_input.Has(
-          input_data_type));
+      CHECK(
+          context_properties_.data_type_limits.logical_xor_input.data_types.Has(
+              input_data_type));
       op_type_name = kOpLogicalXor;
       break;
     }
@@ -3730,7 +3737,7 @@
     CoreML::Specification::MILSpec::Block& block) {
   const OperandInfo& input_operand_info = GetOperandInfo(input_x_operand_id);
 
-  CHECK(context_properties_.data_type_limits.matmul_input.Has(
+  CHECK(context_properties_.data_type_limits.matmul_input.data_types.Has(
       MILDataTypeToOperandType(input_operand_info.mil_data_type)));
 
   CoreML::Specification::MILSpec::Operation* op = block.add_operations();
diff --git a/services/webnn/dml/context_impl_dml.cc b/services/webnn/dml/context_impl_dml.cc
index f2ee7ec5..6ec586d 100644
--- a/services/webnn/dml/context_impl_dml.cc
+++ b/services/webnn/dml/context_impl_dml.cc
@@ -28,6 +28,7 @@
 #include "services/webnn/public/cpp/context_properties.h"
 #include "services/webnn/public/cpp/operand_descriptor.h"
 #include "services/webnn/public/cpp/supported_data_types.h"
+#include "services/webnn/public/cpp/supported_tensors.h"
 #include "services/webnn/public/mojom/webnn_tensor.mojom.h"
 #include "services/webnn/webnn_constant_operand.h"
 #include "services/webnn/webnn_context_impl.h"
@@ -125,49 +126,51 @@
        /*dequantize_linear_scale=*/DataTypeConstraint::kFloat32,
 
        // https://learn.microsoft.com/en-us/windows/win32/api/directml/ns-directml-dml_element_wise_add_operator_desc#tensor-support
-       /*add_input=*/kFloat16To32Ints32,
+       /*add_input=*/{kFloat16To32Ints32, SupportedRanks::UpTo(8)},
 
        // https://learn.microsoft.com/en-us/windows/win32/api/directml/ns-directml-dml_element_wise_subtract_operator_desc#tensor-support
-       /*sub_input=*/kFloat16To32Ints32,
+       /*sub_input=*/{kFloat16To32Ints32, SupportedRanks::UpTo(8)},
 
        // https://learn.microsoft.com/en-us/windows/win32/api/directml/ns-directml-dml_element_wise_multiply_operator_desc#tensor-support
-       /*mul_input=*/kFloat16To32Ints32,
+       /*mul_input=*/{kFloat16To32Ints32, SupportedRanks::UpTo(8)},
 
        // https://learn.microsoft.com/en-us/windows/win32/api/directml/ns-directml-dml_element_wise_divide_operator_desc#tensor-support
-       /*div_input=*/kFloat16To32Ints32,
+       /*div_input=*/{kFloat16To32Ints32, SupportedRanks::UpTo(8)},
 
        // https://learn.microsoft.com/en-us/windows/win32/api/directml/ns-directml-dml_element_wise_max_operator_desc#tensor-support
-       /*max_input=*/kFloat16To32Ints8To32,
+       /*max_input=*/{kFloat16To32Ints8To32, SupportedRanks::UpTo(8)},
 
        // https://learn.microsoft.com/en-us/windows/win32/api/directml/ns-directml-dml_element_wise_min_operator_desc#tensor-support
-       /*min_input=*/kFloat16To32Ints8To32,
+       /*min_input=*/{kFloat16To32Ints8To32, SupportedRanks::UpTo(8)},
 
        // https://learn.microsoft.com/en-us/windows/win32/api/directml/ns-directml-dml_element_wise_pow_operator_desc#tensor-support
-       /*pow_input=*/kFloat16To32Ints8To32,
+       /*pow_input=*/{kFloat16To32Ints8To32, SupportedRanks::UpTo(8)},
 
        // https://learn.microsoft.com/en-us/windows/win32/api/directml/ns-directml-dml_element_wise_logical_equals_operator_desc#tensor-support
-       /*equal_input=*/kFloat16To32Ints8To32,
+       /*equal_input=*/{kFloat16To32Ints8To32, SupportedRanks::UpTo(8)},
 
        // https://learn.microsoft.com/en-us/windows/win32/api/directml/ns-directml-dml_element_wise_logical_greater_than_operator_desc#tensor-support
-       /*greater_input=*/kFloat16To32Ints8To32,
+       /*greater_input=*/{kFloat16To32Ints8To32, SupportedRanks::UpTo(8)},
 
        // https://learn.microsoft.com/en-us/windows/win32/api/directml/ns-directml-dml_element_wise_logical_greater_than_or_equal_operator_desc#tensor-support
-       /*greater_or_equal_input=*/kFloat16To32Ints8To32,
+       /*greater_or_equal_input=*/
+       {kFloat16To32Ints8To32, SupportedRanks::UpTo(8)},
 
        // https://learn.microsoft.com/en-us/windows/win32/api/directml/ns-directml-dml_element_wise_logical_less_than_operator_desc#tensor-support
-       /*lesser_input=*/kFloat16To32Ints8To32,
+       /*lesser_input=*/{kFloat16To32Ints8To32, SupportedRanks::UpTo(8)},
 
        // https://learn.microsoft.com/en-us/windows/win32/api/directml/ns-directml-dml_element_wise_logical_less_than_or_equal_operator_desc#tensor-support
-       /*lesser_or_equal_input=*/kFloat16To32Ints8To32,
+       /*lesser_or_equal_input=*/
+       {kFloat16To32Ints8To32, SupportedRanks::UpTo(8)},
 
        // https://learn.microsoft.com/en-us/windows/win32/api/directml/ns-directml-dml_element_wise_logical_and_operator_desc#tensor-support
-       /*logical_and_input=*/kUint8To32,
+       /*logical_and_input=*/{kUint8To32, SupportedRanks::UpTo(8)},
 
        // https://learn.microsoft.com/en-us/windows/win32/api/directml/ns-directml-dml_element_wise_logical_or_operator_desc#tensor-support
-       /*logical_or_input=*/kUint8To32,
+       /*logical_or_input=*/{kUint8To32, SupportedRanks::UpTo(8)},
 
        // https://learn.microsoft.com/en-us/windows/win32/api/directml/ns-directml-dml_element_wise_logical_xor_operator_desc#tensor-support
-       /*logical_xor_input=*/kUint8To32,
+       /*logical_xor_input=*/{kUint8To32, SupportedRanks::UpTo(8)},
 
        // https://learn.microsoft.com/en-us/windows/win32/api/directml/ns-directml-dml_element_wise_logical_not_operator_desc#tensor-support
        /*logical_not_input=*/kUint8To32,
@@ -270,8 +273,10 @@
        /*lstm_input=*/DataTypeConstraint::kFloat16To32,
        /*lstm_cell_input=*/DataTypeConstraint::kFloat16To32,
 
-       // Matmul is emulated by gemm.
-       /*matmul_input=*/DataTypeConstraint::kFloat16To32,
+       // Matmul is emulated by gemm however inputs are flattened to support
+       // ranks greater than 4.
+       /*matmul_input=*/
+       {DataTypeConstraint::kFloat16To32, SupportedRanks::UpTo(8)},
 
        // https://learn.microsoft.com/en-us/windows/win32/api/directml/ns-directml-dml_padding_operator_desc#tensor-support
        /*pad_input=*/kFloat16To32Ints8To32,
@@ -368,21 +373,21 @@
   if (feature_level >= DML_FEATURE_LEVEL_4_1) {
     properties.data_type_limits.concat_inputs =
         DataTypeConstraint::kAllDataTypesAtLeast8bits;
-    properties.data_type_limits.add_input =
+    properties.data_type_limits.add_input.data_types =
         DataTypeConstraint::kFloat16To32Ints32To64;
-    properties.data_type_limits.sub_input =
+    properties.data_type_limits.sub_input.data_types =
         DataTypeConstraint::kFloat16To32Ints32To64;
-    properties.data_type_limits.mul_input =
+    properties.data_type_limits.mul_input.data_types =
         DataTypeConstraint::kFloat16To32Ints32To64;
-    properties.data_type_limits.equal_input =
+    properties.data_type_limits.equal_input.data_types =
         DataTypeConstraint::kAllDataTypesAtLeast8bits;
-    properties.data_type_limits.greater_input =
+    properties.data_type_limits.greater_input.data_types =
         DataTypeConstraint::kAllDataTypesAtLeast8bits;
-    properties.data_type_limits.greater_or_equal_input =
+    properties.data_type_limits.greater_or_equal_input.data_types =
         DataTypeConstraint::kAllDataTypesAtLeast8bits;
-    properties.data_type_limits.lesser_input =
+    properties.data_type_limits.lesser_input.data_types =
         DataTypeConstraint::kAllDataTypesAtLeast8bits;
-    properties.data_type_limits.lesser_or_equal_input =
+    properties.data_type_limits.lesser_or_equal_input.data_types =
         DataTypeConstraint::kAllDataTypesAtLeast8bits;
     properties.data_type_limits.abs_input = kFloat16To32Int8To64;
     properties.data_type_limits.identity_input =
@@ -420,9 +425,9 @@
         DataTypeConstraint::kAllDataTypesAtLeast8bits;
     properties.data_type_limits.cumulative_sum_input =
         DataTypeConstraint::kFloat16To32Ints32To64;
-    properties.data_type_limits.max_input =
+    properties.data_type_limits.max_input.data_types =
         DataTypeConstraint::kAllDataTypesAtLeast8bits;
-    properties.data_type_limits.min_input =
+    properties.data_type_limits.min_input.data_types =
         DataTypeConstraint::kAllDataTypesAtLeast8bits;
     properties.data_type_limits.pad_input =
         DataTypeConstraint::kAllDataTypesAtLeast8bits;
@@ -443,13 +448,13 @@
   }
 
   if (feature_level >= DML_FEATURE_LEVEL_5_1) {
-    properties.data_type_limits.add_input =
+    properties.data_type_limits.add_input.data_types =
         DataTypeConstraint::kAllDataTypesAtLeast8bits;
-    properties.data_type_limits.sub_input =
+    properties.data_type_limits.sub_input.data_types =
         DataTypeConstraint::kAllDataTypesAtLeast8bits;
-    properties.data_type_limits.mul_input =
+    properties.data_type_limits.mul_input.data_types =
         DataTypeConstraint::kAllDataTypesAtLeast8bits;
-    properties.data_type_limits.div_input = kFloat16To32Ints8To32;
+    properties.data_type_limits.div_input.data_types = kFloat16To32Ints8To32;
     properties.data_type_limits.prelu_input =
         DataTypeConstraint::kFloat16To32Int8To32;
     properties.data_type_limits.relu_input =
@@ -459,7 +464,7 @@
   }
 
   if (feature_level >= DML_FEATURE_LEVEL_6_0) {
-    properties.data_type_limits.div_input =
+    properties.data_type_limits.div_input.data_types =
         DataTypeConstraint::kAllDataTypesAtLeast8bits;
     properties.data_type_limits.dequantize_linear_scale =
         DataTypeConstraint::kFloat16To32;
diff --git a/services/webnn/dml/graph_impl_dml.cc b/services/webnn/dml/graph_impl_dml.cc
index bbdfdad7..e178f3b3 100644
--- a/services/webnn/dml/graph_impl_dml.cc
+++ b/services/webnn/dml/graph_impl_dml.cc
@@ -2119,7 +2119,8 @@
   std::array<const NodeOutput*, 2> inputs = {input_a, input_b};
   switch (binary->kind) {
     case mojom::ElementWiseBinary::Kind::kAdd: {
-      CHECK(context_properties.data_type_limits.add_input.Has(input_data_type));
+      CHECK(context_properties.data_type_limits.add_input.data_types.Has(
+          input_data_type));
       std::optional<const Operation*> fusible_activation =
           GetFusibleActivationFromOperation(
               operation_to_fusible_standalone_activation_map, operation);
@@ -2155,28 +2156,32 @@
       break;
     }
     case mojom::ElementWiseBinary::Kind::kDiv: {
-      CHECK(context_properties.data_type_limits.div_input.Has(input_data_type));
+      CHECK(context_properties.data_type_limits.div_input.data_types.Has(
+          input_data_type));
       binary_node = CreateBinaryOperator<DML_ELEMENT_WISE_DIVIDE_OPERATOR_DESC>(
           input_a_tensor_desc, input_b_tensor_desc, output_tensor_desc,
           graph_builder, DML_OPERATOR_ELEMENT_WISE_DIVIDE, inputs, label);
       break;
     }
     case mojom::ElementWiseBinary::Kind::kMax: {
-      CHECK(context_properties.data_type_limits.max_input.Has(input_data_type));
+      CHECK(context_properties.data_type_limits.max_input.data_types.Has(
+          input_data_type));
       binary_node = CreateBinaryOperator<DML_ELEMENT_WISE_MAX_OPERATOR_DESC>(
           input_a_tensor_desc, input_b_tensor_desc, output_tensor_desc,
           graph_builder, DML_OPERATOR_ELEMENT_WISE_MAX, inputs, label);
       break;
     }
     case mojom::ElementWiseBinary::Kind::kMin: {
-      CHECK(context_properties.data_type_limits.min_input.Has(input_data_type));
+      CHECK(context_properties.data_type_limits.min_input.data_types.Has(
+          input_data_type));
       binary_node = CreateBinaryOperator<DML_ELEMENT_WISE_MIN_OPERATOR_DESC>(
           input_a_tensor_desc, input_b_tensor_desc, output_tensor_desc,
           graph_builder, DML_OPERATOR_ELEMENT_WISE_MIN, inputs, label);
       break;
     }
     case mojom::ElementWiseBinary::Kind::kMul: {
-      CHECK(context_properties.data_type_limits.mul_input.Has(input_data_type));
+      CHECK(context_properties.data_type_limits.mul_input.data_types.Has(
+          input_data_type));
       binary_node =
           CreateBinaryOperator<DML_ELEMENT_WISE_MULTIPLY_OPERATOR_DESC>(
               input_a_tensor_desc, input_b_tensor_desc, output_tensor_desc,
@@ -2184,7 +2189,8 @@
       break;
     }
     case mojom::ElementWiseBinary::Kind::kSub: {
-      CHECK(context_properties.data_type_limits.sub_input.Has(input_data_type));
+      CHECK(context_properties.data_type_limits.sub_input.data_types.Has(
+          input_data_type));
       binary_node =
           CreateBinaryOperator<DML_ELEMENT_WISE_SUBTRACT_OPERATOR_DESC>(
               input_a_tensor_desc, input_b_tensor_desc, output_tensor_desc,
@@ -2192,7 +2198,8 @@
       break;
     }
     case mojom::ElementWiseBinary::Kind::kPow: {
-      CHECK(context_properties.data_type_limits.pow_input.Has(input_data_type));
+      CHECK(context_properties.data_type_limits.pow_input.data_types.Has(
+          input_data_type));
       DML_ELEMENT_WISE_POW_OPERATOR_DESC element_wise_operator_desc{
           .InputTensor = &input_a_tensor_desc.GetDMLTensorDesc(),
           .ExponentTensor = &input_b_tensor_desc.GetDMLTensorDesc(),
@@ -2203,8 +2210,8 @@
       break;
     }
     case mojom::ElementWiseBinary::Kind::kEqual: {
-      CHECK(
-          context_properties.data_type_limits.equal_input.Has(input_data_type));
+      CHECK(context_properties.data_type_limits.equal_input.data_types.Has(
+          input_data_type));
       binary_node =
           CreateBinaryOperator<DML_ELEMENT_WISE_LOGICAL_EQUALS_OPERATOR_DESC>(
               input_a_tensor_desc, input_b_tensor_desc, output_tensor_desc,
@@ -2213,7 +2220,7 @@
       break;
     }
     case mojom::ElementWiseBinary::Kind::kGreater: {
-      CHECK(context_properties.data_type_limits.greater_input.Has(
+      CHECK(context_properties.data_type_limits.greater_input.data_types.Has(
           input_data_type));
       binary_node = CreateBinaryOperator<
           DML_ELEMENT_WISE_LOGICAL_GREATER_THAN_OPERATOR_DESC>(
@@ -2223,8 +2230,8 @@
       break;
     }
     case mojom::ElementWiseBinary::Kind::kGreaterOrEqual: {
-      CHECK(context_properties.data_type_limits.greater_or_equal_input.Has(
-          input_data_type));
+      CHECK(context_properties.data_type_limits.greater_or_equal_input
+                .data_types.Has(input_data_type));
       binary_node = CreateBinaryOperator<
           DML_ELEMENT_WISE_LOGICAL_GREATER_THAN_OR_EQUAL_OPERATOR_DESC>(
           input_a_tensor_desc, input_b_tensor_desc, output_tensor_desc,
@@ -2234,7 +2241,7 @@
       break;
     }
     case mojom::ElementWiseBinary::Kind::kLesser: {
-      CHECK(context_properties.data_type_limits.lesser_input.Has(
+      CHECK(context_properties.data_type_limits.lesser_input.data_types.Has(
           input_data_type));
       binary_node = CreateBinaryOperator<
           DML_ELEMENT_WISE_LOGICAL_LESS_THAN_OPERATOR_DESC>(
@@ -2244,8 +2251,8 @@
       break;
     }
     case mojom::ElementWiseBinary::Kind::kLesserOrEqual: {
-      CHECK(context_properties.data_type_limits.lesser_or_equal_input.Has(
-          input_data_type));
+      CHECK(context_properties.data_type_limits.lesser_or_equal_input.data_types
+                .Has(input_data_type));
       binary_node = CreateBinaryOperator<
           DML_ELEMENT_WISE_LOGICAL_LESS_THAN_OR_EQUAL_OPERATOR_DESC>(
           input_a_tensor_desc, input_b_tensor_desc, output_tensor_desc,
@@ -2254,8 +2261,9 @@
       break;
     }
     case mojom::ElementWiseBinary::Kind::kLogicalAnd: {
-      CHECK(context_properties.data_type_limits.logical_and_input.Has(
-          input_data_type));
+      CHECK(
+          context_properties.data_type_limits.logical_and_input.data_types.Has(
+              input_data_type));
       binary_node =
           CreateBinaryOperator<DML_ELEMENT_WISE_LOGICAL_AND_OPERATOR_DESC>(
               input_a_tensor_desc, input_b_tensor_desc, output_tensor_desc,
@@ -2264,7 +2272,7 @@
       break;
     }
     case mojom::ElementWiseBinary::Kind::kLogicalOr: {
-      CHECK(context_properties.data_type_limits.logical_or_input.Has(
+      CHECK(context_properties.data_type_limits.logical_or_input.data_types.Has(
           input_data_type));
       binary_node =
           CreateBinaryOperator<DML_ELEMENT_WISE_LOGICAL_OR_OPERATOR_DESC>(
@@ -2274,8 +2282,9 @@
       break;
     }
     case mojom::ElementWiseBinary::Kind::kLogicalXor: {
-      CHECK(context_properties.data_type_limits.logical_xor_input.Has(
-          input_data_type));
+      CHECK(
+          context_properties.data_type_limits.logical_xor_input.data_types.Has(
+              input_data_type));
       binary_node =
           CreateBinaryOperator<DML_ELEMENT_WISE_LOGICAL_XOR_OPERATOR_DESC>(
               input_a_tensor_desc, input_b_tensor_desc, output_tensor_desc,
@@ -4707,7 +4716,7 @@
     input_b_tensor_desc.BroadcastTo(output_tensor_dims, 2);
   }
 
-  CHECK(context_properties.data_type_limits.matmul_input.Has(
+  CHECK(context_properties.data_type_limits.matmul_input.data_types.Has(
       DmlDataTypeToOperand(input_a_tensor_desc.GetDataType())));
   CHECK_EQ(input_a_tensor_desc.GetDimensions().size(),
            input_b_tensor_desc.GetDimensions().size());
diff --git a/services/webnn/public/cpp/BUILD.gn b/services/webnn/public/cpp/BUILD.gn
index 0ae4063..49cb62a 100644
--- a/services/webnn/public/cpp/BUILD.gn
+++ b/services/webnn/public/cpp/BUILD.gn
@@ -15,6 +15,7 @@
     "operand_descriptor.h",
     "range.h",
     "supported_data_types.h",
+    "supported_tensors.h",
     "webnn_errors.cc",
     "webnn_errors.h",
   ]
diff --git a/services/webnn/public/cpp/data_type_limits.cc b/services/webnn/public/cpp/data_type_limits.cc
index c53257d..e9bd547 100644
--- a/services/webnn/public/cpp/data_type_limits.cc
+++ b/services/webnn/public/cpp/data_type_limits.cc
@@ -21,21 +21,21 @@
                                SupportedDataTypes cumulative_sum_input,
                                SupportedDataTypes dequantize_linear_input,
                                SupportedDataTypes dequantize_linear_scale,
-                               SupportedDataTypes add_input,
-                               SupportedDataTypes sub_input,
-                               SupportedDataTypes mul_input,
-                               SupportedDataTypes div_input,
-                               SupportedDataTypes max_input,
-                               SupportedDataTypes min_input,
-                               SupportedDataTypes pow_input,
-                               SupportedDataTypes equal_input,
-                               SupportedDataTypes greater_input,
-                               SupportedDataTypes greater_or_equal_input,
-                               SupportedDataTypes lesser_input,
-                               SupportedDataTypes lesser_or_equal_input,
-                               SupportedDataTypes logical_and_input,
-                               SupportedDataTypes logical_or_input,
-                               SupportedDataTypes logical_xor_input,
+                               SupportedTensors add_input,
+                               SupportedTensors sub_input,
+                               SupportedTensors mul_input,
+                               SupportedTensors div_input,
+                               SupportedTensors max_input,
+                               SupportedTensors min_input,
+                               SupportedTensors pow_input,
+                               SupportedTensors equal_input,
+                               SupportedTensors greater_input,
+                               SupportedTensors greater_or_equal_input,
+                               SupportedTensors lesser_input,
+                               SupportedTensors lesser_or_equal_input,
+                               SupportedTensors logical_and_input,
+                               SupportedTensors logical_or_input,
+                               SupportedTensors logical_xor_input,
                                SupportedDataTypes logical_not_input,
                                SupportedDataTypes logical_output,
                                SupportedDataTypes abs_input,
@@ -72,7 +72,7 @@
                                SupportedDataTypes linear_input,
                                SupportedDataTypes lstm_input,
                                SupportedDataTypes lstm_cell_input,
-                               SupportedDataTypes matmul_input,
+                               SupportedTensors matmul_input,
                                SupportedDataTypes pad_input,
                                SupportedDataTypes average_pool2d_input,
                                SupportedDataTypes l2_pool2d_input,
diff --git a/services/webnn/public/cpp/data_type_limits.h b/services/webnn/public/cpp/data_type_limits.h
index c708a3a..6b7f27b 100644
--- a/services/webnn/public/cpp/data_type_limits.h
+++ b/services/webnn/public/cpp/data_type_limits.h
@@ -7,6 +7,7 @@
 
 #include "mojo/public/cpp/bindings/default_construct_tag.h"
 #include "services/webnn/public/cpp/supported_data_types.h"
+#include "services/webnn/public/cpp/supported_tensors.h"
 
 namespace webnn {
 
@@ -26,21 +27,21 @@
                  SupportedDataTypes cumulative_sum_input,
                  SupportedDataTypes dequantize_linear_input,
                  SupportedDataTypes dequantize_linear_scale,
-                 SupportedDataTypes add_input,
-                 SupportedDataTypes sub_input,
-                 SupportedDataTypes mul_input,
-                 SupportedDataTypes div_input,
-                 SupportedDataTypes max_input,
-                 SupportedDataTypes min_input,
-                 SupportedDataTypes pow_input,
-                 SupportedDataTypes equal_input,
-                 SupportedDataTypes greater_input,
-                 SupportedDataTypes greater_or_equal_input,
-                 SupportedDataTypes lesser_input,
-                 SupportedDataTypes lesser_or_equal_input,
-                 SupportedDataTypes logical_and_input,
-                 SupportedDataTypes logical_or_input,
-                 SupportedDataTypes logical_xor_input,
+                 SupportedTensors add_input,
+                 SupportedTensors sub_input,
+                 SupportedTensors mul_input,
+                 SupportedTensors div_input,
+                 SupportedTensors max_input,
+                 SupportedTensors min_input,
+                 SupportedTensors pow_input,
+                 SupportedTensors equal_input,
+                 SupportedTensors greater_input,
+                 SupportedTensors greater_or_equal_input,
+                 SupportedTensors lesser_input,
+                 SupportedTensors lesser_or_equal_input,
+                 SupportedTensors logical_and_input,
+                 SupportedTensors logical_or_input,
+                 SupportedTensors logical_xor_input,
                  SupportedDataTypes logical_not_input,
                  SupportedDataTypes logical_output,
                  SupportedDataTypes abs_input,
@@ -77,7 +78,7 @@
                  SupportedDataTypes linear_input,
                  SupportedDataTypes lstm_input,
                  SupportedDataTypes lstm_cell_input,
-                 SupportedDataTypes matmul_input,
+                 SupportedTensors matmul_input,
                  SupportedDataTypes pad_input,
                  SupportedDataTypes average_pool2d_input,
                  SupportedDataTypes l2_pool2d_input,
@@ -139,21 +140,21 @@
   SupportedDataTypes cumulative_sum_input;
   SupportedDataTypes dequantize_linear_input;
   SupportedDataTypes dequantize_linear_scale;
-  SupportedDataTypes add_input;
-  SupportedDataTypes sub_input;
-  SupportedDataTypes mul_input;
-  SupportedDataTypes div_input;
-  SupportedDataTypes max_input;
-  SupportedDataTypes min_input;
-  SupportedDataTypes pow_input;
-  SupportedDataTypes equal_input;
-  SupportedDataTypes greater_input;
-  SupportedDataTypes greater_or_equal_input;
-  SupportedDataTypes lesser_input;
-  SupportedDataTypes lesser_or_equal_input;
-  SupportedDataTypes logical_and_input;
-  SupportedDataTypes logical_or_input;
-  SupportedDataTypes logical_xor_input;
+  SupportedTensors add_input;
+  SupportedTensors sub_input;
+  SupportedTensors mul_input;
+  SupportedTensors div_input;
+  SupportedTensors max_input;
+  SupportedTensors min_input;
+  SupportedTensors pow_input;
+  SupportedTensors equal_input;
+  SupportedTensors greater_input;
+  SupportedTensors greater_or_equal_input;
+  SupportedTensors lesser_input;
+  SupportedTensors lesser_or_equal_input;
+  SupportedTensors logical_and_input;
+  SupportedTensors logical_or_input;
+  SupportedTensors logical_xor_input;
   SupportedDataTypes logical_not_input;
   SupportedDataTypes logical_output;
   SupportedDataTypes abs_input;
@@ -190,7 +191,7 @@
   SupportedDataTypes linear_input;
   SupportedDataTypes lstm_input;
   SupportedDataTypes lstm_cell_input;
-  SupportedDataTypes matmul_input;
+  SupportedTensors matmul_input;
   SupportedDataTypes pad_input;
   SupportedDataTypes average_pool2d_input;
   SupportedDataTypes l2_pool2d_input;
diff --git a/services/webnn/public/cpp/graph_validation_utils.cc b/services/webnn/public/cpp/graph_validation_utils.cc
index 709b146..9894465 100644
--- a/services/webnn/public/cpp/graph_validation_utils.cc
+++ b/services/webnn/public/cpp/graph_validation_utils.cc
@@ -978,11 +978,16 @@
     const OperandDescriptor& a,
     const OperandDescriptor& b,
     std::string_view label) {
-  if (!context_properties.data_type_limits.matmul_input.Has(a.data_type())) {
+  if (!context_properties.data_type_limits.matmul_input.Supports(a)) {
     return base::unexpected(ErrorWithLabel(
-        label,
-        NotSupportedInputArgumentTypeError(
-            a.data_type(), context_properties.data_type_limits.matmul_input)));
+        label, NotSupportedArgumentError(
+                   "a", a, context_properties.data_type_limits.matmul_input)));
+  }
+
+  if (!context_properties.data_type_limits.matmul_input.Supports(b)) {
+    return base::unexpected(ErrorWithLabel(
+        label, NotSupportedArgumentError(
+                   "b", b, context_properties.data_type_limits.matmul_input)));
   }
 
   if (a.data_type() != b.data_type()) {
@@ -990,16 +995,10 @@
         label, "The data types of first two inputs don't match."));
   }
 
-  // Based on the WG discussion:
-  // https://github.com/webmachinelearning/webnn/issues/470, prototype the
-  // matmul without 1-D input tensors support.
-  if (a.Rank() < 2 || b.Rank() < 2) {
-    return base::unexpected(ErrorWithLabel(
-        label, "The rank of input must be larger than or equal to 2."));
-  }
-
   std::vector<uint32_t> a_dimensions = a.shape();
+  CHECK_GE(a_dimensions.size(), 2u);
   std::vector<uint32_t> b_dimensions = b.shape();
+  CHECK_GE(b_dimensions.size(), 2u);
 
   // The number of columns in the first matrix must be equal to the number of
   // rows in the second matrix.
diff --git a/services/webnn/public/cpp/supported_tensors.h b/services/webnn/public/cpp/supported_tensors.h
new file mode 100644
index 0000000..3adc30b
--- /dev/null
+++ b/services/webnn/public/cpp/supported_tensors.h
@@ -0,0 +1,64 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef SERVICES_WEBNN_PUBLIC_CPP_SUPPORTED_TENSORS_H_
+#define SERVICES_WEBNN_PUBLIC_CPP_SUPPORTED_TENSORS_H_
+
+#include <stdint.h>
+
+#include <initializer_list>
+
+#include "base/ranges/algorithm.h"
+#include "services/webnn/public/cpp/operand_descriptor.h"
+#include "services/webnn/public/cpp/supported_data_types.h"
+
+namespace webnn {
+
+struct SupportedRanks {
+  uint32_t min;
+  uint32_t max;
+
+  static SupportedRanks UpTo(uint32_t max) { return {0, max}; }
+
+  friend bool operator==(const SupportedRanks& lhs, const SupportedRanks& rhs);
+};
+
+inline bool operator==(const SupportedRanks& lhs,
+                       const SupportedRanks& rhs) = default;
+
+struct SupportedTensors {
+  SupportedDataTypes data_types;
+  SupportedRanks ranks;
+
+  void IntersectWith(const SupportedTensors& other) {
+    data_types.RetainAll(other.data_types);
+    ranks.min = std::max(ranks.min, other.ranks.min);
+    ranks.max = std::min(ranks.max, other.ranks.max);
+  }
+
+  bool Supports(const OperandDescriptor& operand_descriptor) const {
+    uint32_t rank = operand_descriptor.Rank();
+    return data_types.Has(operand_descriptor.data_type()) &&
+           ranks.min <= rank && rank <= ranks.max;
+  }
+
+  bool SupportsAll(
+      std::initializer_list<OperandDescriptor> operand_descriptors) const {
+    return base::ranges::all_of(
+        operand_descriptors,
+        [this](const OperandDescriptor& operand_descriptor) {
+          return Supports(operand_descriptor);
+        });
+  }
+
+  friend bool operator==(const SupportedTensors& lhs,
+                         const SupportedTensors& rhs);
+};
+
+inline bool operator==(const SupportedTensors& lhs,
+                       const SupportedTensors& rhs) = default;
+
+}  // namespace webnn
+
+#endif  // SERVICES_WEBNN_PUBLIC_CPP_SUPPORTED_TENSORS_H_
diff --git a/services/webnn/public/cpp/webnn_errors.cc b/services/webnn/public/cpp/webnn_errors.cc
index 981c0d3..626d23d 100644
--- a/services/webnn/public/cpp/webnn_errors.cc
+++ b/services/webnn/public/cpp/webnn_errors.cc
@@ -7,7 +7,9 @@
 #include <string>
 #include <vector>
 
+#include "base/notreached.h"
 #include "base/ranges/algorithm.h"
+#include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
 #include "services/webnn/public/cpp/operand_descriptor.h"
 #include "services/webnn/public/cpp/supported_data_types.h"
@@ -59,6 +61,31 @@
                        SupportedDataTypesString(supported_types)});
 }
 
+std::string NotSupportedArgumentError(std::string_view argument_name,
+                                      const OperandDescriptor& descriptor,
+                                      SupportedTensors supported_tensors) {
+  if (!supported_tensors.data_types.Has(descriptor.data_type())) {
+    return NotSupportedArgumentTypeError(argument_name, descriptor.data_type(),
+                                         supported_tensors.data_types);
+  }
+
+  if (descriptor.Rank() < supported_tensors.ranks.min) {
+    return base::StrCat(
+        {"Unsupported rank ", base::NumberToString(descriptor.Rank()),
+         " for argument ", argument_name, " (must be at least ",
+         base::NumberToString(supported_tensors.ranks.min), ")."});
+  }
+
+  if (descriptor.Rank() > supported_tensors.ranks.max) {
+    return base::StrCat(
+        {"Unsupported rank ", base::NumberToString(descriptor.Rank()),
+         " for argument ", argument_name, " (must be at most ",
+         base::NumberToString(supported_tensors.ranks.max), ")."});
+  }
+
+  NOTREACHED();
+}
+
 std::string NotSupportedConstantTypeError(OperandDataType type,
                                           SupportedDataTypes supported_types) {
   return base::StrCat({"Unsupported data type ", DataTypeToString(type),
diff --git a/services/webnn/public/cpp/webnn_errors.h b/services/webnn/public/cpp/webnn_errors.h
index 18e1478..9185c299 100644
--- a/services/webnn/public/cpp/webnn_errors.h
+++ b/services/webnn/public/cpp/webnn_errors.h
@@ -10,6 +10,7 @@
 #include "base/component_export.h"
 #include "services/webnn/public/cpp/operand_descriptor.h"
 #include "services/webnn/public/cpp/supported_data_types.h"
+#include "services/webnn/public/cpp/supported_tensors.h"
 
 namespace webnn {
 
@@ -125,6 +126,10 @@
                                   OperandDataType type,
                                   SupportedDataTypes supported_types);
 std::string COMPONENT_EXPORT(WEBNN_PUBLIC_CPP)
+    NotSupportedArgumentError(std::string_view argument_name,
+                              const OperandDescriptor& descriptor,
+                              SupportedTensors supported_tensors);
+std::string COMPONENT_EXPORT(WEBNN_PUBLIC_CPP)
     NotSupportedConstantTypeError(OperandDataType type,
                                   SupportedDataTypes supported_types);
 std::string COMPONENT_EXPORT(WEBNN_PUBLIC_CPP)
diff --git a/services/webnn/public/mojom/BUILD.gn b/services/webnn/public/mojom/BUILD.gn
index 42958af..9ee10c74 100644
--- a/services/webnn/public/mojom/BUILD.gn
+++ b/services/webnn/public/mojom/BUILD.gn
@@ -56,6 +56,14 @@
           cpp = "::webnn::SupportedDataTypes"
         },
         {
+          mojom = "webnn.mojom.SupportedRanks"
+          cpp = "::webnn::SupportedRanks"
+        },
+        {
+          mojom = "webnn.mojom.SupportedTensors"
+          cpp = "::webnn::SupportedTensors"
+        },
+        {
           mojom = "webnn.mojom.TensorUsage"
           cpp = "::webnn::MLTensorUsage"
           copyable_pass_by_value = true
@@ -67,6 +75,7 @@
         "operand_descriptor_mojom_traits.h",
         "range_traits.h",
         "supported_data_types_mojom_traits.h",
+        "supported_tensors_mojom_traits.h",
         "tensor_usage_mojom_traits.h",
       ]
       traits_public_deps = [ ":webnn_mojom_traits" ]
diff --git a/services/webnn/public/mojom/context_properties_mojom_traits_unittest.cc b/services/webnn/public/mojom/context_properties_mojom_traits_unittest.cc
index f10f0c3..862a2ce 100644
--- a/services/webnn/public/mojom/context_properties_mojom_traits_unittest.cc
+++ b/services/webnn/public/mojom/context_properties_mojom_traits_unittest.cc
@@ -7,6 +7,7 @@
 #include "mojo/public/cpp/test_support/test_utils.h"
 #include "services/webnn/public/cpp/context_properties.h"
 #include "services/webnn/public/cpp/operand_descriptor.h"
+#include "services/webnn/public/cpp/supported_tensors.h"
 #include "services/webnn/public/mojom/webnn_context_properties.mojom.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -35,28 +36,43 @@
        /*dequantize_linear_scale=*/
        {webnn::OperandDataType::kFloat16, webnn::OperandDataType::kFloat32},
        /*add_input=*/
-       {webnn::OperandDataType::kFloat16, webnn::OperandDataType::kFloat32},
-       /*sub_input=*/webnn::SupportedDataTypes::All(),
-       /*mul_input=*/webnn::SupportedDataTypes::All(),
-       /*div_input=*/webnn::SupportedDataTypes::All(),
+       {{webnn::OperandDataType::kFloat16, webnn::OperandDataType::kFloat32},
+        webnn::SupportedRanks::UpTo(8)},
+       /*sub_input=*/
+       {webnn::SupportedDataTypes::All(), webnn::SupportedRanks::UpTo(8)},
+       /*mul_input=*/
+       {webnn::SupportedDataTypes::All(), webnn::SupportedRanks::UpTo(8)},
+       /*div_input=*/
+       {webnn::SupportedDataTypes::All(), webnn::SupportedRanks::UpTo(8)},
        /*max_input=*/
-       {webnn::OperandDataType::kFloat16, webnn::OperandDataType::kFloat32},
+       {{webnn::OperandDataType::kFloat16, webnn::OperandDataType::kFloat32},
+        webnn::SupportedRanks::UpTo(8)},
        /*min_input=*/
-       {webnn::OperandDataType::kInt32, webnn::OperandDataType::kInt64},
+       {{webnn::OperandDataType::kInt32, webnn::OperandDataType::kInt64},
+        webnn::SupportedRanks::UpTo(8)},
        /*pow_input=*/
-       {webnn::OperandDataType::kFloat16, webnn::OperandDataType::kInt8},
+       {{webnn::OperandDataType::kFloat16, webnn::OperandDataType::kInt8},
+        webnn::SupportedRanks::UpTo(8)},
        /*equal_input=*/
-       {webnn::OperandDataType::kFloat16, webnn::OperandDataType::kFloat32},
+       {{webnn::OperandDataType::kFloat16, webnn::OperandDataType::kFloat32},
+        webnn::SupportedRanks::UpTo(8)},
        /*greater_input=*/
-       {webnn::OperandDataType::kFloat16, webnn::OperandDataType::kFloat32},
-       /*greater_or_equal_input=*/{webnn::OperandDataType::kFloat16},
+       {{webnn::OperandDataType::kFloat16, webnn::OperandDataType::kFloat32},
+        webnn::SupportedRanks::UpTo(8)},
+       /*greater_or_equal_input=*/
+       {{webnn::OperandDataType::kFloat16}, webnn::SupportedRanks::UpTo(8)},
        /*lesser_input=*/
-       {webnn::OperandDataType::kInt32, webnn::OperandDataType::kInt64},
+       {{webnn::OperandDataType::kInt32, webnn::OperandDataType::kInt64},
+        webnn::SupportedRanks::UpTo(8)},
        /*lesser_or_equal_input=*/
-       {webnn::OperandDataType::kFloat16, webnn::OperandDataType::kFloat32},
-       /*logical_and_input=*/{webnn::OperandDataType::kUint8},
-       /*logical_or_input=*/{webnn::OperandDataType::kUint8},
-       /*logical_xor_input=*/{webnn::OperandDataType::kUint8},
+       {{webnn::OperandDataType::kFloat16, webnn::OperandDataType::kFloat32},
+        webnn::SupportedRanks::UpTo(8)},
+       /*logical_and_input=*/
+       {{webnn::OperandDataType::kUint8}, webnn::SupportedRanks::UpTo(8)},
+       /*logical_or_input=*/
+       {{webnn::OperandDataType::kUint8}, webnn::SupportedRanks::UpTo(8)},
+       /*logical_xor_input=*/
+       {{webnn::OperandDataType::kUint8}, webnn::SupportedRanks::UpTo(8)},
        /*logical_not_input=*/webnn::SupportedDataTypes::All(),
        /*logical_output=*/{webnn::OperandDataType::kUint64},
        /*abs_input=*/
@@ -107,7 +123,8 @@
        /*lstm_input=*/{webnn::OperandDataType::kFloat32},
        /*lstm_cell_input=*/
        {webnn::OperandDataType::kFloat16, webnn::OperandDataType::kFloat32},
-       /*matmul_input=*/webnn::SupportedDataTypes::All(),
+       /*matmul_input=*/
+       {webnn::SupportedDataTypes::All(), webnn::SupportedRanks::UpTo(8)},
        /*pad_input=*/
        {webnn::OperandDataType::kFloat16, webnn::OperandDataType::kFloat32},
        /*average_pool2d_input=*/
diff --git a/services/webnn/public/mojom/data_type_limits_mojom_traits.h b/services/webnn/public/mojom/data_type_limits_mojom_traits.h
index 3a36cc3..79f0931 100644
--- a/services/webnn/public/mojom/data_type_limits_mojom_traits.h
+++ b/services/webnn/public/mojom/data_type_limits_mojom_traits.h
@@ -66,63 +66,63 @@
       const webnn::DataTypeLimits& data_type_limits) {
     return data_type_limits.dequantize_linear_scale;
   }
-  static webnn::SupportedDataTypes add_input(
+  static webnn::SupportedTensors add_input(
       const webnn::DataTypeLimits& data_type_limits) {
     return data_type_limits.add_input;
   }
-  static webnn::SupportedDataTypes sub_input(
+  static webnn::SupportedTensors sub_input(
       const webnn::DataTypeLimits& data_type_limits) {
     return data_type_limits.sub_input;
   }
-  static webnn::SupportedDataTypes mul_input(
+  static webnn::SupportedTensors mul_input(
       const webnn::DataTypeLimits& data_type_limits) {
     return data_type_limits.mul_input;
   }
-  static webnn::SupportedDataTypes div_input(
+  static webnn::SupportedTensors div_input(
       const webnn::DataTypeLimits& data_type_limits) {
     return data_type_limits.div_input;
   }
-  static webnn::SupportedDataTypes max_input(
+  static webnn::SupportedTensors max_input(
       const webnn::DataTypeLimits& data_type_limits) {
     return data_type_limits.max_input;
   }
-  static webnn::SupportedDataTypes min_input(
+  static webnn::SupportedTensors min_input(
       const webnn::DataTypeLimits& data_type_limits) {
     return data_type_limits.min_input;
   }
-  static webnn::SupportedDataTypes pow_input(
+  static webnn::SupportedTensors pow_input(
       const webnn::DataTypeLimits& data_type_limits) {
     return data_type_limits.pow_input;
   }
-  static webnn::SupportedDataTypes equal_input(
+  static webnn::SupportedTensors equal_input(
       const webnn::DataTypeLimits& data_type_limits) {
     return data_type_limits.equal_input;
   }
-  static webnn::SupportedDataTypes greater_input(
+  static webnn::SupportedTensors greater_input(
       const webnn::DataTypeLimits& data_type_limits) {
     return data_type_limits.greater_input;
   }
-  static webnn::SupportedDataTypes greater_or_equal_input(
+  static webnn::SupportedTensors greater_or_equal_input(
       const webnn::DataTypeLimits& data_type_limits) {
     return data_type_limits.greater_or_equal_input;
   }
-  static webnn::SupportedDataTypes lesser_input(
+  static webnn::SupportedTensors lesser_input(
       const webnn::DataTypeLimits& data_type_limits) {
     return data_type_limits.lesser_input;
   }
-  static webnn::SupportedDataTypes lesser_or_equal_input(
+  static webnn::SupportedTensors lesser_or_equal_input(
       const webnn::DataTypeLimits& data_type_limits) {
     return data_type_limits.lesser_or_equal_input;
   }
-  static webnn::SupportedDataTypes logical_and_input(
+  static webnn::SupportedTensors logical_and_input(
       const webnn::DataTypeLimits& data_type_limits) {
     return data_type_limits.logical_and_input;
   }
-  static webnn::SupportedDataTypes logical_or_input(
+  static webnn::SupportedTensors logical_or_input(
       const webnn::DataTypeLimits& data_type_limits) {
     return data_type_limits.logical_or_input;
   }
-  static webnn::SupportedDataTypes logical_xor_input(
+  static webnn::SupportedTensors logical_xor_input(
       const webnn::DataTypeLimits& data_type_limits) {
     return data_type_limits.logical_xor_input;
   }
@@ -270,7 +270,7 @@
       const webnn::DataTypeLimits& data_type_limits) {
     return data_type_limits.lstm_cell_input;
   }
-  static webnn::SupportedDataTypes matmul_input(
+  static webnn::SupportedTensors matmul_input(
       const webnn::DataTypeLimits& data_type_limits) {
     return data_type_limits.matmul_input;
   }
diff --git a/services/webnn/public/mojom/supported_tensors_mojom_traits.h b/services/webnn/public/mojom/supported_tensors_mojom_traits.h
new file mode 100644
index 0000000..9466be1a
--- /dev/null
+++ b/services/webnn/public/mojom/supported_tensors_mojom_traits.h
@@ -0,0 +1,57 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef SERVICES_WEBNN_PUBLIC_MOJOM_SUPPORTED_TENSORS_MOJOM_TRAITS_H_
+#define SERVICES_WEBNN_PUBLIC_MOJOM_SUPPORTED_TENSORS_MOJOM_TRAITS_H_
+
+#include <sys/stat.h>
+#include <sys/types.h>
+
+#include "mojo/public/cpp/bindings/struct_traits.h"
+#include "services/webnn/public/cpp/supported_tensors.h"
+#include "services/webnn/public/mojom/webnn_context_properties.mojom-shared.h"
+
+namespace mojo {
+
+template <>
+struct StructTraits<webnn::mojom::SupportedRanksDataView,
+                    webnn::SupportedRanks> {
+  static uint32_t min(const webnn::SupportedRanks& supported_ranks) {
+    return supported_ranks.min;
+  }
+
+  static uint32_t max(const webnn::SupportedRanks& supported_ranks) {
+    return supported_ranks.max;
+  }
+
+  static bool Read(webnn::mojom::SupportedRanksDataView data,
+                   webnn::SupportedRanks* out) {
+    out->min = data.min();
+    out->max = data.max();
+    return true;
+  }
+};
+
+template <>
+struct StructTraits<webnn::mojom::SupportedTensorsDataView,
+                    webnn::SupportedTensors> {
+  static webnn::SupportedDataTypes data_types(
+      const webnn::SupportedTensors& supported_tensors) {
+    return supported_tensors.data_types;
+  }
+
+  static webnn::SupportedRanks ranks(
+      const webnn::SupportedTensors& supported_tensors) {
+    return supported_tensors.ranks;
+  }
+
+  static bool Read(webnn::mojom::SupportedTensorsDataView data,
+                   webnn::SupportedTensors* out) {
+    return data.ReadDataTypes(&out->data_types) && data.ReadRanks(&out->ranks);
+  }
+};
+
+}  // namespace mojo
+
+#endif  // SERVICES_WEBNN_PUBLIC_MOJOM_SUPPORTED_TENSORS_MOJOM_TRAITS_H_
diff --git a/services/webnn/public/mojom/webnn_context_properties.mojom b/services/webnn/public/mojom/webnn_context_properties.mojom
index b4aabc3..57704474 100644
--- a/services/webnn/public/mojom/webnn_context_properties.mojom
+++ b/services/webnn/public/mojom/webnn_context_properties.mojom
@@ -36,6 +36,16 @@
   bool uint4;
 };
 
+struct SupportedRanks {
+  uint32 min;
+  uint32 max;
+};
+
+struct SupportedTensors {
+  SupportedDataTypes data_types;
+  SupportedRanks ranks;
+};
+
 // Represents the data type limits exposed through
 // `MLContext::opSupportLimits()`.
 // Keep the order as the same as build methods of `MLGraphBuilder`, for
@@ -61,23 +71,23 @@
   SupportedDataTypes dequantize_linear_scale;
 
   // Element-wise binary ops.
-  SupportedDataTypes add_input;
-  SupportedDataTypes sub_input;
-  SupportedDataTypes mul_input;
-  SupportedDataTypes div_input;
-  SupportedDataTypes max_input;
-  SupportedDataTypes min_input;
-  SupportedDataTypes pow_input;
+  SupportedTensors add_input;
+  SupportedTensors sub_input;
+  SupportedTensors mul_input;
+  SupportedTensors div_input;
+  SupportedTensors max_input;
+  SupportedTensors min_input;
+  SupportedTensors pow_input;
 
   // Element-wise logical ops.
-  SupportedDataTypes equal_input;
-  SupportedDataTypes greater_input;
-  SupportedDataTypes greater_or_equal_input;
-  SupportedDataTypes lesser_input;
-  SupportedDataTypes lesser_or_equal_input;
-  SupportedDataTypes logical_and_input;
-  SupportedDataTypes logical_or_input;
-  SupportedDataTypes logical_xor_input;
+  SupportedTensors equal_input;
+  SupportedTensors greater_input;
+  SupportedTensors greater_or_equal_input;
+  SupportedTensors lesser_input;
+  SupportedTensors lesser_or_equal_input;
+  SupportedTensors logical_and_input;
+  SupportedTensors logical_or_input;
+  SupportedTensors logical_xor_input;
   SupportedDataTypes logical_not_input;
   SupportedDataTypes logical_output;
 
@@ -124,7 +134,7 @@
   SupportedDataTypes linear_input;
   SupportedDataTypes lstm_input;
   SupportedDataTypes lstm_cell_input;
-  SupportedDataTypes matmul_input;
+  SupportedTensors matmul_input;
   SupportedDataTypes pad_input;
 
   // Pool2d.
diff --git a/services/webnn/tflite/graph_builder_tflite.cc b/services/webnn/tflite/graph_builder_tflite.cc
index dbb8561..09c1a77 100644
--- a/services/webnn/tflite/graph_builder_tflite.cc
+++ b/services/webnn/tflite/graph_builder_tflite.cc
@@ -23,6 +23,8 @@
 #include "services/webnn/public/cpp/context_properties.h"
 #include "services/webnn/public/cpp/graph_validation_utils.h"
 #include "services/webnn/public/cpp/operand_descriptor.h"
+#include "services/webnn/public/cpp/supported_data_types.h"
+#include "services/webnn/public/cpp/supported_tensors.h"
 #include "services/webnn/public/cpp/webnn_errors.h"
 #include "services/webnn/public/mojom/webnn_context_provider.mojom.h"
 #include "services/webnn/public/mojom/webnn_graph.mojom.h"
@@ -430,21 +432,45 @@
        /*dequantize_linear_input=*/kInt4AndInts8,
        // TODO(crbug.com/376722724): Support float16 scale.
        /*dequantize_linear_scale=*/DataTypeConstraint::kFloat32,
-       /*add_input=*/kFloat16To32AndInt32To64,
-       /*sub_input=*/kFloat16To32AndInt32To64,
-       /*mul_input=*/kFloat16To32AndInt32To64AndUint32,
-       /*div_input=*/kFloat16To32AndInt32,
-       /*max_input=*/kFloat16To32AndInt32To64,
-       /*min_input=*/kFloat16To32AndInt32To64,
-       /*pow_input=*/kFloat16To32AndInt32,
-       /*equal_input=*/kFloat16To32AndInt32To64,
-       /*greater_input=*/kFloat16To32AndInt32To64,
-       /*greater_or_equal_input=*/kFloat16To32AndInt32To64,
-       /*lesser_input=*/kFloat16To32AndInt32To64,
-       /*lesser_or_equal_input=*/kFloat16To32AndInt32To64,
-       /*logical_and_input=*/DataTypeConstraint::kUint8,
-       /*logical_or_input=*/DataTypeConstraint::kUint8,
-       /*logical_xor_input=*/DataTypeConstraint::kUint8,
+       // Limited to 6D when broadcasting is required:
+       // https://source.chromium.org/chromium/chromium/src/+/main:third_party/tflite/src/tensorflow/lite/kernels/add.cc
+       /*add_input=*/{kFloat16To32AndInt32To64, SupportedRanks::UpTo(6)},
+       // Limited to 6D when broadcasting is required:
+       // https://source.chromium.org/chromium/chromium/src/+/main:third_party/tflite/src/tensorflow/lite/kernels/internal/reference/sub.h
+       /*sub_input=*/{kFloat16To32AndInt32To64, SupportedRanks::UpTo(6)},
+       // Limited to 6D when broadcasting is required:
+       // https://source.chromium.org/chromium/chromium/src/+/main:third_party/tflite/src/tensorflow/lite/kernels/mul.cc
+       /*mul_input=*/
+       {kFloat16To32AndInt32To64AndUint32, SupportedRanks::UpTo(6)},
+       // Limited to 5D when broadcasting is required:
+       // https://source.chromium.org/chromium/chromium/src/+/main:third_party/tflite/src/tensorflow/lite/kernels/internal/reference/div.h
+       /*div_input=*/{kFloat16To32AndInt32, SupportedRanks::UpTo(5)},
+       // MAX and MIN are limited to 5D when broadcasting is required:
+       // https://source.chromium.org/chromium/chromium/src/+/main:third_party/tflite/src/tensorflow/lite/kernels/internal/reference/maximum_minimum.h
+       /*max_input=*/{kFloat16To32AndInt32To64, SupportedRanks::UpTo(5)},
+       /*min_input=*/{kFloat16To32AndInt32To64, SupportedRanks::UpTo(5)},
+       // Limited to 4D when broadcasting is required:
+       // https://source.chromium.org/chromium/chromium/src/+/main:third_party/tflite/src/tensorflow/lite/kernels/pow.cc
+       /*pow_input=*/{kFloat16To32AndInt32, SupportedRanks::UpTo(4)},
+       // Comparisons are limited to 4D when broadcasting is required:
+       // https://source.chromium.org/chromium/chromium/src/+/main:third_party/tflite/src/tensorflow/lite/kernels/comparisons.cc
+       /*equal_input=*/{kFloat16To32AndInt32To64, SupportedRanks::UpTo(4)},
+       /*greater_input=*/{kFloat16To32AndInt32To64, SupportedRanks::UpTo(4)},
+       /*greater_or_equal_input=*/
+       {kFloat16To32AndInt32To64, SupportedRanks::UpTo(4)},
+       /*lesser_input=*/{kFloat16To32AndInt32To64, SupportedRanks::UpTo(4)},
+       /*lesser_or_equal_input=*/
+       {kFloat16To32AndInt32To64, SupportedRanks::UpTo(4)},
+       // Logical binary operators are limited to 4D when broadcasting is
+       // required:
+       // https://source.chromium.org/chromium/chromium/src/+/main:third_party/tflite/src/tensorflow/lite/kernels/logical.cc
+       /*logical_and_input=*/
+       {DataTypeConstraint::kUint8, SupportedRanks::UpTo(4)},
+       /*logical_or_input=*/
+       {DataTypeConstraint::kUint8, SupportedRanks::UpTo(4)},
+       // Polyfilled using a cast to BOOL and NOT_EQUAL.
+       /*logical_xor_input=*/
+       {DataTypeConstraint::kUint8, SupportedRanks::UpTo(4)},
        /*logical_not_input=*/DataTypeConstraint::kUint8,
        /*logical_output=*/DataTypeConstraint::kUint8,
        /*abs_input=*/kFloat16To32AndInt32,
@@ -486,7 +512,8 @@
        /*linear_input=*/kFloat16To32AndInt32To64,
        /*lstm_input=*/DataTypeConstraint::kFloat16To32,
        /*lstm_cell_input=*/DataTypeConstraint::kFloat16To32,
-       /*matmul_input=*/kFloat16To32AndInt8,
+       // https://source.chromium.org/chromium/chromium/src/+/main:third_party/tflite/src/tensorflow/lite/kernels/internal/reference/batch_matmul.h
+       /*matmul_input=*/{kFloat16To32AndInt8, SupportedRanks::UpTo(5)},
        /*pad_input=*/kFloat16To32AndInt32To64AndUint8,
        /*average_pool2d_input=*/DataTypeConstraint::kFloat16To32,
        /*l2_pool2d_input=*/{},
@@ -1984,78 +2011,81 @@
   ::tflite::BuiltinOperator code;
   switch (op.kind) {
     case mojom::ElementWiseBinary::Kind::kAdd:
-      CHECK(
-          context_properties_.data_type_limits.add_input.Has(input_data_type));
+      CHECK(context_properties_.data_type_limits.add_input.data_types.Has(
+          input_data_type));
       code = ::tflite::BuiltinOperator_ADD;
       break;
     case mojom::ElementWiseBinary::Kind::kSub:
-      CHECK(
-          context_properties_.data_type_limits.sub_input.Has(input_data_type));
+      CHECK(context_properties_.data_type_limits.sub_input.data_types.Has(
+          input_data_type));
       code = ::tflite::BuiltinOperator_SUB;
       break;
     case mojom::ElementWiseBinary::Kind::kMul:
-      CHECK(
-          context_properties_.data_type_limits.mul_input.Has(input_data_type));
+      CHECK(context_properties_.data_type_limits.mul_input.data_types.Has(
+          input_data_type));
       code = ::tflite::BuiltinOperator_MUL;
       break;
     case mojom::ElementWiseBinary::Kind::kDiv:
-      CHECK(
-          context_properties_.data_type_limits.div_input.Has(input_data_type));
+      CHECK(context_properties_.data_type_limits.div_input.data_types.Has(
+          input_data_type));
       code = ::tflite::BuiltinOperator_DIV;
       break;
     case mojom::ElementWiseBinary::Kind::kMax:
-      CHECK(
-          context_properties_.data_type_limits.max_input.Has(input_data_type));
+      CHECK(context_properties_.data_type_limits.max_input.data_types.Has(
+          input_data_type));
       code = ::tflite::BuiltinOperator_MAXIMUM;
       break;
     case mojom::ElementWiseBinary::Kind::kMin:
-      CHECK(
-          context_properties_.data_type_limits.min_input.Has(input_data_type));
+      CHECK(context_properties_.data_type_limits.min_input.data_types.Has(
+          input_data_type));
       code = ::tflite::BuiltinOperator_MINIMUM;
       break;
     case mojom::ElementWiseBinary::Kind::kPow:
-      CHECK(
-          context_properties_.data_type_limits.pow_input.Has(input_data_type));
+      CHECK(context_properties_.data_type_limits.pow_input.data_types.Has(
+          input_data_type));
       code = ::tflite::BuiltinOperator_POW;
       break;
     case mojom::ElementWiseBinary::Kind::kEqual:
-      CHECK(context_properties_.data_type_limits.equal_input.Has(
+      CHECK(context_properties_.data_type_limits.equal_input.data_types.Has(
           input_data_type));
       code = ::tflite::BuiltinOperator_EQUAL;
       break;
     case mojom::ElementWiseBinary::Kind::kGreater:
-      CHECK(context_properties_.data_type_limits.greater_input.Has(
+      CHECK(context_properties_.data_type_limits.greater_input.data_types.Has(
           input_data_type));
       code = ::tflite::BuiltinOperator_GREATER;
       break;
     case mojom::ElementWiseBinary::Kind::kGreaterOrEqual:
-      CHECK(context_properties_.data_type_limits.greater_or_equal_input.Has(
-          input_data_type));
+      CHECK(context_properties_.data_type_limits.greater_or_equal_input
+                .data_types.Has(input_data_type));
       code = ::tflite::BuiltinOperator_GREATER_EQUAL;
       break;
     case mojom::ElementWiseBinary::Kind::kLesser:
-      CHECK(context_properties_.data_type_limits.lesser_input.Has(
+      CHECK(context_properties_.data_type_limits.lesser_input.data_types.Has(
           input_data_type));
       code = ::tflite::BuiltinOperator_LESS;
       break;
     case mojom::ElementWiseBinary::Kind::kLesserOrEqual:
-      CHECK(context_properties_.data_type_limits.lesser_or_equal_input.Has(
-          input_data_type));
+      CHECK(context_properties_.data_type_limits.lesser_or_equal_input
+                .data_types.Has(input_data_type));
       code = ::tflite::BuiltinOperator_LESS_EQUAL;
       break;
     case mojom::ElementWiseBinary::Kind::kLogicalAnd:
-      CHECK(context_properties_.data_type_limits.logical_and_input.Has(
-          input_data_type));
+      CHECK(
+          context_properties_.data_type_limits.logical_and_input.data_types.Has(
+              input_data_type));
       code = ::tflite::BuiltinOperator_LOGICAL_AND;
       break;
     case mojom::ElementWiseBinary::Kind::kLogicalOr:
-      CHECK(context_properties_.data_type_limits.logical_or_input.Has(
-          input_data_type));
+      CHECK(
+          context_properties_.data_type_limits.logical_or_input.data_types.Has(
+              input_data_type));
       code = ::tflite::BuiltinOperator_LOGICAL_OR;
       break;
     case mojom::ElementWiseBinary::Kind::kLogicalXor:
-      CHECK(context_properties_.data_type_limits.logical_xor_input.Has(
-          input_data_type));
+      CHECK(
+          context_properties_.data_type_limits.logical_xor_input.data_types.Has(
+              input_data_type));
       // TFLite does not have a logical_xor operator. Since the inputs are
       // converted to bools below, we can use the not_equal operator to get the
       // same results as logical_xor.
@@ -4072,7 +4102,7 @@
 
 auto GraphBuilderTflite::SerializeMatmul(const mojom::Matmul& matmul)
     -> base::expected<OperatorOffset, std::string> {
-  CHECK(context_properties_.data_type_limits.matmul_input.Has(
+  CHECK(context_properties_.data_type_limits.matmul_input.data_types.Has(
       GetOperand(matmul.a_operand_id).descriptor.data_type()));
   ASSIGN_OR_RETURN(const TensorInfo& a_tensor_info,
                    SerializeInputTensorInfo(matmul.a_operand_id));
diff --git a/services/webnn/webnn_context_impl.cc b/services/webnn/webnn_context_impl.cc
index 3bb9e36..5da9221 100644
--- a/services/webnn/webnn_context_impl.cc
+++ b/services/webnn/webnn_context_impl.cc
@@ -224,8 +224,8 @@
       DataTypeConstraint::kFloat16To32);
   backend_context_properties.data_type_limits.lstm_cell_input.RetainAll(
       DataTypeConstraint::kFloat16To32);
-  backend_context_properties.data_type_limits.matmul_input.RetainAll(
-      DataTypeConstraint::kFloat16To32);
+  backend_context_properties.data_type_limits.matmul_input.IntersectWith(
+      {DataTypeConstraint::kFloat16To32, {2, 8}});
   backend_context_properties.data_type_limits.average_pool2d_input.RetainAll(
       DataTypeConstraint::kFloat16To32);
   backend_context_properties.data_type_limits.l2_pool2d_input.RetainAll(
diff --git a/services/webnn/webnn_graph_builder_impl.cc b/services/webnn/webnn_graph_builder_impl.cc
index 11c3033..8a3f7d5 100644
--- a/services/webnn/webnn_graph_builder_impl.cc
+++ b/services/webnn/webnn_graph_builder_impl.cc
@@ -565,7 +565,7 @@
   bool ValidateDequantizeLinear(
       const mojom::DequantizeLinear& dequantize_linear,
       size_t operation_id);
-  bool ValidateElementWiseBinaryDataTypes(
+  bool ValidateElementWiseBinaryOperands(
       const mojom::Operand* lhs,
       const mojom::Operand* rhs,
       const mojom::Operand* output,
@@ -1025,7 +1025,7 @@
   return true;
 }
 
-bool OperationValidationContext::ValidateElementWiseBinaryDataTypes(
+bool OperationValidationContext::ValidateElementWiseBinaryOperands(
     const mojom::Operand* lhs,
     const mojom::Operand* rhs,
     const mojom::Operand* output,
@@ -1049,50 +1049,50 @@
 
   switch (operation.kind) {
     case mojom::ElementWiseBinary::Kind::kAdd:
-      return context_properties_->data_type_limits.add_input.Has(
-          lhs->descriptor.data_type());
+      return context_properties_->data_type_limits.add_input.SupportsAll(
+          {lhs->descriptor, rhs->descriptor});
     case mojom::ElementWiseBinary::Kind::kSub:
-      return context_properties_->data_type_limits.sub_input.Has(
-          lhs->descriptor.data_type());
+      return context_properties_->data_type_limits.sub_input.SupportsAll(
+          {lhs->descriptor, rhs->descriptor});
     case mojom::ElementWiseBinary::Kind::kMul:
-      return context_properties_->data_type_limits.mul_input.Has(
-          lhs->descriptor.data_type());
+      return context_properties_->data_type_limits.mul_input.SupportsAll(
+          {lhs->descriptor, rhs->descriptor});
     case mojom::ElementWiseBinary::Kind::kDiv:
-      return context_properties_->data_type_limits.div_input.Has(
-          lhs->descriptor.data_type());
+      return context_properties_->data_type_limits.div_input.SupportsAll(
+          {lhs->descriptor, rhs->descriptor});
     case mojom::ElementWiseBinary::Kind::kMax:
-      return context_properties_->data_type_limits.max_input.Has(
-          lhs->descriptor.data_type());
+      return context_properties_->data_type_limits.max_input.SupportsAll(
+          {lhs->descriptor, rhs->descriptor});
     case mojom::ElementWiseBinary::Kind::kMin:
-      return context_properties_->data_type_limits.min_input.Has(
-          lhs->descriptor.data_type());
+      return context_properties_->data_type_limits.min_input.SupportsAll(
+          {lhs->descriptor, rhs->descriptor});
     case mojom::ElementWiseBinary::Kind::kPow:
-      return context_properties_->data_type_limits.pow_input.Has(
-          lhs->descriptor.data_type());
+      return context_properties_->data_type_limits.pow_input.SupportsAll(
+          {lhs->descriptor, rhs->descriptor});
     case mojom::ElementWiseBinary::Kind::kEqual:
-      return context_properties_->data_type_limits.equal_input.Has(
-          lhs->descriptor.data_type());
+      return context_properties_->data_type_limits.equal_input.SupportsAll(
+          {lhs->descriptor, rhs->descriptor});
     case mojom::ElementWiseBinary::Kind::kGreater:
-      return context_properties_->data_type_limits.greater_input.Has(
-          lhs->descriptor.data_type());
+      return context_properties_->data_type_limits.greater_input.SupportsAll(
+          {lhs->descriptor, rhs->descriptor});
     case mojom::ElementWiseBinary::Kind::kGreaterOrEqual:
-      return context_properties_->data_type_limits.greater_or_equal_input.Has(
-          lhs->descriptor.data_type());
+      return context_properties_->data_type_limits.greater_or_equal_input
+          .SupportsAll({lhs->descriptor, rhs->descriptor});
     case mojom::ElementWiseBinary::Kind::kLesser:
-      return context_properties_->data_type_limits.lesser_input.Has(
-          lhs->descriptor.data_type());
+      return context_properties_->data_type_limits.lesser_input.SupportsAll(
+          {lhs->descriptor, rhs->descriptor});
     case mojom::ElementWiseBinary::Kind::kLesserOrEqual:
-      return context_properties_->data_type_limits.lesser_or_equal_input.Has(
-          lhs->descriptor.data_type());
+      return context_properties_->data_type_limits.lesser_or_equal_input
+          .SupportsAll({lhs->descriptor, rhs->descriptor});
     case mojom::ElementWiseBinary::Kind::kLogicalAnd:
-      return context_properties_->data_type_limits.logical_and_input.Has(
-          lhs->descriptor.data_type());
+      return context_properties_->data_type_limits.logical_and_input
+          .SupportsAll({lhs->descriptor, rhs->descriptor});
     case mojom::ElementWiseBinary::Kind::kLogicalOr:
-      return context_properties_->data_type_limits.logical_or_input.Has(
-          lhs->descriptor.data_type());
+      return context_properties_->data_type_limits.logical_or_input.SupportsAll(
+          {lhs->descriptor, rhs->descriptor});
     case mojom::ElementWiseBinary::Kind::kLogicalXor:
-      return context_properties_->data_type_limits.logical_xor_input.Has(
-          lhs->descriptor.data_type());
+      return context_properties_->data_type_limits.logical_xor_input
+          .SupportsAll({lhs->descriptor, rhs->descriptor});
   }
 }
 
@@ -1118,7 +1118,7 @@
     return false;
   }
 
-  if (!ValidateElementWiseBinaryDataTypes(a, b, output, operation)) {
+  if (!ValidateElementWiseBinaryOperands(a, b, output, operation)) {
     return false;
   }
 
diff --git a/services/webnn/webnn_test_utils.cc b/services/webnn/webnn_test_utils.cc
index 0c174efb..4f299fc 100644
--- a/services/webnn/webnn_test_utils.cc
+++ b/services/webnn/webnn_test_utils.cc
@@ -8,6 +8,7 @@
 #include "base/test/test_future.h"
 #include "base/unguessable_token.h"
 #include "services/webnn/public/cpp/context_properties.h"
+#include "services/webnn/public/cpp/supported_tensors.h"
 #include "services/webnn/webnn_context_impl.h"
 #include "third_party/blink/public/common/tokens/tokens.h"
 
@@ -587,21 +588,26 @@
        /*cumulative_sum_input=*/DataTypeConstraint::kFloat16To32,
        /*dequantize_linear_input=*/SupportedDataTypes::All(),
        /*dequantize_linear_scale=*/SupportedDataTypes::All(),
-       /*add_input=*/SupportedDataTypes::All(),
-       /*sub_input=*/SupportedDataTypes::All(),
-       /*mul_input=*/SupportedDataTypes::All(),
-       /*div_input=*/SupportedDataTypes::All(),
-       /*max_input=*/SupportedDataTypes::All(),
-       /*min_input=*/SupportedDataTypes::All(),
-       /*pow_input=*/SupportedDataTypes::All(),
-       /*equal_input=*/SupportedDataTypes::All(),
-       /*greater_input=*/SupportedDataTypes::All(),
-       /*greater_or_equal_input=*/SupportedDataTypes::All(),
-       /*lesser_input=*/SupportedDataTypes::All(),
-       /*lesser_or_equal_input=*/SupportedDataTypes::All(),
-       /*logical_and_input=*/DataTypeConstraint::kUint8,
-       /*logical_or_input=*/DataTypeConstraint::kUint8,
-       /*logical_xor_input=*/DataTypeConstraint::kUint8,
+       /*add_input=*/{SupportedDataTypes::All(), SupportedRanks::UpTo(8)},
+       /*sub_input=*/{SupportedDataTypes::All(), SupportedRanks::UpTo(8)},
+       /*mul_input=*/{SupportedDataTypes::All(), SupportedRanks::UpTo(8)},
+       /*div_input=*/{SupportedDataTypes::All(), SupportedRanks::UpTo(8)},
+       /*max_input=*/{SupportedDataTypes::All(), SupportedRanks::UpTo(8)},
+       /*min_input=*/{SupportedDataTypes::All(), SupportedRanks::UpTo(8)},
+       /*pow_input=*/{SupportedDataTypes::All(), SupportedRanks::UpTo(8)},
+       /*equal_input=*/{SupportedDataTypes::All(), SupportedRanks::UpTo(8)},
+       /*greater_input=*/{SupportedDataTypes::All(), SupportedRanks::UpTo(8)},
+       /*greater_or_equal_input=*/
+       {SupportedDataTypes::All(), SupportedRanks::UpTo(8)},
+       /*lesser_input=*/{SupportedDataTypes::All(), SupportedRanks::UpTo(8)},
+       /*lesser_or_equal_input=*/
+       {SupportedDataTypes::All(), SupportedRanks::UpTo(8)},
+       /*logical_and_input=*/
+       {DataTypeConstraint::kUint8, SupportedRanks::UpTo(8)},
+       /*logical_or_input=*/
+       {DataTypeConstraint::kUint8, SupportedRanks::UpTo(8)},
+       /*logical_xor_input=*/
+       {DataTypeConstraint::kUint8, SupportedRanks::UpTo(8)},
        /*logical_not_input=*/SupportedDataTypes::All(),
        /*logical_output=*/SupportedDataTypes::All(),
        /*abs_input=*/SupportedDataTypes::All(),
@@ -641,7 +647,7 @@
        /*linear_input=*/SupportedDataTypes::All(),
        /*lstm_input=*/SupportedDataTypes::All(),
        /*lstm_cell_input=*/SupportedDataTypes::All(),
-       /*matmul_input=*/SupportedDataTypes::All(),
+       /*matmul_input=*/{SupportedDataTypes::All(), SupportedRanks::UpTo(8)},
        /*pad_input=*/SupportedDataTypes::All(),
        /*average_pool2d_input=*/SupportedDataTypes::All(),
        /*l2_pool2d_input=*/SupportedDataTypes::All(),
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index 0f2cb5f5..ff577542 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -4118,6 +4118,21 @@
             ]
         }
     ],
+    "CheckWebAppExistenceAsync": [
+        {
+            "platforms": [
+                "android"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "CheckWebAppExistenceAsync"
+                    ]
+                }
+            ]
+        }
+    ],
     "ChromeCartDomBasedHeuristics": [
         {
             "platforms": [
@@ -6384,7 +6399,14 @@
             ],
             "experiments": [
                 {
-                    "name": "Preperiod_Enabled_NonDogfood"
+                    "name": "Preperiod_Enabled_NonDogfood",
+                    "enable_features": [
+                        "LinkLayerPrivacy"
+                    ],
+                    "min_os_version": "16151.0.0",
+                    "hardware_classes": [
+                        "brya"
+                    ]
                 }
             ]
         }
@@ -9678,6 +9700,26 @@
             ]
         }
     ],
+    "FencedFramesEnableCrossOriginAutomaticBeaconData": [
+        {
+            "platforms": [
+                "android",
+                "chromeos",
+                "chromeos_lacros",
+                "linux",
+                "mac",
+                "windows"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "FencedFramesCrossOriginAutomaticBeaconData"
+                    ]
+                }
+            ]
+        }
+    ],
     "FencedFramesEnableReportEventHeaderChanges": [
         {
             "platforms": [
@@ -10112,6 +10154,25 @@
             ]
         }
     ],
+    "FusedLocationProviderTuning": [
+        {
+            "platforms": [
+                "android"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "params": {
+                        "geolocation_request_max_location_age_millis": "2147483647",
+                        "geolocation_request_min_update_interval_millis": "0"
+                    },
+                    "enable_features": [
+                        "UseFusedLocationProvider"
+                    ]
+                }
+            ]
+        }
+    ],
     "GMSCoreEmoji": [
         {
             "platforms": [
@@ -18019,8 +18080,8 @@
     "ProtectedAudienceEagerJSCompilation": [
         {
             "platforms": [
+                "android",
                 "chromeos",
-                "chromeos_lacros",
                 "linux",
                 "mac",
                 "windows"
@@ -19689,6 +19750,25 @@
             ]
         }
     ],
+    "SafetyHubServicesOnStartUp": [
+        {
+            "platforms": [
+                "chromeos",
+                "fuchsia",
+                "linux",
+                "mac",
+                "windows"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "SafetyHubServicesOnStartUp"
+                    ]
+                }
+            ]
+        }
+    ],
     "SavePasswordHashFromProfilePicker": [
         {
             "platforms": [
@@ -23641,21 +23721,6 @@
             ]
         }
     ],
-    "UseFusedLocationProvider": [
-        {
-            "platforms": [
-                "android"
-            ],
-            "experiments": [
-                {
-                    "name": "Enabled",
-                    "enable_features": [
-                        "UseFusedLocationProvider"
-                    ]
-                }
-            ]
-        }
-    ],
     "UseGMSCoreForBrandingInfo": [
         {
             "platforms": [
@@ -25558,21 +25623,6 @@
             ]
         }
     ],
-    "WebViewSupervisedUserV2": [
-        {
-            "platforms": [
-                "android_webview"
-            ],
-            "experiments": [
-                {
-                    "name": "Enabled",
-                    "enable_features": [
-                        "WebViewSupervisedUserSiteBlock"
-                    ]
-                }
-            ]
-        }
-    ],
     "WebViewSurfaceControl": [
         {
             "platforms": [
@@ -25806,16 +25856,17 @@
             ]
         }
     ],
-    "WinSboxFilterServiceEnvironment": [
+    "WinSboxCsrssLockdown": [
         {
             "platforms": [
                 "windows"
             ],
             "experiments": [
                 {
-                    "name": "Enabled",
+                    "name": "Enabled_with_locale_proxy",
                     "enable_features": [
-                        "WinSboxFilterServiceEnvironment"
+                        "EnableCsrssLockdown",
+                        "WinSboxProxyLocale"
                     ]
                 }
             ]
diff --git a/third_party/angle b/third_party/angle
index d1496a2..59162e2 160000
--- a/third_party/angle
+++ b/third_party/angle
@@ -1 +1 @@
-Subproject commit d1496a22a9fc107e5458565c2c4e6794925b47de
+Subproject commit 59162e2e5451b344d3f0c1045bd99c2c694a610b
diff --git a/third_party/blink/common/features.cc b/third_party/blink/common/features.cc
index 684697a2..af71187 100644
--- a/third_party/blink/common/features.cc
+++ b/third_party/blink/common/features.cc
@@ -821,6 +821,10 @@
              "FencedFramesAutomaticBeaconCredentials",
              base::FEATURE_ENABLED_BY_DEFAULT);
 
+BASE_FEATURE(kFencedFramesCrossOriginAutomaticBeaconData,
+             "FencedFramesCrossOriginAutomaticBeaconData",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+
 // Controls functionality related to network revocation/local unpartitioned
 // data access in fenced frames.
 BASE_FEATURE(kFencedFramesLocalUnpartitionedDataAccess,
diff --git a/third_party/blink/public/common/features.h b/third_party/blink/public/common/features.h
index 7d5238a3..683f405 100644
--- a/third_party/blink/public/common/features.h
+++ b/third_party/blink/public/common/features.h
@@ -461,6 +461,9 @@
     kFencedFramesAutomaticBeaconCredentials);
 
 BLINK_COMMON_EXPORT BASE_DECLARE_FEATURE(
+    kFencedFramesCrossOriginAutomaticBeaconData);
+
+BLINK_COMMON_EXPORT BASE_DECLARE_FEATURE(
     kFencedFramesLocalUnpartitionedDataAccess);
 BLINK_COMMON_EXPORT BASE_DECLARE_FEATURE(kFencedFramesReportEventHeaderChanges);
 BLINK_COMMON_EXPORT BASE_DECLARE_FEATURE(
diff --git a/third_party/blink/public/mojom/frame/user_activation_update_types.mojom b/third_party/blink/public/mojom/frame/user_activation_update_types.mojom
index 5acd6685..2c3b49b8 100644
--- a/third_party/blink/public/mojom/frame/user_activation_update_types.mojom
+++ b/third_party/blink/public/mojom/frame/user_activation_update_types.mojom
@@ -10,7 +10,6 @@
   // Used to give a document sticky and transient user activation as a result of
   // a user gesture.
   kNotifyActivation,
-  kNotifyActivationPendingBrowserVerification,
   // Used to propagate the sticky user activation state during cross-document
   // navigations.
   kNotifyActivationStickyOnly,
diff --git a/third_party/blink/public/mojom/use_counter/metrics/css_property_id.mojom b/third_party/blink/public/mojom/use_counter/metrics/css_property_id.mojom
index 90f3bee..943fad0 100644
--- a/third_party/blink/public/mojom/use_counter/metrics/css_property_id.mojom
+++ b/third_party/blink/public/mojom/use_counter/metrics/css_property_id.mojom
@@ -870,6 +870,7 @@
     kInteractivity = 811,
     kMasonryFill = 812,
     kMasonryDirection = 813,
+    kMasonryFlow = 814,
 
     // 1. Add new features above this line (don't change the assigned numbers of
     //    the existing items).
diff --git a/third_party/blink/public/mojom/use_counter/metrics/webdx_feature.mojom b/third_party/blink/public/mojom/use_counter/metrics/webdx_feature.mojom
index d272ce1..99af8e3 100644
--- a/third_party/blink/public/mojom/use_counter/metrics/webdx_feature.mojom
+++ b/third_party/blink/public/mojom/use_counter/metrics/webdx_feature.mojom
@@ -149,7 +149,7 @@
   kCanvasCreateconicgradient = 91,
   kCanvasReset = 92,
   kCanvasRoundrect = 93,
-  kCanvasTextBaselines = 94,
+  kOBSOLETE_CanvasTextBaselines = 94,
   kColorMix = 95,
   kAriaAttributeReflection = 96,
   kAnchorPositioning = 97,
@@ -170,9 +170,9 @@
   kOverflowShorthand = 112,
   kFieldSizing = 113,
   kDetailsName = 114,
-  kElementCheckVisibility = 115,
+  kOBSOLETE_ElementCheckVisibility = 115,
   kKeyboardMap = 116,
-  kHiddenUntilFoundAttribute = 117,
+  kOBSOLETE_HiddenUntilFoundAttribute = 117,
   kScheduler = 118,
   kKeyboardLock = 119,
   kSearch = 120,
@@ -270,7 +270,7 @@
   kHyphenateLimitChars = 212,
   kQuotes = 213,
   kBaselineSource = 214,
-  kClipPathGeometryBox = 215,
+  kClipPathBoxes = 215,
   kClipPath = 216,
   kActiveViewTransition = 217,
   kBoxDecorationBreak = 218,
@@ -298,8 +298,8 @@
   kPromiseWithresolvers = 240,
   kTransferableArraybuffer = 241,
   kAtomicsWaitAsync = 242,
-  kLocaleInfoObsoletedGetters = 243,
-  kLocaleInfoFunctions = 244,
+  kOBSOLETE_LocaleInfoObsoletedGetters = 243,
+  kIntlLocaleInfo = 244,
   kViewTransitionClass = 245,
   kDRAFT_ReferenceTarget = 246,
   kFedcm = 247,
diff --git a/third_party/blink/renderer/bindings/core/v8/use_counter_callback.cc b/third_party/blink/renderer/bindings/core/v8/use_counter_callback.cc
index bf0e5afb..debf44e 100644
--- a/third_party/blink/renderer/bindings/core/v8/use_counter_callback.cc
+++ b/third_party/blink/renderer/bindings/core/v8/use_counter_callback.cc
@@ -433,7 +433,7 @@
       blink_feature = WebFeature::kLocaleInfoObsoletedGetters;
       break;
     case v8::Isolate::kLocaleInfoFunctions:
-      webdx_feature = WebDXFeature::kLocaleInfoFunctions;
+      webdx_feature = WebDXFeature::kIntlLocaleInfo;
       break;
     case v8::Isolate::kExtendingNonExtensibleWithPrivate:
       blink_feature = WebFeature::kV8ExtendingNonExtensibleWithPrivate;
diff --git a/third_party/blink/renderer/bindings/generated_in_core.gni b/third_party/blink/renderer/bindings/generated_in_core.gni
index a679e4e..753f5dd 100644
--- a/third_party/blink/renderer/bindings/generated_in_core.gni
+++ b/third_party/blink/renderer/bindings/generated_in_core.gni
@@ -1902,6 +1902,8 @@
   "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_union_keyframeeffectoptions_unrestricteddouble.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_union_medialist_string.cc",
   "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_union_medialist_string.h",
+  "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_union_node_string.cc",
+  "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_union_node_string.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_union_node_string_trustedscript.cc",
   "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_union_node_string_trustedscript.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_union_object_objectarray_string.cc",
diff --git a/third_party/blink/renderer/bindings/generated_in_modules.gni b/third_party/blink/renderer/bindings/generated_in_modules.gni
index 0c4712a..a2d2a90a 100644
--- a/third_party/blink/renderer/bindings/generated_in_modules.gni
+++ b/third_party/blink/renderer/bindings/generated_in_modules.gni
@@ -806,52 +806,12 @@
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_arg_min_max_options.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_batch_normalization_options.cc",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_batch_normalization_options.h",
-  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_tensor_descriptor.cc",
-  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_tensor_descriptor.h",
-  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_clamp_options.cc",
-  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_clamp_options.h",
-  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_op_support_limits.cc",
-  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_op_support_limits.h",
-  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_support_limits.cc",
-  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_support_limits.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_batch_normalization_support_limits.cc",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_batch_normalization_support_limits.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_binary_support_limits.cc",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_binary_support_limits.h",
-  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_concat_support_limits.cc",
-  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_concat_support_limits.h",
-  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_conv_2d_support_limits.cc",
-  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_conv_2d_support_limits.h",
-  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_cumulative_sum_support_limits.cc",
-  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_cumulative_sum_support_limits.h",
-  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_gather_support_limits.cc",
-  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_gather_support_limits.h",
-  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_gemm_support_limits.cc",
-  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_gemm_support_limits.h",
-  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_gru_support_limits.cc",
-  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_gru_support_limits.h",
-  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_gru_cell_support_limits.cc",
-  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_gru_cell_support_limits.h",
-  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_logical_not_support_limits.cc",
-  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_logical_not_support_limits.h",
-  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_lstm_support_limits.cc",
-  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_lstm_support_limits.h",
-  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_lstm_cell_support_limits.cc",
-  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_lstm_cell_support_limits.h",
-  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_normalization_support_limits.cc",
-  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_normalization_support_limits.h",
-  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_prelu_support_limits.cc",
-  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_prelu_support_limits.h",
-  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_quantize_dequantize_linear_support_limits.cc",
-  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_quantize_dequantize_linear_support_limits.h",
-  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_scatter_support_limits.cc",
-  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_scatter_support_limits.h",
-  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_single_input_support_limits.cc",
-  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_single_input_support_limits.h",
-  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_split_support_limits.cc",
-  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_split_support_limits.h",
-  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_where_support_limits.cc",
-  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_where_support_limits.h",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_clamp_options.cc",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_clamp_options.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_context_lost_info.cc",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_context_lost_info.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_context_options.cc",
@@ -862,38 +822,70 @@
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_conv_transpose_2d_options.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_cumulative_sum_options.cc",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_cumulative_sum_options.h",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_concat_support_limits.cc",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_concat_support_limits.h",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_conv_2d_support_limits.cc",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_conv_2d_support_limits.h",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_cumulative_sum_support_limits.cc",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_cumulative_sum_support_limits.h",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_data_type_limits.cc",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_data_type_limits.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_elu_options.cc",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_elu_options.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_gather_options.cc",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_gather_options.h",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_gather_support_limits.cc",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_gather_support_limits.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_gemm_options.cc",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_gemm_options.h",
-  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_gru_options.cc",
-  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_gru_options.h",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_gemm_support_limits.cc",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_gemm_support_limits.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_gru_cell_options.cc",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_gru_cell_options.h",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_gru_cell_support_limits.cc",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_gru_cell_support_limits.h",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_gru_support_limits.cc",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_gru_support_limits.h",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_gru_options.cc",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_gru_options.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_hard_sigmoid_options.cc",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_hard_sigmoid_options.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_instance_normalization_options.cc",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_instance_normalization_options.h",
-  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_operator_options.cc",
-  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_operator_options.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_layer_normalization_options.cc",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_layer_normalization_options.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_leaky_relu_options.cc",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_leaky_relu_options.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_linear_options.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_linear_options.cc",
-  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_lstm_options.cc",
-  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_lstm_options.h",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_logical_not_support_limits.cc",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_logical_not_support_limits.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_lstm_cell_options.cc",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_lstm_cell_options.h",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_lstm_cell_support_limits.cc",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_lstm_cell_support_limits.h",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_lstm_options.cc",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_lstm_options.h",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_lstm_support_limits.cc",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_lstm_support_limits.h",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_normalization_support_limits.cc",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_normalization_support_limits.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_operand_descriptor.cc",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_operand_descriptor.h",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_operator_options.cc",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_operator_options.h",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_op_support_limits.cc",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_op_support_limits.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_pad_options.cc",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_pad_options.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_pool_2d_options.cc",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_pool_2d_options.h",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_prelu_support_limits.cc",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_prelu_support_limits.h",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_quantize_dequantize_linear_support_limits.cc",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_quantize_dequantize_linear_support_limits.h",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_rank_range.cc",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_rank_range.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_reduce_options.cc",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_reduce_options.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_resample_2d_options.cc",
@@ -902,14 +894,26 @@
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_reverse_options.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_scatter_options.cc",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_scatter_options.h",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_scatter_support_limits.cc",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_scatter_support_limits.h",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_single_input_support_limits.cc",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_single_input_support_limits.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_slice_options.cc",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_slice_options.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_split_options.cc",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_split_options.h",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_split_support_limits.cc",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_split_support_limits.h",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_tensor_descriptor.cc",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_tensor_descriptor.h",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_tensor_limits.cc",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_tensor_limits.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_transpose_options.cc",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_transpose_options.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_triangular_options.cc",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_triangular_options.h",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_where_support_limits.cc",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_where_support_limits.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_translation_language_options.cc",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_translation_language_options.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_multi_cache_query_options.cc",
diff --git a/third_party/blink/renderer/core/css/css_properties.json5 b/third_party/blink/renderer/core/css/css_properties.json5
index ed2a92a..391a5c3 100644
--- a/third_party/blink/renderer/core/css/css_properties.json5
+++ b/third_party/blink/renderer/core/css/css_properties.json5
@@ -8122,6 +8122,12 @@
       property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
     },
     {
+      name: "masonry-flow",
+      longhands: ["masonry-direction", "masonry-fill"],
+      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
+      runtime_flag: "CSSMasonryLayout",
+    },
+    {
       name: "masonry-track",
       longhands: ["masonry-track-start", "masonry-track-end"],
       property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
diff --git a/third_party/blink/renderer/core/css/css_property_equality.cc b/third_party/blink/renderer/core/css/css_property_equality.cc
index ba4be6b..afaceac 100644
--- a/third_party/blink/renderer/core/css/css_property_equality.cc
+++ b/third_party/blink/renderer/core/css/css_property_equality.cc
@@ -1234,6 +1234,7 @@
     case CSSPropertyID::kMargin:
     case CSSPropertyID::kMarker:
     case CSSPropertyID::kMask:
+    case CSSPropertyID::kMasonryFlow:
     case CSSPropertyID::kMasonryTrack:
     case CSSPropertyID::kOffset:
     case CSSPropertyID::kOutline:
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/shorthands_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/shorthands_custom.cc
index 753710d..26a1844b 100644
--- a/third_party/blink/renderer/core/css/properties/shorthands/shorthands_custom.cc
+++ b/third_party/blink/renderer/core/css/properties/shorthands/shorthands_custom.cc
@@ -2476,6 +2476,55 @@
   return nullptr;
 }
 
+bool MasonryFlow::ParseShorthand(
+    bool important,
+    CSSParserTokenStream& stream,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 64>& properties) const {
+  const StylePropertyShorthand::Properties& longhands =
+      masonryFlowShorthand().properties();
+  DCHECK_EQ(longhands.size(), 2u);
+
+  if (longhands[0]->PropertyID() != CSSPropertyID::kMasonryDirection ||
+      longhands[1]->PropertyID() != CSSPropertyID::kMasonryFill) {
+    return false;
+  }
+
+  const CSSValue* masonry_direction = css_parsing_utils::ParseLonghand(
+      longhands[0]->PropertyID(), masonryFlowShorthand().id(), context, stream);
+
+  if (!masonry_direction) {
+    return false;
+  }
+
+  const CSSValue* masonry_fill = css_parsing_utils::ParseLonghand(
+      longhands[1]->PropertyID(), masonryFlowShorthand().id(), context, stream);
+
+  if (!masonry_fill) {
+    return false;
+  }
+
+  AddProperty(longhands[0]->PropertyID(), masonryFlowShorthand().id(),
+              *masonry_direction, important,
+              css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
+  AddProperty(longhands[1]->PropertyID(), masonryFlowShorthand().id(),
+              *masonry_fill, important,
+              css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
+
+  return true;
+}
+
+const CSSValue* MasonryFlow::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const LayoutObject* layout_object,
+    bool allow_visited_style,
+    CSSValuePhase value_phase) const {
+  return ComputedStyleUtils::ValuesForShorthandProperty(
+      masonryFlowShorthand(), style, layout_object, allow_visited_style,
+      value_phase);
+}
+
 bool MasonryTrack::ParseShorthand(
     bool important,
     CSSParserTokenStream& stream,
diff --git a/third_party/blink/renderer/core/css/style_property_serializer.cc b/third_party/blink/renderer/core/css/style_property_serializer.cc
index 437acf4e..a5655d98 100644
--- a/third_party/blink/renderer/core/css/style_property_serializer.cc
+++ b/third_party/blink/renderer/core/css/style_property_serializer.cc
@@ -625,6 +625,8 @@
       return Get2Values(marginBlockShorthand());
     case CSSPropertyID::kMarginInline:
       return Get2Values(marginInlineShorthand());
+    case CSSPropertyID::kMasonryFlow:
+      return GetShorthandValue(masonryFlowShorthand());
     case CSSPropertyID::kMasonryTrack:
       return GetShorthandValueForMasonryTrack();
     case CSSPropertyID::kOffset:
diff --git a/third_party/blink/renderer/core/dom/child_node_part.cc b/third_party/blink/renderer/core/dom/child_node_part.cc
index ab0f1853..f7a3595 100644
--- a/third_party/blink/renderer/core/dom/child_node_part.cc
+++ b/third_party/blink/renderer/core/dom/child_node_part.cc
@@ -4,6 +4,7 @@
 
 #include "third_party/blink/renderer/core/dom/child_node_part.h"
 
+#include "third_party/blink/renderer/bindings/core/v8/v8_union_node_string.h"
 #include "third_party/blink/renderer/core/dom/container_node.h"
 #include "third_party/blink/renderer/core/dom/document_fragment.h"
 #include "third_party/blink/renderer/core/dom/document_part_root.h"
@@ -158,7 +159,7 @@
 }
 
 void ChildNodePart::replaceChildren(
-    const HeapVector<Member<V8UnionNodeOrStringOrTrustedScript>>& nodes,
+    const HeapVector<Member<V8UnionNodeOrString>>& nodes,
     ExceptionState& exception_state) {
   if (!IsValid()) {
     exception_state.ThrowDOMException(
@@ -179,19 +180,41 @@
       return;
     }
   }
+  // TODO(masonf) This can be removed when/if ParentNode/ChildNode eventually
+  // have TrustedScript removed as well. See
+  // https://groups.google.com/a/chromium.org/g/blink-dev/c/wIADRnljZDA/m/whzEaaAADAAJ.
+  // Before that, if this is a performance concern for the DOM Parts API, we
+  // could as well make Node::ConvertNodeUnionsIntoNodes and friends accept the
+  // union type as a template parameter. Then use std::is_same_v to skip the
+  // trusted type handling if that template parameter is a V8UnionNodeOrString.
+  HeapVector<Member<V8UnionNodeOrStringOrTrustedScript>> nodes_mapped;
+  nodes_mapped.ReserveInitialCapacity(nodes.size());
+  for (auto node_or_string : nodes) {
+    if (node_or_string->IsNode()) {
+      nodes_mapped.push_back(
+          MakeGarbageCollected<V8UnionNodeOrStringOrTrustedScript>(
+              node_or_string->GetAsNode()));
+    } else {
+      CHECK(node_or_string->IsString());
+      nodes_mapped.push_back(
+          MakeGarbageCollected<V8UnionNodeOrStringOrTrustedScript>(
+              node_or_string->GetAsString()));
+    }
+  }
+
   if (RuntimeEnabledFeatures::SkipTemporaryDocumentFragmentEnabled()) {
     // Insert new contents.
-    VectorOf<Node> node_vector =
-        Node::ConvertNodeUnionsIntoNodes(parent, nodes, parent->GetDocument(),
-                                         "replaceChildren", exception_state);
+    VectorOf<Node> node_vector = Node::ConvertNodeUnionsIntoNodes(
+        parent, nodes_mapped, parent->GetDocument(), "replaceChildren",
+        exception_state);
     if (exception_state.HadException()) {
       return;
     }
     parent->InsertBefore(node_vector, next_sibling_, exception_state);
   } else {
-    Node* nodes_as_node =
-        Node::ConvertNodeUnionsIntoNode(parent, nodes, parent->GetDocument(),
-                                        "replaceChildren", exception_state);
+    Node* nodes_as_node = Node::ConvertNodeUnionsIntoNode(
+        parent, nodes_mapped, parent->GetDocument(), "replaceChildren",
+        exception_state);
     if (exception_state.HadException()) {
       return;
     }
diff --git a/third_party/blink/renderer/core/dom/child_node_part.h b/third_party/blink/renderer/core/dom/child_node_part.h
index ec08a1e..758356e 100644
--- a/third_party/blink/renderer/core/dom/child_node_part.h
+++ b/third_party/blink/renderer/core/dom/child_node_part.h
@@ -74,9 +74,8 @@
   Node* nextSibling() const { return next_sibling_.Get(); }
   void setNextSibling(Node& next_sibling);
   HeapVector<Member<Node>> children() const;
-  void replaceChildren(
-      const HeapVector<Member<V8UnionNodeOrStringOrTrustedScript>>& nodes,
-      ExceptionState& exception_state);
+  void replaceChildren(const HeapVector<Member<V8UnionNodeOrString>>& nodes,
+                       ExceptionState& exception_state);
 
  protected:
   const PartRoot* GetParentPartRoot() const override { return root(); }
diff --git a/third_party/blink/renderer/core/dom/child_node_part.idl b/third_party/blink/renderer/core/dom/child_node_part.idl
index 8a9a29bd..22d3652 100644
--- a/third_party/blink/renderer/core/dom/child_node_part.idl
+++ b/third_party/blink/renderer/core/dom/child_node_part.idl
@@ -11,5 +11,5 @@
   readonly attribute Node previousSibling;
   readonly attribute Node nextSibling;
   readonly attribute FrozenArray<Node> children;
-  [RaisesException] void replaceChildren((Node or DOMString or TrustedScript)... nodes);
+  [RaisesException] void replaceChildren((Node or DOMString)... nodes);
 };
diff --git a/third_party/blink/renderer/core/frame/local_frame.cc b/third_party/blink/renderer/core/frame/local_frame.cc
index 9dbccdb..b959725 100644
--- a/third_party/blink/renderer/core/frame/local_frame.cc
+++ b/third_party/blink/renderer/core/frame/local_frame.cc
@@ -2804,10 +2804,9 @@
 // static
 void LocalFrame::NotifyUserActivation(
     LocalFrame* frame,
-    mojom::blink::UserActivationNotificationType notification_type,
-    bool need_browser_verification) {
+    mojom::blink::UserActivationNotificationType notification_type) {
   if (frame) {
-    frame->NotifyUserActivation(notification_type, need_browser_verification);
+    frame->NotifyUserActivation(notification_type);
   }
 }
 
@@ -2824,16 +2823,10 @@
 }
 
 void LocalFrame::NotifyUserActivation(
-    mojom::blink::UserActivationNotificationType notification_type,
-    bool need_browser_verification) {
-  mojom::blink::UserActivationUpdateType update_type =
-      need_browser_verification
-          ? mojom::blink::UserActivationUpdateType::
-                kNotifyActivationPendingBrowserVerification
-          : mojom::blink::UserActivationUpdateType::kNotifyActivation;
-
-  GetLocalFrameHostRemote().UpdateUserActivationState(update_type,
-                                                      notification_type);
+    mojom::blink::UserActivationNotificationType notification_type) {
+  GetLocalFrameHostRemote().UpdateUserActivationState(
+      mojom::blink::UserActivationUpdateType::kNotifyActivation,
+      notification_type);
   Client()->NotifyUserActivation();
   NotifyUserActivationInFrameTree(notification_type);
 }
@@ -3123,7 +3116,7 @@
   // TODO(mustaq): This is called only through the user typing a javascript URL
   // into the omnibox.  See https://crbug.com/1082900
   NotifyUserActivation(
-      mojom::blink::UserActivationNotificationType::kInteraction, false);
+      mojom::blink::UserActivationNotificationType::kInteraction);
   auto* window = DomWindow();
   window->GetScriptController().ExecuteJavaScriptURL(
       url, network::mojom::CSPDisposition::DO_NOT_CHECK,
@@ -3504,11 +3497,6 @@
   return mojo_handler_->BackForwardCacheControllerHostRemote();
 }
 
-void LocalFrame::NotifyUserActivation(
-    mojom::blink::UserActivationNotificationType notification_type) {
-  NotifyUserActivation(notification_type, false);
-}
-
 void LocalFrame::RegisterVirtualKeyboardOverlayChangedObserver(
     VirtualKeyboardOverlayChangedObserver* observer) {
   virtual_keyboard_overlay_changed_observers_.insert(observer);
diff --git a/third_party/blink/renderer/core/frame/local_frame.h b/third_party/blink/renderer/core/frame/local_frame.h
index af3627c..d98eeeb 100644
--- a/third_party/blink/renderer/core/frame/local_frame.h
+++ b/third_party/blink/renderer/core/frame/local_frame.h
@@ -345,8 +345,7 @@
   // The |notification_type| parameter is used for histograms only.
   static void NotifyUserActivation(
       LocalFrame*,
-      mojom::blink::UserActivationNotificationType notification_type,
-      bool need_browser_verification = false);
+      mojom::blink::UserActivationNotificationType notification_type);
 
   // Returns the transient user activation state of the |LocalFrame|, provided
   // it is non-null.  Otherwise returns |false|.
@@ -1013,13 +1012,6 @@
   void MainFrameFirstMeaningfulPaint() override;
   DocumentResourceCoordinator* GetDocumentResourceCoordinator() override;
 
-  // Activates the user activation states of this frame and all its ancestors.
-  //
-  // The |notification_type| parameter is used for histograms only.
-  void NotifyUserActivation(
-      mojom::blink::UserActivationNotificationType notification_type,
-      bool need_browser_verification);
-
   // Consumes and returns the transient user activation state this frame, after
   // updating all other frames in the frame tree.
   bool ConsumeTransientUserActivation(UserActivationUpdateSource update_source);
diff --git a/third_party/blink/renderer/core/frame/remote_frame.cc b/third_party/blink/renderer/core/frame/remote_frame.cc
index 3045bee..5e399735 100644
--- a/third_party/blink/renderer/core/frame/remote_frame.cc
+++ b/third_party/blink/renderer/core/frame/remote_frame.cc
@@ -687,8 +687,7 @@
     case mojom::blink::UserActivationUpdateType::kClearActivation:
       ClearUserActivationInFrameTree();
       break;
-    case mojom::blink::UserActivationUpdateType::
-        kNotifyActivationPendingBrowserVerification:
+    default:
       NOTREACHED() << "Unexpected UserActivationUpdateType from browser";
   }
 }
diff --git a/third_party/blink/renderer/core/html/canvas/text_metrics.idl b/third_party/blink/renderer/core/html/canvas/text_metrics.idl
index f8cc9a5d..8ae1c054 100644
--- a/third_party/blink/renderer/core/html/canvas/text_metrics.idl
+++ b/third_party/blink/renderer/core/html/canvas/text_metrics.idl
@@ -44,9 +44,9 @@
     readonly attribute double fontBoundingBoxDescent;
     readonly attribute double actualBoundingBoxAscent;
     readonly attribute double actualBoundingBoxDescent;
-  [RuntimeEnabled=TextMetricsBaselines, MeasureAs="WebDXFeature::kCanvasTextBaselines"] readonly attribute double hangingBaseline;
-    [RuntimeEnabled=TextMetricsBaselines, MeasureAs="WebDXFeature::kCanvasTextBaselines"] readonly attribute double alphabeticBaseline;
-    [RuntimeEnabled=TextMetricsBaselines, MeasureAs="WebDXFeature::kCanvasTextBaselines"] readonly attribute double ideographicBaseline;
+    [RuntimeEnabled=TextMetricsBaselines] readonly attribute double hangingBaseline;
+    [RuntimeEnabled=TextMetricsBaselines] readonly attribute double alphabeticBaseline;
+    [RuntimeEnabled=TextMetricsBaselines] readonly attribute double ideographicBaseline;
     [RuntimeEnabled=ExtendedTextMetrics] readonly attribute double emHeightAscent;
     [RuntimeEnabled=ExtendedTextMetrics] readonly attribute double emHeightDescent;
 
diff --git a/third_party/blink/renderer/core/html/fenced_frame/fence.cc b/third_party/blink/renderer/core/html/fenced_frame/fence.cc
index a9b59b1..e9be7c5 100644
--- a/third_party/blink/renderer/core/html/fenced_frame/fence.cc
+++ b/third_party/blink/renderer/core/html/fenced_frame/fence.cc
@@ -295,10 +295,20 @@
   }
 
   if (properties->is_cross_origin_content()) {
-    AddConsoleMessage(
-        "Automatic beacon data can only be set from documents that registered "
-        "reporting metadata.");
-    return;
+    if (!base::FeatureList::IsEnabled(
+            blink::features::kFencedFramesCrossOriginAutomaticBeaconData)) {
+      exception_state.ThrowSecurityError(
+          "Automatic beacon data can only be set from documents that "
+          "registered reporting metadata.");
+      return;
+    }
+    if (!event->crossOriginExposed()) {
+      AddConsoleMessage(
+          "This document is cross-origin to the document that contains "
+          "reporting metadata, but setReportEventDataForAutomaticBeacons() was "
+          "not called with crossOriginExposed=true.");
+      return;
+    }
   }
 
   WTF::Vector<blink::FencedFrame::ReportingDestination> destinations;
diff --git a/third_party/blink/renderer/core/html/forms/html_option_element.cc b/third_party/blink/renderer/core/html/forms/html_option_element.cc
index a79417b..c06b415 100644
--- a/third_party/blink/renderer/core/html/forms/html_option_element.cc
+++ b/third_party/blink/renderer/core/html/forms/html_option_element.cc
@@ -680,7 +680,7 @@
       mouse_event->button() ==
           static_cast<int16_t>(WebPointerProperties::Button::kLeft)) {
     select->SelectOptionByPopup(this);
-    select->HidePopup();
+    select->HidePopup(SelectPopupHideBehavior::kNormal);
     event.SetDefaultHandled();
     return;
   }
@@ -696,7 +696,7 @@
     if (!(keyboard_event->GetModifiers() & ignore_modifiers)) {
       if ((key == " " || key == keywords::kCapitalEnter)) {
         select->SelectOptionByPopup(this);
-        select->HidePopup();
+        select->HidePopup(SelectPopupHideBehavior::kNormal);
         event.SetDefaultHandled();
         return;
       }
@@ -783,7 +783,7 @@
         !select->IsInDialogMode()) {
       // TODO(http://crbug.com/1511354): Consider focusing something in this
       // case. https://github.com/openui/open-ui/issues/1016
-      select->HidePopup();
+      select->HidePopup(SelectPopupHideBehavior::kNormal);
       event.SetDefaultHandled();
       return;
     }
diff --git a/third_party/blink/renderer/core/html/forms/html_select_element.cc b/third_party/blink/renderer/core/html/forms/html_select_element.cc
index aa721745..ccb29e1 100644
--- a/third_party/blink/renderer/core/html/forms/html_select_element.cc
+++ b/third_party/blink/renderer/core/html/forms/html_select_element.cc
@@ -1886,8 +1886,8 @@
   select_type_->ShowPopup(PopupMenu::kOther);
 }
 
-void HTMLSelectElement::HidePopup() {
-  select_type_->HidePopup();
+void HTMLSelectElement::HidePopup(SelectPopupHideBehavior behavior) {
+  select_type_->HidePopup(behavior);
 }
 
 PopupMenu* HTMLSelectElement::PopupForTesting() const {
diff --git a/third_party/blink/renderer/core/html/forms/html_select_element.h b/third_party/blink/renderer/core/html/forms/html_select_element.h
index 15552e7..dc4c037 100644
--- a/third_party/blink/renderer/core/html/forms/html_select_element.h
+++ b/third_party/blink/renderer/core/html/forms/html_select_element.h
@@ -55,6 +55,11 @@
 class HTMLSelectedContentElement;
 class SelectDescendantsObserver;
 
+enum class SelectPopupHideBehavior {
+  kNormal,
+  kNoEventsOrFocusing,
+};
+
 class CORE_EXPORT HTMLSelectElement final
     : public HTMLFormControlElementWithState,
       private TypeAheadDataSource {
@@ -212,7 +217,7 @@
   // the menulist mode.
   const ComputedStyle* OptionStyle() const;
   void ShowPopup();
-  void HidePopup();
+  void HidePopup(SelectPopupHideBehavior);
   PopupMenu* PopupForTesting() const;
 
   void ResetTypeAheadSessionForTesting();
diff --git a/third_party/blink/renderer/core/html/forms/select_type.cc b/third_party/blink/renderer/core/html/forms/select_type.cc
index 1f12278..9ab7851 100644
--- a/third_party/blink/renderer/core/html/forms/select_type.cc
+++ b/third_party/blink/renderer/core/html/forms/select_type.cc
@@ -58,6 +58,7 @@
 #include "third_party/blink/renderer/core/html/shadow/shadow_element_names.h"
 #include "third_party/blink/renderer/core/input/event_handler.h"
 #include "third_party/blink/renderer/core/input/input_device_capabilities.h"
+#include "third_party/blink/renderer/core/inspector/console_message.h"
 #include "third_party/blink/renderer/core/keywords.h"
 #include "third_party/blink/renderer/core/layout/layout_box.h"
 #include "third_party/blink/renderer/core/page/autoscroll_controller.h"
@@ -103,6 +104,14 @@
          IsA<HTMLDivElement>(node);
 }
 
+void PostChangingAppearanceConsoleWarning(HTMLSelectElement& select) {
+  select.AddConsoleMessage(
+      mojom::blink::ConsoleMessageSource::kJavaScript,
+      mojom::blink::ConsoleMessageLevel::kWarning,
+      "A customizable-<select> changed its `appearance` property while open. "
+      "As a result, it was closed to avoid circularity problems.");
+}
+
 class PopoverElementForAppearanceBase : public HTMLDivElement {
  public:
   explicit PopoverElementForAppearanceBase(Document& document)
@@ -197,10 +206,36 @@
   void DidRecalcStyle(const StyleRecalcChange change) override {
     HTMLDivElement::DidRecalcStyle(change);
     if (auto* style = GetComputedStyle()) {
-      if (style->EffectiveAppearance() == AppearanceValue::kBaseSelect) {
+      AppearanceState new_appearance_state =
+          style->EffectiveAppearance() == AppearanceValue::kBaseSelect
+              ? AppearanceState::kAppearanceBase
+              : AppearanceState::kAppearanceNotBase;
+      auto* select = ParentSelect();
+      if (appearance_state_ != AppearanceState::kNoStyle &&
+          appearance_state_ != new_appearance_state && select &&
+          select->PopupIsVisible()) {
+        // The picker, as the result of CSS, changed `appearance` values upon
+        // opening. Per spec, we close it in that case, to avoid circularity.
+        PostChangingAppearanceConsoleWarning(*select);
+        // Post a task to close the popup, so we don't change style in the
+        // middle of style recalc.
+        GetDocument()
+            .GetTaskRunner(TaskType::kUserInteraction)
+            ->PostTask(FROM_HERE,
+                       WTF::BindOnce(
+                           [](HTMLSelectElement* select) {
+                             select->HidePopup(
+                                 SelectPopupHideBehavior::kNoEventsOrFocusing);
+                           },
+                           WrapPersistent(select)));
+      }
+      if (new_appearance_state == AppearanceState::kAppearanceBase) {
         UseCounter::Count(GetDocument(),
                           WebFeature::kSelectElementPickerAppearanceBaseSelect);
       }
+      appearance_state_ = new_appearance_state;
+    } else {
+      appearance_state_ = AppearanceState::kNoStyle;
     }
   }
 
@@ -214,6 +249,12 @@
     }
     return nullptr;
   }
+  enum AppearanceState {
+    kNoStyle = 0,
+    kAppearanceBase = 1,
+    kAppearanceNotBase = 2,
+  };
+  AppearanceState appearance_state_{AppearanceState::kNoStyle};
 };
 
 }  // anonymous namespace
@@ -253,7 +294,7 @@
       const override;
   Element& InnerElement() const override;
   void ShowPopup(PopupMenu::ShowEventType type) override;
-  void HidePopup() override;
+  void HidePopup(SelectPopupHideBehavior) override;
   void PopupDidHide() override;
   bool PopupIsVisible() const override;
   PopupMenu* PopupForTesting() const override;
@@ -463,7 +504,7 @@
         !select_->IsDisabledFormControl()) {
       if (PopupIsVisible()) {
         if (!IsAppearanceBasePicker()) {
-          HidePopup();
+          HidePopup(SelectPopupHideBehavior::kNormal);
         }
       } else {
         // Save the selection so it can be compared to the new selection
@@ -720,6 +761,15 @@
 
   if (IsAppearanceBasePicker()) {
     popover_->ShowPopoverInternal(select_, /*exception_state=*/nullptr);
+    if (!IsAppearanceBasePicker()) {
+      // The picker, as the result of CSS, changed `appearance` values upon
+      // opening. Per spec, we close it in that case, to avoid circularity.
+      PostChangingAppearanceConsoleWarning(*select_);
+      popover_->HidePopoverInternal(
+          HidePopoverFocusBehavior::kNone,
+          HidePopoverTransitionBehavior::kNoEventsNoWaiting,
+          /*exception_state=*/nullptr);
+    }
     return;
   }
 
@@ -776,11 +826,15 @@
     cache->DidShowMenuListPopup(select_);
 }
 
-void MenuListSelectType::HidePopup() {
+void MenuListSelectType::HidePopup(SelectPopupHideBehavior behavior) {
   if (IsAppearanceBasePicker()) {
+    bool normal_behavior = behavior == SelectPopupHideBehavior::kNormal;
     popover_->HidePopoverInternal(
-        HidePopoverFocusBehavior::kFocusPreviousElement,
-        HidePopoverTransitionBehavior::kFireEventsAndWaitForTransitions,
+        normal_behavior ? HidePopoverFocusBehavior::kFocusPreviousElement
+                        : HidePopoverFocusBehavior::kNone,
+        normal_behavior
+            ? HidePopoverTransitionBehavior::kFireEventsAndWaitForTransitions
+            : HidePopoverTransitionBehavior::kNoEventsNoWaiting,
         /*exception_state=*/nullptr);
     return;
   }
@@ -891,7 +945,7 @@
   // want to hide the popover in the case that the user just opened it and we
   // focused the first option in it.
   if (native_popup_is_visible_) {
-    HidePopup();
+    HidePopup(SelectPopupHideBehavior::kNormal);
   }
 }
 
@@ -932,6 +986,13 @@
     bool is_appearance_base_select =
         style->EffectiveAppearance() == AppearanceValue::kBaseSelect;
     if (is_appearance_base_select_ != is_appearance_base_select) {
+      if (PopupIsVisible()) {
+        // The picker, as the result of CSS, changed `appearance` values upon
+        // opening. Per spec, we close it in that case, to avoid circularity.
+        PostChangingAppearanceConsoleWarning(*select_);
+        HidePopup(SelectPopupHideBehavior::kNoEventsOrFocusing);
+      }
+
       is_appearance_base_select_ = is_appearance_base_select;
       // Switching appearance needs layout to be rebuilt because of special
       // logic in LayoutFlexibleBox::IsChildAllowed which ignores children in
@@ -1953,7 +2014,7 @@
   NOTREACHED();
 }
 
-void SelectType::HidePopup() {
+void SelectType::HidePopup(SelectPopupHideBehavior) {
   NOTREACHED();
 }
 
diff --git a/third_party/blink/renderer/core/html/forms/select_type.h b/third_party/blink/renderer/core/html/forms/select_type.h
index 810e2b1..5737393 100644
--- a/third_party/blink/renderer/core/html/forms/select_type.h
+++ b/third_party/blink/renderer/core/html/forms/select_type.h
@@ -72,7 +72,7 @@
   GetAutofillPreviewElement() const = 0;
   virtual Element& InnerElement() const;
   virtual void ShowPopup(PopupMenu::ShowEventType type);
-  virtual void HidePopup();
+  virtual void HidePopup(SelectPopupHideBehavior);
   virtual void PopupDidHide();
   virtual bool PopupIsVisible() const;
   virtual PopupMenu* PopupForTesting() const;
diff --git a/third_party/blink/renderer/core/input/event_handler.cc b/third_party/blink/renderer/core/input/event_handler.cc
index 6e66b5ad..b65e308 100644
--- a/third_party/blink/renderer/core/input/event_handler.cc
+++ b/third_party/blink/renderer/core/input/event_handler.cc
@@ -903,8 +903,7 @@
   }
 
   LocalFrame::NotifyUserActivation(
-      frame_, mojom::blink::UserActivationNotificationType::kInteraction,
-      RuntimeEnabledFeatures::BrowserVerifiedUserActivationMouseEnabled());
+      frame_, mojom::blink::UserActivationNotificationType::kInteraction);
 
   if (RuntimeEnabledFeatures::MiddleClickAutoscrollEnabled()) {
     // We store whether middle click autoscroll is in progress before calling
diff --git a/third_party/blink/renderer/core/input/keyboard_event_manager.cc b/third_party/blink/renderer/core/input/keyboard_event_manager.cc
index 4007da0..c54bc2f 100644
--- a/third_party/blink/renderer/core/input/keyboard_event_manager.cc
+++ b/third_party/blink/renderer/core/input/keyboard_event_manager.cc
@@ -229,8 +229,7 @@
       (initial_key_event.GetType() == WebInputEvent::Type::kKeyDown ||
        initial_key_event.GetType() == WebInputEvent::Type::kRawKeyDown)) {
     LocalFrame::NotifyUserActivation(
-        frame_, mojom::blink::UserActivationNotificationType::kInteraction,
-        RuntimeEnabledFeatures::BrowserVerifiedUserActivationKeyboardEnabled());
+        frame_, mojom::blink::UserActivationNotificationType::kInteraction);
   }
 
   // Don't expose key events to pages while browsing on the drive-by web. This
diff --git a/third_party/blink/renderer/modules/ml/ml_context.cc b/third_party/blink/renderer/modules/ml/ml_context.cc
index ad40a5f..9781833 100644
--- a/third_party/blink/renderer/modules/ml/ml_context.cc
+++ b/third_party/blink/renderer/modules/ml/ml_context.cc
@@ -27,6 +27,7 @@
 #include "third_party/blink/renderer/bindings/modules/v8/v8_ml_context_lost_info.h"
 #include "third_party/blink/renderer/bindings/modules/v8/v8_ml_context_options.h"
 #include "third_party/blink/renderer/bindings/modules/v8/v8_ml_conv_2d_support_limits.h"
+#include "third_party/blink/renderer/bindings/modules/v8/v8_ml_data_type_limits.h"
 #include "third_party/blink/renderer/bindings/modules/v8/v8_ml_device_type.h"
 #include "third_party/blink/renderer/bindings/modules/v8/v8_ml_gather_support_limits.h"
 #include "third_party/blink/renderer/bindings/modules/v8/v8_ml_gemm_support_limits.h"
@@ -41,11 +42,12 @@
 #include "third_party/blink/renderer/bindings/modules/v8/v8_ml_power_preference.h"
 #include "third_party/blink/renderer/bindings/modules/v8/v8_ml_prelu_support_limits.h"
 #include "third_party/blink/renderer/bindings/modules/v8/v8_ml_quantize_dequantize_linear_support_limits.h"
+#include "third_party/blink/renderer/bindings/modules/v8/v8_ml_rank_range.h"
 #include "third_party/blink/renderer/bindings/modules/v8/v8_ml_scatter_support_limits.h"
 #include "third_party/blink/renderer/bindings/modules/v8/v8_ml_single_input_support_limits.h"
 #include "third_party/blink/renderer/bindings/modules/v8/v8_ml_split_support_limits.h"
-#include "third_party/blink/renderer/bindings/modules/v8/v8_ml_support_limits.h"
 #include "third_party/blink/renderer/bindings/modules/v8/v8_ml_tensor_descriptor.h"
+#include "third_party/blink/renderer/bindings/modules/v8/v8_ml_tensor_limits.h"
 #include "third_party/blink/renderer/bindings/modules/v8/v8_ml_where_support_limits.h"
 #include "third_party/blink/renderer/core/execution_context/execution_context.h"
 #include "third_party/blink/renderer/core/typed_arrays/array_buffer_view_helpers.h"
@@ -61,16 +63,34 @@
 
 namespace {
 
-MLSupportLimits* SupportedDataTypesToSupportLimits(
+MLDataTypeLimits* SupportedDataTypesToDataTypeLimits(
     const webnn::SupportedDataTypes& supported_data_types) {
-  MLSupportLimits* support_limits = MLSupportLimits::Create();
+  MLDataTypeLimits* data_type_limits = MLDataTypeLimits::Create();
   Vector<String> data_types;
   for (auto data_type : supported_data_types) {
     data_types.push_back(webnn::DataTypeToString(data_type));
   }
 
-  support_limits->setDataTypes(data_types);
-  return support_limits;
+  data_type_limits->setDataTypes(data_types);
+  return data_type_limits;
+}
+
+MLTensorLimits* SupportedTensorLimitsToTensorLimits(
+    const webnn::SupportedTensors& supported_tensors) {
+  MLTensorLimits* tensor_limits = MLTensorLimits::Create();
+
+  MLRankRange* rank_range = MLRankRange::Create();
+  rank_range->setMin(supported_tensors.ranks.min);
+  rank_range->setMax(supported_tensors.ranks.max);
+  tensor_limits->setRankRange(rank_range);
+
+  Vector<String> data_types;
+  for (auto data_type : supported_tensors.data_types) {
+    data_types.push_back(webnn::DataTypeToString(data_type));
+  }
+  tensor_limits->setDataTypes(data_types);
+
+  return tensor_limits;
 }
 
 blink::V8MLInputOperandLayout::Enum InputOperandLayoutToBlink(
@@ -202,718 +222,737 @@
   op_support_limits->setPreferredInputLayout(
       InputOperandLayoutToBlink(properties_.input_operand_layout));
   op_support_limits->setInput(
-      SupportedDataTypesToSupportLimits(data_type_limits.input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.input));
   op_support_limits->setConstant(
-      SupportedDataTypesToSupportLimits(data_type_limits.constant));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.constant));
   op_support_limits->setOutput(
-      SupportedDataTypesToSupportLimits(data_type_limits.output()));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.output()));
 
   MLSingleInputSupportLimits* argmin = MLSingleInputSupportLimits::Create();
   argmin->setInput(
-      SupportedDataTypesToSupportLimits(data_type_limits.arg_min_max_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.arg_min_max_input));
   argmin->setOutput(
-      SupportedDataTypesToSupportLimits(data_type_limits.arg_min_max_output));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.arg_min_max_output));
   op_support_limits->setArgMin(argmin);
   MLSingleInputSupportLimits* argmax = MLSingleInputSupportLimits::Create();
   argmax->setInput(
-      SupportedDataTypesToSupportLimits(data_type_limits.arg_min_max_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.arg_min_max_input));
   argmax->setOutput(
-      SupportedDataTypesToSupportLimits(data_type_limits.arg_min_max_output));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.arg_min_max_output));
   op_support_limits->setArgMax(argmax);
 
   MLBatchNormalizationSupportLimits* batch_normalization =
       MLBatchNormalizationSupportLimits::Create();
-  batch_normalization->setInput(SupportedDataTypesToSupportLimits(
+  batch_normalization->setInput(SupportedDataTypesToDataTypeLimits(
       data_type_limits.batch_normalization_input));
-  batch_normalization->setMean(SupportedDataTypesToSupportLimits(
+  batch_normalization->setMean(SupportedDataTypesToDataTypeLimits(
       data_type_limits.batch_normalization_input));
-  batch_normalization->setVariance(SupportedDataTypesToSupportLimits(
+  batch_normalization->setVariance(SupportedDataTypesToDataTypeLimits(
       data_type_limits.batch_normalization_input));
-  batch_normalization->setScale(SupportedDataTypesToSupportLimits(
+  batch_normalization->setScale(SupportedDataTypesToDataTypeLimits(
       data_type_limits.batch_normalization_input));
-  batch_normalization->setBias(SupportedDataTypesToSupportLimits(
+  batch_normalization->setBias(SupportedDataTypesToDataTypeLimits(
       data_type_limits.batch_normalization_input));
-  batch_normalization->setOutput(SupportedDataTypesToSupportLimits(
+  batch_normalization->setOutput(SupportedDataTypesToDataTypeLimits(
       data_type_limits.batch_normalization_input));
   op_support_limits->setBatchNormalization(batch_normalization);
 
   MLSingleInputSupportLimits* cast = MLSingleInputSupportLimits::Create();
   cast->setInput(
-      SupportedDataTypesToSupportLimits(data_type_limits.cast_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.cast_input));
   cast->setOutput(
-      SupportedDataTypesToSupportLimits(data_type_limits.cast_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.cast_input));
   op_support_limits->setCast(cast);
 
   MLSingleInputSupportLimits* clamp = MLSingleInputSupportLimits::Create();
   clamp->setInput(
-      SupportedDataTypesToSupportLimits(data_type_limits.clamp_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.clamp_input));
   clamp->setOutput(
-      SupportedDataTypesToSupportLimits(data_type_limits.clamp_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.clamp_input));
   op_support_limits->setClamp(clamp);
 
   MLConcatSupportLimits* concat = MLConcatSupportLimits::Create();
   concat->setInputs(
-      SupportedDataTypesToSupportLimits(data_type_limits.concat_inputs));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.concat_inputs));
   concat->setOutput(
-      SupportedDataTypesToSupportLimits(data_type_limits.concat_inputs));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.concat_inputs));
   op_support_limits->setConcat(concat);
 
   MLConv2dSupportLimits* conv2d = MLConv2dSupportLimits::Create();
   conv2d->setInput(
-      SupportedDataTypesToSupportLimits(data_type_limits.conv2d_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.conv2d_input));
   conv2d->setFilter(
-      SupportedDataTypesToSupportLimits(data_type_limits.conv2d_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.conv2d_input));
   conv2d->setBias(
-      SupportedDataTypesToSupportLimits(data_type_limits.conv2d_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.conv2d_input));
   conv2d->setOutput(
-      SupportedDataTypesToSupportLimits(data_type_limits.conv2d_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.conv2d_input));
   op_support_limits->setConv2d(conv2d);
 
   MLConv2dSupportLimits* conv_transpose2d = MLConv2dSupportLimits::Create();
-  conv_transpose2d->setInput(SupportedDataTypesToSupportLimits(
+  conv_transpose2d->setInput(SupportedDataTypesToDataTypeLimits(
       data_type_limits.conv_transpose2d_input));
-  conv_transpose2d->setFilter(SupportedDataTypesToSupportLimits(
+  conv_transpose2d->setFilter(SupportedDataTypesToDataTypeLimits(
       data_type_limits.conv_transpose2d_input));
-  conv_transpose2d->setBias(SupportedDataTypesToSupportLimits(
+  conv_transpose2d->setBias(SupportedDataTypesToDataTypeLimits(
       data_type_limits.conv_transpose2d_input));
-  conv_transpose2d->setOutput(SupportedDataTypesToSupportLimits(
+  conv_transpose2d->setOutput(SupportedDataTypesToDataTypeLimits(
       data_type_limits.conv_transpose2d_input));
   op_support_limits->setConvTranspose2d(conv_transpose2d);
 
   MLSingleInputSupportLimits* cumulative_sum =
       MLSingleInputSupportLimits::Create();
-  cumulative_sum->setInput(
-      SupportedDataTypesToSupportLimits(data_type_limits.cumulative_sum_input));
-  cumulative_sum->setOutput(
-      SupportedDataTypesToSupportLimits(data_type_limits.cumulative_sum_input));
+  cumulative_sum->setInput(SupportedDataTypesToDataTypeLimits(
+      data_type_limits.cumulative_sum_input));
+  cumulative_sum->setOutput(SupportedDataTypesToDataTypeLimits(
+      data_type_limits.cumulative_sum_input));
   op_support_limits->setCumulativeSum(cumulative_sum);
 
   MLQuantizeDequantizeLinearSupportLimits* dequantize_linear =
       MLQuantizeDequantizeLinearSupportLimits::Create();
-  dequantize_linear->setInput(SupportedDataTypesToSupportLimits(
+  dequantize_linear->setInput(SupportedDataTypesToDataTypeLimits(
       data_type_limits.dequantize_linear_input));
-  dequantize_linear->setScale(SupportedDataTypesToSupportLimits(
+  dequantize_linear->setScale(SupportedDataTypesToDataTypeLimits(
       data_type_limits.dequantize_linear_scale));
-  dequantize_linear->setZeroPoint(SupportedDataTypesToSupportLimits(
+  dequantize_linear->setZeroPoint(SupportedDataTypesToDataTypeLimits(
       data_type_limits.dequantize_linear_input));
-  dequantize_linear->setOutput(SupportedDataTypesToSupportLimits(
+  dequantize_linear->setOutput(SupportedDataTypesToDataTypeLimits(
       data_type_limits.dequantize_linear_scale));
   op_support_limits->setDequantizeLinear(dequantize_linear);
 
   // Element-wise binary ops.
   MLBinarySupportLimits* add = MLBinarySupportLimits::Create();
-  add->setA(SupportedDataTypesToSupportLimits(data_type_limits.add_input));
-  add->setB(SupportedDataTypesToSupportLimits(data_type_limits.add_input));
-  add->setOutput(SupportedDataTypesToSupportLimits(data_type_limits.add_input));
+  add->setA(SupportedTensorLimitsToTensorLimits(data_type_limits.add_input));
+  add->setB(SupportedTensorLimitsToTensorLimits(data_type_limits.add_input));
+  add->setOutput(SupportedDataTypesToDataTypeLimits(
+      data_type_limits.add_input.data_types));
   op_support_limits->setAdd(add);
   MLBinarySupportLimits* sub = MLBinarySupportLimits::Create();
-  sub->setA(SupportedDataTypesToSupportLimits(data_type_limits.sub_input));
-  sub->setB(SupportedDataTypesToSupportLimits(data_type_limits.sub_input));
-  sub->setOutput(SupportedDataTypesToSupportLimits(data_type_limits.sub_input));
+  sub->setA(SupportedTensorLimitsToTensorLimits(data_type_limits.sub_input));
+  sub->setB(SupportedTensorLimitsToTensorLimits(data_type_limits.sub_input));
+  sub->setOutput(SupportedDataTypesToDataTypeLimits(
+      data_type_limits.sub_input.data_types));
   op_support_limits->setSub(sub);
   MLBinarySupportLimits* mul = MLBinarySupportLimits::Create();
-  mul->setA(SupportedDataTypesToSupportLimits(data_type_limits.mul_input));
-  mul->setB(SupportedDataTypesToSupportLimits(data_type_limits.mul_input));
-  mul->setOutput(SupportedDataTypesToSupportLimits(data_type_limits.mul_input));
+  mul->setA(SupportedTensorLimitsToTensorLimits(data_type_limits.mul_input));
+  mul->setB(SupportedTensorLimitsToTensorLimits(data_type_limits.mul_input));
+  mul->setOutput(SupportedDataTypesToDataTypeLimits(
+      data_type_limits.mul_input.data_types));
   op_support_limits->setMul(mul);
   MLBinarySupportLimits* div = MLBinarySupportLimits::Create();
-  div->setA(SupportedDataTypesToSupportLimits(data_type_limits.div_input));
-  div->setB(SupportedDataTypesToSupportLimits(data_type_limits.div_input));
-  div->setOutput(SupportedDataTypesToSupportLimits(data_type_limits.div_input));
+  div->setA(SupportedTensorLimitsToTensorLimits(data_type_limits.div_input));
+  div->setB(SupportedTensorLimitsToTensorLimits(data_type_limits.div_input));
+  div->setOutput(SupportedDataTypesToDataTypeLimits(
+      data_type_limits.div_input.data_types));
   op_support_limits->setDiv(div);
   MLBinarySupportLimits* max = MLBinarySupportLimits::Create();
-  max->setA(SupportedDataTypesToSupportLimits(data_type_limits.max_input));
-  max->setB(SupportedDataTypesToSupportLimits(data_type_limits.max_input));
-  max->setOutput(SupportedDataTypesToSupportLimits(data_type_limits.max_input));
+  max->setA(SupportedTensorLimitsToTensorLimits(data_type_limits.max_input));
+  max->setB(SupportedTensorLimitsToTensorLimits(data_type_limits.max_input));
+  max->setOutput(SupportedDataTypesToDataTypeLimits(
+      data_type_limits.max_input.data_types));
   op_support_limits->setMax(max);
   MLBinarySupportLimits* min = MLBinarySupportLimits::Create();
-  min->setA(SupportedDataTypesToSupportLimits(data_type_limits.min_input));
-  min->setB(SupportedDataTypesToSupportLimits(data_type_limits.min_input));
-  min->setOutput(SupportedDataTypesToSupportLimits(data_type_limits.min_input));
+  min->setA(SupportedTensorLimitsToTensorLimits(data_type_limits.min_input));
+  min->setB(SupportedTensorLimitsToTensorLimits(data_type_limits.min_input));
+  min->setOutput(SupportedDataTypesToDataTypeLimits(
+      data_type_limits.min_input.data_types));
   op_support_limits->setMin(min);
   MLBinarySupportLimits* pow = MLBinarySupportLimits::Create();
-  pow->setA(SupportedDataTypesToSupportLimits(data_type_limits.pow_input));
-  pow->setB(SupportedDataTypesToSupportLimits(data_type_limits.pow_input));
-  pow->setOutput(SupportedDataTypesToSupportLimits(data_type_limits.pow_input));
+  pow->setA(SupportedTensorLimitsToTensorLimits(data_type_limits.pow_input));
+  pow->setB(SupportedTensorLimitsToTensorLimits(data_type_limits.pow_input));
+  pow->setOutput(SupportedDataTypesToDataTypeLimits(
+      data_type_limits.pow_input.data_types));
   op_support_limits->setPow(pow);
 
   // Element-wise logical ops.
   MLBinarySupportLimits* equal = MLBinarySupportLimits::Create();
-  equal->setA(SupportedDataTypesToSupportLimits(data_type_limits.equal_input));
-  equal->setB(SupportedDataTypesToSupportLimits(data_type_limits.equal_input));
+  equal->setA(
+      SupportedTensorLimitsToTensorLimits(data_type_limits.equal_input));
+  equal->setB(
+      SupportedTensorLimitsToTensorLimits(data_type_limits.equal_input));
   equal->setOutput(
-      SupportedDataTypesToSupportLimits(data_type_limits.logical_output));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.logical_output));
   op_support_limits->setEqual(equal);
   MLBinarySupportLimits* greater = MLBinarySupportLimits::Create();
   greater->setA(
-      SupportedDataTypesToSupportLimits(data_type_limits.greater_input));
+      SupportedTensorLimitsToTensorLimits(data_type_limits.greater_input));
   greater->setB(
-      SupportedDataTypesToSupportLimits(data_type_limits.greater_input));
+      SupportedTensorLimitsToTensorLimits(data_type_limits.greater_input));
   greater->setOutput(
-      SupportedDataTypesToSupportLimits(data_type_limits.logical_output));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.logical_output));
   op_support_limits->setGreater(greater);
   MLBinarySupportLimits* greater_or_equal = MLBinarySupportLimits::Create();
-  greater_or_equal->setA(SupportedDataTypesToSupportLimits(
+  greater_or_equal->setA(SupportedTensorLimitsToTensorLimits(
       data_type_limits.greater_or_equal_input));
-  greater_or_equal->setB(SupportedDataTypesToSupportLimits(
+  greater_or_equal->setB(SupportedTensorLimitsToTensorLimits(
       data_type_limits.greater_or_equal_input));
   greater_or_equal->setOutput(
-      SupportedDataTypesToSupportLimits(data_type_limits.logical_output));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.logical_output));
   op_support_limits->setGreaterOrEqual(greater_or_equal);
   MLBinarySupportLimits* lesser = MLBinarySupportLimits::Create();
   lesser->setA(
-      SupportedDataTypesToSupportLimits(data_type_limits.lesser_input));
+      SupportedTensorLimitsToTensorLimits(data_type_limits.lesser_input));
   lesser->setB(
-      SupportedDataTypesToSupportLimits(data_type_limits.lesser_input));
+      SupportedTensorLimitsToTensorLimits(data_type_limits.lesser_input));
   lesser->setOutput(
-      SupportedDataTypesToSupportLimits(data_type_limits.logical_output));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.logical_output));
   op_support_limits->setLesser(lesser);
   MLBinarySupportLimits* lesser_or_equal = MLBinarySupportLimits::Create();
-  lesser_or_equal->setA(SupportedDataTypesToSupportLimits(
+  lesser_or_equal->setA(SupportedTensorLimitsToTensorLimits(
       data_type_limits.lesser_or_equal_input));
-  lesser_or_equal->setB(SupportedDataTypesToSupportLimits(
+  lesser_or_equal->setB(SupportedTensorLimitsToTensorLimits(
       data_type_limits.lesser_or_equal_input));
   lesser_or_equal->setOutput(
-      SupportedDataTypesToSupportLimits(data_type_limits.logical_output));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.logical_output));
   op_support_limits->setLesserOrEqual(lesser_or_equal);
   MLBinarySupportLimits* logical_and = MLBinarySupportLimits::Create();
   logical_and->setA(
-      SupportedDataTypesToSupportLimits(data_type_limits.logical_and_input));
+      SupportedTensorLimitsToTensorLimits(data_type_limits.logical_and_input));
   logical_and->setB(
-      SupportedDataTypesToSupportLimits(data_type_limits.logical_and_input));
+      SupportedTensorLimitsToTensorLimits(data_type_limits.logical_and_input));
   logical_and->setOutput(
-      SupportedDataTypesToSupportLimits(data_type_limits.logical_output));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.logical_output));
   op_support_limits->setLogicalAnd(logical_and);
   MLBinarySupportLimits* logical_or = MLBinarySupportLimits::Create();
   logical_or->setA(
-      SupportedDataTypesToSupportLimits(data_type_limits.logical_or_input));
+      SupportedTensorLimitsToTensorLimits(data_type_limits.logical_or_input));
   logical_or->setB(
-      SupportedDataTypesToSupportLimits(data_type_limits.logical_or_input));
+      SupportedTensorLimitsToTensorLimits(data_type_limits.logical_or_input));
   logical_or->setOutput(
-      SupportedDataTypesToSupportLimits(data_type_limits.logical_output));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.logical_output));
   op_support_limits->setLogicalOr(logical_or);
   MLBinarySupportLimits* logical_xor = MLBinarySupportLimits::Create();
   logical_xor->setA(
-      SupportedDataTypesToSupportLimits(data_type_limits.logical_xor_input));
+      SupportedTensorLimitsToTensorLimits(data_type_limits.logical_xor_input));
   logical_xor->setB(
-      SupportedDataTypesToSupportLimits(data_type_limits.logical_xor_input));
+      SupportedTensorLimitsToTensorLimits(data_type_limits.logical_xor_input));
   logical_xor->setOutput(
-      SupportedDataTypesToSupportLimits(data_type_limits.logical_output));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.logical_output));
   op_support_limits->setLogicalXor(logical_xor);
   MLLogicalNotSupportLimits* logical_not = MLLogicalNotSupportLimits::Create();
   logical_not->setA(
-      SupportedDataTypesToSupportLimits(data_type_limits.logical_not_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.logical_not_input));
   logical_not->setOutput(
-      SupportedDataTypesToSupportLimits(data_type_limits.logical_output));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.logical_output));
   op_support_limits->setLogicalNot(logical_not);
 
   // Element-wise unary ops.
   MLSingleInputSupportLimits* abs = MLSingleInputSupportLimits::Create();
-  abs->setInput(SupportedDataTypesToSupportLimits(data_type_limits.abs_input));
-  abs->setOutput(SupportedDataTypesToSupportLimits(data_type_limits.abs_input));
+  abs->setInput(SupportedDataTypesToDataTypeLimits(data_type_limits.abs_input));
+  abs->setOutput(
+      SupportedDataTypesToDataTypeLimits(data_type_limits.abs_input));
   op_support_limits->setAbs(abs);
   MLSingleInputSupportLimits* ceil = MLSingleInputSupportLimits::Create();
   ceil->setInput(
-      SupportedDataTypesToSupportLimits(data_type_limits.ceil_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.ceil_input));
   ceil->setOutput(
-      SupportedDataTypesToSupportLimits(data_type_limits.ceil_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.ceil_input));
   op_support_limits->setCeil(ceil);
   MLSingleInputSupportLimits* cos = MLSingleInputSupportLimits::Create();
-  cos->setInput(SupportedDataTypesToSupportLimits(data_type_limits.cos_input));
-  cos->setOutput(SupportedDataTypesToSupportLimits(data_type_limits.cos_input));
+  cos->setInput(SupportedDataTypesToDataTypeLimits(data_type_limits.cos_input));
+  cos->setOutput(
+      SupportedDataTypesToDataTypeLimits(data_type_limits.cos_input));
   op_support_limits->setCos(cos);
   MLSingleInputSupportLimits* erf = MLSingleInputSupportLimits::Create();
-  erf->setInput(SupportedDataTypesToSupportLimits(data_type_limits.erf_input));
-  erf->setOutput(SupportedDataTypesToSupportLimits(data_type_limits.erf_input));
+  erf->setInput(SupportedDataTypesToDataTypeLimits(data_type_limits.erf_input));
+  erf->setOutput(
+      SupportedDataTypesToDataTypeLimits(data_type_limits.erf_input));
   op_support_limits->setErf(erf);
   MLSingleInputSupportLimits* exp = MLSingleInputSupportLimits::Create();
-  exp->setInput(SupportedDataTypesToSupportLimits(data_type_limits.exp_input));
-  exp->setOutput(SupportedDataTypesToSupportLimits(data_type_limits.exp_input));
+  exp->setInput(SupportedDataTypesToDataTypeLimits(data_type_limits.exp_input));
+  exp->setOutput(
+      SupportedDataTypesToDataTypeLimits(data_type_limits.exp_input));
   op_support_limits->setExp(exp);
   MLSingleInputSupportLimits* floor = MLSingleInputSupportLimits::Create();
   floor->setInput(
-      SupportedDataTypesToSupportLimits(data_type_limits.floor_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.floor_input));
   floor->setOutput(
-      SupportedDataTypesToSupportLimits(data_type_limits.floor_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.floor_input));
   op_support_limits->setFloor(floor);
   MLSingleInputSupportLimits* identity = MLSingleInputSupportLimits::Create();
   identity->setInput(
-      SupportedDataTypesToSupportLimits(data_type_limits.identity_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.identity_input));
   identity->setOutput(
-      SupportedDataTypesToSupportLimits(data_type_limits.identity_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.identity_input));
   op_support_limits->setIdentity(identity);
   MLSingleInputSupportLimits* log = MLSingleInputSupportLimits::Create();
-  log->setInput(SupportedDataTypesToSupportLimits(data_type_limits.log_input));
-  log->setOutput(SupportedDataTypesToSupportLimits(data_type_limits.log_input));
+  log->setInput(SupportedDataTypesToDataTypeLimits(data_type_limits.log_input));
+  log->setOutput(
+      SupportedDataTypesToDataTypeLimits(data_type_limits.log_input));
   op_support_limits->setLog(log);
   MLSingleInputSupportLimits* neg = MLSingleInputSupportLimits::Create();
-  neg->setInput(SupportedDataTypesToSupportLimits(data_type_limits.neg_input));
-  neg->setOutput(SupportedDataTypesToSupportLimits(data_type_limits.neg_input));
+  neg->setInput(SupportedDataTypesToDataTypeLimits(data_type_limits.neg_input));
+  neg->setOutput(
+      SupportedDataTypesToDataTypeLimits(data_type_limits.neg_input));
   op_support_limits->setNeg(neg);
   MLSingleInputSupportLimits* reciprocal = MLSingleInputSupportLimits::Create();
   reciprocal->setInput(
-      SupportedDataTypesToSupportLimits(data_type_limits.reciprocal_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.reciprocal_input));
   reciprocal->setOutput(
-      SupportedDataTypesToSupportLimits(data_type_limits.reciprocal_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.reciprocal_input));
   op_support_limits->setReciprocal(reciprocal);
   MLSingleInputSupportLimits* sign = MLSingleInputSupportLimits::Create();
   sign->setInput(
-      SupportedDataTypesToSupportLimits(data_type_limits.sign_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.sign_input));
   sign->setOutput(
-      SupportedDataTypesToSupportLimits(data_type_limits.sign_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.sign_input));
   op_support_limits->setSign(sign);
   MLSingleInputSupportLimits* sin = MLSingleInputSupportLimits::Create();
-  sin->setInput(SupportedDataTypesToSupportLimits(data_type_limits.sin_input));
-  sin->setOutput(SupportedDataTypesToSupportLimits(data_type_limits.sin_input));
+  sin->setInput(SupportedDataTypesToDataTypeLimits(data_type_limits.sin_input));
+  sin->setOutput(
+      SupportedDataTypesToDataTypeLimits(data_type_limits.sin_input));
   op_support_limits->setSin(sin);
   MLSingleInputSupportLimits* sqrt = MLSingleInputSupportLimits::Create();
   sqrt->setInput(
-      SupportedDataTypesToSupportLimits(data_type_limits.sqrt_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.sqrt_input));
   sqrt->setOutput(
-      SupportedDataTypesToSupportLimits(data_type_limits.sqrt_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.sqrt_input));
   op_support_limits->setSqrt(sqrt);
   MLSingleInputSupportLimits* tan = MLSingleInputSupportLimits::Create();
-  tan->setInput(SupportedDataTypesToSupportLimits(data_type_limits.tan_input));
-  tan->setOutput(SupportedDataTypesToSupportLimits(data_type_limits.tan_input));
+  tan->setInput(SupportedDataTypesToDataTypeLimits(data_type_limits.tan_input));
+  tan->setOutput(
+      SupportedDataTypesToDataTypeLimits(data_type_limits.tan_input));
   op_support_limits->setTan(tan);
 
   MLSingleInputSupportLimits* elu = MLSingleInputSupportLimits::Create();
-  elu->setInput(SupportedDataTypesToSupportLimits(data_type_limits.elu_input));
-  elu->setOutput(SupportedDataTypesToSupportLimits(data_type_limits.elu_input));
+  elu->setInput(SupportedDataTypesToDataTypeLimits(data_type_limits.elu_input));
+  elu->setOutput(
+      SupportedDataTypesToDataTypeLimits(data_type_limits.elu_input));
   op_support_limits->setElu(elu);
 
   MLSingleInputSupportLimits* expand = MLSingleInputSupportLimits::Create();
   expand->setInput(
-      SupportedDataTypesToSupportLimits(data_type_limits.expand_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.expand_input));
   expand->setOutput(
-      SupportedDataTypesToSupportLimits(data_type_limits.expand_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.expand_input));
   op_support_limits->setExpand(expand);
 
   MLGatherSupportLimits* gather = MLGatherSupportLimits::Create();
   gather->setInput(
-      SupportedDataTypesToSupportLimits(data_type_limits.gather_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.gather_input));
   gather->setIndices(
-      SupportedDataTypesToSupportLimits(data_type_limits.gather_indices));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.gather_indices));
   gather->setOutput(
-      SupportedDataTypesToSupportLimits(data_type_limits.gather_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.gather_input));
   op_support_limits->setGather(gather);
 
   MLGatherSupportLimits* gather_elements = MLGatherSupportLimits::Create();
-  gather_elements->setInput(SupportedDataTypesToSupportLimits(
+  gather_elements->setInput(SupportedDataTypesToDataTypeLimits(
       data_type_limits.gather_elements_input));
-  gather_elements->setIndices(SupportedDataTypesToSupportLimits(
+  gather_elements->setIndices(SupportedDataTypesToDataTypeLimits(
       data_type_limits.gather_elements_indices));
-  gather_elements->setOutput(SupportedDataTypesToSupportLimits(
+  gather_elements->setOutput(SupportedDataTypesToDataTypeLimits(
       data_type_limits.gather_elements_input));
   op_support_limits->setGatherElements(gather_elements);
 
   MLGatherSupportLimits* gather_nd = MLGatherSupportLimits::Create();
   gather_nd->setInput(
-      SupportedDataTypesToSupportLimits(data_type_limits.gather_nd_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.gather_nd_input));
   gather_nd->setIndices(
-      SupportedDataTypesToSupportLimits(data_type_limits.gather_nd_indices));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.gather_nd_indices));
   gather_nd->setOutput(
-      SupportedDataTypesToSupportLimits(data_type_limits.gather_nd_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.gather_nd_input));
   op_support_limits->setGatherND(gather_nd);
 
   MLSingleInputSupportLimits* gelu = MLSingleInputSupportLimits::Create();
   gelu->setInput(
-      SupportedDataTypesToSupportLimits(data_type_limits.gelu_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.gelu_input));
   gelu->setOutput(
-      SupportedDataTypesToSupportLimits(data_type_limits.gelu_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.gelu_input));
   op_support_limits->setGelu(gelu);
 
   MLGemmSupportLimits* gemm = MLGemmSupportLimits::Create();
-  gemm->setA(SupportedDataTypesToSupportLimits(data_type_limits.gemm_input));
-  gemm->setB(SupportedDataTypesToSupportLimits(data_type_limits.gemm_input));
-  gemm->setC(SupportedDataTypesToSupportLimits(data_type_limits.gemm_input));
+  gemm->setA(SupportedDataTypesToDataTypeLimits(data_type_limits.gemm_input));
+  gemm->setB(SupportedDataTypesToDataTypeLimits(data_type_limits.gemm_input));
+  gemm->setC(SupportedDataTypesToDataTypeLimits(data_type_limits.gemm_input));
   gemm->setOutput(
-      SupportedDataTypesToSupportLimits(data_type_limits.gemm_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.gemm_input));
   op_support_limits->setGemm(gemm);
 
   MLGruSupportLimits* gru = MLGruSupportLimits::Create();
-  gru->setInput(SupportedDataTypesToSupportLimits(
+  gru->setInput(SupportedDataTypesToDataTypeLimits(
       properties_.data_type_limits.gru_input));
-  gru->setWeight(SupportedDataTypesToSupportLimits(
+  gru->setWeight(SupportedDataTypesToDataTypeLimits(
       properties_.data_type_limits.gru_input));
-  gru->setRecurrentWeight(SupportedDataTypesToSupportLimits(
+  gru->setRecurrentWeight(SupportedDataTypesToDataTypeLimits(
       properties_.data_type_limits.gru_input));
-  gru->setBias(SupportedDataTypesToSupportLimits(
+  gru->setBias(SupportedDataTypesToDataTypeLimits(
       properties_.data_type_limits.gru_input));
-  gru->setRecurrentBias(SupportedDataTypesToSupportLimits(
+  gru->setRecurrentBias(SupportedDataTypesToDataTypeLimits(
       properties_.data_type_limits.gru_input));
-  gru->setInitialHiddenState(SupportedDataTypesToSupportLimits(
+  gru->setInitialHiddenState(SupportedDataTypesToDataTypeLimits(
       properties_.data_type_limits.gru_input));
-  gru->setOutputs(SupportedDataTypesToSupportLimits(
+  gru->setOutputs(SupportedDataTypesToDataTypeLimits(
       properties_.data_type_limits.gru_input));
   op_support_limits->setGru(gru);
 
   MLGruCellSupportLimits* gru_cell = MLGruCellSupportLimits::Create();
-  gru_cell->setInput(SupportedDataTypesToSupportLimits(
+  gru_cell->setInput(SupportedDataTypesToDataTypeLimits(
       properties_.data_type_limits.gru_cell_input));
-  gru_cell->setWeight(SupportedDataTypesToSupportLimits(
+  gru_cell->setWeight(SupportedDataTypesToDataTypeLimits(
       properties_.data_type_limits.gru_cell_input));
-  gru_cell->setRecurrentWeight(SupportedDataTypesToSupportLimits(
+  gru_cell->setRecurrentWeight(SupportedDataTypesToDataTypeLimits(
       properties_.data_type_limits.gru_cell_input));
-  gru_cell->setHiddenState(SupportedDataTypesToSupportLimits(
+  gru_cell->setHiddenState(SupportedDataTypesToDataTypeLimits(
       properties_.data_type_limits.gru_cell_input));
-  gru_cell->setBias(SupportedDataTypesToSupportLimits(
+  gru_cell->setBias(SupportedDataTypesToDataTypeLimits(
       properties_.data_type_limits.gru_cell_input));
-  gru_cell->setRecurrentBias(SupportedDataTypesToSupportLimits(
+  gru_cell->setRecurrentBias(SupportedDataTypesToDataTypeLimits(
       properties_.data_type_limits.gru_cell_input));
-  gru_cell->setOutput(SupportedDataTypesToSupportLimits(
+  gru_cell->setOutput(SupportedDataTypesToDataTypeLimits(
       properties_.data_type_limits.gru_cell_input));
   op_support_limits->setGruCell(gru_cell);
 
   MLSingleInputSupportLimits* hard_sigmoid =
       MLSingleInputSupportLimits::Create();
-  hard_sigmoid->setInput(SupportedDataTypesToSupportLimits(
+  hard_sigmoid->setInput(SupportedDataTypesToDataTypeLimits(
       properties_.data_type_limits.hard_sigmoid_input));
-  hard_sigmoid->setOutput(SupportedDataTypesToSupportLimits(
+  hard_sigmoid->setOutput(SupportedDataTypesToDataTypeLimits(
       properties_.data_type_limits.hard_sigmoid_input));
   op_support_limits->setHardSigmoid(hard_sigmoid);
 
   MLSingleInputSupportLimits* hard_swish = MLSingleInputSupportLimits::Create();
-  hard_swish->setInput(SupportedDataTypesToSupportLimits(
+  hard_swish->setInput(SupportedDataTypesToDataTypeLimits(
       properties_.data_type_limits.hard_swish_input));
-  hard_swish->setOutput(SupportedDataTypesToSupportLimits(
+  hard_swish->setOutput(SupportedDataTypesToDataTypeLimits(
       properties_.data_type_limits.hard_swish_input));
   op_support_limits->setHardSwish(hard_swish);
 
   MLNormalizationSupportLimits* instance_normalization =
       MLNormalizationSupportLimits::Create();
-  instance_normalization->setInput(SupportedDataTypesToSupportLimits(
+  instance_normalization->setInput(SupportedDataTypesToDataTypeLimits(
       data_type_limits.instance_normalization_input));
-  instance_normalization->setScale(SupportedDataTypesToSupportLimits(
+  instance_normalization->setScale(SupportedDataTypesToDataTypeLimits(
       data_type_limits.instance_normalization_input));
-  instance_normalization->setBias(SupportedDataTypesToSupportLimits(
+  instance_normalization->setBias(SupportedDataTypesToDataTypeLimits(
       data_type_limits.instance_normalization_input));
-  instance_normalization->setOutput(SupportedDataTypesToSupportLimits(
+  instance_normalization->setOutput(SupportedDataTypesToDataTypeLimits(
       data_type_limits.instance_normalization_input));
   op_support_limits->setInstanceNormalization(instance_normalization);
 
   MLNormalizationSupportLimits* layer_normalization =
       MLNormalizationSupportLimits::Create();
-  layer_normalization->setInput(SupportedDataTypesToSupportLimits(
+  layer_normalization->setInput(SupportedDataTypesToDataTypeLimits(
       data_type_limits.layer_normalization_input));
-  layer_normalization->setScale(SupportedDataTypesToSupportLimits(
+  layer_normalization->setScale(SupportedDataTypesToDataTypeLimits(
       data_type_limits.layer_normalization_input));
-  layer_normalization->setBias(SupportedDataTypesToSupportLimits(
+  layer_normalization->setBias(SupportedDataTypesToDataTypeLimits(
       data_type_limits.layer_normalization_input));
-  layer_normalization->setOutput(SupportedDataTypesToSupportLimits(
+  layer_normalization->setOutput(SupportedDataTypesToDataTypeLimits(
       data_type_limits.layer_normalization_input));
   op_support_limits->setLayerNormalization(layer_normalization);
 
   MLSingleInputSupportLimits* leaky_relu = MLSingleInputSupportLimits::Create();
   leaky_relu->setInput(
-      SupportedDataTypesToSupportLimits(data_type_limits.leaky_relu_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.leaky_relu_input));
   leaky_relu->setOutput(
-      SupportedDataTypesToSupportLimits(data_type_limits.leaky_relu_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.leaky_relu_input));
   op_support_limits->setLeakyRelu(leaky_relu);
 
   MLSingleInputSupportLimits* linear = MLSingleInputSupportLimits::Create();
   linear->setInput(
-      SupportedDataTypesToSupportLimits(data_type_limits.linear_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.linear_input));
   linear->setOutput(
-      SupportedDataTypesToSupportLimits(data_type_limits.linear_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.linear_input));
   op_support_limits->setLinear(linear);
 
   MLLstmSupportLimits* lstm = MLLstmSupportLimits::Create();
-  lstm->setInput(SupportedDataTypesToSupportLimits(
+  lstm->setInput(SupportedDataTypesToDataTypeLimits(
       properties_.data_type_limits.lstm_input));
-  lstm->setWeight(SupportedDataTypesToSupportLimits(
+  lstm->setWeight(SupportedDataTypesToDataTypeLimits(
       properties_.data_type_limits.lstm_input));
-  lstm->setRecurrentWeight(SupportedDataTypesToSupportLimits(
+  lstm->setRecurrentWeight(SupportedDataTypesToDataTypeLimits(
       properties_.data_type_limits.lstm_input));
-  lstm->setBias(SupportedDataTypesToSupportLimits(
+  lstm->setBias(SupportedDataTypesToDataTypeLimits(
       properties_.data_type_limits.lstm_input));
-  lstm->setRecurrentBias(SupportedDataTypesToSupportLimits(
+  lstm->setRecurrentBias(SupportedDataTypesToDataTypeLimits(
       properties_.data_type_limits.lstm_input));
-  lstm->setPeepholeWeight(SupportedDataTypesToSupportLimits(
+  lstm->setPeepholeWeight(SupportedDataTypesToDataTypeLimits(
       properties_.data_type_limits.lstm_input));
-  lstm->setInitialHiddenState(SupportedDataTypesToSupportLimits(
+  lstm->setInitialHiddenState(SupportedDataTypesToDataTypeLimits(
       properties_.data_type_limits.lstm_input));
-  lstm->setInitialCellState(SupportedDataTypesToSupportLimits(
+  lstm->setInitialCellState(SupportedDataTypesToDataTypeLimits(
       properties_.data_type_limits.lstm_input));
-  lstm->setOutputs(SupportedDataTypesToSupportLimits(
+  lstm->setOutputs(SupportedDataTypesToDataTypeLimits(
       properties_.data_type_limits.lstm_input));
   op_support_limits->setLstm(lstm);
 
   MLLstmCellSupportLimits* lstm_cell = MLLstmCellSupportLimits::Create();
-  lstm_cell->setInput(SupportedDataTypesToSupportLimits(
+  lstm_cell->setInput(SupportedDataTypesToDataTypeLimits(
       properties_.data_type_limits.lstm_cell_input));
-  lstm_cell->setWeight(SupportedDataTypesToSupportLimits(
+  lstm_cell->setWeight(SupportedDataTypesToDataTypeLimits(
       properties_.data_type_limits.lstm_cell_input));
-  lstm_cell->setRecurrentWeight(SupportedDataTypesToSupportLimits(
+  lstm_cell->setRecurrentWeight(SupportedDataTypesToDataTypeLimits(
       properties_.data_type_limits.lstm_cell_input));
-  lstm_cell->setHiddenState(SupportedDataTypesToSupportLimits(
+  lstm_cell->setHiddenState(SupportedDataTypesToDataTypeLimits(
       properties_.data_type_limits.lstm_cell_input));
-  lstm_cell->setCellState(SupportedDataTypesToSupportLimits(
+  lstm_cell->setCellState(SupportedDataTypesToDataTypeLimits(
       properties_.data_type_limits.lstm_cell_input));
-  lstm_cell->setBias(SupportedDataTypesToSupportLimits(
+  lstm_cell->setBias(SupportedDataTypesToDataTypeLimits(
       properties_.data_type_limits.lstm_cell_input));
-  lstm_cell->setRecurrentBias(SupportedDataTypesToSupportLimits(
+  lstm_cell->setRecurrentBias(SupportedDataTypesToDataTypeLimits(
       properties_.data_type_limits.lstm_cell_input));
-  lstm_cell->setPeepholeWeight(SupportedDataTypesToSupportLimits(
+  lstm_cell->setPeepholeWeight(SupportedDataTypesToDataTypeLimits(
       properties_.data_type_limits.lstm_cell_input));
-  lstm_cell->setOutputs(SupportedDataTypesToSupportLimits(
+  lstm_cell->setOutputs(SupportedDataTypesToDataTypeLimits(
       properties_.data_type_limits.lstm_cell_input));
   op_support_limits->setLstmCell(lstm_cell);
 
   MLBinarySupportLimits* matmul = MLBinarySupportLimits::Create();
   matmul->setA(
-      SupportedDataTypesToSupportLimits(data_type_limits.matmul_input));
+      SupportedTensorLimitsToTensorLimits(data_type_limits.matmul_input));
   matmul->setB(
-      SupportedDataTypesToSupportLimits(data_type_limits.matmul_input));
-  matmul->setOutput(
-      SupportedDataTypesToSupportLimits(data_type_limits.matmul_input));
+      SupportedTensorLimitsToTensorLimits(data_type_limits.matmul_input));
+  matmul->setOutput(SupportedDataTypesToDataTypeLimits(
+      data_type_limits.matmul_input.data_types));
   op_support_limits->setMatmul(matmul);
 
   MLSingleInputSupportLimits* pad = MLSingleInputSupportLimits::Create();
-  pad->setInput(SupportedDataTypesToSupportLimits(data_type_limits.pad_input));
-  pad->setOutput(SupportedDataTypesToSupportLimits(data_type_limits.pad_input));
+  pad->setInput(SupportedDataTypesToDataTypeLimits(data_type_limits.pad_input));
+  pad->setOutput(
+      SupportedDataTypesToDataTypeLimits(data_type_limits.pad_input));
   op_support_limits->setPad(pad);
 
   // Pool2d.
   MLSingleInputSupportLimits* average_pool2d =
       MLSingleInputSupportLimits::Create();
-  average_pool2d->setInput(
-      SupportedDataTypesToSupportLimits(data_type_limits.average_pool2d_input));
-  average_pool2d->setOutput(
-      SupportedDataTypesToSupportLimits(data_type_limits.average_pool2d_input));
+  average_pool2d->setInput(SupportedDataTypesToDataTypeLimits(
+      data_type_limits.average_pool2d_input));
+  average_pool2d->setOutput(SupportedDataTypesToDataTypeLimits(
+      data_type_limits.average_pool2d_input));
   op_support_limits->setAveragePool2d(average_pool2d);
 
   MLSingleInputSupportLimits* l2_pool2d = MLSingleInputSupportLimits::Create();
   l2_pool2d->setInput(
-      SupportedDataTypesToSupportLimits(data_type_limits.l2_pool2d_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.l2_pool2d_input));
   l2_pool2d->setOutput(
-      SupportedDataTypesToSupportLimits(data_type_limits.l2_pool2d_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.l2_pool2d_input));
   op_support_limits->setL2Pool2d(l2_pool2d);
 
   MLSingleInputSupportLimits* max_pool2d = MLSingleInputSupportLimits::Create();
   max_pool2d->setInput(
-      SupportedDataTypesToSupportLimits(data_type_limits.max_pool2d_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.max_pool2d_input));
   max_pool2d->setOutput(
-      SupportedDataTypesToSupportLimits(data_type_limits.max_pool2d_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.max_pool2d_input));
   op_support_limits->setMaxPool2d(max_pool2d);
 
   MLPreluSupportLimits* prelu = MLPreluSupportLimits::Create();
   prelu->setInput(
-      SupportedDataTypesToSupportLimits(data_type_limits.prelu_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.prelu_input));
   prelu->setSlope(
-      SupportedDataTypesToSupportLimits(data_type_limits.prelu_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.prelu_input));
   prelu->setOutput(
-      SupportedDataTypesToSupportLimits(data_type_limits.prelu_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.prelu_input));
   op_support_limits->setPrelu(prelu);
 
   MLQuantizeDequantizeLinearSupportLimits* quantize_linear =
       MLQuantizeDequantizeLinearSupportLimits::Create();
-  quantize_linear->setInput(SupportedDataTypesToSupportLimits(
+  quantize_linear->setInput(SupportedDataTypesToDataTypeLimits(
       data_type_limits.quantize_linear_input));
-  quantize_linear->setScale(SupportedDataTypesToSupportLimits(
+  quantize_linear->setScale(SupportedDataTypesToDataTypeLimits(
       data_type_limits.quantize_linear_input));
-  quantize_linear->setZeroPoint(SupportedDataTypesToSupportLimits(
+  quantize_linear->setZeroPoint(SupportedDataTypesToDataTypeLimits(
       data_type_limits.quantize_linear_zero_point));
-  quantize_linear->setOutput(SupportedDataTypesToSupportLimits(
+  quantize_linear->setOutput(SupportedDataTypesToDataTypeLimits(
       data_type_limits.quantize_linear_zero_point));
   op_support_limits->setQuantizeLinear(quantize_linear);
 
   // Reduction ops.
   MLSingleInputSupportLimits* reduce_l1 = MLSingleInputSupportLimits::Create();
   reduce_l1->setInput(
-      SupportedDataTypesToSupportLimits(data_type_limits.reduce_l1_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.reduce_l1_input));
   reduce_l1->setOutput(
-      SupportedDataTypesToSupportLimits(data_type_limits.reduce_l1_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.reduce_l1_input));
   op_support_limits->setReduceL1(reduce_l1);
   MLSingleInputSupportLimits* reduce_l2 = MLSingleInputSupportLimits::Create();
   reduce_l2->setInput(
-      SupportedDataTypesToSupportLimits(data_type_limits.reduce_l2_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.reduce_l2_input));
   reduce_l2->setOutput(
-      SupportedDataTypesToSupportLimits(data_type_limits.reduce_l2_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.reduce_l2_input));
   op_support_limits->setReduceL2(reduce_l2);
   MLSingleInputSupportLimits* reduce_log_sum =
       MLSingleInputSupportLimits::Create();
-  reduce_log_sum->setInput(
-      SupportedDataTypesToSupportLimits(data_type_limits.reduce_log_sum_input));
-  reduce_log_sum->setOutput(
-      SupportedDataTypesToSupportLimits(data_type_limits.reduce_log_sum_input));
+  reduce_log_sum->setInput(SupportedDataTypesToDataTypeLimits(
+      data_type_limits.reduce_log_sum_input));
+  reduce_log_sum->setOutput(SupportedDataTypesToDataTypeLimits(
+      data_type_limits.reduce_log_sum_input));
   op_support_limits->setReduceLogSum(reduce_log_sum);
   MLSingleInputSupportLimits* reduce_log_sum_exp =
       MLSingleInputSupportLimits::Create();
-  reduce_log_sum_exp->setInput(SupportedDataTypesToSupportLimits(
+  reduce_log_sum_exp->setInput(SupportedDataTypesToDataTypeLimits(
       data_type_limits.reduce_log_sum_exp_input));
-  reduce_log_sum_exp->setOutput(SupportedDataTypesToSupportLimits(
+  reduce_log_sum_exp->setOutput(SupportedDataTypesToDataTypeLimits(
       data_type_limits.reduce_log_sum_exp_input));
   op_support_limits->setReduceLogSumExp(reduce_log_sum_exp);
   MLSingleInputSupportLimits* reduce_max = MLSingleInputSupportLimits::Create();
   reduce_max->setInput(
-      SupportedDataTypesToSupportLimits(data_type_limits.reduce_max_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.reduce_max_input));
   reduce_max->setOutput(
-      SupportedDataTypesToSupportLimits(data_type_limits.reduce_max_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.reduce_max_input));
   op_support_limits->setReduceMax(reduce_max);
   MLSingleInputSupportLimits* reduce_mean =
       MLSingleInputSupportLimits::Create();
   reduce_mean->setInput(
-      SupportedDataTypesToSupportLimits(data_type_limits.reduce_mean_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.reduce_mean_input));
   reduce_mean->setOutput(
-      SupportedDataTypesToSupportLimits(data_type_limits.reduce_mean_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.reduce_mean_input));
   op_support_limits->setReduceMean(reduce_mean);
   MLSingleInputSupportLimits* reduce_min = MLSingleInputSupportLimits::Create();
   reduce_min->setInput(
-      SupportedDataTypesToSupportLimits(data_type_limits.reduce_min_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.reduce_min_input));
   reduce_min->setOutput(
-      SupportedDataTypesToSupportLimits(data_type_limits.reduce_min_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.reduce_min_input));
   op_support_limits->setReduceMin(reduce_min);
   MLSingleInputSupportLimits* reduce_product =
       MLSingleInputSupportLimits::Create();
-  reduce_product->setInput(
-      SupportedDataTypesToSupportLimits(data_type_limits.reduce_product_input));
-  reduce_product->setOutput(
-      SupportedDataTypesToSupportLimits(data_type_limits.reduce_product_input));
+  reduce_product->setInput(SupportedDataTypesToDataTypeLimits(
+      data_type_limits.reduce_product_input));
+  reduce_product->setOutput(SupportedDataTypesToDataTypeLimits(
+      data_type_limits.reduce_product_input));
   op_support_limits->setReduceProduct(reduce_product);
   MLSingleInputSupportLimits* reduce_sum = MLSingleInputSupportLimits::Create();
   reduce_sum->setInput(
-      SupportedDataTypesToSupportLimits(data_type_limits.reduce_sum_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.reduce_sum_input));
   reduce_sum->setOutput(
-      SupportedDataTypesToSupportLimits(data_type_limits.reduce_sum_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.reduce_sum_input));
   op_support_limits->setReduceSum(reduce_sum);
   MLSingleInputSupportLimits* reduce_sum_square =
       MLSingleInputSupportLimits::Create();
-  reduce_sum_square->setInput(SupportedDataTypesToSupportLimits(
+  reduce_sum_square->setInput(SupportedDataTypesToDataTypeLimits(
       data_type_limits.reduce_sum_square_input));
-  reduce_sum_square->setOutput(SupportedDataTypesToSupportLimits(
+  reduce_sum_square->setOutput(SupportedDataTypesToDataTypeLimits(
       data_type_limits.reduce_sum_square_input));
   op_support_limits->setReduceSumSquare(reduce_sum_square);
 
   MLSingleInputSupportLimits* relu = MLSingleInputSupportLimits::Create();
   relu->setInput(
-      SupportedDataTypesToSupportLimits(data_type_limits.relu_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.relu_input));
   relu->setOutput(
-      SupportedDataTypesToSupportLimits(data_type_limits.relu_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.relu_input));
   op_support_limits->setRelu(relu);
 
   MLSingleInputSupportLimits* resample2d = MLSingleInputSupportLimits::Create();
   resample2d->setInput(
-      SupportedDataTypesToSupportLimits(data_type_limits.resample2d_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.resample2d_input));
   resample2d->setOutput(
-      SupportedDataTypesToSupportLimits(data_type_limits.resample2d_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.resample2d_input));
   op_support_limits->setResample2d(resample2d);
 
   MLSingleInputSupportLimits* reshape = MLSingleInputSupportLimits::Create();
   reshape->setInput(
-      SupportedDataTypesToSupportLimits(data_type_limits.reshape_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.reshape_input));
   reshape->setOutput(
-      SupportedDataTypesToSupportLimits(data_type_limits.reshape_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.reshape_input));
   op_support_limits->setReshape(reshape);
 
   MLSingleInputSupportLimits* reverse = MLSingleInputSupportLimits::Create();
   reverse->setInput(
-      SupportedDataTypesToSupportLimits(data_type_limits.reverse_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.reverse_input));
   reverse->setOutput(
-      SupportedDataTypesToSupportLimits(data_type_limits.reverse_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.reverse_input));
   op_support_limits->setReverse(reverse);
 
   MLScatterSupportLimits* scatter_elements = MLScatterSupportLimits::Create();
-  scatter_elements->setInput(SupportedDataTypesToSupportLimits(
+  scatter_elements->setInput(SupportedDataTypesToDataTypeLimits(
       data_type_limits.scatter_elements_input));
-  scatter_elements->setIndices(SupportedDataTypesToSupportLimits(
+  scatter_elements->setIndices(SupportedDataTypesToDataTypeLimits(
       data_type_limits.scatter_elements_indices));
-  scatter_elements->setUpdates(SupportedDataTypesToSupportLimits(
+  scatter_elements->setUpdates(SupportedDataTypesToDataTypeLimits(
       data_type_limits.scatter_elements_input));
-  scatter_elements->setOutput(SupportedDataTypesToSupportLimits(
+  scatter_elements->setOutput(SupportedDataTypesToDataTypeLimits(
       data_type_limits.scatter_elements_input));
   op_support_limits->setScatterElements(scatter_elements);
 
   MLScatterSupportLimits* scatter_nd = MLScatterSupportLimits::Create();
   scatter_nd->setInput(
-      SupportedDataTypesToSupportLimits(data_type_limits.scatter_nd_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.scatter_nd_input));
   scatter_nd->setIndices(
-      SupportedDataTypesToSupportLimits(data_type_limits.scatter_nd_indices));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.scatter_nd_indices));
   scatter_nd->setUpdates(
-      SupportedDataTypesToSupportLimits(data_type_limits.scatter_nd_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.scatter_nd_input));
   scatter_nd->setOutput(
-      SupportedDataTypesToSupportLimits(data_type_limits.scatter_nd_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.scatter_nd_input));
   op_support_limits->setScatterND(scatter_nd);
 
   MLSingleInputSupportLimits* sigmoid = MLSingleInputSupportLimits::Create();
   sigmoid->setInput(
-      SupportedDataTypesToSupportLimits(data_type_limits.sigmoid_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.sigmoid_input));
   sigmoid->setOutput(
-      SupportedDataTypesToSupportLimits(data_type_limits.sigmoid_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.sigmoid_input));
   op_support_limits->setSigmoid(sigmoid);
 
   MLSingleInputSupportLimits* slice = MLSingleInputSupportLimits::Create();
   slice->setInput(
-      SupportedDataTypesToSupportLimits(data_type_limits.slice_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.slice_input));
   slice->setOutput(
-      SupportedDataTypesToSupportLimits(data_type_limits.slice_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.slice_input));
   op_support_limits->setSlice(slice);
 
   MLSingleInputSupportLimits* softmax = MLSingleInputSupportLimits::Create();
   softmax->setInput(
-      SupportedDataTypesToSupportLimits(data_type_limits.softmax_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.softmax_input));
   softmax->setOutput(
-      SupportedDataTypesToSupportLimits(data_type_limits.softmax_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.softmax_input));
   op_support_limits->setSoftmax(softmax);
 
   MLSingleInputSupportLimits* softplus = MLSingleInputSupportLimits::Create();
   softplus->setInput(
-      SupportedDataTypesToSupportLimits(data_type_limits.softplus_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.softplus_input));
   softplus->setOutput(
-      SupportedDataTypesToSupportLimits(data_type_limits.softplus_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.softplus_input));
   op_support_limits->setSoftplus(softplus);
 
   MLSingleInputSupportLimits* softsign = MLSingleInputSupportLimits::Create();
   softsign->setInput(
-      SupportedDataTypesToSupportLimits(data_type_limits.softsign_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.softsign_input));
   softsign->setOutput(
-      SupportedDataTypesToSupportLimits(data_type_limits.softsign_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.softsign_input));
   op_support_limits->setSoftsign(softsign);
 
   MLSplitSupportLimits* split = MLSplitSupportLimits::Create();
   split->setInput(
-      SupportedDataTypesToSupportLimits(data_type_limits.split_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.split_input));
   split->setOutputs(
-      SupportedDataTypesToSupportLimits(data_type_limits.split_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.split_input));
   op_support_limits->setSplit(split);
 
   MLSingleInputSupportLimits* tanh = MLSingleInputSupportLimits::Create();
   tanh->setInput(
-      SupportedDataTypesToSupportLimits(data_type_limits.tanh_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.tanh_input));
   tanh->setOutput(
-      SupportedDataTypesToSupportLimits(data_type_limits.tanh_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.tanh_input));
   op_support_limits->setTanh(tanh);
 
   MLSingleInputSupportLimits* tile = MLSingleInputSupportLimits::Create();
   tile->setInput(
-      SupportedDataTypesToSupportLimits(data_type_limits.tile_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.tile_input));
   tile->setOutput(
-      SupportedDataTypesToSupportLimits(data_type_limits.tile_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.tile_input));
   op_support_limits->setTile(tile);
 
   MLSingleInputSupportLimits* transpose = MLSingleInputSupportLimits::Create();
   transpose->setInput(
-      SupportedDataTypesToSupportLimits(data_type_limits.transpose_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.transpose_input));
   transpose->setOutput(
-      SupportedDataTypesToSupportLimits(data_type_limits.transpose_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.transpose_input));
   op_support_limits->setTranspose(transpose);
 
   MLSingleInputSupportLimits* triangular = MLSingleInputSupportLimits::Create();
   triangular->setInput(
-      SupportedDataTypesToSupportLimits(data_type_limits.triangular_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.triangular_input));
   triangular->setOutput(
-      SupportedDataTypesToSupportLimits(data_type_limits.triangular_input));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.triangular_input));
   op_support_limits->setTriangular(triangular);
 
   MLWhereSupportLimits* where = MLWhereSupportLimits::Create();
   where->setCondition(
-      SupportedDataTypesToSupportLimits(data_type_limits.where_condition));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.where_condition));
   where->setTrueValue(
-      SupportedDataTypesToSupportLimits(data_type_limits.where_value));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.where_value));
   where->setFalseValue(
-      SupportedDataTypesToSupportLimits(data_type_limits.where_value));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.where_value));
   where->setOutput(
-      SupportedDataTypesToSupportLimits(data_type_limits.where_value));
+      SupportedDataTypesToDataTypeLimits(data_type_limits.where_value));
   op_support_limits->setWhere(where);
 
   return op_support_limits;
diff --git a/third_party/blink/renderer/modules/ml/ml_context.idl b/third_party/blink/renderer/modules/ml/ml_context.idl
index 8004249..00b4a34 100644
--- a/third_party/blink/renderer/modules/ml/ml_context.idl
+++ b/third_party/blink/renderer/modules/ml/ml_context.idl
@@ -16,153 +16,162 @@
   DOMString message;
 };
 
-dictionary MLSupportLimits {
+dictionary MLDataTypeLimits {
   sequence<DOMString> dataTypes;
 };
 
+dictionary MLRankRange {
+  unsigned long min;
+  unsigned long max;
+};
+
+dictionary MLTensorLimits : MLDataTypeLimits {
+  MLRankRange rankRange;
+};
+
 dictionary MLBinarySupportLimits {
-  MLSupportLimits a;
-  MLSupportLimits b;
-  MLSupportLimits output;
+  MLTensorLimits a;
+  MLTensorLimits b;
+  MLDataTypeLimits output;
 };
 
 dictionary MLBatchNormalizationSupportLimits {
-  MLSupportLimits input;
-  MLSupportLimits mean;
-  MLSupportLimits variance;
-  MLSupportLimits scale;
-  MLSupportLimits bias;
-  MLSupportLimits output;
+  MLDataTypeLimits input;
+  MLDataTypeLimits mean;
+  MLDataTypeLimits variance;
+  MLDataTypeLimits scale;
+  MLDataTypeLimits bias;
+  MLDataTypeLimits output;
 };
 
 dictionary MLConcatSupportLimits {
-  MLSupportLimits inputs;
-  MLSupportLimits output;
+  MLDataTypeLimits inputs;
+  MLDataTypeLimits output;
 };
 
 dictionary MLConv2dSupportLimits {
-  MLSupportLimits input;
-  MLSupportLimits filter;
-  MLSupportLimits bias;
-  MLSupportLimits output;
+  MLDataTypeLimits input;
+  MLDataTypeLimits filter;
+  MLDataTypeLimits bias;
+  MLDataTypeLimits output;
 };
 
 dictionary MLCumulativeSumSupportLimits {
-  MLSupportLimits input;
-  MLSupportLimits output;
+  MLDataTypeLimits input;
+  MLDataTypeLimits output;
 };
 
 dictionary MLGatherSupportLimits {
-  MLSupportLimits input;
-  MLSupportLimits indices;
-  MLSupportLimits output;
+  MLDataTypeLimits input;
+  MLDataTypeLimits indices;
+  MLDataTypeLimits output;
 };
 
 dictionary MLGemmSupportLimits {
-  MLSupportLimits a;
-  MLSupportLimits b;
-  MLSupportLimits c;
-  MLSupportLimits output;
+  MLDataTypeLimits a;
+  MLDataTypeLimits b;
+  MLDataTypeLimits c;
+  MLDataTypeLimits output;
 };
 
 dictionary MLGruSupportLimits {
-  MLSupportLimits input;
-  MLSupportLimits weight;
-  MLSupportLimits recurrentWeight;
-  MLSupportLimits bias;
-  MLSupportLimits recurrentBias;
-  MLSupportLimits initialHiddenState;
-  MLSupportLimits outputs;
+  MLDataTypeLimits input;
+  MLDataTypeLimits weight;
+  MLDataTypeLimits recurrentWeight;
+  MLDataTypeLimits bias;
+  MLDataTypeLimits recurrentBias;
+  MLDataTypeLimits initialHiddenState;
+  MLDataTypeLimits outputs;
 };
 
 dictionary MLGruCellSupportLimits {
-  MLSupportLimits input;
-  MLSupportLimits weight;
-  MLSupportLimits recurrentWeight;
-  MLSupportLimits hiddenState;
-  MLSupportLimits bias;
-  MLSupportLimits recurrentBias;
-  MLSupportLimits output;
+  MLDataTypeLimits input;
+  MLDataTypeLimits weight;
+  MLDataTypeLimits recurrentWeight;
+  MLDataTypeLimits hiddenState;
+  MLDataTypeLimits bias;
+  MLDataTypeLimits recurrentBias;
+  MLDataTypeLimits output;
 };
 
 dictionary MLLstmSupportLimits {
-  MLSupportLimits input;
-  MLSupportLimits weight;
-  MLSupportLimits recurrentWeight;
-  MLSupportLimits bias;
-  MLSupportLimits recurrentBias;
-  MLSupportLimits peepholeWeight;
-  MLSupportLimits initialHiddenState;
-  MLSupportLimits initialCellState;
-  MLSupportLimits outputs;
+  MLDataTypeLimits input;
+  MLDataTypeLimits weight;
+  MLDataTypeLimits recurrentWeight;
+  MLDataTypeLimits bias;
+  MLDataTypeLimits recurrentBias;
+  MLDataTypeLimits peepholeWeight;
+  MLDataTypeLimits initialHiddenState;
+  MLDataTypeLimits initialCellState;
+  MLDataTypeLimits outputs;
 };
 
 dictionary MLLstmCellSupportLimits {
-  MLSupportLimits input;
-  MLSupportLimits weight;
-  MLSupportLimits recurrentWeight;
-  MLSupportLimits hiddenState;
-  MLSupportLimits cellState;
-  MLSupportLimits bias;
-  MLSupportLimits recurrentBias;
-  MLSupportLimits peepholeWeight;
-  MLSupportLimits outputs;
+  MLDataTypeLimits input;
+  MLDataTypeLimits weight;
+  MLDataTypeLimits recurrentWeight;
+  MLDataTypeLimits hiddenState;
+  MLDataTypeLimits cellState;
+  MLDataTypeLimits bias;
+  MLDataTypeLimits recurrentBias;
+  MLDataTypeLimits peepholeWeight;
+  MLDataTypeLimits outputs;
 };
 
 dictionary MLNormalizationSupportLimits {
-  MLSupportLimits input;
-  MLSupportLimits scale;
-  MLSupportLimits bias;
-  MLSupportLimits output;
+  MLDataTypeLimits input;
+  MLDataTypeLimits scale;
+  MLDataTypeLimits bias;
+  MLDataTypeLimits output;
 };
 
 dictionary MLPreluSupportLimits {
-  MLSupportLimits input;
-  MLSupportLimits slope;
-  MLSupportLimits output;
+  MLDataTypeLimits input;
+  MLDataTypeLimits slope;
+  MLDataTypeLimits output;
 };
 
 dictionary MLQuantizeDequantizeLinearSupportLimits {
-  MLSupportLimits input;
-  MLSupportLimits scale;
-  MLSupportLimits zeroPoint;
-  MLSupportLimits output;
+  MLDataTypeLimits input;
+  MLDataTypeLimits scale;
+  MLDataTypeLimits zeroPoint;
+  MLDataTypeLimits output;
 };
 
 dictionary MLLogicalNotSupportLimits {
-  MLSupportLimits a;
-  MLSupportLimits output;
+  MLDataTypeLimits a;
+  MLDataTypeLimits output;
 };
 
 dictionary MLSingleInputSupportLimits {
-  MLSupportLimits input;
-  MLSupportLimits output;
+  MLDataTypeLimits input;
+  MLDataTypeLimits output;
 };
 
 dictionary MLScatterSupportLimits {
-  MLSupportLimits input;
-  MLSupportLimits indices;
-  MLSupportLimits updates;
-  MLSupportLimits output;
+  MLDataTypeLimits input;
+  MLDataTypeLimits indices;
+  MLDataTypeLimits updates;
+  MLDataTypeLimits output;
 };
 
 dictionary MLSplitSupportLimits {
-  MLSupportLimits input;
-  MLSupportLimits outputs;
+  MLDataTypeLimits input;
+  MLDataTypeLimits outputs;
 };
 
 dictionary MLWhereSupportLimits {
-  MLSupportLimits condition;
-  MLSupportLimits trueValue;
-  MLSupportLimits falseValue;
-  MLSupportLimits output;
+  MLDataTypeLimits condition;
+  MLDataTypeLimits trueValue;
+  MLDataTypeLimits falseValue;
+  MLDataTypeLimits output;
 };
 
 dictionary MLOpSupportLimits {
   MLInputOperandLayout preferredInputLayout;
-  MLSupportLimits input;
-  MLSupportLimits constant;
-  MLSupportLimits output;
+  MLDataTypeLimits input;
+  MLDataTypeLimits constant;
+  MLDataTypeLimits output;
 
   MLSingleInputSupportLimits argMin;
   MLSingleInputSupportLimits argMax;
diff --git a/third_party/blink/renderer/modules/ml/webnn/ml_graph_builder.cc b/third_party/blink/renderer/modules/ml/webnn/ml_graph_builder.cc
index d43bd260..540d4160 100644
--- a/third_party/blink/renderer/modules/ml/webnn/ml_graph_builder.cc
+++ b/third_party/blink/renderer/modules/ml/webnn/ml_graph_builder.cc
@@ -907,24 +907,24 @@
 MLOperand* BuildElementWiseBinary(
     MLGraphBuilder* builder,
     blink_mojom::ElementWiseBinary::Kind kind,
-    const webnn::SupportedDataTypes& data_type_constraint,
+    const webnn::SupportedTensors& tensor_constraint,
     MLOperand* a,
     MLOperand* b,
     const MLOperatorOptions* options,
     ExceptionState& exception_state) {
   const std::string label = options->label().Utf8();
-  if (!data_type_constraint.Has(a->DataType())) {
+  if (!tensor_constraint.Supports(a->Descriptor())) {
     exception_state.ThrowTypeError(
         String::FromUTF8(webnn::GetErrorLabelPrefix(label)) +
-        String(NotSupportedArgumentTypeError("a", a->DataType(),
-                                             data_type_constraint)));
+        String(NotSupportedArgumentError("a", a->Descriptor(),
+                                         tensor_constraint)));
     return nullptr;
   }
-  if (!data_type_constraint.Has(b->DataType())) {
+  if (!tensor_constraint.Supports(b->Descriptor())) {
     exception_state.ThrowTypeError(
         String::FromUTF8(webnn::GetErrorLabelPrefix(label)) +
-        String(NotSupportedArgumentTypeError("b", b->DataType(),
-                                             data_type_constraint)));
+        String(NotSupportedArgumentError("b", b->Descriptor(),
+                                         tensor_constraint)));
     return nullptr;
   }
 
diff --git a/third_party/blink/renderer/modules/ml/webnn/ml_graph_test.cc b/third_party/blink/renderer/modules/ml/webnn/ml_graph_test.cc
index 0378e18..b520933 100644
--- a/third_party/blink/renderer/modules/ml/webnn/ml_graph_test.cc
+++ b/third_party/blink/renderer/modules/ml/webnn/ml_graph_test.cc
@@ -286,9 +286,6 @@
 
 class MLGraphTest : public testing::Test {
  public:
-  MLGraphTest()
-      : scoped_feature_list_(webnn::mojom::features::kWebMachineLearningNeuralNetwork) {}
-
   void SetGraphInfo(blink_mojom::GraphInfoPtr graph_info) {
     graph_info_ = std::move(graph_info);
   }
@@ -332,7 +329,8 @@
   }
 
  private:
-  base::test::ScopedFeatureList scoped_feature_list_;
+  base::test::ScopedFeatureList scoped_feature_list_{
+      webnn::mojom::features::kWebMachineLearningNeuralNetwork};
   test::TaskEnvironment task_environment_;
 
   blink_mojom::GraphInfoPtr graph_info_;
@@ -557,21 +555,36 @@
          /*cumulative_sum_input=*/webnn::SupportedDataTypes::All(),
          /*dequantize_linear_input=*/webnn::SupportedDataTypes::All(),
          /*dequantize_linear_scale=*/webnn::SupportedDataTypes::All(),
-         /*add_input=*/webnn::SupportedDataTypes::All(),
-         /*sub_input=*/webnn::SupportedDataTypes::All(),
-         /*mul_input=*/webnn::SupportedDataTypes::All(),
-         /*div_input=*/webnn::SupportedDataTypes::All(),
-         /*max_input=*/webnn::SupportedDataTypes::All(),
-         /*min_input=*/webnn::SupportedDataTypes::All(),
-         /*pow_input=*/webnn::SupportedDataTypes::All(),
-         /*equal_input=*/webnn::SupportedDataTypes::All(),
-         /*greater_input=*/webnn::SupportedDataTypes::All(),
-         /*greater_or_equal_input=*/webnn::SupportedDataTypes::All(),
-         /*lesser_input=*/webnn::SupportedDataTypes::All(),
-         /*lesser_or_equal_input=*/webnn::SupportedDataTypes::All(),
-         /*logical_and_input=*/webnn::SupportedDataTypes::All(),
-         /*logical_or_input=*/webnn::SupportedDataTypes::All(),
-         /*logical_xor_input=*/webnn::SupportedDataTypes::All(),
+         /*add_input=*/
+         {webnn::SupportedDataTypes::All(), webnn::SupportedRanks::UpTo(8)},
+         /*sub_input=*/
+         {webnn::SupportedDataTypes::All(), webnn::SupportedRanks::UpTo(8)},
+         /*mul_input=*/
+         {webnn::SupportedDataTypes::All(), webnn::SupportedRanks::UpTo(8)},
+         /*div_input=*/
+         {webnn::SupportedDataTypes::All(), webnn::SupportedRanks::UpTo(8)},
+         /*max_input=*/
+         {webnn::SupportedDataTypes::All(), webnn::SupportedRanks::UpTo(8)},
+         /*min_input=*/
+         {webnn::SupportedDataTypes::All(), webnn::SupportedRanks::UpTo(8)},
+         /*pow_input=*/
+         {webnn::SupportedDataTypes::All(), webnn::SupportedRanks::UpTo(8)},
+         /*equal_input=*/
+         {webnn::SupportedDataTypes::All(), webnn::SupportedRanks::UpTo(8)},
+         /*greater_input=*/
+         {webnn::SupportedDataTypes::All(), webnn::SupportedRanks::UpTo(8)},
+         /*greater_or_equal_input=*/
+         {webnn::SupportedDataTypes::All(), webnn::SupportedRanks::UpTo(8)},
+         /*lesser_input=*/
+         {webnn::SupportedDataTypes::All(), webnn::SupportedRanks::UpTo(8)},
+         /*lesser_or_equal_input=*/
+         {webnn::SupportedDataTypes::All(), webnn::SupportedRanks::UpTo(8)},
+         /*logical_and_input=*/
+         {webnn::SupportedDataTypes::All(), webnn::SupportedRanks::UpTo(8)},
+         /*logical_or_input=*/
+         {webnn::SupportedDataTypes::All(), webnn::SupportedRanks::UpTo(8)},
+         /*logical_xor_input=*/
+         {webnn::SupportedDataTypes::All(), webnn::SupportedRanks::UpTo(8)},
          /*logical_not_input=*/webnn::SupportedDataTypes::All(),
          /*logical_output=*/webnn::SupportedDataTypes::All(),
          /*abs_input=*/webnn::SupportedDataTypes::All(),
@@ -611,7 +624,8 @@
          /*linear_input=*/webnn::SupportedDataTypes::All(),
          /*lstm_input=*/webnn::SupportedDataTypes::All(),
          /*lstm_cell_input=*/webnn::SupportedDataTypes::All(),
-         /*matmul_input=*/webnn::SupportedDataTypes::All(),
+         /*matmul_input=*/
+         {webnn::SupportedDataTypes::All(), webnn::SupportedRanks::UpTo(8)},
          /*pad_input=*/webnn::SupportedDataTypes::All(),
          /*average_pool2d_input=*/webnn::SupportedDataTypes::All(),
          /*l2_pool2d_input=*/webnn::SupportedDataTypes::All(),
@@ -664,8 +678,7 @@
 
 class ScopedWebNNServiceBinder {
  public:
-  explicit ScopedWebNNServiceBinder(MLGraphTest& helper,
-                                    V8TestingScope& scope)
+  explicit ScopedWebNNServiceBinder(MLGraphTest& helper, V8TestingScope& scope)
       : fake_webnn_context_provider_(
             std::make_unique<FakeWebNNContextProvider>(helper)),
         interface_broker_(
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
index f90d38d..5d65340 100644
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -488,10 +488,10 @@
       name: "AudioVideoTracks",
       status: "experimental",
     },
-    // Re-enable this after crbug.com/378027651 is fixed.
+    // Killswitch.
     {
       name: "AuraScrollbarUsesNinePatchTrack",
-      status: "test",
+      status: "stable",
     },
     {
       name: "AutoDarkMode",
diff --git a/third_party/blink/web_tests/SlowTests b/third_party/blink/web_tests/SlowTests
index da9c7610..30fd26c 100644
--- a/third_party/blink/web_tests/SlowTests
+++ b/third_party/blink/web_tests/SlowTests
@@ -1470,4 +1470,4 @@
 crbug.com/382173821 [ Mac11 ] wpt_internal/hid/hid_requestDevice.https.window.html [ Slow ]
 crbug.com/382173821 [ Mac12 ] wpt_internal/hid/hid_requestDevice.https.window.html [ Slow ]
 
-crbug.com/387577507 virtual/composite-clip-path-animation/paint/invalidation/svg/invalid-clip-path-crash.html [ Slow ]
\ No newline at end of file
+crbug.com/387577507 virtual/composite-clip-path-animation/paint/invalidation/svg/invalid-clip-path-crash.html [ Slow ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index 138786be..44eeb129 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -2705,63 +2705,63 @@
 crbug.com/383880384 [ Win ] external/wpt/css/css-properties-values-api/registered-property-change-style-002.html [ Failure Pass ]
 
 # ====== New tests from wpt-importer added here ======
-external/wpt/css/css-images/gradient/gradient-longer-hue-hsl-002.html [ Failure ]
-external/wpt/css/css-images/gradient/gradient-longer-hue-hsl-003.html [ Failure ]
-external/wpt/css/css-images/gradient/gradient-longer-hue-hsl-006.html [ Failure ]
-external/wpt/css/css-images/gradient/gradient-longer-hue-hsl-008.html [ Failure ]
-external/wpt/css/css-images/gradient/gradient-longer-hue-hsl-009.html [ Failure ]
-external/wpt/css/css-images/gradient/gradient-longer-hue-hsl-010.html [ Failure ]
-external/wpt/css/css-images/gradient/gradient-longer-hue-hsl-011.html [ Failure ]
-external/wpt/css/css-images/gradient/gradient-longer-hue-hsl-012.html [ Failure ]
-external/wpt/css/css-images/gradient/gradient-longer-hue-lch-001.html [ Failure ]
-external/wpt/css/css-images/gradient/gradient-longer-hue-lch-002.html [ Failure ]
-external/wpt/css/css-images/gradient/gradient-longer-hue-lch-003.html [ Failure ]
-external/wpt/css/css-images/gradient/gradient-longer-hue-lch-006.html [ Failure ]
-external/wpt/css/css-images/gradient/gradient-longer-hue-lch-008.html [ Failure ]
-external/wpt/css/css-images/gradient/gradient-longer-hue-lch-009.html [ Failure ]
-external/wpt/css/css-images/gradient/gradient-longer-hue-lch-010.html [ Failure ]
-external/wpt/css/css-images/gradient/gradient-longer-hue-lch-011.html [ Failure ]
-external/wpt/css/css-images/gradient/gradient-longer-hue-lch-012.html [ Failure ]
-external/wpt/css/css-images/gradient/gradient-single-stop-001.html [ Failure ]
-external/wpt/css/css-images/gradient/gradient-single-stop-002.html [ Failure ]
-external/wpt/css/css-images/gradient/gradient-single-stop-003.html [ Failure ]
-external/wpt/css/css-images/gradient/gradient-single-stop-004.html [ Failure ]
-external/wpt/css/css-images/gradient/gradient-single-stop-005.html [ Failure ]
-external/wpt/css/css-images/gradient/gradient-single-stop-006.html [ Failure ]
-external/wpt/css/css-images/gradient/gradient-single-stop-007.html [ Failure ]
-external/wpt/css/css-images/gradient/gradient-single-stop-008.html [ Failure ]
-external/wpt/css/css-images/gradient/gradient-single-stop-longer-hue-hsl-002.html [ Failure ]
-external/wpt/css/css-images/gradient/gradient-single-stop-longer-hue-hsl.html [ Failure ]
-external/wpt/css/css-images/gradient/gradient-single-stop-longer-hue-oklch.html [ Failure ]
-[ Mac14 ] external/wpt/webrtc-encoded-transform/idlharness.https.window.html [ Timeout ]
-virtual/gpu-rasterization/external/wpt/css/css-images/gradient/gradient-longer-hue-hsl-002.html [ Failure ]
-virtual/gpu-rasterization/external/wpt/css/css-images/gradient/gradient-longer-hue-hsl-003.html [ Failure ]
-virtual/gpu-rasterization/external/wpt/css/css-images/gradient/gradient-longer-hue-hsl-006.html [ Failure ]
-virtual/gpu-rasterization/external/wpt/css/css-images/gradient/gradient-longer-hue-hsl-008.html [ Failure ]
-virtual/gpu-rasterization/external/wpt/css/css-images/gradient/gradient-longer-hue-hsl-009.html [ Failure ]
-virtual/gpu-rasterization/external/wpt/css/css-images/gradient/gradient-longer-hue-hsl-010.html [ Failure ]
-virtual/gpu-rasterization/external/wpt/css/css-images/gradient/gradient-longer-hue-hsl-011.html [ Failure ]
-virtual/gpu-rasterization/external/wpt/css/css-images/gradient/gradient-longer-hue-hsl-012.html [ Failure ]
-virtual/gpu-rasterization/external/wpt/css/css-images/gradient/gradient-longer-hue-lch-001.html [ Failure ]
-virtual/gpu-rasterization/external/wpt/css/css-images/gradient/gradient-longer-hue-lch-002.html [ Failure ]
-virtual/gpu-rasterization/external/wpt/css/css-images/gradient/gradient-longer-hue-lch-003.html [ Failure ]
-virtual/gpu-rasterization/external/wpt/css/css-images/gradient/gradient-longer-hue-lch-006.html [ Failure ]
-virtual/gpu-rasterization/external/wpt/css/css-images/gradient/gradient-longer-hue-lch-008.html [ Failure ]
-virtual/gpu-rasterization/external/wpt/css/css-images/gradient/gradient-longer-hue-lch-009.html [ Failure ]
-virtual/gpu-rasterization/external/wpt/css/css-images/gradient/gradient-longer-hue-lch-010.html [ Failure ]
-virtual/gpu-rasterization/external/wpt/css/css-images/gradient/gradient-longer-hue-lch-011.html [ Failure ]
-virtual/gpu-rasterization/external/wpt/css/css-images/gradient/gradient-longer-hue-lch-012.html [ Failure ]
-virtual/gpu-rasterization/external/wpt/css/css-images/gradient/gradient-single-stop-001.html [ Failure ]
-virtual/gpu-rasterization/external/wpt/css/css-images/gradient/gradient-single-stop-002.html [ Failure ]
-virtual/gpu-rasterization/external/wpt/css/css-images/gradient/gradient-single-stop-003.html [ Failure ]
-virtual/gpu-rasterization/external/wpt/css/css-images/gradient/gradient-single-stop-004.html [ Failure ]
-virtual/gpu-rasterization/external/wpt/css/css-images/gradient/gradient-single-stop-005.html [ Failure ]
-virtual/gpu-rasterization/external/wpt/css/css-images/gradient/gradient-single-stop-006.html [ Failure ]
-virtual/gpu-rasterization/external/wpt/css/css-images/gradient/gradient-single-stop-007.html [ Failure ]
-virtual/gpu-rasterization/external/wpt/css/css-images/gradient/gradient-single-stop-008.html [ Failure ]
-virtual/gpu-rasterization/external/wpt/css/css-images/gradient/gradient-single-stop-longer-hue-hsl-002.html [ Failure ]
-virtual/gpu-rasterization/external/wpt/css/css-images/gradient/gradient-single-stop-longer-hue-hsl.html [ Failure ]
-virtual/gpu-rasterization/external/wpt/css/css-images/gradient/gradient-single-stop-longer-hue-oklch.html [ Failure ]
+crbug.com/388073809 external/wpt/css/css-images/gradient/gradient-longer-hue-hsl-002.html [ Failure ]
+crbug.com/388073809 external/wpt/css/css-images/gradient/gradient-longer-hue-hsl-003.html [ Failure ]
+crbug.com/388073809 external/wpt/css/css-images/gradient/gradient-longer-hue-hsl-006.html [ Failure ]
+crbug.com/388073809 external/wpt/css/css-images/gradient/gradient-longer-hue-hsl-008.html [ Failure ]
+crbug.com/388073809 external/wpt/css/css-images/gradient/gradient-longer-hue-hsl-009.html [ Failure ]
+crbug.com/388073809 external/wpt/css/css-images/gradient/gradient-longer-hue-hsl-010.html [ Failure ]
+crbug.com/388073809 external/wpt/css/css-images/gradient/gradient-longer-hue-hsl-011.html [ Failure ]
+crbug.com/388073809 external/wpt/css/css-images/gradient/gradient-longer-hue-hsl-012.html [ Failure ]
+crbug.com/388073809 external/wpt/css/css-images/gradient/gradient-longer-hue-lch-001.html [ Failure ]
+crbug.com/388073809 external/wpt/css/css-images/gradient/gradient-longer-hue-lch-002.html [ Failure ]
+crbug.com/388073809 external/wpt/css/css-images/gradient/gradient-longer-hue-lch-003.html [ Failure ]
+crbug.com/388073809 external/wpt/css/css-images/gradient/gradient-longer-hue-lch-006.html [ Failure ]
+crbug.com/388073809 external/wpt/css/css-images/gradient/gradient-longer-hue-lch-008.html [ Failure ]
+crbug.com/388073809 external/wpt/css/css-images/gradient/gradient-longer-hue-lch-009.html [ Failure ]
+crbug.com/388073809 external/wpt/css/css-images/gradient/gradient-longer-hue-lch-010.html [ Failure ]
+crbug.com/388073809 external/wpt/css/css-images/gradient/gradient-longer-hue-lch-011.html [ Failure ]
+crbug.com/388073809 external/wpt/css/css-images/gradient/gradient-longer-hue-lch-012.html [ Failure ]
+crbug.com/388073809 external/wpt/css/css-images/gradient/gradient-single-stop-001.html [ Failure ]
+crbug.com/388073809 external/wpt/css/css-images/gradient/gradient-single-stop-002.html [ Failure ]
+crbug.com/388073809 external/wpt/css/css-images/gradient/gradient-single-stop-003.html [ Failure ]
+crbug.com/388073809 external/wpt/css/css-images/gradient/gradient-single-stop-004.html [ Failure ]
+crbug.com/388073809 external/wpt/css/css-images/gradient/gradient-single-stop-005.html [ Failure ]
+crbug.com/388073809 external/wpt/css/css-images/gradient/gradient-single-stop-006.html [ Failure ]
+crbug.com/388073809 external/wpt/css/css-images/gradient/gradient-single-stop-007.html [ Failure ]
+crbug.com/388073809 external/wpt/css/css-images/gradient/gradient-single-stop-008.html [ Failure ]
+crbug.com/388073809 external/wpt/css/css-images/gradient/gradient-single-stop-longer-hue-hsl-002.html [ Failure ]
+crbug.com/388073809 external/wpt/css/css-images/gradient/gradient-single-stop-longer-hue-hsl.html [ Failure ]
+crbug.com/388073809 external/wpt/css/css-images/gradient/gradient-single-stop-longer-hue-oklch.html [ Failure ]
+crbug.com/388063576 [ Mac14 ] external/wpt/webrtc-encoded-transform/idlharness.https.window.html [ Timeout ]
+crbug.com/388073809 virtual/gpu-rasterization/external/wpt/css/css-images/gradient/gradient-longer-hue-hsl-002.html [ Failure ]
+crbug.com/388073809 virtual/gpu-rasterization/external/wpt/css/css-images/gradient/gradient-longer-hue-hsl-003.html [ Failure ]
+crbug.com/388073809 virtual/gpu-rasterization/external/wpt/css/css-images/gradient/gradient-longer-hue-hsl-006.html [ Failure ]
+crbug.com/388073809 virtual/gpu-rasterization/external/wpt/css/css-images/gradient/gradient-longer-hue-hsl-008.html [ Failure ]
+crbug.com/388073809 virtual/gpu-rasterization/external/wpt/css/css-images/gradient/gradient-longer-hue-hsl-009.html [ Failure ]
+crbug.com/388073809 virtual/gpu-rasterization/external/wpt/css/css-images/gradient/gradient-longer-hue-hsl-010.html [ Failure ]
+crbug.com/388073809 virtual/gpu-rasterization/external/wpt/css/css-images/gradient/gradient-longer-hue-hsl-011.html [ Failure ]
+crbug.com/388073809 virtual/gpu-rasterization/external/wpt/css/css-images/gradient/gradient-longer-hue-hsl-012.html [ Failure ]
+crbug.com/388073809 virtual/gpu-rasterization/external/wpt/css/css-images/gradient/gradient-longer-hue-lch-001.html [ Failure ]
+crbug.com/388073809 virtual/gpu-rasterization/external/wpt/css/css-images/gradient/gradient-longer-hue-lch-002.html [ Failure ]
+crbug.com/388073809 virtual/gpu-rasterization/external/wpt/css/css-images/gradient/gradient-longer-hue-lch-003.html [ Failure ]
+crbug.com/388073809 virtual/gpu-rasterization/external/wpt/css/css-images/gradient/gradient-longer-hue-lch-006.html [ Failure ]
+crbug.com/388073809 virtual/gpu-rasterization/external/wpt/css/css-images/gradient/gradient-longer-hue-lch-008.html [ Failure ]
+crbug.com/388073809 virtual/gpu-rasterization/external/wpt/css/css-images/gradient/gradient-longer-hue-lch-009.html [ Failure ]
+crbug.com/388073809 virtual/gpu-rasterization/external/wpt/css/css-images/gradient/gradient-longer-hue-lch-010.html [ Failure ]
+crbug.com/388073809 virtual/gpu-rasterization/external/wpt/css/css-images/gradient/gradient-longer-hue-lch-011.html [ Failure ]
+crbug.com/388073809 virtual/gpu-rasterization/external/wpt/css/css-images/gradient/gradient-longer-hue-lch-012.html [ Failure ]
+crbug.com/388073809 virtual/gpu-rasterization/external/wpt/css/css-images/gradient/gradient-single-stop-001.html [ Failure ]
+crbug.com/388073809 virtual/gpu-rasterization/external/wpt/css/css-images/gradient/gradient-single-stop-002.html [ Failure ]
+crbug.com/388073809 virtual/gpu-rasterization/external/wpt/css/css-images/gradient/gradient-single-stop-003.html [ Failure ]
+crbug.com/388073809 virtual/gpu-rasterization/external/wpt/css/css-images/gradient/gradient-single-stop-004.html [ Failure ]
+crbug.com/388073809 virtual/gpu-rasterization/external/wpt/css/css-images/gradient/gradient-single-stop-005.html [ Failure ]
+crbug.com/388073809 virtual/gpu-rasterization/external/wpt/css/css-images/gradient/gradient-single-stop-006.html [ Failure ]
+crbug.com/388073809 virtual/gpu-rasterization/external/wpt/css/css-images/gradient/gradient-single-stop-007.html [ Failure ]
+crbug.com/388073809 virtual/gpu-rasterization/external/wpt/css/css-images/gradient/gradient-single-stop-008.html [ Failure ]
+crbug.com/388073809 virtual/gpu-rasterization/external/wpt/css/css-images/gradient/gradient-single-stop-longer-hue-hsl-002.html [ Failure ]
+crbug.com/388073809 virtual/gpu-rasterization/external/wpt/css/css-images/gradient/gradient-single-stop-longer-hue-hsl.html [ Failure ]
+crbug.com/388073809 virtual/gpu-rasterization/external/wpt/css/css-images/gradient/gradient-single-stop-longer-hue-oklch.html [ Failure ]
 crbug.com/388081043 [ Win10.20h2 ] external/wpt/editing/other/paste-clipboard-change.tentative.html?id=contenteditable [ Crash ]
 crbug.com/388081043 [ Mac14 ] external/wpt/editing/other/paste-clipboard-change.tentative.html?id=contenteditable [ Crash ]
 crbug.com/388081043 [ Linux ] external/wpt/editing/other/paste-clipboard-change.tentative.html?id=contenteditable [ Crash ]
@@ -6251,6 +6251,8 @@
 crbug.com/362922565 virtual/select-parser-relaxation/external/wpt/html/semantics/forms/the-select-element/customizable-select/select-type-to-search.tentative.html [ Failure ]
 crbug.com/366415131 external/wpt/html/semantics/forms/the-select-element/customizable-select/picker-and-slotted.tentative.html [ Failure ]
 crbug.com/380466909 virtual/popover-anchor-relationships-disabled/external/wpt/html/semantics/forms/the-select-element/customizable-select/select-events.tentative.html [ Failure Pass ]
+# This fails with !owner_->GetDocument().IsSlotAssignmentRecalcForbidden().
+crbug.com/384394713 external/wpt/html/semantics/forms/the-select-element/customizable-select/switch-picker-appearance.tentative.html [ Failure Crash Timeout ]
 
 ### Tests failing with CSSGapDecorations Enabled:
 crbug.com/357648037 virtual/css-gap-decorations/animations/interpolation/webkit-column-rule-color-interpolation.html [ Crash Failure Timeout ]
@@ -8999,4 +9001,4 @@
 
 # Gardener 2025-01-07
 crbug.com/388188842 external/wpt/html/semantics/forms/the-select-element/customizable-select/select-home-end-pagedown-pageup-detailed.optional.html [ Failure Pass Timeout ]
-crbug.com/388188842 external/wpt/html/semantics/forms/the-select-element/customizable-select/select-home-end-pagedown-pageup.tentative.html [ Failure Pass Timeout ]
\ No newline at end of file
+crbug.com/388188842 external/wpt/html/semantics/forms/the-select-element/customizable-select/select-home-end-pagedown-pageup.tentative.html [ Failure Pass Timeout ]
diff --git a/third_party/blink/web_tests/VirtualTestSuites b/third_party/blink/web_tests/VirtualTestSuites
index 2f71635..419f3ff 100644
--- a/third_party/blink/web_tests/VirtualTestSuites
+++ b/third_party/blink/web_tests/VirtualTestSuites
@@ -1651,7 +1651,7 @@
       "external/wpt/fetch/private-network-access/fenced-frame.tentative.https.window.js",
       "external/wpt/fetch/private-network-access/fenced-frame-no-preflight-required.tentative.https.window.js"
     ],
-    "args": ["--enable-features=PrivacySandboxAdsAPIsOverride,Fledge,AdInterestGroupAPI,FencedFramesEnforceFocus,FencedFramesLocalUnpartitionedDataAccess,ExemptUrlFromNetworkRevocationForTesting,FencedFramesCrossOriginEventReportingAllTraffic,FencedFramesReportEventHeaderChanges,FencedFramesSrcPermissionsPolicy",
+    "args": ["--enable-features=PrivacySandboxAdsAPIsOverride,Fledge,AdInterestGroupAPI,FencedFramesEnforceFocus,FencedFramesLocalUnpartitionedDataAccess,ExemptUrlFromNetworkRevocationForTesting,FencedFramesCrossOriginEventReportingAllTraffic,FencedFramesReportEventHeaderChanges,FencedFramesSrcPermissionsPolicy,FencedFramesCrossOriginAutomaticBeaconData",
              "--enable-blink-features=FencedFramesDefaultMode"],
     "expires": "May 1, 2025"
   },
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 f58c0e40..0dff827e 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
@@ -150786,7 +150786,7 @@
        ]
       ],
       "text-box-trim-on-button.html": [
-       "6172e319a3282822f53b65232596f8deef775a1f",
+       "4ecfad3870f8b85a443ce1624ecc9f2fbd174e80",
        [
         null,
         [
@@ -344562,7 +344562,7 @@
        []
       ],
       "text-box-trim-on-button-ref.html": [
-       "86d644e546f450affbfe09a72d70b2ada15ff91c",
+       "6d4f982f591793cbd067dcb0de8ec7328775a99a",
        []
       ],
       "text-box-trim-pseudo-before-after-001-ref.html": [
@@ -345294,7 +345294,7 @@
        []
       ],
       "clip-path-interpolation-shape-expected.txt": [
-       "ca6edbd53008da7f7772c8c9760595e5abceaf7f",
+       "09ebb939637be4748da9c25403f4ecc806e096b3",
        []
       ],
       "mask-border-outset-composition-expected.txt": [
@@ -352154,7 +352154,7 @@
        []
       ],
       "shape-function-computed.tentative-expected.txt": [
-       "c3bcb96d1e30759cf840590efd60c1decc7bab91",
+       "ead9e77dbd55d77f221dc988b2559b913eeff031",
        []
       ],
       "shape-function-valid.tentative-expected.txt": [
@@ -477823,7 +477823,7 @@
        ]
       ],
       "container-units-selection.html": [
-       "cb69395b8b07207977d8b822d134241f400a1bd7",
+       "a4a90060bd90d32b79355a3d4b0a2a4a227b0131",
        [
         null,
         {}
@@ -514176,7 +514176,7 @@
      ]
     ],
     "element-internals-aria-element-reflection.html": [
-     "6711fae6e3b8b9d33286f339545ca3af3220dd7f",
+     "21bd95f08853e01e1fa8e1bd41cc7345642fbd01",
      [
       null,
       {
@@ -686879,20 +686879,6 @@
       {}
      ]
     ],
-    "SpeechRecognition-onerror.https.html": [
-     "a6c1755f9b4ece3a91d28aeab49da1bf422584b3",
-     [
-      null,
-      {}
-     ]
-    ],
-    "SpeechRecognition-onstart-onend.https.html": [
-     "a789b3d81ac9f85a26decc4ea06984d9e5988f81",
-     [
-      null,
-      {}
-     ]
-    ],
     "SpeechSynthesis-pause-resume.tentative.html": [
      "a7aa2bbf6fa25fec45845b1b08801148649fc4a2",
      [
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color-hdr/computed.html b/third_party/blink/web_tests/external/wpt/css/css-color-hdr/computed.html
index 7ee1a96..48076da6 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-color-hdr/computed.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-color-hdr/computed.html
@@ -15,6 +15,12 @@
 test_computed_value("dynamic-range-limit", "standard");
 test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(standard 75%, high 25%)");
 test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(standard 25%, high 75%)");
+test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(high 100%, standard 0%)",
+                                           "high");
+test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(high 100%, high 0%)",
+                                           "high");
+test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(high 25%, standard 25%, standard 25%, standard 25%)",
+                                           "dynamic-range-limit-mix(standard 75%, high 25%)");
 test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(high 25%, standard 75%)",
                                            "dynamic-range-limit-mix(standard 75%, high 25%)");
 test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(high 100%, standard 100%)",
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color-hdr/parsing.html b/third_party/blink/web_tests/external/wpt/css/css-color-hdr/parsing.html
index 5d377a1..caf3e86 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-color-hdr/parsing.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-color-hdr/parsing.html
@@ -14,6 +14,8 @@
   test_valid_value("dynamic-range-limit", "dynamic-range-limit-mix(high 80%, standard 20%)");
   test_valid_value("dynamic-range-limit", "dynamic-range-limit-mix(high 8%, standard 2%)");
   test_valid_value("dynamic-range-limit", "dynamic-range-limit-mix(high 99%, standard 99%)");
+  test_valid_value("dynamic-range-limit", "dynamic-range-limit-mix(high 99%, standard 99%, constrained-high 10%)");
+  test_valid_value("dynamic-range-limit", "dynamic-range-limit-mix(high 1%)");
   test_valid_value("dynamic-range-limit", "dynamic-range-limit-mix(constrained-high 20%, high 80%)");
   test_valid_value("dynamic-range-limit", "dynamic-range-limit-mix(dynamic-range-limit-mix(constrained-high 90%, high 10%) 1%, high 80%)");
   test_valid_value("dynamic-range-limit", "dynamic-range-limit-mix(high 1%, dynamic-range-limit-mix(constrained-high 2%, high 10%) 80%)");
@@ -27,6 +29,7 @@
   test_invalid_value("dynamic-range-limit", "hdr");
   test_invalid_value("dynamic-range-limit", "sdr");
   test_invalid_value("dynamic-range-limit", "low");
+  test_invalid_value("dynamic-range-limit", "dynamic-range-limit-mix(high 80% standard 20%)");
   test_invalid_value("dynamic-range-limit", "dynamic-range-limit-mix(low, high, 10%)");
   test_invalid_value("dynamic-range-limit", "dynamic-range-limit-mix(high 101%, standard 1%)");
   test_invalid_value("dynamic-range-limit", "dynamic-range-limit-mix(high -1%, standard 1%)");
diff --git a/third_party/blink/web_tests/external/wpt/css/css-conditional/container-queries/container-units-selection.html b/third_party/blink/web_tests/external/wpt/css/css-conditional/container-queries/container-units-selection.html
index cb69395..a4a9006 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-conditional/container-queries/container-units-selection.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-conditional/container-queries/container-units-selection.html
@@ -30,10 +30,10 @@
 
   function assert_unit_equals(element, actual, expected) {
     try {
-      element.style.padding = actual;
-      ref.style.padding = expected;
-      assert_equals(getComputedStyle(element).paddingLeft,
-                    getComputedStyle(ref).paddingLeft);
+      element.style.margin = actual;
+      ref.style.margin = expected;
+      assert_equals(getComputedStyle(element).marginLeft,
+                    getComputedStyle(ref).marginLeft);
     } finally {
       element.style = '';
       ref.style = '';
@@ -51,6 +51,8 @@
       assert_unit_equals(child, '10cqb', '40px');
       assert_unit_equals(child, '10cqmin', '10px');
       assert_unit_equals(child, '10cqmax', '40px');
+      assert_unit_equals(child, '-10cqmin', '-10px');
+      assert_unit_equals(child, '-10cqmax', '-40px');
 
       c3.className = ''; // cqw, cqi now selects c2 instead.
       assert_unit_equals(child, '10cqw', '30px');
@@ -59,6 +61,8 @@
       assert_unit_equals(child, '10cqb', '40px');
       assert_unit_equals(child, '10cqmin', '30px');
       assert_unit_equals(child, '10cqmax', '40px');
+      assert_unit_equals(child, '-10cqmin', '-30px');
+      assert_unit_equals(child, '-10cqmax', '-40px');
 
     } finally {
       for (let c of [c1, c2, c3, c4, child])
diff --git a/third_party/blink/web_tests/external/wpt/css/css-masonry/tentative/parsing/masonry-flow-computed.html b/third_party/blink/web_tests/external/wpt/css/css-masonry/tentative/parsing/masonry-flow-computed.html
new file mode 100644
index 0000000..bad414b8
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-masonry/tentative/parsing/masonry-flow-computed.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <title>CSS Masonry: masonry-flow getComputedStyle()</title>
+  <link rel="author" title="Celeste Pan" href="mailto:celestepan@microsoft.com">
+  <link rel="help" href="https://drafts.csswg.org/css-grid-3">
+  <script src="/resources/testharness.js"></script>
+  <script src="/resources/testharnessreport.js"></script>
+  <script src="/css/support/computed-testcommon.js"></script>
+  <script src="/css/support/inheritance-testcommon.js"></script>
+</head>
+<body>
+  <div id="target"></div>
+  <script>
+    test_computed_value("masonry-flow", "column normal");
+    test_computed_value("masonry-flow", "column reverse");
+
+    test_computed_value("masonry-flow", "row normal");
+    test_computed_value("masonry-flow", "row reverse");
+
+    test_computed_value("masonry-flow", "column-reverse normal");
+    test_computed_value("masonry-flow", "column-reverse reverse");
+
+    test_computed_value("masonry-flow", "row-reverse normal");
+    test_computed_value("masonry-flow", "row-reverse reverse");
+  </script>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-masonry/tentative/parsing/masonry-flow-invalid.html b/third_party/blink/web_tests/external/wpt/css/css-masonry/tentative/parsing/masonry-flow-invalid.html
new file mode 100644
index 0000000..4e31b9e
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-masonry/tentative/parsing/masonry-flow-invalid.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>CSS Masonry: masonry-flow parsing</title>
+  <link rel="author" title="Celeste Pan" href="mailto:celestepan@microsoft.com">
+  <link rel="help" href="https://drafts.csswg.org/css-grid-3">
+  <script src="/resources/testharness.js"></script>
+  <script src="/resources/testharnessreport.js"></script>
+  <script src="/css/support/parsing-testcommon.js"></script>
+</head>
+<body>
+  <script>
+    test_invalid_value("masonry-flow", "nowrap row nowrap");
+    test_invalid_value("masonry-flow", "column wrap column");
+    test_invalid_value("masonry-flow", "reverse-column column");
+    test_invalid_value("masonry-flow", "reverse-row, row");
+    test_invalid_value("masonry-flow", "normal row-reverse");
+    test_invalid_value("masonry-flow", "reverse column");
+    test_invalid_value("masonry-flow", "auto, auto");
+  </script>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-masonry/tentative/parsing/masonry-flow-valid.html b/third_party/blink/web_tests/external/wpt/css/css-masonry/tentative/parsing/masonry-flow-valid.html
new file mode 100644
index 0000000..93c9bf3
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-masonry/tentative/parsing/masonry-flow-valid.html
@@ -0,0 +1,60 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>CSS Masonry: parsing masonry-flow with valid values</title>
+  <link rel="author" title="Celeste Pan" href="mailto:celestepan@microsoft.com">
+  <link rel="help" href="https://drafts.csswg.org/css-grid-3">
+  <script src="/resources/testharness.js"></script>
+  <script src="/resources/testharnessreport.js"></script>
+  <script src="/css/support/parsing-testcommon.js"></script>
+  <script src="/css/support/shorthand-testcommon.js"></script>
+</head>
+<body>
+  <script>
+    test_valid_value("masonry-flow", "column normal");
+    test_valid_value("masonry-flow", "column reverse");
+    test_shorthand_value('masonry-flow', 'column normal', {
+      'masonry-direction': 'column',
+      'masonry-fill': 'normal'
+    });
+    test_shorthand_value('masonry-flow', 'column reverse', {
+      'masonry-direction': 'column',
+      'masonry-fill': 'reverse'
+    });
+
+    test_valid_value("masonry-flow", "row normal");
+    test_valid_value("masonry-flow", "row reverse");
+    test_shorthand_value('masonry-flow', 'row normal', {
+      'masonry-direction': 'row',
+      'masonry-fill': 'normal'
+    });
+    test_shorthand_value('masonry-flow', 'row reverse', {
+      'masonry-direction': 'row',
+      'masonry-fill': 'reverse'
+    });
+
+    test_valid_value("masonry-flow", "column-reverse normal");
+    test_valid_value("masonry-flow", "column-reverse reverse");
+    test_shorthand_value('masonry-flow', 'column-reverse normal', {
+      'masonry-direction': 'column-reverse',
+      'masonry-fill': 'normal'
+    });
+    test_shorthand_value('masonry-flow', 'column-reverse reverse', {
+      'masonry-direction': 'column-reverse',
+      'masonry-fill': 'reverse'
+    });
+
+    test_valid_value("masonry-flow", "row-reverse normal");
+    test_valid_value("masonry-flow", "row-reverse reverse");
+    test_shorthand_value('masonry-flow', 'row-reverse normal', {
+      'masonry-direction': 'row-reverse',
+      'masonry-fill': 'normal'
+    });
+    test_shorthand_value('masonry-flow', 'row-reverse reverse', {
+      'masonry-direction': 'row-reverse',
+      'masonry-fill': 'reverse'
+    });
+  </script>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/fenced-frame/automatic-beacon-data-cross-origin-ancestor.sub.https.html b/third_party/blink/web_tests/external/wpt/fenced-frame/automatic-beacon-data-cross-origin-ancestor.sub.https.html
new file mode 100644
index 0000000..e66d2ad
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fenced-frame/automatic-beacon-data-cross-origin-ancestor.sub.https.html
@@ -0,0 +1,53 @@
+<!DOCTYPE html>
+<title>Test window.fence.setReportEventDataForAutomaticBeacons</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/utils.js"></script>
+<script src="/common/dispatcher/dispatcher.js"></script>
+<script src="resources/utils.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-actions.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="resources/automatic-beacon-helper.js"></script>
+
+<body>
+<script>
+promise_test(async(t) => {
+  // This test creates the following frame tree:
+  // Root Frame (A)
+  //  └─Fenced Frame (A)
+  //     └─IFrame (B) [sets data]
+  //        └─IFrame (C) [performs navigation]
+  // It then checks that C's navigation uses the data set in B, even if B is
+  // cross-origin to fencedframe A.
+  const fencedframe = await attachFencedFrameContext({
+    generator_api: 'fledge', register_beacon: true
+  });
+
+  const beacon = {
+    eventType: "reserved.top_navigation_start",
+    eventData: "This is the start data",
+    destination: ["buyer"],
+    crossOriginExposed: true
+  }
+
+  await fencedframe.execute(async (beacon) => {
+    const iframe = await attachIFrameContext({
+      origin: 'https://{{hosts[][www2]}}:{{ports[https][1]}}'
+    });
+    // IFrame (C) is created during this setupAutomaticBeacon() call. The data
+    // for IFrame (B) is also set during this call.
+    return setupAutomaticBeacon(iframe, [beacon],
+        "resources/close.html", NavigationTrigger.CrossOriginClick,
+        "_blank");
+  }, [beacon]);
+
+  await multiClick(10, 10, fencedframe.element)
+
+  await verifyBeaconData(beacon.eventType, beacon.eventData,
+      get_host_info().HTTPS_REMOTE_ORIGIN);
+}, 'An automatic beacon can use data set by a cross-origin ancestor.');
+
+</script>
+</body>
diff --git a/third_party/blink/web_tests/external/wpt/fenced-frame/automatic-beacon-data-cross-origin-subframe.https.html b/third_party/blink/web_tests/external/wpt/fenced-frame/automatic-beacon-data-cross-origin-subframe.https.html
index d97bf37..2082de1b 100644
--- a/third_party/blink/web_tests/external/wpt/fenced-frame/automatic-beacon-data-cross-origin-subframe.https.html
+++ b/third_party/blink/web_tests/external/wpt/fenced-frame/automatic-beacon-data-cross-origin-subframe.https.html
@@ -30,22 +30,28 @@
       origin: get_host_info().HTTPS_REMOTE_ORIGIN,
       headers: [['Allow-Fenced-Frame-Automatic-Beacons', 'true']]
     });
-    return setupAutomaticBeacon(iframe, [beacon],
-        "resources/close.html", NavigationTrigger.Click,
+    await setupAutomaticBeacon(iframe, [beacon],
+        "resources/close.html", NavigationTrigger.ClickOnce,
         "_blank");
+    return iframe.execute(() => {
+      // Test that automatic beacon data is set correctly in the subframe. Data
+      // that is not cross-origin exposed should not be able to be set in a
+      // cross-origin subframe, even if the same frame that sets the data
+      // triggers the report.
+      window.fence.setReportEventDataForAutomaticBeacons({
+        eventType: "reserved.top_navigation_start",
+        eventData: "This should not be the data",
+        destination: ["buyer"],
+        crossOriginExposed: false
+      });
+    });
   }, [beacon]);
 
   await multiClick(10, 10, fencedframe.element)
 
-  // An automatic beacon should be sent, but no data should be attached to it,
-  // as it shouldn't have been able to be set from a cross-origin subframe.
-  await verifyBeaconData(beacon.eventType, "<No data>",
+  await verifyBeaconData(beacon.eventType, beacon.eventData,
       get_host_info().HTTPS_REMOTE_ORIGIN);
-
-  // Leaving this fenced frame around for subsequent tests can lead to
-  // flakiness.
-  document.body.removeChild(fencedframe.element);
-}, 'A cross origin subframe cannot set automatic beacon data.');
+}, 'A cross origin subframe can set automatic beacon data.');
 
 </script>
 </body>
diff --git a/third_party/blink/web_tests/external/wpt/fenced-frame/automatic-beacon-data-multiple-ancestors.https.html b/third_party/blink/web_tests/external/wpt/fenced-frame/automatic-beacon-data-multiple-ancestors.https.html
new file mode 100644
index 0000000..5fd8580
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fenced-frame/automatic-beacon-data-multiple-ancestors.https.html
@@ -0,0 +1,62 @@
+<!DOCTYPE html>
+<title>Test window.fence.setReportEventDataForAutomaticBeacons</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/utils.js"></script>
+<script src="/common/dispatcher/dispatcher.js"></script>
+<script src="resources/utils.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-actions.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="resources/automatic-beacon-helper.js"></script>
+
+<body>
+<script>
+promise_test(async(t) => {
+  // This test creates the following frame tree:
+  // Root Frame (A)
+  //  └─Fenced Frame (A1) [sets valid data]
+  //     └─IFrame (A2) [sets invalid data]
+  //        └─IFrame (B) [performs navigation]
+  // It then checks that B's navigation uses the data set in A1 and not A2,
+  // since A1's data is valid for B to use.
+  const fencedframe = await attachFencedFrameContext({
+    generator_api: 'fledge', register_beacon: true
+  });
+
+  const valid_beacon = {
+    eventType: "reserved.top_navigation_start",
+    eventData: "This is the start data",
+    destination: ["buyer"],
+    crossOriginExposed: true
+  }
+
+  const invalid_beacon = {
+    eventType: "reserved.top_navigation_start",
+    eventData: "This data should not be used",
+    destination: ["buyer"],
+    crossOriginExposed: false
+  }
+
+  await fencedframe.execute(async (valid_beacon, invalid_beacon)=> {
+    window.fence.setReportEventDataForAutomaticBeacons(valid_beacon);
+
+    const iframe = await attachIFrameContext();
+    await iframe.execute((valid_beacon, invalid_beacon) => {
+      window.fence.setReportEventDataForAutomaticBeacons(invalid_beacon);
+    }, [valid_beacon, invalid_beacon]);
+
+    return setupAutomaticBeacon(iframe, [],
+        "resources/close.html", NavigationTrigger.CrossOriginClick,
+        "_blank");
+  }, [valid_beacon, invalid_beacon]);
+
+  await multiClick(10, 10, fencedframe.element)
+
+  await verifyBeaconData(valid_beacon.eventType, valid_beacon.eventData,
+      get_host_info().HTTPS_REMOTE_ORIGIN);
+}, 'An automatic beacon from uses the first valid ancestor-set data.');
+
+</script>
+</body>
diff --git a/third_party/blink/web_tests/external/wpt/fenced-frame/automatic-beacon-data-set-by-sibling.https.html b/third_party/blink/web_tests/external/wpt/fenced-frame/automatic-beacon-data-set-by-sibling.https.html
new file mode 100644
index 0000000..94e35577
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fenced-frame/automatic-beacon-data-set-by-sibling.https.html
@@ -0,0 +1,59 @@
+<!DOCTYPE html>
+<title>Test window.fence.setReportEventDataForAutomaticBeacons</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/utils.js"></script>
+<script src="/common/dispatcher/dispatcher.js"></script>
+<script src="resources/utils.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-actions.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="resources/automatic-beacon-helper.js"></script>
+
+<body>
+<script>
+promise_test(async(t) => {
+  // This test creates the following frame tree:
+  // Root Frame (A)
+  // └─Fenced Frame (A)
+  //    ├─IFrame (B) [performs navigation]
+  //    └─IFrame (B) [sets data]
+  // It then checks that B's navigation sends an automatic beacon without data,
+  // even if a different B sets automatic beacon data.
+  const fencedframe = await attachFencedFrameContext({
+    generator_api: 'fledge', register_beacon: true
+  });
+
+  const beacon = {
+    eventType: "reserved.top_navigation_start",
+    eventData: "This data should not be sent",
+    destination: ["buyer"],
+    crossOriginExposed: true
+  }
+
+  await fencedframe.execute(async (beacon) => {
+    const iframe_a = await attachIFrameContext({
+      origin: get_host_info().HTTPS_REMOTE_ORIGIN,
+      headers: [['Allow-Fenced-Frame-Automatic-Beacons', 'true']]
+    });
+    const iframe_b = await attachIFrameContext({
+      origin: get_host_info().HTTPS_REMOTE_ORIGIN,
+      headers: [['Allow-Fenced-Frame-Automatic-Beacons', 'true']]
+    });
+    iframe_b.execute((beacon) => {
+      window.fence.setReportEventDataForAutomaticBeacons(beacon);
+    }, [beacon]);
+    await setupAutomaticBeacon(iframe_a, [],
+        "resources/close.html", NavigationTrigger.ClickOnce,
+        "_blank");
+  }, [beacon]);
+
+  await multiClick(10, 10, fencedframe.element)
+
+  await verifyBeaconData(beacon.eventType, "<No data>",
+      get_host_info().HTTPS_REMOTE_ORIGIN);
+}, 'An automatic beacon does not use data set by a same-origin sibling.');
+
+</script>
+</body>
diff --git a/third_party/blink/web_tests/external/wpt/fenced-frame/resources/automatic-beacon-helper.js b/third_party/blink/web_tests/external/wpt/fenced-frame/resources/automatic-beacon-helper.js
index 36c10c9..9b343db 100644
--- a/third_party/blink/web_tests/external/wpt/fenced-frame/resources/automatic-beacon-helper.js
+++ b/third_party/blink/web_tests/external/wpt/fenced-frame/resources/automatic-beacon-helper.js
@@ -60,8 +60,7 @@
               window.fence.setReportEventDataForAutomaticBeacons(beacon_event);
             });
             // Add a cross-origin iframe that will perform the top-level
-            // navigation. Do not set the 'Allow-Fenced-Frame-Automatic-Beacons'
-            // header to true.
+            // navigation.
             const iframe = await attachIFrameContext({
               origin: get_host_info().HTTPS_REMOTE_ORIGIN,
               headers: [[
diff --git a/third_party/blink/web_tests/external/wpt/fledge/tentative/resources/authorize-server-response.py b/third_party/blink/web_tests/external/wpt/fledge/tentative/resources/authorize-server-response.py
index 303d2ef..83f46d9 100644
--- a/third_party/blink/web_tests/external/wpt/fledge/tentative/resources/authorize-server-response.py
+++ b/third_party/blink/web_tests/external/wpt/fledge/tentative/resources/authorize-server-response.py
@@ -1,6 +1,11 @@
 def main(request, response):
   response.status = (200, b"OK")
   response.headers.set(b"Content-Type", b"text/plain")
-  hash_list = request.GET.get_list(b"hashes")
-  response.headers.set(b"Ad-Auction-Result",
-                       b",".join(hash_list))
+  if b"hashes" in request.GET:
+    hash_list = request.GET.get_list(b"hashes")
+    response.headers.set(b"Ad-Auction-Result",
+                        b",".join(hash_list))
+  if b"nonces" in request.GET:
+    nonce_list = request.GET.get_list(b"nonces")
+    response.headers.set(b"Ad-Auction-Result-Nonce",
+                        b",".join(nonce_list))
diff --git a/third_party/blink/web_tests/external/wpt/fledge/tentative/resources/ba-fledge-util.sub.js b/third_party/blink/web_tests/external/wpt/fledge/tentative/resources/ba-fledge-util.sub.js
index e03a4056c..4e78a04c 100644
--- a/third_party/blink/web_tests/external/wpt/fledge/tentative/resources/ba-fledge-util.sub.js
+++ b/third_party/blink/web_tests/external/wpt/fledge/tentative/resources/ba-fledge-util.sub.js
@@ -360,6 +360,15 @@
   await fetch(authorizeURL, {adAuctionHeaders: true});
 };
 
+// Authorizes each serverResponse nonce in `nonces` to be used for
+// B&A auction result.
+BA.authorizeServerResponseNonces = async function(nonces) {
+  let authorizeURL =
+      new URL('resources/authorize-server-response.py', window.location);
+  authorizeURL.searchParams.append('nonces', nonces.join(','));
+  await fetch(authorizeURL, {adAuctionHeaders: true});
+};
+
 BA.configureCoordinator = async function() {
   // This is async in hope it can eventually use testdriver to configure this.
   return 'https://{{hosts[][]}}';
diff --git a/third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window.js b/third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window.js
index 2205500d..9806b8d 100644
--- a/third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window.js
+++ b/third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window.js
@@ -6,22 +6,22 @@
 // META: script=third_party/cbor-js/cbor.js
 // META: script=/common/subset-tests.js
 // META: timeout=long
-// META: variant=?1-4
-// META: variant=?5-8
-// META: variant=?9-12
-// META: variant=?13-16
-// META: variant=?17-20
-// META: variant=?21-24
-// META: variant=?25-28
-// META: variant=?29-32
-// META: variant=?33-36
-// META: variant=?37-40
-// META: variant=?41-44
-// META: variant=?45-48
-// META: variant=?49-52
-// META: variant=?53-56
-// META: variant=?57-60
-// META: variant=?61-64
+// META: variant=?1-6
+// META: variant=?7-10
+// META: variant=?11-14
+// META: variant=?15-18
+// META: variant=?19-22
+// META: variant=?23-26
+// META: variant=?27-30
+// META: variant=?31-34
+// META: variant=?35-38
+// META: variant=?39-42
+// META: variant=?43-46
+// META: variant=?47-50
+// META: variant=?51-54
+// META: variant=?55-58
+// META: variant=?59-62
+// META: variant=?63-66
 
 // These tests focus on the serverResponse field in AuctionConfig, e.g.
 // auctions involving bidding and auction services.
@@ -85,6 +85,86 @@
 
   let decoded = await BA.decodeInterestGroupData(result.request);
 
+  let serverResponseMsg = {
+    'nonce': uuid,
+    'biddingGroups': {},
+    'adRenderURL': adsArray[0].renderURL,
+    'interestGroupName': DEFAULT_INTEREST_GROUP_NAME,
+    'interestGroupOwner': window.location.origin,
+  };
+  serverResponseMsg.biddingGroups[window.location.origin] = [0];
+
+  let serverResponse =
+      await BA.encodeServerResponse(serverResponseMsg, decoded);
+
+  let hashString = await BA.payloadHash(serverResponse);
+  await BA.authorizeServerResponseNonces([uuid]);
+
+  let auctionResult = await navigator.runAdAuction({
+    'seller': window.location.origin,
+    'requestId': result.requestId,
+    'serverResponse': serverResponse,
+    'resolveToConfig': true,
+  });
+  expectSuccess(auctionResult);
+  createAndNavigateFencedFrame(test, auctionResult);
+  await waitForObservedRequests(uuid, [adA]);
+}, 'Basic B&A auction - nonces');
+
+subsetTest(promise_test, async test => {
+  const uuid = generateUuid(test);
+  const adA = createTrackerURL(window.location.origin, uuid, 'track_get', 'a');
+  const adB = createTrackerURL(window.location.origin, uuid, 'track_get', 'b');
+  const adsArray =
+      [{renderURL: adA, adRenderId: 'a'}, {renderURL: adB, adRenderId: 'b'}];
+  await joinInterestGroup(test, uuid, {ads: adsArray});
+
+  const result = await navigator.getInterestGroupAdAuctionData({
+    coordinatorOrigin: await BA.configureCoordinator(),
+    seller: window.location.origin
+  });
+  assert_true(result.requestId !== null);
+  assert_true(result.request.length > 0);
+
+  let decoded = await BA.decodeInterestGroupData(result.request);
+
+  let serverResponseMsg = {
+    'biddingGroups': {},
+    'adRenderURL': adsArray[0].renderURL,
+    'interestGroupName': DEFAULT_INTEREST_GROUP_NAME,
+    'interestGroupOwner': window.location.origin,
+  };
+  serverResponseMsg.biddingGroups[window.location.origin] = [0];
+
+  let serverResponse =
+      await BA.encodeServerResponse(serverResponseMsg, decoded);
+
+  let auctionResult = await navigator.runAdAuction({
+    'seller': window.location.origin,
+    'requestId': result.requestId,
+    'serverResponse': serverResponse,
+    'resolveToConfig': true,
+  });
+  expectNoWinner(auctionResult);
+}, 'Basic B&A auction - not authorized');
+
+subsetTest(promise_test, async test => {
+  const uuid = generateUuid(test);
+  const adA = createTrackerURL(window.location.origin, uuid, 'track_get', 'a');
+  const adB = createTrackerURL(window.location.origin, uuid, 'track_get', 'b');
+  const adsArray =
+      [{renderURL: adA, adRenderId: 'a'}, {renderURL: adB, adRenderId: 'b'}];
+  await joinInterestGroup(test, uuid, {ads: adsArray});
+
+  const result = await navigator.getInterestGroupAdAuctionData({
+    coordinatorOrigin: await BA.configureCoordinator(),
+    seller: window.location.origin
+  });
+  assert_true(result.requestId !== null);
+  assert_true(result.request.length > 0);
+
+  let decoded = await BA.decodeInterestGroupData(result.request);
+
   const trackSeller = createSellerReportURL(uuid);
   const trackBuyer = createBidderReportURL(uuid);
   // This one should still work since the server may have run an auction with
diff --git a/third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window_1-4-expected.txt b/third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window_1-6-expected.txt
similarity index 68%
rename from third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window_1-4-expected.txt
rename to third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window_1-6-expected.txt
index ad6191d3..26a131c 100644
--- a/third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window_1-4-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window_1-6-expected.txt
@@ -1,6 +1,10 @@
 This is a testharness.js-based test.
 [FAIL] Basic B&A auction
   promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'getInterestGroupAdAuctionData' on 'Navigator': Invalid Coordinator"
+[FAIL] Basic B&A auction - nonces
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'getInterestGroupAdAuctionData' on 'Navigator': Invalid Coordinator"
+[FAIL] Basic B&A auction - not authorized
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'getInterestGroupAdAuctionData' on 'Navigator': Invalid Coordinator"
 [FAIL] Basic B&A auction with reporting URLs
   promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'getInterestGroupAdAuctionData' on 'Navigator': Invalid Coordinator"
 [FAIL] Hybrid B&A auction
diff --git a/third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window_9-12-expected.txt b/third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window_11-14-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window_9-12-expected.txt
rename to third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window_11-14-expected.txt
diff --git a/third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window_13-16-expected.txt b/third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window_15-18-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window_13-16-expected.txt
rename to third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window_15-18-expected.txt
diff --git a/third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window_17-20-expected.txt b/third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window_19-22-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window_17-20-expected.txt
rename to third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window_19-22-expected.txt
diff --git a/third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window_21-24-expected.txt b/third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window_23-26-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window_21-24-expected.txt
rename to third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window_23-26-expected.txt
diff --git a/third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window_25-28-expected.txt b/third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window_27-30-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window_25-28-expected.txt
rename to third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window_27-30-expected.txt
diff --git a/third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window_29-32-expected.txt b/third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window_31-34-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window_29-32-expected.txt
rename to third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window_31-34-expected.txt
diff --git a/third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window_33-36-expected.txt b/third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window_35-38-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window_33-36-expected.txt
rename to third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window_35-38-expected.txt
diff --git a/third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window_37-40-expected.txt b/third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window_39-42-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window_37-40-expected.txt
rename to third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window_39-42-expected.txt
diff --git a/third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window_41-44-expected.txt b/third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window_43-46-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window_41-44-expected.txt
rename to third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window_43-46-expected.txt
diff --git a/third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window_45-48-expected.txt b/third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window_47-50-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window_45-48-expected.txt
rename to third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window_47-50-expected.txt
diff --git a/third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window_49-52-expected.txt b/third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window_51-54-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window_49-52-expected.txt
rename to third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window_51-54-expected.txt
diff --git a/third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window_53-56-expected.txt b/third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window_55-58-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window_53-56-expected.txt
rename to third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window_55-58-expected.txt
diff --git a/third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window_57-60-expected.txt b/third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window_59-62-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window_57-60-expected.txt
rename to third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window_59-62-expected.txt
diff --git a/third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window_61-64-expected.txt b/third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window_63-66-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window_61-64-expected.txt
rename to third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window_63-66-expected.txt
diff --git a/third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window_5-8-expected.txt b/third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window_7-10-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window_5-8-expected.txt
rename to third_party/blink/web_tests/external/wpt/fledge/tentative/server-response.https.window_7-10-expected.txt
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-select-element/customizable-select/resources/customizable-select-styles.css b/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-select-element/customizable-select/resources/customizable-select-styles.css
index a6a2736..4f9f7cba 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-select-element/customizable-select/resources/customizable-select-styles.css
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-select-element/customizable-select/resources/customizable-select-styles.css
@@ -7,6 +7,9 @@
 }
 
 .customizable-select-popover {
+  position: fixed;
+  width: fit-content;
+  height: fit-content;
   box-sizing: border-box;
   border: 1px solid;
   padding: 0;
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-select-element/customizable-select/resources/customizable-select-utils.js b/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-select-element/customizable-select/resources/customizable-select-utils.js
index ed3f964..9b72b8b 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-select-element/customizable-select/resources/customizable-select-utils.js
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-select-element/customizable-select/resources/customizable-select-utils.js
@@ -6,3 +6,20 @@
       </svg>`;
   });
 }
+
+function clickSelectAndCaptureAppearance(select) {
+  if (document.documentElement.className !== 'reftest-wait') {
+    document.body.append('FAIL - html element needs reftest-wait');
+    return;
+  }
+  (async () => {
+    const select = document.querySelector('select');
+    await (new test_driver.Actions())
+      .pointerMove(1, 1, {origin: select})
+      .pointerDown()
+      .pointerUp()
+      .pointerMove(0, 0, {origin: document.body})
+      .send();
+    document.documentElement.classList.remove('reftest-wait');
+  })();
+}
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-select-element/customizable-select/select-appearance-button-after-option-ref.html b/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-select-element/customizable-select/select-appearance-button-after-option-ref.html
new file mode 100644
index 0000000..74dd6e9
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-select-element/customizable-select/select-appearance-button-after-option-ref.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<link rel=stylesheet href="resources/customizable-select-styles.css">
+
+<div class=customizable-select-button>
+  <span class=customizable-select-selectedcontent>option 1</span>
+</div>
+<div class=customizable-select-popover>
+  <div class="customizable-select-option selected">option 1</div>
+  <button>Hello option 1</button>
+  <div class=customizable-select-option>option 2</div>
+</div>
+
+<style>
+.customizable-select-button {
+  anchor-name: --select;
+}
+.customizable-select-popover {
+  position-anchor: --select;
+}
+</style>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-select-element/customizable-select/select-appearance-button-after-option.tentative.html b/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-select-element/customizable-select/select-appearance-button-after-option.tentative.html
new file mode 100644
index 0000000..967484f
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-select-element/customizable-select/select-appearance-button-after-option.tentative.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html class=reftest-wait>
+<meta name=fuzzy content="maxDifference=0-100;totalPixels=0-50">
+<link rel=author href="mailto:masonf@chromium.org">
+<link rel=match href="select-appearance-button-after-option-ref.html">
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/resources/testdriver-actions.js"></script>
+<script src="resources/customizable-select-utils.js"></script>
+
+<style>
+select, ::picker(select) {
+  appearance: base-select;
+}
+</style>
+
+<select>
+  <option>option 1</option>
+  <button>Hello <selectedcontent></selectedcontent></button>
+  <option>option 2</option>
+</select>
+
+<script>
+clickSelectAndCaptureAppearance();
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-select-element/customizable-select/select-appearance-button-after-span-ref.html b/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-select-element/customizable-select/select-appearance-button-after-span-ref.html
new file mode 100644
index 0000000..97ca33f
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-select-element/customizable-select/select-appearance-button-after-span-ref.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<link rel=stylesheet href="resources/customizable-select-styles.css">
+
+<div class=customizable-select-button>
+  <span class=customizable-select-selectedcontent>option 1</span>
+</div>
+<div class=customizable-select-popover>
+  Hello <button>Hello option 1</button>
+  <div class="customizable-select-option selected">option 1</div>
+  <div class=customizable-select-option>option 2</div>
+</div>
+
+<style>
+  .customizable-select-button {
+    anchor-name: --select;
+  }
+  .customizable-select-popover {
+    position-anchor: --select;
+  }
+  </style>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-select-element/customizable-select/select-appearance-button-after-span.tentative.html b/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-select-element/customizable-select/select-appearance-button-after-span.tentative.html
new file mode 100644
index 0000000..ea4499b
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-select-element/customizable-select/select-appearance-button-after-span.tentative.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<html class=reftest-wait>
+<meta name=fuzzy content="maxDifference=0-100;totalPixels=0-50">
+<link rel=author href="mailto:masonf@chromium.org">
+<link rel=match href="select-appearance-button-after-span-ref.html">
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/resources/testdriver-actions.js"></script>
+<script src="resources/customizable-select-utils.js"></script>
+
+<style>
+select, ::picker(select) {
+  appearance: base-select;
+}
+</style>
+
+<select>
+  <span>Hello</span>
+  <button>Hello <selectedcontent></selectedcontent></button>
+  <option>option 1</option>
+  <option>option 2</option>
+</select>
+
+<script>
+clickSelectAndCaptureAppearance();
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-select-element/customizable-select/select-appearance-button-after-text-ref.html b/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-select-element/customizable-select/select-appearance-button-after-text-ref.html
new file mode 100644
index 0000000..f5e877b
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-select-element/customizable-select/select-appearance-button-after-text-ref.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<link rel=stylesheet href="resources/customizable-select-styles.css">
+
+<div class=customizable-select-button>
+  Hello <span class=customizable-select-selectedcontent>option 1</span>
+</div>
+<div class=customizable-select-popover>
+  Hello
+  <div class="customizable-select-option selected">option 1</div>
+  <div class=customizable-select-option>option 2</div>
+</div>
+
+<style>
+  .customizable-select-button {
+    anchor-name: --select;
+  }
+  .customizable-select-popover {
+    position-anchor: --select;
+  }
+  </style>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-select-element/customizable-select/select-appearance-button-after-text.tentative.html b/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-select-element/customizable-select/select-appearance-button-after-text.tentative.html
new file mode 100644
index 0000000..ea11307b
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-select-element/customizable-select/select-appearance-button-after-text.tentative.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<html class=reftest-wait>
+<meta name=fuzzy content="maxDifference=0-100;totalPixels=0-50">
+<link rel=author href="mailto:masonf@chromium.org">
+<link rel=match href="select-appearance-button-after-text-ref.html">
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/resources/testdriver-actions.js"></script>
+<script src="resources/customizable-select-utils.js"></script>
+
+<style>
+select, ::picker(select) {
+  appearance: base-select;
+}
+</style>
+
+<select>
+  Hello
+  <button>Hello <selectedcontent></selectedcontent></button>
+  <option>option 1</option>
+  <option>option 2</option>
+</select>
+
+<script>
+clickSelectAndCaptureAppearance();
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-select-element/customizable-select/switch-picker-appearance.tentative-expected.txt b/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-select-element/customizable-select/switch-picker-appearance.tentative-expected.txt
deleted file mode 100644
index 8cdb454e..0000000
--- a/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-select-element/customizable-select/switch-picker-appearance.tentative-expected.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-This is a testharness.js-based test.
-[FAIL] Basic functionality of select picker with appearance:auto
-  assert_equals: expected "none" but got "base-select"
-[FAIL] Basic functionality of select picker with appearance:none
-  assert_equals: expected "none" but got "base-select"
-[FAIL] Switching appearance in popover-open should close the picker
-  assert_equals: expected "none" but got "base-select"
-[FAIL] Switching appearance in JS after picker is open should close the picker
-  assert_equals: expected "none" but got "base-select"
-[FAIL] The select picker is closed if the <select> appearance value is changed via CSS while the picker is open
-  assert_false: picker should get closed when the appearance value changes expected false got true
-[FAIL] The select picker is closed if the ::picker() appearance value is changed via CSS while the picker is open
-  assert_false: setup expected false got true
-[FAIL] The select picker is closed if the <select> inline appearance value is changed while the picker is open
-  assert_false: setup expected false got true
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-select-element/customizable-select/switch-picker-appearance.tentative.html b/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-select-element/customizable-select/switch-picker-appearance.tentative.html
index 75cb63f..09bea44 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-select-element/customizable-select/switch-picker-appearance.tentative.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-select-element/customizable-select/switch-picker-appearance.tentative.html
@@ -14,10 +14,10 @@
 </select>
 
 <style>
-  select#test1::picker(select) {
+  #test1::picker(select) {
     background-color: red;
   }
-  select#test1::picker(select):popover-open {
+  #test1::picker(select):popover-open {
     background-color: green;
   }
 </style>
@@ -33,7 +33,7 @@
   t.add_cleanup(() => style.remove());
   assert_equals(getComputedStyle(select1,'::picker(select)').appearance,'none');
   assert_equals(getComputedStyle(select1,'::picker(select)').backgroundColor,red);
-  style.innerHTML = '::picker(select) {appearance: base-select}';
+  style.innerHTML = '#test1::picker(select) {appearance: base-select}';
   assert_equals(getComputedStyle(select1,'::picker(select)').appearance,'base-select');
   assert_equals(getComputedStyle(select1,'::picker(select)').backgroundColor,red,'still closed, so popover-open doesn\'t match');
 
@@ -57,7 +57,7 @@
   document.head.append(style);
   t.add_cleanup(() => style.remove());
   assert_equals(getComputedStyle(select1,'::picker(select)').appearance,'none');
-  style.innerHTML = '::picker(select) {appearance: auto}';
+  style.innerHTML = '#test1::picker(select) {appearance: auto}';
   assert_equals(getComputedStyle(select1,'::picker(select)').appearance,'auto');
   await test_driver.bless('showPicker');
   select1.showPicker();
@@ -72,7 +72,7 @@
   document.head.append(style);
   t.add_cleanup(() => style.remove());
   assert_equals(getComputedStyle(select1,'::picker(select)').appearance,'none');
-  style.innerHTML = '::picker(select) {appearance: none}';
+  style.innerHTML = '#test1::picker(select) {appearance: none}';
   assert_equals(getComputedStyle(select1,'::picker(select)').appearance,'none');
   await test_driver.bless('showPicker');
   select1.showPicker();
@@ -88,8 +88,8 @@
   t.add_cleanup(() => style.remove());
   assert_equals(getComputedStyle(select1,'::picker(select)').appearance,'none');
   style.innerHTML = `
-    ::picker(select) {appearance: base-select}
-    ::picker(select):popover-open {appearance: auto}
+    #test1::picker(select) {appearance: base-select}
+    #test1::picker(select):popover-open {appearance: auto}
     `;
   assert_equals(getComputedStyle(select1,'::picker(select)').appearance,'base-select');
   await test_driver.bless('showPicker');
@@ -109,18 +109,17 @@
   document.head.append(style);
   t.add_cleanup(() => style.remove());
   assert_equals(getComputedStyle(select1,'::picker(select)').appearance,'none');
-  style.innerHTML = '::picker(select) {appearance: none}';
+  style.innerHTML = '#test1::picker(select) {appearance: base-select}';
   assert_equals(getComputedStyle(select1,'::picker(select)').appearance,'base-select');
   await test_driver.bless('showPicker');
   select1.showPicker();
   assert_true(select1.matches(':open'));
   style.remove();
-  assert_false(select1.matches(':open'),'changing appearance while the picker is open should close it');
   assert_equals(getComputedStyle(select1,'::picker(select)').appearance,'none');
+  assert_false(select1.matches(':open'),'changing appearance while the picker is open should close it');
 }, 'Switching appearance in JS after picker is open should close the picker');
 </script>
 
-
 <button id=reset>Reset</button>
 <select id=test2>
   <button><selectedcontent></selectedcontent></button>
@@ -130,13 +129,13 @@
 </select>
 
 <style>
-  select#test2, ::picker(select) {
+  #test2, #test2::picker(select) {
     appearance: base-select;
   }
-  select#test2.controlswitch:open {
+  #test2.controlswitch:open {
     appearance: auto;
   }
-  select#test2.pickerswitch:open::picker(select) {
+  #test2.pickerswitch:open::picker(select) {
     appearance: auto;
   }
   </style>
@@ -200,7 +199,7 @@
   assert_equals(getComputedStyle(select2).appearance,'base-select');
   t.add_cleanup(() => select2.removeAttribute('style'));
   select2.setAttribute('style','appearance:auto');
-  assert_false(select2.matches(':open'),'Adding inline style should close the picker');
   assert_equals(getComputedStyle(select2).appearance,'auto','appearance should still be auto from inline style');
+  assert_false(select2.matches(':open'),'Adding inline style should close the picker');
 },'The select picker is closed if the <select> inline appearance value is changed while the picker is open');
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/touch-events/single-touch.html b/third_party/blink/web_tests/external/wpt/touch-events/single-touch.html
index 002be074..57c5cdd 100644
--- a/third_party/blink/web_tests/external/wpt/touch-events/single-touch.html
+++ b/third_party/blink/web_tests/external/wpt/touch-events/single-touch.html
@@ -332,6 +332,11 @@
     }
 
     async function run() {
+      // Some user-agents require a brief waiting period before input can be
+      // processed correctly.
+      await new Promise(resolve => {
+        requestAnimationFrame(() => requestAnimationFrame(resolve));
+      });
       const target0 = document.getElementById("target0");
       const target1 = document.getElementById("target1");
       const doneButton = document.getElementById('done');
diff --git a/third_party/blink/web_tests/platform/win/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/equal.https.any.worker_cpu-expected.txt b/third_party/blink/web_tests/platform/win/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/equal.https.any.worker_cpu-expected.txt
new file mode 100644
index 0000000..161043b
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/equal.https.any.worker_cpu-expected.txt
@@ -0,0 +1,7 @@
+This is a testharness.js-based test.
+[FAIL] equal float32 5D tensors
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'equal' on 'MLGraphBuilder': Unsupported rank 5 for argument a (must be at most 4)."
+[FAIL] equal float16 5D tensors
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'equal' on 'MLGraphBuilder': Unsupported rank 5 for argument a (must be at most 4)."
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/win/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/equal.https.any_cpu-expected.txt b/third_party/blink/web_tests/platform/win/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/equal.https.any_cpu-expected.txt
new file mode 100644
index 0000000..161043b
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/equal.https.any_cpu-expected.txt
@@ -0,0 +1,7 @@
+This is a testharness.js-based test.
+[FAIL] equal float32 5D tensors
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'equal' on 'MLGraphBuilder': Unsupported rank 5 for argument a (must be at most 4)."
+[FAIL] equal float16 5D tensors
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'equal' on 'MLGraphBuilder': Unsupported rank 5 for argument a (must be at most 4)."
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/win/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/greater.https.any.worker_cpu-expected.txt b/third_party/blink/web_tests/platform/win/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/greater.https.any.worker_cpu-expected.txt
new file mode 100644
index 0000000..a0c14dc
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/greater.https.any.worker_cpu-expected.txt
@@ -0,0 +1,7 @@
+This is a testharness.js-based test.
+[FAIL] greater float32 5D tensors
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'greater' on 'MLGraphBuilder': Unsupported rank 5 for argument a (must be at most 4)."
+[FAIL] greater float16 5D tensors
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'greater' on 'MLGraphBuilder': Unsupported rank 5 for argument a (must be at most 4)."
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/win/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/greater.https.any_cpu-expected.txt b/third_party/blink/web_tests/platform/win/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/greater.https.any_cpu-expected.txt
new file mode 100644
index 0000000..a0c14dc
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/greater.https.any_cpu-expected.txt
@@ -0,0 +1,7 @@
+This is a testharness.js-based test.
+[FAIL] greater float32 5D tensors
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'greater' on 'MLGraphBuilder': Unsupported rank 5 for argument a (must be at most 4)."
+[FAIL] greater float16 5D tensors
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'greater' on 'MLGraphBuilder': Unsupported rank 5 for argument a (must be at most 4)."
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/win/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/greater_or_equal.https.any.worker_cpu-expected.txt b/third_party/blink/web_tests/platform/win/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/greater_or_equal.https.any.worker_cpu-expected.txt
new file mode 100644
index 0000000..89a23ab
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/greater_or_equal.https.any.worker_cpu-expected.txt
@@ -0,0 +1,7 @@
+This is a testharness.js-based test.
+[FAIL] greaterOrEqual float32 5D tensors
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'greaterOrEqual' on 'MLGraphBuilder': Unsupported rank 5 for argument a (must be at most 4)."
+[FAIL] greaterOrEqual float16 5D tensors
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'greaterOrEqual' on 'MLGraphBuilder': Unsupported rank 5 for argument a (must be at most 4)."
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/win/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/greater_or_equal.https.any_cpu-expected.txt b/third_party/blink/web_tests/platform/win/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/greater_or_equal.https.any_cpu-expected.txt
new file mode 100644
index 0000000..89a23ab
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/greater_or_equal.https.any_cpu-expected.txt
@@ -0,0 +1,7 @@
+This is a testharness.js-based test.
+[FAIL] greaterOrEqual float32 5D tensors
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'greaterOrEqual' on 'MLGraphBuilder': Unsupported rank 5 for argument a (must be at most 4)."
+[FAIL] greaterOrEqual float16 5D tensors
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'greaterOrEqual' on 'MLGraphBuilder': Unsupported rank 5 for argument a (must be at most 4)."
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/win/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/lesser.https.any.worker_cpu-expected.txt b/third_party/blink/web_tests/platform/win/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/lesser.https.any.worker_cpu-expected.txt
new file mode 100644
index 0000000..47a8d2d
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/lesser.https.any.worker_cpu-expected.txt
@@ -0,0 +1,7 @@
+This is a testharness.js-based test.
+[FAIL] lesser float32 5D tensors
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'lesser' on 'MLGraphBuilder': Unsupported rank 5 for argument a (must be at most 4)."
+[FAIL] lesser float16 5D tensors
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'lesser' on 'MLGraphBuilder': Unsupported rank 5 for argument a (must be at most 4)."
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/win/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/lesser.https.any_cpu-expected.txt b/third_party/blink/web_tests/platform/win/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/lesser.https.any_cpu-expected.txt
new file mode 100644
index 0000000..47a8d2d
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/lesser.https.any_cpu-expected.txt
@@ -0,0 +1,7 @@
+This is a testharness.js-based test.
+[FAIL] lesser float32 5D tensors
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'lesser' on 'MLGraphBuilder': Unsupported rank 5 for argument a (must be at most 4)."
+[FAIL] lesser float16 5D tensors
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'lesser' on 'MLGraphBuilder': Unsupported rank 5 for argument a (must be at most 4)."
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/win/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/lesser_or_equal.https.any.worker_cpu-expected.txt b/third_party/blink/web_tests/platform/win/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/lesser_or_equal.https.any.worker_cpu-expected.txt
new file mode 100644
index 0000000..7eee30b
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/lesser_or_equal.https.any.worker_cpu-expected.txt
@@ -0,0 +1,7 @@
+This is a testharness.js-based test.
+[FAIL] lesserOrEqual float32 5D tensors
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'lesserOrEqual' on 'MLGraphBuilder': Unsupported rank 5 for argument a (must be at most 4)."
+[FAIL] lesserOrEqual float16 5D tensors
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'lesserOrEqual' on 'MLGraphBuilder': Unsupported rank 5 for argument a (must be at most 4)."
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/win/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/lesser_or_equal.https.any_cpu-expected.txt b/third_party/blink/web_tests/platform/win/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/lesser_or_equal.https.any_cpu-expected.txt
new file mode 100644
index 0000000..7eee30b
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/lesser_or_equal.https.any_cpu-expected.txt
@@ -0,0 +1,7 @@
+This is a testharness.js-based test.
+[FAIL] lesserOrEqual float32 5D tensors
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'lesserOrEqual' on 'MLGraphBuilder': Unsupported rank 5 for argument a (must be at most 4)."
+[FAIL] lesserOrEqual float16 5D tensors
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'lesserOrEqual' on 'MLGraphBuilder': Unsupported rank 5 for argument a (must be at most 4)."
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/win/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/logical_and.https.any.worker_cpu-expected.txt b/third_party/blink/web_tests/platform/win/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/logical_and.https.any.worker_cpu-expected.txt
new file mode 100644
index 0000000..738cd2d
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/logical_and.https.any.worker_cpu-expected.txt
@@ -0,0 +1,5 @@
+This is a testharness.js-based test.
+[FAIL] logicalAnd uint8 5D tensors
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'logicalAnd' on 'MLGraphBuilder': Unsupported rank 5 for argument a (must be at most 4)."
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/win/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/logical_and.https.any_cpu-expected.txt b/third_party/blink/web_tests/platform/win/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/logical_and.https.any_cpu-expected.txt
new file mode 100644
index 0000000..738cd2d
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/logical_and.https.any_cpu-expected.txt
@@ -0,0 +1,5 @@
+This is a testharness.js-based test.
+[FAIL] logicalAnd uint8 5D tensors
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'logicalAnd' on 'MLGraphBuilder': Unsupported rank 5 for argument a (must be at most 4)."
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/win/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/logical_or.https.any.worker_cpu-expected.txt b/third_party/blink/web_tests/platform/win/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/logical_or.https.any.worker_cpu-expected.txt
new file mode 100644
index 0000000..8501d44
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/logical_or.https.any.worker_cpu-expected.txt
@@ -0,0 +1,5 @@
+This is a testharness.js-based test.
+[FAIL] logicalOr uint8 5D tensors
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'logicalOr' on 'MLGraphBuilder': Unsupported rank 5 for argument a (must be at most 4)."
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/win/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/logical_or.https.any_cpu-expected.txt b/third_party/blink/web_tests/platform/win/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/logical_or.https.any_cpu-expected.txt
new file mode 100644
index 0000000..8501d44
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/logical_or.https.any_cpu-expected.txt
@@ -0,0 +1,5 @@
+This is a testharness.js-based test.
+[FAIL] logicalOr uint8 5D tensors
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'logicalOr' on 'MLGraphBuilder': Unsupported rank 5 for argument a (must be at most 4)."
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/win/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/logical_xor.https.any.worker_cpu-expected.txt b/third_party/blink/web_tests/platform/win/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/logical_xor.https.any.worker_cpu-expected.txt
new file mode 100644
index 0000000..e8584d4
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/logical_xor.https.any.worker_cpu-expected.txt
@@ -0,0 +1,5 @@
+This is a testharness.js-based test.
+[FAIL] logicalXor uint8 5D tensors
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'logicalXor' on 'MLGraphBuilder': Unsupported rank 5 for argument a (must be at most 4)."
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/win/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/logical_xor.https.any_cpu-expected.txt b/third_party/blink/web_tests/platform/win/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/logical_xor.https.any_cpu-expected.txt
new file mode 100644
index 0000000..e8584d4
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/logical_xor.https.any_cpu-expected.txt
@@ -0,0 +1,5 @@
+This is a testharness.js-based test.
+[FAIL] logicalXor uint8 5D tensors
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'logicalXor' on 'MLGraphBuilder': Unsupported rank 5 for argument a (must be at most 4)."
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/win/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/pow.https.any.worker_cpu-expected.txt b/third_party/blink/web_tests/platform/win/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/pow.https.any.worker_cpu-expected.txt
new file mode 100644
index 0000000..bd83e6fe
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/pow.https.any.worker_cpu-expected.txt
@@ -0,0 +1,5 @@
+This is a testharness.js-based test.
+[FAIL] pow float32 5D base tensor and 5D integer exponent tensor
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'pow' on 'MLGraphBuilder': Unsupported rank 5 for argument a (must be at most 4)."
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/win/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/pow.https.any_cpu-expected.txt b/third_party/blink/web_tests/platform/win/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/pow.https.any_cpu-expected.txt
new file mode 100644
index 0000000..bd83e6fe
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/pow.https.any_cpu-expected.txt
@@ -0,0 +1,5 @@
+This is a testharness.js-based test.
+[FAIL] pow float32 5D base tensor and 5D integer exponent tensor
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'pow' on 'MLGraphBuilder': Unsupported rank 5 for argument a (must be at most 4)."
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/win11-arm64/external/wpt/speech-api/SpeechRecognition-onerror.https-expected.txt b/third_party/blink/web_tests/platform/win11-arm64/external/wpt/speech-api/SpeechRecognition-onerror.https-expected.txt
deleted file mode 100644
index d2797e60..0000000
--- a/third_party/blink/web_tests/platform/win11-arm64/external/wpt/speech-api/SpeechRecognition-onerror.https-expected.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-This is a testharness.js-based test.
-Harness Error. harness_status.status = 1 , harness_status.message = Uncaught Error: assert_equals: expected "network" but got "audio-capture"
-[TIMEOUT] Speech recognition onerror event is called.
-  Test timed out
-Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_1-4-expected.txt b/third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_1-6-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_1-4-expected.txt
rename to third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_1-6-expected.txt
diff --git a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_1-4-expected.txt b/third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_11-14-expected.txt
similarity index 100%
copy from third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_1-4-expected.txt
copy to third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_11-14-expected.txt
diff --git a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_25-28-expected.txt b/third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_15-18-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_25-28-expected.txt
rename to third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_15-18-expected.txt
diff --git a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_29-32-expected.txt b/third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_19-22-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_29-32-expected.txt
rename to third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_19-22-expected.txt
diff --git a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_21-24-expected.txt b/third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_21-24-expected.txt
deleted file mode 100644
index d2490db..0000000
--- a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_21-24-expected.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-This is a testharness.js-based test.
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_13-16-expected.txt b/third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_23-26-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_13-16-expected.txt
rename to third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_23-26-expected.txt
diff --git a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_17-20-expected.txt b/third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_27-30-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_17-20-expected.txt
rename to third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_27-30-expected.txt
diff --git a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_1-4-expected.txt b/third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_31-34-expected.txt
similarity index 100%
copy from third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_1-4-expected.txt
copy to third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_31-34-expected.txt
diff --git a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_33-36-expected.txt b/third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_33-36-expected.txt
deleted file mode 100644
index d2490db..0000000
--- a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_33-36-expected.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-This is a testharness.js-based test.
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_25-28-expected.txt b/third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_35-38-expected.txt
similarity index 100%
copy from third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_25-28-expected.txt
copy to third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_35-38-expected.txt
diff --git a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_37-40-expected.txt b/third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_37-40-expected.txt
deleted file mode 100644
index d2490db..0000000
--- a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_37-40-expected.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-This is a testharness.js-based test.
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_29-32-expected.txt b/third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_39-42-expected.txt
similarity index 100%
copy from third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_29-32-expected.txt
copy to third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_39-42-expected.txt
diff --git a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_41-44-expected.txt b/third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_43-46-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_41-44-expected.txt
rename to third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_43-46-expected.txt
diff --git a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_45-48-expected.txt b/third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_47-50-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_45-48-expected.txt
rename to third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_47-50-expected.txt
diff --git a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_49-52-expected.txt b/third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_49-52-expected.txt
deleted file mode 100644
index d2490db..0000000
--- a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_49-52-expected.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-This is a testharness.js-based test.
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_5-8-expected.txt b/third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_5-8-expected.txt
deleted file mode 100644
index d2490db..0000000
--- a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_5-8-expected.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-This is a testharness.js-based test.
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_1-4-expected.txt b/third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_51-54-expected.txt
similarity index 100%
copy from third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_1-4-expected.txt
copy to third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_51-54-expected.txt
diff --git a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_53-56-expected.txt b/third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_53-56-expected.txt
deleted file mode 100644
index d2490db..0000000
--- a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_53-56-expected.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-This is a testharness.js-based test.
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_25-28-expected.txt b/third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_55-58-expected.txt
similarity index 100%
copy from third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_25-28-expected.txt
copy to third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_55-58-expected.txt
diff --git a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_57-60-expected.txt b/third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_57-60-expected.txt
deleted file mode 100644
index d2490db..0000000
--- a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_57-60-expected.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-This is a testharness.js-based test.
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_29-32-expected.txt b/third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_59-62-expected.txt
similarity index 100%
copy from third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_29-32-expected.txt
copy to third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_59-62-expected.txt
diff --git a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_61-64-expected.txt b/third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_61-64-expected.txt
deleted file mode 100644
index d2490db..0000000
--- a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_61-64-expected.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-This is a testharness.js-based test.
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_13-16-expected.txt b/third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_63-66-expected.txt
similarity index 100%
copy from third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_13-16-expected.txt
copy to third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_63-66-expected.txt
diff --git a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_1-4-expected.txt b/third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_7-10-expected.txt
similarity index 100%
copy from third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_1-4-expected.txt
copy to third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_7-10-expected.txt
diff --git a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_9-12-expected.txt b/third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_9-12-expected.txt
deleted file mode 100644
index d2490db..0000000
--- a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction-kanonymity/external/wpt/fledge/tentative/server-response.https.window_9-12-expected.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-This is a testharness.js-based test.
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_1-4-expected.txt b/third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_1-6-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_1-4-expected.txt
rename to third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_1-6-expected.txt
diff --git a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_1-4-expected.txt b/third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_11-14-expected.txt
similarity index 100%
copy from third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_1-4-expected.txt
copy to third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_11-14-expected.txt
diff --git a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_25-28-expected.txt b/third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_15-18-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_25-28-expected.txt
rename to third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_15-18-expected.txt
diff --git a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_29-32-expected.txt b/third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_19-22-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_29-32-expected.txt
rename to third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_19-22-expected.txt
diff --git a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_21-24-expected.txt b/third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_21-24-expected.txt
deleted file mode 100644
index d2490db..0000000
--- a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_21-24-expected.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-This is a testharness.js-based test.
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_13-16-expected.txt b/third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_23-26-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_13-16-expected.txt
rename to third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_23-26-expected.txt
diff --git a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_17-20-expected.txt b/third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_27-30-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_17-20-expected.txt
rename to third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_27-30-expected.txt
diff --git a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_1-4-expected.txt b/third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_31-34-expected.txt
similarity index 100%
copy from third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_1-4-expected.txt
copy to third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_31-34-expected.txt
diff --git a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_33-36-expected.txt b/third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_33-36-expected.txt
deleted file mode 100644
index d2490db..0000000
--- a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_33-36-expected.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-This is a testharness.js-based test.
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_25-28-expected.txt b/third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_35-38-expected.txt
similarity index 100%
copy from third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_25-28-expected.txt
copy to third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_35-38-expected.txt
diff --git a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_37-40-expected.txt b/third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_37-40-expected.txt
deleted file mode 100644
index d2490db..0000000
--- a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_37-40-expected.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-This is a testharness.js-based test.
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_29-32-expected.txt b/third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_39-42-expected.txt
similarity index 100%
copy from third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_29-32-expected.txt
copy to third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_39-42-expected.txt
diff --git a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_41-44-expected.txt b/third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_41-44-expected.txt
deleted file mode 100644
index d2490db..0000000
--- a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_41-44-expected.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-This is a testharness.js-based test.
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_13-16-expected.txt b/third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_43-46-expected.txt
similarity index 100%
copy from third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_13-16-expected.txt
copy to third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_43-46-expected.txt
diff --git a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_45-48-expected.txt b/third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_45-48-expected.txt
deleted file mode 100644
index d2490db..0000000
--- a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_45-48-expected.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-This is a testharness.js-based test.
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_17-20-expected.txt b/third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_47-50-expected.txt
similarity index 100%
copy from third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_17-20-expected.txt
copy to third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_47-50-expected.txt
diff --git a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_49-52-expected.txt b/third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_49-52-expected.txt
deleted file mode 100644
index d2490db..0000000
--- a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_49-52-expected.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-This is a testharness.js-based test.
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_5-8-expected.txt b/third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_5-8-expected.txt
deleted file mode 100644
index d2490db..0000000
--- a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_5-8-expected.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-This is a testharness.js-based test.
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_1-4-expected.txt b/third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_51-54-expected.txt
similarity index 100%
copy from third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_1-4-expected.txt
copy to third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_51-54-expected.txt
diff --git a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_53-56-expected.txt b/third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_55-58-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_53-56-expected.txt
rename to third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_55-58-expected.txt
diff --git a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_57-60-expected.txt b/third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_57-60-expected.txt
deleted file mode 100644
index d2490db..0000000
--- a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_57-60-expected.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-This is a testharness.js-based test.
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_29-32-expected.txt b/third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_59-62-expected.txt
similarity index 100%
copy from third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_29-32-expected.txt
copy to third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_59-62-expected.txt
diff --git a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_61-64-expected.txt b/third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_61-64-expected.txt
deleted file mode 100644
index d2490db..0000000
--- a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_61-64-expected.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-This is a testharness.js-based test.
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_13-16-expected.txt b/third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_63-66-expected.txt
similarity index 100%
copy from third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_13-16-expected.txt
copy to third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_63-66-expected.txt
diff --git a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_1-4-expected.txt b/third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_7-10-expected.txt
similarity index 100%
copy from third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_1-4-expected.txt
copy to third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_7-10-expected.txt
diff --git a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_9-12-expected.txt b/third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_9-12-expected.txt
deleted file mode 100644
index d2490db..0000000
--- a/third_party/blink/web_tests/virtual/fledge-bidding-and-auction/external/wpt/fledge/tentative/server-response.https.window_9-12-expected.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-This is a testharness.js-based test.
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/webexposed/css-properties-as-js-properties-expected.txt b/third_party/blink/web_tests/webexposed/css-properties-as-js-properties-expected.txt
index f665fd1..6ca754d7 100644
--- a/third_party/blink/web_tests/webexposed/css-properties-as-js-properties-expected.txt
+++ b/third_party/blink/web_tests/webexposed/css-properties-as-js-properties-expected.txt
@@ -289,6 +289,7 @@
 maskType
 masonryDirection
 masonryFill
+masonryFlow
 masonrySlack
 masonryTemplateTracks
 masonryTrack
diff --git a/third_party/blink/web_tests/webexposed/css-property-listing-expected.txt b/third_party/blink/web_tests/webexposed/css-property-listing-expected.txt
index a6e5e5c..68891c94 100644
--- a/third_party/blink/web_tests/webexposed/css-property-listing-expected.txt
+++ b/third_party/blink/web_tests/webexposed/css-property-listing-expected.txt
@@ -724,6 +724,9 @@
     mask-position
         -webkit-mask-position-x
         -webkit-mask-position-y
+    masonry-flow
+        masonry-direction
+        masonry-fill
     masonry-track
         masonry-track-end
         masonry-track-start
diff --git a/third_party/boringssl/src b/third_party/boringssl/src
index d777ea2..f2394d1 160000
--- a/third_party/boringssl/src
+++ b/third_party/boringssl/src
@@ -1 +1 @@
-Subproject commit d777ea2a7004ff7ef40ef983b41a5125f316f898
+Subproject commit f2394d14d81df436b263ff104eb6efc915cbdfc6
diff --git a/third_party/chromium-variations b/third_party/chromium-variations
index 59f30bf..b6808cf 160000
--- a/third_party/chromium-variations
+++ b/third_party/chromium-variations
@@ -1 +1 @@
-Subproject commit 59f30bf1d20ecefceec9e39837ab78c113b9ffb5
+Subproject commit b6808cf1ce5f192681ae7e441a6367ec681751ed
diff --git a/third_party/dawn b/third_party/dawn
index 3989b42..2b29587 160000
--- a/third_party/dawn
+++ b/third_party/dawn
@@ -1 +1 @@
-Subproject commit 3989b426db4499d4af5f6afffb5eb804c7563323
+Subproject commit 2b29587b8842709eb181a55998924d51a575dd8c
diff --git a/third_party/devtools-frontend/src b/third_party/devtools-frontend/src
index 972ab829..2a31e37 160000
--- a/third_party/devtools-frontend/src
+++ b/third_party/devtools-frontend/src
@@ -1 +1 @@
-Subproject commit 972ab829b87413bffa19e1ee476ca380c7363f79
+Subproject commit 2a31e372ea28cccb45c63fdd1639c76b50d7217e
diff --git a/third_party/freetype-testing/README.chromium b/third_party/freetype-testing/README.chromium
index e04229d..4a952af 100644
--- a/third_party/freetype-testing/README.chromium
+++ b/third_party/freetype-testing/README.chromium
@@ -1,7 +1,7 @@
 Name: FreeType-Testing
 URL: https://github.com/freetype/freetype2-testing
-Version: VER-7a69b1a2b
-Revision: 7a69b1a2b028476f840ab7d4a2ffdfe4eb2c389f
+Version: VER-f2f190f85
+Revision: f2f190f8524d68ce1ba8e848a0be4552f523d9bc
 License: GPL
 License File: LICENSE
 Security Critical: no
@@ -15,6 +15,14 @@
 reason for this repository to be included.
 
 How to update:
-1. Update the revision in this file, and the freetype-testing revision in the
-   top level Chromium DEPS file.
-2. Update BUILD.gn to reflect changes if needed.
+0. Ensure the mirror is up to date. May need to force a fetch with
+   gob-ctl repos update-mirror-config github/freetype/freetype2-testing \
+     --fetch_frequency 4h \
+     --uri https://github.com/freetype/freetype2-testing.git
+
+1. Create roll commit
+   roll-dep src/third_party/freetype-testing/src/
+
+2. Update the revision in this file.
+
+3. Update BUILD.gn to reflect changes if needed.
diff --git a/third_party/freetype-testing/src b/third_party/freetype-testing/src
index 7a69b1a..f2f190f 160000
--- a/third_party/freetype-testing/src
+++ b/third_party/freetype-testing/src
@@ -1 +1 @@
-Subproject commit 7a69b1a2b028476f840ab7d4a2ffdfe4eb2c389f
+Subproject commit f2f190f8524d68ce1ba8e848a0be4552f523d9bc
diff --git a/third_party/jni_zero/proxy.py b/third_party/jni_zero/proxy.py
index 1d61ce5a..b4b02f7 100644
--- a/third_party/jni_zero/proxy.py
+++ b/third_party/jni_zero/proxy.py
@@ -38,10 +38,10 @@
   params_list = [_muxed_type_char(t) for t in muxed_signature.param_types]
   params_part = ''
   if params_list:
-    params_part = '_' + ''.join(p for p in params_list)
+    params_part = ''.join(p for p in params_list)
 
   return_value_part = _muxed_type_char(muxed_signature.return_type)
-  return '_' + return_value_part + params_part
+  return return_value_part + params_part
 
 
 def muxed_signature(proxy_signature):
diff --git a/third_party/jni_zero/sample/BUILD.gn b/third_party/jni_zero/sample/BUILD.gn
index 717b0db9..5579999f 100644
--- a/third_party/jni_zero/sample/BUILD.gn
+++ b/third_party/jni_zero/sample/BUILD.gn
@@ -27,11 +27,7 @@
 }
 
 shared_library_with_jni("libjni_zero_sample") {
-  if (enable_jni_multiplexing) {
-    _linker_script = "sample_lib_multiplexing_version_script.txt"
-  } else {
-    _linker_script = "sample_lib_version_script.txt"
-  }
+  _linker_script = "sample_lib_version_script.txt"
   sources = [ "sample_entry_point.cc" ]
 
   deps = [
diff --git a/third_party/jni_zero/sample/sample_lib_multiplexing_version_script.txt b/third_party/jni_zero/sample/sample_lib_multiplexing_version_script.txt
deleted file mode 100644
index 5f20f67..0000000
--- a/third_party/jni_zero/sample/sample_lib_multiplexing_version_script.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-  global:
-    JNI_OnLoad;
-    Java_J_N__*;
-  local:
-    *;
-};
diff --git a/third_party/jni_zero/test/golden/testForTestingKeptMultiplexing-Final-GEN_JNI.java.golden b/third_party/jni_zero/test/golden/testForTestingKeptMultiplexing-Final-GEN_JNI.java.golden
index c7330e6d..ed208cd 100644
--- a/third_party/jni_zero/test/golden/testForTestingKeptMultiplexing-Final-GEN_JNI.java.golden
+++ b/third_party/jni_zero/test/golden/testForTestingKeptMultiplexing-Final-GEN_JNI.java.golden
@@ -6,36 +6,36 @@
 
 public class GEN_JNI {
   public static void org_jni_1zero_SampleProxyEdgeCases_fooForTest() {
-    J.N._V(0);
+    J.N.V(0);
   }
   public static void org_jni_1zero_SampleProxyEdgeCases_fooForTesting() {
-    J.N._V(1);
+    J.N.V(1);
   }
   public static void org_jni_1zero_SampleProxyEdgeCases_fooForTests() {
-    J.N._V(2);
+    J.N.V(2);
   }
   public static void org_jni_1zero_SampleProxyEdgeCases_foo__weirdly__escaped_name1() {
-    J.N._V(3);
+    J.N.V(3);
   }
   public static int org_jni_1zero_SampleProxyEdgeCases_setStringBuilder(int sb) {
-    return J.N._I_I(sb);
+    return J.N.II(sb);
   }
   public static Object org_jni_1zero_SampleProxyEdgeCases_genericsWithNestedClassArray(Object arg) {
-    return J.N._O_O(arg);
+    return J.N.OO(arg);
   }
   public static boolean org_jni_1zero_SampleProxyEdgeCases_setStringBuilder(Object sb) {
-    return J.N._Z_O(sb);
+    return J.N.ZO(sb);
   }
   public static void org_jni_1zero_SampleProxyEdgeCases_setBool(Object b, Object i) {
-    J.N._V_OO(b, i);
+    J.N.VOO(b, i);
   }
   public static int org_jni_1zero_SampleProxyEdgeCases_addStructB(Object caller, Object b) {
-    return J.N._I_OO(caller, b);
+    return J.N.IOO(caller, b);
   }
   public static Object org_jni_1zero_SampleProxyEdgeCases_arrayTypes1(Object a, Object b) {
-    return J.N._O_OO(0, a, b);
+    return J.N.OOO(0, a, b);
   }
   public static Object org_jni_1zero_SampleProxyEdgeCases_arrayTypes2(Object a, Object b) {
-    return J.N._O_OO(1, a, b);
+    return J.N.OOO(1, a, b);
   }
 }
diff --git a/third_party/jni_zero/test/golden/testForTestingKeptMultiplexing-Final-N.java.golden b/third_party/jni_zero/test/golden/testForTestingKeptMultiplexing-Final-N.java.golden
index a9b95f3f..669229b 100644
--- a/third_party/jni_zero/test/golden/testForTestingKeptMultiplexing-Final-N.java.golden
+++ b/third_party/jni_zero/test/golden/testForTestingKeptMultiplexing-Final-N.java.golden
@@ -8,11 +8,11 @@
   public static final long WHOLE_HASH = 2249885413155022725L;
   public static final long PRIORITY_HASH = 0L;
 
-  public static native void _V(int _switchNum);
-  public static native int _I_I(int p0);
-  public static native Object _O_O(Object p0);
-  public static native boolean _Z_O(Object p0);
-  public static native void _V_OO(Object p0, Object p1);
-  public static native int _I_OO(Object p0, Object p1);
-  public static native Object _O_OO(int _switchNum, Object p0, Object p1);
+  public static native void V(int _switchNum);
+  public static native int II(int p0);
+  public static native Object OO(Object p0);
+  public static native boolean ZO(Object p0);
+  public static native void VOO(Object p0, Object p1);
+  public static native int IOO(Object p0, Object p1);
+  public static native Object OOO(int _switchNum, Object p0, Object p1);
 }
diff --git a/third_party/jni_zero/test/golden/testForTestingKeptMultiplexing-Registration.h.golden b/third_party/jni_zero/test/golden/testForTestingKeptMultiplexing-Registration.h.golden
index 0bb6837d..501ed25 100644
--- a/third_party/jni_zero/test/golden/testForTestingKeptMultiplexing-Registration.h.golden
+++ b/third_party/jni_zero/test/golden/testForTestingKeptMultiplexing-Registration.h.golden
@@ -62,7 +62,7 @@
     JNIEnv* env);
 
 // Multiplexing Methods.
-JNI_ZERO_BOUNDARY_EXPORT void Java_J_N__1V(JNIEnv* env, jclass jcaller, jint switch_num) {
+JNI_ZERO_BOUNDARY_EXPORT void Java_J_N_V(JNIEnv* env, jclass jcaller, jint switch_num) {
   JNI_ZERO_DCHECK(switch_num >= 0 && switch_num < 4);
   switch (switch_num) {
     case 0:
@@ -77,30 +77,22 @@
       __builtin_unreachable();
   }
 }
-JNI_ZERO_BOUNDARY_EXPORT jint Java_J_N__1I_1I(JNIEnv* env, jclass jcaller, jint p0) {
+JNI_ZERO_BOUNDARY_EXPORT jint Java_J_N_II(JNIEnv* env, jclass jcaller, jint p0) {
   return Muxed_org_jni_1zero_SampleProxyEdgeCases_setStringBuilder(env, p0);
 }
-JNI_ZERO_BOUNDARY_EXPORT jobject Java_J_N__1O_1O(JNIEnv* env, jclass jcaller, jobject p0) {
+JNI_ZERO_BOUNDARY_EXPORT jobject Java_J_N_OO(JNIEnv* env, jclass jcaller, jobject p0) {
   return Muxed_org_jni_1zero_SampleProxyEdgeCases_genericsWithNestedClassArray(env, p0);
 }
-JNI_ZERO_BOUNDARY_EXPORT jboolean Java_J_N__1Z_1O(JNIEnv* env, jclass jcaller, jobject p0) {
+JNI_ZERO_BOUNDARY_EXPORT jboolean Java_J_N_ZO(JNIEnv* env, jclass jcaller, jobject p0) {
   return Muxed_org_jni_1zero_SampleProxyEdgeCases_setStringBuilder(env, p0);
 }
-JNI_ZERO_BOUNDARY_EXPORT void Java_J_N__1V_1OO(
-    JNIEnv* env,
-    jclass jcaller,
-    jobject p0,
-    jobject p1) {
+JNI_ZERO_BOUNDARY_EXPORT void Java_J_N_VOO(JNIEnv* env, jclass jcaller, jobject p0, jobject p1) {
   return Muxed_org_jni_1zero_SampleProxyEdgeCases_setBool(env, p0, p1);
 }
-JNI_ZERO_BOUNDARY_EXPORT jint Java_J_N__1I_1OO(
-    JNIEnv* env,
-    jclass jcaller,
-    jobject p0,
-    jobject p1) {
+JNI_ZERO_BOUNDARY_EXPORT jint Java_J_N_IOO(JNIEnv* env, jclass jcaller, jobject p0, jobject p1) {
   return Muxed_org_jni_1zero_SampleProxyEdgeCases_addStructB(env, p0, p1);
 }
-JNI_ZERO_BOUNDARY_EXPORT jobject Java_J_N__1O_1OO(
+JNI_ZERO_BOUNDARY_EXPORT jobject Java_J_N_OOO(
     JNIEnv* env,
     jclass jcaller,
     jint switch_num,
diff --git a/third_party/jni_zero/test/golden/testForTestingRemovedMultiplexing-Final-GEN_JNI.java.golden b/third_party/jni_zero/test/golden/testForTestingRemovedMultiplexing-Final-GEN_JNI.java.golden
index 3a56923..e204bb7f 100644
--- a/third_party/jni_zero/test/golden/testForTestingRemovedMultiplexing-Final-GEN_JNI.java.golden
+++ b/third_party/jni_zero/test/golden/testForTestingRemovedMultiplexing-Final-GEN_JNI.java.golden
@@ -6,27 +6,27 @@
 
 public class GEN_JNI {
   public static void org_jni_1zero_SampleProxyEdgeCases_foo__weirdly__escaped_name1() {
-    J.N._V();
+    J.N.V();
   }
   public static int org_jni_1zero_SampleProxyEdgeCases_setStringBuilder(int sb) {
-    return J.N._I_I(sb);
+    return J.N.II(sb);
   }
   public static Object org_jni_1zero_SampleProxyEdgeCases_genericsWithNestedClassArray(Object arg) {
-    return J.N._O_O(arg);
+    return J.N.OO(arg);
   }
   public static boolean org_jni_1zero_SampleProxyEdgeCases_setStringBuilder(Object sb) {
-    return J.N._Z_O(sb);
+    return J.N.ZO(sb);
   }
   public static void org_jni_1zero_SampleProxyEdgeCases_setBool(Object b, Object i) {
-    J.N._V_OO(b, i);
+    J.N.VOO(b, i);
   }
   public static int org_jni_1zero_SampleProxyEdgeCases_addStructB(Object caller, Object b) {
-    return J.N._I_OO(caller, b);
+    return J.N.IOO(caller, b);
   }
   public static Object org_jni_1zero_SampleProxyEdgeCases_arrayTypes1(Object a, Object b) {
-    return J.N._O_OO(0, a, b);
+    return J.N.OOO(0, a, b);
   }
   public static Object org_jni_1zero_SampleProxyEdgeCases_arrayTypes2(Object a, Object b) {
-    return J.N._O_OO(1, a, b);
+    return J.N.OOO(1, a, b);
   }
 }
diff --git a/third_party/jni_zero/test/golden/testForTestingRemovedMultiplexing-Final-N.java.golden b/third_party/jni_zero/test/golden/testForTestingRemovedMultiplexing-Final-N.java.golden
index 51cc981..521d748 100644
--- a/third_party/jni_zero/test/golden/testForTestingRemovedMultiplexing-Final-N.java.golden
+++ b/third_party/jni_zero/test/golden/testForTestingRemovedMultiplexing-Final-N.java.golden
@@ -8,11 +8,11 @@
   public static final long WHOLE_HASH = 2249885413155022725L;
   public static final long PRIORITY_HASH = 0L;
 
-  public static native void _V();
-  public static native int _I_I(int p0);
-  public static native Object _O_O(Object p0);
-  public static native boolean _Z_O(Object p0);
-  public static native void _V_OO(Object p0, Object p1);
-  public static native int _I_OO(Object p0, Object p1);
-  public static native Object _O_OO(int _switchNum, Object p0, Object p1);
+  public static native void V();
+  public static native int II(int p0);
+  public static native Object OO(Object p0);
+  public static native boolean ZO(Object p0);
+  public static native void VOO(Object p0, Object p1);
+  public static native int IOO(Object p0, Object p1);
+  public static native Object OOO(int _switchNum, Object p0, Object p1);
 }
diff --git a/third_party/jni_zero/test/golden/testForTestingRemovedMultiplexing-Registration.h.golden b/third_party/jni_zero/test/golden/testForTestingRemovedMultiplexing-Registration.h.golden
index 022feaec..5acc657 100644
--- a/third_party/jni_zero/test/golden/testForTestingRemovedMultiplexing-Registration.h.golden
+++ b/third_party/jni_zero/test/golden/testForTestingRemovedMultiplexing-Registration.h.golden
@@ -59,33 +59,25 @@
     JNIEnv* env);
 
 // Multiplexing Methods.
-JNI_ZERO_BOUNDARY_EXPORT void Java_J_N__1V(JNIEnv* env, jclass jcaller) {
+JNI_ZERO_BOUNDARY_EXPORT void Java_J_N_V(JNIEnv* env, jclass jcaller) {
   return Muxed_org_jni_1zero_SampleProxyEdgeCases_foo__weirdly__escaped_name1(env);
 }
-JNI_ZERO_BOUNDARY_EXPORT jint Java_J_N__1I_1I(JNIEnv* env, jclass jcaller, jint p0) {
+JNI_ZERO_BOUNDARY_EXPORT jint Java_J_N_II(JNIEnv* env, jclass jcaller, jint p0) {
   return Muxed_org_jni_1zero_SampleProxyEdgeCases_setStringBuilder(env, p0);
 }
-JNI_ZERO_BOUNDARY_EXPORT jobject Java_J_N__1O_1O(JNIEnv* env, jclass jcaller, jobject p0) {
+JNI_ZERO_BOUNDARY_EXPORT jobject Java_J_N_OO(JNIEnv* env, jclass jcaller, jobject p0) {
   return Muxed_org_jni_1zero_SampleProxyEdgeCases_genericsWithNestedClassArray(env, p0);
 }
-JNI_ZERO_BOUNDARY_EXPORT jboolean Java_J_N__1Z_1O(JNIEnv* env, jclass jcaller, jobject p0) {
+JNI_ZERO_BOUNDARY_EXPORT jboolean Java_J_N_ZO(JNIEnv* env, jclass jcaller, jobject p0) {
   return Muxed_org_jni_1zero_SampleProxyEdgeCases_setStringBuilder(env, p0);
 }
-JNI_ZERO_BOUNDARY_EXPORT void Java_J_N__1V_1OO(
-    JNIEnv* env,
-    jclass jcaller,
-    jobject p0,
-    jobject p1) {
+JNI_ZERO_BOUNDARY_EXPORT void Java_J_N_VOO(JNIEnv* env, jclass jcaller, jobject p0, jobject p1) {
   return Muxed_org_jni_1zero_SampleProxyEdgeCases_setBool(env, p0, p1);
 }
-JNI_ZERO_BOUNDARY_EXPORT jint Java_J_N__1I_1OO(
-    JNIEnv* env,
-    jclass jcaller,
-    jobject p0,
-    jobject p1) {
+JNI_ZERO_BOUNDARY_EXPORT jint Java_J_N_IOO(JNIEnv* env, jclass jcaller, jobject p0, jobject p1) {
   return Muxed_org_jni_1zero_SampleProxyEdgeCases_addStructB(env, p0, p1);
 }
-JNI_ZERO_BOUNDARY_EXPORT jobject Java_J_N__1O_1OO(
+JNI_ZERO_BOUNDARY_EXPORT jobject Java_J_N_OOO(
     JNIEnv* env,
     jclass jcaller,
     jint switch_num,
diff --git a/third_party/jni_zero/test/golden/testModulesWithMultiplexing-Final-GEN_JNI.java.golden b/third_party/jni_zero/test/golden/testModulesWithMultiplexing-Final-GEN_JNI.java.golden
index 99767c18..2fd57e9d 100644
--- a/third_party/jni_zero/test/golden/testModulesWithMultiplexing-Final-GEN_JNI.java.golden
+++ b/third_party/jni_zero/test/golden/testModulesWithMultiplexing-Final-GEN_JNI.java.golden
@@ -6,9 +6,9 @@
 
 public class module_GEN_JNI {
   public static void org_jni_1zero_SampleModule_foo() {
-    J.module_N._V();
+    J.module_N.V();
   }
   public static boolean org_jni_1zero_SampleModule_bar(boolean a) {
-    return J.module_N._Z_Z(a);
+    return J.module_N.ZZ(a);
   }
 }
diff --git a/third_party/jni_zero/test/golden/testModulesWithMultiplexing-Final-N.java.golden b/third_party/jni_zero/test/golden/testModulesWithMultiplexing-Final-N.java.golden
index ad0e0be..a155ac6 100644
--- a/third_party/jni_zero/test/golden/testModulesWithMultiplexing-Final-N.java.golden
+++ b/third_party/jni_zero/test/golden/testModulesWithMultiplexing-Final-N.java.golden
@@ -8,6 +8,6 @@
   public static final long WHOLE_HASH = -7714383706413312501L;
   public static final long PRIORITY_HASH = 0L;
 
-  public static native void _V();
-  public static native boolean _Z_Z(boolean p0);
+  public static native void V();
+  public static native boolean ZZ(boolean p0);
 }
diff --git a/third_party/jni_zero/test/golden/testModulesWithMultiplexing-Registration.h.golden b/third_party/jni_zero/test/golden/testModulesWithMultiplexing-Registration.h.golden
index c31a7f4..4a576de 100644
--- a/third_party/jni_zero/test/golden/testModulesWithMultiplexing-Registration.h.golden
+++ b/third_party/jni_zero/test/golden/testModulesWithMultiplexing-Registration.h.golden
@@ -18,13 +18,10 @@
 JNI_ZERO_MUXED_ENTRYPOINT void Muxed_org_jni_1zero_SampleModule_foo(JNIEnv* env);
 
 // Multiplexing Methods.
-JNI_ZERO_BOUNDARY_EXPORT void Java_J_module_1N__1V(JNIEnv* env, jclass jcaller) {
+JNI_ZERO_BOUNDARY_EXPORT void Java_J_module_1N_V(JNIEnv* env, jclass jcaller) {
   return Muxed_org_jni_1zero_SampleModule_foo(env);
 }
-JNI_ZERO_BOUNDARY_EXPORT jboolean Java_J_module_1N__1Z_1Z(
-    JNIEnv* env,
-    jclass jcaller,
-    jboolean p0) {
+JNI_ZERO_BOUNDARY_EXPORT jboolean Java_J_module_1N_ZZ(JNIEnv* env, jclass jcaller, jboolean p0) {
   return Muxed_org_jni_1zero_SampleModule_bar(env, p0);
 }
 
@@ -33,12 +30,12 @@
 
 bool RegisterNative_J_module_1N(JNIEnv* env) {
   static const JNINativeMethod kMethods[] = {
-        {"_V",
+        {"V",
          "()V",
-         reinterpret_cast<void*>(Java_J_module_1N__1V)},
-         {"_Z_Z",
+         reinterpret_cast<void*>(Java_J_module_1N_V)},
+         {"ZZ",
          "(Z)Z",
-         reinterpret_cast<void*>(Java_J_module_1N__1Z_1Z)},
+         reinterpret_cast<void*>(Java_J_module_1N_ZZ)},
 
   };
   jni_zero::ScopedJavaLocalRef<jclass> native_clazz =
diff --git a/third_party/jni_zero/test/golden/testMultiplexing-Final-GEN_JNI.java.golden b/third_party/jni_zero/test/golden/testMultiplexing-Final-GEN_JNI.java.golden
index 6098e93..bc88e41 100644
--- a/third_party/jni_zero/test/golden/testMultiplexing-Final-GEN_JNI.java.golden
+++ b/third_party/jni_zero/test/golden/testMultiplexing-Final-GEN_JNI.java.golden
@@ -6,66 +6,66 @@
 
 public class GEN_JNI {
   public static void org_jni_1zero_SampleForAnnotationProcessor_foo() {
-    J.N._V();
+    J.N.V();
   }
   public static Object org_jni_1zero_SampleForAnnotationProcessor_returnClass() {
-    return J.N._O(0);
+    return J.N.O(0);
   }
   public static Object org_jni_1zero_SampleForAnnotationProcessor_returnClasses() {
-    return J.N._O(1);
+    return J.N.O(1);
   }
   public static Object org_jni_1zero_SampleForAnnotationProcessor_returnConvertedInts() {
-    return J.N._O(2);
+    return J.N.O(2);
   }
   public static Object org_jni_1zero_SampleForAnnotationProcessor_returnConvertedString() {
-    return J.N._O(3);
+    return J.N.O(3);
   }
   public static Object org_jni_1zero_SampleForAnnotationProcessor_returnConvertedStrings() {
-    return J.N._O(4);
+    return J.N.O(4);
   }
   public static Object org_jni_1zero_SampleForAnnotationProcessor_returnObject() {
-    return J.N._O(5);
+    return J.N.O(5);
   }
   public static Object org_jni_1zero_SampleForAnnotationProcessor_returnObjects() {
-    return J.N._O(6);
+    return J.N.O(6);
   }
   public static Object org_jni_1zero_SampleForAnnotationProcessor_returnString() {
-    return J.N._O(7);
+    return J.N.O(7);
   }
   public static Object org_jni_1zero_SampleForAnnotationProcessor_returnStrings() {
-    return J.N._O(8);
+    return J.N.O(8);
   }
   public static Object org_jni_1zero_SampleForAnnotationProcessor_returnStruct() {
-    return J.N._O(9);
+    return J.N.O(9);
   }
   public static Object org_jni_1zero_SampleForAnnotationProcessor_returnStructs() {
-    return J.N._O(10);
+    return J.N.O(10);
   }
   public static Object org_jni_1zero_SampleForAnnotationProcessor_returnThrowable() {
-    return J.N._O(11);
+    return J.N.O(11);
   }
   public static Object org_jni_1zero_SampleForAnnotationProcessor_returnThrowables() {
-    return J.N._O(12);
+    return J.N.O(12);
   }
   public static boolean org_jni_1zero_SampleForAnnotationProcessor_hasPhalange() {
-    return J.N._Z();
+    return J.N.Z();
   }
   public static Object org_jni_1zero_SampleForAnnotationProcessor_bar(Object sample) {
-    return J.N._O_O(0, sample);
+    return J.N.OO(0, sample);
   }
   public static Object org_jni_1zero_SampleForAnnotationProcessor_returnConvertedAppObjects(
       Object __arrayClazz) {
-    return J.N._O_O(1, __arrayClazz);
+    return J.N.OO(1, __arrayClazz);
   }
   public static Object org_jni_1zero_SampleForAnnotationProcessor_revString(
       Object stringToReverse) {
-    return J.N._O_O(2, stringToReverse);
+    return J.N.OO(2, stringToReverse);
   }
   public static Object org_jni_1zero_SampleForAnnotationProcessor_sendSamplesToNative(Object strs) {
-    return J.N._O_O(3, strs);
+    return J.N.OO(3, strs);
   }
   public static Object org_jni_1zero_SampleForAnnotationProcessor_sendToNative(Object strs) {
-    return J.N._O_O(4, strs);
+    return J.N.OO(4, strs);
   }
   public static Object org_jni_1zero_SampleForAnnotationProcessor_testAllPrimitives(
       int zint,
@@ -84,7 +84,7 @@
       Object floats,
       boolean zbool,
       Object bools) {
-    return J.N._O_BCDFIJOOOOOOOOSZ(
+    return J.N.OBCDFIJOOOOOOOOSZ(
         zbyte,
         zchar,
         zdouble,
@@ -121,7 +121,7 @@
       Object view,
       Object context,
       Object convertedObjects) {
-    J.N._V_OOOOOOOOOOOOOOOOOO(
+    J.N.VOOOOOOOOOOOOOOOOOO(
         clazz,
         classes,
         throwable,
diff --git a/third_party/jni_zero/test/golden/testMultiplexing-Final-N.java.golden b/third_party/jni_zero/test/golden/testMultiplexing-Final-N.java.golden
index 3436f13..4eabbce 100644
--- a/third_party/jni_zero/test/golden/testMultiplexing-Final-N.java.golden
+++ b/third_party/jni_zero/test/golden/testMultiplexing-Final-N.java.golden
@@ -8,11 +8,11 @@
   public static final long WHOLE_HASH = 3865356290363738592L;
   public static final long PRIORITY_HASH = 0L;
 
-  public static native void _V();
-  public static native Object _O(int _switchNum);
-  public static native boolean _Z();
-  public static native Object _O_O(int _switchNum, Object p0);
-  public static native Object _O_BCDFIJOOOOOOOOSZ(
+  public static native void V();
+  public static native Object O(int _switchNum);
+  public static native boolean Z();
+  public static native Object OO(int _switchNum, Object p0);
+  public static native Object OBCDFIJOOOOOOOOSZ(
       byte p0,
       char p1,
       double p2,
@@ -29,7 +29,7 @@
       Object p13,
       short p14,
       boolean p15);
-  public static native void _V_OOOOOOOOOOOOOOOOOO(
+  public static native void VOOOOOOOOOOOOOOOOOO(
       Object p0,
       Object p1,
       Object p2,
diff --git a/third_party/jni_zero/test/golden/testMultiplexing-Registration.h.golden b/third_party/jni_zero/test/golden/testMultiplexing-Registration.h.golden
index 3faa9f4..8eaaeeb 100644
--- a/third_party/jni_zero/test/golden/testMultiplexing-Registration.h.golden
+++ b/third_party/jni_zero/test/golden/testMultiplexing-Registration.h.golden
@@ -98,10 +98,10 @@
     jobject convertedObjects);
 
 // Multiplexing Methods.
-JNI_ZERO_BOUNDARY_EXPORT void Java_J_N__1V(JNIEnv* env, jclass jcaller) {
+JNI_ZERO_BOUNDARY_EXPORT void Java_J_N_V(JNIEnv* env, jclass jcaller) {
   return Muxed_org_jni_1zero_SampleForAnnotationProcessor_foo(env);
 }
-JNI_ZERO_BOUNDARY_EXPORT jobject Java_J_N__1O(JNIEnv* env, jclass jcaller, jint switch_num) {
+JNI_ZERO_BOUNDARY_EXPORT jobject Java_J_N_O(JNIEnv* env, jclass jcaller, jint switch_num) {
   JNI_ZERO_DCHECK(switch_num >= 0 && switch_num < 13);
   switch (switch_num) {
     case 0:
@@ -134,10 +134,10 @@
       __builtin_unreachable();
   }
 }
-JNI_ZERO_BOUNDARY_EXPORT jboolean Java_J_N__1Z(JNIEnv* env, jclass jcaller) {
+JNI_ZERO_BOUNDARY_EXPORT jboolean Java_J_N_Z(JNIEnv* env, jclass jcaller) {
   return Muxed_org_jni_1zero_SampleForAnnotationProcessor_hasPhalange(env);
 }
-JNI_ZERO_BOUNDARY_EXPORT jobject Java_J_N__1O_1O(
+JNI_ZERO_BOUNDARY_EXPORT jobject Java_J_N_OO(
     JNIEnv* env,
     jclass jcaller,
     jint switch_num,
@@ -158,7 +158,7 @@
       __builtin_unreachable();
   }
 }
-JNI_ZERO_BOUNDARY_EXPORT jobject Java_J_N__1O_1BCDFIJOOOOOOOOSZ(
+JNI_ZERO_BOUNDARY_EXPORT jobject Java_J_N_OBCDFIJOOOOOOOOSZ(
     JNIEnv* env,
     jclass jcaller,
     jbyte p0,
@@ -179,7 +179,7 @@
     jboolean p15) {
   return Muxed_org_jni_1zero_SampleForAnnotationProcessor_testAllPrimitives(env, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15);
 }
-JNI_ZERO_BOUNDARY_EXPORT void Java_J_N__1V_1OOOOOOOOOOOOOOOOOO(
+JNI_ZERO_BOUNDARY_EXPORT void Java_J_N_VOOOOOOOOOOOOOOOOOO(
     JNIEnv* env,
     jclass jcaller,
     jobject p0,
@@ -208,24 +208,24 @@
 
 bool RegisterNative_J_N(JNIEnv* env) {
   static const JNINativeMethod kMethods[] = {
-        {"_V",
+        {"V",
          "()V",
-         reinterpret_cast<void*>(Java_J_N__1V)},
-         {"_O",
+         reinterpret_cast<void*>(Java_J_N_V)},
+         {"O",
          "(I)Ljava/lang/Object;",
-         reinterpret_cast<void*>(Java_J_N__1O)},
-         {"_Z",
+         reinterpret_cast<void*>(Java_J_N_O)},
+         {"Z",
          "()Z",
-         reinterpret_cast<void*>(Java_J_N__1Z)},
-         {"_O_O",
+         reinterpret_cast<void*>(Java_J_N_Z)},
+         {"OO",
          "(ILjava/lang/Object;)Ljava/lang/Object;",
-         reinterpret_cast<void*>(Java_J_N__1O_1O)},
-         {"_O_BCDFIJOOOOOOOOSZ",
+         reinterpret_cast<void*>(Java_J_N_OO)},
+         {"OBCDFIJOOOOOOOOSZ",
          "(BCDFIJLjava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;SZ)Ljava/lang/Object;",
-         reinterpret_cast<void*>(Java_J_N__1O_1BCDFIJOOOOOOOOSZ)},
-         {"_V_OOOOOOOOOOOOOOOOOO",
+         reinterpret_cast<void*>(Java_J_N_OBCDFIJOOOOOOOOSZ)},
+         {"VOOOOOOOOOOOOOOOOOO",
          "(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V",
-         reinterpret_cast<void*>(Java_J_N__1V_1OOOOOOOOOOOOOOOOOO)},
+         reinterpret_cast<void*>(Java_J_N_VOOOOOOOOOOOOOOOOOO)},
 
   };
   jni_zero::ScopedJavaLocalRef<jclass> native_clazz =
diff --git a/third_party/jni_zero/test/golden/testPackagePrefixWithManualRegistrationWithMultiplexing-Final-GEN_JNI.java.golden b/third_party/jni_zero/test/golden/testPackagePrefixWithManualRegistrationWithMultiplexing-Final-GEN_JNI.java.golden
index eaf8477..d33a2f4b 100644
--- a/third_party/jni_zero/test/golden/testPackagePrefixWithManualRegistrationWithMultiplexing-Final-GEN_JNI.java.golden
+++ b/third_party/jni_zero/test/golden/testPackagePrefixWithManualRegistrationWithMultiplexing-Final-GEN_JNI.java.golden
@@ -6,69 +6,69 @@
 
 public class GEN_JNI {
   public static void this_is_a_package_prefix_org_jni_1zero_SampleForAnnotationProcessor_foo() {
-    this.is.a.package.prefix.J.N._V();
+    this.is.a.package.prefix.J.N.V();
   }
   public static Object this_is_a_package_prefix_org_jni_1zero_SampleForAnnotationProcessor_returnClass() {
-    return this.is.a.package.prefix.J.N._O(0);
+    return this.is.a.package.prefix.J.N.O(0);
   }
   public static Object this_is_a_package_prefix_org_jni_1zero_SampleForAnnotationProcessor_returnClasses() {
-    return this.is.a.package.prefix.J.N._O(1);
+    return this.is.a.package.prefix.J.N.O(1);
   }
   public static Object this_is_a_package_prefix_org_jni_1zero_SampleForAnnotationProcessor_returnConvertedInts() {
-    return this.is.a.package.prefix.J.N._O(2);
+    return this.is.a.package.prefix.J.N.O(2);
   }
   public static Object this_is_a_package_prefix_org_jni_1zero_SampleForAnnotationProcessor_returnConvertedString() {
-    return this.is.a.package.prefix.J.N._O(3);
+    return this.is.a.package.prefix.J.N.O(3);
   }
   public static Object this_is_a_package_prefix_org_jni_1zero_SampleForAnnotationProcessor_returnConvertedStrings() {
-    return this.is.a.package.prefix.J.N._O(4);
+    return this.is.a.package.prefix.J.N.O(4);
   }
   public static Object this_is_a_package_prefix_org_jni_1zero_SampleForAnnotationProcessor_returnObject() {
-    return this.is.a.package.prefix.J.N._O(5);
+    return this.is.a.package.prefix.J.N.O(5);
   }
   public static Object this_is_a_package_prefix_org_jni_1zero_SampleForAnnotationProcessor_returnObjects() {
-    return this.is.a.package.prefix.J.N._O(6);
+    return this.is.a.package.prefix.J.N.O(6);
   }
   public static Object this_is_a_package_prefix_org_jni_1zero_SampleForAnnotationProcessor_returnString() {
-    return this.is.a.package.prefix.J.N._O(7);
+    return this.is.a.package.prefix.J.N.O(7);
   }
   public static Object this_is_a_package_prefix_org_jni_1zero_SampleForAnnotationProcessor_returnStrings() {
-    return this.is.a.package.prefix.J.N._O(8);
+    return this.is.a.package.prefix.J.N.O(8);
   }
   public static Object this_is_a_package_prefix_org_jni_1zero_SampleForAnnotationProcessor_returnStruct() {
-    return this.is.a.package.prefix.J.N._O(9);
+    return this.is.a.package.prefix.J.N.O(9);
   }
   public static Object this_is_a_package_prefix_org_jni_1zero_SampleForAnnotationProcessor_returnStructs() {
-    return this.is.a.package.prefix.J.N._O(10);
+    return this.is.a.package.prefix.J.N.O(10);
   }
   public static Object this_is_a_package_prefix_org_jni_1zero_SampleForAnnotationProcessor_returnThrowable() {
-    return this.is.a.package.prefix.J.N._O(11);
+    return this.is.a.package.prefix.J.N.O(11);
   }
   public static Object this_is_a_package_prefix_org_jni_1zero_SampleForAnnotationProcessor_returnThrowables() {
-    return this.is.a.package.prefix.J.N._O(12);
+    return this.is.a.package.prefix.J.N.O(12);
   }
   public static boolean this_is_a_package_prefix_org_jni_1zero_SampleForAnnotationProcessor_hasPhalange() {
-    return this.is.a.package.prefix.J.N._Z();
+    return this.is.a.package.prefix.J.N.Z();
   }
   public static Object this_is_a_package_prefix_org_jni_1zero_SampleForAnnotationProcessor_bar(
       Object sample) {
-    return this.is.a.package.prefix.J.N._O_O(0, sample);
+    return this.is.a.package.prefix.J.N.OO(0, sample);
   }
   public static Object this_is_a_package_prefix_org_jni_1zero_SampleForAnnotationProcessor_returnConvertedAppObjects(
       Object __arrayClazz) {
-    return this.is.a.package.prefix.J.N._O_O(1, __arrayClazz);
+    return this.is.a.package.prefix.J.N.OO(1, __arrayClazz);
   }
   public static Object this_is_a_package_prefix_org_jni_1zero_SampleForAnnotationProcessor_revString(
       Object stringToReverse) {
-    return this.is.a.package.prefix.J.N._O_O(2, stringToReverse);
+    return this.is.a.package.prefix.J.N.OO(2, stringToReverse);
   }
   public static Object this_is_a_package_prefix_org_jni_1zero_SampleForAnnotationProcessor_sendSamplesToNative(
       Object strs) {
-    return this.is.a.package.prefix.J.N._O_O(3, strs);
+    return this.is.a.package.prefix.J.N.OO(3, strs);
   }
   public static Object this_is_a_package_prefix_org_jni_1zero_SampleForAnnotationProcessor_sendToNative(
       Object strs) {
-    return this.is.a.package.prefix.J.N._O_O(4, strs);
+    return this.is.a.package.prefix.J.N.OO(4, strs);
   }
   public static Object this_is_a_package_prefix_org_jni_1zero_SampleForAnnotationProcessor_testAllPrimitives(
       int zint,
@@ -87,7 +87,7 @@
       Object floats,
       boolean zbool,
       Object bools) {
-    return this.is.a.package.prefix.J.N._O_BCDFIJOOOOOOOOSZ(
+    return this.is.a.package.prefix.J.N.OBCDFIJOOOOOOOOSZ(
         zbyte,
         zchar,
         zdouble,
@@ -124,7 +124,7 @@
       Object view,
       Object context,
       Object convertedObjects) {
-    this.is.a.package.prefix.J.N._V_OOOOOOOOOOOOOOOOOO(
+    this.is.a.package.prefix.J.N.VOOOOOOOOOOOOOOOOOO(
         clazz,
         classes,
         throwable,
diff --git a/third_party/jni_zero/test/golden/testPackagePrefixWithManualRegistrationWithMultiplexing-Final-N.java.golden b/third_party/jni_zero/test/golden/testPackagePrefixWithManualRegistrationWithMultiplexing-Final-N.java.golden
index 645cc83d..7fb4118 100644
--- a/third_party/jni_zero/test/golden/testPackagePrefixWithManualRegistrationWithMultiplexing-Final-N.java.golden
+++ b/third_party/jni_zero/test/golden/testPackagePrefixWithManualRegistrationWithMultiplexing-Final-N.java.golden
@@ -8,11 +8,11 @@
   public static final long WHOLE_HASH = 3865356290363738592L;
   public static final long PRIORITY_HASH = 0L;
 
-  public static native void _V();
-  public static native Object _O(int _switchNum);
-  public static native boolean _Z();
-  public static native Object _O_O(int _switchNum, Object p0);
-  public static native Object _O_BCDFIJOOOOOOOOSZ(
+  public static native void V();
+  public static native Object O(int _switchNum);
+  public static native boolean Z();
+  public static native Object OO(int _switchNum, Object p0);
+  public static native Object OBCDFIJOOOOOOOOSZ(
       byte p0,
       char p1,
       double p2,
@@ -29,7 +29,7 @@
       Object p13,
       short p14,
       boolean p15);
-  public static native void _V_OOOOOOOOOOOOOOOOOO(
+  public static native void VOOOOOOOOOOOOOOOOOO(
       Object p0,
       Object p1,
       Object p2,
diff --git a/third_party/jni_zero/test/golden/testPackagePrefixWithManualRegistrationWithMultiplexing-Registration.h.golden b/third_party/jni_zero/test/golden/testPackagePrefixWithManualRegistrationWithMultiplexing-Registration.h.golden
index 194d608..6c5dbf3 100644
--- a/third_party/jni_zero/test/golden/testPackagePrefixWithManualRegistrationWithMultiplexing-Registration.h.golden
+++ b/third_party/jni_zero/test/golden/testPackagePrefixWithManualRegistrationWithMultiplexing-Registration.h.golden
@@ -99,10 +99,10 @@
     jobject convertedObjects);
 
 // Multiplexing Methods.
-JNI_ZERO_BOUNDARY_EXPORT void Java_this_is_a_package_prefix_J_N__1V(JNIEnv* env, jclass jcaller) {
+JNI_ZERO_BOUNDARY_EXPORT void Java_this_is_a_package_prefix_J_N_V(JNIEnv* env, jclass jcaller) {
   return Muxed_this_is_a_package_prefix_org_jni_1zero_SampleForAnnotationProcessor_foo(env);
 }
-JNI_ZERO_BOUNDARY_EXPORT jobject Java_this_is_a_package_prefix_J_N__1O(
+JNI_ZERO_BOUNDARY_EXPORT jobject Java_this_is_a_package_prefix_J_N_O(
     JNIEnv* env,
     jclass jcaller,
     jint switch_num) {
@@ -138,12 +138,10 @@
       __builtin_unreachable();
   }
 }
-JNI_ZERO_BOUNDARY_EXPORT jboolean Java_this_is_a_package_prefix_J_N__1Z(
-    JNIEnv* env,
-    jclass jcaller) {
+JNI_ZERO_BOUNDARY_EXPORT jboolean Java_this_is_a_package_prefix_J_N_Z(JNIEnv* env, jclass jcaller) {
   return Muxed_this_is_a_package_prefix_org_jni_1zero_SampleForAnnotationProcessor_hasPhalange(env);
 }
-JNI_ZERO_BOUNDARY_EXPORT jobject Java_this_is_a_package_prefix_J_N__1O_1O(
+JNI_ZERO_BOUNDARY_EXPORT jobject Java_this_is_a_package_prefix_J_N_OO(
     JNIEnv* env,
     jclass jcaller,
     jint switch_num,
@@ -164,7 +162,7 @@
       __builtin_unreachable();
   }
 }
-JNI_ZERO_BOUNDARY_EXPORT jobject Java_this_is_a_package_prefix_J_N__1O_1BCDFIJOOOOOOOOSZ(
+JNI_ZERO_BOUNDARY_EXPORT jobject Java_this_is_a_package_prefix_J_N_OBCDFIJOOOOOOOOSZ(
     JNIEnv* env,
     jclass jcaller,
     jbyte p0,
@@ -185,7 +183,7 @@
     jboolean p15) {
   return Muxed_this_is_a_package_prefix_org_jni_1zero_SampleForAnnotationProcessor_testAllPrimitives(env, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15);
 }
-JNI_ZERO_BOUNDARY_EXPORT void Java_this_is_a_package_prefix_J_N__1V_1OOOOOOOOOOOOOOOOOO(
+JNI_ZERO_BOUNDARY_EXPORT void Java_this_is_a_package_prefix_J_N_VOOOOOOOOOOOOOOOOOO(
     JNIEnv* env,
     jclass jcaller,
     jobject p0,
@@ -214,24 +212,24 @@
 
 bool RegisterNative_this_is_a_package_prefix_J_N(JNIEnv* env) {
   static const JNINativeMethod kMethods[] = {
-        {"_V",
+        {"V",
          "()V",
-         reinterpret_cast<void*>(Java_this_is_a_package_prefix_J_N__1V)},
-         {"_O",
+         reinterpret_cast<void*>(Java_this_is_a_package_prefix_J_N_V)},
+         {"O",
          "(I)Ljava/lang/Object;",
-         reinterpret_cast<void*>(Java_this_is_a_package_prefix_J_N__1O)},
-         {"_Z",
+         reinterpret_cast<void*>(Java_this_is_a_package_prefix_J_N_O)},
+         {"Z",
          "()Z",
-         reinterpret_cast<void*>(Java_this_is_a_package_prefix_J_N__1Z)},
-         {"_O_O",
+         reinterpret_cast<void*>(Java_this_is_a_package_prefix_J_N_Z)},
+         {"OO",
          "(ILjava/lang/Object;)Ljava/lang/Object;",
-         reinterpret_cast<void*>(Java_this_is_a_package_prefix_J_N__1O_1O)},
-         {"_O_BCDFIJOOOOOOOOSZ",
+         reinterpret_cast<void*>(Java_this_is_a_package_prefix_J_N_OO)},
+         {"OBCDFIJOOOOOOOOSZ",
          "(BCDFIJLjava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;SZ)Ljava/lang/Object;",
-         reinterpret_cast<void*>(Java_this_is_a_package_prefix_J_N__1O_1BCDFIJOOOOOOOOSZ)},
-         {"_V_OOOOOOOOOOOOOOOOOO",
+         reinterpret_cast<void*>(Java_this_is_a_package_prefix_J_N_OBCDFIJOOOOOOOOSZ)},
+         {"VOOOOOOOOOOOOOOOOOO",
          "(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V",
-         reinterpret_cast<void*>(Java_this_is_a_package_prefix_J_N__1V_1OOOOOOOOOOOOOOOOOO)},
+         reinterpret_cast<void*>(Java_this_is_a_package_prefix_J_N_VOOOOOOOOOOOOOOOOOO)},
 
   };
   jni_zero::ScopedJavaLocalRef<jclass> native_clazz =
diff --git a/third_party/jni_zero/test/golden/testPackagePrefixWithMultiplexing-Final-GEN_JNI.java.golden b/third_party/jni_zero/test/golden/testPackagePrefixWithMultiplexing-Final-GEN_JNI.java.golden
index eaf8477..d33a2f4b 100644
--- a/third_party/jni_zero/test/golden/testPackagePrefixWithMultiplexing-Final-GEN_JNI.java.golden
+++ b/third_party/jni_zero/test/golden/testPackagePrefixWithMultiplexing-Final-GEN_JNI.java.golden
@@ -6,69 +6,69 @@
 
 public class GEN_JNI {
   public static void this_is_a_package_prefix_org_jni_1zero_SampleForAnnotationProcessor_foo() {
-    this.is.a.package.prefix.J.N._V();
+    this.is.a.package.prefix.J.N.V();
   }
   public static Object this_is_a_package_prefix_org_jni_1zero_SampleForAnnotationProcessor_returnClass() {
-    return this.is.a.package.prefix.J.N._O(0);
+    return this.is.a.package.prefix.J.N.O(0);
   }
   public static Object this_is_a_package_prefix_org_jni_1zero_SampleForAnnotationProcessor_returnClasses() {
-    return this.is.a.package.prefix.J.N._O(1);
+    return this.is.a.package.prefix.J.N.O(1);
   }
   public static Object this_is_a_package_prefix_org_jni_1zero_SampleForAnnotationProcessor_returnConvertedInts() {
-    return this.is.a.package.prefix.J.N._O(2);
+    return this.is.a.package.prefix.J.N.O(2);
   }
   public static Object this_is_a_package_prefix_org_jni_1zero_SampleForAnnotationProcessor_returnConvertedString() {
-    return this.is.a.package.prefix.J.N._O(3);
+    return this.is.a.package.prefix.J.N.O(3);
   }
   public static Object this_is_a_package_prefix_org_jni_1zero_SampleForAnnotationProcessor_returnConvertedStrings() {
-    return this.is.a.package.prefix.J.N._O(4);
+    return this.is.a.package.prefix.J.N.O(4);
   }
   public static Object this_is_a_package_prefix_org_jni_1zero_SampleForAnnotationProcessor_returnObject() {
-    return this.is.a.package.prefix.J.N._O(5);
+    return this.is.a.package.prefix.J.N.O(5);
   }
   public static Object this_is_a_package_prefix_org_jni_1zero_SampleForAnnotationProcessor_returnObjects() {
-    return this.is.a.package.prefix.J.N._O(6);
+    return this.is.a.package.prefix.J.N.O(6);
   }
   public static Object this_is_a_package_prefix_org_jni_1zero_SampleForAnnotationProcessor_returnString() {
-    return this.is.a.package.prefix.J.N._O(7);
+    return this.is.a.package.prefix.J.N.O(7);
   }
   public static Object this_is_a_package_prefix_org_jni_1zero_SampleForAnnotationProcessor_returnStrings() {
-    return this.is.a.package.prefix.J.N._O(8);
+    return this.is.a.package.prefix.J.N.O(8);
   }
   public static Object this_is_a_package_prefix_org_jni_1zero_SampleForAnnotationProcessor_returnStruct() {
-    return this.is.a.package.prefix.J.N._O(9);
+    return this.is.a.package.prefix.J.N.O(9);
   }
   public static Object this_is_a_package_prefix_org_jni_1zero_SampleForAnnotationProcessor_returnStructs() {
-    return this.is.a.package.prefix.J.N._O(10);
+    return this.is.a.package.prefix.J.N.O(10);
   }
   public static Object this_is_a_package_prefix_org_jni_1zero_SampleForAnnotationProcessor_returnThrowable() {
-    return this.is.a.package.prefix.J.N._O(11);
+    return this.is.a.package.prefix.J.N.O(11);
   }
   public static Object this_is_a_package_prefix_org_jni_1zero_SampleForAnnotationProcessor_returnThrowables() {
-    return this.is.a.package.prefix.J.N._O(12);
+    return this.is.a.package.prefix.J.N.O(12);
   }
   public static boolean this_is_a_package_prefix_org_jni_1zero_SampleForAnnotationProcessor_hasPhalange() {
-    return this.is.a.package.prefix.J.N._Z();
+    return this.is.a.package.prefix.J.N.Z();
   }
   public static Object this_is_a_package_prefix_org_jni_1zero_SampleForAnnotationProcessor_bar(
       Object sample) {
-    return this.is.a.package.prefix.J.N._O_O(0, sample);
+    return this.is.a.package.prefix.J.N.OO(0, sample);
   }
   public static Object this_is_a_package_prefix_org_jni_1zero_SampleForAnnotationProcessor_returnConvertedAppObjects(
       Object __arrayClazz) {
-    return this.is.a.package.prefix.J.N._O_O(1, __arrayClazz);
+    return this.is.a.package.prefix.J.N.OO(1, __arrayClazz);
   }
   public static Object this_is_a_package_prefix_org_jni_1zero_SampleForAnnotationProcessor_revString(
       Object stringToReverse) {
-    return this.is.a.package.prefix.J.N._O_O(2, stringToReverse);
+    return this.is.a.package.prefix.J.N.OO(2, stringToReverse);
   }
   public static Object this_is_a_package_prefix_org_jni_1zero_SampleForAnnotationProcessor_sendSamplesToNative(
       Object strs) {
-    return this.is.a.package.prefix.J.N._O_O(3, strs);
+    return this.is.a.package.prefix.J.N.OO(3, strs);
   }
   public static Object this_is_a_package_prefix_org_jni_1zero_SampleForAnnotationProcessor_sendToNative(
       Object strs) {
-    return this.is.a.package.prefix.J.N._O_O(4, strs);
+    return this.is.a.package.prefix.J.N.OO(4, strs);
   }
   public static Object this_is_a_package_prefix_org_jni_1zero_SampleForAnnotationProcessor_testAllPrimitives(
       int zint,
@@ -87,7 +87,7 @@
       Object floats,
       boolean zbool,
       Object bools) {
-    return this.is.a.package.prefix.J.N._O_BCDFIJOOOOOOOOSZ(
+    return this.is.a.package.prefix.J.N.OBCDFIJOOOOOOOOSZ(
         zbyte,
         zchar,
         zdouble,
@@ -124,7 +124,7 @@
       Object view,
       Object context,
       Object convertedObjects) {
-    this.is.a.package.prefix.J.N._V_OOOOOOOOOOOOOOOOOO(
+    this.is.a.package.prefix.J.N.VOOOOOOOOOOOOOOOOOO(
         clazz,
         classes,
         throwable,
diff --git a/third_party/jni_zero/test/golden/testPackagePrefixWithMultiplexing-Final-N.java.golden b/third_party/jni_zero/test/golden/testPackagePrefixWithMultiplexing-Final-N.java.golden
index 645cc83d..7fb4118 100644
--- a/third_party/jni_zero/test/golden/testPackagePrefixWithMultiplexing-Final-N.java.golden
+++ b/third_party/jni_zero/test/golden/testPackagePrefixWithMultiplexing-Final-N.java.golden
@@ -8,11 +8,11 @@
   public static final long WHOLE_HASH = 3865356290363738592L;
   public static final long PRIORITY_HASH = 0L;
 
-  public static native void _V();
-  public static native Object _O(int _switchNum);
-  public static native boolean _Z();
-  public static native Object _O_O(int _switchNum, Object p0);
-  public static native Object _O_BCDFIJOOOOOOOOSZ(
+  public static native void V();
+  public static native Object O(int _switchNum);
+  public static native boolean Z();
+  public static native Object OO(int _switchNum, Object p0);
+  public static native Object OBCDFIJOOOOOOOOSZ(
       byte p0,
       char p1,
       double p2,
@@ -29,7 +29,7 @@
       Object p13,
       short p14,
       boolean p15);
-  public static native void _V_OOOOOOOOOOOOOOOOOO(
+  public static native void VOOOOOOOOOOOOOOOOOO(
       Object p0,
       Object p1,
       Object p2,
diff --git a/third_party/jni_zero/test/golden/testPackagePrefixWithMultiplexing-Registration.h.golden b/third_party/jni_zero/test/golden/testPackagePrefixWithMultiplexing-Registration.h.golden
index 3926eee..96472ad 100644
--- a/third_party/jni_zero/test/golden/testPackagePrefixWithMultiplexing-Registration.h.golden
+++ b/third_party/jni_zero/test/golden/testPackagePrefixWithMultiplexing-Registration.h.golden
@@ -99,10 +99,10 @@
     jobject convertedObjects);
 
 // Multiplexing Methods.
-JNI_ZERO_BOUNDARY_EXPORT void Java_this_is_a_package_prefix_J_N__1V(JNIEnv* env, jclass jcaller) {
+JNI_ZERO_BOUNDARY_EXPORT void Java_this_is_a_package_prefix_J_N_V(JNIEnv* env, jclass jcaller) {
   return Muxed_this_is_a_package_prefix_org_jni_1zero_SampleForAnnotationProcessor_foo(env);
 }
-JNI_ZERO_BOUNDARY_EXPORT jobject Java_this_is_a_package_prefix_J_N__1O(
+JNI_ZERO_BOUNDARY_EXPORT jobject Java_this_is_a_package_prefix_J_N_O(
     JNIEnv* env,
     jclass jcaller,
     jint switch_num) {
@@ -138,12 +138,10 @@
       __builtin_unreachable();
   }
 }
-JNI_ZERO_BOUNDARY_EXPORT jboolean Java_this_is_a_package_prefix_J_N__1Z(
-    JNIEnv* env,
-    jclass jcaller) {
+JNI_ZERO_BOUNDARY_EXPORT jboolean Java_this_is_a_package_prefix_J_N_Z(JNIEnv* env, jclass jcaller) {
   return Muxed_this_is_a_package_prefix_org_jni_1zero_SampleForAnnotationProcessor_hasPhalange(env);
 }
-JNI_ZERO_BOUNDARY_EXPORT jobject Java_this_is_a_package_prefix_J_N__1O_1O(
+JNI_ZERO_BOUNDARY_EXPORT jobject Java_this_is_a_package_prefix_J_N_OO(
     JNIEnv* env,
     jclass jcaller,
     jint switch_num,
@@ -164,7 +162,7 @@
       __builtin_unreachable();
   }
 }
-JNI_ZERO_BOUNDARY_EXPORT jobject Java_this_is_a_package_prefix_J_N__1O_1BCDFIJOOOOOOOOSZ(
+JNI_ZERO_BOUNDARY_EXPORT jobject Java_this_is_a_package_prefix_J_N_OBCDFIJOOOOOOOOSZ(
     JNIEnv* env,
     jclass jcaller,
     jbyte p0,
@@ -185,7 +183,7 @@
     jboolean p15) {
   return Muxed_this_is_a_package_prefix_org_jni_1zero_SampleForAnnotationProcessor_testAllPrimitives(env, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15);
 }
-JNI_ZERO_BOUNDARY_EXPORT void Java_this_is_a_package_prefix_J_N__1V_1OOOOOOOOOOOOOOOOOO(
+JNI_ZERO_BOUNDARY_EXPORT void Java_this_is_a_package_prefix_J_N_VOOOOOOOOOOOOOOOOOO(
     JNIEnv* env,
     jclass jcaller,
     jobject p0,
diff --git a/third_party/jni_zero/test/golden/testPriorityRegistration-Final-GEN_JNI.java.golden b/third_party/jni_zero/test/golden/testPriorityRegistration-Final-GEN_JNI.java.golden
index 66e28ba..fec22f4 100644
--- a/third_party/jni_zero/test/golden/testPriorityRegistration-Final-GEN_JNI.java.golden
+++ b/third_party/jni_zero/test/golden/testPriorityRegistration-Final-GEN_JNI.java.golden
@@ -6,39 +6,39 @@
 
 public class GEN_JNI {
   public static void org_jni_1zero_SampleProxyEdgeCases_foo__weirdly__escaped_name1() {
-    J.N._V(0);
+    J.N.V(0);
   }
   public static int org_jni_1zero_SampleProxyEdgeCases_setStringBuilder(int sb) {
-    return J.N._I_I(0, sb);
+    return J.N.II(0, sb);
   }
   public static Object org_jni_1zero_SampleProxyEdgeCases_genericsWithNestedClassArray(Object arg) {
-    return J.N._O_O(0, arg);
+    return J.N.OO(0, arg);
   }
   public static boolean org_jni_1zero_SampleProxyEdgeCases_setStringBuilder(Object sb) {
-    return J.N._Z_O(0, sb);
+    return J.N.ZO(0, sb);
   }
   public static void org_jni_1zero_TinySample2_test(Object a, int b) {
-    J.N._V_IO(0, b, a);
+    J.N.VIO(0, b, a);
   }
   public static void org_jni_1zero_TinySample2_test2(int a, Object b) {
-    J.N._V_IO(1, a, b);
+    J.N.VIO(1, a, b);
   }
   public static void org_jni_1zero_TinySample_foo(Object a, int b) {
-    J.N._V_IO(2, b, a);
+    J.N.VIO(2, b, a);
   }
   public static void org_jni_1zero_SampleProxyEdgeCases_setBool(Object b, Object i) {
-    J.N._V_OO(0, b, i);
+    J.N.VOO(0, b, i);
   }
   public static int org_jni_1zero_SampleProxyEdgeCases_addStructB(Object caller, Object b) {
-    return J.N._I_OO(0, caller, b);
+    return J.N.IOO(0, caller, b);
   }
   public static Object org_jni_1zero_SampleProxyEdgeCases_arrayTypes1(Object a, Object b) {
-    return J.N._O_OO(0, a, b);
+    return J.N.OOO(0, a, b);
   }
   public static Object org_jni_1zero_SampleProxyEdgeCases_arrayTypes2(Object a, Object b) {
-    return J.N._O_OO(1, a, b);
+    return J.N.OOO(1, a, b);
   }
   public static boolean org_jni_1zero_TinySample_bar(int a, Object b) {
-    return J.N._Z_IO(0, a, b);
+    return J.N.ZIO(0, a, b);
   }
 }
diff --git a/third_party/jni_zero/test/golden/testPriorityRegistration-Final-N.java.golden b/third_party/jni_zero/test/golden/testPriorityRegistration-Final-N.java.golden
index aec60a1..28c05bfa 100644
--- a/third_party/jni_zero/test/golden/testPriorityRegistration-Final-N.java.golden
+++ b/third_party/jni_zero/test/golden/testPriorityRegistration-Final-N.java.golden
@@ -8,13 +8,13 @@
   public static final long WHOLE_HASH = -7874644414477415949L;
   public static final long PRIORITY_HASH = 4128442159926458844L;
 
-  public static native void _V(int _switchNum);
-  public static native int _I_I(int _switchNum, int p0);
-  public static native Object _O_O(int _switchNum, Object p0);
-  public static native boolean _Z_O(int _switchNum, Object p0);
-  public static native void _V_IO(int _switchNum, int p0, Object p1);
-  public static native void _V_OO(int _switchNum, Object p0, Object p1);
-  public static native int _I_OO(int _switchNum, Object p0, Object p1);
-  public static native Object _O_OO(int _switchNum, Object p0, Object p1);
-  public static native boolean _Z_IO(int _switchNum, int p0, Object p1);
+  public static native void V(int _switchNum);
+  public static native int II(int _switchNum, int p0);
+  public static native Object OO(int _switchNum, Object p0);
+  public static native boolean ZO(int _switchNum, Object p0);
+  public static native void VIO(int _switchNum, int p0, Object p1);
+  public static native void VOO(int _switchNum, Object p0, Object p1);
+  public static native int IOO(int _switchNum, Object p0, Object p1);
+  public static native Object OOO(int _switchNum, Object p0, Object p1);
+  public static native boolean ZIO(int _switchNum, int p0, Object p1);
 }
diff --git a/third_party/jni_zero/test/golden/testPriorityRegistration-Registration.h.golden b/third_party/jni_zero/test/golden/testPriorityRegistration-Registration.h.golden
index 62fb971..68f6ec5 100644
--- a/third_party/jni_zero/test/golden/testPriorityRegistration-Registration.h.golden
+++ b/third_party/jni_zero/test/golden/testPriorityRegistration-Registration.h.golden
@@ -72,7 +72,7 @@
 JNI_ZERO_MUXED_ENTRYPOINT void Muxed_org_jni_1zero_TinySample_foo(JNIEnv* env, jint b, jobject a);
 
 // Multiplexing Methods.
-JNI_ZERO_BOUNDARY_EXPORT void Java_J_N__1V(JNIEnv* env, jclass jcaller, jint switch_num) {
+JNI_ZERO_BOUNDARY_EXPORT void Java_J_N_V(JNIEnv* env, jclass jcaller, jint switch_num) {
   JNI_ZERO_DCHECK(switch_num >= 0 && switch_num < 1);
   switch (switch_num) {
     case 0:
@@ -81,11 +81,7 @@
       __builtin_unreachable();
   }
 }
-JNI_ZERO_BOUNDARY_EXPORT jint Java_J_N__1I_1I(
-    JNIEnv* env,
-    jclass jcaller,
-    jint switch_num,
-    jint p0) {
+JNI_ZERO_BOUNDARY_EXPORT jint Java_J_N_II(JNIEnv* env, jclass jcaller, jint switch_num, jint p0) {
   JNI_ZERO_DCHECK(switch_num >= 0 && switch_num < 1);
   switch (switch_num) {
     case 0:
@@ -94,7 +90,7 @@
       __builtin_unreachable();
   }
 }
-JNI_ZERO_BOUNDARY_EXPORT jobject Java_J_N__1O_1O(
+JNI_ZERO_BOUNDARY_EXPORT jobject Java_J_N_OO(
     JNIEnv* env,
     jclass jcaller,
     jint switch_num,
@@ -107,7 +103,7 @@
       __builtin_unreachable();
   }
 }
-JNI_ZERO_BOUNDARY_EXPORT jboolean Java_J_N__1Z_1O(
+JNI_ZERO_BOUNDARY_EXPORT jboolean Java_J_N_ZO(
     JNIEnv* env,
     jclass jcaller,
     jint switch_num,
@@ -120,7 +116,7 @@
       __builtin_unreachable();
   }
 }
-JNI_ZERO_BOUNDARY_EXPORT void Java_J_N__1V_1IO(
+JNI_ZERO_BOUNDARY_EXPORT void Java_J_N_VIO(
     JNIEnv* env,
     jclass jcaller,
     jint switch_num,
@@ -138,7 +134,7 @@
       __builtin_unreachable();
   }
 }
-JNI_ZERO_BOUNDARY_EXPORT void Java_J_N__1V_1OO(
+JNI_ZERO_BOUNDARY_EXPORT void Java_J_N_VOO(
     JNIEnv* env,
     jclass jcaller,
     jint switch_num,
@@ -152,7 +148,7 @@
       __builtin_unreachable();
   }
 }
-JNI_ZERO_BOUNDARY_EXPORT jint Java_J_N__1I_1OO(
+JNI_ZERO_BOUNDARY_EXPORT jint Java_J_N_IOO(
     JNIEnv* env,
     jclass jcaller,
     jint switch_num,
@@ -166,7 +162,7 @@
       __builtin_unreachable();
   }
 }
-JNI_ZERO_BOUNDARY_EXPORT jobject Java_J_N__1O_1OO(
+JNI_ZERO_BOUNDARY_EXPORT jobject Java_J_N_OOO(
     JNIEnv* env,
     jclass jcaller,
     jint switch_num,
@@ -182,7 +178,7 @@
       __builtin_unreachable();
   }
 }
-JNI_ZERO_BOUNDARY_EXPORT jboolean Java_J_N__1Z_1IO(
+JNI_ZERO_BOUNDARY_EXPORT jboolean Java_J_N_ZIO(
     JNIEnv* env,
     jclass jcaller,
     jint switch_num,
diff --git a/third_party/jni_zero/test/golden/testPriorityRegistrationPart2-Final-GEN_JNI.java.golden b/third_party/jni_zero/test/golden/testPriorityRegistrationPart2-Final-GEN_JNI.java.golden
index 86814ce9..3cd656a 100644
--- a/third_party/jni_zero/test/golden/testPriorityRegistrationPart2-Final-GEN_JNI.java.golden
+++ b/third_party/jni_zero/test/golden/testPriorityRegistrationPart2-Final-GEN_JNI.java.golden
@@ -6,9 +6,9 @@
 
 public class GEN_JNI {
   public static void org_jni_1zero_TinySample2_test(Object a, int b) {
-    J.N._V_IO(0, b, a);
+    J.N.VIO(0, b, a);
   }
   public static void org_jni_1zero_TinySample2_test2(int a, Object b) {
-    J.N._V_IO(1, a, b);
+    J.N.VIO(1, a, b);
   }
 }
diff --git a/third_party/jni_zero/test/golden/testPriorityRegistrationPart2-Final-N.java.golden b/third_party/jni_zero/test/golden/testPriorityRegistrationPart2-Final-N.java.golden
index 3d6ccda9..46d8b601 100644
--- a/third_party/jni_zero/test/golden/testPriorityRegistrationPart2-Final-N.java.golden
+++ b/third_party/jni_zero/test/golden/testPriorityRegistrationPart2-Final-N.java.golden
@@ -8,5 +8,5 @@
   public static final long WHOLE_HASH = 4128442159926458844L;
   public static final long PRIORITY_HASH = 1L;
 
-  public static native void _V_IO(int _switchNum, int p0, Object p1);
+  public static native void VIO(int _switchNum, int p0, Object p1);
 }
diff --git a/third_party/jni_zero/test/golden/testPriorityRegistrationPart2-Registration.h.golden b/third_party/jni_zero/test/golden/testPriorityRegistrationPart2-Registration.h.golden
index eff1e21..1d24616 100644
--- a/third_party/jni_zero/test/golden/testPriorityRegistrationPart2-Registration.h.golden
+++ b/third_party/jni_zero/test/golden/testPriorityRegistrationPart2-Registration.h.golden
@@ -24,7 +24,7 @@
     jobject b);
 
 // Multiplexing Methods.
-JNI_ZERO_BOUNDARY_EXPORT void Java_J_N__1V_1IO(
+JNI_ZERO_BOUNDARY_EXPORT void Java_J_N_VIO(
     JNIEnv* env,
     jclass jcaller,
     jint switch_num,
diff --git a/third_party/llvm-libc/src b/third_party/llvm-libc/src
index c19ea20..bba7898 160000
--- a/third_party/llvm-libc/src
+++ b/third_party/llvm-libc/src
@@ -1 +1 @@
-Subproject commit c19ea20051628d97f4e3a0fc74992ac32fd82a56
+Subproject commit bba78980368407630a21a3918e7e8a4cc5fef205
diff --git a/third_party/perfetto b/third_party/perfetto
index 01f1eab..19792a9 160000
--- a/third_party/perfetto
+++ b/third_party/perfetto
@@ -1 +1 @@
-Subproject commit 01f1eab6f88647dab2a70eb72c92a6cf7c6acb86
+Subproject commit 19792a9913a7c898c2a154c10b580087bc2ee7b6
diff --git a/third_party/rust/bstr/v1/BUILD.gn b/third_party/rust/bstr/v1/BUILD.gn
index c4f7bc5a..0e4c4357d 100644
--- a/third_party/rust/bstr/v1/BUILD.gn
+++ b/third_party/rust/bstr/v1/BUILD.gn
@@ -13,41 +13,41 @@
   epoch = "1"
   crate_type = "rlib"
   crate_root =
-      "//third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/lib.rs"
+      "//third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/lib.rs"
   sources = [
-    "//third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/ascii.rs",
-    "//third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/bstr.rs",
-    "//third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/bstring.rs",
-    "//third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/byteset/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/byteset/scalar.rs",
-    "//third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/escape_bytes.rs",
-    "//third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/ext_slice.rs",
-    "//third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/ext_vec.rs",
-    "//third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/impls.rs",
-    "//third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/io.rs",
-    "//third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/lib.rs",
-    "//third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/tests.rs",
-    "//third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/fsm/grapheme_break_fwd.rs",
-    "//third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/fsm/grapheme_break_rev.rs",
-    "//third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/fsm/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/fsm/regional_indicator_rev.rs",
-    "//third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/fsm/sentence_break_fwd.rs",
-    "//third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/fsm/simple_word_fwd.rs",
-    "//third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/fsm/whitespace_anchored_fwd.rs",
-    "//third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/fsm/whitespace_anchored_rev.rs",
-    "//third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/fsm/word_break_fwd.rs",
-    "//third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/grapheme.rs",
-    "//third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/sentence.rs",
-    "//third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/whitespace.rs",
-    "//third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/word.rs",
-    "//third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/utf8.rs",
+    "//third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/ascii.rs",
+    "//third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/bstr.rs",
+    "//third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/bstring.rs",
+    "//third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/byteset/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/byteset/scalar.rs",
+    "//third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/escape_bytes.rs",
+    "//third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/ext_slice.rs",
+    "//third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/ext_vec.rs",
+    "//third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/impls.rs",
+    "//third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/io.rs",
+    "//third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/lib.rs",
+    "//third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/tests.rs",
+    "//third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/fsm/grapheme_break_fwd.rs",
+    "//third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/fsm/grapheme_break_rev.rs",
+    "//third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/fsm/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/fsm/regional_indicator_rev.rs",
+    "//third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/fsm/sentence_break_fwd.rs",
+    "//third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/fsm/simple_word_fwd.rs",
+    "//third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/fsm/whitespace_anchored_fwd.rs",
+    "//third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/fsm/whitespace_anchored_rev.rs",
+    "//third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/fsm/word_break_fwd.rs",
+    "//third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/grapheme.rs",
+    "//third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/sentence.rs",
+    "//third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/whitespace.rs",
+    "//third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/word.rs",
+    "//third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/utf8.rs",
   ]
   inputs = []
 
   build_native_rust_unit_tests = false
   edition = "2021"
-  cargo_pkg_version = "1.11.1"
+  cargo_pkg_version = "1.11.3"
   cargo_pkg_authors = "Andrew Gallant <jamslam@gmail.com>"
   cargo_pkg_name = "bstr"
   cargo_pkg_description =
diff --git a/third_party/rust/bstr/v1/README.chromium b/third_party/rust/bstr/v1/README.chromium
index d64cde3..715ec14 100644
--- a/third_party/rust/bstr/v1/README.chromium
+++ b/third_party/rust/bstr/v1/README.chromium
@@ -1,9 +1,9 @@
 Name: bstr
 URL: https://crates.io/crates/bstr
-Version: 1.11.1
-Revision: de55623f76f01dc9db4ca0f98966299b41146d6d
+Version: 1.11.3
+Revision: cbe2c692782d772f7c2fd8be0972bf9b91889a97
 License: Apache-2.0
-License File: //third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/LICENSE-APACHE
+License File: //third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/LICENSE-APACHE
 Shipped: yes
 Security Critical: yes
 
diff --git a/third_party/rust/chromium_crates_io/Cargo.lock b/third_party/rust/chromium_crates_io/Cargo.lock
index 0db92d32..66a5113 100644
--- a/third_party/rust/chromium_crates_io/Cargo.lock
+++ b/third_party/rust/chromium_crates_io/Cargo.lock
@@ -42,7 +42,7 @@
 
 [[package]]
 name = "bstr"
-version = "1.11.1"
+version = "1.11.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "memchr",
@@ -79,7 +79,7 @@
 
 [[package]]
 name = "cc"
-version = "1.2.5"
+version = "1.2.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "shlex",
@@ -182,7 +182,7 @@
 
 [[package]]
 name = "cxx"
-version = "1.0.135"
+version = "1.0.136"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "cc",
@@ -195,7 +195,7 @@
 
 [[package]]
 name = "cxxbridge-cmd"
-version = "1.0.135"
+version = "1.0.136"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "clap",
@@ -207,12 +207,12 @@
 
 [[package]]
 name = "cxxbridge-flags"
-version = "1.0.135"
+version = "1.0.136"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "cxxbridge-macro"
-version = "1.0.135"
+version = "1.0.136"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "proc-macro2",
@@ -273,7 +273,7 @@
 
 [[package]]
 name = "glob"
-version = "0.3.1"
+version = "0.3.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
@@ -411,7 +411,7 @@
 
 [[package]]
 name = "quote"
-version = "1.0.37"
+version = "1.0.38"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "proc-macro2",
@@ -550,7 +550,7 @@
 
 [[package]]
 name = "rustversion"
-version = "1.0.18"
+version = "1.0.19"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
@@ -565,7 +565,7 @@
 
 [[package]]
 name = "serde"
-version = "1.0.216"
+version = "1.0.217"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "serde_derive",
@@ -573,7 +573,7 @@
 
 [[package]]
 name = "serde_derive"
-version = "1.0.216"
+version = "1.0.217"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "proc-macro2",
@@ -656,7 +656,7 @@
 
 [[package]]
 name = "syn"
-version = "2.0.91"
+version = "2.0.95"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "proc-macro2",
diff --git a/third_party/rust/chromium_crates_io/supply-chain/audits.toml b/third_party/rust/chromium_crates_io/supply-chain/audits.toml
index 31aaf1eeb..1d487031 100644
--- a/third_party/rust/chromium_crates_io/supply-chain/audits.toml
+++ b/third_party/rust/chromium_crates_io/supply-chain/audits.toml
@@ -325,6 +325,12 @@
 delta = "1.11.0 -> 1.11.1"
 notes = "This release just excludes Unicode data files from being published to crates.io"
 
+[[audits.bstr]]
+who = "Dustin J. Mitchell <djmitche@chromium.org>"
+criteria = ["safe-to-deploy", "does-not-implement-crypto", "ub-risk-2"]
+delta = "1.11.1 -> 1.11.3"
+notes = "No unsafe changes"
+
 [[audits.bytemuck]]
 who = "Lukasz Anforowicz <lukasza@chromium.org>"
 criteria = "safe-to-deploy"
@@ -976,6 +982,11 @@
 (coming from my https://github.com/dtolnay/cxx/pull/1414)
 """
 
+[[audits.cxxbridge-cmd]]
+who = "Dustin J. Mitchell <djmitche@chromium.org>"
+criteria = ["safe-to-run", "does-not-implement-crypto"]
+delta = "1.0.135 -> 1.0.136"
+
 [[audits.cxxbridge-flags]]
 who = "danakj@chromium.org"
 criteria = ["safe-to-run", "does-not-implement-crypto"]
@@ -1036,6 +1047,11 @@
 delta = "1.0.131 -> 1.0.135"
 notes = "No code changes in the delta"
 
+[[audits.cxxbridge-flags]]
+who = "Dustin J. Mitchell <djmitche@chromium.org>"
+criteria = ["safe-to-deploy", "does-not-implement-crypto", "ub-risk-0"]
+delta = "1.0.135 -> 1.0.136"
+
 [[audits.cxxbridge-macro]]
 who = "danakj <danakj@chromium.org>"
 criteria = "does-not-implement-crypto"
@@ -1383,6 +1399,12 @@
 usage or crypto.
 """
 
+[[audits.glob]]
+who = "Dustin J. Mitchell <djmitche@chromium.org>"
+criteria = ["safe-to-deploy", "does-not-implement-crypto", "ub-risk-0"]
+delta = "0.3.1 -> 0.3.2"
+notes = "Still no unsafe"
+
 [[audits.heck]]
 who = "Lukasz Anforowicz <lukasza@chromium.org>"
 criteria = ["ub-risk-0", "safe-to-deploy", "does-not-implement-crypto"]
@@ -1793,13 +1815,19 @@
 
 [[audits.quote]]
 who = "Lukasz Anforowicz <lukasza@chromium.org>"
-criteria = ["safe-to-deploy", "does-not-implement-crypto", "ub-risk-2"]
+criteria = ["safe-to-deploy", "does-not-implement-crypto", "ub-risk-0"]
 delta = "1.0.36 -> 1.0.37"
 notes = """
 The delta just 1) inlines/expands `impl ToTokens` that used to be handled via
 `primitive!` macro and 2) adds `impl ToTokens` for `CStr` and `CString`.
 """
 
+[[audits.quote]]
+who = "Dustin J. Mitchell <djmitche@chromium.org>"
+criteria = ["safe-to-deploy", "does-not-implement-crypto", "ub-risk-0"]
+delta = "1.0.37 -> 1.0.38"
+notes = "Still no unsafe"
+
 [[audits.rand]]
 who = "danakj@chromium.org"
 criteria = ["safe-to-run", "does-not-implement-crypto"]
@@ -2145,15 +2173,21 @@
 
 [[audits.rustversion]]
 who = "Dustin J. Mitchell <djmitche@chromium.org>"
-criteria = ["safe-to-deploy", "does-not-implement-crypto", "ub-risk-2"]
+criteria = ["safe-to-deploy", "does-not-implement-crypto", "ub-risk-0"]
 delta = "1.0.16 -> 1.0.17"
 notes = "Just updates windows compat"
 
 [[audits.rustversion]]
 who = "Liza Burakova <liza@chromium.org>"
-criteria = ["safe-to-deploy", "does-not-implement-crypto", "ub-risk-2"]
+criteria = ["safe-to-deploy", "does-not-implement-crypto", "ub-risk-0"]
 delta = "1.0.17 -> 1.0.18"
 
+[[audits.rustversion]]
+who = "Dustin J. Mitchell <djmitche@chromium.org>"
+criteria = ["safe-to-deploy", "does-not-implement-crypto", "ub-risk-0"]
+delta = "1.0.18 -> 1.0.19"
+notes = "No unsafe, just doc changes"
+
 [[audits.semver]]
 who = "danakj@chromium.org"
 criteria = ["safe-to-run", "does-not-implement-crypto"]
@@ -2279,6 +2313,12 @@
 delta = "1.0.215 -> 1.0.216"
 notes = "The delta makes minor changes in `build.rs` - switching to the `?` syntax sugar."
 
+[[audits.serde]]
+who = "Dustin J. Mitchell <djmitche@chromium.org>"
+criteria = ["safe-to-deploy", "does-not-implement-crypto", "ub-risk-2"]
+delta = "1.0.216 -> 1.0.217"
+notes = "Minimal changes, nothing unsafe"
+
 [[audits.serde_derive]]
 who = "Lukasz Anforowicz <lukasza@chromium.org>"
 criteria = "ub-risk-0"
@@ -2371,6 +2411,12 @@
 delta = "1.0.215 -> 1.0.216"
 notes = "The delta adds `#[automatically_derived]` in a few places.  Still no `unsafe`."
 
+[[audits.serde_derive]]
+who = "Dustin J. Mitchell <djmitche@chromium.org>"
+criteria = ["safe-to-deploy", "does-not-implement-crypto", "ub-risk-0"]
+delta = "1.0.216 -> 1.0.217"
+notes = "No changes"
+
 [[audits.serde_json]]
 who = "danakj@chromium.org"
 criteria = ["safe-to-run", "does-not-implement-crypto"]
diff --git a/third_party/rust/chromium_crates_io/supply-chain/config.toml b/third_party/rust/chromium_crates_io/supply-chain/config.toml
index 2d8f7e2..82a5cfbc 100644
--- a/third_party/rust/chromium_crates_io/supply-chain/config.toml
+++ b/third_party/rust/chromium_crates_io/supply-chain/config.toml
@@ -62,7 +62,7 @@
 [policy."bitflags:2.6.0"]
 criteria = ["crypto-safe", "safe-to-deploy", "ub-risk-2"]
 
-[policy."bstr:1.11.1"]
+[policy."bstr:1.11.3"]
 criteria = ["crypto-safe", "safe-to-deploy", "ub-risk-2"]
 
 [policy."bytemuck:1.21.0"]
@@ -77,7 +77,7 @@
 [policy."bytes:1.9.0"]
 criteria = ["crypto-safe", "safe-to-run"]
 
-[policy."cc:1.2.5"]
+[policy."cc:1.2.7"]
 criteria = []
 
 [policy."cfg-if:1.0.0"]
@@ -98,16 +98,16 @@
 [policy."crc32fast:1.4.2"]
 criteria = ["crypto-safe", "safe-to-deploy", "ub-risk-2"]
 
-[policy."cxx:1.0.135"]
+[policy."cxx:1.0.136"]
 criteria = ["crypto-safe", "safe-to-deploy", "ub-risk-2"]
 
-[policy."cxxbridge-cmd:1.0.135"]
+[policy."cxxbridge-cmd:1.0.136"]
 criteria = ["crypto-safe", "safe-to-run"]
 
-[policy."cxxbridge-flags:1.0.135"]
+[policy."cxxbridge-flags:1.0.136"]
 criteria = ["crypto-safe", "safe-to-deploy", "ub-risk-2"]
 
-[policy."cxxbridge-macro:1.0.135"]
+[policy."cxxbridge-macro:1.0.136"]
 criteria = ["crypto-safe", "safe-to-deploy", "ub-risk-2"]
 
 [policy."either:1.13.0"]
@@ -131,7 +131,7 @@
 [policy."getrandom:0.2.15"]
 criteria = ["crypto-safe", "safe-to-run"]
 
-[policy."glob:0.3.1"]
+[policy."glob:0.3.2"]
 criteria = ["crypto-safe", "safe-to-run"]
 
 [policy."heck:0.4.1"]
@@ -191,7 +191,7 @@
 [policy."qr_code:2.0.0"]
 criteria = ["crypto-safe", "safe-to-deploy", "ub-risk-2"]
 
-[policy."quote:1.0.37"]
+[policy."quote:1.0.38"]
 criteria = ["crypto-safe", "safe-to-deploy", "ub-risk-2"]
 
 [policy."rand:0.8.5"]
@@ -239,7 +239,7 @@
 [policy."rustc_version:0.4.1"]
 criteria = ["crypto-safe", "safe-to-run"]
 
-[policy."rustversion:1.0.18"]
+[policy."rustversion:1.0.19"]
 criteria = ["crypto-safe", "safe-to-deploy", "ub-risk-2"]
 
 [policy."ryu:1.0.18"]
@@ -248,10 +248,10 @@
 [policy."semver:1.0.24"]
 criteria = ["crypto-safe", "safe-to-run"]
 
-[policy."serde:1.0.216"]
+[policy."serde:1.0.217"]
 criteria = ["crypto-safe", "safe-to-deploy", "ub-risk-2"]
 
-[policy."serde_derive:1.0.216"]
+[policy."serde_derive:1.0.217"]
 criteria = ["crypto-safe", "safe-to-deploy", "ub-risk-2"]
 
 [policy."serde_json:1.0.134"]
@@ -284,7 +284,7 @@
 [policy."strum_macros:0.25.3"]
 criteria = ["crypto-safe", "safe-to-deploy", "ub-risk-2"]
 
-[policy."syn:2.0.91"]
+[policy."syn:2.0.95"]
 criteria = ["crypto-safe", "safe-to-deploy", "ub-risk-2"]
 
 [policy."termcolor:1.4.1"]
@@ -348,7 +348,7 @@
 criteria = ["crypto-safe", "safe-to-deploy", "ub-risk-2"]
 
 [[exemptions.cxx]]
-version = "1.0.135"
+version = "1.0.136"
 criteria = ["safe-to-deploy", "crypto-safe", "ub-risk-2"]
 notes = """
 Grandparented-in when setting up `cargo vet` in Jan 2024
@@ -367,10 +367,11 @@
 Exemption updated to 1.0.130 in November 2024.
 Exemption updated to 1.0.131 in December 2024.
 Exemption updated to 1.0.135 in December 2024.
+Exemption updated to 1.0.136 in January 2025.
 """
 
 [[exemptions.cxxbridge-macro]]
-version = "1.0.135"
+version = "1.0.136"
 criteria = ["safe-to-deploy", "crypto-safe", "ub-risk-2"]
 notes = """
 Grandparented-in when setting up `cargo vet` in Jan 2024
@@ -389,6 +390,7 @@
 Exemption updated to 1.0.130 in November 2024.
 Exemption updated to 1.0.131 in December 2024.
 Exemption updated to 1.0.135 in December 2024.
+Exemption updated to 1.0.136 in January 2025.
 """
 
 [[exemptions.memchr]]
@@ -434,7 +436,7 @@
 """
 
 [[exemptions.syn]]
-version = "2.0.91"
+version = "2.0.95"
 criteria = ["safe-to-deploy", "crypto-safe", "ub-risk-2"]
 notes = """
 Grandparented-in when setting up `cargo vet` in Jan 2024
@@ -465,6 +467,7 @@
 Exemption updated to 2.0.87 when updating the crate in November 2024.
 Exemption updated to 2.0.90 when updating the crate in November 2024.
 Exemption updated to 2.0.91 when updating the crate in December 2024.
+Exemption updated to 2.0.95 when updating the crate in January 2025.
 """
 
 [[exemptions.zerocopy]]
diff --git a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/.cargo_vcs_info.json b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/.cargo_vcs_info.json
deleted file mode 100644
index 441bb78..0000000
--- a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/.cargo_vcs_info.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-  "git": {
-    "sha1": "de55623f76f01dc9db4ca0f98966299b41146d6d"
-  },
-  "path_in_vcs": ""
-}
\ No newline at end of file
diff --git a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/.cargo-checksum.json b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/.cargo-checksum.json
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/.cargo-checksum.json
rename to third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/.cargo-checksum.json
diff --git a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/.cargo_vcs_info.json b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/.cargo_vcs_info.json
new file mode 100644
index 0000000..4eb5594
--- /dev/null
+++ b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/.cargo_vcs_info.json
@@ -0,0 +1,6 @@
+{
+  "git": {
+    "sha1": "cbe2c692782d772f7c2fd8be0972bf9b91889a97"
+  },
+  "path_in_vcs": ""
+}
\ No newline at end of file
diff --git a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/.gitignore b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/.gitignore
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/.gitignore
rename to third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/.gitignore
diff --git a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/COPYING b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/COPYING
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/COPYING
rename to third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/COPYING
diff --git a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/Cargo.lock b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/Cargo.lock
similarity index 99%
rename from third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/Cargo.lock
rename to third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/Cargo.lock
index 19d42aa..8d84267 100644
--- a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/Cargo.lock
+++ b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/Cargo.lock
@@ -4,7 +4,7 @@
 
 [[package]]
 name = "bstr"
-version = "1.11.1"
+version = "1.11.3"
 dependencies = [
  "memchr",
  "quickcheck",
diff --git a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/Cargo.toml b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/Cargo.toml
similarity index 99%
rename from third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/Cargo.toml
rename to third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/Cargo.toml
index cfb046f..abc1ab7 100644
--- a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/Cargo.toml
+++ b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/Cargo.toml
@@ -13,7 +13,7 @@
 edition = "2021"
 rust-version = "1.73"
 name = "bstr"
-version = "1.11.1"
+version = "1.11.3"
 authors = ["Andrew Gallant <jamslam@gmail.com>"]
 build = false
 exclude = [
diff --git a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/Cargo.toml.orig b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/Cargo.toml.orig
similarity index 98%
rename from third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/Cargo.toml.orig
rename to third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/Cargo.toml.orig
index 1c3433d..1d17249 100644
--- a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/Cargo.toml.orig
+++ b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/Cargo.toml.orig
@@ -1,6 +1,6 @@
 [package]
 name = "bstr"
-version = "1.11.1"  #:version
+version = "1.11.3"  #:version
 authors = ["Andrew Gallant <jamslam@gmail.com>"]
 description = "A string type that is not required to be valid UTF-8."
 documentation = "https://docs.rs/bstr"
diff --git a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/LICENSE-APACHE b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/LICENSE-APACHE
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/LICENSE-APACHE
rename to third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/LICENSE-APACHE
diff --git a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/LICENSE-MIT b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/LICENSE-MIT
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/LICENSE-MIT
rename to third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/LICENSE-MIT
diff --git a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/README.md b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/README.md
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/README.md
rename to third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/README.md
diff --git a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/examples/graphemes-std.rs b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/examples/graphemes-std.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/examples/graphemes-std.rs
rename to third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/examples/graphemes-std.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/examples/graphemes.rs b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/examples/graphemes.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/examples/graphemes.rs
rename to third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/examples/graphemes.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/examples/lines-std.rs b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/examples/lines-std.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/examples/lines-std.rs
rename to third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/examples/lines-std.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/examples/lines.rs b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/examples/lines.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/examples/lines.rs
rename to third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/examples/lines.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/examples/uppercase-std.rs b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/examples/uppercase-std.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/examples/uppercase-std.rs
rename to third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/examples/uppercase-std.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/examples/uppercase.rs b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/examples/uppercase.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/examples/uppercase.rs
rename to third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/examples/uppercase.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/examples/words-std.rs b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/examples/words-std.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/examples/words-std.rs
rename to third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/examples/words-std.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/examples/words.rs b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/examples/words.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/examples/words.rs
rename to third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/examples/words.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/rustfmt.toml b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/rustfmt.toml
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/rustfmt.toml
rename to third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/rustfmt.toml
diff --git a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/ascii.rs b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/ascii.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/ascii.rs
rename to third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/ascii.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/bstr.rs b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/bstr.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/bstr.rs
rename to third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/bstr.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/bstring.rs b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/bstring.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/bstring.rs
rename to third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/bstring.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/byteset/mod.rs b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/byteset/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/byteset/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/byteset/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/byteset/scalar.rs b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/byteset/scalar.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/byteset/scalar.rs
rename to third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/byteset/scalar.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/escape_bytes.rs b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/escape_bytes.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/escape_bytes.rs
rename to third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/escape_bytes.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/ext_slice.rs b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/ext_slice.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/ext_slice.rs
rename to third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/ext_slice.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/ext_vec.rs b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/ext_vec.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/ext_vec.rs
rename to third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/ext_vec.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/impls.rs b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/impls.rs
similarity index 96%
rename from third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/impls.rs
rename to third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/impls.rs
index 1c9614d..f09bb9e 100644
--- a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/impls.rs
+++ b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/impls.rs
@@ -1,6 +1,6 @@
 macro_rules! impl_partial_eq {
     ($lhs:ty, $rhs:ty) => {
-        impl<'a, 'b> PartialEq<$rhs> for $lhs {
+        impl<'a> PartialEq<$rhs> for $lhs {
             #[inline]
             fn eq(&self, other: &$rhs) -> bool {
                 let other: &[u8] = other.as_ref();
@@ -8,7 +8,7 @@
             }
         }
 
-        impl<'a, 'b> PartialEq<$lhs> for $rhs {
+        impl<'a> PartialEq<$lhs> for $rhs {
             #[inline]
             fn eq(&self, other: &$lhs) -> bool {
                 let this: &[u8] = self.as_ref();
@@ -20,7 +20,7 @@
 
 macro_rules! impl_partial_eq_n {
     ($lhs:ty, $rhs:ty) => {
-        impl<'a, 'b, const N: usize> PartialEq<$rhs> for $lhs {
+        impl<'a, const N: usize> PartialEq<$rhs> for $lhs {
             #[inline]
             fn eq(&self, other: &$rhs) -> bool {
                 let other: &[u8] = other.as_ref();
@@ -28,7 +28,7 @@
             }
         }
 
-        impl<'a, 'b, const N: usize> PartialEq<$lhs> for $rhs {
+        impl<'a, const N: usize> PartialEq<$lhs> for $rhs {
             #[inline]
             fn eq(&self, other: &$lhs) -> bool {
                 let this: &[u8] = self.as_ref();
@@ -41,7 +41,7 @@
 #[cfg(feature = "alloc")]
 macro_rules! impl_partial_eq_cow {
     ($lhs:ty, $rhs:ty) => {
-        impl<'a, 'b> PartialEq<$rhs> for $lhs {
+        impl<'a> PartialEq<$rhs> for $lhs {
             #[inline]
             fn eq(&self, other: &$rhs) -> bool {
                 let other: &[u8] = (&**other).as_ref();
@@ -49,11 +49,11 @@
             }
         }
 
-        impl<'a, 'b> PartialEq<$lhs> for $rhs {
+        impl<'a> PartialEq<$lhs> for $rhs {
             #[inline]
             fn eq(&self, other: &$lhs) -> bool {
-                let this: &[u8] = (&**other).as_ref();
-                PartialEq::eq(this, self.as_bytes())
+                let this: &[u8] = (&**self).as_ref();
+                PartialEq::eq(this, other.as_bytes())
             }
         }
     };
@@ -61,7 +61,7 @@
 
 macro_rules! impl_partial_ord {
     ($lhs:ty, $rhs:ty) => {
-        impl<'a, 'b> PartialOrd<$rhs> for $lhs {
+        impl<'a> PartialOrd<$rhs> for $lhs {
             #[inline]
             fn partial_cmp(&self, other: &$rhs) -> Option<Ordering> {
                 let other: &[u8] = other.as_ref();
@@ -69,7 +69,7 @@
             }
         }
 
-        impl<'a, 'b> PartialOrd<$lhs> for $rhs {
+        impl<'a> PartialOrd<$lhs> for $rhs {
             #[inline]
             fn partial_cmp(&self, other: &$lhs) -> Option<Ordering> {
                 let this: &[u8] = self.as_ref();
@@ -81,7 +81,7 @@
 
 macro_rules! impl_partial_ord_n {
     ($lhs:ty, $rhs:ty) => {
-        impl<'a, 'b, const N: usize> PartialOrd<$rhs> for $lhs {
+        impl<'a, const N: usize> PartialOrd<$rhs> for $lhs {
             #[inline]
             fn partial_cmp(&self, other: &$rhs) -> Option<Ordering> {
                 let other: &[u8] = other.as_ref();
@@ -89,7 +89,7 @@
             }
         }
 
-        impl<'a, 'b, const N: usize> PartialOrd<$lhs> for $rhs {
+        impl<'a, const N: usize> PartialOrd<$lhs> for $rhs {
             #[inline]
             fn partial_cmp(&self, other: &$lhs) -> Option<Ordering> {
                 let this: &[u8] = self.as_ref();
@@ -525,6 +525,9 @@
             for (s, e, ch) in self.char_indices() {
                 match ch {
                     '\0' => write!(f, "\\0")?,
+                    '\x01'..='\x7f' => {
+                        write!(f, "{}", (ch as u8).escape_ascii())?;
+                    }
                     '\u{FFFD}' => {
                         let bytes = self[s..e].as_bytes();
                         if bytes == b"\xEF\xBF\xBD" {
@@ -535,17 +538,6 @@
                             }
                         }
                     }
-                    // ASCII control characters except \0, \n, \r, \t
-                    '\x01'..='\x08'
-                    | '\x0b'
-                    | '\x0c'
-                    | '\x0e'..='\x19'
-                    | '\x7f' => {
-                        write!(f, "\\x{:02x}", ch as u32)?;
-                    }
-                    '\n' | '\r' | '\t' => {
-                        write!(f, "{}", ch.escape_debug())?;
-                    }
                     _ => {
                         write!(f, "{}", ch.escape_debug())?;
                     }
@@ -1305,7 +1297,12 @@
         // Before fixing #188, the output here would be:
         //   \\xED\\xA0\\x80Aa\\x7f\\x0b
         B(&format!("{:?}", b"\xed\xa0\x80Aa\x7f\x0b".as_bstr())).as_bstr(),
-    )
+    );
+
+    assert_eq!(
+        r#""\0\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x11\x12\r\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f \x7f\x80\x81\xfe\xff""#,
+        format!("{:?}", b"\0\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x11\x12\r\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f \x7f\x80\x81\xfe\xff".as_bstr()),
+    );
 }
 
 // See: https://github.com/BurntSushi/bstr/issues/82
diff --git a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/io.rs b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/io.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/io.rs
rename to third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/io.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/lib.rs b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/lib.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/lib.rs
rename to third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/lib.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/tests.rs b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/tests.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/tests.rs
rename to third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/tests.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/fsm/grapheme_break_fwd.bigendian.dfa b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/fsm/grapheme_break_fwd.bigendian.dfa
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/fsm/grapheme_break_fwd.bigendian.dfa
rename to third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/fsm/grapheme_break_fwd.bigendian.dfa
Binary files differ
diff --git a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/fsm/grapheme_break_fwd.littleendian.dfa b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/fsm/grapheme_break_fwd.littleendian.dfa
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/fsm/grapheme_break_fwd.littleendian.dfa
rename to third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/fsm/grapheme_break_fwd.littleendian.dfa
Binary files differ
diff --git a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/fsm/grapheme_break_fwd.rs b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/fsm/grapheme_break_fwd.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/fsm/grapheme_break_fwd.rs
rename to third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/fsm/grapheme_break_fwd.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/fsm/grapheme_break_rev.bigendian.dfa b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/fsm/grapheme_break_rev.bigendian.dfa
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/fsm/grapheme_break_rev.bigendian.dfa
rename to third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/fsm/grapheme_break_rev.bigendian.dfa
Binary files differ
diff --git a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/fsm/grapheme_break_rev.littleendian.dfa b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/fsm/grapheme_break_rev.littleendian.dfa
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/fsm/grapheme_break_rev.littleendian.dfa
rename to third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/fsm/grapheme_break_rev.littleendian.dfa
Binary files differ
diff --git a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/fsm/grapheme_break_rev.rs b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/fsm/grapheme_break_rev.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/fsm/grapheme_break_rev.rs
rename to third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/fsm/grapheme_break_rev.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/fsm/mod.rs b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/fsm/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/fsm/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/fsm/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/fsm/regional_indicator_rev.bigendian.dfa b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/fsm/regional_indicator_rev.bigendian.dfa
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/fsm/regional_indicator_rev.bigendian.dfa
rename to third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/fsm/regional_indicator_rev.bigendian.dfa
Binary files differ
diff --git a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/fsm/regional_indicator_rev.littleendian.dfa b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/fsm/regional_indicator_rev.littleendian.dfa
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/fsm/regional_indicator_rev.littleendian.dfa
rename to third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/fsm/regional_indicator_rev.littleendian.dfa
Binary files differ
diff --git a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/fsm/regional_indicator_rev.rs b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/fsm/regional_indicator_rev.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/fsm/regional_indicator_rev.rs
rename to third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/fsm/regional_indicator_rev.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/fsm/sentence_break_fwd.bigendian.dfa b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/fsm/sentence_break_fwd.bigendian.dfa
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/fsm/sentence_break_fwd.bigendian.dfa
rename to third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/fsm/sentence_break_fwd.bigendian.dfa
Binary files differ
diff --git a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/fsm/sentence_break_fwd.littleendian.dfa b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/fsm/sentence_break_fwd.littleendian.dfa
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/fsm/sentence_break_fwd.littleendian.dfa
rename to third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/fsm/sentence_break_fwd.littleendian.dfa
Binary files differ
diff --git a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/fsm/sentence_break_fwd.rs b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/fsm/sentence_break_fwd.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/fsm/sentence_break_fwd.rs
rename to third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/fsm/sentence_break_fwd.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/fsm/simple_word_fwd.bigendian.dfa b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/fsm/simple_word_fwd.bigendian.dfa
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/fsm/simple_word_fwd.bigendian.dfa
rename to third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/fsm/simple_word_fwd.bigendian.dfa
Binary files differ
diff --git a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/fsm/simple_word_fwd.littleendian.dfa b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/fsm/simple_word_fwd.littleendian.dfa
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/fsm/simple_word_fwd.littleendian.dfa
rename to third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/fsm/simple_word_fwd.littleendian.dfa
Binary files differ
diff --git a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/fsm/simple_word_fwd.rs b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/fsm/simple_word_fwd.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/fsm/simple_word_fwd.rs
rename to third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/fsm/simple_word_fwd.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/fsm/whitespace_anchored_fwd.bigendian.dfa b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/fsm/whitespace_anchored_fwd.bigendian.dfa
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/fsm/whitespace_anchored_fwd.bigendian.dfa
rename to third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/fsm/whitespace_anchored_fwd.bigendian.dfa
Binary files differ
diff --git a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/fsm/whitespace_anchored_fwd.littleendian.dfa b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/fsm/whitespace_anchored_fwd.littleendian.dfa
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/fsm/whitespace_anchored_fwd.littleendian.dfa
rename to third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/fsm/whitespace_anchored_fwd.littleendian.dfa
Binary files differ
diff --git a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/fsm/whitespace_anchored_fwd.rs b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/fsm/whitespace_anchored_fwd.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/fsm/whitespace_anchored_fwd.rs
rename to third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/fsm/whitespace_anchored_fwd.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/fsm/whitespace_anchored_rev.bigendian.dfa b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/fsm/whitespace_anchored_rev.bigendian.dfa
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/fsm/whitespace_anchored_rev.bigendian.dfa
rename to third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/fsm/whitespace_anchored_rev.bigendian.dfa
Binary files differ
diff --git a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/fsm/whitespace_anchored_rev.littleendian.dfa b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/fsm/whitespace_anchored_rev.littleendian.dfa
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/fsm/whitespace_anchored_rev.littleendian.dfa
rename to third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/fsm/whitespace_anchored_rev.littleendian.dfa
Binary files differ
diff --git a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/fsm/whitespace_anchored_rev.rs b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/fsm/whitespace_anchored_rev.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/fsm/whitespace_anchored_rev.rs
rename to third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/fsm/whitespace_anchored_rev.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/fsm/word_break_fwd.bigendian.dfa b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/fsm/word_break_fwd.bigendian.dfa
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/fsm/word_break_fwd.bigendian.dfa
rename to third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/fsm/word_break_fwd.bigendian.dfa
Binary files differ
diff --git a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/fsm/word_break_fwd.littleendian.dfa b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/fsm/word_break_fwd.littleendian.dfa
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/fsm/word_break_fwd.littleendian.dfa
rename to third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/fsm/word_break_fwd.littleendian.dfa
Binary files differ
diff --git a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/fsm/word_break_fwd.rs b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/fsm/word_break_fwd.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/fsm/word_break_fwd.rs
rename to third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/fsm/word_break_fwd.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/grapheme.rs b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/grapheme.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/grapheme.rs
rename to third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/grapheme.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/mod.rs b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/sentence.rs b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/sentence.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/sentence.rs
rename to third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/sentence.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/whitespace.rs b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/whitespace.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/whitespace.rs
rename to third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/whitespace.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/word.rs b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/word.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/unicode/word.rs
rename to third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/unicode/word.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/utf8.rs b/third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/utf8.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bstr-1.11.1/src/utf8.rs
rename to third_party/rust/chromium_crates_io/vendor/bstr-1.11.3/src/utf8.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cc-1.2.5/.cargo-checksum.json b/third_party/rust/chromium_crates_io/vendor/cc-1.2.7/.cargo-checksum.json
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cc-1.2.5/.cargo-checksum.json
rename to third_party/rust/chromium_crates_io/vendor/cc-1.2.7/.cargo-checksum.json
diff --git a/third_party/rust/chromium_crates_io/vendor/cc-1.2.5/Cargo.toml b/third_party/rust/chromium_crates_io/vendor/cc-1.2.7/Cargo.toml
similarity index 96%
rename from third_party/rust/chromium_crates_io/vendor/cc-1.2.5/Cargo.toml
rename to third_party/rust/chromium_crates_io/vendor/cc-1.2.7/Cargo.toml
index 64b3027..c77c2a9 100644
--- a/third_party/rust/chromium_crates_io/vendor/cc-1.2.5/Cargo.toml
+++ b/third_party/rust/chromium_crates_io/vendor/cc-1.2.7/Cargo.toml
@@ -10,7 +10,7 @@
 
 [package]
 name = "cc"
-version = "1.2.5"
+version = "1.2.7"
 
 [features]
 "jobserver" = []
diff --git a/third_party/rust/chromium_crates_io/vendor/cc-1.2.5/src/lib.rs b/third_party/rust/chromium_crates_io/vendor/cc-1.2.7/src/lib.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cc-1.2.5/src/lib.rs
rename to third_party/rust/chromium_crates_io/vendor/cc-1.2.7/src/lib.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/.cargo_vcs_info.json b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/.cargo_vcs_info.json
deleted file mode 100644
index 44a99f67..0000000
--- a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/.cargo_vcs_info.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-  "git": {
-    "sha1": "ee011dbc05c9bce44aa28627da7ab6c5d782e8cb"
-  },
-  "path_in_vcs": ""
-}
\ No newline at end of file
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/.bazelignore b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/.bazelignore
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/.bazelignore
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/.bazelignore
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/.bazelrc b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/.bazelrc
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/.bazelrc
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/.bazelrc
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/.buckconfig b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/.buckconfig
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/.buckconfig
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/.buckconfig
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/.buckroot b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/.buckroot
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/.buckroot
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/.buckroot
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/.cargo-checksum.json b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/.cargo-checksum.json
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/.cargo-checksum.json
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/.cargo-checksum.json
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/.cargo_vcs_info.json b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/.cargo_vcs_info.json
new file mode 100644
index 0000000..e74c2e7
--- /dev/null
+++ b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/.cargo_vcs_info.json
@@ -0,0 +1,6 @@
+{
+  "git": {
+    "sha1": "d54e44698c3fa5833a861cb3ae502533b92f2f57"
+  },
+  "path_in_vcs": ""
+}
\ No newline at end of file
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/.clang-format b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/.clang-format
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/.clang-format
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/.clang-format
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/.clang-tidy b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/.clang-tidy
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/.clang-tidy
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/.clang-tidy
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/.devcontainer/Dockerfile b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/.devcontainer/Dockerfile
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/.devcontainer/Dockerfile
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/.devcontainer/Dockerfile
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/.devcontainer/README.md b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/.devcontainer/README.md
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/.devcontainer/README.md
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/.devcontainer/README.md
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/.devcontainer/build.Dockerfile b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/.devcontainer/build.Dockerfile
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/.devcontainer/build.Dockerfile
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/.devcontainer/build.Dockerfile
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/.devcontainer/devcontainer.json b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/.devcontainer/devcontainer.json
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/.devcontainer/devcontainer.json
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/.devcontainer/devcontainer.json
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/.gitattributes b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/.gitattributes
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/.gitattributes
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/.gitattributes
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/.github/FUNDING.yml b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/.github/FUNDING.yml
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/.github/FUNDING.yml
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/.github/FUNDING.yml
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/.github/workflows/buck2.yml b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/.github/workflows/buck2.yml
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/.github/workflows/buck2.yml
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/.github/workflows/buck2.yml
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/.github/workflows/ci.yml b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/.github/workflows/ci.yml
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/.github/workflows/ci.yml
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/.github/workflows/ci.yml
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/.github/workflows/install.yml b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/.github/workflows/install.yml
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/.github/workflows/install.yml
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/.github/workflows/install.yml
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/.github/workflows/site.yml b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/.github/workflows/site.yml
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/.github/workflows/site.yml
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/.github/workflows/site.yml
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/.gitignore b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/.gitignore
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/.gitignore
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/.gitignore
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/.vscode/README.md b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/.vscode/README.md
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/.vscode/README.md
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/.vscode/README.md
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/.vscode/launch.json b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/.vscode/launch.json
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/.vscode/launch.json
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/.vscode/launch.json
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/.vscode/settings.json b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/.vscode/settings.json
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/.vscode/settings.json
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/.vscode/settings.json
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/.vscode/tasks.json b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/.vscode/tasks.json
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/.vscode/tasks.json
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/.vscode/tasks.json
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/.watchmanconfig b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/.watchmanconfig
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/.watchmanconfig
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/.watchmanconfig
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/BUCK b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/BUCK
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/BUCK
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/BUCK
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/BUILD.bazel b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/BUILD.bazel
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/BUILD.bazel
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/BUILD.bazel
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/Cargo.lock b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/Cargo.lock
similarity index 92%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/Cargo.lock
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/Cargo.lock
index 2c027a08..dfa6949 100644
--- a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/Cargo.lock
+++ b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/Cargo.lock
@@ -10,9 +10,9 @@
 
 [[package]]
 name = "cc"
-version = "1.2.4"
+version = "1.2.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9157bbaa6b165880c27a4293a474c91cdcf265cc68cc829bf10be0964a391caf"
+checksum = "c31a0499c1dc64f458ad13872de75c0eb7e3fdb0e67964610c914b034fc5956e"
 dependencies = [
  "shlex",
 ]
@@ -55,7 +55,7 @@
 
 [[package]]
 name = "cxx"
-version = "1.0.135"
+version = "1.0.136"
 dependencies = [
  "cc",
  "cxx-build",
@@ -72,9 +72,9 @@
 
 [[package]]
 name = "cxx-build"
-version = "1.0.135"
+version = "1.0.136"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "66fd8f17ad454fc1e4f4ab83abffcc88a532e90350d3ffddcb73030220fcbd52"
+checksum = "8bfd16fca6fd420aebbd80d643c201ee4692114a0de208b790b9cd02ceae65fb"
 dependencies = [
  "cc",
  "codespan-reporting",
@@ -86,9 +86,9 @@
 
 [[package]]
 name = "cxx-gen"
-version = "0.7.135"
+version = "0.7.136"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3c62d12c58e0fd31869500860618d5ae274464b06cade32dc45f3fbf41c73721"
+checksum = "40ac2e8f398454ccd7f9183a602cf0f67b5c1d201e2ecb5ef2a95b9b7a8b22bf"
 dependencies = [
  "codespan-reporting",
  "proc-macro2",
@@ -104,9 +104,9 @@
 
 [[package]]
 name = "cxxbridge-cmd"
-version = "1.0.135"
+version = "1.0.136"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4717c9c806a9e07fdcb34c84965a414ea40fafe57667187052cf1eb7f5e8a8a9"
+checksum = "6c33fd49f5d956a1b7ee5f7a9768d58580c6752838d92e39d0d56439efdedc35"
 dependencies = [
  "clap",
  "codespan-reporting",
@@ -117,15 +117,15 @@
 
 [[package]]
 name = "cxxbridge-flags"
-version = "1.0.135"
+version = "1.0.136"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2f6515329bf3d98f4073101c7866ff2bec4e635a13acb82e3f3753fff0bf43cb"
+checksum = "be0f1077278fac36299cce8446effd19fe93a95eedb10d39265f3bf67b3036c9"
 
 [[package]]
 name = "cxxbridge-macro"
-version = "1.0.135"
+version = "1.0.136"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fb93e6a7ce8ec985c02bbb758237a31598b340acbbc3c19c5a4fa6adaaac92ab"
+checksum = "3da7e4d6e74af6b79031d264b2f13c3ea70af1978083741c41ffce9308f1f24f"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -147,9 +147,9 @@
 
 [[package]]
 name = "foldhash"
-version = "0.1.3"
+version = "0.1.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f81ec6369c545a7d40e4589b5597581fa1c441fe1cce96dd1de43159910a36a2"
+checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f"
 
 [[package]]
 name = "glob"
@@ -252,9 +252,9 @@
 
 [[package]]
 name = "serde_json"
-version = "1.0.133"
+version = "1.0.134"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377"
+checksum = "d00f4175c42ee48b15416f6193a959ba3a0d67fc699a0db9ad12df9f83991c7d"
 dependencies = [
  "itoa",
  "memchr",
@@ -285,9 +285,9 @@
 
 [[package]]
 name = "syn"
-version = "2.0.90"
+version = "2.0.91"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31"
+checksum = "d53cbcb5a243bd33b7858b1d7f4aca2153490815872d86d955d6ea29f743c035"
 dependencies = [
  "proc-macro2",
  "quote",
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/Cargo.toml b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/Cargo.toml
similarity index 96%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/Cargo.toml
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/Cargo.toml
index a52b147d..5635f53 100644
--- a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/Cargo.toml
+++ b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/Cargo.toml
@@ -13,7 +13,7 @@
 edition = "2021"
 rust-version = "1.73"
 name = "cxx"
-version = "1.0.135"
+version = "1.0.136"
 authors = ["David Tolnay <dtolnay@gmail.com>"]
 build = "build.rs"
 links = "cxxbridge1"
@@ -112,7 +112,7 @@
 path = "tests/unique_ptr.rs"
 
 [dependencies.cxxbridge-macro]
-version = "=1.0.135"
+version = "=1.0.136"
 
 [dependencies.foldhash]
 version = "0.1"
@@ -122,7 +122,7 @@
 version = "1.0.9"
 
 [dev-dependencies.cxx-build]
-version = "=1.0.135"
+version = "=1.0.136"
 
 [dev-dependencies.cxx-gen]
 version = "0.7"
@@ -141,8 +141,8 @@
 version = "1.0.83"
 
 [build-dependencies.cxxbridge-flags]
-version = "=1.0.135"
+version = "=1.0.136"
 default-features = false
 
 [target."cfg(any())".build-dependencies.cxxbridge-cmd]
-version = "=1.0.135"
+version = "=1.0.136"
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/Cargo.toml.orig b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/Cargo.toml.orig
similarity index 87%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/Cargo.toml.orig
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/Cargo.toml.orig
index 272686f..e37e2a1d 100644
--- a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/Cargo.toml.orig
+++ b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/Cargo.toml.orig
@@ -1,6 +1,6 @@
 [package]
 name = "cxx"
-version = "1.0.135"
+version = "1.0.136"
 authors = ["David Tolnay <dtolnay@gmail.com>"]
 categories = ["development-tools::ffi", "api-bindings", "no-std"]
 description = "Safe interop between Rust and C++"
@@ -23,16 +23,16 @@
 std = ["alloc", "foldhash/std"]
 
 [dependencies]
-cxxbridge-macro = { version = "=1.0.135", path = "macro" }
+cxxbridge-macro = { version = "=1.0.136", path = "macro" }
 foldhash = { version = "0.1", default-features = false }
 link-cplusplus = "1.0.9"
 
 [build-dependencies]
 cc = "1.0.83"
-cxxbridge-flags = { version = "=1.0.135", path = "flags", default-features = false }
+cxxbridge-flags = { version = "=1.0.136", path = "flags", default-features = false }
 
 [dev-dependencies]
-cxx-build = { version = "=1.0.135", path = "gen/build" }
+cxx-build = { version = "=1.0.136", path = "gen/build" }
 cxx-gen = { version = "0.7", path = "gen/lib" }
 cxx-test-suite = { version = "0", path = "tests/ffi" }
 rustversion = "1.0.13"
@@ -40,7 +40,7 @@
 
 # Disallow incompatible cxxbridge-cmd version appearing in the same lockfile.
 [target.'cfg(any())'.build-dependencies]
-cxxbridge-cmd = { version = "=1.0.135", path = "gen/cmd" }
+cxxbridge-cmd = { version = "=1.0.136", path = "gen/cmd" }
 
 [lib]
 doc-scrape-examples = false
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/LICENSE-APACHE b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/LICENSE-APACHE
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/LICENSE-APACHE
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/LICENSE-APACHE
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/LICENSE-MIT b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/LICENSE-MIT
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/LICENSE-MIT
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/LICENSE-MIT
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/MODULE.bazel b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/MODULE.bazel
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/MODULE.bazel
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/MODULE.bazel
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/MODULE.bazel.lock b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/MODULE.bazel.lock
similarity index 99%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/MODULE.bazel.lock
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/MODULE.bazel.lock
index cf7f9b6..f9217070 100644
--- a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/MODULE.bazel.lock
+++ b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/MODULE.bazel.lock
@@ -145,7 +145,7 @@
   "moduleExtensions": {
     "//tools/bazel:extension.bzl%crate_repositories": {
       "general": {
-        "bzlTransitiveDigest": "AqJHjxHaC30bUIqSO5Ywo4lVnDik/MJePNu8xKjyK+I=",
+        "bzlTransitiveDigest": "+9E8WeghKFdtaTNvgDh/gzRNvhnJxCrJB7Oe69m/4zc=",
         "usagesDigest": "YBItjer1JIu5HatNhG5RFjMV+91FPeCgNI30zNDcWkA=",
         "recordedFileInputs": {},
         "recordedDirentsInputs": {},
@@ -163,16 +163,16 @@
               "build_file": "@@//third-party/bazel:BUILD.anstyle-1.0.10.bazel"
             }
           },
-          "vendor__cc-1.2.4": {
+          "vendor__cc-1.2.5": {
             "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
             "attributes": {
-              "sha256": "9157bbaa6b165880c27a4293a474c91cdcf265cc68cc829bf10be0964a391caf",
+              "sha256": "c31a0499c1dc64f458ad13872de75c0eb7e3fdb0e67964610c914b034fc5956e",
               "type": "tar.gz",
               "urls": [
-                "https://static.crates.io/crates/cc/1.2.4/download"
+                "https://static.crates.io/crates/cc/1.2.5/download"
               ],
-              "strip_prefix": "cc-1.2.4",
-              "build_file": "@@//third-party/bazel:BUILD.cc-1.2.4.bazel"
+              "strip_prefix": "cc-1.2.5",
+              "build_file": "@@//third-party/bazel:BUILD.cc-1.2.5.bazel"
             }
           },
           "vendor__clap-4.5.23": {
@@ -223,16 +223,16 @@
               "build_file": "@@//third-party/bazel:BUILD.codespan-reporting-0.11.1.bazel"
             }
           },
-          "vendor__foldhash-0.1.3": {
+          "vendor__foldhash-0.1.4": {
             "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
             "attributes": {
-              "sha256": "f81ec6369c545a7d40e4589b5597581fa1c441fe1cce96dd1de43159910a36a2",
+              "sha256": "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f",
               "type": "tar.gz",
               "urls": [
-                "https://static.crates.io/crates/foldhash/0.1.3/download"
+                "https://static.crates.io/crates/foldhash/0.1.4/download"
               ],
-              "strip_prefix": "foldhash-0.1.3",
-              "build_file": "@@//third-party/bazel:BUILD.foldhash-0.1.3.bazel"
+              "strip_prefix": "foldhash-0.1.4",
+              "build_file": "@@//third-party/bazel:BUILD.foldhash-0.1.4.bazel"
             }
           },
           "vendor__proc-macro2-1.0.92": {
@@ -295,16 +295,16 @@
               "build_file": "@@//third-party/bazel:BUILD.shlex-1.3.0.bazel"
             }
           },
-          "vendor__syn-2.0.90": {
+          "vendor__syn-2.0.91": {
             "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
             "attributes": {
-              "sha256": "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31",
+              "sha256": "d53cbcb5a243bd33b7858b1d7f4aca2153490815872d86d955d6ea29f743c035",
               "type": "tar.gz",
               "urls": [
-                "https://static.crates.io/crates/syn/2.0.90/download"
+                "https://static.crates.io/crates/syn/2.0.91/download"
               ],
-              "strip_prefix": "syn-2.0.90",
-              "build_file": "@@//third-party/bazel:BUILD.syn-2.0.90.bazel"
+              "strip_prefix": "syn-2.0.91",
+              "build_file": "@@//third-party/bazel:BUILD.syn-2.0.91.bazel"
             }
           },
           "vendor__termcolor-1.4.1": {
@@ -495,8 +495,8 @@
           ],
           [
             "",
-            "vendor__cc-1.2.4",
-            "vendor__cc-1.2.4"
+            "vendor__cc-1.2.5",
+            "vendor__cc-1.2.5"
           ],
           [
             "",
@@ -510,8 +510,8 @@
           ],
           [
             "",
-            "vendor__foldhash-0.1.3",
-            "vendor__foldhash-0.1.3"
+            "vendor__foldhash-0.1.4",
+            "vendor__foldhash-0.1.4"
           ],
           [
             "",
@@ -535,8 +535,8 @@
           ],
           [
             "",
-            "vendor__syn-2.0.90",
-            "vendor__syn-2.0.90"
+            "vendor__syn-2.0.91",
+            "vendor__syn-2.0.91"
           ]
         ]
       }
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/README.md b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/README.md
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/README.md
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/README.md
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/.gitignore b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/.gitignore
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/.gitignore
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/.gitignore
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/README.md b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/README.md
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/README.md
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/README.md
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/book.toml b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/book.toml
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/book.toml
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/book.toml
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/build.js b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/build.js
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/build.js
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/build.js
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/build.sh b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/build.sh
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/build.sh
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/build.sh
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/css/cxx.css b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/css/cxx.css
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/css/cxx.css
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/css/cxx.css
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/diagram/.gitignore b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/diagram/.gitignore
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/diagram/.gitignore
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/diagram/.gitignore
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/diagram/Makefile b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/diagram/Makefile
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/diagram/Makefile
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/diagram/Makefile
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/diagram/overview.tex b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/diagram/overview.tex
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/diagram/overview.tex
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/diagram/overview.tex
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/package-lock.json b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/package-lock.json
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/package-lock.json
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/package-lock.json
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/package.json b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/package.json
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/package.json
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/package.json
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/src/404.md b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/src/404.md
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/src/404.md
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/src/404.md
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/src/SUMMARY.md b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/src/SUMMARY.md
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/src/SUMMARY.md
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/src/SUMMARY.md
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/src/async.md b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/src/async.md
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/src/async.md
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/src/async.md
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/src/attributes.md b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/src/attributes.md
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/src/attributes.md
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/src/attributes.md
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/src/binding/box.md b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/src/binding/box.md
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/src/binding/box.md
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/src/binding/box.md
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/src/binding/cxxstring.md b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/src/binding/cxxstring.md
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/src/binding/cxxstring.md
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/src/binding/cxxstring.md
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/src/binding/cxxvector.md b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/src/binding/cxxvector.md
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/src/binding/cxxvector.md
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/src/binding/cxxvector.md
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/src/binding/fn.md b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/src/binding/fn.md
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/src/binding/fn.md
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/src/binding/fn.md
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/src/binding/rawptr.md b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/src/binding/rawptr.md
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/src/binding/rawptr.md
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/src/binding/rawptr.md
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/src/binding/result.md b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/src/binding/result.md
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/src/binding/result.md
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/src/binding/result.md
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/src/binding/sharedptr.md b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/src/binding/sharedptr.md
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/src/binding/sharedptr.md
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/src/binding/sharedptr.md
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/src/binding/slice.md b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/src/binding/slice.md
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/src/binding/slice.md
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/src/binding/slice.md
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/src/binding/str.md b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/src/binding/str.md
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/src/binding/str.md
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/src/binding/str.md
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/src/binding/string.md b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/src/binding/string.md
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/src/binding/string.md
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/src/binding/string.md
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/src/binding/uniqueptr.md b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/src/binding/uniqueptr.md
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/src/binding/uniqueptr.md
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/src/binding/uniqueptr.md
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/src/binding/vec.md b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/src/binding/vec.md
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/src/binding/vec.md
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/src/binding/vec.md
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/src/bindings.md b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/src/bindings.md
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/src/bindings.md
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/src/bindings.md
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/src/build/bazel.md b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/src/build/bazel.md
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/src/build/bazel.md
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/src/build/bazel.md
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/src/build/cargo.md b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/src/build/cargo.md
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/src/build/cargo.md
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/src/build/cargo.md
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/src/build/cmake.md b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/src/build/cmake.md
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/src/build/cmake.md
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/src/build/cmake.md
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/src/build/other.md b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/src/build/other.md
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/src/build/other.md
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/src/build/other.md
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/src/building.md b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/src/building.md
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/src/building.md
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/src/building.md
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/src/concepts.md b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/src/concepts.md
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/src/concepts.md
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/src/concepts.md
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/src/context.md b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/src/context.md
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/src/context.md
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/src/context.md
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/src/cxx.png b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/src/cxx.png
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/src/cxx.png
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/src/cxx.png
Binary files differ
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/src/extern-c++.md b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/src/extern-c++.md
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/src/extern-c++.md
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/src/extern-c++.md
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/src/extern-rust.md b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/src/extern-rust.md
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/src/extern-rust.md
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/src/extern-rust.md
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/src/index.md b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/src/index.md
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/src/index.md
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/src/index.md
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/src/overview.svg b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/src/overview.svg
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/src/overview.svg
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/src/overview.svg
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/src/reference.md b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/src/reference.md
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/src/reference.md
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/src/reference.md
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/src/shared.md b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/src/shared.md
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/src/shared.md
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/src/shared.md
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/src/tutorial.md b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/src/tutorial.md
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/src/tutorial.md
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/src/tutorial.md
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/theme/head.hbs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/theme/head.hbs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/book/theme/head.hbs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/book/theme/head.hbs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/build.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/build.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/build.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/build.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/compile_flags.txt b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/compile_flags.txt
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/compile_flags.txt
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/compile_flags.txt
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/include/cxx.h b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/include/cxx.h
similarity index 97%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/include/cxx.h
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/include/cxx.h
index 3414e4c..7d9432c 100644
--- a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/include/cxx.h
+++ b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/include/cxx.h
@@ -53,8 +53,8 @@
   static String lossy(const char16_t *) noexcept;
   static String lossy(const char16_t *, std::size_t) noexcept;
 
-  String &operator=(const String &) &noexcept;
-  String &operator=(String &&) &noexcept;
+  String &operator=(const String &) & noexcept;
+  String &operator=(String &&) & noexcept;
 
   explicit operator std::string() const;
 
@@ -113,7 +113,7 @@
   Str(const char *);
   Str(const char *, std::size_t);
 
-  Str &operator=(const Str &) &noexcept = default;
+  Str &operator=(const Str &) & noexcept = default;
 
   explicit operator std::string() const;
 
@@ -161,8 +161,8 @@
 struct copy_assignable_if<false> {
   copy_assignable_if() noexcept = default;
   copy_assignable_if(const copy_assignable_if &) noexcept = default;
-  copy_assignable_if &operator=(const copy_assignable_if &) &noexcept = delete;
-  copy_assignable_if &operator=(copy_assignable_if &&) &noexcept = default;
+  copy_assignable_if &operator=(const copy_assignable_if &) & noexcept = delete;
+  copy_assignable_if &operator=(copy_assignable_if &&) & noexcept = default;
 };
 } // namespace detail
 
@@ -177,10 +177,10 @@
   Slice(T *, std::size_t count) noexcept;
 
   template <typename C>
-  explicit Slice(C& c) : Slice(c.data(), c.size()) {}
+  explicit Slice(C &c) : Slice(c.data(), c.size()) {}
 
-  Slice &operator=(const Slice<T> &) &noexcept = default;
-  Slice &operator=(Slice<T> &&) &noexcept = default;
+  Slice &operator=(const Slice<T> &) & noexcept = default;
+  Slice &operator=(Slice<T> &&) & noexcept = default;
 
   T *data() const noexcept;
   std::size_t size() const noexcept;
@@ -268,7 +268,7 @@
   explicit Box(const T &);
   explicit Box(T &&);
 
-  Box &operator=(Box &&) &noexcept;
+  Box &operator=(Box &&) & noexcept;
 
   const T *operator->() const noexcept;
   const T &operator*() const noexcept;
@@ -313,7 +313,7 @@
   Vec(Vec &&) noexcept;
   ~Vec() noexcept;
 
-  Vec &operator=(Vec &&) &noexcept;
+  Vec &operator=(Vec &&) & noexcept;
   Vec &operator=(const Vec &) &;
 
   std::size_t size() const noexcept;
@@ -394,7 +394,7 @@
   ~Error() noexcept override;
 
   Error &operator=(const Error &) &;
-  Error &operator=(Error &&) &noexcept;
+  Error &operator=(Error &&) & noexcept;
 
   const char *what() const noexcept override;
 
@@ -766,7 +766,7 @@
 }
 
 template <typename T>
-Box<T> &Box<T>::operator=(Box &&other) &noexcept {
+Box<T> &Box<T>::operator=(Box &&other) & noexcept {
   if (this->ptr) {
     this->drop();
   }
@@ -854,7 +854,7 @@
 }
 
 template <typename T>
-Vec<T> &Vec<T>::operator=(Vec &&other) &noexcept {
+Vec<T> &Vec<T>::operator=(Vec &&other) & noexcept {
   this->drop();
   this->repr = other.repr;
   new (&other) Vec();
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/reindeer.toml b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/reindeer.toml
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/reindeer.toml
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/reindeer.toml
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/rust-toolchain.toml b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/rust-toolchain.toml
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/rust-toolchain.toml
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/rust-toolchain.toml
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/cxx.cc b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/cxx.cc
similarity index 94%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/cxx.cc
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/cxx.cc
index b7c998c3..06790ee 100644
--- a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/cxx.cc
+++ b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/cxx.cc
@@ -214,7 +214,7 @@
   return String(lossy_t{}, s, len);
 }
 
-CXX_CPP_EXPORT String &String::operator=(const String &other) &noexcept {
+CXX_CPP_EXPORT String &String::operator=(const String &other) & noexcept {
   if (this != &other) {
     cxxbridge1$string$drop(this);
     cxxbridge1$string$clone(this, other);
@@ -222,7 +222,7 @@
   return *this;
 }
 
-CXX_CPP_EXPORT String &String::operator=(String &&other) &noexcept {
+CXX_CPP_EXPORT String &String::operator=(String &&other) & noexcept {
   cxxbridge1$string$drop(this);
   this->repr = other.repr;
   cxxbridge1$string$new(&other);
@@ -271,11 +271,17 @@
   return const_cast<char *>(this->data()) + this->size();
 }
 
-CXX_CPP_EXPORT String::const_iterator String::begin() const noexcept { return this->cbegin(); }
+CXX_CPP_EXPORT String::const_iterator String::begin() const noexcept {
+  return this->cbegin();
+}
 
-CXX_CPP_EXPORT String::const_iterator String::end() const noexcept { return this->cend(); }
+CXX_CPP_EXPORT String::const_iterator String::end() const noexcept {
+  return this->cend();
+}
 
-CXX_CPP_EXPORT String::const_iterator String::cbegin() const noexcept { return this->data(); }
+CXX_CPP_EXPORT String::const_iterator String::cbegin() const noexcept {
+  return this->data();
+}
 
 CXX_CPP_EXPORT String::const_iterator String::cend() const noexcept {
   return this->data() + this->size();
@@ -320,7 +326,9 @@
 
 CXX_CPP_EXPORT Str::Str() noexcept { cxxbridge1$str$new(this); }
 
-CXX_CPP_EXPORT Str::Str(const String &s) noexcept { cxxbridge1$str$ref(this, &s); }
+CXX_CPP_EXPORT Str::Str(const String &s) noexcept {
+  cxxbridge1$str$ref(this, &s);
+}
 
 static void initStr(Str *self, const char *ptr, std::size_t len) {
   if (!cxxbridge1$str$from(self, ptr, len)) {
@@ -328,7 +336,9 @@
   }
 }
 
-CXX_CPP_EXPORT Str::Str(const std::string &s) { initStr(this, s.data(), s.length()); }
+CXX_CPP_EXPORT Str::Str(const std::string &s) {
+  initStr(this, s.data(), s.length());
+}
 
 CXX_CPP_EXPORT Str::Str(const char *s) {
   assert(s != nullptr);
@@ -346,19 +356,29 @@
   return std::string(this->data(), this->size());
 }
 
-CXX_CPP_EXPORT const char *Str::data() const noexcept { return cxxbridge1$str$ptr(this); }
+CXX_CPP_EXPORT const char *Str::data() const noexcept {
+  return cxxbridge1$str$ptr(this);
+}
 
-CXX_CPP_EXPORT std::size_t Str::size() const noexcept { return cxxbridge1$str$len(this); }
+CXX_CPP_EXPORT std::size_t Str::size() const noexcept {
+  return cxxbridge1$str$len(this);
+}
 
 CXX_CPP_EXPORT std::size_t Str::length() const noexcept { return this->size(); }
 
 CXX_CPP_EXPORT bool Str::empty() const noexcept { return this->size() == 0; }
 
-CXX_CPP_EXPORT Str::const_iterator Str::begin() const noexcept { return this->cbegin(); }
+CXX_CPP_EXPORT Str::const_iterator Str::begin() const noexcept {
+  return this->cbegin();
+}
 
-CXX_CPP_EXPORT Str::const_iterator Str::end() const noexcept { return this->cend(); }
+CXX_CPP_EXPORT Str::const_iterator Str::end() const noexcept {
+  return this->cend();
+}
 
-CXX_CPP_EXPORT Str::const_iterator Str::cbegin() const noexcept { return this->data(); }
+CXX_CPP_EXPORT Str::const_iterator Str::cbegin() const noexcept {
+  return this->data();
+}
 
 CXX_CPP_EXPORT Str::const_iterator Str::cend() const noexcept {
   return this->data() + this->size();
@@ -369,7 +389,9 @@
          std::equal(this->begin(), this->end(), rhs.begin());
 }
 
-CXX_CPP_EXPORT bool Str::operator!=(const Str &rhs) const noexcept { return !(*this == rhs); }
+CXX_CPP_EXPORT bool Str::operator!=(const Str &rhs) const noexcept {
+  return !(*this == rhs);
+}
 
 CXX_CPP_EXPORT bool Str::operator<(const Str &rhs) const noexcept {
   return std::lexicographical_compare(this->begin(), this->end(), rhs.begin(),
@@ -393,9 +415,13 @@
   }
 }
 
-CXX_CPP_EXPORT bool Str::operator>(const Str &rhs) const noexcept { return rhs < *this; }
+CXX_CPP_EXPORT bool Str::operator>(const Str &rhs) const noexcept {
+  return rhs < *this;
+}
 
-CXX_CPP_EXPORT bool Str::operator>=(const Str &rhs) const noexcept { return rhs <= *this; }
+CXX_CPP_EXPORT bool Str::operator>=(const Str &rhs) const noexcept {
+  return rhs <= *this;
+}
 
 CXX_CPP_EXPORT void Str::swap(Str &rhs) noexcept {
   using std::swap;
@@ -407,11 +433,14 @@
   return os;
 }
 
-CXX_CPP_EXPORT void sliceInit(void *self, const void *ptr, std::size_t len) noexcept {
+CXX_CPP_EXPORT void sliceInit(void *self, const void *ptr,
+                              std::size_t len) noexcept {
   cxxbridge1$slice$new(self, ptr, len);
 }
 
-CXX_CPP_EXPORT void *slicePtr(const void *self) noexcept { return cxxbridge1$slice$ptr(self); }
+CXX_CPP_EXPORT void *slicePtr(const void *self) noexcept {
+  return cxxbridge1$slice$ptr(self);
+}
 
 CXX_CPP_EXPORT std::size_t sliceLen(const void *self) noexcept {
   return cxxbridge1$slice$len(self);
@@ -516,7 +545,7 @@
   return *this;
 }
 
-CXX_CPP_EXPORT Error &Error::operator=(Error &&other) &noexcept {
+CXX_CPP_EXPORT Error &Error::operator=(Error &&other) & noexcept {
   std::exception::operator=(std::move(other));
   delete[] this->msg;
   this->msg = other.msg;
@@ -545,7 +574,8 @@
 } // namespace repr
 
 extern "C" {
-CXX_RS_EXPORT repr::PtrLen cxxbridge1$exception(const char *, std::size_t len) noexcept;
+CXX_RS_EXPORT repr::PtrLen cxxbridge1$exception(const char *,
+                                                std::size_t len) noexcept;
 }
 
 namespace detail {
@@ -628,70 +658,71 @@
 } // namespace
 
 #define STD_VECTOR_OPS(RUST_TYPE, CXX_TYPE)                                    \
-  CXX_RS_EXPORT std::vector<CXX_TYPE> *cxxbridge1$std$vector$##RUST_TYPE##$new() noexcept {  \
+  CXX_RS_EXPORT std::vector<CXX_TYPE>                                          \
+      *cxxbridge1$std$vector$##RUST_TYPE##$new() noexcept {                    \
     return new std::vector<CXX_TYPE>();                                        \
   }                                                                            \
-  CXX_RS_EXPORT std::size_t cxxbridge1$std$vector$##RUST_TYPE##$size(                        \
+  CXX_RS_EXPORT std::size_t cxxbridge1$std$vector$##RUST_TYPE##$size(          \
       const std::vector<CXX_TYPE> &s) noexcept {                               \
     return s.size();                                                           \
   }                                                                            \
-  CXX_RS_EXPORT CXX_TYPE *cxxbridge1$std$vector$##RUST_TYPE##$get_unchecked(                 \
+  CXX_RS_EXPORT CXX_TYPE *cxxbridge1$std$vector$##RUST_TYPE##$get_unchecked(   \
       std::vector<CXX_TYPE> *s, std::size_t pos) noexcept {                    \
     return &(*s)[pos];                                                         \
   }                                                                            \
-  CXX_RS_EXPORT void cxxbridge1$unique_ptr$std$vector$##RUST_TYPE##$null(                    \
+  CXX_RS_EXPORT void cxxbridge1$unique_ptr$std$vector$##RUST_TYPE##$null(      \
       std::unique_ptr<std::vector<CXX_TYPE>> *ptr) noexcept {                  \
     new (ptr) std::unique_ptr<std::vector<CXX_TYPE>>();                        \
   }                                                                            \
-  CXX_RS_EXPORT void cxxbridge1$unique_ptr$std$vector$##RUST_TYPE##$raw(                     \
+  CXX_RS_EXPORT void cxxbridge1$unique_ptr$std$vector$##RUST_TYPE##$raw(       \
       std::unique_ptr<std::vector<CXX_TYPE>> *ptr,                             \
       std::vector<CXX_TYPE> *raw) noexcept {                                   \
     new (ptr) std::unique_ptr<std::vector<CXX_TYPE>>(raw);                     \
   }                                                                            \
-  CXX_RS_EXPORT const std::vector<CXX_TYPE>                                                  \
+  CXX_RS_EXPORT const std::vector<CXX_TYPE>                                    \
       *cxxbridge1$unique_ptr$std$vector$##RUST_TYPE##$get(                     \
           const std::unique_ptr<std::vector<CXX_TYPE>> &ptr) noexcept {        \
     return ptr.get();                                                          \
   }                                                                            \
-  CXX_RS_EXPORT std::vector<CXX_TYPE>                                                        \
+  CXX_RS_EXPORT std::vector<CXX_TYPE>                                          \
       *cxxbridge1$unique_ptr$std$vector$##RUST_TYPE##$release(                 \
           std::unique_ptr<std::vector<CXX_TYPE>> &ptr) noexcept {              \
     return ptr.release();                                                      \
   }                                                                            \
-  CXX_RS_EXPORT void cxxbridge1$unique_ptr$std$vector$##RUST_TYPE##$drop(                    \
+  CXX_RS_EXPORT void cxxbridge1$unique_ptr$std$vector$##RUST_TYPE##$drop(      \
       std::unique_ptr<std::vector<CXX_TYPE>> *ptr) noexcept {                  \
     ptr->~unique_ptr();                                                        \
   }
 
 #define STD_VECTOR_TRIVIAL_OPS(RUST_TYPE, CXX_TYPE)                            \
-  CXX_RS_EXPORT void cxxbridge1$std$vector$##RUST_TYPE##$push_back(                          \
+  CXX_RS_EXPORT void cxxbridge1$std$vector$##RUST_TYPE##$push_back(            \
       std::vector<CXX_TYPE> *v, CXX_TYPE *value) noexcept {                    \
     v->push_back(std::move(*value));                                           \
     destroy(value);                                                            \
   }                                                                            \
-  CXX_RS_EXPORT void cxxbridge1$std$vector$##RUST_TYPE##$pop_back(std::vector<CXX_TYPE> *v,  \
-                                                    CXX_TYPE *out) noexcept {  \
+  CXX_RS_EXPORT void cxxbridge1$std$vector$##RUST_TYPE##$pop_back(             \
+      std::vector<CXX_TYPE> *v, CXX_TYPE *out) noexcept {                      \
     new (out) CXX_TYPE(std::move(v->back()));                                  \
     v->pop_back();                                                             \
   }
 
 #define RUST_VEC_EXTERNS(RUST_TYPE, CXX_TYPE)                                  \
-  CXX_RS_EXPORT void cxxbridge1$rust_vec$##RUST_TYPE##$new(                                  \
+  CXX_RS_EXPORT void cxxbridge1$rust_vec$##RUST_TYPE##$new(                    \
       rust::Vec<CXX_TYPE> *ptr) noexcept;                                      \
-  CXX_RS_EXPORT void cxxbridge1$rust_vec$##RUST_TYPE##$drop(                                 \
+  CXX_RS_EXPORT void cxxbridge1$rust_vec$##RUST_TYPE##$drop(                   \
       rust::Vec<CXX_TYPE> *ptr) noexcept;                                      \
-  CXX_RS_EXPORT std::size_t cxxbridge1$rust_vec$##RUST_TYPE##$len(                           \
+  CXX_RS_EXPORT std::size_t cxxbridge1$rust_vec$##RUST_TYPE##$len(             \
       const rust::Vec<CXX_TYPE> *ptr) noexcept;                                \
-  CXX_RS_EXPORT std::size_t cxxbridge1$rust_vec$##RUST_TYPE##$capacity(                      \
+  CXX_RS_EXPORT std::size_t cxxbridge1$rust_vec$##RUST_TYPE##$capacity(        \
       const rust::Vec<CXX_TYPE> *ptr) noexcept;                                \
-  CXX_RS_EXPORT const CXX_TYPE *cxxbridge1$rust_vec$##RUST_TYPE##$data(                      \
+  CXX_RS_EXPORT const CXX_TYPE *cxxbridge1$rust_vec$##RUST_TYPE##$data(        \
       const rust::Vec<CXX_TYPE> *ptr) noexcept;                                \
-  CXX_RS_EXPORT void cxxbridge1$rust_vec$##RUST_TYPE##$reserve_total(                        \
+  CXX_RS_EXPORT void cxxbridge1$rust_vec$##RUST_TYPE##$reserve_total(          \
       rust::Vec<CXX_TYPE> *ptr, std::size_t new_cap) noexcept;                 \
-  CXX_RS_EXPORT void cxxbridge1$rust_vec$##RUST_TYPE##$set_len(rust::Vec<CXX_TYPE> *ptr,     \
-                                                 std::size_t len) noexcept;    \
-  CXX_RS_EXPORT void cxxbridge1$rust_vec$##RUST_TYPE##$truncate(rust::Vec<CXX_TYPE> *ptr,    \
-                                                  std::size_t len) noexcept;
+  CXX_RS_EXPORT void cxxbridge1$rust_vec$##RUST_TYPE##$set_len(                \
+      rust::Vec<CXX_TYPE> *ptr, std::size_t len) noexcept;                     \
+  CXX_RS_EXPORT void cxxbridge1$rust_vec$##RUST_TYPE##$truncate(               \
+      rust::Vec<CXX_TYPE> *ptr, std::size_t len) noexcept;
 
 #define RUST_VEC_OPS(RUST_TYPE, CXX_TYPE)                                      \
   template <>                                                                  \
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/cxx_string.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/cxx_string.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/cxx_string.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/cxx_string.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/cxx_vector.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/cxx_vector.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/cxx_vector.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/cxx_vector.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/exception.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/exception.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/exception.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/exception.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/extern_type.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/extern_type.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/extern_type.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/extern_type.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/fmt.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/fmt.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/fmt.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/fmt.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/function.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/function.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/function.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/function.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/hash.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/hash.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/hash.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/hash.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/lib.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/lib.rs
similarity index 99%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/lib.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/lib.rs
index 3750200..7791e37 100644
--- a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/lib.rs
+++ b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/lib.rs
@@ -364,7 +364,7 @@
 //! </table>
 
 #![no_std]
-#![doc(html_root_url = "https://docs.rs/cxx/1.0.135")]
+#![doc(html_root_url = "https://docs.rs/cxx/1.0.136")]
 #![cfg_attr(docsrs, feature(doc_cfg))]
 #![deny(
     improper_ctypes,
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/lossy.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/lossy.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/lossy.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/lossy.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/macros/assert.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/macros/assert.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/macros/assert.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/macros/assert.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/macros/mod.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/macros/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/macros/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/macros/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/memory.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/memory.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/memory.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/memory.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/opaque.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/opaque.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/opaque.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/opaque.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/result.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/result.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/result.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/result.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/rust_slice.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/rust_slice.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/rust_slice.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/rust_slice.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/rust_str.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/rust_str.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/rust_str.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/rust_str.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/rust_string.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/rust_string.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/rust_string.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/rust_string.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/rust_type.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/rust_type.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/rust_type.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/rust_type.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/rust_vec.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/rust_vec.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/rust_vec.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/rust_vec.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/shared_ptr.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/shared_ptr.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/shared_ptr.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/shared_ptr.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/symbols/exception.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/symbols/exception.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/symbols/exception.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/symbols/exception.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/symbols/mod.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/symbols/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/symbols/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/symbols/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/symbols/rust_slice.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/symbols/rust_slice.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/symbols/rust_slice.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/symbols/rust_slice.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/symbols/rust_str.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/symbols/rust_str.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/symbols/rust_str.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/symbols/rust_str.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/symbols/rust_string.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/symbols/rust_string.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/symbols/rust_string.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/symbols/rust_string.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/symbols/rust_vec.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/symbols/rust_vec.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/symbols/rust_vec.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/symbols/rust_vec.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/type_id.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/type_id.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/type_id.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/type_id.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/unique_ptr.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/unique_ptr.rs
similarity index 92%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/unique_ptr.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/unique_ptr.rs
index 1a657cb..1ad6a23 100644
--- a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/unique_ptr.rs
+++ b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/unique_ptr.rs
@@ -55,21 +55,22 @@
     ///
     /// This is the opposite of [std::unique_ptr\<T\>::operator bool](https://en.cppreference.com/w/cpp/memory/unique_ptr/operator_bool).
     pub fn is_null(&self) -> bool {
-        let ptr = unsafe { T::__get(self.repr) };
-        ptr.is_null()
+        self.as_ptr().is_null()
     }
 
     /// Returns a reference to the object owned by this UniquePtr if any,
     /// otherwise None.
     pub fn as_ref(&self) -> Option<&T> {
-        unsafe { T::__get(self.repr).as_ref() }
+        let ptr = self.as_ptr();
+        unsafe { ptr.as_ref() }
     }
 
     /// Returns a mutable pinned reference to the object owned by this UniquePtr
     /// if any, otherwise None.
     pub fn as_mut(&mut self) -> Option<Pin<&mut T>> {
+        let ptr = self.as_mut_ptr();
         unsafe {
-            let mut_reference = (T::__get(self.repr) as *mut T).as_mut()?;
+            let mut_reference = ptr.as_mut()?;
             Some(Pin::new_unchecked(mut_reference))
         }
     }
@@ -90,6 +91,23 @@
         }
     }
 
+    /// Returns a raw const pointer to the object owned by this UniquePtr if
+    /// any, otherwise the null pointer.
+    pub fn as_ptr(&self) -> *const T {
+        unsafe { T::__get(self.repr) }
+    }
+
+    /// Returns a raw mutable pointer to the object owned by this UniquePtr if
+    /// any, otherwise the null pointer.
+    ///
+    /// As with [std::unique_ptr\<T\>::get](https://en.cppreference.com/w/cpp/memory/unique_ptr/get),
+    /// this doesn't require that you hold an exclusive reference to the
+    /// UniquePtr. This differs from Rust norms, so extra care should be taken
+    /// in the way the pointer is used.
+    pub fn as_mut_ptr(&self) -> *mut T {
+        self.as_ptr() as *mut T
+    }
+
     /// Consumes the UniquePtr, releasing its ownership of the heap-allocated T.
     ///
     /// Matches the behavior of [std::unique_ptr\<T\>::release](https://en.cppreference.com/w/cpp/memory/unique_ptr/release).
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/unwind.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/unwind.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/unwind.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/unwind.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/vector.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/vector.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/vector.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/vector.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/weak_ptr.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/weak_ptr.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/weak_ptr.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/weak_ptr.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/BUCK b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/BUCK
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/BUCK
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/BUCK
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/BUILD.bazel b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/BUILD.bazel
similarity index 91%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/BUILD.bazel
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/BUILD.bazel
index bccde55..e871466 100644
--- a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/BUILD.bazel
+++ b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/BUILD.bazel
@@ -15,6 +15,7 @@
 
 rust_library(
     name = "cxx_test_suite",
+    testonly = True,
     srcs = [
         "ffi/cast.rs",
         "ffi/lib.rs",
@@ -29,6 +30,7 @@
 
 cc_library(
     name = "impl",
+    testonly = True,
     srcs = [
         "ffi/tests.cc",
         ":bridge/source",
@@ -44,12 +46,14 @@
 
 rust_cxx_bridge(
     name = "bridge",
+    testonly = True,
     src = "ffi/lib.rs",
     deps = [":impl"],
 )
 
 rust_cxx_bridge(
     name = "module",
+    testonly = True,
     src = "ffi/module.rs",
     deps = [":impl"],
 )
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/compiletest.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/compiletest.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/compiletest.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/compiletest.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/cxx_gen.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/cxx_gen.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/cxx_gen.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/cxx_gen.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/cxx_string.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/cxx_string.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/cxx_string.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/cxx_string.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/cxx_vector.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/cxx_vector.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/cxx_vector.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/cxx_vector.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/test.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/test.rs
similarity index 98%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/test.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/test.rs
index ac39658..df06104 100644
--- a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/test.rs
+++ b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/test.rs
@@ -259,6 +259,8 @@
     assert_eq!(2021, unique_ptr.get());
     assert_eq!(2021, unique_ptr.get2());
     assert_eq!(2021, *unique_ptr.getRef());
+    assert_eq!(2021, unsafe { &mut *unique_ptr.as_mut_ptr() }.get());
+    assert_eq!(2021, unsafe { &*unique_ptr.as_ptr() }.get());
     assert_eq!(2021, *unique_ptr.pin_mut().getMut());
     assert_eq!(2022, unique_ptr.pin_mut().set_succeed(2022).unwrap());
     assert!(unique_ptr.pin_mut().get_fail().is_err());
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/array_len_expr.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/array_len_expr.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/array_len_expr.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/array_len_expr.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/array_len_expr.stderr b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/array_len_expr.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/array_len_expr.stderr
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/array_len_expr.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/array_len_suffix.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/array_len_suffix.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/array_len_suffix.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/array_len_suffix.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/array_len_suffix.stderr b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/array_len_suffix.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/array_len_suffix.stderr
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/array_len_suffix.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/async_fn.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/async_fn.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/async_fn.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/async_fn.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/async_fn.stderr b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/async_fn.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/async_fn.stderr
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/async_fn.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/bad_explicit_impl.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/bad_explicit_impl.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/bad_explicit_impl.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/bad_explicit_impl.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/bad_explicit_impl.stderr b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/bad_explicit_impl.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/bad_explicit_impl.stderr
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/bad_explicit_impl.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/by_value_not_supported.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/by_value_not_supported.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/by_value_not_supported.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/by_value_not_supported.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/by_value_not_supported.stderr b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/by_value_not_supported.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/by_value_not_supported.stderr
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/by_value_not_supported.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/const_fn.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/const_fn.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/const_fn.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/const_fn.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/const_fn.stderr b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/const_fn.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/const_fn.stderr
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/const_fn.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/cxx_crate_name_qualified_cxx_string.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/cxx_crate_name_qualified_cxx_string.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/cxx_crate_name_qualified_cxx_string.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/cxx_crate_name_qualified_cxx_string.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/cxx_crate_name_qualified_cxx_string.stderr b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/cxx_crate_name_qualified_cxx_string.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/cxx_crate_name_qualified_cxx_string.stderr
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/cxx_crate_name_qualified_cxx_string.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/data_enums.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/data_enums.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/data_enums.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/data_enums.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/data_enums.stderr b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/data_enums.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/data_enums.stderr
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/data_enums.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/deny_elided_lifetimes.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/deny_elided_lifetimes.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/deny_elided_lifetimes.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/deny_elided_lifetimes.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/deny_elided_lifetimes.stderr b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/deny_elided_lifetimes.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/deny_elided_lifetimes.stderr
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/deny_elided_lifetimes.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/deny_missing_docs.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/deny_missing_docs.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/deny_missing_docs.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/deny_missing_docs.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/deny_missing_docs.stderr b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/deny_missing_docs.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/deny_missing_docs.stderr
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/deny_missing_docs.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/derive_duplicate.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/derive_duplicate.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/derive_duplicate.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/derive_duplicate.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/derive_duplicate.stderr b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/derive_duplicate.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/derive_duplicate.stderr
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/derive_duplicate.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/derive_noncopy.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/derive_noncopy.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/derive_noncopy.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/derive_noncopy.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/derive_noncopy.stderr b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/derive_noncopy.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/derive_noncopy.stderr
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/derive_noncopy.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/drop_shared.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/drop_shared.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/drop_shared.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/drop_shared.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/drop_shared.stderr b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/drop_shared.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/drop_shared.stderr
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/drop_shared.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/empty_enum.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/empty_enum.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/empty_enum.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/empty_enum.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/empty_enum.stderr b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/empty_enum.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/empty_enum.stderr
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/empty_enum.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/empty_struct.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/empty_struct.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/empty_struct.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/empty_struct.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/empty_struct.stderr b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/empty_struct.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/empty_struct.stderr
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/empty_struct.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/enum_inconsistent.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/enum_inconsistent.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/enum_inconsistent.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/enum_inconsistent.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/enum_inconsistent.stderr b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/enum_inconsistent.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/enum_inconsistent.stderr
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/enum_inconsistent.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/enum_match_without_wildcard.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/enum_match_without_wildcard.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/enum_match_without_wildcard.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/enum_match_without_wildcard.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/enum_match_without_wildcard.stderr b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/enum_match_without_wildcard.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/enum_match_without_wildcard.stderr
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/enum_match_without_wildcard.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/enum_out_of_bounds.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/enum_out_of_bounds.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/enum_out_of_bounds.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/enum_out_of_bounds.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/enum_out_of_bounds.stderr b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/enum_out_of_bounds.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/enum_out_of_bounds.stderr
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/enum_out_of_bounds.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/enum_overflows.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/enum_overflows.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/enum_overflows.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/enum_overflows.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/enum_overflows.stderr b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/enum_overflows.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/enum_overflows.stderr
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/enum_overflows.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/enum_receiver.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/enum_receiver.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/enum_receiver.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/enum_receiver.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/enum_receiver.stderr b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/enum_receiver.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/enum_receiver.stderr
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/enum_receiver.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/enum_unsatisfiable.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/enum_unsatisfiable.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/enum_unsatisfiable.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/enum_unsatisfiable.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/enum_unsatisfiable.stderr b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/enum_unsatisfiable.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/enum_unsatisfiable.stderr
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/enum_unsatisfiable.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/expected_named.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/expected_named.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/expected_named.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/expected_named.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/expected_named.stderr b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/expected_named.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/expected_named.stderr
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/expected_named.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/extern_fn_abi.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/extern_fn_abi.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/extern_fn_abi.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/extern_fn_abi.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/extern_fn_abi.stderr b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/extern_fn_abi.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/extern_fn_abi.stderr
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/extern_fn_abi.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/extern_type_bound.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/extern_type_bound.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/extern_type_bound.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/extern_type_bound.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/extern_type_bound.stderr b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/extern_type_bound.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/extern_type_bound.stderr
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/extern_type_bound.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/extern_type_generic.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/extern_type_generic.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/extern_type_generic.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/extern_type_generic.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/extern_type_generic.stderr b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/extern_type_generic.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/extern_type_generic.stderr
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/extern_type_generic.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/extern_type_lifetime_bound.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/extern_type_lifetime_bound.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/extern_type_lifetime_bound.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/extern_type_lifetime_bound.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/extern_type_lifetime_bound.stderr b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/extern_type_lifetime_bound.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/extern_type_lifetime_bound.stderr
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/extern_type_lifetime_bound.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/fallible_fnptr.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/fallible_fnptr.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/fallible_fnptr.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/fallible_fnptr.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/fallible_fnptr.stderr b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/fallible_fnptr.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/fallible_fnptr.stderr
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/fallible_fnptr.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/function_with_body.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/function_with_body.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/function_with_body.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/function_with_body.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/function_with_body.stderr b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/function_with_body.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/function_with_body.stderr
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/function_with_body.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/generic_enum.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/generic_enum.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/generic_enum.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/generic_enum.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/generic_enum.stderr b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/generic_enum.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/generic_enum.stderr
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/generic_enum.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/impl_trait_for_type.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/impl_trait_for_type.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/impl_trait_for_type.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/impl_trait_for_type.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/impl_trait_for_type.stderr b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/impl_trait_for_type.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/impl_trait_for_type.stderr
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/impl_trait_for_type.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/include.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/include.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/include.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/include.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/include.stderr b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/include.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/include.stderr
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/include.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/lifetime_extern_cxx.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/lifetime_extern_cxx.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/lifetime_extern_cxx.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/lifetime_extern_cxx.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/lifetime_extern_cxx.stderr b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/lifetime_extern_cxx.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/lifetime_extern_cxx.stderr
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/lifetime_extern_cxx.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/lifetime_extern_rust.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/lifetime_extern_rust.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/lifetime_extern_rust.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/lifetime_extern_rust.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/lifetime_extern_rust.stderr b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/lifetime_extern_rust.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/lifetime_extern_rust.stderr
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/lifetime_extern_rust.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/missing_unsafe.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/missing_unsafe.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/missing_unsafe.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/missing_unsafe.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/missing_unsafe.stderr b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/missing_unsafe.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/missing_unsafe.stderr
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/missing_unsafe.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/multiple_parse_error.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/multiple_parse_error.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/multiple_parse_error.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/multiple_parse_error.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/multiple_parse_error.stderr b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/multiple_parse_error.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/multiple_parse_error.stderr
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/multiple_parse_error.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/mut_return.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/mut_return.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/mut_return.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/mut_return.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/mut_return.stderr b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/mut_return.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/mut_return.stderr
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/mut_return.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/non_integer_discriminant_enum.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/non_integer_discriminant_enum.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/non_integer_discriminant_enum.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/non_integer_discriminant_enum.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/non_integer_discriminant_enum.stderr b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/non_integer_discriminant_enum.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/non_integer_discriminant_enum.stderr
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/non_integer_discriminant_enum.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/nonempty_impl_block.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/nonempty_impl_block.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/nonempty_impl_block.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/nonempty_impl_block.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/nonempty_impl_block.stderr b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/nonempty_impl_block.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/nonempty_impl_block.stderr
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/nonempty_impl_block.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/nonlocal_rust_type.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/nonlocal_rust_type.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/nonlocal_rust_type.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/nonlocal_rust_type.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/nonlocal_rust_type.stderr b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/nonlocal_rust_type.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/nonlocal_rust_type.stderr
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/nonlocal_rust_type.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/opaque_autotraits.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/opaque_autotraits.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/opaque_autotraits.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/opaque_autotraits.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/opaque_autotraits.stderr b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/opaque_autotraits.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/opaque_autotraits.stderr
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/opaque_autotraits.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/opaque_not_sized.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/opaque_not_sized.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/opaque_not_sized.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/opaque_not_sized.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/opaque_not_sized.stderr b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/opaque_not_sized.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/opaque_not_sized.stderr
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/opaque_not_sized.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/pin_mut_opaque.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/pin_mut_opaque.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/pin_mut_opaque.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/pin_mut_opaque.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/pin_mut_opaque.stderr b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/pin_mut_opaque.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/pin_mut_opaque.stderr
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/pin_mut_opaque.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/ptr_in_fnptr.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/ptr_in_fnptr.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/ptr_in_fnptr.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/ptr_in_fnptr.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/ptr_in_fnptr.stderr b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/ptr_in_fnptr.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/ptr_in_fnptr.stderr
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/ptr_in_fnptr.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/ptr_missing_unsafe.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/ptr_missing_unsafe.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/ptr_missing_unsafe.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/ptr_missing_unsafe.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/ptr_missing_unsafe.stderr b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/ptr_missing_unsafe.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/ptr_missing_unsafe.stderr
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/ptr_missing_unsafe.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/ptr_no_const_mut.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/ptr_no_const_mut.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/ptr_no_const_mut.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/ptr_no_const_mut.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/ptr_no_const_mut.stderr b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/ptr_no_const_mut.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/ptr_no_const_mut.stderr
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/ptr_no_const_mut.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/ptr_unsupported.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/ptr_unsupported.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/ptr_unsupported.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/ptr_unsupported.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/ptr_unsupported.stderr b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/ptr_unsupported.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/ptr_unsupported.stderr
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/ptr_unsupported.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/raw_ident_namespace.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/raw_ident_namespace.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/raw_ident_namespace.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/raw_ident_namespace.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/raw_ident_namespace.stderr b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/raw_ident_namespace.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/raw_ident_namespace.stderr
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/raw_ident_namespace.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/reference_to_reference.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/reference_to_reference.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/reference_to_reference.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/reference_to_reference.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/reference_to_reference.stderr b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/reference_to_reference.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/reference_to_reference.stderr
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/reference_to_reference.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/reserved_lifetime.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/reserved_lifetime.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/reserved_lifetime.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/reserved_lifetime.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/reserved_lifetime.stderr b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/reserved_lifetime.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/reserved_lifetime.stderr
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/reserved_lifetime.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/reserved_name.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/reserved_name.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/reserved_name.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/reserved_name.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/reserved_name.stderr b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/reserved_name.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/reserved_name.stderr
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/reserved_name.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/result_no_display.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/result_no_display.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/result_no_display.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/result_no_display.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/result_no_display.stderr b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/result_no_display.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/result_no_display.stderr
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/result_no_display.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/root_namespace.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/root_namespace.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/root_namespace.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/root_namespace.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/root_namespace.stderr b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/root_namespace.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/root_namespace.stderr
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/root_namespace.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/rust_pinned.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/rust_pinned.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/rust_pinned.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/rust_pinned.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/rust_pinned.stderr b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/rust_pinned.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/rust_pinned.stderr
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/rust_pinned.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/slice_of_type_alias.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/slice_of_type_alias.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/slice_of_type_alias.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/slice_of_type_alias.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/slice_of_type_alias.stderr b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/slice_of_type_alias.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/slice_of_type_alias.stderr
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/slice_of_type_alias.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/slice_unsupported.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/slice_unsupported.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/slice_unsupported.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/slice_unsupported.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/slice_unsupported.stderr b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/slice_unsupported.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/slice_unsupported.stderr
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/slice_unsupported.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/struct_cycle.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/struct_cycle.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/struct_cycle.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/struct_cycle.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/struct_cycle.stderr b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/struct_cycle.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/struct_cycle.stderr
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/struct_cycle.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/type_alias_rust.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/type_alias_rust.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/type_alias_rust.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/type_alias_rust.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/type_alias_rust.stderr b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/type_alias_rust.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/type_alias_rust.stderr
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/type_alias_rust.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/unique_ptr_as_mut.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/unique_ptr_as_mut.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/unique_ptr_as_mut.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/unique_ptr_as_mut.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/unique_ptr_as_mut.stderr b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/unique_ptr_as_mut.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/unique_ptr_as_mut.stderr
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/unique_ptr_as_mut.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/unique_ptr_to_opaque.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/unique_ptr_to_opaque.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/unique_ptr_to_opaque.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/unique_ptr_to_opaque.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/unique_ptr_to_opaque.stderr b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/unique_ptr_to_opaque.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/unique_ptr_to_opaque.stderr
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/unique_ptr_to_opaque.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/unique_ptr_twice.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/unique_ptr_twice.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/unique_ptr_twice.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/unique_ptr_twice.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/unique_ptr_twice.stderr b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/unique_ptr_twice.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/unique_ptr_twice.stderr
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/unique_ptr_twice.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/unnamed_receiver.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/unnamed_receiver.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/unnamed_receiver.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/unnamed_receiver.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/unnamed_receiver.stderr b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/unnamed_receiver.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/unnamed_receiver.stderr
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/unnamed_receiver.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/unpin_impl.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/unpin_impl.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/unpin_impl.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/unpin_impl.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/unpin_impl.stderr b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/unpin_impl.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/unpin_impl.stderr
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/unpin_impl.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/unrecognized_receiver.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/unrecognized_receiver.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/unrecognized_receiver.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/unrecognized_receiver.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/unrecognized_receiver.stderr b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/unrecognized_receiver.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/unrecognized_receiver.stderr
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/unrecognized_receiver.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/unsupported_elided.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/unsupported_elided.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/unsupported_elided.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/unsupported_elided.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/unsupported_elided.stderr b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/unsupported_elided.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/unsupported_elided.stderr
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/unsupported_elided.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/vec_opaque.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/vec_opaque.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/vec_opaque.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/vec_opaque.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/vec_opaque.stderr b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/vec_opaque.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/vec_opaque.stderr
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/vec_opaque.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/vector_autotraits.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/vector_autotraits.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/vector_autotraits.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/vector_autotraits.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/vector_autotraits.stderr b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/vector_autotraits.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/vector_autotraits.stderr
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/vector_autotraits.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/wrong_type_id.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/wrong_type_id.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/wrong_type_id.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/wrong_type_id.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/wrong_type_id.stderr b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/wrong_type_id.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/ui/wrong_type_id.stderr
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/ui/wrong_type_id.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/unique_ptr.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/unique_ptr.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tests/unique_ptr.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tests/unique_ptr.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tools/bazel/BUILD.bazel b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tools/bazel/BUILD.bazel
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tools/bazel/BUILD.bazel
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tools/bazel/BUILD.bazel
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tools/bazel/extension.bzl b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tools/bazel/extension.bzl
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tools/bazel/extension.bzl
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tools/bazel/extension.bzl
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tools/bazel/rust_cxx_bridge.bzl b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tools/bazel/rust_cxx_bridge.bzl
similarity index 84%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tools/bazel/rust_cxx_bridge.bzl
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tools/bazel/rust_cxx_bridge.bzl
index c7d07e8a..48aac83 100644
--- a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tools/bazel/rust_cxx_bridge.bzl
+++ b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tools/bazel/rust_cxx_bridge.bzl
@@ -2,22 +2,25 @@
 load("@bazel_skylib//rules:run_binary.bzl", "run_binary")
 load("@rules_cc//cc:defs.bzl", "cc_library")
 
-def rust_cxx_bridge(name, src, deps = []):
+def rust_cxx_bridge(name, src, deps = [], **kwargs):
     """A macro defining a cxx bridge library
 
     Args:
         name (string): The name of the new target
         src (string): The rust source file to generate a bridge for
         deps (list, optional): A list of dependencies for the underlying cc_library. Defaults to [].
+        **kwargs: Common arguments to pass through to underlying rules.
     """
     native.alias(
         name = "%s/header" % name,
         actual = src + ".h",
+        **kwargs
     )
 
     native.alias(
         name = "%s/source" % name,
         actual = src + ".cc",
+        **kwargs
     )
 
     run_binary(
@@ -35,15 +38,18 @@
             "$(location %s.cc)" % src,
         ],
         tool = "@cxx.rs//:codegen",
+        **kwargs
     )
 
     cc_library(
         name = name,
         srcs = [src + ".cc"],
         deps = deps + [":%s/include" % name],
+        **kwargs
     )
 
     cc_library(
         name = "%s/include" % name,
         hdrs = [src + ".h"],
+        **kwargs
     )
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tools/buck/rust_cxx_bridge.bzl b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tools/buck/rust_cxx_bridge.bzl
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tools/buck/rust_cxx_bridge.bzl
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tools/buck/rust_cxx_bridge.bzl
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tools/buck/toolchains/BUCK b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tools/buck/toolchains/BUCK
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tools/buck/toolchains/BUCK
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tools/buck/toolchains/BUCK
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tools/cargo/build.rs b/third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tools/cargo/build.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/tools/cargo/build.rs
rename to third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/tools/cargo/build.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/.cargo_vcs_info.json b/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/.cargo_vcs_info.json
deleted file mode 100644
index 6853dfe7..0000000
--- a/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/.cargo_vcs_info.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-  "git": {
-    "sha1": "ee011dbc05c9bce44aa28627da7ab6c5d782e8cb"
-  },
-  "path_in_vcs": "gen/cmd"
-}
\ No newline at end of file
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/.cargo-checksum.json b/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/.cargo-checksum.json
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/.cargo-checksum.json
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/.cargo-checksum.json
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/.cargo_vcs_info.json b/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/.cargo_vcs_info.json
new file mode 100644
index 0000000..d5a2c0a
--- /dev/null
+++ b/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/.cargo_vcs_info.json
@@ -0,0 +1,6 @@
+{
+  "git": {
+    "sha1": "d54e44698c3fa5833a861cb3ae502533b92f2f57"
+  },
+  "path_in_vcs": "gen/cmd"
+}
\ No newline at end of file
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/Cargo.lock b/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/Cargo.lock
similarity index 97%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/Cargo.lock
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/Cargo.lock
index dc1e0a3b..c91c6ff 100644
--- a/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/Cargo.lock
+++ b/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/Cargo.lock
@@ -46,7 +46,7 @@
 
 [[package]]
 name = "cxxbridge-cmd"
-version = "1.0.135"
+version = "1.0.136"
 dependencies = [
  "clap",
  "codespan-reporting",
@@ -81,9 +81,9 @@
 
 [[package]]
 name = "syn"
-version = "2.0.90"
+version = "2.0.91"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31"
+checksum = "d53cbcb5a243bd33b7858b1d7f4aca2153490815872d86d955d6ea29f743c035"
 dependencies = [
  "proc-macro2",
  "quote",
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/Cargo.toml b/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/Cargo.toml
similarity index 98%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/Cargo.toml
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/Cargo.toml
index f3548af..78e6c23 100644
--- a/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/Cargo.toml
+++ b/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/Cargo.toml
@@ -13,7 +13,7 @@
 edition = "2021"
 rust-version = "1.73"
 name = "cxxbridge-cmd"
-version = "1.0.135"
+version = "1.0.136"
 authors = ["David Tolnay <dtolnay@gmail.com>"]
 build = false
 exclude = ["build.rs"]
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/Cargo.toml.orig b/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/Cargo.toml.orig
similarity index 97%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/Cargo.toml.orig
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/Cargo.toml.orig
index 78e848f..cdc95ff 100644
--- a/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/Cargo.toml.orig
+++ b/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/Cargo.toml.orig
@@ -1,6 +1,6 @@
 [package]
 name = "cxxbridge-cmd"
-version = "1.0.135"
+version = "1.0.136"
 authors = ["David Tolnay <dtolnay@gmail.com>"]
 categories = ["development-tools::build-utils", "development-tools::ffi"]
 description = "C++ code generator for integrating `cxx` crate into a non-Cargo build."
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/LICENSE-APACHE b/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/LICENSE-APACHE
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/LICENSE-APACHE
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/LICENSE-APACHE
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/LICENSE-MIT b/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/LICENSE-MIT
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/LICENSE-MIT
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/LICENSE-MIT
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/app.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/app.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/app.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/app.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/cfg.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/cfg.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/cfg.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/cfg.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/gen/block.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/gen/block.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/gen/block.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/gen/block.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/gen/builtin.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/gen/builtin.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/gen/builtin.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/gen/builtin.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/gen/cfg.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/gen/cfg.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/gen/cfg.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/gen/cfg.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/gen/check.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/gen/check.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/gen/check.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/gen/check.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/gen/error.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/gen/error.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/gen/error.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/gen/error.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/gen/file.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/gen/file.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/gen/file.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/gen/file.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/gen/fs.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/gen/fs.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/gen/fs.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/gen/fs.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/gen/ifndef.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/gen/ifndef.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/gen/ifndef.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/gen/ifndef.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/gen/include.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/gen/include.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/gen/include.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/gen/include.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/gen/include/cxx.h b/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/gen/include/cxx.h
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/gen/include/cxx.h
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/gen/include/cxx.h
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/gen/mod.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/gen/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/gen/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/gen/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/gen/names.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/gen/names.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/gen/names.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/gen/names.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/gen/namespace.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/gen/namespace.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/gen/namespace.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/gen/namespace.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/gen/nested.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/gen/nested.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/gen/nested.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/gen/nested.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/gen/out.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/gen/out.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/gen/out.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/gen/out.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/gen/write.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/gen/write.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/gen/write.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/gen/write.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/main.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/main.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/main.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/main.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/output.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/output.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/output.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/output.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/atom.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/atom.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/atom.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/atom.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/attrs.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/attrs.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/attrs.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/attrs.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/cfg.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/cfg.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/cfg.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/cfg.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/check.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/check.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/check.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/check.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/derive.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/derive.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/derive.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/derive.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/discriminant.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/discriminant.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/discriminant.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/discriminant.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/doc.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/doc.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/doc.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/doc.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/error.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/error.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/error.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/error.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/file.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/file.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/file.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/file.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/ident.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/ident.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/ident.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/ident.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/impls.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/impls.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/impls.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/impls.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/improper.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/improper.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/improper.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/improper.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/instantiate.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/instantiate.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/instantiate.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/instantiate.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/mangle.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/mangle.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/mangle.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/mangle.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/map.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/map.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/map.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/map.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/mod.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/names.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/names.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/names.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/names.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/namespace.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/namespace.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/namespace.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/namespace.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/parse.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/parse.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/parse.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/parse.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/pod.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/pod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/pod.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/pod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/qualified.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/qualified.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/qualified.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/qualified.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/report.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/report.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/report.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/report.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/resolve.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/resolve.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/resolve.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/resolve.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/set.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/set.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/set.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/set.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/symbol.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/symbol.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/symbol.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/symbol.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/tokens.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/tokens.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/tokens.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/tokens.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/toposort.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/toposort.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/toposort.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/toposort.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/trivial.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/trivial.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/trivial.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/trivial.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/types.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/types.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/types.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/types.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/visit.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/visit.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/visit.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/visit.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/test.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/test.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/test.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/test.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-flags-1.0.135/.cargo_vcs_info.json b/third_party/rust/chromium_crates_io/vendor/cxxbridge-flags-1.0.135/.cargo_vcs_info.json
deleted file mode 100644
index 03f1fcc..0000000
--- a/third_party/rust/chromium_crates_io/vendor/cxxbridge-flags-1.0.135/.cargo_vcs_info.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-  "git": {
-    "sha1": "ee011dbc05c9bce44aa28627da7ab6c5d782e8cb"
-  },
-  "path_in_vcs": "flags"
-}
\ No newline at end of file
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-flags-1.0.135/.cargo-checksum.json b/third_party/rust/chromium_crates_io/vendor/cxxbridge-flags-1.0.136/.cargo-checksum.json
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-flags-1.0.135/.cargo-checksum.json
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-flags-1.0.136/.cargo-checksum.json
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-flags-1.0.136/.cargo_vcs_info.json b/third_party/rust/chromium_crates_io/vendor/cxxbridge-flags-1.0.136/.cargo_vcs_info.json
new file mode 100644
index 0000000..bff7b446
--- /dev/null
+++ b/third_party/rust/chromium_crates_io/vendor/cxxbridge-flags-1.0.136/.cargo_vcs_info.json
@@ -0,0 +1,6 @@
+{
+  "git": {
+    "sha1": "d54e44698c3fa5833a861cb3ae502533b92f2f57"
+  },
+  "path_in_vcs": "flags"
+}
\ No newline at end of file
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-flags-1.0.135/Cargo.lock b/third_party/rust/chromium_crates_io/vendor/cxxbridge-flags-1.0.136/Cargo.lock
similarity index 87%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-flags-1.0.135/Cargo.lock
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-flags-1.0.136/Cargo.lock
index a4cf389..7af4cba 100644
--- a/third_party/rust/chromium_crates_io/vendor/cxxbridge-flags-1.0.135/Cargo.lock
+++ b/third_party/rust/chromium_crates_io/vendor/cxxbridge-flags-1.0.136/Cargo.lock
@@ -4,4 +4,4 @@
 
 [[package]]
 name = "cxxbridge-flags"
-version = "1.0.135"
+version = "1.0.136"
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-flags-1.0.135/Cargo.toml b/third_party/rust/chromium_crates_io/vendor/cxxbridge-flags-1.0.136/Cargo.toml
similarity index 98%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-flags-1.0.135/Cargo.toml
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-flags-1.0.136/Cargo.toml
index b9c22bd..b36a5fb0 100644
--- a/third_party/rust/chromium_crates_io/vendor/cxxbridge-flags-1.0.135/Cargo.toml
+++ b/third_party/rust/chromium_crates_io/vendor/cxxbridge-flags-1.0.136/Cargo.toml
@@ -13,7 +13,7 @@
 edition = "2021"
 rust-version = "1.73"
 name = "cxxbridge-flags"
-version = "1.0.135"
+version = "1.0.136"
 authors = ["David Tolnay <dtolnay@gmail.com>"]
 build = false
 autolib = false
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-flags-1.0.135/Cargo.toml.orig b/third_party/rust/chromium_crates_io/vendor/cxxbridge-flags-1.0.136/Cargo.toml.orig
similarity index 96%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-flags-1.0.135/Cargo.toml.orig
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-flags-1.0.136/Cargo.toml.orig
index 966d506..3603bea 100644
--- a/third_party/rust/chromium_crates_io/vendor/cxxbridge-flags-1.0.135/Cargo.toml.orig
+++ b/third_party/rust/chromium_crates_io/vendor/cxxbridge-flags-1.0.136/Cargo.toml.orig
@@ -1,6 +1,6 @@
 [package]
 name = "cxxbridge-flags"
-version = "1.0.135"
+version = "1.0.136"
 authors = ["David Tolnay <dtolnay@gmail.com>"]
 categories = ["development-tools::ffi", "compilers"]
 description = "Compiler configuration of the `cxx` crate (implementation detail)"
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-flags-1.0.135/LICENSE-APACHE b/third_party/rust/chromium_crates_io/vendor/cxxbridge-flags-1.0.136/LICENSE-APACHE
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-flags-1.0.135/LICENSE-APACHE
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-flags-1.0.136/LICENSE-APACHE
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-flags-1.0.135/LICENSE-MIT b/third_party/rust/chromium_crates_io/vendor/cxxbridge-flags-1.0.136/LICENSE-MIT
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-flags-1.0.135/LICENSE-MIT
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-flags-1.0.136/LICENSE-MIT
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-flags-1.0.135/src/impl.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-flags-1.0.136/src/impl.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-flags-1.0.135/src/impl.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-flags-1.0.136/src/impl.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-flags-1.0.135/src/lib.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-flags-1.0.136/src/lib.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-flags-1.0.135/src/lib.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-flags-1.0.136/src/lib.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/.cargo_vcs_info.json b/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/.cargo_vcs_info.json
deleted file mode 100644
index f44986d..0000000
--- a/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/.cargo_vcs_info.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-  "git": {
-    "sha1": "ee011dbc05c9bce44aa28627da7ab6c5d782e8cb"
-  },
-  "path_in_vcs": "macro"
-}
\ No newline at end of file
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/.cargo-checksum.json b/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/.cargo-checksum.json
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/.cargo-checksum.json
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/.cargo-checksum.json
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/.cargo_vcs_info.json b/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/.cargo_vcs_info.json
new file mode 100644
index 0000000..7d736491
--- /dev/null
+++ b/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/.cargo_vcs_info.json
@@ -0,0 +1,6 @@
+{
+  "git": {
+    "sha1": "d54e44698c3fa5833a861cb3ae502533b92f2f57"
+  },
+  "path_in_vcs": "macro"
+}
\ No newline at end of file
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/Cargo.lock b/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/Cargo.lock
similarity index 91%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/Cargo.lock
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/Cargo.lock
index b47abd9a..d244fb5 100644
--- a/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/Cargo.lock
+++ b/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/Cargo.lock
@@ -16,9 +16,9 @@
 
 [[package]]
 name = "cc"
-version = "1.2.4"
+version = "1.2.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9157bbaa6b165880c27a4293a474c91cdcf265cc68cc829bf10be0964a391caf"
+checksum = "c31a0499c1dc64f458ad13872de75c0eb7e3fdb0e67964610c914b034fc5956e"
 dependencies = [
  "shlex",
 ]
@@ -86,23 +86,23 @@
 
 [[package]]
 name = "cxx"
-version = "1.0.134"
+version = "1.0.135"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a5a32d755fe20281b46118ee4b507233311fb7a48a0cfd42f554b93640521a2f"
+checksum = "4d44ff199ff93242c3afe480ab588d544dd08d72e92885e152ffebc670f076ad"
 dependencies = [
  "cc",
  "cxxbridge-cmd",
  "cxxbridge-flags",
- "cxxbridge-macro 1.0.134",
+ "cxxbridge-macro 1.0.135",
  "foldhash",
  "link-cplusplus",
 ]
 
 [[package]]
 name = "cxxbridge-cmd"
-version = "1.0.134"
+version = "1.0.135"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ebcc9c78e3c7289665aab921a2b394eaffe8bdb369aa18d81ffc0f534fd49385"
+checksum = "4717c9c806a9e07fdcb34c84965a414ea40fafe57667187052cf1eb7f5e8a8a9"
 dependencies = [
  "clap",
  "codespan-reporting",
@@ -113,15 +113,15 @@
 
 [[package]]
 name = "cxxbridge-flags"
-version = "1.0.134"
+version = "1.0.135"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3a22a87bd9e78d7204d793261470a4c9d585154fddd251828d8aefbb5f74c3bf"
+checksum = "2f6515329bf3d98f4073101c7866ff2bec4e635a13acb82e3f3753fff0bf43cb"
 
 [[package]]
 name = "cxxbridge-macro"
-version = "1.0.134"
+version = "1.0.135"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1dfdb020ff8787c5daf6e0dca743005cc8782868faeadfbabb8824ede5cb1c72"
+checksum = "fb93e6a7ce8ec985c02bbb758237a31598b340acbbc3c19c5a4fa6adaaac92ab"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -131,7 +131,7 @@
 
 [[package]]
 name = "cxxbridge-macro"
-version = "1.0.135"
+version = "1.0.136"
 dependencies = [
  "clang-ast",
  "cxx",
@@ -158,9 +158,9 @@
 
 [[package]]
 name = "foldhash"
-version = "0.1.3"
+version = "0.1.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f81ec6369c545a7d40e4589b5597581fa1c441fe1cce96dd1de43159910a36a2"
+checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f"
 
 [[package]]
 name = "itoa"
@@ -170,9 +170,9 @@
 
 [[package]]
 name = "libc"
-version = "0.2.168"
+version = "0.2.169"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5aaeb2981e0606ca11d79718f8bb01164f1d6ed75080182d3abf017e6d244b6d"
+checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a"
 
 [[package]]
 name = "link-cplusplus"
@@ -201,9 +201,9 @@
 
 [[package]]
 name = "miniz_oxide"
-version = "0.8.0"
+version = "0.8.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1"
+checksum = "4ffbe83022cedc1d264172192511ae958937694cd57ce297164951b8b3568394"
 dependencies = [
  "adler2",
 ]
@@ -260,9 +260,9 @@
 
 [[package]]
 name = "serde_json"
-version = "1.0.133"
+version = "1.0.134"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377"
+checksum = "d00f4175c42ee48b15416f6193a959ba3a0d67fc699a0db9ad12df9f83991c7d"
 dependencies = [
  "itoa",
  "memchr",
@@ -284,9 +284,9 @@
 
 [[package]]
 name = "syn"
-version = "2.0.90"
+version = "2.0.91"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31"
+checksum = "d53cbcb5a243bd33b7858b1d7f4aca2153490815872d86d955d6ea29f743c035"
 dependencies = [
  "proc-macro2",
  "quote",
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/Cargo.toml b/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/Cargo.toml
similarity index 98%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/Cargo.toml
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/Cargo.toml
index da5c8841..b756ff29 100644
--- a/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/Cargo.toml
+++ b/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/Cargo.toml
@@ -13,7 +13,7 @@
 edition = "2021"
 rust-version = "1.73"
 name = "cxxbridge-macro"
-version = "1.0.135"
+version = "1.0.136"
 authors = ["David Tolnay <dtolnay@gmail.com>"]
 build = false
 exclude = [
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/Cargo.toml.orig b/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/Cargo.toml.orig
similarity index 98%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/Cargo.toml.orig
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/Cargo.toml.orig
index 026219c..8169fb4 100644
--- a/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/Cargo.toml.orig
+++ b/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/Cargo.toml.orig
@@ -1,6 +1,6 @@
 [package]
 name = "cxxbridge-macro"
-version = "1.0.135"
+version = "1.0.136"
 authors = ["David Tolnay <dtolnay@gmail.com>"]
 categories = ["development-tools::ffi"]
 description = "Implementation detail of the `cxx` crate."
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/LICENSE-APACHE b/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/LICENSE-APACHE
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/LICENSE-APACHE
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/LICENSE-APACHE
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/LICENSE-MIT b/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/LICENSE-MIT
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/LICENSE-MIT
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/LICENSE-MIT
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/README.md b/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/README.md
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/README.md
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/README.md
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/clang.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/clang.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/clang.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/clang.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/derive.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/derive.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/derive.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/derive.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/expand.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/expand.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/expand.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/expand.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/generics.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/generics.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/generics.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/generics.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/lib.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/lib.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/lib.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/lib.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/load.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/load.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/load.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/load.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/atom.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/atom.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/atom.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/atom.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/attrs.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/attrs.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/attrs.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/attrs.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/cfg.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/cfg.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/cfg.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/cfg.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/check.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/check.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/check.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/check.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/derive.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/derive.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/derive.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/derive.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/discriminant.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/discriminant.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/discriminant.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/discriminant.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/doc.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/doc.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/doc.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/doc.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/error.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/error.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/error.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/error.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/file.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/file.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/file.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/file.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/ident.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/ident.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/ident.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/ident.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/impls.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/impls.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/impls.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/impls.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/improper.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/improper.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/improper.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/improper.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/instantiate.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/instantiate.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/instantiate.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/instantiate.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/mangle.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/mangle.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/mangle.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/mangle.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/map.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/map.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/map.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/map.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/mod.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/names.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/names.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/names.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/names.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/namespace.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/namespace.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/namespace.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/namespace.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/parse.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/parse.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/parse.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/parse.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/pod.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/pod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/pod.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/pod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/qualified.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/qualified.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/qualified.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/qualified.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/report.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/report.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/report.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/report.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/resolve.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/resolve.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/resolve.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/resolve.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/set.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/set.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/set.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/set.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/symbol.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/symbol.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/symbol.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/symbol.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/tokens.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/tokens.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/tokens.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/tokens.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/toposort.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/toposort.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/toposort.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/toposort.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/trivial.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/trivial.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/trivial.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/trivial.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/types.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/types.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/types.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/types.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/visit.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/visit.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/visit.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/visit.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/tokens.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/tokens.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/tokens.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/tokens.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/type_id.rs b/third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/type_id.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/type_id.rs
rename to third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/type_id.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/glob-0.3.1/.cargo_vcs_info.json b/third_party/rust/chromium_crates_io/vendor/glob-0.3.1/.cargo_vcs_info.json
deleted file mode 100644
index ddc0af5..0000000
--- a/third_party/rust/chromium_crates_io/vendor/glob-0.3.1/.cargo_vcs_info.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-  "git": {
-    "sha1": "408e579f74830c2073180a7e4e214a2677d38a49"
-  },
-  "path_in_vcs": ""
-}
\ No newline at end of file
diff --git a/third_party/rust/chromium_crates_io/vendor/glob-0.3.1/.github/workflows/rust.yml b/third_party/rust/chromium_crates_io/vendor/glob-0.3.1/.github/workflows/rust.yml
deleted file mode 100644
index f132f8ba..0000000
--- a/third_party/rust/chromium_crates_io/vendor/glob-0.3.1/.github/workflows/rust.yml
+++ /dev/null
@@ -1,35 +0,0 @@
-name: Continuous integration
-
-on:
-  pull_request:
-  push:
-    branches:
-      - master
-
-jobs:
-  os_tests:
-    name: "Tests / OS: ${{ matrix.os }} - ${{ matrix.channel }}"
-    runs-on: ${{ matrix.os }}
-    strategy:
-      matrix:
-        channel:
-        - stable
-        - beta
-        - nightly
-        - 1.23.0
-        os:
-        # FIXME: compiling with 1.23 on macOS 12 fails to linL
-        # archive member 'rust.metadata.bin' with length 40821 is not mach-o or llvm bitcode file
-        - macos-11
-        - windows-2022
-        - ubuntu-22.04
-
-    steps:
-    - name: Checkout repository
-      uses: actions/checkout@v3
-
-    - name: Update rust
-      run: rustup update ${{ matrix.channel }} --no-self-update
-
-    - name: Tests
-      run: cargo +${{ matrix.channel }} test --all
diff --git a/third_party/rust/chromium_crates_io/vendor/glob-0.3.1/.cargo-checksum.json b/third_party/rust/chromium_crates_io/vendor/glob-0.3.2/.cargo-checksum.json
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/glob-0.3.1/.cargo-checksum.json
rename to third_party/rust/chromium_crates_io/vendor/glob-0.3.2/.cargo-checksum.json
diff --git a/third_party/rust/chromium_crates_io/vendor/glob-0.3.2/.cargo_vcs_info.json b/third_party/rust/chromium_crates_io/vendor/glob-0.3.2/.cargo_vcs_info.json
new file mode 100644
index 0000000..abc42e85
--- /dev/null
+++ b/third_party/rust/chromium_crates_io/vendor/glob-0.3.2/.cargo_vcs_info.json
@@ -0,0 +1,6 @@
+{
+  "git": {
+    "sha1": "58d0748ead23616834871fe42dce475102f8d895"
+  },
+  "path_in_vcs": ""
+}
\ No newline at end of file
diff --git a/third_party/rust/chromium_crates_io/vendor/glob-0.3.2/.github/dependabot.yml b/third_party/rust/chromium_crates_io/vendor/glob-0.3.2/.github/dependabot.yml
new file mode 100644
index 0000000..de970703
--- /dev/null
+++ b/third_party/rust/chromium_crates_io/vendor/glob-0.3.2/.github/dependabot.yml
@@ -0,0 +1,13 @@
+version: 2
+updates:
+  - package-ecosystem: "cargo"
+    directory: "/"
+    schedule:
+      interval: "monthly"
+    open-pull-requests-limit: 10
+    ignore:
+      - dependency-name: "tempdir"
+  - package-ecosystem: "github-actions"
+    directory: "/"
+    schedule:
+      interval: "monthly"
diff --git a/third_party/rust/chromium_crates_io/vendor/glob-0.3.2/.github/workflows/publish.yml b/third_party/rust/chromium_crates_io/vendor/glob-0.3.2/.github/workflows/publish.yml
new file mode 100644
index 0000000..e715c618
--- /dev/null
+++ b/third_party/rust/chromium_crates_io/vendor/glob-0.3.2/.github/workflows/publish.yml
@@ -0,0 +1,27 @@
+name: Release-plz
+
+permissions:
+  pull-requests: write
+  contents: write
+
+on:
+  push:
+    branches:
+      - master
+
+jobs:
+  release-plz:
+    name: Release-plz
+    runs-on: ubuntu-latest
+    steps:
+      - name: Checkout repository
+        uses: actions/checkout@v4
+        with:
+          fetch-depth: 0
+      - name: Install Rust (rustup)
+        run: rustup update nightly --no-self-update && rustup default nightly
+      - name: Run release-plz
+        uses: MarcoIeni/release-plz-action@v0.5
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+          CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
diff --git a/third_party/rust/chromium_crates_io/vendor/glob-0.3.2/.github/workflows/rust.yml b/third_party/rust/chromium_crates_io/vendor/glob-0.3.2/.github/workflows/rust.yml
new file mode 100644
index 0000000..8f3901c1
--- /dev/null
+++ b/third_party/rust/chromium_crates_io/vendor/glob-0.3.2/.github/workflows/rust.yml
@@ -0,0 +1,65 @@
+name: CI
+
+on:
+  pull_request:
+  push:
+    branches:
+      - master
+
+jobs:
+  test:
+    name: Tests
+    runs-on: ${{ matrix.os }}
+    strategy:
+      matrix:
+        channel:
+          - stable
+          - nightly
+          - 1.63.0 # MSRV of test dependencies
+        os:
+          - macos-13 # x86 MacOS
+          - macos-15 # Arm MacOS
+          - windows-2025
+          - ubuntu-24.04
+        include:
+          - channel: beta
+            os: ubuntu-24.04
+
+    steps:
+    - name: Checkout repository
+      uses: actions/checkout@v4
+
+    - name: Update rust
+      run: |
+        rustup default ${{ matrix.channel }}
+        rustup update --no-self-update
+
+    - run: cargo test --all
+
+  msrv:
+    name: Check building with the MSRV
+    runs-on: ubuntu-24.04
+    steps:
+    - name: Checkout repository
+      uses: actions/checkout@v4
+
+    - name: Update rust
+      run: |
+        rustup default 1.23.0
+        rustup update --no-self-update
+
+    - run: cargo build
+
+  success:
+    needs:
+      - test
+      - msrv
+    runs-on: ubuntu-latest
+    # GitHub branch protection is exceedingly silly and treats "jobs skipped because a dependency
+    # failed" as success. So we have to do some contortions to ensure the job fails if any of its
+    # dependencies fails.
+    if: always() # make sure this is never "skipped"
+    steps:
+      # Manually check the status of all dependencies. `if: failure()` does not work.
+      - name: check if any dependency failed
+        run: jq --exit-status 'all(.result == "success")' <<< '${{ toJson(needs) }}'
diff --git a/third_party/rust/chromium_crates_io/vendor/glob-0.3.1/.gitignore b/third_party/rust/chromium_crates_io/vendor/glob-0.3.2/.gitignore
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/glob-0.3.1/.gitignore
rename to third_party/rust/chromium_crates_io/vendor/glob-0.3.2/.gitignore
diff --git a/third_party/rust/chromium_crates_io/vendor/glob-0.3.2/CHANGELOG.md b/third_party/rust/chromium_crates_io/vendor/glob-0.3.2/CHANGELOG.md
new file mode 100644
index 0000000..11d7f62f
--- /dev/null
+++ b/third_party/rust/chromium_crates_io/vendor/glob-0.3.2/CHANGELOG.md
@@ -0,0 +1,33 @@
+# Changelog
+
+All notable changes to this project will be documented in this file.
+
+## [Unreleased]
+
+## [0.3.2](https://github.com/rust-lang/glob/compare/v0.3.1...v0.3.2) - 2024-12-28
+
+## What's Changed
+* Add fs::symlink_metadata to detect broken symlinks by @kyoheiu in https://github.com/rust-lang/glob/pull/105
+* Add support for windows verbatim disk paths by @nico-abram in https://github.com/rust-lang/glob/pull/112
+* Respect `require_literal_leading_dot` option in `glob_with` method for path components by @JohnTitor in https://github.com/rust-lang/glob/pull/128
+* Harden tests for symlink by @JohnTitor in https://github.com/rust-lang/glob/pull/127
+* Remove "extern crate" directions from README by @zmitchell in https://github.com/rust-lang/glob/pull/131
+* Add FIXME for tempdir by @JohnTitor in https://github.com/rust-lang/glob/pull/126
+* Cache information about file type by @Kobzol in https://github.com/rust-lang/glob/pull/135
+* Document the behaviour of ** with files by @Wilfred in https://github.com/rust-lang/glob/pull/138
+* Add dependabot by @oriontvv in https://github.com/rust-lang/glob/pull/139
+* Bump actions/checkout from 3 to 4 by @dependabot in https://github.com/rust-lang/glob/pull/140
+* Check only (no longer test) at the MSRV by @tgross35 in https://github.com/rust-lang/glob/pull/151
+* Add release-plz for automated releases by @tgross35 in https://github.com/rust-lang/glob/pull/150
+
+## New Contributors
+* @kyoheiu made their first contribution in https://github.com/rust-lang/glob/pull/105
+* @nico-abram made their first contribution in https://github.com/rust-lang/glob/pull/112
+* @zmitchell made their first contribution in https://github.com/rust-lang/glob/pull/131
+* @Kobzol made their first contribution in https://github.com/rust-lang/glob/pull/135
+* @Wilfred made their first contribution in https://github.com/rust-lang/glob/pull/138
+* @oriontvv made their first contribution in https://github.com/rust-lang/glob/pull/139
+* @dependabot made their first contribution in https://github.com/rust-lang/glob/pull/140
+* @tgross35 made their first contribution in https://github.com/rust-lang/glob/pull/151
+
+**Full Changelog**: https://github.com/rust-lang/glob/compare/0.3.1...0.3.2
diff --git a/third_party/rust/chromium_crates_io/vendor/glob-0.3.2/Cargo.lock b/third_party/rust/chromium_crates_io/vendor/glob-0.3.2/Cargo.lock
new file mode 100644
index 0000000..d6a653b7
--- /dev/null
+++ b/third_party/rust/chromium_crates_io/vendor/glob-0.3.2/Cargo.lock
@@ -0,0 +1,107 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "doc-comment"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "fuchsia-cprng"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "glob"
+version = "0.3.2"
+dependencies = [
+ "doc-comment 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "libc"
+version = "0.2.169"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "rand"
+version = "0.4.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.169 (registry+https://github.com/rust-lang/crates.io-index)",
+ "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "rdrand"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "remove_dir_all"
+version = "0.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "tempdir"
+version = "0.3.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "remove_dir_all 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "winapi"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "winapi-i686-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "winapi-x86_64-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[metadata]
+"checksum doc-comment 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10"
+"checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba"
+"checksum libc 0.2.169 (registry+https://github.com/rust-lang/crates.io-index)" = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a"
+"checksum rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293"
+"checksum rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b"
+"checksum rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc"
+"checksum rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2"
+"checksum remove_dir_all 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7"
+"checksum tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "15f2b5fb00ccdf689e0149d1b1b3c03fead81c2b37735d812fa8bddbbf41b6d8"
+"checksum winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
+"checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
+"checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
diff --git a/third_party/rust/chromium_crates_io/vendor/glob-0.3.1/Cargo.toml b/third_party/rust/chromium_crates_io/vendor/glob-0.3.2/Cargo.toml
similarity index 79%
rename from third_party/rust/chromium_crates_io/vendor/glob-0.3.1/Cargo.toml
rename to third_party/rust/chromium_crates_io/vendor/glob-0.3.2/Cargo.toml
index 5397717..59393e1 100644
--- a/third_party/rust/chromium_crates_io/vendor/glob-0.3.1/Cargo.toml
+++ b/third_party/rust/chromium_crates_io/vendor/glob-0.3.2/Cargo.toml
@@ -10,9 +10,16 @@
 # See Cargo.toml.orig for the original contents.
 
 [package]
+rust-version = "1.23.0"
 name = "glob"
-version = "0.3.1"
+version = "0.3.2"
 authors = ["The Rust Project Developers"]
+build = false
+autolib = false
+autobins = false
+autoexamples = false
+autotests = false
+autobenches = false
 description = """
 Support for matching file paths against Unix shell style patterns.
 """
@@ -23,6 +30,14 @@
 license = "MIT OR Apache-2.0"
 repository = "https://github.com/rust-lang/glob"
 
+[lib]
+name = "glob"
+path = "src/lib.rs"
+
+[[test]]
+name = "glob-std"
+path = "tests/glob-std.rs"
+
 [dev-dependencies.doc-comment]
 version = "0.3"
 
diff --git a/third_party/rust/chromium_crates_io/vendor/glob-0.3.1/Cargo.toml.orig b/third_party/rust/chromium_crates_io/vendor/glob-0.3.2/Cargo.toml.orig
similarity index 82%
rename from third_party/rust/chromium_crates_io/vendor/glob-0.3.1/Cargo.toml.orig
rename to third_party/rust/chromium_crates_io/vendor/glob-0.3.2/Cargo.toml.orig
index ca7cdad..7eb57cc 100644
--- a/third_party/rust/chromium_crates_io/vendor/glob-0.3.1/Cargo.toml.orig
+++ b/third_party/rust/chromium_crates_io/vendor/glob-0.3.2/Cargo.toml.orig
@@ -1,7 +1,7 @@
 [package]
 
 name = "glob"
-version = "0.3.1"
+version = "0.3.2"
 authors = ["The Rust Project Developers"]
 license = "MIT OR Apache-2.0"
 homepage = "https://github.com/rust-lang/glob"
@@ -11,7 +11,9 @@
 Support for matching file paths against Unix shell style patterns.
 """
 categories = ["filesystem"]
+rust-version = "1.23.0"
 
 [dev-dependencies]
+# FIXME: This should be replaced by `tempfile`
 tempdir = "0.3"
 doc-comment = "0.3"
diff --git a/third_party/rust/chromium_crates_io/vendor/glob-0.3.1/LICENSE-APACHE b/third_party/rust/chromium_crates_io/vendor/glob-0.3.2/LICENSE-APACHE
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/glob-0.3.1/LICENSE-APACHE
rename to third_party/rust/chromium_crates_io/vendor/glob-0.3.2/LICENSE-APACHE
diff --git a/third_party/rust/chromium_crates_io/vendor/glob-0.3.1/LICENSE-MIT b/third_party/rust/chromium_crates_io/vendor/glob-0.3.2/LICENSE-MIT
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/glob-0.3.1/LICENSE-MIT
rename to third_party/rust/chromium_crates_io/vendor/glob-0.3.2/LICENSE-MIT
diff --git a/third_party/rust/chromium_crates_io/vendor/glob-0.3.1/README.md b/third_party/rust/chromium_crates_io/vendor/glob-0.3.2/README.md
similarity index 89%
rename from third_party/rust/chromium_crates_io/vendor/glob-0.3.1/README.md
rename to third_party/rust/chromium_crates_io/vendor/glob-0.3.2/README.md
index b68a40e4..36302eea 100644
--- a/third_party/rust/chromium_crates_io/vendor/glob-0.3.1/README.md
+++ b/third_party/rust/chromium_crates_io/vendor/glob-0.3.2/README.md
@@ -16,8 +16,7 @@
 glob = "0.3.1"
 ```
 
-And add this to your crate root:
-
+If you're using Rust 1.30 or earlier, or edition 2015, add this to your crate root:
 ```rust
 extern crate glob;
 ```
diff --git a/third_party/rust/chromium_crates_io/vendor/glob-0.3.1/src/lib.rs b/third_party/rust/chromium_crates_io/vendor/glob-0.3.2/src/lib.rs
similarity index 92%
rename from third_party/rust/chromium_crates_io/vendor/glob-0.3.1/src/lib.rs
rename to third_party/rust/chromium_crates_io/vendor/glob-0.3.2/src/lib.rs
index 744cabf..fef80908 100644
--- a/third_party/rust/chromium_crates_io/vendor/glob-0.3.1/src/lib.rs
+++ b/third_party/rust/chromium_crates_io/vendor/glob-0.3.2/src/lib.rs
@@ -73,7 +73,9 @@
 use std::error::Error;
 use std::fmt;
 use std::fs;
+use std::fs::DirEntry;
 use std::io;
+use std::ops::Deref;
 use std::path::{self, Component, Path, PathBuf};
 use std::str::FromStr;
 
@@ -96,8 +98,8 @@
     dir_patterns: Vec<Pattern>,
     require_dir: bool,
     options: MatchOptions,
-    todo: Vec<Result<(PathBuf, usize), GlobError>>,
-    scope: Option<PathBuf>,
+    todo: Vec<Result<(PathWrapper, usize), GlobError>>,
+    scope: Option<PathWrapper>,
 }
 
 /// Return an iterator that produces all the `Path`s that match the given
@@ -178,7 +180,15 @@
     #[cfg(windows)]
     fn check_windows_verbatim(p: &Path) -> bool {
         match p.components().next() {
-            Some(Component::Prefix(ref p)) => p.kind().is_verbatim(),
+            Some(Component::Prefix(ref p)) => {
+                // Allow VerbatimDisk paths. std canonicalize() generates them, and they work fine
+                p.kind().is_verbatim()
+                    && if let std::path::Prefix::VerbatimDisk(_) = p.kind() {
+                        false
+                    } else {
+                        true
+                    }
+            }
             _ => false,
         }
     }
@@ -234,6 +244,7 @@
     }
 
     let scope = root.map_or_else(|| PathBuf::from("."), to_scope);
+    let scope = PathWrapper::from_path(scope);
 
     let mut dir_patterns = Vec::new();
     let components =
@@ -315,8 +326,52 @@
     }
 }
 
-fn is_dir(p: &Path) -> bool {
-    fs::metadata(p).map(|m| m.is_dir()).unwrap_or(false)
+#[derive(Debug)]
+struct PathWrapper {
+    path: PathBuf,
+    is_directory: bool,
+}
+
+impl PathWrapper {
+    fn from_dir_entry(path: PathBuf, e: DirEntry) -> Self {
+        let is_directory = e
+            .file_type()
+            .ok()
+            .and_then(|file_type| {
+                // We need to use fs::metadata to resolve the actual path
+                // if it's a symlink.
+                if file_type.is_symlink() {
+                    None
+                } else {
+                    Some(file_type.is_dir())
+                }
+            })
+            .or_else(|| fs::metadata(&path).map(|m| m.is_dir()).ok())
+            .unwrap_or(false);
+        Self { path, is_directory }
+    }
+    fn from_path(path: PathBuf) -> Self {
+        let is_directory = fs::metadata(&path).map(|m| m.is_dir()).unwrap_or(false);
+        Self { path, is_directory }
+    }
+
+    fn into_path(self) -> PathBuf {
+        self.path
+    }
+}
+
+impl Deref for PathWrapper {
+    type Target = Path;
+
+    fn deref(&self) -> &Self::Target {
+        self.path.deref()
+    }
+}
+
+impl AsRef<Path> for PathWrapper {
+    fn as_ref(&self) -> &Path {
+        self.path.as_ref()
+    }
 }
 
 /// An alias for a glob iteration result.
@@ -355,10 +410,10 @@
             // idx -1: was already checked by fill_todo, maybe path was '.' or
             // '..' that we can't match here because of normalization.
             if idx == !0 as usize {
-                if self.require_dir && !is_dir(&path) {
+                if self.require_dir && !path.is_directory {
                     continue;
                 }
-                return Some(Ok(path));
+                return Some(Ok(path.into_path()));
             }
 
             if self.dir_patterns[idx].is_recursive {
@@ -371,7 +426,7 @@
                     next += 1;
                 }
 
-                if is_dir(&path) {
+                if path.is_directory {
                     // the path is a directory, so it's a match
 
                     // push this directory's contents
@@ -386,7 +441,7 @@
                     if next == self.dir_patterns.len() - 1 {
                         // pattern ends in recursive pattern, so return this
                         // directory as a result
-                        return Some(Ok(path));
+                        return Some(Ok(path.into_path()));
                     } else {
                         // advanced to the next pattern for this path
                         idx = next + 1;
@@ -419,8 +474,8 @@
                     // *AND* its children so we don't need to check the
                     // children
 
-                    if !self.require_dir || is_dir(&path) {
-                        return Some(Ok(path));
+                    if !self.require_dir || path.is_directory {
+                        return Some(Ok(path.into_path()));
                     }
                 } else {
                     fill_todo(
@@ -469,10 +524,14 @@
 ///
 /// - `*` matches any (possibly empty) sequence of characters.
 ///
-/// - `**` matches the current directory and arbitrary subdirectories. This
-///   sequence **must** form a single path component, so both `**a` and `b**`
-///   are invalid and will result in an error.  A sequence of more than two
-///   consecutive `*` characters is also invalid.
+/// - `**` matches the current directory and arbitrary
+///   subdirectories. To match files in arbitrary subdiretories, use
+///   `**/*`.
+///
+///   This sequence **must** form a single path component, so both
+///   `**a` and `b**` are invalid and will result in an error.  A
+///   sequence of more than two consecutive `*` characters is also
+///   invalid.
 ///
 /// - `[...]` matches any character inside the brackets.  Character sequences
 ///   can also specify ranges of characters, as ordered by Unicode, so e.g.
@@ -809,10 +868,10 @@
 // special-casing patterns to match `.` and `..`, and avoiding `readdir()`
 // calls when there are no metacharacters in the pattern.
 fn fill_todo(
-    todo: &mut Vec<Result<(PathBuf, usize), GlobError>>,
+    todo: &mut Vec<Result<(PathWrapper, usize), GlobError>>,
     patterns: &[Pattern],
     idx: usize,
-    path: &Path,
+    path: &PathWrapper,
     options: MatchOptions,
 ) {
     // convert a pattern that's just many Char(_) to a string
@@ -828,7 +887,7 @@
         Some(s)
     }
 
-    let add = |todo: &mut Vec<_>, next_path: PathBuf| {
+    let add = |todo: &mut Vec<_>, next_path: PathWrapper| {
         if idx + 1 == patterns.len() {
             // We know it's good, so don't make the iterator match this path
             // against the pattern again. In particular, it can't match
@@ -840,8 +899,8 @@
     };
 
     let pattern = &patterns[idx];
-    let is_dir = is_dir(path);
-    let curdir = path == Path::new(".");
+    let is_dir = path.is_directory;
+    let curdir = path.as_ref() == Path::new(".");
     match pattern_as_str(pattern) {
         Some(s) => {
             // This pattern component doesn't have any metacharacters, so we
@@ -855,7 +914,12 @@
             } else {
                 path.join(&s)
             };
-            if (special && is_dir) || (!special && fs::metadata(&next_path).is_ok()) {
+            let next_path = PathWrapper::from_path(next_path);
+            if (special && is_dir)
+                || (!special
+                    && (fs::metadata(&next_path).is_ok()
+                        || fs::symlink_metadata(&next_path).is_ok()))
+            {
                 add(todo, next_path);
             }
         }
@@ -863,17 +927,22 @@
             let dirs = fs::read_dir(path).and_then(|d| {
                 d.map(|e| {
                     e.map(|e| {
-                        if curdir {
+                        let path = if curdir {
                             PathBuf::from(e.path().file_name().unwrap())
                         } else {
                             e.path()
-                        }
+                        };
+                        PathWrapper::from_dir_entry(path, e)
                     })
                 })
                 .collect::<Result<Vec<_>, _>>()
             });
             match dirs {
                 Ok(mut children) => {
+                    if options.require_literal_leading_dot {
+                        children
+                            .retain(|x| !x.file_name().unwrap().to_str().unwrap().starts_with("."));
+                    }
                     children.sort_by(|p1, p2| p2.file_name().cmp(&p1.file_name()));
                     todo.extend(children.into_iter().map(|x| Ok((x, idx))));
 
@@ -885,7 +954,7 @@
                     if !pattern.tokens.is_empty() && pattern.tokens[0] == Char('.') {
                         for &special in &[".", ".."] {
                             if pattern.matches_with(special, options) {
-                                add(todo, path.join(special));
+                                add(todo, PathWrapper::from_path(path.join(special)));
                             }
                         }
                     }
@@ -1097,15 +1166,13 @@
             // check windows absolute paths with host/device components
             let root_with_device = current_dir()
                 .ok()
-                .and_then(|p| {
-                    match p.components().next().unwrap() {
-                        Component::Prefix(prefix_component) => {
-                            let path = Path::new(prefix_component.as_os_str());
-                            path.join("*");
-                            Some(path.to_path_buf())
-                        }
-                        _ => panic!("no prefix in this path"),
+                .and_then(|p| match p.components().next().unwrap() {
+                    Component::Prefix(prefix_component) => {
+                        let path = Path::new(prefix_component.as_os_str());
+                        path.join("*");
+                        Some(path.to_path_buf())
                     }
+                    _ => panic!("no prefix in this path"),
                 })
                 .unwrap();
             // FIXME (#9639): This needs to handle non-utf8 paths
diff --git a/third_party/rust/chromium_crates_io/vendor/glob-0.3.1/tests/glob-std.rs b/third_party/rust/chromium_crates_io/vendor/glob-0.3.2/tests/glob-std.rs
similarity index 77%
rename from third_party/rust/chromium_crates_io/vendor/glob-0.3.1/tests/glob-std.rs
rename to third_party/rust/chromium_crates_io/vendor/glob-0.3.2/tests/glob-std.rs
index 085eb6d..44664139 100644
--- a/third_party/rust/chromium_crates_io/vendor/glob-0.3.1/tests/glob-std.rs
+++ b/third_party/rust/chromium_crates_io/vendor/glob-0.3.2/tests/glob-std.rs
@@ -15,7 +15,7 @@
 extern crate glob;
 extern crate tempdir;
 
-use glob::glob;
+use glob::{glob, glob_with};
 use std::env;
 use std::fs;
 use std::path::PathBuf;
@@ -31,10 +31,40 @@
         }
     }
 
+    fn mk_symlink_file(original: &str, link: &str) {
+        #[cfg(unix)]
+        {
+            use std::os::unix::fs::symlink;
+            symlink(original, link).unwrap();
+        }
+        #[cfg(windows)]
+        {
+            use std::os::windows::fs::symlink_file;
+            symlink_file(original, link).unwrap();
+        }
+    }
+
+    fn mk_symlink_dir(original: &str, link: &str) {
+        #[cfg(unix)]
+        {
+            use std::os::unix::fs::symlink;
+            symlink(original, link).unwrap();
+        }
+        #[cfg(windows)]
+        {
+            use std::os::windows::fs::symlink_dir;
+            symlink_dir(original, link).unwrap();
+        }
+    }
+
     fn glob_vec(pattern: &str) -> Vec<PathBuf> {
         glob(pattern).unwrap().map(|r| r.unwrap()).collect()
     }
 
+    fn glob_with_vec(pattern: &str, options: glob::MatchOptions) -> Vec<PathBuf> {
+        glob_with(pattern, options).unwrap().map(|r| r.unwrap()).collect()
+    }
+
     let root = TempDir::new("glob-tests");
     let root = root.ok().expect("Should have created a temp directory");
     assert!(env::set_current_dir(root.path()).is_ok());
@@ -48,6 +78,10 @@
     mk_file("bbb", true);
     mk_file("bbb/specials", true);
     mk_file("bbb/specials/!", false);
+    // a valid symlink
+    mk_symlink_file("aaa/apple", "aaa/green_apple");
+    // a broken symlink
+    mk_symlink_file("aaa/setsuna", "aaa/kazusa");
 
     // windows does not allow `*` or `?` characters to exist in filenames
     if env::consts::FAMILY != "windows" {
@@ -78,6 +112,22 @@
     mk_file("r/three", true);
     mk_file("r/three/c.md", false);
 
+    mk_file("dirsym", true);
+    mk_symlink_dir(root.path().join("r").to_str().unwrap(), "dirsym/link");
+
+    assert_eq!(
+        glob_vec("dirsym/**/*.md"),
+        vec!(
+            PathBuf::from("dirsym/link/another/a.md"),
+            PathBuf::from("dirsym/link/current_dir.md"),
+            PathBuf::from("dirsym/link/one/a.md"),
+            PathBuf::from("dirsym/link/one/another/a.md"),
+            PathBuf::from("dirsym/link/one/another/deep/spelunking.md"),
+            PathBuf::from("dirsym/link/three/c.md"),
+            PathBuf::from("dirsym/link/two/b.md")
+        )
+    );
+
     // all recursive entities
     assert_eq!(
         glob_vec("r/**"),
@@ -91,6 +141,25 @@
         )
     );
 
+    // std-canonicalized windows verbatim disk paths should work
+    if env::consts::FAMILY == "windows" {
+        let r_verbatim = PathBuf::from("r").canonicalize().unwrap();
+        assert_eq!(
+            glob_vec(&format!("{}\\**", r_verbatim.display().to_string()))
+                .into_iter()
+                .map(|p| p.strip_prefix(&r_verbatim).unwrap().to_owned())
+                .collect::<Vec<_>>(),
+            vec!(
+                PathBuf::from("another"),
+                PathBuf::from("one"),
+                PathBuf::from("one\\another"),
+                PathBuf::from("one\\another\\deep"),
+                PathBuf::from("three"),
+                PathBuf::from("two")
+            )
+        );
+    }
+
     // collapse consecutive recursive patterns
     assert_eq!(
         glob_vec("r/**/**"),
@@ -223,8 +292,10 @@
         glob_vec("aaa/*"),
         vec!(
             PathBuf::from("aaa/apple"),
+            PathBuf::from("aaa/green_apple"),
+            PathBuf::from("aaa/kazusa"),
             PathBuf::from("aaa/orange"),
-            PathBuf::from("aaa/tomato")
+            PathBuf::from("aaa/tomato"),
         )
     );
 
@@ -232,6 +303,8 @@
         glob_vec("aaa/*a*"),
         vec!(
             PathBuf::from("aaa/apple"),
+            PathBuf::from("aaa/green_apple"),
+            PathBuf::from("aaa/kazusa"),
             PathBuf::from("aaa/orange"),
             PathBuf::from("aaa/tomato")
         )
@@ -262,6 +335,9 @@
 
     assert_eq!(glob_vec("aaa/tomato/tomato.txt/"), Vec::<PathBuf>::new());
 
+    // Ensure to find a broken symlink.
+    assert_eq!(glob_vec("aaa/kazusa"), vec!(PathBuf::from("aaa/kazusa")));
+
     assert_eq!(glob_vec("aa[a]"), vec!(PathBuf::from("aaa")));
     assert_eq!(glob_vec("aa[abc]"), vec!(PathBuf::from("aaa")));
     assert_eq!(glob_vec("a[bca]a"), vec!(PathBuf::from("aaa")));
@@ -288,6 +364,27 @@
         vec!(PathBuf::from("bbb/specials/]"))
     );
 
+    mk_file("i", true);
+    mk_file("i/qwe", true);
+    mk_file("i/qwe/.aaa", false);
+    mk_file("i/qwe/.bbb", true);
+    mk_file("i/qwe/.bbb/ccc", false);
+    mk_file("i/qwe/.bbb/.ddd", false);
+    mk_file("i/qwe/eee", false);
+
+    let options = glob::MatchOptions {
+        case_sensitive: false,
+        require_literal_separator: true,
+        require_literal_leading_dot: true,
+    };
+    assert_eq!(glob_with_vec("i/**/*a*", options), Vec::<PathBuf>::new());
+    assert_eq!(glob_with_vec("i/**/*c*", options), Vec::<PathBuf>::new());
+    assert_eq!(glob_with_vec("i/**/*d*", options), Vec::<PathBuf>::new());
+    assert_eq!(
+        glob_with_vec("i/**/*e*", options),
+        vec!(PathBuf::from("i/qwe"), PathBuf::from("i/qwe/eee"))
+    );
+
     if env::consts::FAMILY != "windows" {
         assert_eq!(
             glob_vec("bbb/specials/[*]"),
diff --git a/third_party/rust/chromium_crates_io/vendor/glob-0.3.1/triagebot.toml b/third_party/rust/chromium_crates_io/vendor/glob-0.3.2/triagebot.toml
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/glob-0.3.1/triagebot.toml
rename to third_party/rust/chromium_crates_io/vendor/glob-0.3.2/triagebot.toml
diff --git a/third_party/rust/chromium_crates_io/vendor/quote-1.0.37/.cargo_vcs_info.json b/third_party/rust/chromium_crates_io/vendor/quote-1.0.37/.cargo_vcs_info.json
deleted file mode 100644
index 897caad..0000000
--- a/third_party/rust/chromium_crates_io/vendor/quote-1.0.37/.cargo_vcs_info.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-  "git": {
-    "sha1": "b1ebffa035363a430862e033aa3268e8cb17affa"
-  },
-  "path_in_vcs": ""
-}
\ No newline at end of file
diff --git a/third_party/rust/chromium_crates_io/vendor/quote-1.0.37/.cargo-checksum.json b/third_party/rust/chromium_crates_io/vendor/quote-1.0.38/.cargo-checksum.json
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/quote-1.0.37/.cargo-checksum.json
rename to third_party/rust/chromium_crates_io/vendor/quote-1.0.38/.cargo-checksum.json
diff --git a/third_party/rust/chromium_crates_io/vendor/quote-1.0.38/.cargo_vcs_info.json b/third_party/rust/chromium_crates_io/vendor/quote-1.0.38/.cargo_vcs_info.json
new file mode 100644
index 0000000..4c1adc3
--- /dev/null
+++ b/third_party/rust/chromium_crates_io/vendor/quote-1.0.38/.cargo_vcs_info.json
@@ -0,0 +1,6 @@
+{
+  "git": {
+    "sha1": "0245506323a3616daa2ee41c6ad0b871e4d78ae4"
+  },
+  "path_in_vcs": ""
+}
\ No newline at end of file
diff --git a/third_party/rust/chromium_crates_io/vendor/quote-1.0.37/.github/FUNDING.yml b/third_party/rust/chromium_crates_io/vendor/quote-1.0.38/.github/FUNDING.yml
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/quote-1.0.37/.github/FUNDING.yml
rename to third_party/rust/chromium_crates_io/vendor/quote-1.0.38/.github/FUNDING.yml
diff --git a/third_party/rust/chromium_crates_io/vendor/quote-1.0.37/.github/workflows/ci.yml b/third_party/rust/chromium_crates_io/vendor/quote-1.0.38/.github/workflows/ci.yml
similarity index 92%
rename from third_party/rust/chromium_crates_io/vendor/quote-1.0.37/.github/workflows/ci.yml
rename to third_party/rust/chromium_crates_io/vendor/quote-1.0.38/.github/workflows/ci.yml
index 7bc6003..189f230 100644
--- a/third_party/rust/chromium_crates_io/vendor/quote-1.0.37/.github/workflows/ci.yml
+++ b/third_party/rust/chromium_crates_io/vendor/quote-1.0.38/.github/workflows/ci.yml
@@ -37,6 +37,12 @@
         if: matrix.rust == 'nightly'
       - run: cargo test
       - run: cargo run --manifest-path benches/Cargo.toml
+      - uses: actions/upload-artifact@v4
+        if: matrix.rust == 'nightly' && always()
+        with:
+          name: Cargo.lock
+          path: Cargo.lock
+        continue-on-error: true
 
   minimal:
     name: Minimal versions
diff --git a/third_party/rust/chromium_crates_io/vendor/quote-1.0.37/.gitignore b/third_party/rust/chromium_crates_io/vendor/quote-1.0.38/.gitignore
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/quote-1.0.37/.gitignore
rename to third_party/rust/chromium_crates_io/vendor/quote-1.0.38/.gitignore
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/Cargo.lock b/third_party/rust/chromium_crates_io/vendor/quote-1.0.38/Cargo.lock
similarity index 64%
copy from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/Cargo.lock
copy to third_party/rust/chromium_crates_io/vendor/quote-1.0.38/Cargo.lock
index 2c027a08..51c0aae 100644
--- a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/Cargo.lock
+++ b/third_party/rust/chromium_crates_io/vendor/quote-1.0.38/Cargo.lock
@@ -3,137 +3,6 @@
 version = 3
 
 [[package]]
-name = "anstyle"
-version = "1.0.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9"
-
-[[package]]
-name = "cc"
-version = "1.2.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9157bbaa6b165880c27a4293a474c91cdcf265cc68cc829bf10be0964a391caf"
-dependencies = [
- "shlex",
-]
-
-[[package]]
-name = "clap"
-version = "4.5.23"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3135e7ec2ef7b10c6ed8950f0f792ed96ee093fa088608f1c76e569722700c84"
-dependencies = [
- "clap_builder",
-]
-
-[[package]]
-name = "clap_builder"
-version = "4.5.23"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "30582fc632330df2bd26877bde0c1f4470d57c582bbc070376afcd04d8cb4838"
-dependencies = [
- "anstyle",
- "clap_lex",
- "strsim",
-]
-
-[[package]]
-name = "clap_lex"
-version = "0.7.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6"
-
-[[package]]
-name = "codespan-reporting"
-version = "0.11.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e"
-dependencies = [
- "termcolor",
- "unicode-width",
-]
-
-[[package]]
-name = "cxx"
-version = "1.0.135"
-dependencies = [
- "cc",
- "cxx-build",
- "cxx-gen",
- "cxx-test-suite",
- "cxxbridge-cmd",
- "cxxbridge-flags",
- "cxxbridge-macro",
- "foldhash",
- "link-cplusplus",
- "rustversion",
- "trybuild",
-]
-
-[[package]]
-name = "cxx-build"
-version = "1.0.135"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "66fd8f17ad454fc1e4f4ab83abffcc88a532e90350d3ffddcb73030220fcbd52"
-dependencies = [
- "cc",
- "codespan-reporting",
- "proc-macro2",
- "quote",
- "scratch",
- "syn",
-]
-
-[[package]]
-name = "cxx-gen"
-version = "0.7.135"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3c62d12c58e0fd31869500860618d5ae274464b06cade32dc45f3fbf41c73721"
-dependencies = [
- "codespan-reporting",
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "cxx-test-suite"
-version = "0.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "54b17bb6fdd4579f6b0ad0becada9b2692ad19dd6f42ec314f0f0411bc226ede"
-
-[[package]]
-name = "cxxbridge-cmd"
-version = "1.0.135"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4717c9c806a9e07fdcb34c84965a414ea40fafe57667187052cf1eb7f5e8a8a9"
-dependencies = [
- "clap",
- "codespan-reporting",
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "cxxbridge-flags"
-version = "1.0.135"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2f6515329bf3d98f4073101c7866ff2bec4e635a13acb82e3f3753fff0bf43cb"
-
-[[package]]
-name = "cxxbridge-macro"
-version = "1.0.135"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fb93e6a7ce8ec985c02bbb758237a31598b340acbbc3c19c5a4fa6adaaac92ab"
-dependencies = [
- "proc-macro2",
- "quote",
- "rustversion",
- "syn",
-]
-
-[[package]]
 name = "dissimilar"
 version = "1.0.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -146,12 +15,6 @@
 checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
 
 [[package]]
-name = "foldhash"
-version = "0.1.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f81ec6369c545a7d40e4589b5597581fa1c441fe1cce96dd1de43159910a36a2"
-
-[[package]]
 name = "glob"
 version = "0.3.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -180,15 +43,6 @@
 checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674"
 
 [[package]]
-name = "link-cplusplus"
-version = "1.0.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9d240c6f7e1ba3a28b0249f774e6a9dd0175054b52dfbb61b16eb8505c3785c9"
-dependencies = [
- "cc",
-]
-
-[[package]]
 name = "memchr"
 version = "2.7.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -213,6 +67,15 @@
 ]
 
 [[package]]
+name = "quote"
+version = "1.0.38"
+dependencies = [
+ "proc-macro2",
+ "rustversion",
+ "trybuild",
+]
+
+[[package]]
 name = "rustversion"
 version = "1.0.18"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -225,12 +88,6 @@
 checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f"
 
 [[package]]
-name = "scratch"
-version = "1.0.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a3cf7c11c38cb994f3d40e8a8cde3bbd1f72a435e4c49e85d6553d8312306152"
-
-[[package]]
 name = "serde"
 version = "1.0.216"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -246,15 +103,15 @@
 checksum = "46f859dbbf73865c6627ed570e78961cd3ac92407a2d117204c49232485da55e"
 dependencies = [
  "proc-macro2",
- "quote",
+ "quote 1.0.37",
  "syn",
 ]
 
 [[package]]
 name = "serde_json"
-version = "1.0.133"
+version = "1.0.134"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377"
+checksum = "d00f4175c42ee48b15416f6193a959ba3a0d67fc699a0db9ad12df9f83991c7d"
 dependencies = [
  "itoa",
  "memchr",
@@ -272,25 +129,13 @@
 ]
 
 [[package]]
-name = "shlex"
-version = "1.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
-
-[[package]]
-name = "strsim"
-version = "0.11.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
-
-[[package]]
 name = "syn"
-version = "2.0.90"
+version = "2.0.91"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31"
+checksum = "d53cbcb5a243bd33b7858b1d7f4aca2153490815872d86d955d6ea29f743c035"
 dependencies = [
  "proc-macro2",
- "quote",
+ "quote 1.0.37",
  "unicode-ident",
 ]
 
@@ -366,12 +211,6 @@
 checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83"
 
 [[package]]
-name = "unicode-width"
-version = "0.1.14"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af"
-
-[[package]]
 name = "winapi-util"
 version = "0.1.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
diff --git a/third_party/rust/chromium_crates_io/vendor/quote-1.0.37/Cargo.toml b/third_party/rust/chromium_crates_io/vendor/quote-1.0.38/Cargo.toml
similarity index 97%
rename from third_party/rust/chromium_crates_io/vendor/quote-1.0.37/Cargo.toml
rename to third_party/rust/chromium_crates_io/vendor/quote-1.0.38/Cargo.toml
index af97fc7..d0a3856 100644
--- a/third_party/rust/chromium_crates_io/vendor/quote-1.0.37/Cargo.toml
+++ b/third_party/rust/chromium_crates_io/vendor/quote-1.0.38/Cargo.toml
@@ -13,9 +13,10 @@
 edition = "2018"
 rust-version = "1.56"
 name = "quote"
-version = "1.0.37"
+version = "1.0.38"
 authors = ["David Tolnay <dtolnay@gmail.com>"]
 build = false
+autolib = false
 autobins = false
 autoexamples = false
 autotests = false
@@ -35,6 +36,10 @@
 rustdoc-args = ["--generate-link-to-definition"]
 targets = ["x86_64-unknown-linux-gnu"]
 
+[features]
+default = ["proc-macro"]
+proc-macro = ["proc-macro2/proc-macro"]
+
 [lib]
 name = "quote"
 path = "src/lib.rs"
@@ -58,7 +63,3 @@
 [dev-dependencies.trybuild]
 version = "1.0.66"
 features = ["diff"]
-
-[features]
-default = ["proc-macro"]
-proc-macro = ["proc-macro2/proc-macro"]
diff --git a/third_party/rust/chromium_crates_io/vendor/quote-1.0.37/Cargo.toml.orig b/third_party/rust/chromium_crates_io/vendor/quote-1.0.38/Cargo.toml.orig
similarity index 97%
rename from third_party/rust/chromium_crates_io/vendor/quote-1.0.37/Cargo.toml.orig
rename to third_party/rust/chromium_crates_io/vendor/quote-1.0.38/Cargo.toml.orig
index 4e2f0e45..ee8df66 100644
--- a/third_party/rust/chromium_crates_io/vendor/quote-1.0.37/Cargo.toml.orig
+++ b/third_party/rust/chromium_crates_io/vendor/quote-1.0.38/Cargo.toml.orig
@@ -1,6 +1,6 @@
 [package]
 name = "quote"
-version = "1.0.37"
+version = "1.0.38"
 authors = ["David Tolnay <dtolnay@gmail.com>"]
 autobenches = false
 categories = ["development-tools::procedural-macro-helpers"]
diff --git a/third_party/rust/chromium_crates_io/vendor/quote-1.0.37/LICENSE-APACHE b/third_party/rust/chromium_crates_io/vendor/quote-1.0.38/LICENSE-APACHE
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/quote-1.0.37/LICENSE-APACHE
rename to third_party/rust/chromium_crates_io/vendor/quote-1.0.38/LICENSE-APACHE
diff --git a/third_party/rust/chromium_crates_io/vendor/quote-1.0.37/LICENSE-MIT b/third_party/rust/chromium_crates_io/vendor/quote-1.0.38/LICENSE-MIT
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/quote-1.0.37/LICENSE-MIT
rename to third_party/rust/chromium_crates_io/vendor/quote-1.0.38/LICENSE-MIT
diff --git a/third_party/rust/chromium_crates_io/vendor/quote-1.0.37/README.md b/third_party/rust/chromium_crates_io/vendor/quote-1.0.38/README.md
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/quote-1.0.37/README.md
rename to third_party/rust/chromium_crates_io/vendor/quote-1.0.38/README.md
diff --git a/third_party/rust/chromium_crates_io/vendor/quote-1.0.37/rust-toolchain.toml b/third_party/rust/chromium_crates_io/vendor/quote-1.0.38/rust-toolchain.toml
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/quote-1.0.37/rust-toolchain.toml
rename to third_party/rust/chromium_crates_io/vendor/quote-1.0.38/rust-toolchain.toml
diff --git a/third_party/rust/chromium_crates_io/vendor/quote-1.0.37/src/ext.rs b/third_party/rust/chromium_crates_io/vendor/quote-1.0.38/src/ext.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/quote-1.0.37/src/ext.rs
rename to third_party/rust/chromium_crates_io/vendor/quote-1.0.38/src/ext.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/quote-1.0.37/src/format.rs b/third_party/rust/chromium_crates_io/vendor/quote-1.0.38/src/format.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/quote-1.0.37/src/format.rs
rename to third_party/rust/chromium_crates_io/vendor/quote-1.0.38/src/format.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/quote-1.0.37/src/ident_fragment.rs b/third_party/rust/chromium_crates_io/vendor/quote-1.0.38/src/ident_fragment.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/quote-1.0.37/src/ident_fragment.rs
rename to third_party/rust/chromium_crates_io/vendor/quote-1.0.38/src/ident_fragment.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/quote-1.0.37/src/lib.rs b/third_party/rust/chromium_crates_io/vendor/quote-1.0.38/src/lib.rs
similarity index 99%
rename from third_party/rust/chromium_crates_io/vendor/quote-1.0.37/src/lib.rs
rename to third_party/rust/chromium_crates_io/vendor/quote-1.0.38/src/lib.rs
index 2c72da2..3fa8f871 100644
--- a/third_party/rust/chromium_crates_io/vendor/quote-1.0.37/src/lib.rs
+++ b/third_party/rust/chromium_crates_io/vendor/quote-1.0.38/src/lib.rs
@@ -92,12 +92,13 @@
 //! [prettyplease]: https://github.com/dtolnay/prettyplease
 
 // Quote types in rustdoc of other crates get linked to here.
-#![doc(html_root_url = "https://docs.rs/quote/1.0.37")]
+#![doc(html_root_url = "https://docs.rs/quote/1.0.38")]
 #![allow(
     clippy::doc_markdown,
     clippy::missing_errors_doc,
     clippy::missing_panics_doc,
     clippy::module_name_repetitions,
+    clippy::needless_lifetimes,
     // false positive https://github.com/rust-lang/rust-clippy/issues/6983
     clippy::wrong_self_convention,
 )]
diff --git a/third_party/rust/chromium_crates_io/vendor/quote-1.0.37/src/runtime.rs b/third_party/rust/chromium_crates_io/vendor/quote-1.0.38/src/runtime.rs
similarity index 97%
rename from third_party/rust/chromium_crates_io/vendor/quote-1.0.37/src/runtime.rs
rename to third_party/rust/chromium_crates_io/vendor/quote-1.0.38/src/runtime.rs
index eff044a..4923ccbd 100644
--- a/third_party/rust/chromium_crates_io/vendor/quote-1.0.37/src/runtime.rs
+++ b/third_party/rust/chromium_crates_io/vendor/quote-1.0.38/src/runtime.rs
@@ -102,7 +102,7 @@
         fn quote_into_iter(&'q self) -> (Self::Iter, HasIter);
     }
 
-    impl<'q, 'a, T: RepAsIteratorExt<'q> + ?Sized> RepAsIteratorExt<'q> for &'a T {
+    impl<'q, T: RepAsIteratorExt<'q> + ?Sized> RepAsIteratorExt<'q> for &T {
         type Iter = T::Iter;
 
         fn quote_into_iter(&'q self) -> (Self::Iter, HasIter) {
@@ -110,7 +110,7 @@
         }
     }
 
-    impl<'q, 'a, T: RepAsIteratorExt<'q> + ?Sized> RepAsIteratorExt<'q> for &'a mut T {
+    impl<'q, T: RepAsIteratorExt<'q> + ?Sized> RepAsIteratorExt<'q> for &mut T {
         type Iter = T::Iter;
 
         fn quote_into_iter(&'q self) -> (Self::Iter, HasIter) {
@@ -126,6 +126,14 @@
         }
     }
 
+    impl<'q, T: 'q, const N: usize> RepAsIteratorExt<'q> for [T; N] {
+        type Iter = slice::Iter<'q, T>;
+
+        fn quote_into_iter(&'q self) -> (Self::Iter, HasIter) {
+            (self.iter(), HasIter)
+        }
+    }
+
     impl<'q, T: 'q> RepAsIteratorExt<'q> for Vec<T> {
         type Iter = slice::Iter<'q, T>;
 
diff --git a/third_party/rust/chromium_crates_io/vendor/quote-1.0.37/src/spanned.rs b/third_party/rust/chromium_crates_io/vendor/quote-1.0.38/src/spanned.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/quote-1.0.37/src/spanned.rs
rename to third_party/rust/chromium_crates_io/vendor/quote-1.0.38/src/spanned.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/quote-1.0.37/src/to_tokens.rs b/third_party/rust/chromium_crates_io/vendor/quote-1.0.38/src/to_tokens.rs
similarity index 98%
rename from third_party/rust/chromium_crates_io/vendor/quote-1.0.37/src/to_tokens.rs
rename to third_party/rust/chromium_crates_io/vendor/quote-1.0.38/src/to_tokens.rs
index 2bcb961..0fbbe2202 100644
--- a/third_party/rust/chromium_crates_io/vendor/quote-1.0.37/src/to_tokens.rs
+++ b/third_party/rust/chromium_crates_io/vendor/quote-1.0.38/src/to_tokens.rs
@@ -75,13 +75,13 @@
     }
 }
 
-impl<'a, T: ?Sized + ToTokens> ToTokens for &'a T {
+impl<T: ?Sized + ToTokens> ToTokens for &T {
     fn to_tokens(&self, tokens: &mut TokenStream) {
         (**self).to_tokens(tokens);
     }
 }
 
-impl<'a, T: ?Sized + ToTokens> ToTokens for &'a mut T {
+impl<T: ?Sized + ToTokens> ToTokens for &mut T {
     fn to_tokens(&self, tokens: &mut TokenStream) {
         (**self).to_tokens(tokens);
     }
diff --git a/third_party/rust/chromium_crates_io/vendor/quote-1.0.37/tests/compiletest.rs b/third_party/rust/chromium_crates_io/vendor/quote-1.0.38/tests/compiletest.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/quote-1.0.37/tests/compiletest.rs
rename to third_party/rust/chromium_crates_io/vendor/quote-1.0.38/tests/compiletest.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/quote-1.0.37/tests/test.rs b/third_party/rust/chromium_crates_io/vendor/quote-1.0.38/tests/test.rs
similarity index 99%
rename from third_party/rust/chromium_crates_io/vendor/quote-1.0.37/tests/test.rs
rename to third_party/rust/chromium_crates_io/vendor/quote-1.0.38/tests/test.rs
index 6ff1402..bf4fb88 100644
--- a/third_party/rust/chromium_crates_io/vendor/quote-1.0.37/tests/test.rs
+++ b/third_party/rust/chromium_crates_io/vendor/quote-1.0.38/tests/test.rs
@@ -105,6 +105,9 @@
 
     let ref_slice: &[X] = &[X, X];
     let _ = quote!(#(#ref_slice #ref_slice)*);
+
+    let array_of_array: [[u8; 2]; 2] = [[0; 2]; 2];
+    let _ = quote!(#(#(#array_of_array)*)*);
 }
 
 #[test]
diff --git a/third_party/rust/chromium_crates_io/vendor/quote-1.0.37/tests/ui/does-not-have-iter-interpolated-dup.rs b/third_party/rust/chromium_crates_io/vendor/quote-1.0.38/tests/ui/does-not-have-iter-interpolated-dup.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/quote-1.0.37/tests/ui/does-not-have-iter-interpolated-dup.rs
rename to third_party/rust/chromium_crates_io/vendor/quote-1.0.38/tests/ui/does-not-have-iter-interpolated-dup.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/quote-1.0.37/tests/ui/does-not-have-iter-interpolated-dup.stderr b/third_party/rust/chromium_crates_io/vendor/quote-1.0.38/tests/ui/does-not-have-iter-interpolated-dup.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/quote-1.0.37/tests/ui/does-not-have-iter-interpolated-dup.stderr
rename to third_party/rust/chromium_crates_io/vendor/quote-1.0.38/tests/ui/does-not-have-iter-interpolated-dup.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/quote-1.0.37/tests/ui/does-not-have-iter-interpolated.rs b/third_party/rust/chromium_crates_io/vendor/quote-1.0.38/tests/ui/does-not-have-iter-interpolated.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/quote-1.0.37/tests/ui/does-not-have-iter-interpolated.rs
rename to third_party/rust/chromium_crates_io/vendor/quote-1.0.38/tests/ui/does-not-have-iter-interpolated.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/quote-1.0.37/tests/ui/does-not-have-iter-interpolated.stderr b/third_party/rust/chromium_crates_io/vendor/quote-1.0.38/tests/ui/does-not-have-iter-interpolated.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/quote-1.0.37/tests/ui/does-not-have-iter-interpolated.stderr
rename to third_party/rust/chromium_crates_io/vendor/quote-1.0.38/tests/ui/does-not-have-iter-interpolated.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/quote-1.0.37/tests/ui/does-not-have-iter-separated.rs b/third_party/rust/chromium_crates_io/vendor/quote-1.0.38/tests/ui/does-not-have-iter-separated.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/quote-1.0.37/tests/ui/does-not-have-iter-separated.rs
rename to third_party/rust/chromium_crates_io/vendor/quote-1.0.38/tests/ui/does-not-have-iter-separated.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/quote-1.0.37/tests/ui/does-not-have-iter-separated.stderr b/third_party/rust/chromium_crates_io/vendor/quote-1.0.38/tests/ui/does-not-have-iter-separated.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/quote-1.0.37/tests/ui/does-not-have-iter-separated.stderr
rename to third_party/rust/chromium_crates_io/vendor/quote-1.0.38/tests/ui/does-not-have-iter-separated.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/quote-1.0.37/tests/ui/does-not-have-iter.rs b/third_party/rust/chromium_crates_io/vendor/quote-1.0.38/tests/ui/does-not-have-iter.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/quote-1.0.37/tests/ui/does-not-have-iter.rs
rename to third_party/rust/chromium_crates_io/vendor/quote-1.0.38/tests/ui/does-not-have-iter.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/quote-1.0.37/tests/ui/does-not-have-iter.stderr b/third_party/rust/chromium_crates_io/vendor/quote-1.0.38/tests/ui/does-not-have-iter.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/quote-1.0.37/tests/ui/does-not-have-iter.stderr
rename to third_party/rust/chromium_crates_io/vendor/quote-1.0.38/tests/ui/does-not-have-iter.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/quote-1.0.37/tests/ui/not-quotable.rs b/third_party/rust/chromium_crates_io/vendor/quote-1.0.38/tests/ui/not-quotable.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/quote-1.0.37/tests/ui/not-quotable.rs
rename to third_party/rust/chromium_crates_io/vendor/quote-1.0.38/tests/ui/not-quotable.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/quote-1.0.37/tests/ui/not-quotable.stderr b/third_party/rust/chromium_crates_io/vendor/quote-1.0.38/tests/ui/not-quotable.stderr
similarity index 93%
rename from third_party/rust/chromium_crates_io/vendor/quote-1.0.37/tests/ui/not-quotable.stderr
rename to third_party/rust/chromium_crates_io/vendor/quote-1.0.38/tests/ui/not-quotable.stderr
index 3196266..15492463 100644
--- a/third_party/rust/chromium_crates_io/vendor/quote-1.0.37/tests/ui/not-quotable.stderr
+++ b/third_party/rust/chromium_crates_io/vendor/quote-1.0.38/tests/ui/not-quotable.stderr
@@ -8,8 +8,8 @@
   |             required by a bound introduced by this call
   |
   = help: the following other types implement trait `ToTokens`:
-            &'a T
-            &'a mut T
+            &T
+            &mut T
             Box<T>
             CStr
             CString
diff --git a/third_party/rust/chromium_crates_io/vendor/quote-1.0.37/tests/ui/not-repeatable.rs b/third_party/rust/chromium_crates_io/vendor/quote-1.0.38/tests/ui/not-repeatable.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/quote-1.0.37/tests/ui/not-repeatable.rs
rename to third_party/rust/chromium_crates_io/vendor/quote-1.0.38/tests/ui/not-repeatable.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/quote-1.0.37/tests/ui/not-repeatable.stderr b/third_party/rust/chromium_crates_io/vendor/quote-1.0.38/tests/ui/not-repeatable.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/quote-1.0.37/tests/ui/not-repeatable.stderr
rename to third_party/rust/chromium_crates_io/vendor/quote-1.0.38/tests/ui/not-repeatable.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/quote-1.0.37/tests/ui/wrong-type-span.rs b/third_party/rust/chromium_crates_io/vendor/quote-1.0.38/tests/ui/wrong-type-span.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/quote-1.0.37/tests/ui/wrong-type-span.rs
rename to third_party/rust/chromium_crates_io/vendor/quote-1.0.38/tests/ui/wrong-type-span.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/quote-1.0.37/tests/ui/wrong-type-span.stderr b/third_party/rust/chromium_crates_io/vendor/quote-1.0.38/tests/ui/wrong-type-span.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/quote-1.0.37/tests/ui/wrong-type-span.stderr
rename to third_party/rust/chromium_crates_io/vendor/quote-1.0.38/tests/ui/wrong-type-span.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/.cargo_vcs_info.json b/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/.cargo_vcs_info.json
deleted file mode 100644
index b243a44b..0000000
--- a/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/.cargo_vcs_info.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-  "git": {
-    "sha1": "04f18461f03f7586b32238529b3e6c4731e63db5"
-  },
-  "path_in_vcs": ""
-}
\ No newline at end of file
diff --git a/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/.cargo-checksum.json b/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/.cargo-checksum.json
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/.cargo-checksum.json
rename to third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/.cargo-checksum.json
diff --git a/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/.cargo_vcs_info.json b/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/.cargo_vcs_info.json
new file mode 100644
index 0000000..e84553b
--- /dev/null
+++ b/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/.cargo_vcs_info.json
@@ -0,0 +1,6 @@
+{
+  "git": {
+    "sha1": "9ef9df29942a4ef9f6e45579da07efcaadb16f29"
+  },
+  "path_in_vcs": ""
+}
\ No newline at end of file
diff --git a/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/.github/FUNDING.yml b/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/.github/FUNDING.yml
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/.github/FUNDING.yml
rename to third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/.github/FUNDING.yml
diff --git a/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/.github/workflows/ci.yml b/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/.github/workflows/ci.yml
similarity index 98%
rename from third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/.github/workflows/ci.yml
rename to third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/.github/workflows/ci.yml
index 0e4be82..62700d25 100644
--- a/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/.github/workflows/ci.yml
+++ b/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/.github/workflows/ci.yml
@@ -40,6 +40,7 @@
         with:
           name: Cargo.lock
           path: Cargo.lock
+        continue-on-error: true
 
   windows:
     name: Windows
diff --git a/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/.gitignore b/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/.gitignore
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/.gitignore
rename to third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/.gitignore
diff --git a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/Cargo.lock b/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/Cargo.lock
similarity index 61%
copy from third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/Cargo.lock
copy to third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/Cargo.lock
index 2c027a08..04eccb3 100644
--- a/third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/Cargo.lock
+++ b/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/Cargo.lock
@@ -3,137 +3,6 @@
 version = 3
 
 [[package]]
-name = "anstyle"
-version = "1.0.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9"
-
-[[package]]
-name = "cc"
-version = "1.2.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9157bbaa6b165880c27a4293a474c91cdcf265cc68cc829bf10be0964a391caf"
-dependencies = [
- "shlex",
-]
-
-[[package]]
-name = "clap"
-version = "4.5.23"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3135e7ec2ef7b10c6ed8950f0f792ed96ee093fa088608f1c76e569722700c84"
-dependencies = [
- "clap_builder",
-]
-
-[[package]]
-name = "clap_builder"
-version = "4.5.23"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "30582fc632330df2bd26877bde0c1f4470d57c582bbc070376afcd04d8cb4838"
-dependencies = [
- "anstyle",
- "clap_lex",
- "strsim",
-]
-
-[[package]]
-name = "clap_lex"
-version = "0.7.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6"
-
-[[package]]
-name = "codespan-reporting"
-version = "0.11.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e"
-dependencies = [
- "termcolor",
- "unicode-width",
-]
-
-[[package]]
-name = "cxx"
-version = "1.0.135"
-dependencies = [
- "cc",
- "cxx-build",
- "cxx-gen",
- "cxx-test-suite",
- "cxxbridge-cmd",
- "cxxbridge-flags",
- "cxxbridge-macro",
- "foldhash",
- "link-cplusplus",
- "rustversion",
- "trybuild",
-]
-
-[[package]]
-name = "cxx-build"
-version = "1.0.135"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "66fd8f17ad454fc1e4f4ab83abffcc88a532e90350d3ffddcb73030220fcbd52"
-dependencies = [
- "cc",
- "codespan-reporting",
- "proc-macro2",
- "quote",
- "scratch",
- "syn",
-]
-
-[[package]]
-name = "cxx-gen"
-version = "0.7.135"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3c62d12c58e0fd31869500860618d5ae274464b06cade32dc45f3fbf41c73721"
-dependencies = [
- "codespan-reporting",
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "cxx-test-suite"
-version = "0.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "54b17bb6fdd4579f6b0ad0becada9b2692ad19dd6f42ec314f0f0411bc226ede"
-
-[[package]]
-name = "cxxbridge-cmd"
-version = "1.0.135"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4717c9c806a9e07fdcb34c84965a414ea40fafe57667187052cf1eb7f5e8a8a9"
-dependencies = [
- "clap",
- "codespan-reporting",
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "cxxbridge-flags"
-version = "1.0.135"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2f6515329bf3d98f4073101c7866ff2bec4e635a13acb82e3f3753fff0bf43cb"
-
-[[package]]
-name = "cxxbridge-macro"
-version = "1.0.135"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fb93e6a7ce8ec985c02bbb758237a31598b340acbbc3c19c5a4fa6adaaac92ab"
-dependencies = [
- "proc-macro2",
- "quote",
- "rustversion",
- "syn",
-]
-
-[[package]]
 name = "dissimilar"
 version = "1.0.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -146,12 +15,6 @@
 checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
 
 [[package]]
-name = "foldhash"
-version = "0.1.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f81ec6369c545a7d40e4589b5597581fa1c441fe1cce96dd1de43159910a36a2"
-
-[[package]]
 name = "glob"
 version = "0.3.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -180,15 +43,6 @@
 checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674"
 
 [[package]]
-name = "link-cplusplus"
-version = "1.0.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9d240c6f7e1ba3a28b0249f774e6a9dd0175054b52dfbb61b16eb8505c3785c9"
-dependencies = [
- "cc",
-]
-
-[[package]]
 name = "memchr"
 version = "2.7.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -205,18 +59,19 @@
 
 [[package]]
 name = "quote"
-version = "1.0.37"
+version = "1.0.38"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af"
+checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc"
 dependencies = [
  "proc-macro2",
 ]
 
 [[package]]
 name = "rustversion"
-version = "1.0.18"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248"
+version = "1.0.19"
+dependencies = [
+ "trybuild",
+]
 
 [[package]]
 name = "ryu"
@@ -225,12 +80,6 @@
 checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f"
 
 [[package]]
-name = "scratch"
-version = "1.0.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a3cf7c11c38cb994f3d40e8a8cde3bbd1f72a435e4c49e85d6553d8312306152"
-
-[[package]]
 name = "serde"
 version = "1.0.216"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -252,9 +101,9 @@
 
 [[package]]
 name = "serde_json"
-version = "1.0.133"
+version = "1.0.134"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377"
+checksum = "d00f4175c42ee48b15416f6193a959ba3a0d67fc699a0db9ad12df9f83991c7d"
 dependencies = [
  "itoa",
  "memchr",
@@ -272,22 +121,10 @@
 ]
 
 [[package]]
-name = "shlex"
-version = "1.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
-
-[[package]]
-name = "strsim"
-version = "0.11.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
-
-[[package]]
 name = "syn"
-version = "2.0.90"
+version = "2.0.91"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31"
+checksum = "d53cbcb5a243bd33b7858b1d7f4aca2153490815872d86d955d6ea29f743c035"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -366,12 +203,6 @@
 checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83"
 
 [[package]]
-name = "unicode-width"
-version = "0.1.14"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af"
-
-[[package]]
 name = "winapi-util"
 version = "0.1.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
diff --git a/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/Cargo.toml b/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/Cargo.toml
similarity index 98%
rename from third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/Cargo.toml
rename to third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/Cargo.toml
index 90b7d54..89aba70 100644
--- a/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/Cargo.toml
+++ b/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/Cargo.toml
@@ -13,7 +13,7 @@
 edition = "2018"
 rust-version = "1.31"
 name = "rustversion"
-version = "1.0.18"
+version = "1.0.19"
 authors = ["David Tolnay <dtolnay@gmail.com>"]
 build = "build/build.rs"
 autolib = false
diff --git a/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/Cargo.toml.orig b/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/Cargo.toml.orig
similarity index 96%
rename from third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/Cargo.toml.orig
rename to third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/Cargo.toml.orig
index 04bf62d..765d65f85 100644
--- a/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/Cargo.toml.orig
+++ b/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/Cargo.toml.orig
@@ -1,6 +1,6 @@
 [package]
 name = "rustversion"
-version = "1.0.18"
+version = "1.0.19"
 authors = ["David Tolnay <dtolnay@gmail.com>"]
 build = "build/build.rs"
 categories = ["development-tools::build-utils", "no-std", "no-std::no-alloc"]
diff --git a/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/LICENSE-APACHE b/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/LICENSE-APACHE
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/LICENSE-APACHE
rename to third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/LICENSE-APACHE
diff --git a/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/LICENSE-MIT b/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/LICENSE-MIT
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/LICENSE-MIT
rename to third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/LICENSE-MIT
diff --git a/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/README.md b/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/README.md
similarity index 88%
rename from third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/README.md
rename to third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/README.md
index 2c4be07..9dd554a 100644
--- a/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/README.md
+++ b/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/README.md
@@ -73,6 +73,11 @@
   —<br>
   For conditional inclusion of attributes; analogous to `cfg_attr`.
 
+- <b>`rustversion::cfg!(`</b><i>selector</i><b>`)`</b>
+  —<br>
+  An expression form of any of the above attributes; for example
+  *if rustversion::cfg!(any(stable, beta)) { ... }*.
+
 <br>
 
 ## Use cases
@@ -121,6 +126,29 @@
 }
 ```
 
+Emitting Cargo cfg directives from a build script. Note that this requires
+listing `rustversion` under `[build-dependencies]` in Cargo.toml, not
+`[dependencies]`.
+
+```rust
+// build.rs
+
+fn main() {
+    if rustversion::cfg!(since(1.36)) {
+        println!("cargo:rustc-cfg=no_std");
+    }
+}
+```
+
+```rust
+// src/lib.rs
+
+#![cfg_attr(no_std, no_std)]
+
+#[cfg(no_std)]
+extern crate alloc;
+```
+
 <br>
 
 #### License
diff --git a/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/build/build.rs b/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/build/build.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/build/build.rs
rename to third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/build/build.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/build/rustc.rs b/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/build/rustc.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/build/rustc.rs
rename to third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/build/rustc.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/src/attr.rs b/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/src/attr.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/src/attr.rs
rename to third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/src/attr.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/src/bound.rs b/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/src/bound.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/src/bound.rs
rename to third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/src/bound.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/src/constfn.rs b/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/src/constfn.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/src/constfn.rs
rename to third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/src/constfn.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/src/date.rs b/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/src/date.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/src/date.rs
rename to third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/src/date.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/src/error.rs b/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/src/error.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/src/error.rs
rename to third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/src/error.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/src/expand.rs b/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/src/expand.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/src/expand.rs
rename to third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/src/expand.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/src/expr.rs b/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/src/expr.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/src/expr.rs
rename to third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/src/expr.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/src/iter.rs b/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/src/iter.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/src/iter.rs
rename to third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/src/iter.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/src/lib.rs b/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/src/lib.rs
similarity index 75%
rename from third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/src/lib.rs
rename to third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/src/lib.rs
index 501f8f2..2b4c4d7 100644
--- a/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/src/lib.rs
+++ b/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/src/lib.rs
@@ -18,79 +18,86 @@
 //! # Selectors
 //!
 //! - <p style="margin-left:50px;text-indent:-50px">
-//!   <b><code>#[rustversion::stable]</code></b>
+//!   <b><code style="display:inline">#[rustversion::stable]</code></b>
 //!   —<br>
 //!   True on any stable compiler.
 //!   </p>
 //!
 //! - <p style="margin-left:50px;text-indent:-50px">
-//!   <b><code>#[rustversion::stable(1.34)]</code></b>
+//!   <b><code style="display:inline">#[rustversion::stable(1.34)]</code></b>
 //!   —<br>
 //!   True on exactly the specified stable compiler.
 //!   </p>
 //!
 //! - <p style="margin-left:50px;text-indent:-50px">
-//!   <b><code>#[rustversion::beta]</code></b>
+//!   <b><code style="display:inline">#[rustversion::beta]</code></b>
 //!   —<br>
 //!   True on any beta compiler.
 //!   </p>
 //!
 //! - <p style="margin-left:50px;text-indent:-50px">
-//!   <b><code>#[rustversion::nightly]</code></b>
+//!   <b><code style="display:inline">#[rustversion::nightly]</code></b>
 //!   —<br>
 //!   True on any nightly compiler or dev build.
 //!   </p>
 //!
 //! - <p style="margin-left:50px;text-indent:-50px">
-//!   <b><code>#[rustversion::nightly(2019-01-01)]</code></b>
+//!   <b><code style="display:inline">#[rustversion::nightly(2019-01-01)]</code></b>
 //!   —<br>
 //!   True on exactly one nightly.
 //!   </p>
 //!
 //! - <p style="margin-left:50px;text-indent:-50px">
-//!   <b><code>#[rustversion::since(1.34)]</code></b>
+//!   <b><code style="display:inline">#[rustversion::since(1.34)]</code></b>
 //!   —<br>
 //!   True on that stable release and any later compiler, including beta and
 //!   nightly.
 //!   </p>
 //!
 //! - <p style="margin-left:50px;text-indent:-50px">
-//!   <b><code>#[rustversion::since(2019-01-01)]</code></b>
+//!   <b><code style="display:inline">#[rustversion::since(2019-01-01)]</code></b>
 //!   —<br>
 //!   True on that nightly and all newer ones.
 //!   </p>
 //!
 //! - <p style="margin-left:50px;text-indent:-50px">
-//!   <b><code>#[rustversion::before(</code></b><i>version or date</i><b><code>)]</code></b>
+//!   <b><code style="display:inline">#[rustversion::before(</code></b><i>version or date</i><b><code style="display:inline">)]</code></b>
 //!   —<br>
 //!   Negative of <i>#[rustversion::since(...)]</i>.
 //!   </p>
 //!
 //! - <p style="margin-left:50px;text-indent:-50px">
-//!   <b><code>#[rustversion::not(</code></b><i>selector</i><b><code>)]</code></b>
+//!   <b><code style="display:inline">#[rustversion::not(</code></b><i>selector</i><b><code style="display:inline">)]</code></b>
 //!   —<br>
 //!   Negative of any selector; for example <i>#[rustversion::not(nightly)]</i>.
 //!   </p>
 //!
 //! - <p style="margin-left:50px;text-indent:-50px">
-//!   <b><code>#[rustversion::any(</code></b><i>selectors...</i><b><code>)]</code></b>
+//!   <b><code style="display:inline">#[rustversion::any(</code></b><i>selectors...</i><b><code style="display:inline">)]</code></b>
 //!   —<br>
 //!   True if any of the comma-separated selectors is true; for example
 //!   <i>#[rustversion::any(stable, beta)]</i>.
 //!   </p>
 //!
 //! - <p style="margin-left:50px;text-indent:-50px">
-//!   <b><code>#[rustversion::all(</code></b><i>selectors...</i><b><code>)]</code></b>
+//!   <b><code style="display:inline">#[rustversion::all(</code></b><i>selectors...</i><b><code style="display:inline">)]</code></b>
 //!   —<br>
 //!   True if all of the comma-separated selectors are true; for example
 //!   <i>#[rustversion::all(since(1.31), before(1.34))]</i>.
 //!   </p>
 //!
 //! - <p style="margin-left:50px;text-indent:-50px">
-//!   <b><code>#[rustversion::attr(</code></b><i>selector</i><b><code>, </code></b><i>attribute</i><b><code>)]</code></b>
+//!   <b><code style="display:inline">#[rustversion::attr(</code></b><i>selector</i><b><code style="display:inline">, </code></b><i>attribute</i><b><code style="display:inline">)]</code></b>
 //!   —<br>
 //!   For conditional inclusion of attributes; analogous to
-//!   <code>cfg_attr</code>.
+//!   <code style="display:inline">cfg_attr</code>.
+//!   </p>
+//!
+//! - <p style="margin-left:50px;text-indent:-50px">
+//!   <b><code style="display:inline">rustversion::cfg!(</code></b><i>selector</i><b><code style="display:inline">)</code></b>
+//!   —<br>
+//!   An expression form of any of the above attributes; for example
+//!   <i>if rustversion::cfg!(any(stable, beta)) { ... }</i>.
 //!   </p>
 //!
 //! <br>
@@ -143,9 +150,32 @@
 //! }
 //! ```
 //!
+//! Emitting Cargo cfg directives from a build script. Note that this requires
+//! listing `rustversion` under `[build-dependencies]` in Cargo.toml, not
+//! `[dependencies]`.
+//!
+//! ```
+//! // build.rs
+//!
+//! fn main() {
+//!     if rustversion::cfg!(since(1.36)) {
+//!         println!("cargo:rustc-cfg=no_std");
+//!     }
+//! }
+//! ```
+//!
+//! ```
+//! // src/lib.rs
+//!
+//! #![cfg_attr(no_std, no_std)]
+//!
+//! #[cfg(no_std)]
+//! extern crate alloc;
+//! ```
+//!
 //! <br>
 
-#![doc(html_root_url = "https://docs.rs/rustversion/1.0.18")]
+#![doc(html_root_url = "https://docs.rs/rustversion/1.0.19")]
 #![allow(
     clippy::cast_lossless,
     clippy::cast_possible_truncation,
diff --git a/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/src/release.rs b/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/src/release.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/src/release.rs
rename to third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/src/release.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/src/time.rs b/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/src/time.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/src/time.rs
rename to third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/src/time.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/src/token.rs b/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/src/token.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/src/token.rs
rename to third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/src/token.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/src/version.rs b/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/src/version.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/src/version.rs
rename to third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/src/version.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/tests/compiletest.rs b/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/tests/compiletest.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/tests/compiletest.rs
rename to third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/tests/compiletest.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/tests/test_const.rs b/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/tests/test_const.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/tests/test_const.rs
rename to third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/tests/test_const.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/tests/test_eval.rs b/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/tests/test_eval.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/tests/test_eval.rs
rename to third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/tests/test_eval.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/tests/test_parse.rs b/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/tests/test_parse.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/tests/test_parse.rs
rename to third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/tests/test_parse.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/tests/ui/bad-bound.rs b/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/tests/ui/bad-bound.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/tests/ui/bad-bound.rs
rename to third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/tests/ui/bad-bound.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/tests/ui/bad-bound.stderr b/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/tests/ui/bad-bound.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/tests/ui/bad-bound.stderr
rename to third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/tests/ui/bad-bound.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/tests/ui/bad-date.rs b/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/tests/ui/bad-date.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/tests/ui/bad-date.rs
rename to third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/tests/ui/bad-date.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/tests/ui/bad-date.stderr b/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/tests/ui/bad-date.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/tests/ui/bad-date.stderr
rename to third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/tests/ui/bad-date.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/tests/ui/bad-not.rs b/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/tests/ui/bad-not.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/tests/ui/bad-not.rs
rename to third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/tests/ui/bad-not.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/tests/ui/bad-not.stderr b/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/tests/ui/bad-not.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/tests/ui/bad-not.stderr
rename to third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/tests/ui/bad-not.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/tests/ui/bad-version.rs b/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/tests/ui/bad-version.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/tests/ui/bad-version.rs
rename to third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/tests/ui/bad-version.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/tests/ui/bad-version.stderr b/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/tests/ui/bad-version.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/tests/ui/bad-version.stderr
rename to third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/tests/ui/bad-version.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/tests/ui/const-not-fn.rs b/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/tests/ui/const-not-fn.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/tests/ui/const-not-fn.rs
rename to third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/tests/ui/const-not-fn.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/tests/ui/const-not-fn.stderr b/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/tests/ui/const-not-fn.stderr
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/tests/ui/const-not-fn.stderr
rename to third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/tests/ui/const-not-fn.stderr
diff --git a/third_party/rust/chromium_crates_io/vendor/serde-1.0.216/.cargo_vcs_info.json b/third_party/rust/chromium_crates_io/vendor/serde-1.0.216/.cargo_vcs_info.json
deleted file mode 100644
index ed3d6cc..0000000
--- a/third_party/rust/chromium_crates_io/vendor/serde-1.0.216/.cargo_vcs_info.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-  "git": {
-    "sha1": "ad8dd4148b5fabf0d643d4de604a0616f2796506"
-  },
-  "path_in_vcs": "serde"
-}
\ No newline at end of file
diff --git a/third_party/rust/chromium_crates_io/vendor/serde-1.0.216/.cargo-checksum.json b/third_party/rust/chromium_crates_io/vendor/serde-1.0.217/.cargo-checksum.json
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/serde-1.0.216/.cargo-checksum.json
rename to third_party/rust/chromium_crates_io/vendor/serde-1.0.217/.cargo-checksum.json
diff --git a/third_party/rust/chromium_crates_io/vendor/serde-1.0.217/.cargo_vcs_info.json b/third_party/rust/chromium_crates_io/vendor/serde-1.0.217/.cargo_vcs_info.json
new file mode 100644
index 0000000..19301f8
--- /dev/null
+++ b/third_party/rust/chromium_crates_io/vendor/serde-1.0.217/.cargo_vcs_info.json
@@ -0,0 +1,6 @@
+{
+  "git": {
+    "sha1": "930401b0dd58a809fce34da091b8aa3d6083cb33"
+  },
+  "path_in_vcs": "serde"
+}
\ No newline at end of file
diff --git a/third_party/rust/chromium_crates_io/vendor/serde-1.0.216/Cargo.lock b/third_party/rust/chromium_crates_io/vendor/serde-1.0.217/Cargo.lock
similarity index 65%
rename from third_party/rust/chromium_crates_io/vendor/serde-1.0.216/Cargo.lock
rename to third_party/rust/chromium_crates_io/vendor/serde-1.0.217/Cargo.lock
index 670c398b..3e0f340 100644
--- a/third_party/rust/chromium_crates_io/vendor/serde-1.0.216/Cargo.lock
+++ b/third_party/rust/chromium_crates_io/vendor/serde-1.0.217/Cargo.lock
@@ -10,7 +10,7 @@
 
 [[package]]
 name = "quote"
-version = "1.0.37"
+version = "1.0.38"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "proc-macro2 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -18,28 +18,28 @@
 
 [[package]]
 name = "serde"
-version = "1.0.216"
+version = "1.0.217"
 dependencies = [
- "serde_derive 1.0.216 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde_derive 1.0.217 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "serde_derive"
-version = "1.0.216"
+version = "1.0.217"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "proc-macro2 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)",
- "quote 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)",
- "syn 2.0.90 (registry+https://github.com/rust-lang/crates.io-index)",
+ "quote 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)",
+ "syn 2.0.92 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "syn"
-version = "2.0.90"
+version = "2.0.92"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "proc-macro2 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)",
- "quote 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)",
+ "quote 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)",
  "unicode-ident 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
@@ -50,7 +50,7 @@
 
 [metadata]
 "checksum proc-macro2 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)" = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0"
-"checksum quote 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)" = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af"
-"checksum serde_derive 1.0.216 (registry+https://github.com/rust-lang/crates.io-index)" = "46f859dbbf73865c6627ed570e78961cd3ac92407a2d117204c49232485da55e"
-"checksum syn 2.0.90 (registry+https://github.com/rust-lang/crates.io-index)" = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31"
+"checksum quote 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)" = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc"
+"checksum serde_derive 1.0.217 (registry+https://github.com/rust-lang/crates.io-index)" = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0"
+"checksum syn 2.0.92 (registry+https://github.com/rust-lang/crates.io-index)" = "70ae51629bf965c5c098cc9e87908a3df5301051a9e087d6f9bef5c9771ed126"
 "checksum unicode-ident 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)" = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83"
diff --git a/third_party/rust/chromium_crates_io/vendor/serde-1.0.216/Cargo.toml b/third_party/rust/chromium_crates_io/vendor/serde-1.0.217/Cargo.toml
similarity index 97%
rename from third_party/rust/chromium_crates_io/vendor/serde-1.0.216/Cargo.toml
rename to third_party/rust/chromium_crates_io/vendor/serde-1.0.217/Cargo.toml
index 10d8d12..1ec272c5 100644
--- a/third_party/rust/chromium_crates_io/vendor/serde-1.0.216/Cargo.toml
+++ b/third_party/rust/chromium_crates_io/vendor/serde-1.0.217/Cargo.toml
@@ -13,7 +13,7 @@
 edition = "2018"
 rust-version = "1.31"
 name = "serde"
-version = "1.0.216"
+version = "1.0.217"
 authors = [
     "Erick Tryzelaar <erick.tryzelaar@gmail.com>",
     "David Tolnay <dtolnay@gmail.com>",
@@ -56,6 +56,14 @@
     "rc",
 ]
 
+[features]
+alloc = []
+default = ["std"]
+derive = ["serde_derive"]
+rc = []
+std = []
+unstable = []
+
 [lib]
 name = "serde"
 path = "src/lib.rs"
@@ -68,13 +76,5 @@
 [dev-dependencies.serde_derive]
 version = "1"
 
-[features]
-alloc = []
-default = ["std"]
-derive = ["serde_derive"]
-rc = []
-std = []
-unstable = []
-
 [target."cfg(any())".dependencies.serde_derive]
-version = "=1.0.216"
+version = "=1.0.217"
diff --git a/third_party/rust/chromium_crates_io/vendor/serde-1.0.216/Cargo.toml.orig b/third_party/rust/chromium_crates_io/vendor/serde-1.0.217/Cargo.toml.orig
similarity index 96%
rename from third_party/rust/chromium_crates_io/vendor/serde-1.0.216/Cargo.toml.orig
rename to third_party/rust/chromium_crates_io/vendor/serde-1.0.217/Cargo.toml.orig
index cac66df..a569bc1 100644
--- a/third_party/rust/chromium_crates_io/vendor/serde-1.0.216/Cargo.toml.orig
+++ b/third_party/rust/chromium_crates_io/vendor/serde-1.0.217/Cargo.toml.orig
@@ -1,6 +1,6 @@
 [package]
 name = "serde"
-version = "1.0.216"
+version = "1.0.217"
 authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>", "David Tolnay <dtolnay@gmail.com>"]
 build = "build.rs"
 categories = ["encoding", "no-std", "no-std::no-alloc"]
@@ -37,7 +37,7 @@
 # is compatible with exactly one serde release because the generated code
 # involves nonpublic APIs which are not bound by semver.
 [target.'cfg(any())'.dependencies]
-serde_derive = { version = "=1.0.216", path = "../serde_derive" }
+serde_derive = { version = "=1.0.217", path = "../serde_derive" }
 
 
 ### FEATURES #################################################################
diff --git a/third_party/rust/chromium_crates_io/vendor/serde-1.0.216/LICENSE-APACHE b/third_party/rust/chromium_crates_io/vendor/serde-1.0.217/LICENSE-APACHE
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/serde-1.0.216/LICENSE-APACHE
rename to third_party/rust/chromium_crates_io/vendor/serde-1.0.217/LICENSE-APACHE
diff --git a/third_party/rust/chromium_crates_io/vendor/serde-1.0.216/LICENSE-MIT b/third_party/rust/chromium_crates_io/vendor/serde-1.0.217/LICENSE-MIT
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/serde-1.0.216/LICENSE-MIT
rename to third_party/rust/chromium_crates_io/vendor/serde-1.0.217/LICENSE-MIT
diff --git a/third_party/rust/chromium_crates_io/vendor/serde-1.0.216/README.md b/third_party/rust/chromium_crates_io/vendor/serde-1.0.217/README.md
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/serde-1.0.216/README.md
rename to third_party/rust/chromium_crates_io/vendor/serde-1.0.217/README.md
diff --git a/third_party/rust/chromium_crates_io/vendor/serde-1.0.216/build.rs b/third_party/rust/chromium_crates_io/vendor/serde-1.0.217/build.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/serde-1.0.216/build.rs
rename to third_party/rust/chromium_crates_io/vendor/serde-1.0.217/build.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/serde-1.0.216/crates-io.md b/third_party/rust/chromium_crates_io/vendor/serde-1.0.217/crates-io.md
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/serde-1.0.216/crates-io.md
rename to third_party/rust/chromium_crates_io/vendor/serde-1.0.217/crates-io.md
diff --git a/third_party/rust/chromium_crates_io/vendor/serde-1.0.216/src/de/ignored_any.rs b/third_party/rust/chromium_crates_io/vendor/serde-1.0.217/src/de/ignored_any.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/serde-1.0.216/src/de/ignored_any.rs
rename to third_party/rust/chromium_crates_io/vendor/serde-1.0.217/src/de/ignored_any.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/serde-1.0.216/src/de/impls.rs b/third_party/rust/chromium_crates_io/vendor/serde-1.0.217/src/de/impls.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/serde-1.0.216/src/de/impls.rs
rename to third_party/rust/chromium_crates_io/vendor/serde-1.0.217/src/de/impls.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/serde-1.0.216/src/de/mod.rs b/third_party/rust/chromium_crates_io/vendor/serde-1.0.217/src/de/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/serde-1.0.216/src/de/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/serde-1.0.217/src/de/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/serde-1.0.216/src/de/seed.rs b/third_party/rust/chromium_crates_io/vendor/serde-1.0.217/src/de/seed.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/serde-1.0.216/src/de/seed.rs
rename to third_party/rust/chromium_crates_io/vendor/serde-1.0.217/src/de/seed.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/serde-1.0.216/src/de/size_hint.rs b/third_party/rust/chromium_crates_io/vendor/serde-1.0.217/src/de/size_hint.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/serde-1.0.216/src/de/size_hint.rs
rename to third_party/rust/chromium_crates_io/vendor/serde-1.0.217/src/de/size_hint.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/serde-1.0.216/src/de/value.rs b/third_party/rust/chromium_crates_io/vendor/serde-1.0.217/src/de/value.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/serde-1.0.216/src/de/value.rs
rename to third_party/rust/chromium_crates_io/vendor/serde-1.0.217/src/de/value.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/serde-1.0.216/src/format.rs b/third_party/rust/chromium_crates_io/vendor/serde-1.0.217/src/format.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/serde-1.0.216/src/format.rs
rename to third_party/rust/chromium_crates_io/vendor/serde-1.0.217/src/format.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/serde-1.0.216/src/integer128.rs b/third_party/rust/chromium_crates_io/vendor/serde-1.0.217/src/integer128.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/serde-1.0.216/src/integer128.rs
rename to third_party/rust/chromium_crates_io/vendor/serde-1.0.217/src/integer128.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/serde-1.0.216/src/lib.rs b/third_party/rust/chromium_crates_io/vendor/serde-1.0.217/src/lib.rs
similarity index 99%
rename from third_party/rust/chromium_crates_io/vendor/serde-1.0.216/src/lib.rs
rename to third_party/rust/chromium_crates_io/vendor/serde-1.0.217/src/lib.rs
index 83b5459..efa3780a 100644
--- a/third_party/rust/chromium_crates_io/vendor/serde-1.0.216/src/lib.rs
+++ b/third_party/rust/chromium_crates_io/vendor/serde-1.0.217/src/lib.rs
@@ -95,7 +95,7 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 // Serde types in rustdoc of other crates get linked to here.
-#![doc(html_root_url = "https://docs.rs/serde/1.0.216")]
+#![doc(html_root_url = "https://docs.rs/serde/1.0.217")]
 // Support using Serde without the standard library!
 #![cfg_attr(not(feature = "std"), no_std)]
 // Show which crate feature enables conditionally compiled APIs in documentation.
diff --git a/third_party/rust/chromium_crates_io/vendor/serde-1.0.216/src/macros.rs b/third_party/rust/chromium_crates_io/vendor/serde-1.0.217/src/macros.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/serde-1.0.216/src/macros.rs
rename to third_party/rust/chromium_crates_io/vendor/serde-1.0.217/src/macros.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/serde-1.0.216/src/private/de.rs b/third_party/rust/chromium_crates_io/vendor/serde-1.0.217/src/private/de.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/serde-1.0.216/src/private/de.rs
rename to third_party/rust/chromium_crates_io/vendor/serde-1.0.217/src/private/de.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/serde-1.0.216/src/private/doc.rs b/third_party/rust/chromium_crates_io/vendor/serde-1.0.217/src/private/doc.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/serde-1.0.216/src/private/doc.rs
rename to third_party/rust/chromium_crates_io/vendor/serde-1.0.217/src/private/doc.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/serde-1.0.216/src/private/mod.rs b/third_party/rust/chromium_crates_io/vendor/serde-1.0.217/src/private/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/serde-1.0.216/src/private/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/serde-1.0.217/src/private/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/serde-1.0.216/src/private/ser.rs b/third_party/rust/chromium_crates_io/vendor/serde-1.0.217/src/private/ser.rs
similarity index 99%
rename from third_party/rust/chromium_crates_io/vendor/serde-1.0.216/src/private/ser.rs
rename to third_party/rust/chromium_crates_io/vendor/serde-1.0.217/src/private/ser.rs
index ebfeba97..2f20739 100644
--- a/third_party/rust/chromium_crates_io/vendor/serde-1.0.216/src/private/ser.rs
+++ b/third_party/rust/chromium_crates_io/vendor/serde-1.0.217/src/private/ser.rs
@@ -54,6 +54,7 @@
     Sequence,
     Tuple,
     TupleStruct,
+    #[cfg(not(any(feature = "std", feature = "alloc")))]
     Enum,
 }
 
@@ -70,6 +71,7 @@
             Unsupported::Sequence => formatter.write_str("a sequence"),
             Unsupported::Tuple => formatter.write_str("a tuple"),
             Unsupported::TupleStruct => formatter.write_str("a tuple struct"),
+            #[cfg(not(any(feature = "std", feature = "alloc")))]
             Unsupported::Enum => formatter.write_str("an enum"),
         }
     }
@@ -1095,9 +1097,9 @@
         self,
         _: &'static str,
         _: u32,
-        _: &'static str,
+        variant: &'static str,
     ) -> Result<Self::Ok, Self::Error> {
-        Err(Self::bad_type(Unsupported::Enum))
+        self.0.serialize_entry(variant, &())
     }
 
     fn serialize_newtype_struct<T>(
diff --git a/third_party/rust/chromium_crates_io/vendor/serde-1.0.216/src/ser/fmt.rs b/third_party/rust/chromium_crates_io/vendor/serde-1.0.217/src/ser/fmt.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/serde-1.0.216/src/ser/fmt.rs
rename to third_party/rust/chromium_crates_io/vendor/serde-1.0.217/src/ser/fmt.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/serde-1.0.216/src/ser/impls.rs b/third_party/rust/chromium_crates_io/vendor/serde-1.0.217/src/ser/impls.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/serde-1.0.216/src/ser/impls.rs
rename to third_party/rust/chromium_crates_io/vendor/serde-1.0.217/src/ser/impls.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/serde-1.0.216/src/ser/impossible.rs b/third_party/rust/chromium_crates_io/vendor/serde-1.0.217/src/ser/impossible.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/serde-1.0.216/src/ser/impossible.rs
rename to third_party/rust/chromium_crates_io/vendor/serde-1.0.217/src/ser/impossible.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/serde-1.0.216/src/ser/mod.rs b/third_party/rust/chromium_crates_io/vendor/serde-1.0.217/src/ser/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/serde-1.0.216/src/ser/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/serde-1.0.217/src/ser/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/serde-1.0.216/src/std_error.rs b/third_party/rust/chromium_crates_io/vendor/serde-1.0.217/src/std_error.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/serde-1.0.216/src/std_error.rs
rename to third_party/rust/chromium_crates_io/vendor/serde-1.0.217/src/std_error.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/.cargo_vcs_info.json b/third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/.cargo_vcs_info.json
deleted file mode 100644
index f543cde1..0000000
--- a/third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/.cargo_vcs_info.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-  "git": {
-    "sha1": "ad8dd4148b5fabf0d643d4de604a0616f2796506"
-  },
-  "path_in_vcs": "serde_derive"
-}
\ No newline at end of file
diff --git a/third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/Cargo.lock b/third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/Cargo.lock
deleted file mode 100644
index 9571a2ac..0000000
--- a/third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/Cargo.lock
+++ /dev/null
@@ -1,68 +0,0 @@
-# This file is automatically @generated by Cargo.
-# It is not intended for manual editing.
-version = 3
-
-[[package]]
-name = "proc-macro2"
-version = "1.0.92"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0"
-dependencies = [
- "unicode-ident",
-]
-
-[[package]]
-name = "quote"
-version = "1.0.37"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af"
-dependencies = [
- "proc-macro2",
-]
-
-[[package]]
-name = "serde"
-version = "1.0.215"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6513c1ad0b11a9376da888e3e0baa0077f1aed55c17f50e7b2397136129fb88f"
-dependencies = [
- "serde_derive 1.0.215",
-]
-
-[[package]]
-name = "serde_derive"
-version = "1.0.215"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "serde_derive"
-version = "1.0.216"
-dependencies = [
- "proc-macro2",
- "quote",
- "serde",
- "syn",
-]
-
-[[package]]
-name = "syn"
-version = "2.0.90"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31"
-dependencies = [
- "proc-macro2",
- "quote",
- "unicode-ident",
-]
-
-[[package]]
-name = "unicode-ident"
-version = "1.0.14"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83"
diff --git a/third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/.cargo-checksum.json b/third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/.cargo-checksum.json
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/.cargo-checksum.json
rename to third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/.cargo-checksum.json
diff --git a/third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/.cargo_vcs_info.json b/third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/.cargo_vcs_info.json
new file mode 100644
index 0000000..c2b2a0a
--- /dev/null
+++ b/third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/.cargo_vcs_info.json
@@ -0,0 +1,6 @@
+{
+  "git": {
+    "sha1": "930401b0dd58a809fce34da091b8aa3d6083cb33"
+  },
+  "path_in_vcs": "serde_derive"
+}
\ No newline at end of file
diff --git a/third_party/rust/chromium_crates_io/vendor/serde-1.0.216/Cargo.lock b/third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/Cargo.lock
similarity index 61%
copy from third_party/rust/chromium_crates_io/vendor/serde-1.0.216/Cargo.lock
copy to third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/Cargo.lock
index 670c398b..8ef41e3 100644
--- a/third_party/rust/chromium_crates_io/vendor/serde-1.0.216/Cargo.lock
+++ b/third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/Cargo.lock
@@ -10,7 +10,7 @@
 
 [[package]]
 name = "quote"
-version = "1.0.37"
+version = "1.0.38"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "proc-macro2 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -19,6 +19,7 @@
 [[package]]
 name = "serde"
 version = "1.0.216"
+source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "serde_derive 1.0.216 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
@@ -29,17 +30,27 @@
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "proc-macro2 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)",
- "quote 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)",
- "syn 2.0.90 (registry+https://github.com/rust-lang/crates.io-index)",
+ "quote 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)",
+ "syn 2.0.92 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "serde_derive"
+version = "1.0.217"
+dependencies = [
+ "proc-macro2 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)",
+ "quote 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde 1.0.216 (registry+https://github.com/rust-lang/crates.io-index)",
+ "syn 2.0.92 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "syn"
-version = "2.0.90"
+version = "2.0.92"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "proc-macro2 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)",
- "quote 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)",
+ "quote 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)",
  "unicode-ident 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
@@ -50,7 +61,8 @@
 
 [metadata]
 "checksum proc-macro2 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)" = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0"
-"checksum quote 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)" = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af"
+"checksum quote 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)" = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc"
+"checksum serde 1.0.216 (registry+https://github.com/rust-lang/crates.io-index)" = "0b9781016e935a97e8beecf0c933758c97a5520d32930e460142b4cd80c6338e"
 "checksum serde_derive 1.0.216 (registry+https://github.com/rust-lang/crates.io-index)" = "46f859dbbf73865c6627ed570e78961cd3ac92407a2d117204c49232485da55e"
-"checksum syn 2.0.90 (registry+https://github.com/rust-lang/crates.io-index)" = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31"
+"checksum syn 2.0.92 (registry+https://github.com/rust-lang/crates.io-index)" = "70ae51629bf965c5c098cc9e87908a3df5301051a9e087d6f9bef5c9771ed126"
 "checksum unicode-ident 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)" = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83"
diff --git a/third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/Cargo.toml b/third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/Cargo.toml
similarity index 98%
rename from third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/Cargo.toml
rename to third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/Cargo.toml
index 81e7caa8..5df9dcd2 100644
--- a/third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/Cargo.toml
+++ b/third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/Cargo.toml
@@ -13,7 +13,7 @@
 edition = "2015"
 rust-version = "1.61"
 name = "serde_derive"
-version = "1.0.216"
+version = "1.0.217"
 authors = [
     "Erick Tryzelaar <erick.tryzelaar@gmail.com>",
     "David Tolnay <dtolnay@gmail.com>",
@@ -46,6 +46,10 @@
 rustdoc-args = ["--generate-link-to-definition"]
 targets = ["x86_64-unknown-linux-gnu"]
 
+[features]
+default = []
+deserialize_in_place = []
+
 [lib]
 name = "serde_derive"
 path = "src/lib.rs"
@@ -74,7 +78,3 @@
 
 [dev-dependencies.serde]
 version = "1"
-
-[features]
-default = []
-deserialize_in_place = []
diff --git a/third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/Cargo.toml.orig b/third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/Cargo.toml.orig
similarity index 97%
rename from third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/Cargo.toml.orig
rename to third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/Cargo.toml.orig
index f281d758..c0222e3 100644
--- a/third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/Cargo.toml.orig
+++ b/third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/Cargo.toml.orig
@@ -1,6 +1,6 @@
 [package]
 name = "serde_derive"
-version = "1.0.216"
+version = "1.0.217"
 authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>", "David Tolnay <dtolnay@gmail.com>"]
 categories = ["no-std", "no-std::no-alloc"]
 description = "Macros 1.1 implementation of #[derive(Serialize, Deserialize)]"
diff --git a/third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/LICENSE-APACHE b/third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/LICENSE-APACHE
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/LICENSE-APACHE
rename to third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/LICENSE-APACHE
diff --git a/third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/LICENSE-MIT b/third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/LICENSE-MIT
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/LICENSE-MIT
rename to third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/LICENSE-MIT
diff --git a/third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/README.md b/third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/README.md
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/README.md
rename to third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/README.md
diff --git a/third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/crates-io.md b/third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/crates-io.md
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/crates-io.md
rename to third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/crates-io.md
diff --git a/third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/src/bound.rs b/third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/src/bound.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/src/bound.rs
rename to third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/src/bound.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/src/de.rs b/third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/src/de.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/src/de.rs
rename to third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/src/de.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/src/dummy.rs b/third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/src/dummy.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/src/dummy.rs
rename to third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/src/dummy.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/src/fragment.rs b/third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/src/fragment.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/src/fragment.rs
rename to third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/src/fragment.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/src/internals/ast.rs b/third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/src/internals/ast.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/src/internals/ast.rs
rename to third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/src/internals/ast.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/src/internals/attr.rs b/third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/src/internals/attr.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/src/internals/attr.rs
rename to third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/src/internals/attr.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/src/internals/case.rs b/third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/src/internals/case.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/src/internals/case.rs
rename to third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/src/internals/case.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/src/internals/check.rs b/third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/src/internals/check.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/src/internals/check.rs
rename to third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/src/internals/check.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/src/internals/ctxt.rs b/third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/src/internals/ctxt.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/src/internals/ctxt.rs
rename to third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/src/internals/ctxt.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/src/internals/mod.rs b/third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/src/internals/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/src/internals/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/src/internals/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/src/internals/name.rs b/third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/src/internals/name.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/src/internals/name.rs
rename to third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/src/internals/name.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/src/internals/receiver.rs b/third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/src/internals/receiver.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/src/internals/receiver.rs
rename to third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/src/internals/receiver.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/src/internals/respan.rs b/third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/src/internals/respan.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/src/internals/respan.rs
rename to third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/src/internals/respan.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/src/internals/symbol.rs b/third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/src/internals/symbol.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/src/internals/symbol.rs
rename to third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/src/internals/symbol.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/src/lib.rs b/third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/src/lib.rs
similarity index 97%
rename from third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/src/lib.rs
rename to third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/src/lib.rs
index 4d6a283..6b3f8600 100644
--- a/third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/src/lib.rs
+++ b/third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/src/lib.rs
@@ -13,7 +13,7 @@
 //!
 //! [https://serde.rs/derive.html]: https://serde.rs/derive.html
 
-#![doc(html_root_url = "https://docs.rs/serde_derive/1.0.216")]
+#![doc(html_root_url = "https://docs.rs/serde_derive/1.0.217")]
 #![cfg_attr(not(check_cfg), allow(unexpected_cfgs))]
 // Ignored clippy lints
 #![allow(
diff --git a/third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/src/pretend.rs b/third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/src/pretend.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/src/pretend.rs
rename to third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/src/pretend.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/src/ser.rs b/third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/src/ser.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/src/ser.rs
rename to third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/src/ser.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/src/this.rs b/third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/src/this.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/src/this.rs
rename to third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/src/this.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/.cargo_vcs_info.json b/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/.cargo_vcs_info.json
deleted file mode 100644
index 2da4343..0000000
--- a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/.cargo_vcs_info.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-  "git": {
-    "sha1": "53de985062cbdc99ba002ac85a7926d49d92e611"
-  },
-  "path_in_vcs": ""
-}
\ No newline at end of file
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/fixup.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/fixup.rs
deleted file mode 100644
index 58ed9e73..0000000
--- a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/fixup.rs
+++ /dev/null
@@ -1,347 +0,0 @@
-use crate::classify;
-use crate::expr::Expr;
-use crate::precedence::Precedence;
-
-pub(crate) struct FixupContext {
-    // Print expression such that it can be parsed back as a statement
-    // consisting of the original expression.
-    //
-    // The effect of this is for binary operators in statement position to set
-    // `leftmost_subexpression_in_stmt` when printing their left-hand operand.
-    //
-    //     (match x {}) - 1;  // match needs parens when LHS of binary operator
-    //
-    //     match x {};  // not when its own statement
-    //
-    #[cfg(feature = "full")]
-    stmt: bool,
-
-    // This is the difference between:
-    //
-    //     (match x {}) - 1;  // subexpression needs parens
-    //
-    //     let _ = match x {} - 1;  // no parens
-    //
-    // There are 3 distinguishable contexts in which `print_expr` might be
-    // called with the expression `$match` as its argument, where `$match`
-    // represents an expression of kind `ExprKind::Match`:
-    //
-    //   - stmt=false leftmost_subexpression_in_stmt=false
-    //
-    //     Example: `let _ = $match - 1;`
-    //
-    //     No parentheses required.
-    //
-    //   - stmt=false leftmost_subexpression_in_stmt=true
-    //
-    //     Example: `$match - 1;`
-    //
-    //     Must parenthesize `($match)`, otherwise parsing back the output as a
-    //     statement would terminate the statement after the closing brace of
-    //     the match, parsing `-1;` as a separate statement.
-    //
-    //   - stmt=true leftmost_subexpression_in_stmt=false
-    //
-    //     Example: `$match;`
-    //
-    //     No parentheses required.
-    #[cfg(feature = "full")]
-    leftmost_subexpression_in_stmt: bool,
-
-    // Print expression such that it can be parsed as a match arm.
-    //
-    // This is almost equivalent to `stmt`, but the grammar diverges a tiny bit
-    // between statements and match arms when it comes to braced macro calls.
-    // Macro calls with brace delimiter terminate a statement without a
-    // semicolon, but do not terminate a match-arm without comma.
-    //
-    //     m! {} - 1;  // two statements: a macro call followed by -1 literal
-    //
-    //     match () {
-    //         _ => m! {} - 1,  // binary subtraction operator
-    //     }
-    //
-    #[cfg(feature = "full")]
-    match_arm: bool,
-
-    // This is almost equivalent to `leftmost_subexpression_in_stmt`, other than
-    // for braced macro calls.
-    //
-    // If we have `m! {} - 1` as an expression, the leftmost subexpression
-    // `m! {}` will need to be parenthesized in the statement case but not the
-    // match-arm case.
-    //
-    //     (m! {}) - 1;  // subexpression needs parens
-    //
-    //     match () {
-    //         _ => m! {} - 1,  // no parens
-    //     }
-    //
-    #[cfg(feature = "full")]
-    leftmost_subexpression_in_match_arm: bool,
-
-    // This is the difference between:
-    //
-    //     if let _ = (Struct {}) {}  // needs parens
-    //
-    //     match () {
-    //         () if let _ = Struct {} => {}  // no parens
-    //     }
-    //
-    #[cfg(feature = "full")]
-    parenthesize_exterior_struct_lit: bool,
-
-    // This is the difference between:
-    //
-    //     let _ = 1 + return 1;  // no parens if rightmost subexpression
-    //
-    //     let _ = 1 + (return 1) + 1;  // needs parens
-    //
-    #[cfg(feature = "full")]
-    parenthesize_exterior_jump: bool,
-
-    // This is the difference between:
-    //
-    //     let _ = (return) - 1;  // without paren, this would return -1
-    //
-    //     let _ = return + 1;  // no paren because '+' cannot begin expr
-    //
-    #[cfg(feature = "full")]
-    next_operator_can_begin_expr: bool,
-
-    // This is the difference between:
-    //
-    //     let _ = x as u8 + T;
-    //
-    //     let _ = (x as u8) < T;
-    //
-    // Without parens, the latter would want to parse `u8<T...` as a type.
-    next_operator_can_begin_generics: bool,
-}
-
-impl FixupContext {
-    /// The default amount of fixing is minimal fixing. Fixups should be turned
-    /// on in a targeted fashion where needed.
-    pub const NONE: Self = FixupContext {
-        #[cfg(feature = "full")]
-        stmt: false,
-        #[cfg(feature = "full")]
-        leftmost_subexpression_in_stmt: false,
-        #[cfg(feature = "full")]
-        match_arm: false,
-        #[cfg(feature = "full")]
-        leftmost_subexpression_in_match_arm: false,
-        #[cfg(feature = "full")]
-        parenthesize_exterior_struct_lit: false,
-        #[cfg(feature = "full")]
-        parenthesize_exterior_jump: false,
-        #[cfg(feature = "full")]
-        next_operator_can_begin_expr: false,
-        next_operator_can_begin_generics: false,
-    };
-
-    /// Create the initial fixup for printing an expression in statement
-    /// position.
-    #[cfg(feature = "full")]
-    pub fn new_stmt() -> Self {
-        FixupContext {
-            stmt: true,
-            ..FixupContext::NONE
-        }
-    }
-
-    /// Create the initial fixup for printing an expression as the right-hand
-    /// side of a match arm.
-    #[cfg(feature = "full")]
-    pub fn new_match_arm() -> Self {
-        FixupContext {
-            match_arm: true,
-            ..FixupContext::NONE
-        }
-    }
-
-    /// Create the initial fixup for printing an expression as the "condition"
-    /// of an `if` or `while`. There are a few other positions which are
-    /// grammatically equivalent and also use this, such as the iterator
-    /// expression in `for` and the scrutinee in `match`.
-    #[cfg(feature = "full")]
-    pub fn new_condition() -> Self {
-        FixupContext {
-            parenthesize_exterior_struct_lit: true,
-            ..FixupContext::NONE
-        }
-    }
-
-    /// Transform this fixup into the one that should apply when printing the
-    /// leftmost subexpression of the current expression.
-    ///
-    /// The leftmost subexpression is any subexpression that has the same first
-    /// token as the current expression, but has a different last token.
-    ///
-    /// For example in `$a + $b` and `$a.method()`, the subexpression `$a` is a
-    /// leftmost subexpression.
-    ///
-    /// Not every expression has a leftmost subexpression. For example neither
-    /// `-$a` nor `[$a]` have one.
-    pub fn leftmost_subexpression(self) -> Self {
-        FixupContext {
-            #[cfg(feature = "full")]
-            stmt: false,
-            #[cfg(feature = "full")]
-            leftmost_subexpression_in_stmt: self.stmt || self.leftmost_subexpression_in_stmt,
-            #[cfg(feature = "full")]
-            match_arm: false,
-            #[cfg(feature = "full")]
-            leftmost_subexpression_in_match_arm: self.match_arm
-                || self.leftmost_subexpression_in_match_arm,
-            #[cfg(feature = "full")]
-            parenthesize_exterior_jump: true,
-            ..self
-        }
-    }
-
-    /// Transform this fixup into the one that should apply when printing a
-    /// leftmost subexpression followed by a `.` or `?` token, which confer
-    /// different statement boundary rules compared to other leftmost
-    /// subexpressions.
-    pub fn leftmost_subexpression_with_dot(self) -> Self {
-        FixupContext {
-            #[cfg(feature = "full")]
-            stmt: self.stmt || self.leftmost_subexpression_in_stmt,
-            #[cfg(feature = "full")]
-            leftmost_subexpression_in_stmt: false,
-            #[cfg(feature = "full")]
-            match_arm: self.match_arm || self.leftmost_subexpression_in_match_arm,
-            #[cfg(feature = "full")]
-            leftmost_subexpression_in_match_arm: false,
-            #[cfg(feature = "full")]
-            parenthesize_exterior_jump: true,
-            ..self
-        }
-    }
-
-    /// Transform this fixup into the one that should apply when printing a
-    /// leftmost subexpression followed by punctuation that is legal as the
-    /// first token of an expression.
-    pub fn leftmost_subexpression_with_begin_operator(
-        self,
-        #[cfg(feature = "full")] next_operator_can_begin_expr: bool,
-        next_operator_can_begin_generics: bool,
-    ) -> Self {
-        FixupContext {
-            #[cfg(feature = "full")]
-            next_operator_can_begin_expr,
-            next_operator_can_begin_generics,
-            ..self.leftmost_subexpression()
-        }
-    }
-
-    /// Transform this fixup into the one that should apply when printing any
-    /// subexpression that is neither a leftmost subexpression nor surrounded in
-    /// delimiters.
-    ///
-    /// This is for any subexpression that has a different first token than the
-    /// current expression, and is not surrounded by a paren/bracket/brace. For
-    /// example the `$b` in `$a + $b` and `-$b`, but not the one in `[$b]` or
-    /// `$a.f($b)`.
-    pub fn subsequent_subexpression(self) -> Self {
-        FixupContext {
-            #[cfg(feature = "full")]
-            stmt: false,
-            #[cfg(feature = "full")]
-            leftmost_subexpression_in_stmt: false,
-            #[cfg(feature = "full")]
-            match_arm: false,
-            #[cfg(feature = "full")]
-            leftmost_subexpression_in_match_arm: false,
-            ..self
-        }
-    }
-
-    /// Determine whether parentheses are needed around the given expression to
-    /// head off an unintended statement boundary.
-    ///
-    /// The documentation on `FixupContext::leftmost_subexpression_in_stmt` has
-    /// examples.
-    #[cfg(feature = "full")]
-    pub fn would_cause_statement_boundary(self, expr: &Expr) -> bool {
-        (self.leftmost_subexpression_in_stmt && !classify::requires_semi_to_be_stmt(expr))
-            || ((self.stmt || self.leftmost_subexpression_in_stmt) && matches!(expr, Expr::Let(_)))
-            || (self.leftmost_subexpression_in_match_arm
-                && !classify::requires_comma_to_be_match_arm(expr))
-    }
-
-    /// Determine whether parentheses are needed around the given `let`
-    /// scrutinee.
-    ///
-    /// In `if let _ = $e {}`, some examples of `$e` that would need parentheses
-    /// are:
-    ///
-    ///   - `Struct {}.f()`, because otherwise the `{` would be misinterpreted
-    ///     as the opening of the if's then-block.
-    ///
-    ///   - `true && false`, because otherwise this would be misinterpreted as a
-    ///     "let chain".
-    #[cfg(feature = "full")]
-    pub fn needs_group_as_let_scrutinee(self, expr: &Expr) -> bool {
-        self.parenthesize_exterior_struct_lit && classify::confusable_with_adjacent_block(expr)
-            || self.trailing_precedence(expr) < Precedence::Let
-    }
-
-    /// Determines the effective precedence of a left subexpression. Some
-    /// expressions have lower precedence when adjacent to particular operators.
-    pub fn leading_precedence(self, expr: &Expr) -> Precedence {
-        #[cfg(feature = "full")]
-        if self.next_operator_can_begin_expr {
-            // Decrease precedence of value-less jumps when followed by an
-            // operator that would otherwise get interpreted as beginning a
-            // value for the jump.
-            if let Expr::Break(_) | Expr::Return(_) | Expr::Yield(_) = expr {
-                return Precedence::Jump;
-            }
-        }
-        self.precedence(expr)
-    }
-
-    /// Determines the effective precedence of a right subexpression. Some
-    /// expressions have higher precedence on the right side of a binary
-    /// operator than on the left.
-    pub fn trailing_precedence(self, expr: &Expr) -> Precedence {
-        #[cfg(feature = "full")]
-        if !self.parenthesize_exterior_jump {
-            match expr {
-                // Increase precedence of expressions that extend to the end of
-                // current statement or group.
-                Expr::Break(_)
-                | Expr::Closure(_)
-                | Expr::Let(_)
-                | Expr::Return(_)
-                | Expr::Yield(_) => {
-                    return Precedence::Prefix;
-                }
-                Expr::Range(e) if e.start.is_none() => return Precedence::Prefix,
-                _ => {}
-            }
-        }
-        self.precedence(expr)
-    }
-
-    fn precedence(self, expr: &Expr) -> Precedence {
-        if self.next_operator_can_begin_generics {
-            if let Expr::Cast(cast) = expr {
-                if classify::trailing_unparameterized_path(&cast.ty) {
-                    return Precedence::MIN;
-                }
-            }
-        }
-        Precedence::of(expr)
-    }
-}
-
-impl Copy for FixupContext {}
-
-impl Clone for FixupContext {
-    fn clone(&self) -> Self {
-        *self
-    }
-}
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/test_expr.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/test_expr.rs
deleted file mode 100644
index 03ebd1d..0000000
--- a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/test_expr.rs
+++ /dev/null
@@ -1,724 +0,0 @@
-#![allow(
-    clippy::needless_lifetimes,
-    clippy::single_element_loop,
-    clippy::uninlined_format_args
-)]
-
-#[macro_use]
-mod macros;
-
-use proc_macro2::{Delimiter, Group};
-use quote::{quote, ToTokens as _};
-use std::mem;
-use syn::punctuated::Punctuated;
-use syn::visit_mut::{self, VisitMut};
-use syn::{parse_quote, token, Expr, ExprRange, ExprTuple, Stmt, Token};
-
-#[test]
-fn test_expr_parse() {
-    let tokens = quote!(..100u32);
-    snapshot!(tokens as Expr, @r#"
-    Expr::Range {
-        limits: RangeLimits::HalfOpen,
-        end: Some(Expr::Lit {
-            lit: 100u32,
-        }),
-    }
-    "#);
-
-    let tokens = quote!(..100u32);
-    snapshot!(tokens as ExprRange, @r#"
-    ExprRange {
-        limits: RangeLimits::HalfOpen,
-        end: Some(Expr::Lit {
-            lit: 100u32,
-        }),
-    }
-    "#);
-}
-
-#[test]
-fn test_await() {
-    // Must not parse as Expr::Field.
-    let tokens = quote!(fut.await);
-
-    snapshot!(tokens as Expr, @r#"
-    Expr::Await {
-        base: Expr::Path {
-            path: Path {
-                segments: [
-                    PathSegment {
-                        ident: "fut",
-                    },
-                ],
-            },
-        },
-    }
-    "#);
-}
-
-#[rustfmt::skip]
-#[test]
-fn test_tuple_multi_index() {
-    let expected = snapshot!("tuple.0.0" as Expr, @r#"
-    Expr::Field {
-        base: Expr::Field {
-            base: Expr::Path {
-                path: Path {
-                    segments: [
-                        PathSegment {
-                            ident: "tuple",
-                        },
-                    ],
-                },
-            },
-            member: Member::Unnamed(Index {
-                index: 0,
-            }),
-        },
-        member: Member::Unnamed(Index {
-            index: 0,
-        }),
-    }
-    "#);
-
-    for &input in &[
-        "tuple .0.0",
-        "tuple. 0.0",
-        "tuple.0 .0",
-        "tuple.0. 0",
-        "tuple . 0 . 0",
-    ] {
-        assert_eq!(expected, syn::parse_str(input).unwrap());
-    }
-
-    for tokens in [
-        quote!(tuple.0.0),
-        quote!(tuple .0.0),
-        quote!(tuple. 0.0),
-        quote!(tuple.0 .0),
-        quote!(tuple.0. 0),
-        quote!(tuple . 0 . 0),
-    ] {
-        assert_eq!(expected, syn::parse2(tokens).unwrap());
-    }
-}
-
-#[test]
-fn test_macro_variable_func() {
-    // mimics the token stream corresponding to `$fn()`
-    let path = Group::new(Delimiter::None, quote!(f));
-    let tokens = quote!(#path());
-
-    snapshot!(tokens as Expr, @r#"
-    Expr::Call {
-        func: Expr::Group {
-            expr: Expr::Path {
-                path: Path {
-                    segments: [
-                        PathSegment {
-                            ident: "f",
-                        },
-                    ],
-                },
-            },
-        },
-    }
-    "#);
-
-    let path = Group::new(Delimiter::None, quote! { #[inside] f });
-    let tokens = quote!(#[outside] #path());
-
-    snapshot!(tokens as Expr, @r#"
-    Expr::Call {
-        attrs: [
-            Attribute {
-                style: AttrStyle::Outer,
-                meta: Meta::Path {
-                    segments: [
-                        PathSegment {
-                            ident: "outside",
-                        },
-                    ],
-                },
-            },
-        ],
-        func: Expr::Group {
-            expr: Expr::Path {
-                attrs: [
-                    Attribute {
-                        style: AttrStyle::Outer,
-                        meta: Meta::Path {
-                            segments: [
-                                PathSegment {
-                                    ident: "inside",
-                                },
-                            ],
-                        },
-                    },
-                ],
-                path: Path {
-                    segments: [
-                        PathSegment {
-                            ident: "f",
-                        },
-                    ],
-                },
-            },
-        },
-    }
-    "#);
-}
-
-#[test]
-fn test_macro_variable_macro() {
-    // mimics the token stream corresponding to `$macro!()`
-    let mac = Group::new(Delimiter::None, quote!(m));
-    let tokens = quote!(#mac!());
-
-    snapshot!(tokens as Expr, @r#"
-    Expr::Macro {
-        mac: Macro {
-            path: Path {
-                segments: [
-                    PathSegment {
-                        ident: "m",
-                    },
-                ],
-            },
-            delimiter: MacroDelimiter::Paren,
-            tokens: TokenStream(``),
-        },
-    }
-    "#);
-}
-
-#[test]
-fn test_macro_variable_struct() {
-    // mimics the token stream corresponding to `$struct {}`
-    let s = Group::new(Delimiter::None, quote! { S });
-    let tokens = quote!(#s {});
-
-    snapshot!(tokens as Expr, @r#"
-    Expr::Struct {
-        path: Path {
-            segments: [
-                PathSegment {
-                    ident: "S",
-                },
-            ],
-        },
-    }
-    "#);
-}
-
-#[test]
-fn test_macro_variable_unary() {
-    // mimics the token stream corresponding to `$expr.method()` where expr is `&self`
-    let inner = Group::new(Delimiter::None, quote!(&self));
-    let tokens = quote!(#inner.method());
-    snapshot!(tokens as Expr, @r#"
-    Expr::MethodCall {
-        receiver: Expr::Group {
-            expr: Expr::Reference {
-                expr: Expr::Path {
-                    path: Path {
-                        segments: [
-                            PathSegment {
-                                ident: "self",
-                            },
-                        ],
-                    },
-                },
-            },
-        },
-        method: "method",
-    }
-    "#);
-}
-
-#[test]
-fn test_macro_variable_match_arm() {
-    // mimics the token stream corresponding to `match v { _ => $expr }`
-    let expr = Group::new(Delimiter::None, quote! { #[a] () });
-    let tokens = quote!(match v { _ => #expr });
-    snapshot!(tokens as Expr, @r#"
-    Expr::Match {
-        expr: Expr::Path {
-            path: Path {
-                segments: [
-                    PathSegment {
-                        ident: "v",
-                    },
-                ],
-            },
-        },
-        arms: [
-            Arm {
-                pat: Pat::Wild,
-                body: Expr::Group {
-                    expr: Expr::Tuple {
-                        attrs: [
-                            Attribute {
-                                style: AttrStyle::Outer,
-                                meta: Meta::Path {
-                                    segments: [
-                                        PathSegment {
-                                            ident: "a",
-                                        },
-                                    ],
-                                },
-                            },
-                        ],
-                    },
-                },
-            },
-        ],
-    }
-    "#);
-
-    let expr = Group::new(Delimiter::None, quote!(loop {} + 1));
-    let tokens = quote!(match v { _ => #expr });
-    snapshot!(tokens as Expr, @r#"
-    Expr::Match {
-        expr: Expr::Path {
-            path: Path {
-                segments: [
-                    PathSegment {
-                        ident: "v",
-                    },
-                ],
-            },
-        },
-        arms: [
-            Arm {
-                pat: Pat::Wild,
-                body: Expr::Group {
-                    expr: Expr::Binary {
-                        left: Expr::Loop {
-                            body: Block {
-                                stmts: [],
-                            },
-                        },
-                        op: BinOp::Add,
-                        right: Expr::Lit {
-                            lit: 1,
-                        },
-                    },
-                },
-            },
-        ],
-    }
-    "#);
-}
-
-// https://github.com/dtolnay/syn/issues/1019
-#[test]
-fn test_closure_vs_rangefull() {
-    #[rustfmt::skip] // rustfmt bug: https://github.com/rust-lang/rustfmt/issues/4808
-    let tokens = quote!(|| .. .method());
-    snapshot!(tokens as Expr, @r#"
-    Expr::MethodCall {
-        receiver: Expr::Closure {
-            output: ReturnType::Default,
-            body: Expr::Range {
-                limits: RangeLimits::HalfOpen,
-            },
-        },
-        method: "method",
-    }
-    "#);
-}
-
-#[test]
-fn test_postfix_operator_after_cast() {
-    syn::parse_str::<Expr>("|| &x as T[0]").unwrap_err();
-    syn::parse_str::<Expr>("|| () as ()()").unwrap_err();
-}
-
-#[test]
-fn test_range_kinds() {
-    syn::parse_str::<Expr>("..").unwrap();
-    syn::parse_str::<Expr>("..hi").unwrap();
-    syn::parse_str::<Expr>("lo..").unwrap();
-    syn::parse_str::<Expr>("lo..hi").unwrap();
-
-    syn::parse_str::<Expr>("..=").unwrap_err();
-    syn::parse_str::<Expr>("..=hi").unwrap();
-    syn::parse_str::<Expr>("lo..=").unwrap_err();
-    syn::parse_str::<Expr>("lo..=hi").unwrap();
-
-    syn::parse_str::<Expr>("...").unwrap_err();
-    syn::parse_str::<Expr>("...hi").unwrap_err();
-    syn::parse_str::<Expr>("lo...").unwrap_err();
-    syn::parse_str::<Expr>("lo...hi").unwrap_err();
-}
-
-#[test]
-fn test_range_precedence() {
-    snapshot!(".. .." as Expr, @r#"
-    Expr::Range {
-        limits: RangeLimits::HalfOpen,
-        end: Some(Expr::Range {
-            limits: RangeLimits::HalfOpen,
-        }),
-    }
-    "#);
-
-    snapshot!(".. .. ()" as Expr, @r#"
-    Expr::Range {
-        limits: RangeLimits::HalfOpen,
-        end: Some(Expr::Range {
-            limits: RangeLimits::HalfOpen,
-            end: Some(Expr::Tuple),
-        }),
-    }
-    "#);
-
-    snapshot!("() .. .." as Expr, @r#"
-    Expr::Range {
-        start: Some(Expr::Tuple),
-        limits: RangeLimits::HalfOpen,
-        end: Some(Expr::Range {
-            limits: RangeLimits::HalfOpen,
-        }),
-    }
-    "#);
-
-    // A range with a lower bound cannot be the upper bound of another range,
-    // and a range with an upper bound cannot be the lower bound of another
-    // range.
-    syn::parse_str::<Expr>(".. x ..").unwrap_err();
-    syn::parse_str::<Expr>("x .. x ..").unwrap_err();
-}
-
-#[test]
-fn test_ambiguous_label() {
-    for stmt in [
-        quote! {
-            return 'label: loop { break 'label 42; };
-        },
-        quote! {
-            break ('label: loop { break 'label 42; });
-        },
-        quote! {
-            break 1 + 'label: loop { break 'label 42; };
-        },
-        quote! {
-            break 'outer 'inner: loop { break 'inner 42; };
-        },
-    ] {
-        syn::parse2::<Stmt>(stmt).unwrap();
-    }
-
-    for stmt in [
-        // Parentheses required. See https://github.com/rust-lang/rust/pull/87026.
-        quote! {
-            break 'label: loop { break 'label 42; };
-        },
-    ] {
-        syn::parse2::<Stmt>(stmt).unwrap_err();
-    }
-}
-
-#[test]
-fn test_extended_interpolated_path() {
-    let path = Group::new(Delimiter::None, quote!(a::b));
-
-    let tokens = quote!(if #path {});
-    snapshot!(tokens as Expr, @r#"
-    Expr::If {
-        cond: Expr::Group {
-            expr: Expr::Path {
-                path: Path {
-                    segments: [
-                        PathSegment {
-                            ident: "a",
-                        },
-                        Token![::],
-                        PathSegment {
-                            ident: "b",
-                        },
-                    ],
-                },
-            },
-        },
-        then_branch: Block {
-            stmts: [],
-        },
-    }
-    "#);
-
-    let tokens = quote!(#path {});
-    snapshot!(tokens as Expr, @r#"
-    Expr::Struct {
-        path: Path {
-            segments: [
-                PathSegment {
-                    ident: "a",
-                },
-                Token![::],
-                PathSegment {
-                    ident: "b",
-                },
-            ],
-        },
-    }
-    "#);
-
-    let tokens = quote!(#path :: c);
-    snapshot!(tokens as Expr, @r#"
-    Expr::Path {
-        path: Path {
-            segments: [
-                PathSegment {
-                    ident: "a",
-                },
-                Token![::],
-                PathSegment {
-                    ident: "b",
-                },
-                Token![::],
-                PathSegment {
-                    ident: "c",
-                },
-            ],
-        },
-    }
-    "#);
-
-    let nested = Group::new(Delimiter::None, quote!(a::b || true));
-    let tokens = quote!(if #nested && false {});
-    snapshot!(tokens as Expr, @r#"
-    Expr::If {
-        cond: Expr::Binary {
-            left: Expr::Group {
-                expr: Expr::Binary {
-                    left: Expr::Path {
-                        path: Path {
-                            segments: [
-                                PathSegment {
-                                    ident: "a",
-                                },
-                                Token![::],
-                                PathSegment {
-                                    ident: "b",
-                                },
-                            ],
-                        },
-                    },
-                    op: BinOp::Or,
-                    right: Expr::Lit {
-                        lit: Lit::Bool {
-                            value: true,
-                        },
-                    },
-                },
-            },
-            op: BinOp::And,
-            right: Expr::Lit {
-                lit: Lit::Bool {
-                    value: false,
-                },
-            },
-        },
-        then_branch: Block {
-            stmts: [],
-        },
-    }
-    "#);
-}
-
-#[test]
-fn test_tuple_comma() {
-    let mut expr = ExprTuple {
-        attrs: Vec::new(),
-        paren_token: token::Paren::default(),
-        elems: Punctuated::new(),
-    };
-    snapshot!(expr.to_token_stream() as Expr, @"Expr::Tuple");
-
-    expr.elems.push_value(parse_quote!(continue));
-    // Must not parse to Expr::Paren
-    snapshot!(expr.to_token_stream() as Expr, @r#"
-    Expr::Tuple {
-        elems: [
-            Expr::Continue,
-            Token![,],
-        ],
-    }
-    "#);
-
-    expr.elems.push_punct(<Token![,]>::default());
-    snapshot!(expr.to_token_stream() as Expr, @r#"
-    Expr::Tuple {
-        elems: [
-            Expr::Continue,
-            Token![,],
-        ],
-    }
-    "#);
-
-    expr.elems.push_value(parse_quote!(continue));
-    snapshot!(expr.to_token_stream() as Expr, @r#"
-    Expr::Tuple {
-        elems: [
-            Expr::Continue,
-            Token![,],
-            Expr::Continue,
-        ],
-    }
-    "#);
-
-    expr.elems.push_punct(<Token![,]>::default());
-    snapshot!(expr.to_token_stream() as Expr, @r#"
-    Expr::Tuple {
-        elems: [
-            Expr::Continue,
-            Token![,],
-            Expr::Continue,
-            Token![,],
-        ],
-    }
-    "#);
-}
-
-#[test]
-fn test_binop_associativity() {
-    // Left to right.
-    snapshot!("() + () + ()" as Expr, @r#"
-    Expr::Binary {
-        left: Expr::Binary {
-            left: Expr::Tuple,
-            op: BinOp::Add,
-            right: Expr::Tuple,
-        },
-        op: BinOp::Add,
-        right: Expr::Tuple,
-    }
-    "#);
-
-    // Right to left.
-    snapshot!("() += () += ()" as Expr, @r#"
-    Expr::Binary {
-        left: Expr::Tuple,
-        op: BinOp::AddAssign,
-        right: Expr::Binary {
-            left: Expr::Tuple,
-            op: BinOp::AddAssign,
-            right: Expr::Tuple,
-        },
-    }
-    "#);
-
-    // Parenthesization is required.
-    syn::parse_str::<Expr>("() == () == ()").unwrap_err();
-}
-
-#[test]
-fn test_assign_range_precedence() {
-    // Range has higher precedence as the right-hand of an assignment, but
-    // ambiguous precedence as the left-hand of an assignment.
-    snapshot!("() = () .. ()" as Expr, @r#"
-    Expr::Assign {
-        left: Expr::Tuple,
-        right: Expr::Range {
-            start: Some(Expr::Tuple),
-            limits: RangeLimits::HalfOpen,
-            end: Some(Expr::Tuple),
-        },
-    }
-    "#);
-
-    snapshot!("() += () .. ()" as Expr, @r#"
-    Expr::Binary {
-        left: Expr::Tuple,
-        op: BinOp::AddAssign,
-        right: Expr::Range {
-            start: Some(Expr::Tuple),
-            limits: RangeLimits::HalfOpen,
-            end: Some(Expr::Tuple),
-        },
-    }
-    "#);
-
-    syn::parse_str::<Expr>("() .. () = ()").unwrap_err();
-    syn::parse_str::<Expr>("() .. () += ()").unwrap_err();
-}
-
-#[test]
-fn test_chained_comparison() {
-    // https://github.com/dtolnay/syn/issues/1738
-    let _ = syn::parse_str::<Expr>("a = a < a <");
-    let _ = syn::parse_str::<Expr>("a = a .. a ..");
-    let _ = syn::parse_str::<Expr>("a = a .. a +=");
-
-    let err = syn::parse_str::<Expr>("a < a < a").unwrap_err();
-    assert_eq!("comparison operators cannot be chained", err.to_string());
-
-    let err = syn::parse_str::<Expr>("a .. a .. a").unwrap_err();
-    assert_eq!("unexpected token", err.to_string());
-
-    let err = syn::parse_str::<Expr>("a .. a += a").unwrap_err();
-    assert_eq!("unexpected token", err.to_string());
-}
-
-#[test]
-fn test_fixup() {
-    struct FlattenParens;
-
-    impl VisitMut for FlattenParens {
-        fn visit_expr_mut(&mut self, e: &mut Expr) {
-            while let Expr::Paren(paren) = e {
-                *e = mem::replace(&mut *paren.expr, Expr::PLACEHOLDER);
-            }
-            visit_mut::visit_expr_mut(self, e);
-        }
-    }
-
-    for tokens in [
-        quote! { 2 * (1 + 1) },
-        quote! { 0 + (0 + 0) },
-        quote! { (a = b) = c },
-        quote! { (x as i32) < 0 },
-        quote! { 1 + (x as i32) < 0 },
-        quote! { (1 + 1).abs() },
-        quote! { (lo..hi)[..] },
-        quote! { (a..b)..(c..d) },
-        quote! { (&mut fut).await },
-        quote! { &mut (x as i32) },
-        quote! { -(x as i32) },
-        quote! { if (S {} == 1) {} },
-        quote! { { (m! {}) - 1 } },
-        quote! { match m { _ => ({}) - 1 } },
-        quote! { if let _ = (a && b) && c {} },
-        quote! { if let _ = (S {}) {} },
-        quote! { break ('a: loop { break 'a 1 } + 1) },
-        quote! { a + (|| b) + c },
-        quote! { if let _ = ((break) - 1 || true) {} },
-        quote! { if let _ = (break + 1 || true) {} },
-        quote! { (break)() },
-        quote! { (..) = () },
-        quote! { (..) += () },
-        quote! { (1 < 2) == (3 < 4) },
-        quote! { { (let _ = ()) } },
-        quote! { (#[attr] thing).field },
-        quote! { (self.f)() },
-    ] {
-        let original: Expr = syn::parse2(tokens).unwrap();
-
-        let mut flat = original.clone();
-        FlattenParens.visit_expr_mut(&mut flat);
-        let reconstructed: Expr = match syn::parse2(flat.to_token_stream()) {
-            Ok(reconstructed) => reconstructed,
-            Err(err) => panic!("failed to parse `{}`: {}", flat.to_token_stream(), err),
-        };
-
-        assert!(
-            original == reconstructed,
-            "original: {}\nreconstructed: {}",
-            original.to_token_stream(),
-            reconstructed.to_token_stream(),
-        );
-    }
-}
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/test_unparenthesize.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/test_unparenthesize.rs
deleted file mode 100644
index 5e155bf..0000000
--- a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/test_unparenthesize.rs
+++ /dev/null
@@ -1,109 +0,0 @@
-#![cfg(not(miri))]
-#![allow(
-    clippy::manual_assert,
-    clippy::needless_lifetimes,
-    clippy::uninlined_format_args
-)]
-
-use quote::ToTokens as _;
-use std::fs;
-use std::mem;
-use std::panic;
-use std::path::Path;
-use std::sync::atomic::{AtomicUsize, Ordering};
-use syn::visit_mut::{self, VisitMut};
-use syn::{Expr, Generics, LifetimeParam, TypeParam};
-
-#[macro_use]
-mod macros;
-
-mod repo;
-
-#[test]
-fn test_unparenthesize() {
-    repo::rayon_init();
-    repo::clone_rust();
-
-    let failed = AtomicUsize::new(0);
-
-    repo::for_each_rust_file(|path| test(path, &failed));
-
-    let failed = failed.into_inner();
-    if failed > 0 {
-        panic!("{} failures", failed);
-    }
-}
-
-struct FlattenParens;
-
-impl VisitMut for FlattenParens {
-    fn visit_expr_mut(&mut self, e: &mut Expr) {
-        while let Expr::Paren(paren) = e {
-            *e = mem::replace(&mut *paren.expr, Expr::PLACEHOLDER);
-        }
-        visit_mut::visit_expr_mut(self, e);
-    }
-}
-
-struct AsIfPrinted;
-
-impl VisitMut for AsIfPrinted {
-    fn visit_generics_mut(&mut self, generics: &mut Generics) {
-        if generics.params.is_empty() {
-            generics.lt_token = None;
-            generics.gt_token = None;
-        }
-        if let Some(where_clause) = &generics.where_clause {
-            if where_clause.predicates.is_empty() {
-                generics.where_clause = None;
-            }
-        }
-        visit_mut::visit_generics_mut(self, generics);
-    }
-
-    fn visit_lifetime_param_mut(&mut self, param: &mut LifetimeParam) {
-        if param.bounds.is_empty() {
-            param.colon_token = None;
-        }
-        visit_mut::visit_lifetime_param_mut(self, param);
-    }
-
-    fn visit_type_param_mut(&mut self, param: &mut TypeParam) {
-        if param.bounds.is_empty() {
-            param.colon_token = None;
-        }
-        visit_mut::visit_type_param_mut(self, param);
-    }
-}
-
-fn test(path: &Path, failed: &AtomicUsize) {
-    let content = fs::read_to_string(path).unwrap();
-
-    match panic::catch_unwind(|| -> syn::Result<()> {
-        let mut before = syn::parse_file(&content)?;
-        before.shebang = None;
-        FlattenParens.visit_file_mut(&mut before);
-        let printed = before.to_token_stream();
-        let mut after = syn::parse2::<syn::File>(printed.clone())?;
-        FlattenParens.visit_file_mut(&mut after);
-        // Normalize features that we expect Syn not to print.
-        AsIfPrinted.visit_file_mut(&mut before);
-        if before != after {
-            errorf!("=== {}\n", path.display());
-            if failed.fetch_add(1, Ordering::Relaxed) == 0 {
-                errorf!("BEFORE:\n{:#?}\nAFTER:\n{:#?}\n", before, after);
-            }
-        }
-        Ok(())
-    }) {
-        Err(_) => {
-            errorf!("=== {}: syn panic\n", path.display());
-            failed.fetch_add(1, Ordering::Relaxed);
-        }
-        Ok(Err(msg)) => {
-            errorf!("=== {}: syn failed to parse\n{:?}\n", path.display(), msg);
-            failed.fetch_add(1, Ordering::Relaxed);
-        }
-        Ok(Ok(())) => {}
-    }
-}
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/.cargo-checksum.json b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/.cargo-checksum.json
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/.cargo-checksum.json
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/.cargo-checksum.json
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/.cargo_vcs_info.json b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/.cargo_vcs_info.json
new file mode 100644
index 0000000..9fa848c
--- /dev/null
+++ b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/.cargo_vcs_info.json
@@ -0,0 +1,6 @@
+{
+  "git": {
+    "sha1": "c7b76389008415d7b7634a3265bc8453f994275b"
+  },
+  "path_in_vcs": ""
+}
\ No newline at end of file
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/Cargo.lock b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/Cargo.lock
similarity index 96%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/Cargo.lock
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/Cargo.lock
index 6f8759e..ebe4e0b 100644
--- a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/Cargo.lock
+++ b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/Cargo.lock
@@ -19,9 +19,9 @@
 
 [[package]]
 name = "anyhow"
-version = "1.0.94"
+version = "1.0.95"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c1fd03a028ef38ba2276dce7e33fcd6369c158a1bca17946c4b1b701891c1ff7"
+checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04"
 
 [[package]]
 name = "atomic-waker"
@@ -43,7 +43,7 @@
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.90",
+ "syn 2.0.94",
 ]
 
 [[package]]
@@ -87,9 +87,9 @@
 
 [[package]]
 name = "cc"
-version = "1.2.5"
+version = "1.2.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c31a0499c1dc64f458ad13872de75c0eb7e3fdb0e67964610c914b034fc5956e"
+checksum = "a012a0df96dd6d06ba9a1b29d6402d1a5d77c6befd2566afdc26e10603dc93d7"
 dependencies = [
  "shlex",
 ]
@@ -170,7 +170,7 @@
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.90",
+ "syn 2.0.94",
 ]
 
 [[package]]
@@ -587,7 +587,7 @@
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.90",
+ "syn 2.0.94",
 ]
 
 [[package]]
@@ -623,13 +623,13 @@
 
 [[package]]
 name = "insta"
-version = "1.41.1"
+version = "1.42.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7e9ffc4d4892617c50a928c52b2961cb5174b6fc6ebf252b2fac9d21955c48b8"
+checksum = "6513e4067e16e69ed1db5ab56048ed65db32d10ba5fc1217f5393f8f17d8b5a5"
 dependencies = [
  "console",
- "lazy_static",
  "linked-hash-map",
+ "once_cell",
  "similar",
 ]
 
@@ -656,12 +656,6 @@
 ]
 
 [[package]]
-name = "lazy_static"
-version = "1.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
-
-[[package]]
 name = "libc"
 version = "0.2.169"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -789,7 +783,7 @@
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.90",
+ "syn 2.0.94",
 ]
 
 [[package]]
@@ -845,9 +839,9 @@
 
 [[package]]
 name = "quote"
-version = "1.0.37"
+version = "1.0.38"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af"
+checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc"
 dependencies = [
  "proc-macro2",
 ]
@@ -898,14 +892,14 @@
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.90",
+ "syn 2.0.94",
 ]
 
 [[package]]
 name = "reqwest"
-version = "0.12.9"
+version = "0.12.12"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a77c62af46e79de0a562e1a9849205ffcb7fc1238876e9bd743357570e04046f"
+checksum = "43e734407157c3c2034e0258f5e4473ddb361b1e85f95a66690d67264d7cd1da"
 dependencies = [
  "base64",
  "bytes",
@@ -937,6 +931,7 @@
  "system-configuration",
  "tokio",
  "tokio-native-tls",
+ "tower",
  "tower-service",
  "url",
  "wasm-bindgen",
@@ -1020,9 +1015,9 @@
 
 [[package]]
 name = "rustversion"
-version = "1.0.18"
+version = "1.0.19"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248"
+checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4"
 
 [[package]]
 name = "ryu"
@@ -1073,22 +1068,22 @@
 
 [[package]]
 name = "serde"
-version = "1.0.216"
+version = "1.0.217"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0b9781016e935a97e8beecf0c933758c97a5520d32930e460142b4cd80c6338e"
+checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70"
 dependencies = [
  "serde_derive",
 ]
 
 [[package]]
 name = "serde_derive"
-version = "1.0.216"
+version = "1.0.217"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "46f859dbbf73865c6627ed570e78961cd3ac92407a2d117204c49232485da55e"
+checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.90",
+ "syn 2.0.94",
 ]
 
 [[package]]
@@ -1172,9 +1167,9 @@
 
 [[package]]
 name = "syn"
-version = "2.0.90"
+version = "2.0.94"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31"
+checksum = "987bc0be1cdea8b10216bd06e2ca407d40b9543468fafd3ddfb02f36e77f71f3"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -1183,7 +1178,7 @@
 
 [[package]]
 name = "syn"
-version = "2.0.91"
+version = "2.0.95"
 dependencies = [
  "anyhow",
  "automod",
@@ -1225,7 +1220,7 @@
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.90",
+ "syn 2.0.94",
 ]
 
 [[package]]
@@ -1262,12 +1257,13 @@
 
 [[package]]
 name = "tempfile"
-version = "3.14.0"
+version = "3.15.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c"
+checksum = "9a8a559c81686f576e8cd0290cd2a24a2a9ad80c98b3478856500fcbd7acd704"
 dependencies = [
  "cfg-if",
  "fastrand",
+ "getrandom",
  "once_cell",
  "rustix",
  "windows-sys 0.59.0",
@@ -1341,6 +1337,27 @@
 ]
 
 [[package]]
+name = "tower"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9"
+dependencies = [
+ "futures-core",
+ "futures-util",
+ "pin-project-lite",
+ "sync_wrapper",
+ "tokio",
+ "tower-layer",
+ "tower-service",
+]
+
+[[package]]
+name = "tower-layer"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e"
+
+[[package]]
 name = "tower-service"
 version = "0.3.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1458,7 +1475,7 @@
  "log",
  "proc-macro2",
  "quote",
- "syn 2.0.90",
+ "syn 2.0.94",
  "wasm-bindgen-shared",
 ]
 
@@ -1493,7 +1510,7 @@
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.90",
+ "syn 2.0.94",
  "wasm-bindgen-backend",
  "wasm-bindgen-shared",
 ]
@@ -1678,7 +1695,7 @@
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.90",
+ "syn 2.0.94",
  "synstructure",
 ]
 
@@ -1699,7 +1716,7 @@
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.90",
+ "syn 2.0.94",
  "synstructure",
 ]
 
@@ -1728,5 +1745,5 @@
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.90",
+ "syn 2.0.94",
 ]
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/Cargo.toml b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/Cargo.toml
similarity index 99%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/Cargo.toml
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/Cargo.toml
index a7a2d001..99cbf73e 100644
--- a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/Cargo.toml
+++ b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/Cargo.toml
@@ -13,7 +13,7 @@
 edition = "2021"
 rust-version = "1.61"
 name = "syn"
-version = "2.0.91"
+version = "2.0.95"
 authors = ["David Tolnay <dtolnay@gmail.com>"]
 build = false
 include = [
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/Cargo.toml.orig b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/Cargo.toml.orig
similarity index 98%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/Cargo.toml.orig
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/Cargo.toml.orig
index 98b490f..b1c26c76 100644
--- a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/Cargo.toml.orig
+++ b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/Cargo.toml.orig
@@ -1,6 +1,6 @@
 [package]
 name = "syn"
-version = "2.0.91"
+version = "2.0.95"
 authors = ["David Tolnay <dtolnay@gmail.com>"]
 categories = ["development-tools::procedural-macro-helpers", "parser-implementations"]
 description = "Parser for Rust source code"
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/LICENSE-APACHE b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/LICENSE-APACHE
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/LICENSE-APACHE
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/LICENSE-APACHE
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/LICENSE-MIT b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/LICENSE-MIT
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/LICENSE-MIT
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/LICENSE-MIT
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/README.md b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/README.md
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/README.md
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/README.md
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/benches/file.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/benches/file.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/benches/file.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/benches/file.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/benches/rust.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/benches/rust.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/benches/rust.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/benches/rust.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/attr.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/attr.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/attr.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/attr.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/bigint.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/bigint.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/bigint.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/bigint.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/buffer.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/buffer.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/buffer.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/buffer.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/classify.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/classify.rs
similarity index 81%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/classify.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/classify.rs
index b3a6ae9..8eab19d 100644
--- a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/classify.rs
+++ b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/classify.rs
@@ -63,96 +63,10 @@
         | Expr::Tuple(_)
         | Expr::Unary(_)
         | Expr::Yield(_)
-        | Expr::Verbatim(_) => true
+        | Expr::Verbatim(_) => true,
     }
 }
 
-#[cfg(all(feature = "printing", feature = "full"))]
-pub(crate) fn confusable_with_adjacent_block(mut expr: &Expr) -> bool {
-    let mut stack = Vec::new();
-
-    while let Some(next) = match expr {
-        Expr::Assign(e) => {
-            stack.push(&e.right);
-            Some(&e.left)
-        }
-        Expr::Await(e) => Some(&e.base),
-        Expr::Binary(e) => {
-            stack.push(&e.right);
-            Some(&e.left)
-        }
-        Expr::Break(e) => {
-            if let Some(Expr::Block(_)) = e.expr.as_deref() {
-                return true;
-            }
-            stack.pop()
-        }
-        Expr::Call(e) => Some(&e.func),
-        Expr::Cast(e) => Some(&e.expr),
-        Expr::Closure(e) => Some(&e.body),
-        Expr::Field(e) => Some(&e.base),
-        Expr::Index(e) => Some(&e.expr),
-        Expr::MethodCall(e) => Some(&e.receiver),
-        Expr::Range(e) => {
-            if let Some(Expr::Block(_)) = e.end.as_deref() {
-                return true;
-            }
-            match (&e.start, &e.end) {
-                (Some(start), end) => {
-                    stack.extend(end);
-                    Some(start)
-                }
-                (None, Some(end)) => Some(end),
-                (None, None) => stack.pop(),
-            }
-        }
-        Expr::RawAddr(e) => Some(&e.expr),
-        Expr::Reference(e) => Some(&e.expr),
-        Expr::Return(e) => {
-            if e.expr.is_none() && stack.is_empty() {
-                return true;
-            }
-            stack.pop()
-        }
-        Expr::Struct(_) => return true,
-        Expr::Try(e) => Some(&e.expr),
-        Expr::Unary(e) => Some(&e.expr),
-        Expr::Yield(e) => {
-            if e.expr.is_none() && stack.is_empty() {
-                return true;
-            }
-            stack.pop()
-        }
-
-        Expr::Array(_)
-        | Expr::Async(_)
-        | Expr::Block(_)
-        | Expr::Const(_)
-        | Expr::Continue(_)
-        | Expr::ForLoop(_)
-        | Expr::Group(_)
-        | Expr::If(_)
-        | Expr::Infer(_)
-        | Expr::Let(_)
-        | Expr::Lit(_)
-        | Expr::Loop(_)
-        | Expr::Macro(_)
-        | Expr::Match(_)
-        | Expr::Paren(_)
-        | Expr::Path(_)
-        | Expr::Repeat(_)
-        | Expr::TryBlock(_)
-        | Expr::Tuple(_)
-        | Expr::Unsafe(_)
-        | Expr::Verbatim(_)
-        | Expr::While(_) => stack.pop(),
-    } {
-        expr = next;
-    }
-
-    false
-}
-
 #[cfg(feature = "printing")]
 pub(crate) fn trailing_unparameterized_path(mut ty: &Type) -> bool {
     loop {
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/custom_keyword.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/custom_keyword.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/custom_keyword.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/custom_keyword.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/custom_punctuation.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/custom_punctuation.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/custom_punctuation.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/custom_punctuation.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/data.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/data.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/data.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/data.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/derive.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/derive.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/derive.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/derive.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/discouraged.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/discouraged.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/discouraged.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/discouraged.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/drops.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/drops.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/drops.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/drops.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/error.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/error.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/error.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/error.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/export.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/export.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/export.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/export.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/expr.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/expr.rs
similarity index 94%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/expr.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/expr.rs
index 4939078a..03f243a0 100644
--- a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/expr.rs
+++ b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/expr.rs
@@ -904,7 +904,7 @@
     #[cfg(feature = "parsing")]
     #[cfg_attr(docsrs, doc(cfg(feature = "parsing")))]
     pub fn peek(input: ParseStream) -> bool {
-        input.peek(Ident::peek_any) // value name or keyword
+        input.peek(Ident::peek_any) && !input.peek(Token![as]) // value name or keyword
             || input.peek(token::Paren) // tuple
             || input.peek(token::Bracket) // array
             || input.peek(token::Brace) // block
@@ -1315,15 +1315,19 @@
     ) -> Result<Expr> {
         loop {
             let ahead = input.fork();
-            if let Expr::Range(ExprRange { end: Some(_), .. }) = lhs {
-                // A range with an upper bound cannot be the left-hand side of
-                // another binary operator.
+            if let Expr::Range(_) = lhs {
+                // A range cannot be the left-hand side of another binary operator.
                 break;
             } else if let Ok(op) = ahead.parse::<BinOp>() {
                 let precedence = Precedence::of_binop(&op);
                 if precedence < base {
                     break;
                 }
+                if precedence == Precedence::Assign {
+                    if let Expr::Range(_) = lhs {
+                        break;
+                    }
+                }
                 if precedence == Precedence::Compare {
                     if let Expr::Binary(lhs) = &lhs {
                         if Precedence::of_binop(&lhs.op) == Precedence::Compare {
@@ -1339,7 +1343,13 @@
                     op,
                     right,
                 });
-            } else if Precedence::Assign >= base && input.peek(Token![=]) && !input.peek(Token![=>])
+            } else if Precedence::Assign >= base
+                && input.peek(Token![=])
+                && !input.peek(Token![=>])
+                && match lhs {
+                    Expr::Range(_) => false,
+                    _ => true,
+                }
             {
                 let eq_token: Token![=] = input.parse()?;
                 let right = parse_binop_rhs(input, allow_struct, Precedence::Assign)?;
@@ -1673,7 +1683,12 @@
                     bracket_token: bracketed!(content in input),
                     index: content.parse()?,
                 });
-            } else if input.peek(Token![?]) {
+            } else if input.peek(Token![?])
+                && match e {
+                    Expr::Range(_) => false,
+                    _ => true,
+                }
+            {
                 e = Expr::Try(ExprTry {
                     attrs: Vec::new(),
                     expr: Box::new(e),
@@ -2867,7 +2882,23 @@
                 || input.peek(Token![,])
                 || input.peek(Token![;])
                 || input.peek(Token![.]) && !input.peek(Token![..])
-                || !allow_struct.0 && input.peek(token::Brace))
+                || input.peek(Token![?])
+                || input.peek(Token![=>])
+                || !allow_struct.0 && input.peek(token::Brace)
+                || input.peek(Token![=])
+                || input.peek(Token![+])
+                || input.peek(Token![/])
+                || input.peek(Token![%])
+                || input.peek(Token![^])
+                || input.peek(Token![>])
+                || input.peek(Token![<=])
+                || input.peek(Token![!=])
+                || input.peek(Token![-=])
+                || input.peek(Token![*=])
+                || input.peek(Token![&=])
+                || input.peek(Token![|=])
+                || input.peek(Token![<<=])
+                || input.peek(Token![as]))
         {
             Ok(None)
         } else {
@@ -3120,17 +3151,7 @@
     #[cfg(not(feature = "full"))]
     pub(crate) fn outer_attrs_to_tokens(_attrs: &[Attribute], _tokens: &mut TokenStream) {}
 
-    #[cfg(feature = "full")]
-    fn print_condition(expr: &Expr, tokens: &mut TokenStream) {
-        print_subexpression(
-            expr,
-            classify::confusable_with_adjacent_block(expr),
-            tokens,
-            FixupContext::new_condition(),
-        );
-    }
-
-    fn print_subexpression(
+    pub(crate) fn print_subexpression(
         expr: &Expr,
         needs_group: bool,
         tokens: &mut TokenStream,
@@ -3162,7 +3183,7 @@
 
     pub(crate) fn print_expr(expr: &Expr, tokens: &mut TokenStream, mut fixup: FixupContext) {
         #[cfg(feature = "full")]
-        let needs_group = fixup.would_cause_statement_boundary(expr);
+        let needs_group = fixup.parenthesize(expr);
         #[cfg(not(feature = "full"))]
         let needs_group = false;
 
@@ -3187,7 +3208,7 @@
             Expr::Call(e) => print_expr_call(e, tokens, fixup),
             Expr::Cast(e) => print_expr_cast(e, tokens, fixup),
             #[cfg(feature = "full")]
-            Expr::Closure(e) => e.to_tokens(tokens),
+            Expr::Closure(e) => print_expr_closure(e, tokens, fixup),
             #[cfg(feature = "full")]
             Expr::Const(e) => e.to_tokens(tokens),
             #[cfg(feature = "full")]
@@ -3271,18 +3292,16 @@
     #[cfg(feature = "full")]
     fn print_expr_assign(e: &ExprAssign, tokens: &mut TokenStream, fixup: FixupContext) {
         outer_attrs_to_tokens(&e.attrs, tokens);
-        print_subexpression(
-            &e.left,
-            Precedence::of(&e.left) <= Precedence::Range,
-            tokens,
-            fixup.leftmost_subexpression(),
-        );
+        let (left_prec, left_fixup) =
+            fixup.leftmost_subexpression_with_operator(&e.left, false, false, Precedence::Assign);
+        print_subexpression(&e.left, left_prec <= Precedence::Range, tokens, left_fixup);
         e.eq_token.to_tokens(tokens);
+        let (right_prec, right_fixup) = fixup.rightmost_subexpression(&e.right, Precedence::Assign);
         print_subexpression(
             &e.right,
-            fixup.trailing_precedence(&e.right) < Precedence::Assign,
+            right_prec < Precedence::Assign,
             tokens,
-            fixup.subsequent_subexpression(),
+            right_fixup,
         );
     }
 
@@ -3308,11 +3327,12 @@
     #[cfg(feature = "full")]
     fn print_expr_await(e: &ExprAwait, tokens: &mut TokenStream, fixup: FixupContext) {
         outer_attrs_to_tokens(&e.attrs, tokens);
+        let (left_prec, left_fixup) = fixup.leftmost_subexpression_with_dot(&e.base);
         print_subexpression(
             &e.base,
-            Precedence::of(&e.base) < Precedence::Unambiguous,
+            left_prec < Precedence::Unambiguous,
             tokens,
-            fixup.leftmost_subexpression_with_dot(),
+            left_fixup,
         );
         e.dot_token.to_tokens(tokens);
         e.await_token.to_tokens(tokens);
@@ -3328,7 +3348,9 @@
     fn print_expr_binary(e: &ExprBinary, tokens: &mut TokenStream, fixup: FixupContext) {
         outer_attrs_to_tokens(&e.attrs, tokens);
 
-        let left_fixup = fixup.leftmost_subexpression_with_begin_operator(
+        let binop_prec = Precedence::of_binop(&e.op);
+        let (left_prec, left_fixup) = fixup.leftmost_subexpression_with_operator(
+            &e.left,
             #[cfg(feature = "full")]
             match &e.op {
                 BinOp::Sub(_)
@@ -3345,11 +3367,15 @@
                 BinOp::Shl(_) | BinOp::Lt(_) => true,
                 _ => false,
             },
+            #[cfg(feature = "full")]
+            binop_prec,
         );
 
-        let binop_prec = Precedence::of_binop(&e.op);
-        let left_prec = left_fixup.leading_precedence(&e.left);
-        let right_prec = fixup.trailing_precedence(&e.right);
+        let (right_prec, right_fixup) = fixup.rightmost_subexpression(
+            &e.right,
+            #[cfg(feature = "full")]
+            binop_prec,
+        );
         let (left_needs_group, right_needs_group) = match binop_prec {
             Precedence::Assign => (left_prec <= Precedence::Range, right_prec < binop_prec),
             Precedence::Compare => (left_prec <= binop_prec, right_prec <= binop_prec),
@@ -3358,12 +3384,7 @@
 
         print_subexpression(&e.left, left_needs_group, tokens, left_fixup);
         e.op.to_tokens(tokens);
-        print_subexpression(
-            &e.right,
-            right_needs_group,
-            tokens,
-            fixup.subsequent_subexpression(),
-        );
+        print_subexpression(&e.right, right_needs_group, tokens, right_fixup);
     }
 
     #[cfg(feature = "full")]
@@ -3399,7 +3420,7 @@
                 //                     ^---------------------------------^
                 e.label.is_none() && classify::expr_leading_label(value),
                 tokens,
-                fixup.subsequent_subexpression(),
+                fixup.rightmost_subexpression_fixup(true, true, Precedence::Jump),
             );
         }
     }
@@ -3414,17 +3435,20 @@
     fn print_expr_call(e: &ExprCall, tokens: &mut TokenStream, fixup: FixupContext) {
         outer_attrs_to_tokens(&e.attrs, tokens);
 
-        let func_fixup = fixup.leftmost_subexpression_with_begin_operator(
+        let (left_prec, left_fixup) = fixup.leftmost_subexpression_with_operator(
+            &e.func,
             #[cfg(feature = "full")]
             true,
             false,
+            #[cfg(feature = "full")]
+            Precedence::Unambiguous,
         );
         let needs_group = if let Expr::Field(func) = &*e.func {
             func.member.is_named()
         } else {
-            func_fixup.leading_precedence(&e.func) < Precedence::Unambiguous
+            left_prec < Precedence::Unambiguous
         };
-        print_subexpression(&e.func, needs_group, tokens, func_fixup);
+        print_subexpression(&e.func, needs_group, tokens, left_fixup);
 
         e.paren_token.surround(tokens, |tokens| {
             e.args.to_tokens(tokens);
@@ -3440,12 +3464,15 @@
 
     fn print_expr_cast(e: &ExprCast, tokens: &mut TokenStream, fixup: FixupContext) {
         outer_attrs_to_tokens(&e.attrs, tokens);
-        print_subexpression(
+        let (left_prec, left_fixup) = fixup.leftmost_subexpression_with_operator(
             &e.expr,
-            Precedence::of(&e.expr) < Precedence::Cast,
-            tokens,
-            fixup.leftmost_subexpression(),
+            #[cfg(feature = "full")]
+            false,
+            false,
+            #[cfg(feature = "full")]
+            Precedence::Cast,
         );
+        print_subexpression(&e.expr, left_prec < Precedence::Cast, tokens, left_fixup);
         e.as_token.to_tokens(tokens);
         e.ty.to_tokens(tokens);
     }
@@ -3454,23 +3481,34 @@
     #[cfg_attr(docsrs, doc(cfg(feature = "printing")))]
     impl ToTokens for ExprClosure {
         fn to_tokens(&self, tokens: &mut TokenStream) {
-            outer_attrs_to_tokens(&self.attrs, tokens);
-            self.lifetimes.to_tokens(tokens);
-            self.constness.to_tokens(tokens);
-            self.movability.to_tokens(tokens);
-            self.asyncness.to_tokens(tokens);
-            self.capture.to_tokens(tokens);
-            self.or1_token.to_tokens(tokens);
-            self.inputs.to_tokens(tokens);
-            self.or2_token.to_tokens(tokens);
-            self.output.to_tokens(tokens);
-            if matches!(self.output, ReturnType::Default) || matches!(*self.body, Expr::Block(_)) {
-                self.body.to_tokens(tokens);
-            } else {
-                token::Brace::default().surround(tokens, |tokens| {
-                    print_expr(&self.body, tokens, FixupContext::new_stmt());
-                });
-            }
+            print_expr_closure(self, tokens, FixupContext::NONE);
+        }
+    }
+
+    #[cfg(feature = "full")]
+    fn print_expr_closure(e: &ExprClosure, tokens: &mut TokenStream, fixup: FixupContext) {
+        outer_attrs_to_tokens(&e.attrs, tokens);
+        e.lifetimes.to_tokens(tokens);
+        e.constness.to_tokens(tokens);
+        e.movability.to_tokens(tokens);
+        e.asyncness.to_tokens(tokens);
+        e.capture.to_tokens(tokens);
+        e.or1_token.to_tokens(tokens);
+        e.inputs.to_tokens(tokens);
+        e.or2_token.to_tokens(tokens);
+        e.output.to_tokens(tokens);
+        if matches!(e.output, ReturnType::Default)
+            || matches!(&*e.body, Expr::Block(body) if body.attrs.is_empty() && body.label.is_none())
+        {
+            print_expr(
+                &e.body,
+                tokens,
+                fixup.rightmost_subexpression_fixup(false, false, Precedence::Jump),
+            );
+        } else {
+            token::Brace::default().surround(tokens, |tokens| {
+                print_expr(&e.body, tokens, FixupContext::new_stmt());
+            });
         }
     }
 
@@ -3506,11 +3544,12 @@
 
     fn print_expr_field(e: &ExprField, tokens: &mut TokenStream, fixup: FixupContext) {
         outer_attrs_to_tokens(&e.attrs, tokens);
+        let (left_prec, left_fixup) = fixup.leftmost_subexpression_with_dot(&e.base);
         print_subexpression(
             &e.base,
-            Precedence::of(&e.base) < Precedence::Unambiguous,
+            left_prec < Precedence::Unambiguous,
             tokens,
-            fixup.leftmost_subexpression_with_dot(),
+            left_fixup,
         );
         e.dot_token.to_tokens(tokens);
         e.member.to_tokens(tokens);
@@ -3525,7 +3564,7 @@
             self.for_token.to_tokens(tokens);
             self.pat.to_tokens(tokens);
             self.in_token.to_tokens(tokens);
-            print_condition(&self.expr, tokens);
+            print_expr(&self.expr, tokens, FixupContext::new_condition());
             self.body.brace_token.surround(tokens, |tokens| {
                 inner_attrs_to_tokens(&self.attrs, tokens);
                 tokens.append_all(&self.body.stmts);
@@ -3552,7 +3591,7 @@
             let mut expr = self;
             loop {
                 expr.if_token.to_tokens(tokens);
-                print_condition(&expr.cond, tokens);
+                print_expr(&expr.cond, tokens, FixupContext::new_condition());
                 expr.then_branch.to_tokens(tokens);
 
                 let (else_token, else_) = match &expr.else_branch {
@@ -3591,16 +3630,19 @@
 
     fn print_expr_index(e: &ExprIndex, tokens: &mut TokenStream, fixup: FixupContext) {
         outer_attrs_to_tokens(&e.attrs, tokens);
-        let obj_fixup = fixup.leftmost_subexpression_with_begin_operator(
+        let (left_prec, left_fixup) = fixup.leftmost_subexpression_with_operator(
+            &e.expr,
             #[cfg(feature = "full")]
             true,
             false,
+            #[cfg(feature = "full")]
+            Precedence::Unambiguous,
         );
         print_subexpression(
             &e.expr,
-            obj_fixup.leading_precedence(&e.expr) < Precedence::Unambiguous,
+            left_prec < Precedence::Unambiguous,
             tokens,
-            obj_fixup,
+            left_fixup,
         );
         e.bracket_token.surround(tokens, |tokens| {
             e.index.to_tokens(tokens);
@@ -3630,12 +3672,8 @@
         e.let_token.to_tokens(tokens);
         e.pat.to_tokens(tokens);
         e.eq_token.to_tokens(tokens);
-        print_subexpression(
-            &e.expr,
-            fixup.needs_group_as_let_scrutinee(&e.expr),
-            tokens,
-            FixupContext::NONE,
-        );
+        let (right_prec, right_fixup) = fixup.rightmost_subexpression(&e.expr, Precedence::Let);
+        print_subexpression(&e.expr, right_prec < Precedence::Let, tokens, right_fixup);
     }
 
     #[cfg_attr(docsrs, doc(cfg(feature = "printing")))]
@@ -3674,7 +3712,7 @@
         fn to_tokens(&self, tokens: &mut TokenStream) {
             outer_attrs_to_tokens(&self.attrs, tokens);
             self.match_token.to_tokens(tokens);
-            print_condition(&self.expr, tokens);
+            print_expr(&self.expr, tokens, FixupContext::new_condition());
             self.brace_token.surround(tokens, |tokens| {
                 inner_attrs_to_tokens(&self.attrs, tokens);
                 for (i, arm) in self.arms.iter().enumerate() {
@@ -3702,11 +3740,12 @@
 
     fn print_expr_method_call(e: &ExprMethodCall, tokens: &mut TokenStream, fixup: FixupContext) {
         outer_attrs_to_tokens(&e.attrs, tokens);
+        let (left_prec, left_fixup) = fixup.leftmost_subexpression_with_dot(&e.receiver);
         print_subexpression(
             &e.receiver,
-            Precedence::of(&e.receiver) < Precedence::Unambiguous,
+            left_prec < Precedence::Unambiguous,
             tokens,
-            fixup.leftmost_subexpression_with_dot(),
+            left_fixup,
         );
         e.dot_token.to_tokens(tokens);
         e.method.to_tokens(tokens);
@@ -3752,21 +3791,15 @@
     fn print_expr_range(e: &ExprRange, tokens: &mut TokenStream, fixup: FixupContext) {
         outer_attrs_to_tokens(&e.attrs, tokens);
         if let Some(start) = &e.start {
-            print_subexpression(
-                start,
-                Precedence::of(start) <= Precedence::Range,
-                tokens,
-                fixup.leftmost_subexpression(),
-            );
+            let (left_prec, left_fixup) =
+                fixup.leftmost_subexpression_with_operator(start, true, false, Precedence::Range);
+            print_subexpression(start, left_prec <= Precedence::Range, tokens, left_fixup);
         }
         e.limits.to_tokens(tokens);
         if let Some(end) = &e.end {
-            print_subexpression(
-                end,
-                fixup.trailing_precedence(end) <= Precedence::Range,
-                tokens,
-                fixup.subsequent_subexpression(),
-            );
+            let right_fixup = fixup.rightmost_subexpression_fixup(false, true, Precedence::Range);
+            let right_prec = right_fixup.rightmost_subexpression_precedence(end);
+            print_subexpression(end, right_prec <= Precedence::Range, tokens, right_fixup);
         }
     }
 
@@ -3784,11 +3817,12 @@
         e.and_token.to_tokens(tokens);
         e.raw.to_tokens(tokens);
         e.mutability.to_tokens(tokens);
+        let (right_prec, right_fixup) = fixup.rightmost_subexpression(&e.expr, Precedence::Prefix);
         print_subexpression(
             &e.expr,
-            fixup.trailing_precedence(&e.expr) < Precedence::Prefix,
+            right_prec < Precedence::Prefix,
             tokens,
-            fixup.subsequent_subexpression(),
+            right_fixup,
         );
     }
 
@@ -3803,11 +3837,16 @@
         outer_attrs_to_tokens(&e.attrs, tokens);
         e.and_token.to_tokens(tokens);
         e.mutability.to_tokens(tokens);
+        let (right_prec, right_fixup) = fixup.rightmost_subexpression(
+            &e.expr,
+            #[cfg(feature = "full")]
+            Precedence::Prefix,
+        );
         print_subexpression(
             &e.expr,
-            fixup.trailing_precedence(&e.expr) < Precedence::Prefix,
+            right_prec < Precedence::Prefix,
             tokens,
-            fixup.subsequent_subexpression(),
+            right_fixup,
         );
     }
 
@@ -3837,7 +3876,11 @@
         outer_attrs_to_tokens(&e.attrs, tokens);
         e.return_token.to_tokens(tokens);
         if let Some(expr) = &e.expr {
-            print_expr(expr, tokens, fixup.subsequent_subexpression());
+            print_expr(
+                expr,
+                tokens,
+                fixup.rightmost_subexpression_fixup(true, false, Precedence::Jump),
+            );
         }
     }
 
@@ -3869,11 +3912,12 @@
     #[cfg(feature = "full")]
     fn print_expr_try(e: &ExprTry, tokens: &mut TokenStream, fixup: FixupContext) {
         outer_attrs_to_tokens(&e.attrs, tokens);
+        let (left_prec, left_fixup) = fixup.leftmost_subexpression_with_dot(&e.expr);
         print_subexpression(
             &e.expr,
-            Precedence::of(&e.expr) < Precedence::Unambiguous,
+            left_prec < Precedence::Unambiguous,
             tokens,
-            fixup.leftmost_subexpression_with_dot(),
+            left_fixup,
         );
         e.question_token.to_tokens(tokens);
     }
@@ -3913,11 +3957,16 @@
     fn print_expr_unary(e: &ExprUnary, tokens: &mut TokenStream, fixup: FixupContext) {
         outer_attrs_to_tokens(&e.attrs, tokens);
         e.op.to_tokens(tokens);
+        let (right_prec, right_fixup) = fixup.rightmost_subexpression(
+            &e.expr,
+            #[cfg(feature = "full")]
+            Precedence::Prefix,
+        );
         print_subexpression(
             &e.expr,
-            fixup.trailing_precedence(&e.expr) < Precedence::Prefix,
+            right_prec < Precedence::Prefix,
             tokens,
-            fixup.subsequent_subexpression(),
+            right_fixup,
         );
     }
 
@@ -3941,7 +3990,7 @@
             outer_attrs_to_tokens(&self.attrs, tokens);
             self.label.to_tokens(tokens);
             self.while_token.to_tokens(tokens);
-            print_condition(&self.cond, tokens);
+            print_expr(&self.cond, tokens, FixupContext::new_condition());
             self.body.brace_token.surround(tokens, |tokens| {
                 inner_attrs_to_tokens(&self.attrs, tokens);
                 tokens.append_all(&self.body.stmts);
@@ -3962,7 +4011,11 @@
         outer_attrs_to_tokens(&e.attrs, tokens);
         e.yield_token.to_tokens(tokens);
         if let Some(expr) = &e.expr {
-            print_expr(expr, tokens, fixup.subsequent_subexpression());
+            print_expr(
+                expr,
+                tokens,
+                fixup.rightmost_subexpression_fixup(true, false, Precedence::Jump),
+            );
         }
     }
 
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/ext.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/ext.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/ext.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/ext.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/file.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/file.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/file.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/file.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/fixup.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/fixup.rs
new file mode 100644
index 0000000..126700c
--- /dev/null
+++ b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/fixup.rs
@@ -0,0 +1,725 @@
+use crate::classify;
+use crate::expr::Expr;
+#[cfg(feature = "full")]
+use crate::expr::{
+    ExprBreak, ExprRange, ExprRawAddr, ExprReference, ExprReturn, ExprUnary, ExprYield,
+};
+use crate::precedence::Precedence;
+#[cfg(feature = "full")]
+use crate::ty::ReturnType;
+
+pub(crate) struct FixupContext {
+    #[cfg(feature = "full")]
+    previous_operator: Precedence,
+    #[cfg(feature = "full")]
+    next_operator: Precedence,
+
+    // Print expression such that it can be parsed back as a statement
+    // consisting of the original expression.
+    //
+    // The effect of this is for binary operators in statement position to set
+    // `leftmost_subexpression_in_stmt` when printing their left-hand operand.
+    //
+    //     (match x {}) - 1;  // match needs parens when LHS of binary operator
+    //
+    //     match x {};  // not when its own statement
+    //
+    #[cfg(feature = "full")]
+    stmt: bool,
+
+    // This is the difference between:
+    //
+    //     (match x {}) - 1;  // subexpression needs parens
+    //
+    //     let _ = match x {} - 1;  // no parens
+    //
+    // There are 3 distinguishable contexts in which `print_expr` might be
+    // called with the expression `$match` as its argument, where `$match`
+    // represents an expression of kind `ExprKind::Match`:
+    //
+    //   - stmt=false leftmost_subexpression_in_stmt=false
+    //
+    //     Example: `let _ = $match - 1;`
+    //
+    //     No parentheses required.
+    //
+    //   - stmt=false leftmost_subexpression_in_stmt=true
+    //
+    //     Example: `$match - 1;`
+    //
+    //     Must parenthesize `($match)`, otherwise parsing back the output as a
+    //     statement would terminate the statement after the closing brace of
+    //     the match, parsing `-1;` as a separate statement.
+    //
+    //   - stmt=true leftmost_subexpression_in_stmt=false
+    //
+    //     Example: `$match;`
+    //
+    //     No parentheses required.
+    #[cfg(feature = "full")]
+    leftmost_subexpression_in_stmt: bool,
+
+    // Print expression such that it can be parsed as a match arm.
+    //
+    // This is almost equivalent to `stmt`, but the grammar diverges a tiny bit
+    // between statements and match arms when it comes to braced macro calls.
+    // Macro calls with brace delimiter terminate a statement without a
+    // semicolon, but do not terminate a match-arm without comma.
+    //
+    //     m! {} - 1;  // two statements: a macro call followed by -1 literal
+    //
+    //     match () {
+    //         _ => m! {} - 1,  // binary subtraction operator
+    //     }
+    //
+    #[cfg(feature = "full")]
+    match_arm: bool,
+
+    // This is almost equivalent to `leftmost_subexpression_in_stmt`, other than
+    // for braced macro calls.
+    //
+    // If we have `m! {} - 1` as an expression, the leftmost subexpression
+    // `m! {}` will need to be parenthesized in the statement case but not the
+    // match-arm case.
+    //
+    //     (m! {}) - 1;  // subexpression needs parens
+    //
+    //     match () {
+    //         _ => m! {} - 1,  // no parens
+    //     }
+    //
+    #[cfg(feature = "full")]
+    leftmost_subexpression_in_match_arm: bool,
+
+    // This is the difference between:
+    //
+    //     if let _ = (Struct {}) {}  // needs parens
+    //
+    //     match () {
+    //         () if let _ = Struct {} => {}  // no parens
+    //     }
+    //
+    #[cfg(feature = "full")]
+    condition: bool,
+
+    // This is the difference between:
+    //
+    //     if break Struct {} == (break) {}  // needs parens
+    //
+    //     if break break == Struct {} {}  // no parens
+    //
+    #[cfg(feature = "full")]
+    rightmost_subexpression_in_condition: bool,
+
+    // This is the difference between:
+    //
+    //     if break ({ x }).field + 1 {}  needs parens
+    //
+    //     if break 1 + { x }.field {}  // no parens
+    //
+    #[cfg(feature = "full")]
+    leftmost_subexpression_in_optional_operand: bool,
+
+    // This is the difference between:
+    //
+    //     let _ = (return) - 1;  // without paren, this would return -1
+    //
+    //     let _ = return + 1;  // no paren because '+' cannot begin expr
+    //
+    #[cfg(feature = "full")]
+    next_operator_can_begin_expr: bool,
+
+    // This is the difference between:
+    //
+    //     let _ = 1 + return 1;  // no parens if rightmost subexpression
+    //
+    //     let _ = 1 + (return 1) + 1;  // needs parens
+    //
+    #[cfg(feature = "full")]
+    next_operator_can_continue_expr: bool,
+
+    // This is the difference between:
+    //
+    //     let _ = x as u8 + T;
+    //
+    //     let _ = (x as u8) < T;
+    //
+    // Without parens, the latter would want to parse `u8<T...` as a type.
+    next_operator_can_begin_generics: bool,
+}
+
+impl FixupContext {
+    /// The default amount of fixing is minimal fixing. Fixups should be turned
+    /// on in a targeted fashion where needed.
+    pub const NONE: Self = FixupContext {
+        #[cfg(feature = "full")]
+        previous_operator: Precedence::MIN,
+        #[cfg(feature = "full")]
+        next_operator: Precedence::MIN,
+        #[cfg(feature = "full")]
+        stmt: false,
+        #[cfg(feature = "full")]
+        leftmost_subexpression_in_stmt: false,
+        #[cfg(feature = "full")]
+        match_arm: false,
+        #[cfg(feature = "full")]
+        leftmost_subexpression_in_match_arm: false,
+        #[cfg(feature = "full")]
+        condition: false,
+        #[cfg(feature = "full")]
+        rightmost_subexpression_in_condition: false,
+        #[cfg(feature = "full")]
+        leftmost_subexpression_in_optional_operand: false,
+        #[cfg(feature = "full")]
+        next_operator_can_begin_expr: false,
+        #[cfg(feature = "full")]
+        next_operator_can_continue_expr: false,
+        next_operator_can_begin_generics: false,
+    };
+
+    /// Create the initial fixup for printing an expression in statement
+    /// position.
+    #[cfg(feature = "full")]
+    pub fn new_stmt() -> Self {
+        FixupContext {
+            stmt: true,
+            ..FixupContext::NONE
+        }
+    }
+
+    /// Create the initial fixup for printing an expression as the right-hand
+    /// side of a match arm.
+    #[cfg(feature = "full")]
+    pub fn new_match_arm() -> Self {
+        FixupContext {
+            match_arm: true,
+            ..FixupContext::NONE
+        }
+    }
+
+    /// Create the initial fixup for printing an expression as the "condition"
+    /// of an `if` or `while`. There are a few other positions which are
+    /// grammatically equivalent and also use this, such as the iterator
+    /// expression in `for` and the scrutinee in `match`.
+    #[cfg(feature = "full")]
+    pub fn new_condition() -> Self {
+        FixupContext {
+            condition: true,
+            rightmost_subexpression_in_condition: true,
+            ..FixupContext::NONE
+        }
+    }
+
+    /// Transform this fixup into the one that should apply when printing the
+    /// leftmost subexpression of the current expression.
+    ///
+    /// The leftmost subexpression is any subexpression that has the same first
+    /// token as the current expression, but has a different last token.
+    ///
+    /// For example in `$a + $b` and `$a.method()`, the subexpression `$a` is a
+    /// leftmost subexpression.
+    ///
+    /// Not every expression has a leftmost subexpression. For example neither
+    /// `-$a` nor `[$a]` have one.
+    pub fn leftmost_subexpression_with_operator(
+        self,
+        expr: &Expr,
+        #[cfg(feature = "full")] next_operator_can_begin_expr: bool,
+        next_operator_can_begin_generics: bool,
+        #[cfg(feature = "full")] precedence: Precedence,
+    ) -> (Precedence, Self) {
+        let fixup = FixupContext {
+            #[cfg(feature = "full")]
+            next_operator: precedence,
+            #[cfg(feature = "full")]
+            stmt: false,
+            #[cfg(feature = "full")]
+            leftmost_subexpression_in_stmt: self.stmt || self.leftmost_subexpression_in_stmt,
+            #[cfg(feature = "full")]
+            match_arm: false,
+            #[cfg(feature = "full")]
+            leftmost_subexpression_in_match_arm: self.match_arm
+                || self.leftmost_subexpression_in_match_arm,
+            #[cfg(feature = "full")]
+            rightmost_subexpression_in_condition: false,
+            #[cfg(feature = "full")]
+            next_operator_can_begin_expr,
+            #[cfg(feature = "full")]
+            next_operator_can_continue_expr: true,
+            next_operator_can_begin_generics,
+            ..self
+        };
+
+        (fixup.leftmost_subexpression_precedence(expr), fixup)
+    }
+
+    /// Transform this fixup into the one that should apply when printing a
+    /// leftmost subexpression followed by a `.` or `?` token, which confer
+    /// different statement boundary rules compared to other leftmost
+    /// subexpressions.
+    pub fn leftmost_subexpression_with_dot(self, expr: &Expr) -> (Precedence, Self) {
+        let fixup = FixupContext {
+            #[cfg(feature = "full")]
+            next_operator: Precedence::Unambiguous,
+            #[cfg(feature = "full")]
+            stmt: self.stmt || self.leftmost_subexpression_in_stmt,
+            #[cfg(feature = "full")]
+            leftmost_subexpression_in_stmt: false,
+            #[cfg(feature = "full")]
+            match_arm: self.match_arm || self.leftmost_subexpression_in_match_arm,
+            #[cfg(feature = "full")]
+            leftmost_subexpression_in_match_arm: false,
+            #[cfg(feature = "full")]
+            rightmost_subexpression_in_condition: false,
+            #[cfg(feature = "full")]
+            next_operator_can_begin_expr: false,
+            #[cfg(feature = "full")]
+            next_operator_can_continue_expr: true,
+            next_operator_can_begin_generics: false,
+            ..self
+        };
+
+        (fixup.leftmost_subexpression_precedence(expr), fixup)
+    }
+
+    fn leftmost_subexpression_precedence(self, expr: &Expr) -> Precedence {
+        #[cfg(feature = "full")]
+        if !self.next_operator_can_begin_expr || self.next_operator == Precedence::Range {
+            if let Scan::Bailout = scan_right(expr, self, false, 0, 0) {
+                if scan_left(expr, self) {
+                    return Precedence::Unambiguous;
+                }
+            }
+        }
+
+        self.precedence(expr)
+    }
+
+    /// Transform this fixup into the one that should apply when printing the
+    /// rightmost subexpression of the current expression.
+    ///
+    /// The rightmost subexpression is any subexpression that has a different
+    /// first token than the current expression, but has the same last token.
+    ///
+    /// For example in `$a + $b` and `-$b`, the subexpression `$b` is a
+    /// rightmost subexpression.
+    ///
+    /// Not every expression has a rightmost subexpression. For example neither
+    /// `[$b]` nor `$a.f($b)` have one.
+    pub fn rightmost_subexpression(
+        self,
+        expr: &Expr,
+        #[cfg(feature = "full")] precedence: Precedence,
+    ) -> (Precedence, Self) {
+        let fixup = self.rightmost_subexpression_fixup(
+            #[cfg(feature = "full")]
+            false,
+            #[cfg(feature = "full")]
+            false,
+            #[cfg(feature = "full")]
+            precedence,
+        );
+        (fixup.rightmost_subexpression_precedence(expr), fixup)
+    }
+
+    pub fn rightmost_subexpression_fixup(
+        self,
+        #[cfg(feature = "full")] reset_allow_struct: bool,
+        #[cfg(feature = "full")] optional_operand: bool,
+        #[cfg(feature = "full")] precedence: Precedence,
+    ) -> Self {
+        FixupContext {
+            #[cfg(feature = "full")]
+            previous_operator: precedence,
+            #[cfg(feature = "full")]
+            stmt: false,
+            #[cfg(feature = "full")]
+            leftmost_subexpression_in_stmt: false,
+            #[cfg(feature = "full")]
+            match_arm: false,
+            #[cfg(feature = "full")]
+            leftmost_subexpression_in_match_arm: false,
+            #[cfg(feature = "full")]
+            condition: self.condition && !reset_allow_struct,
+            #[cfg(feature = "full")]
+            leftmost_subexpression_in_optional_operand: self.condition && optional_operand,
+            ..self
+        }
+    }
+
+    pub fn rightmost_subexpression_precedence(self, expr: &Expr) -> Precedence {
+        let default_prec = self.precedence(expr);
+
+        #[cfg(feature = "full")]
+        if default_prec < Precedence::Prefix
+            && (!self.next_operator_can_begin_expr || self.next_operator == Precedence::Range)
+        {
+            if let Scan::Bailout | Scan::Fail = scan_right(
+                expr,
+                self,
+                self.previous_operator == Precedence::Range,
+                1,
+                0,
+            ) {
+                if scan_left(expr, self) {
+                    return Precedence::Prefix;
+                }
+            }
+        }
+
+        default_prec
+    }
+
+    /// Determine whether parentheses are needed around the given expression to
+    /// head off the early termination of a statement or condition.
+    #[cfg(feature = "full")]
+    pub fn parenthesize(self, expr: &Expr) -> bool {
+        (self.leftmost_subexpression_in_stmt && !classify::requires_semi_to_be_stmt(expr))
+            || ((self.stmt || self.leftmost_subexpression_in_stmt) && matches!(expr, Expr::Let(_)))
+            || (self.leftmost_subexpression_in_match_arm
+                && !classify::requires_comma_to_be_match_arm(expr))
+            || (self.condition && matches!(expr, Expr::Struct(_)))
+            || (self.rightmost_subexpression_in_condition
+                && matches!(
+                    expr,
+                    Expr::Return(ExprReturn { expr: None, .. })
+                        | Expr::Yield(ExprYield { expr: None, .. })
+                ))
+            || (self.rightmost_subexpression_in_condition
+                && !self.condition
+                && matches!(
+                    expr,
+                    Expr::Break(ExprBreak { expr: None, .. })
+                        | Expr::Path(_)
+                        | Expr::Range(ExprRange { end: None, .. })
+                ))
+            || (self.leftmost_subexpression_in_optional_operand
+                && matches!(expr, Expr::Block(expr) if expr.attrs.is_empty() && expr.label.is_none()))
+    }
+
+    /// Determines the effective precedence of a subexpression. Some expressions
+    /// have higher or lower precedence when adjacent to particular operators.
+    fn precedence(self, expr: &Expr) -> Precedence {
+        #[cfg(feature = "full")]
+        if self.next_operator_can_begin_expr {
+            // Decrease precedence of value-less jumps when followed by an
+            // operator that would otherwise get interpreted as beginning a
+            // value for the jump.
+            if let Expr::Break(ExprBreak { expr: None, .. })
+            | Expr::Return(ExprReturn { expr: None, .. })
+            | Expr::Yield(ExprYield { expr: None, .. }) = expr
+            {
+                return Precedence::Jump;
+            }
+        }
+
+        #[cfg(feature = "full")]
+        if !self.next_operator_can_continue_expr {
+            match expr {
+                // Increase precedence of expressions that extend to the end of
+                // current statement or group.
+                Expr::Break(_)
+                | Expr::Closure(_)
+                | Expr::Let(_)
+                | Expr::Return(_)
+                | Expr::Yield(_) => {
+                    return Precedence::Prefix;
+                }
+                Expr::Range(e) if e.start.is_none() => return Precedence::Prefix,
+                _ => {}
+            }
+        }
+
+        if self.next_operator_can_begin_generics {
+            if let Expr::Cast(cast) = expr {
+                if classify::trailing_unparameterized_path(&cast.ty) {
+                    return Precedence::MIN;
+                }
+            }
+        }
+
+        Precedence::of(expr)
+    }
+}
+
+impl Copy for FixupContext {}
+
+impl Clone for FixupContext {
+    fn clone(&self) -> Self {
+        *self
+    }
+}
+
+#[cfg(feature = "full")]
+enum Scan {
+    Fail,
+    Bailout,
+    Consume,
+}
+
+#[cfg(feature = "full")]
+impl Copy for Scan {}
+
+#[cfg(feature = "full")]
+impl Clone for Scan {
+    fn clone(&self) -> Self {
+        *self
+    }
+}
+
+#[cfg(feature = "full")]
+fn scan_left(expr: &Expr, fixup: FixupContext) -> bool {
+    match expr {
+        Expr::Assign(_) => fixup.previous_operator <= Precedence::Assign,
+        Expr::Binary(e) => match Precedence::of_binop(&e.op) {
+            Precedence::Assign => fixup.previous_operator <= Precedence::Assign,
+            binop_prec => fixup.previous_operator < binop_prec,
+        },
+        Expr::Range(e) => e.start.is_none() || fixup.previous_operator < Precedence::Assign,
+        _ => true,
+    }
+}
+
+#[cfg(feature = "full")]
+fn scan_right(
+    expr: &Expr,
+    fixup: FixupContext,
+    range: bool,
+    fail_offset: u8,
+    bailout_offset: u8,
+) -> Scan {
+    if fixup.parenthesize(expr) {
+        return Scan::Consume;
+    }
+    match expr {
+        Expr::Assign(e) => {
+            if match fixup.next_operator {
+                Precedence::Unambiguous => fail_offset >= 2,
+                _ => bailout_offset >= 1,
+            } {
+                return Scan::Consume;
+            }
+            let right_fixup = fixup.rightmost_subexpression_fixup(false, false, Precedence::Assign);
+            let scan = scan_right(
+                &e.right,
+                right_fixup,
+                false,
+                match fixup.next_operator {
+                    Precedence::Unambiguous => fail_offset,
+                    _ => 1,
+                },
+                1,
+            );
+            if let Scan::Bailout | Scan::Consume = scan {
+                return Scan::Consume;
+            }
+            if right_fixup.rightmost_subexpression_precedence(&e.right) < Precedence::Assign {
+                Scan::Consume
+            } else if let Precedence::Unambiguous = fixup.next_operator {
+                Scan::Fail
+            } else {
+                Scan::Bailout
+            }
+        }
+        Expr::Binary(e) => {
+            if match fixup.next_operator {
+                Precedence::Unambiguous => fail_offset >= 2,
+                _ => bailout_offset >= 1,
+            } {
+                return Scan::Consume;
+            }
+            let binop_prec = Precedence::of_binop(&e.op);
+            let right_fixup = fixup.rightmost_subexpression_fixup(false, false, binop_prec);
+            let scan = scan_right(
+                &e.right,
+                right_fixup,
+                range && binop_prec != Precedence::Assign,
+                match fixup.next_operator {
+                    Precedence::Unambiguous => fail_offset,
+                    _ => 1,
+                },
+                match (binop_prec, fixup.next_operator) {
+                    (Precedence::Assign, _) => 1,
+                    (_, Precedence::Assign | Precedence::Range) if range => 0,
+                    _ => 1,
+                },
+            );
+            if match (scan, fixup.next_operator) {
+                (Scan::Fail, _) => false,
+                (Scan::Bailout, _) if binop_prec == Precedence::Assign => true,
+                (Scan::Bailout, Precedence::Assign | Precedence::Range) => !range,
+                (Scan::Bailout | Scan::Consume, _) => true,
+            } {
+                return Scan::Consume;
+            }
+            let right_prec = right_fixup.rightmost_subexpression_precedence(&e.right);
+            let right_needs_group = match binop_prec {
+                Precedence::Assign => right_prec < binop_prec,
+                _ => right_prec <= binop_prec,
+            };
+            if right_needs_group {
+                Scan::Consume
+            } else if let (Scan::Fail, Precedence::Unambiguous) = (scan, fixup.next_operator) {
+                Scan::Fail
+            } else {
+                Scan::Bailout
+            }
+        }
+        Expr::RawAddr(ExprRawAddr { expr, .. })
+        | Expr::Reference(ExprReference { expr, .. })
+        | Expr::Unary(ExprUnary { expr, .. }) => {
+            if match fixup.next_operator {
+                Precedence::Unambiguous => fail_offset >= 2,
+                _ => bailout_offset >= 1,
+            } {
+                return Scan::Consume;
+            }
+            let right_fixup = fixup.rightmost_subexpression_fixup(false, false, Precedence::Prefix);
+            let scan = scan_right(
+                expr,
+                right_fixup,
+                range,
+                match fixup.next_operator {
+                    Precedence::Unambiguous => fail_offset,
+                    _ => 1,
+                },
+                match fixup.next_operator {
+                    Precedence::Assign | Precedence::Range if range => 0,
+                    _ => 1,
+                },
+            );
+            if match (scan, fixup.next_operator) {
+                (Scan::Fail, _) => false,
+                (Scan::Bailout, Precedence::Assign | Precedence::Range) => !range,
+                (Scan::Bailout | Scan::Consume, _) => true,
+            } {
+                return Scan::Consume;
+            }
+            if right_fixup.rightmost_subexpression_precedence(expr) < Precedence::Prefix {
+                Scan::Consume
+            } else if let (Scan::Fail, Precedence::Unambiguous) = (scan, fixup.next_operator) {
+                Scan::Fail
+            } else {
+                Scan::Bailout
+            }
+        }
+        Expr::Range(e) => match &e.end {
+            Some(end) => {
+                if fail_offset >= 2 {
+                    return Scan::Consume;
+                }
+                let right_fixup =
+                    fixup.rightmost_subexpression_fixup(false, true, Precedence::Range);
+                let scan = scan_right(
+                    end,
+                    right_fixup,
+                    true,
+                    fail_offset,
+                    match fixup.next_operator {
+                        Precedence::Assign | Precedence::Range => 0,
+                        _ => 1,
+                    },
+                );
+                if match (scan, fixup.next_operator) {
+                    (Scan::Fail, _) => false,
+                    (Scan::Bailout, Precedence::Assign | Precedence::Range) => false,
+                    (Scan::Bailout | Scan::Consume, _) => true,
+                } {
+                    return Scan::Consume;
+                }
+                if right_fixup.rightmost_subexpression_precedence(end) <= Precedence::Range {
+                    Scan::Consume
+                } else {
+                    Scan::Fail
+                }
+            }
+            None => match fixup.next_operator {
+                Precedence::Range => Scan::Consume,
+                _ => Scan::Fail,
+            },
+        },
+        Expr::Break(e) => match &e.expr {
+            Some(value) => {
+                if bailout_offset >= 1 || e.label.is_none() && classify::expr_leading_label(value) {
+                    return Scan::Consume;
+                }
+                let right_fixup = fixup.rightmost_subexpression_fixup(true, true, Precedence::Jump);
+                match scan_right(value, right_fixup, false, 1, 1) {
+                    Scan::Fail => Scan::Bailout,
+                    Scan::Bailout | Scan::Consume => Scan::Consume,
+                }
+            }
+            None => match fixup.next_operator {
+                Precedence::Assign if range => Scan::Fail,
+                _ => Scan::Consume,
+            },
+        },
+        Expr::Return(ExprReturn { expr, .. }) | Expr::Yield(ExprYield { expr, .. }) => match expr {
+            Some(e) => {
+                if bailout_offset >= 1 {
+                    return Scan::Consume;
+                }
+                let right_fixup =
+                    fixup.rightmost_subexpression_fixup(true, false, Precedence::Jump);
+                match scan_right(e, right_fixup, false, 1, 1) {
+                    Scan::Fail => Scan::Bailout,
+                    Scan::Bailout | Scan::Consume => Scan::Consume,
+                }
+            }
+            None => match fixup.next_operator {
+                Precedence::Assign if range => Scan::Fail,
+                _ => Scan::Consume,
+            },
+        },
+        Expr::Closure(e) => {
+            if matches!(e.output, ReturnType::Default)
+                || matches!(&*e.body, Expr::Block(body) if body.attrs.is_empty() && body.label.is_none())
+            {
+                if bailout_offset >= 1 {
+                    return Scan::Consume;
+                }
+                let right_fixup =
+                    fixup.rightmost_subexpression_fixup(false, false, Precedence::Jump);
+                match scan_right(&e.body, right_fixup, false, 1, 1) {
+                    Scan::Fail => Scan::Bailout,
+                    Scan::Bailout | Scan::Consume => Scan::Consume,
+                }
+            } else {
+                Scan::Consume
+            }
+        }
+        Expr::Array(_)
+        | Expr::Async(_)
+        | Expr::Await(_)
+        | Expr::Block(_)
+        | Expr::Call(_)
+        | Expr::Cast(_)
+        | Expr::Const(_)
+        | Expr::Continue(_)
+        | Expr::Field(_)
+        | Expr::ForLoop(_)
+        | Expr::Group(_)
+        | Expr::If(_)
+        | Expr::Index(_)
+        | Expr::Infer(_)
+        | Expr::Let(_)
+        | Expr::Lit(_)
+        | Expr::Loop(_)
+        | Expr::Macro(_)
+        | Expr::Match(_)
+        | Expr::MethodCall(_)
+        | Expr::Paren(_)
+        | Expr::Path(_)
+        | Expr::Repeat(_)
+        | Expr::Struct(_)
+        | Expr::Try(_)
+        | Expr::TryBlock(_)
+        | Expr::Tuple(_)
+        | Expr::Unsafe(_)
+        | Expr::Verbatim(_)
+        | Expr::While(_) => match fixup.next_operator {
+            Precedence::Assign | Precedence::Range if range => Scan::Fail,
+            _ => Scan::Consume,
+        },
+    }
+}
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/gen/clone.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/gen/clone.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/gen/clone.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/gen/clone.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/gen/debug.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/gen/debug.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/gen/debug.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/gen/debug.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/gen/eq.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/gen/eq.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/gen/eq.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/gen/eq.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/gen/fold.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/gen/fold.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/gen/fold.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/gen/fold.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/gen/hash.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/gen/hash.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/gen/hash.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/gen/hash.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/gen/token.css b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/gen/token.css
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/gen/token.css
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/gen/token.css
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/gen/visit.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/gen/visit.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/gen/visit.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/gen/visit.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/gen/visit_mut.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/gen/visit_mut.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/gen/visit_mut.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/gen/visit_mut.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/generics.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/generics.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/generics.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/generics.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/group.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/group.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/group.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/group.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/ident.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/ident.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/ident.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/ident.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/item.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/item.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/item.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/item.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/lib.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/lib.rs
similarity index 99%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/lib.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/lib.rs
index ebaa4cb..98f02ed 100644
--- a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/lib.rs
+++ b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/lib.rs
@@ -249,7 +249,7 @@
 //!   dynamic library libproc_macro from rustc toolchain.
 
 // Syn types in rustdoc of other crates get linked to here.
-#![doc(html_root_url = "https://docs.rs/syn/2.0.91")]
+#![doc(html_root_url = "https://docs.rs/syn/2.0.95")]
 #![cfg_attr(docsrs, feature(doc_cfg))]
 #![deny(unsafe_op_in_unsafe_fn)]
 #![allow(non_camel_case_types)]
@@ -267,6 +267,7 @@
     clippy::enum_glob_use,
     clippy::expl_impl_clone_on_copy,
     clippy::explicit_auto_deref,
+    clippy::fn_params_excessive_bools,
     clippy::if_not_else,
     clippy::inherent_to_string,
     clippy::into_iter_without_iter,
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/lifetime.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/lifetime.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/lifetime.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/lifetime.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/lit.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/lit.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/lit.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/lit.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/lookahead.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/lookahead.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/lookahead.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/lookahead.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/mac.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/mac.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/mac.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/mac.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/macros.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/macros.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/macros.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/macros.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/meta.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/meta.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/meta.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/meta.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/op.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/op.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/op.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/op.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/parse.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/parse.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/parse.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/parse.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/parse_macro_input.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/parse_macro_input.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/parse_macro_input.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/parse_macro_input.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/parse_quote.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/parse_quote.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/parse_quote.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/parse_quote.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/pat.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/pat.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/pat.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/pat.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/path.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/path.rs
similarity index 99%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/path.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/path.rs
index ce38eff..7744d28 100644
--- a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/path.rs
+++ b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/path.rs
@@ -528,7 +528,10 @@
                 input.parse()?
             };
 
-            if !expr_style && input.peek(Token![<]) && !input.peek(Token![<=])
+            if !expr_style
+                && input.peek(Token![<])
+                && !input.peek(Token![<=])
+                && !input.peek(Token![<<=])
                 || input.peek(Token![::]) && input.peek3(Token![<])
             {
                 Ok(PathSegment {
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/precedence.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/precedence.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/precedence.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/precedence.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/print.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/print.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/print.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/print.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/punctuated.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/punctuated.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/punctuated.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/punctuated.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/restriction.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/restriction.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/restriction.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/restriction.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/scan_expr.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/scan_expr.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/scan_expr.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/scan_expr.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/sealed.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/sealed.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/sealed.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/sealed.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/span.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/span.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/span.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/span.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/spanned.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/spanned.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/spanned.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/spanned.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/stmt.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/stmt.rs
similarity index 97%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/stmt.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/stmt.rs
index ac8238a9..6261c7b 100644
--- a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/stmt.rs
+++ b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/stmt.rs
@@ -208,7 +208,8 @@
                 if ahead.peek2(Ident) || ahead.peek2(Token![try]) {
                     is_item_macro = true;
                 } else if ahead.peek2(token::Brace)
-                    && !(ahead.peek3(Token![.]) || ahead.peek3(Token![?]))
+                    && !(ahead.peek3(Token![.]) && !ahead.peek3(Token![..])
+                        || ahead.peek3(Token![?]))
                 {
                     input.advance_to(&ahead);
                     return stmt_mac(input, attrs, path).map(Stmt::Macro);
@@ -452,11 +453,12 @@
             self.pat.to_tokens(tokens);
             if let Some(init) = &self.init {
                 init.eq_token.to_tokens(tokens);
-                if init.diverge.is_some() && classify::expr_trailing_brace(&init.expr) {
-                    token::Paren::default().surround(tokens, |tokens| init.expr.to_tokens(tokens));
-                } else {
-                    init.expr.to_tokens(tokens);
-                }
+                expr::printing::print_subexpression(
+                    &init.expr,
+                    init.diverge.is_some() && classify::expr_trailing_brace(&init.expr),
+                    tokens,
+                    FixupContext::NONE,
+                );
                 if let Some((else_token, diverge)) = &init.diverge {
                     else_token.to_tokens(tokens);
                     match &**diverge {
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/thread.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/thread.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/thread.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/thread.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/token.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/token.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/token.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/token.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/tt.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/tt.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/tt.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/tt.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/ty.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/ty.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/ty.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/ty.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/verbatim.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/verbatim.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/verbatim.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/verbatim.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/whitespace.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/whitespace.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/whitespace.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/whitespace.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/common/eq.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/common/eq.rs
similarity index 99%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/common/eq.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/common/eq.rs
index f857f64..6a74c02 100644
--- a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/common/eq.rs
+++ b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/common/eq.rs
@@ -503,7 +503,7 @@
 spanless_eq_struct!(FnSig; header decl span);
 spanless_eq_struct!(ForeignMod; extern_span safety abi items);
 spanless_eq_struct!(FormatArgPosition; index kind span);
-spanless_eq_struct!(FormatArgs; span template arguments);
+spanless_eq_struct!(FormatArgs; span template arguments uncooked_fmt_str);
 spanless_eq_struct!(FormatArgument; kind expr);
 spanless_eq_struct!(FormatOptions; width precision alignment fill sign alternate zero_pad debug_hex);
 spanless_eq_struct!(FormatPlaceholder; argument span format_trait format_options);
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/common/mod.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/common/mod.rs
similarity index 88%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/common/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/common/mod.rs
index c85ac0b..ead830f8 100644
--- a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/common/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/common/mod.rs
@@ -3,3 +3,4 @@
 
 pub mod eq;
 pub mod parse;
+pub mod visit;
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/common/parse.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/common/parse.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/common/parse.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/common/parse.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/common/visit.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/common/visit.rs
new file mode 100644
index 0000000..b4ae5ec
--- /dev/null
+++ b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/common/visit.rs
@@ -0,0 +1,94 @@
+use proc_macro2::{Delimiter, Group, TokenStream, TokenTree};
+use std::mem;
+use syn::visit_mut::{self, VisitMut};
+use syn::{Expr, File, Generics, LifetimeParam, MacroDelimiter, Stmt, StmtMacro, TypeParam};
+
+pub struct FlattenParens;
+
+impl FlattenParens {
+    pub fn visit_token_stream_mut(tokens: &mut TokenStream) {
+        *tokens = mem::take(tokens)
+            .into_iter()
+            .flat_map(|tt| {
+                if let TokenTree::Group(group) = tt {
+                    let delimiter = group.delimiter();
+                    let mut content = group.stream();
+                    Self::visit_token_stream_mut(&mut content);
+                    if let Delimiter::Parenthesis = delimiter {
+                        content
+                    } else {
+                        TokenStream::from(TokenTree::Group(Group::new(delimiter, content)))
+                    }
+                } else {
+                    TokenStream::from(tt)
+                }
+            })
+            .collect();
+    }
+}
+
+impl VisitMut for FlattenParens {
+    fn visit_expr_mut(&mut self, e: &mut Expr) {
+        while let Expr::Paren(paren) = e {
+            *e = mem::replace(&mut *paren.expr, Expr::PLACEHOLDER);
+        }
+        visit_mut::visit_expr_mut(self, e);
+    }
+}
+
+pub struct AsIfPrinted;
+
+impl VisitMut for AsIfPrinted {
+    fn visit_file_mut(&mut self, file: &mut File) {
+        file.shebang = None;
+        visit_mut::visit_file_mut(self, file);
+    }
+
+    fn visit_generics_mut(&mut self, generics: &mut Generics) {
+        if generics.params.is_empty() {
+            generics.lt_token = None;
+            generics.gt_token = None;
+        }
+        if let Some(where_clause) = &generics.where_clause {
+            if where_clause.predicates.is_empty() {
+                generics.where_clause = None;
+            }
+        }
+        visit_mut::visit_generics_mut(self, generics);
+    }
+
+    fn visit_lifetime_param_mut(&mut self, param: &mut LifetimeParam) {
+        if param.bounds.is_empty() {
+            param.colon_token = None;
+        }
+        visit_mut::visit_lifetime_param_mut(self, param);
+    }
+
+    fn visit_stmt_mut(&mut self, stmt: &mut Stmt) {
+        if let Stmt::Expr(expr, semi) = stmt {
+            if let Expr::Macro(e) = expr {
+                if match e.mac.delimiter {
+                    MacroDelimiter::Brace(_) => true,
+                    MacroDelimiter::Paren(_) | MacroDelimiter::Bracket(_) => semi.is_some(),
+                } {
+                    let Expr::Macro(expr) = mem::replace(expr, Expr::PLACEHOLDER) else {
+                        unreachable!();
+                    };
+                    *stmt = Stmt::Macro(StmtMacro {
+                        attrs: expr.attrs,
+                        mac: expr.mac,
+                        semi_token: *semi,
+                    });
+                }
+            }
+        }
+        visit_mut::visit_stmt_mut(self, stmt);
+    }
+
+    fn visit_type_param_mut(&mut self, param: &mut TypeParam) {
+        if param.bounds.is_empty() {
+            param.colon_token = None;
+        }
+        visit_mut::visit_type_param_mut(self, param);
+    }
+}
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/debug/gen.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/debug/gen.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/debug/gen.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/debug/gen.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/debug/mod.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/debug/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/debug/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/debug/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/macros/mod.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/macros/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/macros/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/macros/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/regression.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/regression.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/regression.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/regression.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/regression/issue1108.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/regression/issue1108.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/regression/issue1108.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/regression/issue1108.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/regression/issue1235.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/regression/issue1235.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/regression/issue1235.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/regression/issue1235.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/repo/mod.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/repo/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/repo/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/repo/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/repo/progress.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/repo/progress.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/repo/progress.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/repo/progress.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/test_asyncness.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/test_asyncness.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/test_asyncness.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/test_asyncness.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/test_attribute.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/test_attribute.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/test_attribute.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/test_attribute.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/test_derive_input.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/test_derive_input.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/test_derive_input.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/test_derive_input.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/test_expr.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/test_expr.rs
new file mode 100644
index 0000000..cfbf162
--- /dev/null
+++ b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/test_expr.rs
@@ -0,0 +1,1631 @@
+#![cfg(not(miri))]
+#![recursion_limit = "1024"]
+#![feature(rustc_private)]
+#![allow(
+    clippy::match_like_matches_macro,
+    clippy::needless_lifetimes,
+    clippy::single_element_loop,
+    clippy::too_many_lines,
+    clippy::uninlined_format_args,
+    clippy::unreadable_literal
+)]
+
+#[macro_use]
+mod macros;
+
+mod common;
+
+use crate::common::visit::{AsIfPrinted, FlattenParens};
+use proc_macro2::{Delimiter, Group, Ident, Span, TokenStream};
+use quote::{quote, ToTokens as _};
+use std::process::ExitCode;
+use syn::punctuated::Punctuated;
+use syn::visit_mut::VisitMut as _;
+use syn::{
+    parse_quote, token, AngleBracketedGenericArguments, Arm, BinOp, Block, Expr, ExprArray,
+    ExprAssign, ExprAsync, ExprAwait, ExprBinary, ExprBlock, ExprBreak, ExprCall, ExprCast,
+    ExprClosure, ExprConst, ExprContinue, ExprField, ExprForLoop, ExprIf, ExprIndex, ExprLit,
+    ExprLoop, ExprMacro, ExprMatch, ExprMethodCall, ExprPath, ExprRange, ExprRawAddr,
+    ExprReference, ExprReturn, ExprStruct, ExprTry, ExprTryBlock, ExprTuple, ExprUnary, ExprUnsafe,
+    ExprWhile, ExprYield, GenericArgument, Label, Lifetime, Lit, LitInt, Macro, MacroDelimiter,
+    Member, Pat, PatWild, Path, PathArguments, PathSegment, PointerMutability, QSelf, RangeLimits,
+    ReturnType, Stmt, Token, Type, TypePath, UnOp,
+};
+
+#[test]
+fn test_expr_parse() {
+    let tokens = quote!(..100u32);
+    snapshot!(tokens as Expr, @r#"
+    Expr::Range {
+        limits: RangeLimits::HalfOpen,
+        end: Some(Expr::Lit {
+            lit: 100u32,
+        }),
+    }
+    "#);
+
+    let tokens = quote!(..100u32);
+    snapshot!(tokens as ExprRange, @r#"
+    ExprRange {
+        limits: RangeLimits::HalfOpen,
+        end: Some(Expr::Lit {
+            lit: 100u32,
+        }),
+    }
+    "#);
+}
+
+#[test]
+fn test_await() {
+    // Must not parse as Expr::Field.
+    let tokens = quote!(fut.await);
+
+    snapshot!(tokens as Expr, @r#"
+    Expr::Await {
+        base: Expr::Path {
+            path: Path {
+                segments: [
+                    PathSegment {
+                        ident: "fut",
+                    },
+                ],
+            },
+        },
+    }
+    "#);
+}
+
+#[rustfmt::skip]
+#[test]
+fn test_tuple_multi_index() {
+    let expected = snapshot!("tuple.0.0" as Expr, @r#"
+    Expr::Field {
+        base: Expr::Field {
+            base: Expr::Path {
+                path: Path {
+                    segments: [
+                        PathSegment {
+                            ident: "tuple",
+                        },
+                    ],
+                },
+            },
+            member: Member::Unnamed(Index {
+                index: 0,
+            }),
+        },
+        member: Member::Unnamed(Index {
+            index: 0,
+        }),
+    }
+    "#);
+
+    for &input in &[
+        "tuple .0.0",
+        "tuple. 0.0",
+        "tuple.0 .0",
+        "tuple.0. 0",
+        "tuple . 0 . 0",
+    ] {
+        assert_eq!(expected, syn::parse_str(input).unwrap());
+    }
+
+    for tokens in [
+        quote!(tuple.0.0),
+        quote!(tuple .0.0),
+        quote!(tuple. 0.0),
+        quote!(tuple.0 .0),
+        quote!(tuple.0. 0),
+        quote!(tuple . 0 . 0),
+    ] {
+        assert_eq!(expected, syn::parse2(tokens).unwrap());
+    }
+}
+
+#[test]
+fn test_macro_variable_func() {
+    // mimics the token stream corresponding to `$fn()`
+    let path = Group::new(Delimiter::None, quote!(f));
+    let tokens = quote!(#path());
+
+    snapshot!(tokens as Expr, @r#"
+    Expr::Call {
+        func: Expr::Group {
+            expr: Expr::Path {
+                path: Path {
+                    segments: [
+                        PathSegment {
+                            ident: "f",
+                        },
+                    ],
+                },
+            },
+        },
+    }
+    "#);
+
+    let path = Group::new(Delimiter::None, quote! { #[inside] f });
+    let tokens = quote!(#[outside] #path());
+
+    snapshot!(tokens as Expr, @r#"
+    Expr::Call {
+        attrs: [
+            Attribute {
+                style: AttrStyle::Outer,
+                meta: Meta::Path {
+                    segments: [
+                        PathSegment {
+                            ident: "outside",
+                        },
+                    ],
+                },
+            },
+        ],
+        func: Expr::Group {
+            expr: Expr::Path {
+                attrs: [
+                    Attribute {
+                        style: AttrStyle::Outer,
+                        meta: Meta::Path {
+                            segments: [
+                                PathSegment {
+                                    ident: "inside",
+                                },
+                            ],
+                        },
+                    },
+                ],
+                path: Path {
+                    segments: [
+                        PathSegment {
+                            ident: "f",
+                        },
+                    ],
+                },
+            },
+        },
+    }
+    "#);
+}
+
+#[test]
+fn test_macro_variable_macro() {
+    // mimics the token stream corresponding to `$macro!()`
+    let mac = Group::new(Delimiter::None, quote!(m));
+    let tokens = quote!(#mac!());
+
+    snapshot!(tokens as Expr, @r#"
+    Expr::Macro {
+        mac: Macro {
+            path: Path {
+                segments: [
+                    PathSegment {
+                        ident: "m",
+                    },
+                ],
+            },
+            delimiter: MacroDelimiter::Paren,
+            tokens: TokenStream(``),
+        },
+    }
+    "#);
+}
+
+#[test]
+fn test_macro_variable_struct() {
+    // mimics the token stream corresponding to `$struct {}`
+    let s = Group::new(Delimiter::None, quote! { S });
+    let tokens = quote!(#s {});
+
+    snapshot!(tokens as Expr, @r#"
+    Expr::Struct {
+        path: Path {
+            segments: [
+                PathSegment {
+                    ident: "S",
+                },
+            ],
+        },
+    }
+    "#);
+}
+
+#[test]
+fn test_macro_variable_unary() {
+    // mimics the token stream corresponding to `$expr.method()` where expr is `&self`
+    let inner = Group::new(Delimiter::None, quote!(&self));
+    let tokens = quote!(#inner.method());
+    snapshot!(tokens as Expr, @r#"
+    Expr::MethodCall {
+        receiver: Expr::Group {
+            expr: Expr::Reference {
+                expr: Expr::Path {
+                    path: Path {
+                        segments: [
+                            PathSegment {
+                                ident: "self",
+                            },
+                        ],
+                    },
+                },
+            },
+        },
+        method: "method",
+    }
+    "#);
+}
+
+#[test]
+fn test_macro_variable_match_arm() {
+    // mimics the token stream corresponding to `match v { _ => $expr }`
+    let expr = Group::new(Delimiter::None, quote! { #[a] () });
+    let tokens = quote!(match v { _ => #expr });
+    snapshot!(tokens as Expr, @r#"
+    Expr::Match {
+        expr: Expr::Path {
+            path: Path {
+                segments: [
+                    PathSegment {
+                        ident: "v",
+                    },
+                ],
+            },
+        },
+        arms: [
+            Arm {
+                pat: Pat::Wild,
+                body: Expr::Group {
+                    expr: Expr::Tuple {
+                        attrs: [
+                            Attribute {
+                                style: AttrStyle::Outer,
+                                meta: Meta::Path {
+                                    segments: [
+                                        PathSegment {
+                                            ident: "a",
+                                        },
+                                    ],
+                                },
+                            },
+                        ],
+                    },
+                },
+            },
+        ],
+    }
+    "#);
+
+    let expr = Group::new(Delimiter::None, quote!(loop {} + 1));
+    let tokens = quote!(match v { _ => #expr });
+    snapshot!(tokens as Expr, @r#"
+    Expr::Match {
+        expr: Expr::Path {
+            path: Path {
+                segments: [
+                    PathSegment {
+                        ident: "v",
+                    },
+                ],
+            },
+        },
+        arms: [
+            Arm {
+                pat: Pat::Wild,
+                body: Expr::Group {
+                    expr: Expr::Binary {
+                        left: Expr::Loop {
+                            body: Block {
+                                stmts: [],
+                            },
+                        },
+                        op: BinOp::Add,
+                        right: Expr::Lit {
+                            lit: 1,
+                        },
+                    },
+                },
+            },
+        ],
+    }
+    "#);
+}
+
+// https://github.com/dtolnay/syn/issues/1019
+#[test]
+fn test_closure_vs_rangefull() {
+    #[rustfmt::skip] // rustfmt bug: https://github.com/rust-lang/rustfmt/issues/4808
+    let tokens = quote!(|| .. .method());
+    snapshot!(tokens as Expr, @r#"
+    Expr::MethodCall {
+        receiver: Expr::Closure {
+            output: ReturnType::Default,
+            body: Expr::Range {
+                limits: RangeLimits::HalfOpen,
+            },
+        },
+        method: "method",
+    }
+    "#);
+}
+
+#[test]
+fn test_postfix_operator_after_cast() {
+    syn::parse_str::<Expr>("|| &x as T[0]").unwrap_err();
+    syn::parse_str::<Expr>("|| () as ()()").unwrap_err();
+}
+
+#[test]
+fn test_range_kinds() {
+    syn::parse_str::<Expr>("..").unwrap();
+    syn::parse_str::<Expr>("..hi").unwrap();
+    syn::parse_str::<Expr>("lo..").unwrap();
+    syn::parse_str::<Expr>("lo..hi").unwrap();
+
+    syn::parse_str::<Expr>("..=").unwrap_err();
+    syn::parse_str::<Expr>("..=hi").unwrap();
+    syn::parse_str::<Expr>("lo..=").unwrap_err();
+    syn::parse_str::<Expr>("lo..=hi").unwrap();
+
+    syn::parse_str::<Expr>("...").unwrap_err();
+    syn::parse_str::<Expr>("...hi").unwrap_err();
+    syn::parse_str::<Expr>("lo...").unwrap_err();
+    syn::parse_str::<Expr>("lo...hi").unwrap_err();
+}
+
+#[test]
+fn test_range_precedence() {
+    snapshot!(".. .." as Expr, @r#"
+    Expr::Range {
+        limits: RangeLimits::HalfOpen,
+        end: Some(Expr::Range {
+            limits: RangeLimits::HalfOpen,
+        }),
+    }
+    "#);
+
+    snapshot!(".. .. ()" as Expr, @r#"
+    Expr::Range {
+        limits: RangeLimits::HalfOpen,
+        end: Some(Expr::Range {
+            limits: RangeLimits::HalfOpen,
+            end: Some(Expr::Tuple),
+        }),
+    }
+    "#);
+
+    snapshot!("() .. .." as Expr, @r#"
+    Expr::Range {
+        start: Some(Expr::Tuple),
+        limits: RangeLimits::HalfOpen,
+        end: Some(Expr::Range {
+            limits: RangeLimits::HalfOpen,
+        }),
+    }
+    "#);
+
+    snapshot!("() = .. + ()" as Expr, @r"
+    Expr::Binary {
+        left: Expr::Assign {
+            left: Expr::Tuple,
+            right: Expr::Range {
+                limits: RangeLimits::HalfOpen,
+            },
+        },
+        op: BinOp::Add,
+        right: Expr::Tuple,
+    }
+    ");
+
+    // A range with a lower bound cannot be the upper bound of another range,
+    // and a range with an upper bound cannot be the lower bound of another
+    // range.
+    syn::parse_str::<Expr>(".. x ..").unwrap_err();
+    syn::parse_str::<Expr>("x .. x ..").unwrap_err();
+}
+
+#[test]
+fn test_ranges_bailout() {
+    syn::parse_str::<Expr>(".. ?").unwrap_err();
+    syn::parse_str::<Expr>(".. .field").unwrap_err();
+
+    snapshot!("return .. ?" as Expr, @r"
+    Expr::Try {
+        expr: Expr::Return {
+            expr: Some(Expr::Range {
+                limits: RangeLimits::HalfOpen,
+            }),
+        },
+    }
+    ");
+
+    snapshot!("break .. ?" as Expr, @r"
+    Expr::Try {
+        expr: Expr::Break {
+            expr: Some(Expr::Range {
+                limits: RangeLimits::HalfOpen,
+            }),
+        },
+    }
+    ");
+
+    snapshot!("|| .. ?" as Expr, @r"
+    Expr::Try {
+        expr: Expr::Closure {
+            output: ReturnType::Default,
+            body: Expr::Range {
+                limits: RangeLimits::HalfOpen,
+            },
+        },
+    }
+    ");
+
+    snapshot!("return .. .field" as Expr, @r#"
+    Expr::Field {
+        base: Expr::Return {
+            expr: Some(Expr::Range {
+                limits: RangeLimits::HalfOpen,
+            }),
+        },
+        member: Member::Named("field"),
+    }
+    "#);
+
+    snapshot!("break .. .field" as Expr, @r#"
+    Expr::Field {
+        base: Expr::Break {
+            expr: Some(Expr::Range {
+                limits: RangeLimits::HalfOpen,
+            }),
+        },
+        member: Member::Named("field"),
+    }
+    "#);
+
+    snapshot!("|| .. .field" as Expr, @r#"
+    Expr::Field {
+        base: Expr::Closure {
+            output: ReturnType::Default,
+            body: Expr::Range {
+                limits: RangeLimits::HalfOpen,
+            },
+        },
+        member: Member::Named("field"),
+    }
+    "#);
+
+    snapshot!("return .. = ()" as Expr, @r"
+    Expr::Assign {
+        left: Expr::Return {
+            expr: Some(Expr::Range {
+                limits: RangeLimits::HalfOpen,
+            }),
+        },
+        right: Expr::Tuple,
+    }
+    ");
+
+    snapshot!("return .. += ()" as Expr, @r"
+    Expr::Binary {
+        left: Expr::Return {
+            expr: Some(Expr::Range {
+                limits: RangeLimits::HalfOpen,
+            }),
+        },
+        op: BinOp::AddAssign,
+        right: Expr::Tuple,
+    }
+    ");
+}
+
+#[test]
+fn test_ambiguous_label() {
+    for stmt in [
+        quote! {
+            return 'label: loop { break 'label 42; };
+        },
+        quote! {
+            break ('label: loop { break 'label 42; });
+        },
+        quote! {
+            break 1 + 'label: loop { break 'label 42; };
+        },
+        quote! {
+            break 'outer 'inner: loop { break 'inner 42; };
+        },
+    ] {
+        syn::parse2::<Stmt>(stmt).unwrap();
+    }
+
+    for stmt in [
+        // Parentheses required. See https://github.com/rust-lang/rust/pull/87026.
+        quote! {
+            break 'label: loop { break 'label 42; };
+        },
+    ] {
+        syn::parse2::<Stmt>(stmt).unwrap_err();
+    }
+}
+
+#[test]
+fn test_extended_interpolated_path() {
+    let path = Group::new(Delimiter::None, quote!(a::b));
+
+    let tokens = quote!(if #path {});
+    snapshot!(tokens as Expr, @r#"
+    Expr::If {
+        cond: Expr::Group {
+            expr: Expr::Path {
+                path: Path {
+                    segments: [
+                        PathSegment {
+                            ident: "a",
+                        },
+                        Token![::],
+                        PathSegment {
+                            ident: "b",
+                        },
+                    ],
+                },
+            },
+        },
+        then_branch: Block {
+            stmts: [],
+        },
+    }
+    "#);
+
+    let tokens = quote!(#path {});
+    snapshot!(tokens as Expr, @r#"
+    Expr::Struct {
+        path: Path {
+            segments: [
+                PathSegment {
+                    ident: "a",
+                },
+                Token![::],
+                PathSegment {
+                    ident: "b",
+                },
+            ],
+        },
+    }
+    "#);
+
+    let tokens = quote!(#path :: c);
+    snapshot!(tokens as Expr, @r#"
+    Expr::Path {
+        path: Path {
+            segments: [
+                PathSegment {
+                    ident: "a",
+                },
+                Token![::],
+                PathSegment {
+                    ident: "b",
+                },
+                Token![::],
+                PathSegment {
+                    ident: "c",
+                },
+            ],
+        },
+    }
+    "#);
+
+    let nested = Group::new(Delimiter::None, quote!(a::b || true));
+    let tokens = quote!(if #nested && false {});
+    snapshot!(tokens as Expr, @r#"
+    Expr::If {
+        cond: Expr::Binary {
+            left: Expr::Group {
+                expr: Expr::Binary {
+                    left: Expr::Path {
+                        path: Path {
+                            segments: [
+                                PathSegment {
+                                    ident: "a",
+                                },
+                                Token![::],
+                                PathSegment {
+                                    ident: "b",
+                                },
+                            ],
+                        },
+                    },
+                    op: BinOp::Or,
+                    right: Expr::Lit {
+                        lit: Lit::Bool {
+                            value: true,
+                        },
+                    },
+                },
+            },
+            op: BinOp::And,
+            right: Expr::Lit {
+                lit: Lit::Bool {
+                    value: false,
+                },
+            },
+        },
+        then_branch: Block {
+            stmts: [],
+        },
+    }
+    "#);
+}
+
+#[test]
+fn test_tuple_comma() {
+    let mut expr = ExprTuple {
+        attrs: Vec::new(),
+        paren_token: token::Paren::default(),
+        elems: Punctuated::new(),
+    };
+    snapshot!(expr.to_token_stream() as Expr, @"Expr::Tuple");
+
+    expr.elems.push_value(parse_quote!(continue));
+    // Must not parse to Expr::Paren
+    snapshot!(expr.to_token_stream() as Expr, @r#"
+    Expr::Tuple {
+        elems: [
+            Expr::Continue,
+            Token![,],
+        ],
+    }
+    "#);
+
+    expr.elems.push_punct(<Token![,]>::default());
+    snapshot!(expr.to_token_stream() as Expr, @r#"
+    Expr::Tuple {
+        elems: [
+            Expr::Continue,
+            Token![,],
+        ],
+    }
+    "#);
+
+    expr.elems.push_value(parse_quote!(continue));
+    snapshot!(expr.to_token_stream() as Expr, @r#"
+    Expr::Tuple {
+        elems: [
+            Expr::Continue,
+            Token![,],
+            Expr::Continue,
+        ],
+    }
+    "#);
+
+    expr.elems.push_punct(<Token![,]>::default());
+    snapshot!(expr.to_token_stream() as Expr, @r#"
+    Expr::Tuple {
+        elems: [
+            Expr::Continue,
+            Token![,],
+            Expr::Continue,
+            Token![,],
+        ],
+    }
+    "#);
+}
+
+#[test]
+fn test_binop_associativity() {
+    // Left to right.
+    snapshot!("() + () + ()" as Expr, @r#"
+    Expr::Binary {
+        left: Expr::Binary {
+            left: Expr::Tuple,
+            op: BinOp::Add,
+            right: Expr::Tuple,
+        },
+        op: BinOp::Add,
+        right: Expr::Tuple,
+    }
+    "#);
+
+    // Right to left.
+    snapshot!("() += () += ()" as Expr, @r#"
+    Expr::Binary {
+        left: Expr::Tuple,
+        op: BinOp::AddAssign,
+        right: Expr::Binary {
+            left: Expr::Tuple,
+            op: BinOp::AddAssign,
+            right: Expr::Tuple,
+        },
+    }
+    "#);
+
+    // Parenthesization is required.
+    syn::parse_str::<Expr>("() == () == ()").unwrap_err();
+}
+
+#[test]
+fn test_assign_range_precedence() {
+    // Range has higher precedence as the right-hand of an assignment, but
+    // ambiguous precedence as the left-hand of an assignment.
+    snapshot!("() = () .. ()" as Expr, @r#"
+    Expr::Assign {
+        left: Expr::Tuple,
+        right: Expr::Range {
+            start: Some(Expr::Tuple),
+            limits: RangeLimits::HalfOpen,
+            end: Some(Expr::Tuple),
+        },
+    }
+    "#);
+
+    snapshot!("() += () .. ()" as Expr, @r#"
+    Expr::Binary {
+        left: Expr::Tuple,
+        op: BinOp::AddAssign,
+        right: Expr::Range {
+            start: Some(Expr::Tuple),
+            limits: RangeLimits::HalfOpen,
+            end: Some(Expr::Tuple),
+        },
+    }
+    "#);
+
+    syn::parse_str::<Expr>("() .. () = ()").unwrap_err();
+    syn::parse_str::<Expr>("() .. () += ()").unwrap_err();
+}
+
+#[test]
+fn test_chained_comparison() {
+    // https://github.com/dtolnay/syn/issues/1738
+    let _ = syn::parse_str::<Expr>("a = a < a <");
+    let _ = syn::parse_str::<Expr>("a = a .. a ..");
+    let _ = syn::parse_str::<Expr>("a = a .. a +=");
+
+    let err = syn::parse_str::<Expr>("a < a < a").unwrap_err();
+    assert_eq!("comparison operators cannot be chained", err.to_string());
+
+    let err = syn::parse_str::<Expr>("a .. a .. a").unwrap_err();
+    assert_eq!("unexpected token", err.to_string());
+
+    let err = syn::parse_str::<Expr>("a .. a += a").unwrap_err();
+    assert_eq!("unexpected token", err.to_string());
+}
+
+#[test]
+fn test_fixup() {
+    for tokens in [
+        quote! { 2 * (1 + 1) },
+        quote! { 0 + (0 + 0) },
+        quote! { (a = b) = c },
+        quote! { (x as i32) < 0 },
+        quote! { 1 + (x as i32) < 0 },
+        quote! { (1 + 1).abs() },
+        quote! { (lo..hi)[..] },
+        quote! { (a..b)..(c..d) },
+        quote! { (&mut fut).await },
+        quote! { &mut (x as i32) },
+        quote! { -(x as i32) },
+        quote! { if (S {}) == 1 {} },
+        quote! { { (m! {}) - 1 } },
+        quote! { match m { _ => ({}) - 1 } },
+        quote! { if let _ = (a && b) && c {} },
+        quote! { if let _ = (S {}) {} },
+        quote! { if (S {}) == 0 && let Some(_) = x {} },
+        quote! { break ('a: loop { break 'a 1 } + 1) },
+        quote! { a + (|| b) + c },
+        quote! { if let _ = ((break) - 1 || true) {} },
+        quote! { if let _ = (break + 1 || true) {} },
+        quote! { if break (break) {} },
+        quote! { if break break {} {} },
+        quote! { if return (..) {} },
+        quote! { if return .. {} {} },
+        quote! { if || (Struct {}) {} },
+        quote! { if || (Struct {}).await {} },
+        quote! { if break || Struct {}.await {} },
+        quote! { if break 'outer 'block: {} {} },
+        quote! { if ..'block: {} {} },
+        quote! { if break ({}).await {} },
+        quote! { (break)() },
+        quote! { (..) = () },
+        quote! { (..) += () },
+        quote! { (1 < 2) == (3 < 4) },
+        quote! { { (let _ = ()) } },
+        quote! { (#[attr] thing).field },
+        quote! { (self.f)() },
+        quote! { (return)..=return },
+        quote! { 1 + (return)..=1 + return },
+        quote! { .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. },
+    ] {
+        let original: Expr = syn::parse2(tokens).unwrap();
+
+        let mut flat = original.clone();
+        FlattenParens.visit_expr_mut(&mut flat);
+        let reconstructed: Expr = match syn::parse2(flat.to_token_stream()) {
+            Ok(reconstructed) => reconstructed,
+            Err(err) => panic!("failed to parse `{}`: {}", flat.to_token_stream(), err),
+        };
+
+        assert!(
+            original == reconstructed,
+            "original: {}\n{:#?}\nreconstructed: {}\n{:#?}",
+            original.to_token_stream(),
+            crate::macros::debug::Lite(&original),
+            reconstructed.to_token_stream(),
+            crate::macros::debug::Lite(&reconstructed),
+        );
+    }
+}
+
+#[test]
+fn test_permutations() -> ExitCode {
+    fn iter(depth: usize, f: &mut dyn FnMut(Expr)) {
+        let span = Span::call_site();
+
+        // Expr::Path
+        f(Expr::Path(ExprPath {
+            // `x`
+            attrs: Vec::new(),
+            qself: None,
+            path: Path::from(Ident::new("x", span)),
+        }));
+        if false {
+            f(Expr::Path(ExprPath {
+                // `x::<T>`
+                attrs: Vec::new(),
+                qself: None,
+                path: Path {
+                    leading_colon: None,
+                    segments: Punctuated::from_iter([PathSegment {
+                        ident: Ident::new("x", span),
+                        arguments: PathArguments::AngleBracketed(AngleBracketedGenericArguments {
+                            colon2_token: Some(Token![::](span)),
+                            lt_token: Token![<](span),
+                            args: Punctuated::from_iter([GenericArgument::Type(Type::Path(
+                                TypePath {
+                                    qself: None,
+                                    path: Path::from(Ident::new("T", span)),
+                                },
+                            ))]),
+                            gt_token: Token![>](span),
+                        }),
+                    }]),
+                },
+            }));
+            f(Expr::Path(ExprPath {
+                // `<T as Trait>::CONST`
+                attrs: Vec::new(),
+                qself: Some(QSelf {
+                    lt_token: Token![<](span),
+                    ty: Box::new(Type::Path(TypePath {
+                        qself: None,
+                        path: Path::from(Ident::new("T", span)),
+                    })),
+                    position: 1,
+                    as_token: Some(Token![as](span)),
+                    gt_token: Token![>](span),
+                }),
+                path: Path {
+                    leading_colon: None,
+                    segments: Punctuated::from_iter([
+                        PathSegment::from(Ident::new("Trait", span)),
+                        PathSegment::from(Ident::new("CONST", span)),
+                    ]),
+                },
+            }));
+        }
+
+        let Some(depth) = depth.checked_sub(1) else {
+            return;
+        };
+
+        // Expr::Assign
+        iter(depth, &mut |expr| {
+            iter(0, &mut |simple| {
+                f(Expr::Assign(ExprAssign {
+                    // `x = $expr`
+                    attrs: Vec::new(),
+                    left: Box::new(simple.clone()),
+                    eq_token: Token![=](span),
+                    right: Box::new(expr.clone()),
+                }));
+                f(Expr::Assign(ExprAssign {
+                    // `$expr = x`
+                    attrs: Vec::new(),
+                    left: Box::new(expr.clone()),
+                    eq_token: Token![=](span),
+                    right: Box::new(simple),
+                }));
+            });
+        });
+
+        // Expr::Binary
+        iter(depth, &mut |expr| {
+            iter(0, &mut |simple| {
+                for op in [
+                    BinOp::Add(Token![+](span)),
+                    //BinOp::Sub(Token![-](span)),
+                    //BinOp::Mul(Token![*](span)),
+                    //BinOp::Div(Token![/](span)),
+                    //BinOp::Rem(Token![%](span)),
+                    //BinOp::And(Token![&&](span)),
+                    //BinOp::Or(Token![||](span)),
+                    //BinOp::BitXor(Token![^](span)),
+                    //BinOp::BitAnd(Token![&](span)),
+                    //BinOp::BitOr(Token![|](span)),
+                    //BinOp::Shl(Token![<<](span)),
+                    //BinOp::Shr(Token![>>](span)),
+                    //BinOp::Eq(Token![==](span)),
+                    BinOp::Lt(Token![<](span)),
+                    //BinOp::Le(Token![<=](span)),
+                    //BinOp::Ne(Token![!=](span)),
+                    //BinOp::Ge(Token![>=](span)),
+                    //BinOp::Gt(Token![>](span)),
+                    BinOp::ShlAssign(Token![<<=](span)),
+                ] {
+                    f(Expr::Binary(ExprBinary {
+                        // `x + $expr`
+                        attrs: Vec::new(),
+                        left: Box::new(simple.clone()),
+                        op,
+                        right: Box::new(expr.clone()),
+                    }));
+                    f(Expr::Binary(ExprBinary {
+                        // `$expr + x`
+                        attrs: Vec::new(),
+                        left: Box::new(expr.clone()),
+                        op,
+                        right: Box::new(simple.clone()),
+                    }));
+                }
+            });
+        });
+
+        // Expr::Block
+        f(Expr::Block(ExprBlock {
+            // `{}`
+            attrs: Vec::new(),
+            label: None,
+            block: Block {
+                brace_token: token::Brace(span),
+                stmts: Vec::new(),
+            },
+        }));
+
+        // Expr::Break
+        f(Expr::Break(ExprBreak {
+            // `break`
+            attrs: Vec::new(),
+            break_token: Token![break](span),
+            label: None,
+            expr: None,
+        }));
+        iter(depth, &mut |expr| {
+            f(Expr::Break(ExprBreak {
+                // `break $expr`
+                attrs: Vec::new(),
+                break_token: Token![break](span),
+                label: None,
+                expr: Some(Box::new(expr)),
+            }));
+        });
+
+        // Expr::Call
+        iter(depth, &mut |expr| {
+            f(Expr::Call(ExprCall {
+                // `$expr()`
+                attrs: Vec::new(),
+                func: Box::new(expr),
+                paren_token: token::Paren(span),
+                args: Punctuated::new(),
+            }));
+        });
+
+        // Expr::Cast
+        iter(depth, &mut |expr| {
+            f(Expr::Cast(ExprCast {
+                // `$expr as T`
+                attrs: Vec::new(),
+                expr: Box::new(expr),
+                as_token: Token![as](span),
+                ty: Box::new(Type::Path(TypePath {
+                    qself: None,
+                    path: Path::from(Ident::new("T", span)),
+                })),
+            }));
+        });
+
+        // Expr::Closure
+        iter(depth, &mut |expr| {
+            f(Expr::Closure(ExprClosure {
+                // `|| $expr`
+                attrs: Vec::new(),
+                lifetimes: None,
+                constness: None,
+                movability: None,
+                asyncness: None,
+                capture: None,
+                or1_token: Token![|](span),
+                inputs: Punctuated::new(),
+                or2_token: Token![|](span),
+                output: ReturnType::Default,
+                body: Box::new(expr),
+            }));
+        });
+
+        // Expr::Field
+        iter(depth, &mut |expr| {
+            f(Expr::Field(ExprField {
+                // `$expr.field`
+                attrs: Vec::new(),
+                base: Box::new(expr),
+                dot_token: Token![.](span),
+                member: Member::Named(Ident::new("field", span)),
+            }));
+        });
+
+        // Expr::If
+        iter(depth, &mut |expr| {
+            f(Expr::If(ExprIf {
+                // `if $expr {}`
+                attrs: Vec::new(),
+                if_token: Token![if](span),
+                cond: Box::new(expr),
+                then_branch: Block {
+                    brace_token: token::Brace(span),
+                    stmts: Vec::new(),
+                },
+                else_branch: None,
+            }));
+        });
+
+        // Expr::Range
+        f(Expr::Range(ExprRange {
+            // `..`
+            attrs: Vec::new(),
+            start: None,
+            limits: RangeLimits::HalfOpen(Token![..](span)),
+            end: None,
+        }));
+        iter(depth, &mut |expr| {
+            f(Expr::Range(ExprRange {
+                // `..$expr`
+                attrs: Vec::new(),
+                start: None,
+                limits: RangeLimits::HalfOpen(Token![..](span)),
+                end: Some(Box::new(expr.clone())),
+            }));
+            f(Expr::Range(ExprRange {
+                // `$expr..`
+                attrs: Vec::new(),
+                start: Some(Box::new(expr)),
+                limits: RangeLimits::HalfOpen(Token![..](span)),
+                end: None,
+            }));
+        });
+
+        // Expr::Reference
+        iter(depth, &mut |expr| {
+            f(Expr::Reference(ExprReference {
+                // `&$expr`
+                attrs: Vec::new(),
+                and_token: Token![&](span),
+                mutability: None,
+                expr: Box::new(expr),
+            }));
+        });
+
+        // Expr::Return
+        f(Expr::Return(ExprReturn {
+            // `return`
+            attrs: Vec::new(),
+            return_token: Token![return](span),
+            expr: None,
+        }));
+        iter(depth, &mut |expr| {
+            f(Expr::Return(ExprReturn {
+                // `return $expr`
+                attrs: Vec::new(),
+                return_token: Token![return](span),
+                expr: Some(Box::new(expr)),
+            }));
+        });
+
+        // Expr::Try
+        iter(depth, &mut |expr| {
+            f(Expr::Try(ExprTry {
+                // `$expr?`
+                attrs: Vec::new(),
+                expr: Box::new(expr),
+                question_token: Token![?](span),
+            }));
+        });
+
+        // Expr::Unary
+        iter(depth, &mut |expr| {
+            for op in [
+                UnOp::Deref(Token![*](span)),
+                //UnOp::Not(Token![!](span)),
+                //UnOp::Neg(Token![-](span)),
+            ] {
+                f(Expr::Unary(ExprUnary {
+                    // `*$expr`
+                    attrs: Vec::new(),
+                    op,
+                    expr: Box::new(expr.clone()),
+                }));
+            }
+        });
+
+        if false {
+            // Expr::Array
+            f(Expr::Array(ExprArray {
+                // `[]`
+                attrs: Vec::new(),
+                bracket_token: token::Bracket(span),
+                elems: Punctuated::new(),
+            }));
+
+            // Expr::Async
+            f(Expr::Async(ExprAsync {
+                // `async {}`
+                attrs: Vec::new(),
+                async_token: Token![async](span),
+                capture: None,
+                block: Block {
+                    brace_token: token::Brace(span),
+                    stmts: Vec::new(),
+                },
+            }));
+
+            // Expr::Await
+            iter(depth, &mut |expr| {
+                f(Expr::Await(ExprAwait {
+                    // `$expr.await`
+                    attrs: Vec::new(),
+                    base: Box::new(expr),
+                    dot_token: Token![.](span),
+                    await_token: Token![await](span),
+                }));
+            });
+
+            // Expr::Block
+            f(Expr::Block(ExprBlock {
+                // `'a: {}`
+                attrs: Vec::new(),
+                label: Some(Label {
+                    name: Lifetime::new("'a", span),
+                    colon_token: Token![:](span),
+                }),
+                block: Block {
+                    brace_token: token::Brace(span),
+                    stmts: Vec::new(),
+                },
+            }));
+            iter(depth, &mut |expr| {
+                f(Expr::Block(ExprBlock {
+                    // `{ $expr }`
+                    attrs: Vec::new(),
+                    label: None,
+                    block: Block {
+                        brace_token: token::Brace(span),
+                        stmts: Vec::from([Stmt::Expr(expr.clone(), None)]),
+                    },
+                }));
+                f(Expr::Block(ExprBlock {
+                    // `{ $expr; }`
+                    attrs: Vec::new(),
+                    label: None,
+                    block: Block {
+                        brace_token: token::Brace(span),
+                        stmts: Vec::from([Stmt::Expr(expr, Some(Token![;](span)))]),
+                    },
+                }));
+            });
+
+            // Expr::Break
+            f(Expr::Break(ExprBreak {
+                // `break 'a`
+                attrs: Vec::new(),
+                break_token: Token![break](span),
+                label: Some(Lifetime::new("'a", span)),
+                expr: None,
+            }));
+            iter(depth, &mut |expr| {
+                f(Expr::Break(ExprBreak {
+                    // `break 'a $expr`
+                    attrs: Vec::new(),
+                    break_token: Token![break](span),
+                    label: Some(Lifetime::new("'a", span)),
+                    expr: Some(Box::new(expr)),
+                }));
+            });
+
+            // Expr::Closure
+            f(Expr::Closure(ExprClosure {
+                // `|| -> T {}`
+                attrs: Vec::new(),
+                lifetimes: None,
+                constness: None,
+                movability: None,
+                asyncness: None,
+                capture: None,
+                or1_token: Token![|](span),
+                inputs: Punctuated::new(),
+                or2_token: Token![|](span),
+                output: ReturnType::Type(
+                    Token![->](span),
+                    Box::new(Type::Path(TypePath {
+                        qself: None,
+                        path: Path::from(Ident::new("T", span)),
+                    })),
+                ),
+                body: Box::new(Expr::Block(ExprBlock {
+                    attrs: Vec::new(),
+                    label: None,
+                    block: Block {
+                        brace_token: token::Brace(span),
+                        stmts: Vec::new(),
+                    },
+                })),
+            }));
+
+            // Expr::Const
+            f(Expr::Const(ExprConst {
+                // `const {}`
+                attrs: Vec::new(),
+                const_token: Token![const](span),
+                block: Block {
+                    brace_token: token::Brace(span),
+                    stmts: Vec::new(),
+                },
+            }));
+
+            // Expr::Continue
+            f(Expr::Continue(ExprContinue {
+                // `continue`
+                attrs: Vec::new(),
+                continue_token: Token![continue](span),
+                label: None,
+            }));
+            f(Expr::Continue(ExprContinue {
+                // `continue 'a`
+                attrs: Vec::new(),
+                continue_token: Token![continue](span),
+                label: Some(Lifetime::new("'a", span)),
+            }));
+
+            // Expr::ForLoop
+            iter(depth, &mut |expr| {
+                f(Expr::ForLoop(ExprForLoop {
+                    // `for _ in $expr {}`
+                    attrs: Vec::new(),
+                    label: None,
+                    for_token: Token![for](span),
+                    pat: Box::new(Pat::Wild(PatWild {
+                        attrs: Vec::new(),
+                        underscore_token: Token![_](span),
+                    })),
+                    in_token: Token![in](span),
+                    expr: Box::new(expr.clone()),
+                    body: Block {
+                        brace_token: token::Brace(span),
+                        stmts: Vec::new(),
+                    },
+                }));
+                f(Expr::ForLoop(ExprForLoop {
+                    // `'a: for _ in $expr {}`
+                    attrs: Vec::new(),
+                    label: Some(Label {
+                        name: Lifetime::new("'a", span),
+                        colon_token: Token![:](span),
+                    }),
+                    for_token: Token![for](span),
+                    pat: Box::new(Pat::Wild(PatWild {
+                        attrs: Vec::new(),
+                        underscore_token: Token![_](span),
+                    })),
+                    in_token: Token![in](span),
+                    expr: Box::new(expr),
+                    body: Block {
+                        brace_token: token::Brace(span),
+                        stmts: Vec::new(),
+                    },
+                }));
+            });
+
+            // Expr::Index
+            iter(depth, &mut |expr| {
+                f(Expr::Index(ExprIndex {
+                    // `$expr[0]`
+                    attrs: Vec::new(),
+                    expr: Box::new(expr),
+                    bracket_token: token::Bracket(span),
+                    index: Box::new(Expr::Lit(ExprLit {
+                        attrs: Vec::new(),
+                        lit: Lit::Int(LitInt::new("0", span)),
+                    })),
+                }));
+            });
+
+            // Expr::Loop
+            f(Expr::Loop(ExprLoop {
+                // `loop {}`
+                attrs: Vec::new(),
+                label: None,
+                loop_token: Token![loop](span),
+                body: Block {
+                    brace_token: token::Brace(span),
+                    stmts: Vec::new(),
+                },
+            }));
+            f(Expr::Loop(ExprLoop {
+                // `'a: loop {}`
+                attrs: Vec::new(),
+                label: Some(Label {
+                    name: Lifetime::new("'a", span),
+                    colon_token: Token![:](span),
+                }),
+                loop_token: Token![loop](span),
+                body: Block {
+                    brace_token: token::Brace(span),
+                    stmts: Vec::new(),
+                },
+            }));
+
+            // Expr::Macro
+            f(Expr::Macro(ExprMacro {
+                // `m!()`
+                attrs: Vec::new(),
+                mac: Macro {
+                    path: Path::from(Ident::new("m", span)),
+                    bang_token: Token![!](span),
+                    delimiter: MacroDelimiter::Paren(token::Paren(span)),
+                    tokens: TokenStream::new(),
+                },
+            }));
+            f(Expr::Macro(ExprMacro {
+                // `m! {}`
+                attrs: Vec::new(),
+                mac: Macro {
+                    path: Path::from(Ident::new("m", span)),
+                    bang_token: Token![!](span),
+                    delimiter: MacroDelimiter::Brace(token::Brace(span)),
+                    tokens: TokenStream::new(),
+                },
+            }));
+
+            // Expr::Match
+            iter(depth, &mut |expr| {
+                f(Expr::Match(ExprMatch {
+                    // `match $expr {}`
+                    attrs: Vec::new(),
+                    match_token: Token![match](span),
+                    expr: Box::new(expr.clone()),
+                    brace_token: token::Brace(span),
+                    arms: Vec::new(),
+                }));
+                f(Expr::Match(ExprMatch {
+                    // `match x { _ => $expr }`
+                    attrs: Vec::new(),
+                    match_token: Token![match](span),
+                    expr: Box::new(Expr::Path(ExprPath {
+                        attrs: Vec::new(),
+                        qself: None,
+                        path: Path::from(Ident::new("x", span)),
+                    })),
+                    brace_token: token::Brace(span),
+                    arms: Vec::from([Arm {
+                        attrs: Vec::new(),
+                        pat: Pat::Wild(PatWild {
+                            attrs: Vec::new(),
+                            underscore_token: Token![_](span),
+                        }),
+                        guard: None,
+                        fat_arrow_token: Token![=>](span),
+                        body: Box::new(expr.clone()),
+                        comma: None,
+                    }]),
+                }));
+                f(Expr::Match(ExprMatch {
+                    // `match x { _ if $expr => {} }`
+                    attrs: Vec::new(),
+                    match_token: Token![match](span),
+                    expr: Box::new(Expr::Path(ExprPath {
+                        attrs: Vec::new(),
+                        qself: None,
+                        path: Path::from(Ident::new("x", span)),
+                    })),
+                    brace_token: token::Brace(span),
+                    arms: Vec::from([Arm {
+                        attrs: Vec::new(),
+                        pat: Pat::Wild(PatWild {
+                            attrs: Vec::new(),
+                            underscore_token: Token![_](span),
+                        }),
+                        guard: Some((Token![if](span), Box::new(expr))),
+                        fat_arrow_token: Token![=>](span),
+                        body: Box::new(Expr::Block(ExprBlock {
+                            attrs: Vec::new(),
+                            label: None,
+                            block: Block {
+                                brace_token: token::Brace(span),
+                                stmts: Vec::new(),
+                            },
+                        })),
+                        comma: None,
+                    }]),
+                }));
+            });
+
+            // Expr::MethodCall
+            iter(depth, &mut |expr| {
+                f(Expr::MethodCall(ExprMethodCall {
+                    // `$expr.method()`
+                    attrs: Vec::new(),
+                    receiver: Box::new(expr.clone()),
+                    dot_token: Token![.](span),
+                    method: Ident::new("method", span),
+                    turbofish: None,
+                    paren_token: token::Paren(span),
+                    args: Punctuated::new(),
+                }));
+                f(Expr::MethodCall(ExprMethodCall {
+                    // `$expr.method::<T>()`
+                    attrs: Vec::new(),
+                    receiver: Box::new(expr),
+                    dot_token: Token![.](span),
+                    method: Ident::new("method", span),
+                    turbofish: Some(AngleBracketedGenericArguments {
+                        colon2_token: Some(Token![::](span)),
+                        lt_token: Token![<](span),
+                        args: Punctuated::from_iter([GenericArgument::Type(Type::Path(
+                            TypePath {
+                                qself: None,
+                                path: Path::from(Ident::new("T", span)),
+                            },
+                        ))]),
+                        gt_token: Token![>](span),
+                    }),
+                    paren_token: token::Paren(span),
+                    args: Punctuated::new(),
+                }));
+            });
+
+            // Expr::RawAddr
+            iter(depth, &mut |expr| {
+                f(Expr::RawAddr(ExprRawAddr {
+                    // `&raw const $expr`
+                    attrs: Vec::new(),
+                    and_token: Token![&](span),
+                    raw: Token![raw](span),
+                    mutability: PointerMutability::Const(Token![const](span)),
+                    expr: Box::new(expr),
+                }));
+            });
+
+            // Expr::Struct
+            f(Expr::Struct(ExprStruct {
+                // `Struct {}`
+                attrs: Vec::new(),
+                qself: None,
+                path: Path::from(Ident::new("Struct", span)),
+                brace_token: token::Brace(span),
+                fields: Punctuated::new(),
+                dot2_token: None,
+                rest: None,
+            }));
+
+            // Expr::TryBlock
+            f(Expr::TryBlock(ExprTryBlock {
+                // `try {}`
+                attrs: Vec::new(),
+                try_token: Token![try](span),
+                block: Block {
+                    brace_token: token::Brace(span),
+                    stmts: Vec::new(),
+                },
+            }));
+
+            // Expr::Unsafe
+            f(Expr::Unsafe(ExprUnsafe {
+                // `unsafe {}`
+                attrs: Vec::new(),
+                unsafe_token: Token![unsafe](span),
+                block: Block {
+                    brace_token: token::Brace(span),
+                    stmts: Vec::new(),
+                },
+            }));
+
+            // Expr::While
+            iter(depth, &mut |expr| {
+                f(Expr::While(ExprWhile {
+                    // `while $expr {}`
+                    attrs: Vec::new(),
+                    label: None,
+                    while_token: Token![while](span),
+                    cond: Box::new(expr.clone()),
+                    body: Block {
+                        brace_token: token::Brace(span),
+                        stmts: Vec::new(),
+                    },
+                }));
+                f(Expr::While(ExprWhile {
+                    // `'a: while $expr {}`
+                    attrs: Vec::new(),
+                    label: Some(Label {
+                        name: Lifetime::new("'a", span),
+                        colon_token: Token![:](span),
+                    }),
+                    while_token: Token![while](span),
+                    cond: Box::new(expr),
+                    body: Block {
+                        brace_token: token::Brace(span),
+                        stmts: Vec::new(),
+                    },
+                }));
+            });
+
+            // Expr::Yield
+            f(Expr::Yield(ExprYield {
+                // `yield`
+                attrs: Vec::new(),
+                yield_token: Token![yield](span),
+                expr: None,
+            }));
+            iter(depth, &mut |expr| {
+                f(Expr::Yield(ExprYield {
+                    // `yield $expr`
+                    attrs: Vec::new(),
+                    yield_token: Token![yield](span),
+                    expr: Some(Box::new(expr)),
+                }));
+            });
+        }
+    }
+
+    let mut failures = 0;
+    macro_rules! fail {
+        ($($message:tt)*) => {{
+            eprintln!($($message)*);
+            failures += 1;
+            return;
+        }};
+    }
+    let mut assert = |mut original: Expr| {
+        let tokens = original.to_token_stream();
+        let Ok(mut parsed) = syn::parse2::<Expr>(tokens.clone()) else {
+            fail!(
+                "failed to parse: {}\n{:#?}",
+                tokens,
+                crate::macros::debug::Lite(&original),
+            );
+        };
+        AsIfPrinted.visit_expr_mut(&mut original);
+        FlattenParens.visit_expr_mut(&mut parsed);
+        if original != parsed {
+            fail!(
+                "before: {}\n{:#?}\nafter: {}\n{:#?}",
+                tokens,
+                crate::macros::debug::Lite(&original),
+                parsed.to_token_stream(),
+                crate::macros::debug::Lite(&parsed),
+            );
+        }
+        let mut tokens_no_paren = tokens.clone();
+        FlattenParens::visit_token_stream_mut(&mut tokens_no_paren);
+        if tokens.to_string() != tokens_no_paren.to_string() {
+            if let Ok(mut parsed2) = syn::parse2::<Expr>(tokens_no_paren) {
+                FlattenParens.visit_expr_mut(&mut parsed2);
+                if original == parsed2 {
+                    fail!("redundant parens: {}", tokens);
+                }
+            }
+        }
+    };
+
+    iter(4, &mut assert);
+    if failures > 0 {
+        eprintln!("FAILURES: {failures}");
+        ExitCode::FAILURE
+    } else {
+        ExitCode::SUCCESS
+    }
+}
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/test_generics.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/test_generics.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/test_generics.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/test_generics.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/test_grouping.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/test_grouping.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/test_grouping.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/test_grouping.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/test_ident.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/test_ident.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/test_ident.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/test_ident.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/test_item.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/test_item.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/test_item.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/test_item.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/test_iterators.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/test_iterators.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/test_iterators.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/test_iterators.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/test_lit.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/test_lit.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/test_lit.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/test_lit.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/test_meta.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/test_meta.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/test_meta.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/test_meta.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/test_parse_buffer.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/test_parse_buffer.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/test_parse_buffer.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/test_parse_buffer.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/test_parse_quote.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/test_parse_quote.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/test_parse_quote.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/test_parse_quote.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/test_parse_stream.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/test_parse_stream.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/test_parse_stream.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/test_parse_stream.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/test_pat.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/test_pat.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/test_pat.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/test_pat.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/test_path.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/test_path.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/test_path.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/test_path.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/test_precedence.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/test_precedence.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/test_precedence.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/test_precedence.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/test_receiver.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/test_receiver.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/test_receiver.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/test_receiver.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/test_round_trip.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/test_round_trip.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/test_round_trip.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/test_round_trip.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/test_shebang.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/test_shebang.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/test_shebang.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/test_shebang.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/test_size.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/test_size.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/test_size.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/test_size.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/test_stmt.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/test_stmt.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/test_stmt.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/test_stmt.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/test_token_trees.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/test_token_trees.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/test_token_trees.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/test_token_trees.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/test_ty.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/test_ty.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/test_ty.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/test_ty.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/test_unparenthesize.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/test_unparenthesize.rs
new file mode 100644
index 0000000..1330aa2
--- /dev/null
+++ b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/test_unparenthesize.rs
@@ -0,0 +1,69 @@
+#![cfg(not(miri))]
+#![recursion_limit = "1024"]
+#![feature(rustc_private)]
+#![allow(
+    clippy::manual_assert,
+    clippy::match_like_matches_macro,
+    clippy::needless_lifetimes,
+    clippy::uninlined_format_args
+)]
+
+use crate::common::visit::{AsIfPrinted, FlattenParens};
+use quote::ToTokens as _;
+use std::fs;
+use std::panic;
+use std::path::Path;
+use std::sync::atomic::{AtomicUsize, Ordering};
+use syn::visit_mut::VisitMut as _;
+
+#[macro_use]
+mod macros;
+
+mod common;
+mod repo;
+
+#[test]
+fn test_unparenthesize() {
+    repo::rayon_init();
+    repo::clone_rust();
+
+    let failed = AtomicUsize::new(0);
+
+    repo::for_each_rust_file(|path| test(path, &failed));
+
+    let failed = failed.into_inner();
+    if failed > 0 {
+        panic!("{} failures", failed);
+    }
+}
+
+fn test(path: &Path, failed: &AtomicUsize) {
+    let content = fs::read_to_string(path).unwrap();
+
+    match panic::catch_unwind(|| -> syn::Result<()> {
+        let mut before = syn::parse_file(&content)?;
+        FlattenParens.visit_file_mut(&mut before);
+        let printed = before.to_token_stream();
+        let mut after = syn::parse2::<syn::File>(printed.clone())?;
+        FlattenParens.visit_file_mut(&mut after);
+        // Normalize features that we expect Syn not to print.
+        AsIfPrinted.visit_file_mut(&mut before);
+        if before != after {
+            errorf!("=== {}\n", path.display());
+            if failed.fetch_add(1, Ordering::Relaxed) == 0 {
+                errorf!("BEFORE:\n{:#?}\nAFTER:\n{:#?}\n", before, after);
+            }
+        }
+        Ok(())
+    }) {
+        Err(_) => {
+            errorf!("=== {}: syn panic\n", path.display());
+            failed.fetch_add(1, Ordering::Relaxed);
+        }
+        Ok(Err(msg)) => {
+            errorf!("=== {}: syn failed to parse\n{:?}\n", path.display(), msg);
+            failed.fetch_add(1, Ordering::Relaxed);
+        }
+        Ok(Ok(())) => {}
+    }
+}
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/test_visibility.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/test_visibility.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/test_visibility.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/test_visibility.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/zzz_stable.rs b/third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/zzz_stable.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/syn-2.0.91/tests/zzz_stable.rs
rename to third_party/rust/chromium_crates_io/vendor/syn-2.0.95/tests/zzz_stable.rs
diff --git a/third_party/rust/chromium_crates_io/vet_config.toml.hbs b/third_party/rust/chromium_crates_io/vet_config.toml.hbs
index 1b79113..90d8361 100644
--- a/third_party/rust/chromium_crates_io/vet_config.toml.hbs
+++ b/third_party/rust/chromium_crates_io/vet_config.toml.hbs
@@ -59,7 +59,7 @@
 {{/each}}
 
 [[exemptions.cxx]]
-version = "1.0.135"
+version = "1.0.136"
 criteria = ["safe-to-deploy", "crypto-safe", "ub-risk-2"]
 notes = """
 Grandparented-in when setting up `cargo vet` in Jan 2024
@@ -78,10 +78,11 @@
 Exemption updated to 1.0.130 in November 2024.
 Exemption updated to 1.0.131 in December 2024.
 Exemption updated to 1.0.135 in December 2024.
+Exemption updated to 1.0.136 in January 2025.
 """
 
 [[exemptions.cxxbridge-macro]]
-version = "1.0.135"
+version = "1.0.136"
 criteria = ["safe-to-deploy", "crypto-safe", "ub-risk-2"]
 notes = """
 Grandparented-in when setting up `cargo vet` in Jan 2024
@@ -100,6 +101,7 @@
 Exemption updated to 1.0.130 in November 2024.
 Exemption updated to 1.0.131 in December 2024.
 Exemption updated to 1.0.135 in December 2024.
+Exemption updated to 1.0.136 in January 2025.
 """
 
 [[exemptions.memchr]]
@@ -145,7 +147,7 @@
 """
 
 [[exemptions.syn]]
-version = "2.0.91"
+version = "2.0.95"
 criteria = ["safe-to-deploy", "crypto-safe", "ub-risk-2"]
 notes = """
 Grandparented-in when setting up `cargo vet` in Jan 2024
@@ -176,6 +178,7 @@
 Exemption updated to 2.0.87 when updating the crate in November 2024.
 Exemption updated to 2.0.90 when updating the crate in November 2024.
 Exemption updated to 2.0.91 when updating the crate in December 2024.
+Exemption updated to 2.0.95 when updating the crate in January 2025.
 """
 
 [[exemptions.zerocopy]]
diff --git a/third_party/rust/cxx/v1/BUILD.gn b/third_party/rust/cxx/v1/BUILD.gn
index 2bf7e9f..69d107a 100644
--- a/third_party/rust/cxx/v1/BUILD.gn
+++ b/third_party/rust/cxx/v1/BUILD.gn
@@ -13,45 +13,45 @@
   epoch = "1"
   crate_type = "rlib"
   crate_root =
-      "//third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/lib.rs"
+      "//third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/lib.rs"
   sources = [
-    "//third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/cxx_string.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/cxx_vector.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/exception.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/extern_type.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/fmt.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/function.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/hash.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/lib.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/lossy.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/macros/assert.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/macros/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/memory.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/opaque.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/result.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/rust_slice.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/rust_str.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/rust_string.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/rust_type.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/rust_vec.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/shared_ptr.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/symbols/exception.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/symbols/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/symbols/rust_slice.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/symbols/rust_str.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/symbols/rust_string.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/symbols/rust_vec.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/type_id.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/unique_ptr.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/unwind.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/vector.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/src/weak_ptr.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/cxx_string.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/cxx_vector.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/exception.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/extern_type.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/fmt.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/function.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/hash.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/lib.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/lossy.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/macros/assert.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/macros/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/memory.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/opaque.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/result.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/rust_slice.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/rust_str.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/rust_string.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/rust_type.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/rust_vec.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/shared_ptr.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/symbols/exception.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/symbols/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/symbols/rust_slice.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/symbols/rust_str.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/symbols/rust_string.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/symbols/rust_vec.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/type_id.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/unique_ptr.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/unwind.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/vector.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/src/weak_ptr.rs",
   ]
   inputs = []
 
   build_native_rust_unit_tests = false
   edition = "2021"
-  cargo_pkg_version = "1.0.135"
+  cargo_pkg_version = "1.0.136"
   cargo_pkg_authors = "David Tolnay <dtolnay@gmail.com>"
   cargo_pkg_name = "cxx"
   cargo_pkg_description = "Safe interop between Rust and C++"
diff --git a/third_party/rust/cxx/v1/README.chromium b/third_party/rust/cxx/v1/README.chromium
index 45d2831..76336d6 100644
--- a/third_party/rust/cxx/v1/README.chromium
+++ b/third_party/rust/cxx/v1/README.chromium
@@ -1,9 +1,9 @@
 Name: cxx
 URL: https://crates.io/crates/cxx
-Version: 1.0.135
-Revision: ee011dbc05c9bce44aa28627da7ab6c5d782e8cb
+Version: 1.0.136
+Revision: d54e44698c3fa5833a861cb3ae502533b92f2f57
 License: Apache-2.0
-License File: //third_party/rust/chromium_crates_io/vendor/cxx-1.0.135/LICENSE-APACHE
+License File: //third_party/rust/chromium_crates_io/vendor/cxx-1.0.136/LICENSE-APACHE
 Shipped: yes
 Security Critical: yes
 
diff --git a/third_party/rust/cxxbridge_cmd/v1/BUILD.gn b/third_party/rust/cxxbridge_cmd/v1/BUILD.gn
index c31adaf..db92860 100644
--- a/third_party/rust/cxxbridge_cmd/v1/BUILD.gn
+++ b/third_party/rust/cxxbridge_cmd/v1/BUILD.gn
@@ -10,64 +10,64 @@
 
 cargo_crate("cxxbridge") {
   crate_type = "bin"
-  crate_root = "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/main.rs"
+  crate_root = "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/main.rs"
   sources = [
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/app.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/cfg.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/gen/block.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/gen/builtin.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/gen/cfg.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/gen/check.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/gen/error.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/gen/file.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/gen/fs.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/gen/ifndef.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/gen/include.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/gen/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/gen/names.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/gen/namespace.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/gen/nested.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/gen/out.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/gen/write.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/main.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/output.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/atom.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/attrs.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/cfg.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/check.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/derive.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/discriminant.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/doc.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/error.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/file.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/ident.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/impls.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/improper.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/instantiate.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/mangle.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/map.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/names.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/namespace.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/parse.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/pod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/qualified.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/report.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/resolve.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/set.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/symbol.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/tokens.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/toposort.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/trivial.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/types.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/syntax/visit.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/test.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/app.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/cfg.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/gen/block.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/gen/builtin.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/gen/cfg.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/gen/check.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/gen/error.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/gen/file.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/gen/fs.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/gen/ifndef.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/gen/include.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/gen/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/gen/names.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/gen/namespace.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/gen/nested.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/gen/out.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/gen/write.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/main.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/output.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/atom.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/attrs.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/cfg.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/check.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/derive.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/discriminant.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/doc.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/error.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/file.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/ident.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/impls.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/improper.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/instantiate.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/mangle.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/map.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/names.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/namespace.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/parse.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/pod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/qualified.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/report.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/resolve.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/set.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/symbol.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/tokens.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/toposort.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/trivial.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/types.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/syntax/visit.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/test.rs",
   ]
-  inputs = [ "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/src/gen/include/cxx.h" ]
+  inputs = [ "//third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/src/gen/include/cxx.h" ]
 
   build_native_rust_unit_tests = false
   edition = "2021"
-  cargo_pkg_version = "1.0.135"
+  cargo_pkg_version = "1.0.136"
   cargo_pkg_authors = "David Tolnay <dtolnay@gmail.com>"
   cargo_pkg_name = "cxxbridge-cmd"
   cargo_pkg_description =
diff --git a/third_party/rust/cxxbridge_cmd/v1/README.chromium b/third_party/rust/cxxbridge_cmd/v1/README.chromium
index e21c17c1..52e8755 100644
--- a/third_party/rust/cxxbridge_cmd/v1/README.chromium
+++ b/third_party/rust/cxxbridge_cmd/v1/README.chromium
@@ -1,9 +1,9 @@
 Name: cxxbridge-cmd
 URL: https://crates.io/crates/cxxbridge-cmd
-Version: 1.0.135
-Revision: ee011dbc05c9bce44aa28627da7ab6c5d782e8cb
+Version: 1.0.136
+Revision: d54e44698c3fa5833a861cb3ae502533b92f2f57
 License: Apache-2.0
-License File: //third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.135/LICENSE-APACHE
+License File: //third_party/rust/chromium_crates_io/vendor/cxxbridge-cmd-1.0.136/LICENSE-APACHE
 Shipped: no
 Security Critical: yes
 
diff --git a/third_party/rust/cxxbridge_flags/v1/BUILD.gn b/third_party/rust/cxxbridge_flags/v1/BUILD.gn
index 0fc9bef2..c6abb26a 100644
--- a/third_party/rust/cxxbridge_flags/v1/BUILD.gn
+++ b/third_party/rust/cxxbridge_flags/v1/BUILD.gn
@@ -12,16 +12,16 @@
   crate_name = "cxxbridge_flags"
   epoch = "1"
   crate_type = "rlib"
-  crate_root = "//third_party/rust/chromium_crates_io/vendor/cxxbridge-flags-1.0.135/src/lib.rs"
+  crate_root = "//third_party/rust/chromium_crates_io/vendor/cxxbridge-flags-1.0.136/src/lib.rs"
   sources = [
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-flags-1.0.135/src/impl.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-flags-1.0.135/src/lib.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-flags-1.0.136/src/impl.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-flags-1.0.136/src/lib.rs",
   ]
   inputs = []
 
   build_native_rust_unit_tests = false
   edition = "2021"
-  cargo_pkg_version = "1.0.135"
+  cargo_pkg_version = "1.0.136"
   cargo_pkg_authors = "David Tolnay <dtolnay@gmail.com>"
   cargo_pkg_name = "cxxbridge-flags"
   cargo_pkg_description =
diff --git a/third_party/rust/cxxbridge_flags/v1/README.chromium b/third_party/rust/cxxbridge_flags/v1/README.chromium
index 41d4808..5f4ec0c 100644
--- a/third_party/rust/cxxbridge_flags/v1/README.chromium
+++ b/third_party/rust/cxxbridge_flags/v1/README.chromium
@@ -1,9 +1,9 @@
 Name: cxxbridge-flags
 URL: https://crates.io/crates/cxxbridge-flags
-Version: 1.0.135
-Revision: ee011dbc05c9bce44aa28627da7ab6c5d782e8cb
+Version: 1.0.136
+Revision: d54e44698c3fa5833a861cb3ae502533b92f2f57
 License: Apache-2.0
-License File: //third_party/rust/chromium_crates_io/vendor/cxxbridge-flags-1.0.135/LICENSE-APACHE
+License File: //third_party/rust/chromium_crates_io/vendor/cxxbridge-flags-1.0.136/LICENSE-APACHE
 Shipped: yes
 Security Critical: yes
 
diff --git a/third_party/rust/cxxbridge_macro/v1/BUILD.gn b/third_party/rust/cxxbridge_macro/v1/BUILD.gn
index 24d23f1..791b68d 100644
--- a/third_party/rust/cxxbridge_macro/v1/BUILD.gn
+++ b/third_party/rust/cxxbridge_macro/v1/BUILD.gn
@@ -12,52 +12,52 @@
   crate_name = "cxxbridge_macro"
   epoch = "1"
   crate_type = "proc-macro"
-  crate_root = "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/lib.rs"
+  crate_root = "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/lib.rs"
   sources = [
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/clang.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/derive.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/expand.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/generics.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/lib.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/load.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/atom.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/attrs.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/cfg.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/check.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/derive.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/discriminant.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/doc.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/error.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/file.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/ident.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/impls.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/improper.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/instantiate.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/mangle.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/map.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/names.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/namespace.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/parse.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/pod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/qualified.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/report.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/resolve.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/set.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/symbol.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/tokens.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/toposort.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/trivial.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/types.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/syntax/visit.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/tokens.rs",
-    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/src/type_id.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/clang.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/derive.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/expand.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/generics.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/lib.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/load.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/atom.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/attrs.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/cfg.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/check.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/derive.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/discriminant.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/doc.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/error.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/file.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/ident.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/impls.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/improper.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/instantiate.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/mangle.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/map.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/names.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/namespace.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/parse.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/pod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/qualified.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/report.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/resolve.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/set.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/symbol.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/tokens.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/toposort.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/trivial.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/types.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/syntax/visit.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/tokens.rs",
+    "//third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/src/type_id.rs",
   ]
   inputs = []
 
   build_native_rust_unit_tests = false
   edition = "2021"
-  cargo_pkg_version = "1.0.135"
+  cargo_pkg_version = "1.0.136"
   cargo_pkg_authors = "David Tolnay <dtolnay@gmail.com>"
   cargo_pkg_name = "cxxbridge-macro"
   cargo_pkg_description = "Implementation detail of the `cxx` crate."
diff --git a/third_party/rust/cxxbridge_macro/v1/README.chromium b/third_party/rust/cxxbridge_macro/v1/README.chromium
index 9dfc1cb..00adda8a 100644
--- a/third_party/rust/cxxbridge_macro/v1/README.chromium
+++ b/third_party/rust/cxxbridge_macro/v1/README.chromium
@@ -1,9 +1,9 @@
 Name: cxxbridge-macro
 URL: https://crates.io/crates/cxxbridge-macro
-Version: 1.0.135
-Revision: ee011dbc05c9bce44aa28627da7ab6c5d782e8cb
+Version: 1.0.136
+Revision: d54e44698c3fa5833a861cb3ae502533b92f2f57
 License: Apache-2.0
-License File: //third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.135/LICENSE-APACHE
+License File: //third_party/rust/chromium_crates_io/vendor/cxxbridge-macro-1.0.136/LICENSE-APACHE
 Shipped: yes
 Security Critical: yes
 
diff --git a/third_party/rust/glob/v0_3/BUILD.gn b/third_party/rust/glob/v0_3/BUILD.gn
index 112dd198..b5c4023 100644
--- a/third_party/rust/glob/v0_3/BUILD.gn
+++ b/third_party/rust/glob/v0_3/BUILD.gn
@@ -13,14 +13,14 @@
   epoch = "0.3"
   crate_type = "rlib"
   crate_root =
-      "//third_party/rust/chromium_crates_io/vendor/glob-0.3.1/src/lib.rs"
+      "//third_party/rust/chromium_crates_io/vendor/glob-0.3.2/src/lib.rs"
   sources =
-      [ "//third_party/rust/chromium_crates_io/vendor/glob-0.3.1/src/lib.rs" ]
+      [ "//third_party/rust/chromium_crates_io/vendor/glob-0.3.2/src/lib.rs" ]
   inputs = []
 
   build_native_rust_unit_tests = false
   edition = "2015"
-  cargo_pkg_version = "0.3.1"
+  cargo_pkg_version = "0.3.2"
   cargo_pkg_authors = "The Rust Project Developers"
   cargo_pkg_name = "glob"
   cargo_pkg_description =
diff --git a/third_party/rust/glob/v0_3/README.chromium b/third_party/rust/glob/v0_3/README.chromium
index 446f28f..352761e 100644
--- a/third_party/rust/glob/v0_3/README.chromium
+++ b/third_party/rust/glob/v0_3/README.chromium
@@ -1,9 +1,9 @@
 Name: glob
 URL: https://crates.io/crates/glob
-Version: 0.3.1
-Revision: 408e579f74830c2073180a7e4e214a2677d38a49
+Version: 0.3.2
+Revision: 58d0748ead23616834871fe42dce475102f8d895
 License: Apache-2.0
-License File: //third_party/rust/chromium_crates_io/vendor/glob-0.3.1/LICENSE-APACHE
+License File: //third_party/rust/chromium_crates_io/vendor/glob-0.3.2/LICENSE-APACHE
 Shipped: no
 Security Critical: no
 
diff --git a/third_party/rust/quote/v1/BUILD.gn b/third_party/rust/quote/v1/BUILD.gn
index a834ab8..6c2aaa1 100644
--- a/third_party/rust/quote/v1/BUILD.gn
+++ b/third_party/rust/quote/v1/BUILD.gn
@@ -13,21 +13,21 @@
   epoch = "1"
   crate_type = "rlib"
   crate_root =
-      "//third_party/rust/chromium_crates_io/vendor/quote-1.0.37/src/lib.rs"
+      "//third_party/rust/chromium_crates_io/vendor/quote-1.0.38/src/lib.rs"
   sources = [
-    "//third_party/rust/chromium_crates_io/vendor/quote-1.0.37/src/ext.rs",
-    "//third_party/rust/chromium_crates_io/vendor/quote-1.0.37/src/format.rs",
-    "//third_party/rust/chromium_crates_io/vendor/quote-1.0.37/src/ident_fragment.rs",
-    "//third_party/rust/chromium_crates_io/vendor/quote-1.0.37/src/lib.rs",
-    "//third_party/rust/chromium_crates_io/vendor/quote-1.0.37/src/runtime.rs",
-    "//third_party/rust/chromium_crates_io/vendor/quote-1.0.37/src/spanned.rs",
-    "//third_party/rust/chromium_crates_io/vendor/quote-1.0.37/src/to_tokens.rs",
+    "//third_party/rust/chromium_crates_io/vendor/quote-1.0.38/src/ext.rs",
+    "//third_party/rust/chromium_crates_io/vendor/quote-1.0.38/src/format.rs",
+    "//third_party/rust/chromium_crates_io/vendor/quote-1.0.38/src/ident_fragment.rs",
+    "//third_party/rust/chromium_crates_io/vendor/quote-1.0.38/src/lib.rs",
+    "//third_party/rust/chromium_crates_io/vendor/quote-1.0.38/src/runtime.rs",
+    "//third_party/rust/chromium_crates_io/vendor/quote-1.0.38/src/spanned.rs",
+    "//third_party/rust/chromium_crates_io/vendor/quote-1.0.38/src/to_tokens.rs",
   ]
   inputs = []
 
   build_native_rust_unit_tests = false
   edition = "2018"
-  cargo_pkg_version = "1.0.37"
+  cargo_pkg_version = "1.0.38"
   cargo_pkg_authors = "David Tolnay <dtolnay@gmail.com>"
   cargo_pkg_name = "quote"
   cargo_pkg_description = "Quasi-quoting macro quote!(...)"
diff --git a/third_party/rust/quote/v1/README.chromium b/third_party/rust/quote/v1/README.chromium
index 618395b..c4f143c 100644
--- a/third_party/rust/quote/v1/README.chromium
+++ b/third_party/rust/quote/v1/README.chromium
@@ -1,9 +1,9 @@
 Name: quote
 URL: https://crates.io/crates/quote
-Version: 1.0.37
-Revision: b1ebffa035363a430862e033aa3268e8cb17affa
+Version: 1.0.38
+Revision: 0245506323a3616daa2ee41c6ad0b871e4d78ae4
 License: Apache-2.0
-License File: //third_party/rust/chromium_crates_io/vendor/quote-1.0.37/LICENSE-APACHE
+License File: //third_party/rust/chromium_crates_io/vendor/quote-1.0.38/LICENSE-APACHE
 Shipped: yes
 Security Critical: yes
 
diff --git a/third_party/rust/rustversion/v1/BUILD.gn b/third_party/rust/rustversion/v1/BUILD.gn
index b359e441..2f38065 100644
--- a/third_party/rust/rustversion/v1/BUILD.gn
+++ b/third_party/rust/rustversion/v1/BUILD.gn
@@ -12,27 +12,27 @@
   crate_name = "rustversion"
   epoch = "1"
   crate_type = "proc-macro"
-  crate_root = "//third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/src/lib.rs"
+  crate_root = "//third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/src/lib.rs"
   sources = [
-    "//third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/src/attr.rs",
-    "//third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/src/bound.rs",
-    "//third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/src/constfn.rs",
-    "//third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/src/date.rs",
-    "//third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/src/error.rs",
-    "//third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/src/expand.rs",
-    "//third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/src/expr.rs",
-    "//third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/src/iter.rs",
-    "//third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/src/lib.rs",
-    "//third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/src/release.rs",
-    "//third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/src/time.rs",
-    "//third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/src/token.rs",
-    "//third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/src/version.rs",
+    "//third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/src/attr.rs",
+    "//third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/src/bound.rs",
+    "//third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/src/constfn.rs",
+    "//third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/src/date.rs",
+    "//third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/src/error.rs",
+    "//third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/src/expand.rs",
+    "//third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/src/expr.rs",
+    "//third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/src/iter.rs",
+    "//third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/src/lib.rs",
+    "//third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/src/release.rs",
+    "//third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/src/time.rs",
+    "//third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/src/token.rs",
+    "//third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/src/version.rs",
   ]
   inputs = []
 
   build_native_rust_unit_tests = false
   edition = "2018"
-  cargo_pkg_version = "1.0.18"
+  cargo_pkg_version = "1.0.19"
   cargo_pkg_authors = "David Tolnay <dtolnay@gmail.com>"
   cargo_pkg_name = "rustversion"
   cargo_pkg_description =
@@ -43,9 +43,9 @@
   executable_configs += [ "//build/config/compiler:no_chromium_code" ]
   proc_macro_configs -= [ "//build/config/compiler:chromium_code" ]
   proc_macro_configs += [ "//build/config/compiler:no_chromium_code" ]
-  build_root = "//third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/build/build.rs"
-  build_sources = [ "//third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/build/build.rs" ]
-  build_script_inputs = [ "//third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/src/../build/rustc.rs" ]
+  build_root = "//third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/build/build.rs"
+  build_sources = [ "//third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/build/build.rs" ]
+  build_script_inputs = [ "//third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/src/../build/rustc.rs" ]
   build_script_outputs = [ "version.expr" ]
   rustflags = [
     "--cap-lints=allow",  # Suppress all warnings in crates.io crates
diff --git a/third_party/rust/rustversion/v1/README.chromium b/third_party/rust/rustversion/v1/README.chromium
index ad3ce82..b95e770 100644
--- a/third_party/rust/rustversion/v1/README.chromium
+++ b/third_party/rust/rustversion/v1/README.chromium
@@ -1,9 +1,9 @@
 Name: rustversion
 URL: https://crates.io/crates/rustversion
-Version: 1.0.18
-Revision: 04f18461f03f7586b32238529b3e6c4731e63db5
+Version: 1.0.19
+Revision: 9ef9df29942a4ef9f6e45579da07efcaadb16f29
 License: Apache-2.0
-License File: //third_party/rust/chromium_crates_io/vendor/rustversion-1.0.18/LICENSE-APACHE
+License File: //third_party/rust/chromium_crates_io/vendor/rustversion-1.0.19/LICENSE-APACHE
 Shipped: yes
 Security Critical: yes
 
diff --git a/third_party/rust/serde/v1/BUILD.gn b/third_party/rust/serde/v1/BUILD.gn
index fe450d1..131dc49 100644
--- a/third_party/rust/serde/v1/BUILD.gn
+++ b/third_party/rust/serde/v1/BUILD.gn
@@ -13,33 +13,33 @@
   epoch = "1"
   crate_type = "rlib"
   crate_root =
-      "//third_party/rust/chromium_crates_io/vendor/serde-1.0.216/src/lib.rs"
+      "//third_party/rust/chromium_crates_io/vendor/serde-1.0.217/src/lib.rs"
   sources = [
-    "//third_party/rust/chromium_crates_io/vendor/serde-1.0.216/src/de/ignored_any.rs",
-    "//third_party/rust/chromium_crates_io/vendor/serde-1.0.216/src/de/impls.rs",
-    "//third_party/rust/chromium_crates_io/vendor/serde-1.0.216/src/de/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/serde-1.0.216/src/de/seed.rs",
-    "//third_party/rust/chromium_crates_io/vendor/serde-1.0.216/src/de/size_hint.rs",
-    "//third_party/rust/chromium_crates_io/vendor/serde-1.0.216/src/de/value.rs",
-    "//third_party/rust/chromium_crates_io/vendor/serde-1.0.216/src/format.rs",
-    "//third_party/rust/chromium_crates_io/vendor/serde-1.0.216/src/integer128.rs",
-    "//third_party/rust/chromium_crates_io/vendor/serde-1.0.216/src/lib.rs",
-    "//third_party/rust/chromium_crates_io/vendor/serde-1.0.216/src/macros.rs",
-    "//third_party/rust/chromium_crates_io/vendor/serde-1.0.216/src/private/de.rs",
-    "//third_party/rust/chromium_crates_io/vendor/serde-1.0.216/src/private/doc.rs",
-    "//third_party/rust/chromium_crates_io/vendor/serde-1.0.216/src/private/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/serde-1.0.216/src/private/ser.rs",
-    "//third_party/rust/chromium_crates_io/vendor/serde-1.0.216/src/ser/fmt.rs",
-    "//third_party/rust/chromium_crates_io/vendor/serde-1.0.216/src/ser/impls.rs",
-    "//third_party/rust/chromium_crates_io/vendor/serde-1.0.216/src/ser/impossible.rs",
-    "//third_party/rust/chromium_crates_io/vendor/serde-1.0.216/src/ser/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/serde-1.0.216/src/std_error.rs",
+    "//third_party/rust/chromium_crates_io/vendor/serde-1.0.217/src/de/ignored_any.rs",
+    "//third_party/rust/chromium_crates_io/vendor/serde-1.0.217/src/de/impls.rs",
+    "//third_party/rust/chromium_crates_io/vendor/serde-1.0.217/src/de/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/serde-1.0.217/src/de/seed.rs",
+    "//third_party/rust/chromium_crates_io/vendor/serde-1.0.217/src/de/size_hint.rs",
+    "//third_party/rust/chromium_crates_io/vendor/serde-1.0.217/src/de/value.rs",
+    "//third_party/rust/chromium_crates_io/vendor/serde-1.0.217/src/format.rs",
+    "//third_party/rust/chromium_crates_io/vendor/serde-1.0.217/src/integer128.rs",
+    "//third_party/rust/chromium_crates_io/vendor/serde-1.0.217/src/lib.rs",
+    "//third_party/rust/chromium_crates_io/vendor/serde-1.0.217/src/macros.rs",
+    "//third_party/rust/chromium_crates_io/vendor/serde-1.0.217/src/private/de.rs",
+    "//third_party/rust/chromium_crates_io/vendor/serde-1.0.217/src/private/doc.rs",
+    "//third_party/rust/chromium_crates_io/vendor/serde-1.0.217/src/private/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/serde-1.0.217/src/private/ser.rs",
+    "//third_party/rust/chromium_crates_io/vendor/serde-1.0.217/src/ser/fmt.rs",
+    "//third_party/rust/chromium_crates_io/vendor/serde-1.0.217/src/ser/impls.rs",
+    "//third_party/rust/chromium_crates_io/vendor/serde-1.0.217/src/ser/impossible.rs",
+    "//third_party/rust/chromium_crates_io/vendor/serde-1.0.217/src/ser/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/serde-1.0.217/src/std_error.rs",
   ]
   inputs = []
 
   build_native_rust_unit_tests = false
   edition = "2018"
-  cargo_pkg_version = "1.0.216"
+  cargo_pkg_version = "1.0.217"
   cargo_pkg_authors = "Erick Tryzelaar <erick.tryzelaar@gmail.com>, David Tolnay <dtolnay@gmail.com>"
   cargo_pkg_name = "serde"
   cargo_pkg_description = "A generic serialization/deserialization framework"
@@ -57,9 +57,9 @@
     "std",
   ]
   build_root =
-      "//third_party/rust/chromium_crates_io/vendor/serde-1.0.216/build.rs"
+      "//third_party/rust/chromium_crates_io/vendor/serde-1.0.217/build.rs"
   build_sources =
-      [ "//third_party/rust/chromium_crates_io/vendor/serde-1.0.216/build.rs" ]
+      [ "//third_party/rust/chromium_crates_io/vendor/serde-1.0.217/build.rs" ]
   rustflags = [
     "--cap-lints=allow",  # Suppress all warnings in crates.io crates
   ]
diff --git a/third_party/rust/serde/v1/README.chromium b/third_party/rust/serde/v1/README.chromium
index 5a832ae..02b80f41 100644
--- a/third_party/rust/serde/v1/README.chromium
+++ b/third_party/rust/serde/v1/README.chromium
@@ -1,9 +1,9 @@
 Name: serde
 URL: https://crates.io/crates/serde
-Version: 1.0.216
-Revision: ad8dd4148b5fabf0d643d4de604a0616f2796506
+Version: 1.0.217
+Revision: 930401b0dd58a809fce34da091b8aa3d6083cb33
 License: Apache-2.0
-License File: //third_party/rust/chromium_crates_io/vendor/serde-1.0.216/LICENSE-APACHE
+License File: //third_party/rust/chromium_crates_io/vendor/serde-1.0.217/LICENSE-APACHE
 Shipped: yes
 Security Critical: yes
 
diff --git a/third_party/rust/serde_derive/v1/BUILD.gn b/third_party/rust/serde_derive/v1/BUILD.gn
index 4f66e4f..2625998 100644
--- a/third_party/rust/serde_derive/v1/BUILD.gn
+++ b/third_party/rust/serde_derive/v1/BUILD.gn
@@ -12,32 +12,32 @@
   crate_name = "serde_derive"
   epoch = "1"
   crate_type = "proc-macro"
-  crate_root = "//third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/src/lib.rs"
+  crate_root = "//third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/src/lib.rs"
   sources = [
-    "//third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/src/bound.rs",
-    "//third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/src/de.rs",
-    "//third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/src/dummy.rs",
-    "//third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/src/fragment.rs",
-    "//third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/src/internals/ast.rs",
-    "//third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/src/internals/attr.rs",
-    "//third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/src/internals/case.rs",
-    "//third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/src/internals/check.rs",
-    "//third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/src/internals/ctxt.rs",
-    "//third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/src/internals/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/src/internals/name.rs",
-    "//third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/src/internals/receiver.rs",
-    "//third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/src/internals/respan.rs",
-    "//third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/src/internals/symbol.rs",
-    "//third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/src/lib.rs",
-    "//third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/src/pretend.rs",
-    "//third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/src/ser.rs",
-    "//third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/src/this.rs",
+    "//third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/src/bound.rs",
+    "//third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/src/de.rs",
+    "//third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/src/dummy.rs",
+    "//third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/src/fragment.rs",
+    "//third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/src/internals/ast.rs",
+    "//third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/src/internals/attr.rs",
+    "//third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/src/internals/case.rs",
+    "//third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/src/internals/check.rs",
+    "//third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/src/internals/ctxt.rs",
+    "//third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/src/internals/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/src/internals/name.rs",
+    "//third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/src/internals/receiver.rs",
+    "//third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/src/internals/respan.rs",
+    "//third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/src/internals/symbol.rs",
+    "//third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/src/lib.rs",
+    "//third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/src/pretend.rs",
+    "//third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/src/ser.rs",
+    "//third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/src/this.rs",
   ]
   inputs = []
 
   build_native_rust_unit_tests = false
   edition = "2015"
-  cargo_pkg_version = "1.0.216"
+  cargo_pkg_version = "1.0.217"
   cargo_pkg_authors = "Erick Tryzelaar <erick.tryzelaar@gmail.com>, David Tolnay <dtolnay@gmail.com>"
   cargo_pkg_name = "serde_derive"
   cargo_pkg_description =
diff --git a/third_party/rust/serde_derive/v1/README.chromium b/third_party/rust/serde_derive/v1/README.chromium
index b8692ea2..0c142ef 100644
--- a/third_party/rust/serde_derive/v1/README.chromium
+++ b/third_party/rust/serde_derive/v1/README.chromium
@@ -1,9 +1,9 @@
 Name: serde_derive
 URL: https://crates.io/crates/serde_derive
-Version: 1.0.216
-Revision: ad8dd4148b5fabf0d643d4de604a0616f2796506
+Version: 1.0.217
+Revision: 930401b0dd58a809fce34da091b8aa3d6083cb33
 License: Apache-2.0
-License File: //third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.216/LICENSE-APACHE
+License File: //third_party/rust/chromium_crates_io/vendor/serde_derive-1.0.217/LICENSE-APACHE
 Shipped: yes
 Security Critical: yes
 
diff --git a/third_party/rust/syn/v2/BUILD.gn b/third_party/rust/syn/v2/BUILD.gn
index f5a275f..15591eb3 100644
--- a/third_party/rust/syn/v2/BUILD.gn
+++ b/third_party/rust/syn/v2/BUILD.gn
@@ -13,69 +13,69 @@
   epoch = "2"
   crate_type = "rlib"
   crate_root =
-      "//third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/lib.rs"
+      "//third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/lib.rs"
   sources = [
-    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/attr.rs",
-    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/bigint.rs",
-    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/buffer.rs",
-    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/classify.rs",
-    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/custom_keyword.rs",
-    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/custom_punctuation.rs",
-    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/data.rs",
-    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/derive.rs",
-    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/discouraged.rs",
-    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/drops.rs",
-    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/error.rs",
-    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/export.rs",
-    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/expr.rs",
-    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/ext.rs",
-    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/file.rs",
-    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/fixup.rs",
-    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/gen/clone.rs",
-    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/gen/debug.rs",
-    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/gen/eq.rs",
-    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/gen/fold.rs",
-    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/gen/hash.rs",
-    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/gen/visit.rs",
-    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/gen/visit_mut.rs",
-    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/generics.rs",
-    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/group.rs",
-    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/ident.rs",
-    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/item.rs",
-    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/lib.rs",
-    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/lifetime.rs",
-    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/lit.rs",
-    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/lookahead.rs",
-    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/mac.rs",
-    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/macros.rs",
-    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/meta.rs",
-    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/op.rs",
-    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/parse.rs",
-    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/parse_macro_input.rs",
-    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/parse_quote.rs",
-    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/pat.rs",
-    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/path.rs",
-    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/precedence.rs",
-    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/print.rs",
-    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/punctuated.rs",
-    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/restriction.rs",
-    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/scan_expr.rs",
-    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/sealed.rs",
-    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/span.rs",
-    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/spanned.rs",
-    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/stmt.rs",
-    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/thread.rs",
-    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/token.rs",
-    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/tt.rs",
-    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/ty.rs",
-    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/verbatim.rs",
-    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.91/src/whitespace.rs",
+    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/attr.rs",
+    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/bigint.rs",
+    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/buffer.rs",
+    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/classify.rs",
+    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/custom_keyword.rs",
+    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/custom_punctuation.rs",
+    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/data.rs",
+    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/derive.rs",
+    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/discouraged.rs",
+    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/drops.rs",
+    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/error.rs",
+    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/export.rs",
+    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/expr.rs",
+    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/ext.rs",
+    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/file.rs",
+    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/fixup.rs",
+    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/gen/clone.rs",
+    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/gen/debug.rs",
+    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/gen/eq.rs",
+    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/gen/fold.rs",
+    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/gen/hash.rs",
+    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/gen/visit.rs",
+    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/gen/visit_mut.rs",
+    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/generics.rs",
+    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/group.rs",
+    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/ident.rs",
+    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/item.rs",
+    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/lib.rs",
+    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/lifetime.rs",
+    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/lit.rs",
+    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/lookahead.rs",
+    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/mac.rs",
+    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/macros.rs",
+    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/meta.rs",
+    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/op.rs",
+    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/parse.rs",
+    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/parse_macro_input.rs",
+    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/parse_quote.rs",
+    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/pat.rs",
+    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/path.rs",
+    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/precedence.rs",
+    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/print.rs",
+    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/punctuated.rs",
+    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/restriction.rs",
+    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/scan_expr.rs",
+    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/sealed.rs",
+    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/span.rs",
+    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/spanned.rs",
+    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/stmt.rs",
+    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/thread.rs",
+    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/token.rs",
+    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/tt.rs",
+    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/ty.rs",
+    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/verbatim.rs",
+    "//third_party/rust/chromium_crates_io/vendor/syn-2.0.95/src/whitespace.rs",
   ]
   inputs = []
 
   build_native_rust_unit_tests = false
   edition = "2021"
-  cargo_pkg_version = "2.0.91"
+  cargo_pkg_version = "2.0.95"
   cargo_pkg_authors = "David Tolnay <dtolnay@gmail.com>"
   cargo_pkg_name = "syn"
   cargo_pkg_description = "Parser for Rust source code"
diff --git a/third_party/rust/syn/v2/README.chromium b/third_party/rust/syn/v2/README.chromium
index 11284b6b..becbf8ef 100644
--- a/third_party/rust/syn/v2/README.chromium
+++ b/third_party/rust/syn/v2/README.chromium
@@ -1,9 +1,9 @@
 Name: syn
 URL: https://crates.io/crates/syn
-Version: 2.0.91
-Revision: 53de985062cbdc99ba002ac85a7926d49d92e611
+Version: 2.0.95
+Revision: c7b76389008415d7b7634a3265bc8453f994275b
 License: Apache-2.0
-License File: //third_party/rust/chromium_crates_io/vendor/syn-2.0.91/LICENSE-APACHE
+License File: //third_party/rust/chromium_crates_io/vendor/syn-2.0.95/LICENSE-APACHE
 Shipped: yes
 Security Critical: yes
 
diff --git a/third_party/webgpu-cts/src b/third_party/webgpu-cts/src
index 10b66cd..63658e1 160000
--- a/third_party/webgpu-cts/src
+++ b/third_party/webgpu-cts/src
@@ -1 +1 @@
-Subproject commit 10b66cd2ff469e53ee5068a3348c4979b05b3123
+Subproject commit 63658e137bf2efcb6199c849afc8be1b4995f2d2
diff --git a/third_party/webrtc b/third_party/webrtc
index 161d12f..80344a0 160000
--- a/third_party/webrtc
+++ b/third_party/webrtc
@@ -1 +1 @@
-Subproject commit 161d12fa8bf61cff73d97107c3438b414390ff18
+Subproject commit 80344a0a5cb3ecb93716bd6a994e65cc6c8c3b51
diff --git a/third_party/win_virtual_display/README.chromium b/third_party/win_virtual_display/README.chromium
index a4e9cd0..dea52f57 100644
--- a/third_party/win_virtual_display/README.chromium
+++ b/third_party/win_virtual_display/README.chromium
@@ -1,7 +1,7 @@
 Name: Windows Driver Samples
 Short Name: Windows-driver-samples
 URL: https://github.com/microsoft/Windows-driver-samples
-Version: 0
+Version: N/A
 Date: 2023-06-29
 Revision: d9acf794c92ba2fb0525f6c794ef394709035ac3
 License: MPL 1
diff --git a/tools/crates/create_update_cl.py b/tools/crates/create_update_cl.py
index 00acfb6..d24e242 100755
--- a/tools/crates/create_update_cl.py
+++ b/tools/crates/create_update_cl.py
@@ -631,7 +631,8 @@
         exempted_crate_name = ConvertCrateIdToCrateName(exempted_crate_id)
         print(f"  WARNING: The `{exempted_crate_name}` crate "\
                "is covered by an exemption rather than an audit. "\
-               "Please bump the exemption in `vet_config.toml.hbs` "\
+               "Please bump the exemption in "\
+               "`third_party/rust/chromium_crates_io/vet_config.toml.hbs` "\
                "and run `tools/crates/run_gnrt.py vendor` again.")
 
 
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index a35c418..b8107eb 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -26922,6 +26922,7 @@
   <int value="811" label="interactivity"/>
   <int value="812" label="masonry-fill"/>
   <int value="813" label="masonry-direction"/>
+  <int value="814" label="masonry-flow"/>
 </enum>
 
 <!-- LINT.ThenChange(//third_party/blink/public/mojom/use_counter/metrics/css_property_id.mojom:CSSSampleId) -->
@@ -34171,7 +34172,7 @@
   <int value="91" label="CanvasCreateconicgradient"/>
   <int value="92" label="CanvasReset"/>
   <int value="93" label="CanvasRoundrect"/>
-  <int value="94" label="CanvasTextBaselines"/>
+  <int value="94" label="OBSOLETE_CanvasTextBaselines"/>
   <int value="95" label="ColorMix"/>
   <int value="96" label="AriaAttributeReflection"/>
   <int value="97" label="AnchorPositioning"/>
@@ -34192,9 +34193,9 @@
   <int value="112" label="OverflowShorthand"/>
   <int value="113" label="FieldSizing"/>
   <int value="114" label="DetailsName"/>
-  <int value="115" label="ElementCheckVisibility"/>
+  <int value="115" label="OBSOLETE_ElementCheckVisibility"/>
   <int value="116" label="KeyboardMap"/>
-  <int value="117" label="HiddenUntilFoundAttribute"/>
+  <int value="117" label="OBSOLETE_HiddenUntilFoundAttribute"/>
   <int value="118" label="Scheduler"/>
   <int value="119" label="KeyboardLock"/>
   <int value="120" label="Search"/>
@@ -34292,7 +34293,7 @@
   <int value="212" label="HyphenateLimitChars"/>
   <int value="213" label="Quotes"/>
   <int value="214" label="BaselineSource"/>
-  <int value="215" label="ClipPathGeometryBox"/>
+  <int value="215" label="ClipPathBoxes"/>
   <int value="216" label="ClipPath"/>
   <int value="217" label="ActiveViewTransition"/>
   <int value="218" label="BoxDecorationBreak"/>
@@ -34320,8 +34321,8 @@
   <int value="240" label="PromiseWithresolvers"/>
   <int value="241" label="TransferableArraybuffer"/>
   <int value="242" label="AtomicsWaitAsync"/>
-  <int value="243" label="LocaleInfoObsoletedGetters"/>
-  <int value="244" label="LocaleInfoFunctions"/>
+  <int value="243" label="OBSOLETE_LocaleInfoObsoletedGetters"/>
+  <int value="244" label="IntlLocaleInfo"/>
   <int value="245" label="ViewTransitionClass"/>
   <int value="246" label="DRAFT_ReferenceTarget"/>
   <int value="247" label="Fedcm"/>
diff --git a/tools/metrics/histograms/metadata/android/histograms.xml b/tools/metrics/histograms/metadata/android/histograms.xml
index 0f91243..bbc9203 100644
--- a/tools/metrics/histograms/metadata/android/histograms.xml
+++ b/tools/metrics/histograms/metadata/android/histograms.xml
@@ -1038,22 +1038,26 @@
 </histogram>
 
 <histogram name="Android.ChromeStartupDelegate.FailureReason"
-    enum="ChromeStartupDelegateFailureType" expires_after="2022-12-25">
+    enum="ChromeStartupDelegateFailureType" expires_after="2026-02-10">
   <owner>gangwu@chromium.org</owner>
   <owner>twellington@chromium.org</owner>
   <summary>
     Records the failure reason for ChromeStartupDelegate requests. Recorded at
     most once on application startup.
+
+    (Expired in 2022-12-25. Revived in 2025-01-07.)
   </summary>
 </histogram>
 
 <histogram name="Android.ChromeStartupDelegate.Result"
-    enum="ChromeStartupDelegateResult" expires_after="2022-10-16">
+    enum="ChromeStartupDelegateResult" expires_after="2026-02-10">
   <owner>gangwu@chromium.org</owner>
   <owner>twellington@chromium.org</owner>
   <summary>
     Records the result for ChromeStartupDelegate. Recorded on application
     startup.
+
+    (Expired in 2022-10-16. Revived in 2025-01-07.)
   </summary>
 </histogram>
 
diff --git a/tools/metrics/histograms/metadata/ash/enums.xml b/tools/metrics/histograms/metadata/ash/enums.xml
index 02d2d6b..9dd25cc4 100644
--- a/tools/metrics/histograms/metadata/ash/enums.xml
+++ b/tools/metrics/histograms/metadata/ash/enums.xml
@@ -1333,28 +1333,6 @@
   <int value="8" label="FailedToGetNssCerts"/>
 </enum>
 
-<enum name="LacrosLaunchMode">
-  <int value="0" label="Only Ash browser"/>
-  <int value="1" label="Ash and Lacros browser available"/>
-  <int value="2" label="Lacros browser is primary"/>
-  <int value="3" label="Only Lacros browser"/>
-</enum>
-
-<enum name="LacrosLaunchModeAndSource">
-  <int value="0" label="Default or user set, only Ash browser"/>
-  <int value="1" label="Default or user set, Ash and Lacros browser available"/>
-  <int value="2" label="Default or user set, Lacros browser is primary"/>
-  <int value="3" label="Default or user set, only Lacros browser"/>
-  <int value="4" label="User forced, only Ash browser"/>
-  <int value="5" label="User forced, Ash and Lacros browser available"/>
-  <int value="6" label="User forced, Lacros browser is primary"/>
-  <int value="7" label="User forced, only Lacros browser"/>
-  <int value="8" label="Policy forced, only Ash browser"/>
-  <int value="9" label="Policy forced, Ash and Lacros browser available"/>
-  <int value="10" label="Policy forced, Lacros browser is primary"/>
-  <int value="11" label="Policy forced, only Lacros browser"/>
-</enum>
-
 <enum name="LobsterState">
   <int value="0" label="Shown Opportunity"/>
   <int value="1" label="Blocked"/>
diff --git a/tools/metrics/histograms/metadata/ash/histograms.xml b/tools/metrics/histograms/metadata/ash/histograms.xml
index ded03ec..429647dc 100644
--- a/tools/metrics/histograms/metadata/ash/histograms.xml
+++ b/tools/metrics/histograms/metadata/ash/histograms.xml
@@ -5296,51 +5296,6 @@
   </summary>
 </histogram>
 
-<histogram name="Ash.Lacros.Launch.Mode" enum="LacrosLaunchMode"
-    expires_after="2025-05-11">
-  <owner>skuhne@chromium.org</owner>
-  <owner>lacros-team@google.com</owner>
-  <summary>
-    The Lacros operation mode. This will record whether Lacros is the only
-    browser. It will be emitted once when the system (Ash) starts.
-  </summary>
-</histogram>
-
-<histogram name="Ash.Lacros.Launch.Mode.Daily" enum="LacrosLaunchMode"
-    expires_after="2025-06-22">
-  <owner>skuhne@chromium.org</owner>
-  <owner>lacros-team@google.com</owner>
-  <summary>
-    The Lacros operation mode. This will record whether Lacros is the only
-    browser. It will be emitted at least once a day.
-  </summary>
-</histogram>
-
-<histogram name="Ash.Lacros.Launch.ModeAndSource"
-    enum="LacrosLaunchModeAndSource" expires_after="2025-06-08">
-  <owner>skuhne@chromium.org</owner>
-  <owner>lacros-team@google.com</owner>
-  <summary>
-    The Lacros operation mode and the origin of the setting. This will record
-    whether Lacros is enabled as well as whether that was set by the user,
-    enforced by a policy or enforced by the user (overriding any given policy).
-    It will be emitted shortly before Lacros gets started the first time from
-    the system (Ash).
-  </summary>
-</histogram>
-
-<histogram name="Ash.Lacros.Launch.ModeAndSource.Daily"
-    enum="LacrosLaunchModeAndSource" expires_after="2024-07-12">
-  <owner>skuhne@chromium.org</owner>
-  <owner>lacros-team@google.com</owner>
-  <summary>
-    The Lacros operation mode and the origin of the setting. This will record
-    whether Lacros is enabled as well as whether that was set by the user,
-    enforced by a policy or enforced by the user (overriding any given policy).
-    It will be emitted at least once a day.
-  </summary>
-</histogram>
-
 <histogram name="Ash.Lobster.State" enum="LobsterState"
     expires_after="2025-10-20">
   <owner>hdchuong@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/bookmarks/histograms.xml b/tools/metrics/histograms/metadata/bookmarks/histograms.xml
index 8003102..7c4d728 100644
--- a/tools/metrics/histograms/metadata/bookmarks/histograms.xml
+++ b/tools/metrics/histograms/metadata/bookmarks/histograms.xml
@@ -104,6 +104,47 @@
   </summary>
 </histogram>
 
+<histogram name="Bookmarks.BatchUploadDuration" units="ms"
+    expires_after="2025-07-02">
+  <owner>mastiz@chromium.org</owner>
+  <owner>ljjlee@google.com</owner>
+  <summary>
+    Records the time taken to run the batch upload algorithm, triggered when the
+    user chooses to upload local bookmarks to the Sync server. Note that this
+    exclusively measures the time to run operations (in particular
+    deduplication) in the local BookmarkModel and doesn't account for other
+    delays (such as disk I/O or actually uploading bookmarks to the server).
+  </summary>
+</histogram>
+
+<histogram name="Bookmarks.BatchUploadOutcomeAccountNodes" units="nodes"
+    expires_after="2025-07-02">
+  <owner>mastiz@chromium.org</owner>
+  <owner>ljjlee@google.com</owner>
+  <summary>
+    Records the number of bookmark nodes (URLs or folders) considered account
+    nodes (that is, stored under one of the three account permanent folders),
+    recorded when the user chooses to upload local bookmarks to the Sync server,
+    immediately after the batch upload algorithm completes.
+  </summary>
+</histogram>
+
+<histogram name="Bookmarks.BatchUploadOutcomeRatio" units="%"
+    expires_after="2025-07-02">
+  <owner>mastiz@chromium.org</owner>
+  <owner>ljjlee@google.com</owner>
+  <summary>
+    Records a ratio that reflects the relationship between the number of
+    bookmark nodes before the batch upload was triggered (denominator) and the
+    number of bookmark nodes after the batch upload algorithm completed
+    (numerator). A value of 100% indicates no duplicates were detected during
+    this procedure, whereas 50% would indicate that all local bookmarks were
+    deduplicated. Values lower than 50% or higher than 100% suggest bugs.
+    Recorded when the user chooses to upload local bookmarks to the Sync server,
+    immediately after the batch upload algorithm completes.
+  </summary>
+</histogram>
+
 <histogram name="Bookmarks.BookmarkAllTabsWithTabsCount.Incognito" units="tabs"
     expires_after="2023-01-01">
   <owner>roagarwal@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/chromeos_settings/histograms.xml b/tools/metrics/histograms/metadata/chromeos_settings/histograms.xml
index 368bc33..5bcfd32 100644
--- a/tools/metrics/histograms/metadata/chromeos_settings/histograms.xml
+++ b/tools/metrics/histograms/metadata/chromeos_settings/histograms.xml
@@ -78,7 +78,7 @@
 </histogram>
 
 <histogram name="ChromeOS.Settings.Accessibility.CursorColor.Enabled"
-    enum="BooleanToggled" expires_after="2025-09-23">
+    enum="BooleanToggled" expires_after="M134">
 <!-- Kept separate from the generic accessibility settings metric because this
  is not a simple toggle on/off presented to the user, but is a dropdown list
  of color choices. -->
diff --git a/tools/metrics/histograms/metadata/crostini/histograms.xml b/tools/metrics/histograms/metadata/crostini/histograms.xml
index da6e1619..47958e2a 100644
--- a/tools/metrics/histograms/metadata/crostini/histograms.xml
+++ b/tools/metrics/histograms/metadata/crostini/histograms.xml
@@ -35,7 +35,7 @@
 </variants>
 
 <histogram name="Crostini.AppLaunch" enum="CrostiniAppLaunchAppType"
-    expires_after="2025-01-06">
+    expires_after="2026-01-06">
   <owner>denniskempin@google.com</owner>
   <owner>clumptini@google.com</owner>
   <summary>
@@ -46,7 +46,7 @@
 </histogram>
 
 <histogram name="Crostini.AppLaunchResult" enum="CrostiniResult"
-    expires_after="2025-06-08">
+    expires_after="2026-04-06">
   <owner>denniskempin@google.com</owner>
   <owner>clumptini@google.com</owner>
   <summary>
@@ -55,7 +55,7 @@
 </histogram>
 
 <histogram name="Crostini.AppLaunchResult.{Variant}" enum="CrostiniResult"
-    expires_after="2025-04-13">
+    expires_after="2026-04-13">
   <owner>denniskempin@google.com</owner>
   <owner>clumptini@google.com</owner>
   <summary>The result of attempting to launch {Variant}.</summary>
@@ -91,7 +91,7 @@
 </histogram>
 
 <histogram name="Crostini.AvailableDiskSuccess" units="MiB"
-    expires_after="2025-01-06">
+    expires_after="2026-01-06">
   <owner>denniskempin@google.com</owner>
   <owner>clumptini@google.com</owner>
   <summary>
@@ -110,7 +110,7 @@
 </histogram>
 
 <histogram name="Crostini.BackupCompressedSizeLog2" units="units"
-    expires_after="2025-01-06">
+    expires_after="2026-01-06">
   <owner>denniskempin@google.com</owner>
   <owner>clumptini@google.com</owner>
   <summary>
@@ -121,7 +121,7 @@
 </histogram>
 
 <histogram name="Crostini.BackupContainerSizeLog2" units="units"
-    expires_after="2025-01-06">
+    expires_after="2026-01-06">
   <owner>denniskempin@google.com</owner>
   <owner>clumptini@google.com</owner>
   <summary>
@@ -132,7 +132,7 @@
 </histogram>
 
 <histogram name="Crostini.BackupSizeRatio" units="units"
-    expires_after="2025-01-06">
+    expires_after="2026-01-06">
   <owner>denniskempin@google.com</owner>
   <owner>clumptini@google.com</owner>
   <summary>
@@ -142,21 +142,21 @@
 </histogram>
 
 <histogram name="Crostini.BackupTimeFailed" units="ms"
-    expires_after="2025-06-08">
+    expires_after="2026-03-30">
   <owner>denniskempin@google.com</owner>
   <owner>clumptini@google.com</owner>
   <summary>Time taken for failed backup.</summary>
 </histogram>
 
 <histogram name="Crostini.BackupTimeSuccess" units="ms"
-    expires_after="2025-06-08">
+    expires_after="2026-03-30">
   <owner>denniskempin@google.com</owner>
   <owner>clumptini@google.com</owner>
   <summary>Time taken for successful backup.</summary>
 </histogram>
 
 <histogram name="Crostini.ContainerOsVersion" enum="CrostiniContainerOsVersion"
-    expires_after="2025-03-09">
+    expires_after="2026-03-09">
   <owner>denniskempin@google.com</owner>
   <owner>clumptini@google.com</owner>
   <summary>
@@ -204,7 +204,7 @@
 </histogram>
 
 <histogram name="Crostini.DiskResize.Started" enum="BooleanAttempted"
-    expires_after="2025-06-08">
+    expires_after="2026-04-06">
   <owner>denniskempin@google.com</owner>
   <owner>clumptini@google.com</owner>
   <summary>
@@ -229,7 +229,7 @@
 </histogram>
 
 <histogram name="Crostini.EngagementTime.{Variant}" units="ms"
-    expires_after="2025-02-10">
+    expires_after="2026-02-10">
   <owner>denniskempin@google.com</owner>
   <owner>clumptini@google.com</owner>
   <summary>
@@ -272,7 +272,7 @@
 </histogram>
 
 <histogram name="Crostini.InputMethodOnBlur" enum="InputMethodID2"
-    expires_after="2025-06-08">
+    expires_after="2026-03-30">
   <owner>timloh@chromium.org</owner>
   <owner>clumptini@google.com</owner>
   <summary>
@@ -284,7 +284,7 @@
 </histogram>
 
 <histogram name="Crostini.InvalidStateTransition" enum="CrostiniInstallerState"
-    expires_after="2025-01-06">
+    expires_after="2026-01-06">
   <owner>denniskempin@google.com</owner>
   <owner>clumptini@google.com</owner>
   <summary>
@@ -297,7 +297,7 @@
 </histogram>
 
 <histogram name="Crostini.RecoverySource" enum="CrostiniUISurface"
-    expires_after="2025-01-06">
+    expires_after="2026-01-06">
   <owner>denniskempin@google.com</owner>
   <owner>clumptini@google.com</owner>
   <summary>
@@ -328,7 +328,7 @@
 </histogram>
 
 <histogram name="Crostini.RestarterResult.Installer" enum="CrostiniResult"
-    expires_after="2025-02-10">
+    expires_after="2026-02-10">
   <owner>timloh@google.com</owner>
   <owner>clumptini@google.com</owner>
   <summary>
@@ -370,21 +370,21 @@
 </histogram>
 
 <histogram name="Crostini.RestoreTimeFailed" units="ms"
-    expires_after="2025-01-06">
+    expires_after="2026-01-06">
   <owner>denniskempin@google.com</owner>
   <owner>clumptini@google.com</owner>
   <summary>Time taken for failed restore.</summary>
 </histogram>
 
 <histogram name="Crostini.RestoreTimeSuccess" units="ms"
-    expires_after="2025-01-06">
+    expires_after="2026-01-06">
   <owner>denniskempin@google.com</owner>
   <owner>clumptini@google.com</owner>
   <summary>Time taken for successful restore.</summary>
 </histogram>
 
 <histogram name="Crostini.SettingsEvent" enum="CrostiniSettingsEvent"
-    expires_after="2025-04-24">
+    expires_after="2026-04-24">
   <owner>denniskempin@google.com</owner>
   <owner>clumptini@google.com</owner>
   <owner>victorhsieh@chromium.org</owner>
@@ -425,7 +425,7 @@
 </histogram>
 
 <histogram name="Crostini.SetupSource" enum="CrostiniUISurface"
-    expires_after="2025-01-06">
+    expires_after="2026-01-06">
   <owner>denniskempin@google.com</owner>
   <owner>clumptini@google.com</owner>
   <summary>
@@ -495,7 +495,7 @@
 </histogram>
 
 <histogram name="Crostini.TerminalSettingsChanged"
-    enum="CrostiniTerminalSetting" expires_after="2025-04-28">
+    enum="CrostiniTerminalSetting" expires_after="2026-04-28">
   <owner>joelhockey@chromium.org</owner>
   <owner>clumptini@google.com</owner>
   <summary>
@@ -507,7 +507,7 @@
 </histogram>
 
 <histogram name="Crostini.TimeFromDeviceSetupToInstall" units="ms"
-    expires_after="2025-03-17">
+    expires_after="2026-03-17">
   <owner>denniskempin@google.com</owner>
   <owner>clumptini@google.com</owner>
   <summary>
@@ -585,7 +585,7 @@
 
 <histogram name="Crostini.UpgradeAvailable"
     enum="CrostiniUpgradeAvailableNotificationClosed"
-    expires_after="2025-01-06">
+    expires_after="2026-01-06">
   <owner>denniskempin@google.com</owner>
   <owner>clumptini@google.com</owner>
   <summary>
@@ -605,7 +605,7 @@
 </histogram>
 
 <histogram name="Crostini.UpgradeSource" enum="CrostiniUISurface"
-    expires_after="2025-01-06">
+    expires_after="2026-01-06">
   <owner>denniskempin@google.com</owner>
   <owner>clumptini@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/histogram_suffixes_list.xml b/tools/metrics/histograms/metadata/histogram_suffixes_list.xml
index 6a52d517..e51cec4 100644
--- a/tools/metrics/histograms/metadata/histogram_suffixes_list.xml
+++ b/tools/metrics/histograms/metadata/histogram_suffixes_list.xml
@@ -2017,7 +2017,6 @@
   <suffix name="IMAGE" label="IMAGE from clipboard."/>
   <suffix name="TEXT" label="Text from clipboard."/>
   <suffix name="URL" label="URL from clipboard."/>
-  <affected-histogram name="MobileOmnibox.LongPressPasteAge"/>
   <affected-histogram name="MobileOmnibox.PressedClipboardSuggestionAge"/>
   <affected-histogram name="Omnibox.ClipboardSuggestionRemovedAge"/>
   <affected-histogram name="Omnibox.ClipboardSuggestionShownAge"/>
diff --git a/tools/metrics/histograms/metadata/mobile/histograms.xml b/tools/metrics/histograms/metadata/mobile/histograms.xml
index 5ee197f..6ca34b4 100644
--- a/tools/metrics/histograms/metadata/mobile/histograms.xml
+++ b/tools/metrics/histograms/metadata/mobile/histograms.xml
@@ -54,7 +54,7 @@
 </variants>
 
 <histogram name="Mobile.AppMenu.TimeToTakeAction.Abandoned" units="ms"
-    expires_after="2023-05-07">
+    expires_after="2026-02-10">
   <owner>gangwu@chromium.org</owner>
   <owner>twellington@chromium.org</owner>
   <summary>
@@ -63,11 +63,13 @@
     is abandoned. See Mobile.AppMenu.TimeToTakeAction.SelectedItem for the cases
     where it is closed as a result of user interaction with the menu. Android
     only.
+
+    (Expired in 2023-05-07. Revived in 2025-01-07.)
   </summary>
 </histogram>
 
 <histogram name="Mobile.AppMenu.TimeToTakeAction.SelectedItem" units="ms"
-    expires_after="2023-11-12">
+    expires_after="2026-02-10">
   <owner>gangwu@chromium.org</owner>
   <owner>twellington@chromium.org</owner>
   <summary>
@@ -75,6 +77,8 @@
     menu is closed as a result of the user clicking a menu item. See
     Mobile.AppMenu.TimeToTakeAction.Abandoned for the cases where it is
     abandoned by the user. Android only.
+
+    (Expired in 2023-11-12. Revived in 2025-01-07.)
   </summary>
 </histogram>
 
@@ -1142,18 +1146,6 @@
   </summary>
 </histogram>
 
-<histogram name="MobileOmnibox.LongPressPasteAge" units="ms"
-    expires_after="2021-04-18">
-  <owner>gangwu@chromium.org</owner>
-  <owner>jdonnelly@chromium.org</owner>
-  <summary>
-    Recorded when user long presses and pastes clipboard content into omnibox.
-    The value indicates the estimated age of the clipboard.
-
-    Intended to be compared to Omnibox.ClipboardSuggestionShownAge.
-  </summary>
-</histogram>
-
 <histogram name="MobileOmnibox.PopupOpenDuration" units="ms"
     expires_after="2022-02-02">
   <owner>stkhapugin@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/platform/histograms.xml b/tools/metrics/histograms/metadata/platform/histograms.xml
index ca60c54..760c205 100644
--- a/tools/metrics/histograms/metadata/platform/histograms.xml
+++ b/tools/metrics/histograms/metadata/platform/histograms.xml
@@ -2017,7 +2017,7 @@
 </histogram>
 
 <histogram name="Platform.Segmentation.ScopeLevel"
-    enum="FeatureManagementScopeLevel" expires_after="2025-02-16">
+    enum="FeatureManagementScopeLevel" expires_after="2026-02-16">
   <owner>gwendal@chromium.org</owner>
   <owner>iby@chromium.org</owner>
   <owner>chromeos-data-eng@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/signin/histograms.xml b/tools/metrics/histograms/metadata/signin/histograms.xml
index 81834d5..c45c29f 100644
--- a/tools/metrics/histograms/metadata/signin/histograms.xml
+++ b/tools/metrics/histograms/metadata/signin/histograms.xml
@@ -455,8 +455,8 @@
   <owner>jlebel@chromium.org</owner>
   <owner>chrome-signin-team@chromium.org</owner>
   <summary>
-    Records the sign-in consent by regular Gmail account or managed account.
-    Recorded when the user signs in (iOS only).
+    Records the sign-in by regular Gmail account or managed account. Recorded
+    when the user signs in (iOS only).
   </summary>
 </histogram>
 
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json
index e2e0e00..c8bd2953 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/v49.0/linux-arm64/trace_processor_shell"
         },
         "win": {
-            "hash": "9707bd4be6792f20346fcfbd4ec7440fd83dd5fc",
-            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/f83d7ea5ed4d1c25eb7026f50fac7d8e04d00b49/trace_processor_shell.exe"
+            "hash": "bafb74e2d7ffd16e44c2a01e2868a2c8a672a3d2",
+            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/19792a9913a7c898c2a154c10b580087bc2ee7b6/trace_processor_shell.exe"
         },
         "linux_arm": {
             "hash": "a15d8362d80cfd7cd8d785cf6afc22586de688cd",
@@ -21,8 +21,8 @@
             "full_remote_path": "perfetto-luci-artifacts/v49.0/mac-arm64/trace_processor_shell"
         },
         "linux": {
-            "hash": "00c962f84934d09a8e2ee21df31fb11bed31602f",
-            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/b9145b8802343b05b9c6ba9bd9e8864bffaeaa3f/trace_processor_shell"
+            "hash": "74ee75e96bee62aa1d8d307dc8d4bcf94ddaec4d",
+            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/19792a9913a7c898c2a154c10b580087bc2ee7b6/trace_processor_shell"
         }
     },
     "power_profile.sql": {
diff --git a/tools/traffic_annotation/summary/annotations.xml b/tools/traffic_annotation/summary/annotations.xml
index c952fd9..af84eb6 100644
--- a/tools/traffic_annotation/summary/annotations.xml
+++ b/tools/traffic_annotation/summary/annotations.xml
@@ -501,4 +501,5 @@
  <item id="webauthn_challenge_fetch" added_in_milestone="133" content_hash_code="00d0cb34" os_list="linux,windows,chromeos" file_path="chrome/browser/webauthn/challenge_url_fetcher.cc" />
  <item id="chromeos_capture_mode" added_in_milestone="133" content_hash_code="0056219a" os_list="chromeos" file_path="chrome/browser/ui/ash/capture_mode/lens_overlay_query_controller.cc" />
  <item id="outlook_calendar_page_handler" added_in_milestone="133" content_hash_code="02d4c022" os_list="linux,windows,chromeos" file_path="chrome/browser/new_tab_page/modules/v2/calendar/outlook_calendar_page_handler.cc" />
+ <item id="omnibox_search_aggregator_suggest" added_in_milestone="133" content_hash_code="052189bc" os_list="linux,windows,android,chromeos" file_path="components/omnibox/browser/search_aggregator_suggestions_service.cc" />
 </annotations>
diff --git a/tools/traffic_annotation/summary/grouping.xml b/tools/traffic_annotation/summary/grouping.xml
index b01bc91..1d399e1 100644
--- a/tools/traffic_annotation/summary/grouping.xml
+++ b/tools/traffic_annotation/summary/grouping.xml
@@ -362,6 +362,7 @@
       <annotation id="webauthn_challenge_fetch"/>
       <annotation id="chromeos_capture_mode"/>
       <annotation id="outlook_calendar_page_handler"/>
+      <annotation id="omnibox_search_aggregator_suggest"/>
     </sender>
   </group>
   <group name="Admin Features" hidden="true">
diff --git a/ui/android/java/src/org/chromium/ui/ElidedUrlTextView.java b/ui/android/java/src/org/chromium/ui/ElidedUrlTextView.java
index ddf5768..bbe6e0ee 100644
--- a/ui/android/java/src/org/chromium/ui/ElidedUrlTextView.java
+++ b/ui/android/java/src/org/chromium/ui/ElidedUrlTextView.java
@@ -13,23 +13,23 @@
 import androidx.appcompat.widget.AppCompatTextView;
 
 import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
+import org.chromium.build.annotations.RequiresNonNull;
 
 /**
- * A TextView which truncates and displays a URL such that the origin is always visible.
- * The URL can be expanded by clicking on the it.
+ * A TextView which truncates and displays a URL such that the origin is always visible. The URL can
+ * be expanded by clicking on the it.
  */
 @NullMarked
 public class ElidedUrlTextView extends AppCompatTextView {
     // The number of lines to display when the URL is truncated. This number
     // should still allow the origin to be displayed. NULL before
     // setUrlAfterLayout() is called.
-    @SuppressWarnings("NullAway.Init")
-    private Integer mTruncatedUrlLinesToDisplay;
+    private int mTruncatedUrlLinesToDisplay;
 
     // The number of lines to display when the URL is expanded. This should be enough to display
     // at most two lines of the fragment if there is one in the URL.
-    @SuppressWarnings("NullAway.Init")
-    private Integer mFullLinesToDisplay;
+    private @Nullable Integer mFullLinesToDisplay;
 
     // If true, the text view will show the truncated text. If false, it
     // will show the full, expanded text.
@@ -132,6 +132,7 @@
                                         : R.string.elided_url_text_view_url_expanded));
     }
 
+    @RequiresNonNull("mFullLinesToDisplay")
     private boolean updateMaxLines() {
         int maxLines = mFullLinesToDisplay;
         if (mIsShowingTruncatedText) {
diff --git a/ui/android/java/src/org/chromium/ui/InsetObserver.java b/ui/android/java/src/org/chromium/ui/InsetObserver.java
index 105b91be..cf26c5e 100644
--- a/ui/android/java/src/org/chromium/ui/InsetObserver.java
+++ b/ui/android/java/src/org/chromium/ui/InsetObserver.java
@@ -100,7 +100,7 @@
             InsetConsumerSource.APP_HEADER_COORDINATOR_CAPTION,
             InsetConsumerSource.EDGE_TO_EDGE_CONTROLLER_IMPL,
             InsetConsumerSource.EDGE_TO_EDGE_LAYOUT_COORDINATOR,
-            InsetConsumerSource.APP_HEADER_COORDINATOR_BOTTOM,
+            InsetConsumerSource.APP_HEADER_COORDINATOR_IME,
             InsetConsumerSource.COUNT
         })
         @Retention(RetentionPolicy.SOURCE)
@@ -112,7 +112,7 @@
             int APP_HEADER_COORDINATOR_CAPTION = 2;
             int EDGE_TO_EDGE_CONTROLLER_IMPL = 3;
             int EDGE_TO_EDGE_LAYOUT_COORDINATOR = 4;
-            int APP_HEADER_COORDINATOR_BOTTOM = 5;
+            int APP_HEADER_COORDINATOR_IME = 5;
 
             // Update this whenever a consumer source is added or removed.
             int COUNT = 6;
diff --git a/ui/android/java/src/org/chromium/ui/base/SelectFileDialog.java b/ui/android/java/src/org/chromium/ui/base/SelectFileDialog.java
index 4b2b7738..d1f01f3 100644
--- a/ui/android/java/src/org/chromium/ui/base/SelectFileDialog.java
+++ b/ui/android/java/src/org/chromium/ui/base/SelectFileDialog.java
@@ -45,6 +45,7 @@
 import org.chromium.base.task.AsyncTask;
 import org.chromium.base.task.PostTask;
 import org.chromium.base.task.TaskTraits;
+import org.chromium.build.annotations.Initializer;
 import org.chromium.build.annotations.NullMarked;
 import org.chromium.build.annotations.NullUnmarked;
 import org.chromium.build.annotations.Nullable;
@@ -255,21 +256,18 @@
     private static @Nullable WindowAndroid sWindowAndroidForTesting;
 
     private long mNativeSelectFileDialog;
-    private @Nullable String mIntentAction;
+    private String mIntentAction;
 
     // File types may contain both file extensions and MIME types.
-    @SuppressWarnings("NullAway.Init")
     private List<String> mFileTypes;
 
     // Converted from `mFileTypes`, only contains deduped MIME types.
-    @SuppressWarnings("NullAway.Init")
     private List<String> mMimeTypes;
 
     private boolean mCapture;
     private boolean mAllowMultiple;
     private @Nullable Uri mCameraOutputUri;
 
-    @SuppressWarnings("NullAway.Init")
     private WindowAndroid mWindowAndroid;
 
     /** Whether an Activity is available on the system to support capturing images (i.e. Camera). */
@@ -338,6 +336,7 @@
      * @param window The WindowAndroid that can show intents
      */
     @CalledByNative
+    @Initializer
     protected void selectFile(
             String intentAction,
             String[] fileTypes,
diff --git a/ui/android/java/src/org/chromium/ui/display/PhysicalDisplayAndroid.java b/ui/android/java/src/org/chromium/ui/display/PhysicalDisplayAndroid.java
index 90a9c7d..6c34a2a3 100644
--- a/ui/android/java/src/org/chromium/ui/display/PhysicalDisplayAndroid.java
+++ b/ui/android/java/src/org/chromium/ui/display/PhysicalDisplayAndroid.java
@@ -4,6 +4,8 @@
 
 package org.chromium.ui.display;
 
+import static org.chromium.build.NullUtil.assumeNonNull;
+
 import android.content.ComponentCallbacks;
 import android.content.Context;
 import android.content.res.Configuration;
@@ -27,8 +29,8 @@
 import org.chromium.base.Log;
 import org.chromium.base.StrictModeContext;
 import org.chromium.base.ThreadUtils;
+import org.chromium.build.annotations.EnsuresNonNull;
 import org.chromium.build.annotations.NullMarked;
-import org.chromium.build.annotations.NullUnmarked;
 import org.chromium.build.annotations.Nullable;
 
 import java.util.Arrays;
@@ -46,8 +48,7 @@
     // When this object exists, a positive value means that the forced DIP scale is set and
     // the zero means it is not. The non existing object (i.e. null reference) means that
     // the existence and value of the forced DIP scale has not yet been determined.
-    @SuppressWarnings("NullAway.Init")
-    private static Float sForcedDIPScale;
+    private static @Nullable Float sForcedDIPScale;
 
     private static @Nullable Float getHdrSdrRatio(Display display) {
         if (Build.VERSION.SDK_INT < Build.VERSION_CODES.UPSIDE_DOWN_CAKE) return null;
@@ -59,29 +60,26 @@
         return display.isHdr() && display.isHdrSdrRatioAvailable();
     }
 
+    @EnsuresNonNull("sForcedDIPScale")
     private static boolean hasForcedDIPScale() {
         if (sForcedDIPScale == null) {
+            float value = 0.0f;
             String forcedScaleAsString =
                     CommandLine.getInstance()
                             .getSwitchValue(DisplaySwitches.FORCE_DEVICE_SCALE_FACTOR);
-            if (forcedScaleAsString == null) {
-                sForcedDIPScale = Float.valueOf(0.0f);
-            } else {
-                boolean isInvalid = false;
+            if (forcedScaleAsString != null) {
                 try {
-                    sForcedDIPScale = Float.valueOf(forcedScaleAsString);
-                    // Negative values are discarded.
-                    if (sForcedDIPScale.floatValue() <= 0.0f) isInvalid = true;
+                    value = Float.valueOf(forcedScaleAsString);
                 } catch (NumberFormatException e) {
-                    // Strings that do not represent numbers are discarded.
-                    isInvalid = true;
                 }
 
-                if (isInvalid) {
-                    Log.w(TAG, "Ignoring invalid forced DIP scale '" + forcedScaleAsString + "'");
-                    sForcedDIPScale = Float.valueOf(0.0f);
+                if (value <= 0.0f) {
+                    // Strings that do not represent numbers are discarded.
+                    Log.w(TAG, "Ignoring invalid forced DIP scale: %s", forcedScaleAsString);
+                    value = 0.0f;
                 }
             }
+            sForcedDIPScale = value;
         }
         return sForcedDIPScale.floatValue() > 0;
     }
@@ -206,9 +204,9 @@
         return mWindowContext;
     }
 
-    @NullUnmarked
     @RequiresApi(VERSION_CODES.R)
     private void updateFromConfiguration() {
+        assumeNonNull(mWindowContext);
         WindowManager windowManager = mWindowContext.getSystemService(WindowManager.class);
         Rect bounds = windowManager.getMaximumWindowMetrics().getBounds();
         int windowInsetsType = WindowInsets.Type.systemBars() | WindowInsets.Type.displayCutout();
@@ -236,9 +234,11 @@
                 mWindowContext.getDisplay());
     }
 
-    /* package */ @NullUnmarked
+    /* package */
     void onDisplayRemoved() {
         if (USE_CONFIGURATION) {
+            assumeNonNull(mWindowContext);
+            assumeNonNull(mComponentCallbacks);
             mWindowContext.unregisterComponentCallbacks(mComponentCallbacks);
         }
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE
@@ -299,7 +299,6 @@
                 /* isInternal= */ null);
     }
 
-    @NullUnmarked
     private void updateCommon(
             Rect bounds,
             @Nullable Insets insets,
@@ -331,7 +330,7 @@
             DeviceProductInfo deviceProductInfo = display.getDeviceProductInfo();
             if (deviceProductInfo != null) {
                 isInternal =
-                        display.getDeviceProductInfo().getConnectionToSinkType()
+                        deviceProductInfo.getConnectionToSinkType()
                                 == DeviceProductInfo.CONNECTION_TO_SINK_BUILT_IN;
             }
         }
diff --git a/ui/android/java/src/org/chromium/ui/dragdrop/DropDataProviderImpl.java b/ui/android/java/src/org/chromium/ui/dragdrop/DropDataProviderImpl.java
index 1d43631..07a66ee 100644
--- a/ui/android/java/src/org/chromium/ui/dragdrop/DropDataProviderImpl.java
+++ b/ui/android/java/src/org/chromium/ui/dragdrop/DropDataProviderImpl.java
@@ -4,6 +4,8 @@
 
 package org.chromium.ui.dragdrop;
 
+import static org.chromium.build.NullUtil.assumeNonNull;
+
 import android.content.ContentProvider;
 import android.content.ContentResolver;
 import android.content.res.AssetFileDescriptor;
@@ -21,7 +23,6 @@
 import org.chromium.base.ContextUtils;
 import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.build.annotations.NullMarked;
-import org.chromium.build.annotations.NullUnmarked;
 import org.chromium.build.annotations.Nullable;
 import org.chromium.build.annotations.UsedByReflection;
 
@@ -93,8 +94,7 @@
 
     private int mClearCachedDataIntervalMs = DEFAULT_CLEAR_CACHED_DATA_INTERVAL_MS;
 
-    @SuppressWarnings("NullAway.Init")
-    private byte[] mImageBytes;
+    private byte @Nullable [] mImageBytes;
 
     private @Nullable String mImageFilename;
     private @Nullable String mMimeType;
@@ -109,14 +109,7 @@
     private long mLastUriClearedTimestamp;
     private long mLastUriCreatedTimestamp;
     private boolean mLastUriRecorded;
-
-    @SuppressWarnings("NullAway.Init")
-    private DropPipeDataWriter mDropPipeDataWriter;
-
-    /** This constructor is being used to initialize the pipeWriter. */
-    public DropDataProviderImpl() {
-        initPipeWriter();
-    }
+    private DropPipeDataWriter mDropPipeDataWriter = new DropPipeDataWriter();
 
     /** Update the delayed time before clearing the image cache. */
     public void setClearCachedDataIntervalMs(int milliseconds) {
@@ -139,8 +132,7 @@
     /**
      * Cache the passed-in image data of Drag and Drop. It is expected for filename to be non-empty.
      */
-    public Uri cache(
-            byte[] imageBytes, @Nullable String encodingFormat, @Nullable String filename) {
+    public Uri cache(byte[] imageBytes, String encodingFormat, String filename) {
         long elapsedRealtime = SystemClock.elapsedRealtime();
         long lastUriCreatedTimestamp = mLastUriCreatedTimestamp;
         String mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(encodingFormat);
@@ -205,7 +197,6 @@
     }
 
     /** Clear the image data of Drag and Drop. */
-    @NullUnmarked
     private void clearCacheData() {
         mImageBytes = null;
         mImageFilename = null;
@@ -238,16 +229,9 @@
     }
 
     /**
-     * @see android.content.ContentProvider.PipeDataWriter
-     */
-    public void initPipeWriter() {
-        mDropPipeDataWriter = new DropPipeDataWriter();
-    }
-
-    /**
      * @see ContentProvider#getType(Uri)
      */
-    public @Nullable String getType(Uri uri) {
+    public @Nullable String getType(@Nullable Uri uri) {
         synchronized (LOCK) {
             if (uri == null || !uri.equals(mContentProviderUri)) {
                 return null;
@@ -290,7 +274,6 @@
     /**
      * @see ContentProvider#openAssetFile(Uri, String)
      */
-    @NullUnmarked
     public @Nullable AssetFileDescriptor openAssetFile(
             ContentProvider providerWrapper, Uri uri, String mode)
             throws FileNotFoundException, SecurityException {
@@ -316,11 +299,12 @@
                         "Android.DragDrop.Image.OpenFileTime.FirstAttempt", duration);
             }
             mOpenFileLastAccessTime = elapsedRealtime;
-            imageBytes = this.mImageBytes;
+            imageBytes = assumeNonNull(this.mImageBytes);
         }
+        String type = getType(uri);
+        assert type != null;
         ParcelFileDescriptor fd =
-                providerWrapper.openPipeHelper(
-                        uri, getType(uri), null, imageBytes, mDropPipeDataWriter);
+                providerWrapper.openPipeHelper(uri, type, null, imageBytes, mDropPipeDataWriter);
         return new AssetFileDescriptor(fd, 0, imageBytes.length);
     }
 
@@ -336,7 +320,6 @@
     /**
      * @see ContentProvider#query(Uri, String[], String, String[], String)
      */
-    @NullUnmarked
     public Cursor query(Uri uri, String @Nullable [] projection) {
         byte[] imageBytes;
         String imageFilename;
@@ -344,8 +327,8 @@
             if (uri == null || !uri.equals(mContentProviderUri)) {
                 return new MatrixCursor(COLUMNS, 0);
             }
-            imageBytes = this.mImageBytes;
-            imageFilename = mImageFilename;
+            imageBytes = assumeNonNull(mImageBytes);
+            imageFilename = assumeNonNull(mImageFilename);
         }
         if (projection == null) {
             projection = COLUMNS;
@@ -384,25 +367,29 @@
     /**
      * @see ContentProvider#call(String, String, Bundle)
      */
-    @NullUnmarked
     public @Nullable Bundle call(String method, @Nullable String arg, @Nullable Bundle extras) {
         switch (method) {
             case CACHE_METHOD_NAME:
+                assumeNonNull(extras);
+                byte[] imageBytes = (byte[]) extras.getSerializable(BYTES_PARAM);
+                String encodingFormat = extras.getString(IMAGE_CONTENT_EXTENSION_PARAM);
+                String filename = extras.getString(IMAGE_FILE_PARAM);
+                assert imageBytes != null;
+                assert encodingFormat != null;
+                assert filename != null;
+                Uri uri = cache(imageBytes, encodingFormat, filename);
                 Bundle bundleToReturn = new Bundle();
-                Uri uri =
-                        cache(
-                                (byte[]) extras.getSerializable(BYTES_PARAM),
-                                extras.getString(IMAGE_CONTENT_EXTENSION_PARAM),
-                                extras.getString(IMAGE_FILE_PARAM));
                 bundleToReturn.putParcelable("uri", uri);
                 return bundleToReturn;
             case SET_INTERVAL_METHOD_NAME:
+                assumeNonNull(extras);
                 setClearCachedDataIntervalMs(
                         extras.getInt(
                                 CLEAR_CACHE_PARAM,
                                 DropDataProviderImpl.DEFAULT_CLEAR_CACHED_DATA_INTERVAL_MS));
                 break;
             case ON_DRAG_END_METHOD_NAME:
+                assumeNonNull(extras);
                 onDragEnd(extras.getBoolean(IMAGE_USAGE_PARAM));
                 break;
         }
@@ -410,7 +397,7 @@
         return null;
     }
 
-    byte[] getImageBytesForTesting() {
+    byte @Nullable [] getImageBytesForTesting() {
         synchronized (LOCK) {
             return mImageBytes;
         }
diff --git a/ui/android/java/src/org/chromium/ui/listmenu/BasicListMenu.java b/ui/android/java/src/org/chromium/ui/listmenu/BasicListMenu.java
index d70db50c..b9fda1db 100644
--- a/ui/android/java/src/org/chromium/ui/listmenu/BasicListMenu.java
+++ b/ui/android/java/src/org/chromium/ui/listmenu/BasicListMenu.java
@@ -194,4 +194,8 @@
                 new LayoutViewBuilder(R.layout.list_section_divider),
                 ListSectionDividerViewBinder::bind);
     }
+
+    public ModelListAdapter getAdapterForTesting() {
+        return mAdapter;
+    }
 }
diff --git a/ui/android/java/src/org/chromium/ui/listmenu/ListMenuHost.java b/ui/android/java/src/org/chromium/ui/listmenu/ListMenuHost.java
index 37e7076..b5bf94a4 100644
--- a/ui/android/java/src/org/chromium/ui/listmenu/ListMenuHost.java
+++ b/ui/android/java/src/org/chromium/ui/listmenu/ListMenuHost.java
@@ -4,6 +4,8 @@
 
 package org.chromium.ui.listmenu;
 
+import static org.chromium.build.NullUtil.assumeNonNull;
+
 import android.content.res.TypedArray;
 import android.graphics.Color;
 import android.graphics.Rect;
@@ -15,7 +17,7 @@
 
 import org.chromium.base.ObserverList;
 import org.chromium.base.ResettersForTesting;
-import org.chromium.build.annotations.NullUnmarked;
+import org.chromium.build.annotations.EnsuresNonNull;
 import org.chromium.build.annotations.Nullable;
 import org.chromium.ui.R;
 import org.chromium.ui.widget.AnchoredPopupWindow;
@@ -53,9 +55,7 @@
 
     private int mMenuMaxWidth;
 
-    @SuppressWarnings("NullAway.Init")
-    private AnchoredPopupWindow mPopupMenu;
-
+    private @Nullable AnchoredPopupWindow mPopupMenu;
     private @Nullable ListMenuDelegate mDelegate;
     private ObserverList<PopupMenuShownListener> mPopupListeners = new ObserverList<>();
     private boolean mTryToFitLargestItem;
@@ -136,7 +136,7 @@
     }
 
     /** Init the popup window with provided attributes, called before {@link #showMenu()} */
-    @NullUnmarked
+    @EnsuresNonNull("mPopupMenu")
     private void initPopupWindow() {
         if (mDelegate == null) throw new IllegalStateException("Delegate was not set.");
 
@@ -206,6 +206,7 @@
     @Override
     public void onPreLayoutChange(
             boolean positionBelow, int x, int y, int width, int height, Rect anchorRect) {
+        assumeNonNull(mPopupMenu);
         if (mPositionedAtEnd) {
             mPopupMenu.setAnimationStyle(
                     positionBelow ? R.style.EndIconMenuAnim : R.style.EndIconMenuAnimBottom);
diff --git a/ui/android/java/src/org/chromium/ui/resources/dynamics/ViewResourceInflater.java b/ui/android/java/src/org/chromium/ui/resources/dynamics/ViewResourceInflater.java
index 88674a6..7954b215 100644
--- a/ui/android/java/src/org/chromium/ui/resources/dynamics/ViewResourceInflater.java
+++ b/ui/android/java/src/org/chromium/ui/resources/dynamics/ViewResourceInflater.java
@@ -4,37 +4,41 @@
 
 package org.chromium.ui.resources.dynamics;
 
+import static org.chromium.build.NullUtil.assumeNonNull;
+
 import android.content.Context;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.ViewTreeObserver;
 
+import org.chromium.build.annotations.EnsuresNonNull;
 import org.chromium.build.annotations.NullMarked;
 import org.chromium.build.annotations.NullUnmarked;
 import org.chromium.build.annotations.Nullable;
+import org.chromium.build.annotations.RequiresNonNull;
 
 /**
  * ViewResourceInflater is a utility class that facilitates using an Android View as a dynamic
- * resource, which can be later used as a compositor layer. This class assumes that the View
- * is defined declaratively, using a XML Layout file, and that the View that is going to be
- * inflated is the single top-level View of the layout (its root).
+ * resource, which can be later used as a compositor layer. This class assumes that the View is
+ * defined declaratively, using a XML Layout file, and that the View that is going to be inflated is
+ * the single top-level View of the layout (its root).
  *
- * By default, the View is inflated without being attached to the hierarchy, which allows
- * subclasses to read/modify the View "offscreen", via the method {@link #onFinishInflate()}.
- * When a new snapshot of the View is required, which is triggered when the method
- * {@link #invalidate()} is called, the View is drawn and automatically detached from the
- * hierarchy after the snapshot has been captured.  View drawing and capturing is done async,
- * so when calling {@link #invalidate()} the caller may want to wait until onCaptureEnd has been
- * called to make sure a new snapshot has been captured in cases where rendering an older snapshot
- * for a frame or two would be problematic.  This can be done by overriding onCaptureEnd.
+ * <p>By default, the View is inflated without being attached to the hierarchy, which allows
+ * subclasses to read/modify the View "offscreen", via the method {@link #onFinishInflate()}. When a
+ * new snapshot of the View is required, which is triggered when the method {@link #invalidate()} is
+ * called, the View is drawn and automatically detached from the hierarchy after the snapshot has
+ * been captured. View drawing and capturing is done async, so when calling {@link #invalidate()}
+ * the caller may want to wait until onCaptureEnd has been called to make sure a new snapshot has
+ * been captured in cases where rendering an older snapshot for a frame or two would be problematic.
+ * This can be done by overriding onCaptureEnd.
  *
- * There's also an option to not attach to the hierarchy at all, by overriding the method
- * {@link #shouldAttachView()} and making it return false (the default is true). In this case
- * the changes to the View will always be "offscreen". By default an unspecified value of
- * {@link View.MeasureSpec} will be used to determine the width and height of the View.
- * It's possible to specify custom size constraints by overriding the methods
- * {@link #getWidthMeasureSpec()} and {@link #getHeightMeasureSpec()}.
+ * <p>There's also an option to not attach to the hierarchy at all, by overriding the method {@link
+ * #shouldAttachView()} and making it return false (the default is true). In this case the changes
+ * to the View will always be "offscreen". By default an unspecified value of {@link
+ * View.MeasureSpec} will be used to determine the width and height of the View. It's possible to
+ * specify custom size constraints by overriding the methods {@link #getWidthMeasureSpec()} and
+ * {@link #getHeightMeasureSpec()}.
  */
 @NullMarked
 public class ViewResourceInflater {
@@ -58,8 +62,7 @@
     private @Nullable ViewResourceAdapter mResourceAdapter;
 
     /** The inflated View. */
-    @SuppressWarnings("NullAway.Init")
-    private View mView;
+    private @Nullable View mView;
 
     /** Whether the View needs a layout update. */
     private boolean mNeedsLayoutUpdate;
@@ -97,6 +100,7 @@
     }
 
     /** Inflate the layout. */
+    @EnsuresNonNull("mView")
     public void inflate() {
         if (mView != null) return;
 
@@ -249,6 +253,7 @@
     }
 
     /** Lays out the View. */
+    @RequiresNonNull("mView")
     protected void layout() {
         mView.measure(getWidthMeasureSpec(), getHeightMeasureSpec());
         mView.layout(0, 0, getMeasuredWidth(), getMeasuredHeight());
@@ -257,7 +262,7 @@
     /**
      * @return The View resource.
      */
-    protected View getView() {
+    protected @Nullable View getView() {
         return mView;
     }
 
@@ -269,6 +274,7 @@
     }
 
     /** Attach the View to the hierarchy. */
+    @RequiresNonNull("mView")
     private void attachView() {
         if (!mIsAttached) {
             assert mView.getParent() == null;
@@ -287,6 +293,7 @@
     /** Detach the View from the hierarchy. */
     private void detachView() {
         if (mIsAttached) {
+            assumeNonNull(mView);
             if (mOnDrawListener != null) {
                 mView.getViewTreeObserver().removeOnDrawListener(mOnDrawListener);
                 mOnDrawListener = null;
@@ -330,6 +337,7 @@
     }
 
     /** Register the resource and creates an adapter for it. */
+    @RequiresNonNull("mView")
     private void registerResource() {
         if (mResourceAdapter == null) {
             mResourceAdapter = new ViewInflaterAdapter(mView.findViewById(mViewId));
diff --git a/ui/android/java/src/org/chromium/ui/widget/RippleBackgroundHelper.java b/ui/android/java/src/org/chromium/ui/widget/RippleBackgroundHelper.java
index 76c1a364..304184b 100644
--- a/ui/android/java/src/org/chromium/ui/widget/RippleBackgroundHelper.java
+++ b/ui/android/java/src/org/chromium/ui/widget/RippleBackgroundHelper.java
@@ -21,6 +21,7 @@
 import androidx.appcompat.content.res.AppCompatResources;
 import androidx.core.graphics.ColorUtils;
 
+import org.chromium.build.annotations.EnsuresNonNull;
 import org.chromium.build.annotations.NullMarked;
 import org.chromium.build.annotations.Nullable;
 import org.chromium.ui.R;
@@ -41,11 +42,7 @@
 
     private @Nullable ColorStateList mBackgroundColorList;
     private @Nullable ColorStateList mStateLayerColorList;
-
-    @SuppressWarnings("NullAway.Init")
     private GradientDrawable mBackgroundGradient;
-
-    @SuppressWarnings("NullAway.Init")
     private GradientDrawable mStateLayerGradient;
 
     private @Nullable LayerDrawable mBackgroundLayerDrawable;
@@ -206,6 +203,7 @@
      * @param verticalInset The vertical inset of the background drawable.
      * @return The {@link GradientDrawable}/{@link LayerDrawable} to be used as ripple background.
      */
+    @EnsuresNonNull({"mBackgroundGradient", "mStateLayerGradient"})
     private Drawable createBackgroundDrawable(
             ColorStateList rippleColorList,
             ColorStateList borderColorList,
diff --git a/ui/android/junit/src/org/chromium/ui/InsetObserverTest.java b/ui/android/junit/src/org/chromium/ui/InsetObserverTest.java
index bff3a105..eaf7eba4d 100644
--- a/ui/android/junit/src/org/chromium/ui/InsetObserverTest.java
+++ b/ui/android/junit/src/org/chromium/ui/InsetObserverTest.java
@@ -144,7 +144,7 @@
     public void applyInsets_withMultipleInsetConsumers() {
         // Add consumers in reverse order of priority.
         mInsetObserver.addInsetsConsumer(
-                mInsetsConsumer1, InsetConsumerSource.APP_HEADER_COORDINATOR_BOTTOM);
+                mInsetsConsumer1, InsetConsumerSource.APP_HEADER_COORDINATOR_IME);
         mInsetObserver.addInsetsConsumer(
                 mInsetsConsumer2,
                 InsetConsumerSource.DEFERRED_IME_WINDOW_INSET_APPLICATION_CALLBACK);
diff --git a/ui/events/back_gesture_event.cc b/ui/events/back_gesture_event.cc
index 19b6a2e..f069437 100644
--- a/ui/events/back_gesture_event.cc
+++ b/ui/events/back_gesture_event.cc
@@ -4,8 +4,14 @@
 
 #include "ui/events/back_gesture_event.h"
 
+#include "base/time/time.h"
+
 namespace ui {
 
-BackGestureEvent::BackGestureEvent(float progress) : progress_(progress) {}
+BackGestureEvent::BackGestureEvent(float progress)
+    : progress_(progress), time_(base::TimeTicks::Now()) {}
+
+BackGestureEvent::BackGestureEvent(float progress, base::TimeTicks time)
+    : progress_(progress), time_(time) {}
 
 }  // namespace ui
diff --git a/ui/events/back_gesture_event.h b/ui/events/back_gesture_event.h
index 8b8923e5..6507d3a 100644
--- a/ui/events/back_gesture_event.h
+++ b/ui/events/back_gesture_event.h
@@ -5,6 +5,7 @@
 #ifndef UI_EVENTS_BACK_GESTURE_EVENT_H_
 #define UI_EVENTS_BACK_GESTURE_EVENT_H_
 
+#include "base/time/time.h"
 #include "ui/events/events_export.h"
 #include "ui/gfx/geometry/point_f.h"
 
@@ -21,6 +22,7 @@
 class EVENTS_EXPORT BackGestureEvent {
  public:
   explicit BackGestureEvent(float progress);
+  BackGestureEvent(float progress, base::TimeTicks time);
 
   BackGestureEvent(const BackGestureEvent&) = default;
   BackGestureEvent& operator=(const BackGestureEvent&) = default;
@@ -28,9 +30,11 @@
   ~BackGestureEvent() = default;
 
   float progress() const { return progress_; }
+  base::TimeTicks time() const { return time_; }
 
  private:
   float progress_;
+  base::TimeTicks time_;
 };
 
 }  // namespace ui
diff --git a/ui/views/view_unittest_aura.cc b/ui/views/view_unittest_aura.cc
index b16b0355..194efce6 100644
--- a/ui/views/view_unittest_aura.cc
+++ b/ui/views/view_unittest_aura.cc
@@ -55,7 +55,7 @@
   ~ViewAuraTest() override = default;
 
   const View::Views& GetViewsWithLayers(Widget* widget) {
-    return widget->GetViewsWithLayers();
+    return widget->GetViewsWithLayersInZOrder();
   }
 };
 
diff --git a/ui/views/widget/widget.cc b/ui/views/widget/widget.cc
index f1f9fb6..8d40188 100644
--- a/ui/views/widget/widget.cc
+++ b/ui/views/widget/widget.cc
@@ -72,15 +72,16 @@
 
 namespace {
 
-// If |view| has a layer the layer is added to |layers|. Else this recurses
-// through the children. This is used to build a list of the layers created by
-// views that are direct children of the Widgets layer.
-void BuildViewsWithLayers(View* view, View::Views* views) {
+// If `view` has a layer the layer is added to `layers`. Else this recurses
+// through the children. This is used to build a list of the layers in reverse
+// z-order (i.e views later in the returned vector have a higher z-order)
+// created by views that are direct children of the Widgets layer.
+void BuildViewsWithLayersInZOrder(View* view, View::Views* views) {
   if (view->layer()) {
     views->push_back(view);
   } else {
-    for (View* child : view->children()) {
-      BuildViewsWithLayers(child, views);
+    for (View* child : view->GetChildrenInZOrder()) {
+      BuildViewsWithLayersInZOrder(child, views);
     }
   }
 }
@@ -2172,7 +2173,7 @@
     return false;
   }
 
-  const View::Views& views_with_layers = GetViewsWithLayers();
+  const View::Views& views_with_layers = GetViewsWithLayersInZOrder();
   if (views_with_layers.empty()) {
     return true;
   }
@@ -2514,11 +2515,11 @@
   return true;
 }
 
-const View::Views& Widget::GetViewsWithLayers() {
+const View::Views& Widget::GetViewsWithLayersInZOrder() {
   if (views_with_layers_dirty_) {
     views_with_layers_dirty_ = false;
     views_with_layers_.clear();
-    BuildViewsWithLayers(GetRootView(), &views_with_layers_);
+    BuildViewsWithLayersInZOrder(GetRootView(), &views_with_layers_);
   }
   return views_with_layers_;
 }
diff --git a/ui/views/widget/widget.h b/ui/views/widget/widget.h
index 3ce32a7..e45f88d 100644
--- a/ui/views/widget/widget.h
+++ b/ui/views/widget/widget.h
@@ -1399,8 +1399,9 @@
                                ui::mojom::WindowShowState* show_state);
 
   // Returns the Views whose layers are parented directly to the Widget's
-  // layer.
-  const View::Views& GetViewsWithLayers();
+  // layer in reverse z-order (i.e views later in the returned vector have a
+  // higher z-order).
+  const View::Views& GetViewsWithLayersInZOrder();
 
   // If a descendent of |root_view_| is focused, then clear the focus.
   void ClearFocusFromWidget();
diff --git a/ui/webui/resources/mojo/BUILD.gn b/ui/webui/resources/mojo/BUILD.gn
index ad60828..8f403d0c 100644
--- a/ui/webui/resources/mojo/BUILD.gn
+++ b/ui/webui/resources/mojo/BUILD.gn
@@ -31,12 +31,6 @@
     "chromeos/ash/components/multidevice/mojom/multidevice_types.mojom-webui.js",
     "chromeos/ash/services/device_sync/public/mojom/device_sync.mojom-webui.js",
     "chromeos/ash/services/multidevice_setup/public/mojom/multidevice_setup.mojom-webui.js",
-    "chromeos/services/network_config/public/mojom/constants.mojom-webui.js",
-    "chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js",
-    "chromeos/services/network_config/public/mojom/network_types.mojom-webui.js",
-    "chromeos/services/network_health/public/mojom/network_diagnostics.mojom-webui.js",
-    "chromeos/services/network_health/public/mojom/network_health.mojom-webui.js",
-    "chromeos/services/network_health/public/mojom/network_health_types.mojom-webui.js",
     "mojo/public/mojom/base/absl_status.mojom-webui.js",
     "mojo/public/mojom/base/big_string.mojom-webui.js",
     "mojo/public/mojom/base/big_buffer.mojom-webui.js",
@@ -62,6 +56,12 @@
     "chromeos/ash/services/cellular_setup/public/mojom/cellular_setup.mojom-webui.ts",
     "chromeos/ash/services/cellular_setup/public/mojom/esim_manager.mojom-webui.ts",
     "chromeos/ash/services/auth_factor_config/public/mojom/auth_factor_config.mojom-webui.ts",
+    "chromeos/services/network_config/public/mojom/constants.mojom-webui.ts",
+    "chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.ts",
+    "chromeos/services/network_config/public/mojom/network_types.mojom-webui.ts",
+    "chromeos/services/network_health/public/mojom/network_diagnostics.mojom-webui.ts",
+    "chromeos/services/network_health/public/mojom/network_health.mojom-webui.ts",
+    "chromeos/services/network_health/public/mojom/network_health_types.mojom-webui.ts",
     "chromeos/components/in_session_auth/mojom/in_session_auth.mojom-webui.ts",
     "chromeos/ash/services/connectivity/public/mojom/passpoint.mojom-webui.ts",
     "chromeos/ash/services/hotspot_config/public/mojom/cros_hotspot_config.mojom-webui.ts",
@@ -122,6 +122,10 @@
       "//chromeos/ash/services/hotspot_config/public/mojom:mojom_ts__generator",
       "//chromeos/ash/services/nearby/public/mojom:nearby_share_settings_ts__generator",
       "//chromeos/components/in_session_auth/mojom:mojom_ts__generator",
+      "//chromeos/services/network_config/public/mojom:mojom_ts__generator",
+      "//chromeos/services/network_config/public/mojom:network_types_ts__generator",
+      "//chromeos/services/network_health/public/mojom:mojom_ts__generator",
+      "//chromeos/services/network_health/public/mojom:types_ts__generator",
       "//ui/base/accelerators/mojom:mojom_ts__generator",
       "//ui/events/mojom:mojom_ts__generator",
       "//ui/latency/mojom:mojom_ts__generator",
@@ -147,10 +151,6 @@
       "//chromeos/ash/components/multidevice/mojom:mojom_js__generator",
       "//chromeos/ash/services/device_sync/public/mojom:mojom_js__generator",
       "//chromeos/ash/services/multidevice_setup/public/mojom:mojom_js__generator",
-      "//chromeos/services/network_config/public/mojom:mojom_js__generator",
-      "//chromeos/services/network_config/public/mojom:network_types_js__generator",
-      "//chromeos/services/network_health/public/mojom:mojom_js__generator",
-      "//chromeos/services/network_health/public/mojom:types_js__generator",
       "//mojo/public/mojom/base:base_js__generator",
       "//services/network/public/mojom:mojom_ip_address_js__generator",
       "//url/mojom:url_mojom_gurl_js__generator",
diff --git a/url/android/java/src/org/chromium/url/GURL.java b/url/android/java/src/org/chromium/url/GURL.java
index f4df373..f2ed6b2 100644
--- a/url/android/java/src/org/chromium/url/GURL.java
+++ b/url/android/java/src/org/chromium/url/GURL.java
@@ -23,6 +23,7 @@
 import org.chromium.base.task.PostTask;
 import org.chromium.base.task.TaskTraits;
 import org.chromium.build.BuildConfig;
+import org.chromium.build.annotations.Initializer;
 import org.chromium.build.annotations.NullMarked;
 import org.chromium.build.annotations.Nullable;
 import org.chromium.url.mojom.Url;
@@ -67,12 +68,8 @@
     // TODO(crbug.com/40113773): Right now we return a new String with each request for a
     //      GURL component other than the spec itself. Should we cache return Strings (as
     //      WeakReference?) so that callers can share String memory?
-    @SuppressWarnings("NullAway.Init")
     private String mSpec;
-
     private boolean mIsValid;
-
-    @SuppressWarnings("NullAway.Init")
     private Parsed mParsed;
 
     private static class Holder {
@@ -147,6 +144,7 @@
     }
 
     @CalledByNative
+    @Initializer
     private void init(@JniType("std::string") String spec, boolean isValid, Parsed parsed) {
         mSpec = spec;
         mIsValid = isValid;
diff --git a/v8 b/v8
index 41dacff..75be3dc 160000
--- a/v8
+++ b/v8
@@ -1 +1 @@
-Subproject commit 41dacffe436aeb9311879cb07648f1e36609a804
+Subproject commit 75be3dcb5330aa3ebcf79031e7123bc3f0f07179