diff --git a/BUILD.gn b/BUILD.gn
index 7ee617b..2854c04 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -1618,7 +1618,7 @@
       "//tools/perf/chrome_telemetry_build:telemetry_chrome_test",
     ]
 
-    if (!is_chromeos_ash) {
+    if (!is_chromeos_ash && !(is_fuchsia && optimize_for_size)) {
       data_deps += [ "//chrome/test:performance_browser_tests" ]
     }
 
diff --git a/DEPS b/DEPS
index f78c640..b9b20fe 100644
--- a/DEPS
+++ b/DEPS
@@ -282,7 +282,7 @@
   'sysroots_json_path': 'build/linux/sysroot_scripts/sysroots.json',
 
   # siso CIPD package version.
-  'siso_version': 'git_revision:2133382e6d258f4fa4de2cfb255d8287efc91039',
+  'siso_version': 'git_revision:d3c91417789c3190676d18dc3cc26dff20819eea',
 
   # download libaom test data
   'download_libaom_testdata': False,
@@ -302,15 +302,15 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
-  'src_internal_revision': '6b1a25bd76bb7b2eb1682803a9e6ebfffe217162',
+  'src_internal_revision': 'e823fb2b9ea82ebaae5a6bbc711094e9fce2011d',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Skia
   # and whatever else without interference from each other.
-  'skia_revision': 'c6d971f87d12cdf14c691768bfbc84b1708cc389',
+  'skia_revision': 'cebd44423589a04572589d7afe747d2403e8376e',
   # 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': '0cbe9772a2312baa15f6bc2488dd892c7dadeb20',
+  'v8_revision': '6d2e0ebae22c4e1b5bde0e31e969f0282015748e',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ANGLE
   # and whatever else without interference from each other.
@@ -357,7 +357,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling freetype
   # and whatever else without interference from each other.
-  'freetype_revision': 'd77dd24b412951fea1c649c0514670f9eec8888c',
+  'freetype_revision': 'df39b017d9b25eb34b396484fc235544cedd0565',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling freetype
   # and whatever else without interference from each other.
@@ -377,7 +377,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling catapult
   # and whatever else without interference from each other.
-  'catapult_revision': '5c1525f035b3ffeadd8a6e7750de77344e68112d',
+  'catapult_revision': 'b80aa2639fb10ad27cde55d4ff91add5541b693e',
   # 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.
@@ -397,7 +397,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': '3a4c1e3b3397b5aa0a0d20c14748a4223b62b28b',
+  'devtools_frontend_revision': '9d796a30b712bfc1011f2d74c63ffd7ecc30fe69',
   # 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.
@@ -421,7 +421,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': '2b4d11e8baa591349d1d4ebc0232b7551e8dd30e',
+  'dawn_revision': 'ba111c412386625576ee05406f185380e16b7173',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -465,7 +465,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'cros_components_revision': 'a6eda34d484dbe2c7b53b18e9b0178471786d31e',
+  'cros_components_revision': 'a767012d5dd290a3f05c13dc409dcaa55a36143d',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -821,7 +821,7 @@
 
   'src/clank': {
     'url': Var('chrome_git') + '/clank/internal/apps.git' + '@' +
-    '4c64d76d7fb4c9dcf9928bd978247dd34f8fc0e5',
+    '9d6f2af52bdf55ec345bd603c28235cc48f91c14',
     'condition': 'checkout_android and checkout_src_internal',
   },
 
@@ -1221,7 +1221,7 @@
     Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'),
 
   'src/third_party/devtools-frontend-internal': {
-      'url': Var('chrome_git') + '/devtools/devtools-internal.git' + '@' + 'c897148700ae41473202b3e91a1c78d15147ecf0',
+      'url': Var('chrome_git') + '/devtools/devtools-internal.git' + '@' + '85d0133dea66c39f934d01aa64319b03f14abbcb',
     'condition': 'checkout_src_internal',
   },
 
@@ -1831,7 +1831,7 @@
       'dep_type': 'cipd',
   },
 
-  'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@8517c30c0d2eea0253a67590bf457249f4fa317f',
+  'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@fbb4876974053a41d987e06204d0bb8a73d5c90c',
 
   'src/third_party/vulkan_memory_allocator':
     Var('chromium_git') + '/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git' + '@' + '56300b29fbfcc693ee6609ddad3fdd5b7a449a21',
@@ -1871,7 +1871,7 @@
     Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '7dda75f0afc05006439ceabfa58e8da231a848c0',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + '15b12dc96c4f9b9321cd24cc0f35668c28bc540c',
+    Var('webrtc_git') + '/src.git' + '@' + 'a39206020cec8b6735195be66b203ef6fe0684fc',
 
   # 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.
@@ -2005,7 +2005,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/media_app/app',
-        'version': 'jFR-rwskNkhWdhJ52SOur67EoEQg2fLIsNWFNGUZgiAC',
+        'version': 'IVacNsLYtDLh18uJlMeEWwfupgeRwrJ5Kqp7FF3tG9IC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
@@ -2038,7 +2038,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/projector_app/app',
-        'version': 'S3nvhey-ePzmM1g9xMiyfQwnMHFWHUcGLR-DL_hem00C',
+        'version': 'jAUsJ0etZsSgkelqCK3Z1q-Tn8QYB9pHlfAoHf1DQcYC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
@@ -4028,7 +4028,7 @@
 
   'src/ios_internal':  {
       'url': Var('chrome_git') + '/chrome/ios_internal.git' + '@' +
-        '4159c451256544d96e42efed8781757f5087830e',
+        'c54b03b5aeddf91251fd9d39ed0ff0a4c6d141b0',
       'condition': 'checkout_ios and checkout_src_internal',
   },
 
diff --git a/ash/app_list/views/app_list_item_view.cc b/ash/app_list/views/app_list_item_view.cc
index cf97ed2..c161ae5 100644
--- a/ash/app_list/views/app_list_item_view.cc
+++ b/ash/app_list/views/app_list_item_view.cc
@@ -604,12 +604,13 @@
   icon_background_->SetCanProcessEventsWithinSubtree(false);
   icon_background_->SetVisible(is_folder_);
 
+  // If the item icon is used, set the icon in ImageView and paint the view.
   if (use_item_icon_) {
-    // If the item icon is used, set the icon in ImageView and paint the view.
     if (chromeos::features::IsSeparateWebAppShortcutBadgeIconEnabled()) {
       shortcut_background_container_ =
           AddChildView(std::make_unique<views::View>());
     }
+
     icon_ = AddChildView(std::make_unique<views::ImageView>());
     icon_->SetCanProcessEventsWithinSubtree(false);
     icon_->SetVerticalAlignment(views::ImageView::Alignment::kLeading);
@@ -703,6 +704,10 @@
     return;
   }
 
+  if (update_item_icon && item_weak_) {
+    has_host_badge_ = !item_weak_->GetHostBadgeIcon().isNull();
+  }
+
   if (update_item_icon) {
     if (HasPromiseIconPlaceholder()) {
       icon_image_model_ = ui::ImageModel(ui::ImageModel::FromVectorIcon(
@@ -767,19 +772,28 @@
     return;
   }
 
-  gfx::Size icon_bounds = is_folder_ ? app_list_config_->folder_icon_size()
-                                     : app_list_config_->grid_icon_size();
-
-  icon_bounds = gfx::ScaleToRoundedSize(icon_bounds,
-                                        GetAdjustedIconScaleForProgressRing());
+  const gfx::Size icon_size = gfx::ScaleToRoundedSize(
+      GetIconSize(), GetAdjustedIconScaleForProgressRing());
 
   gfx::ImageSkia resized = gfx::ImageSkiaOperations::CreateResizedImage(
-      icon, skia::ImageOperations::RESIZE_BEST, icon_bounds);
+      icon, skia::ImageOperations::RESIZE_BEST, icon_size);
   icon_->SetImage(resized);
 
   Layout();
 }
 
+gfx::Size AppListItemView::GetIconSize() const {
+  if (is_folder_) {
+    return app_list_config_->folder_icon_size();
+  }
+
+  if (has_host_badge_) {
+    return app_list_config_->GetShortcutIconSize();
+  }
+
+  return app_list_config_->grid_icon_size();
+}
+
 bool AppListItemView::HasPromiseIconPlaceholder() {
   return is_promise_app_ && item_weak_ &&
          item_weak_->GetMetadata()->is_placeholder_icon;
@@ -796,7 +810,6 @@
       host_badge_icon_view_->SetImage(nullptr);
     }
     host_badge_icon_image_ = gfx::ImageSkia();
-    has_host_badge_ = false;
     return;
   }
   host_badge_icon_image_ = host_badge_icon;
@@ -825,7 +838,6 @@
         std::make_unique<views::ImageView>());
   }
   host_badge_icon_view_->SetImage(resized);
-  has_host_badge_ = true;
 
   Layout();
 }
@@ -1364,8 +1376,7 @@
 
   views::FocusRing::Get(this)->Layout();
 
-  const gfx::Size icon_size = is_folder_ ? app_list_config_->folder_icon_size()
-                                         : app_list_config_->grid_icon_size();
+  const gfx::Size icon_size = GetIconSize();
 
   const gfx::Rect icon_bounds = GetIconBoundsForTargetViewBounds(
       app_list_config_, rect,
@@ -1374,13 +1385,13 @@
 
   const int shortcut_background_container_dimension =
       app_list_config_->GetShortcutBackgroundContainerDimension();
-  const int shortcut_host_badge_icon_container_dimension =
-      app_list_config_->GetShortcutHostBadgeIconContainerDimension();
-
   const gfx::Size shortcut_background_container_size =
       gfx::Size(shortcut_background_container_dimension,
                 shortcut_background_container_dimension);
 
+  const int shortcut_host_badge_icon_container_dimension =
+      app_list_config_->GetShortcutHostBadgeIconContainerDimension();
+
   const gfx::Size shotcut_host_badge_icon_container_size =
       gfx::Size(shortcut_host_badge_icon_container_dimension,
                 shortcut_host_badge_icon_container_dimension);
@@ -1389,7 +1400,9 @@
     shortcut_background_container_->SetBackground(
         views::CreateThemedRoundedRectBackground(
             cros_tokens::kCrosSysSystemOnBaseOpaque,
-            shortcut_background_container_dimension / 2, 0));
+            std::round(icon_scale_ * shortcut_background_container_dimension /
+                       2.0f),
+            0));
 
     const gfx::Rect shortcut_background_container_bounds =
         GetIconBoundsForTargetViewBounds(
@@ -1436,7 +1449,9 @@
     host_badge_icon_container_->SetBackground(
         views::CreateThemedRoundedRectBackground(
             cros_tokens::kCrosSysSystemOnBaseOpaque,
-            shortcut_host_badge_icon_container_dimension / 2, 0));
+            std::round(icon_scale_ *
+                       shortcut_host_badge_icon_container_dimension / 2.0f),
+            0));
 
     host_badge_icon_container_->SetBoundsRect(host_badge_icon_container_bounds);
   }
@@ -1875,8 +1890,7 @@
   new_install_dot_->layer()->SetFillsBoundsOpaquely(false);
   new_install_dot_->layer()->SetOpacity(0.0f);
 
-  const gfx::Point center_point =
-      gfx::Rect(app_list_config_->grid_icon_size()).CenterPoint();
+  const gfx::Point center_point = gfx::Rect(GetIconSize()).CenterPoint();
   icon_view->layer()->SetTransform(
       gfx::GetScaleTransform(center_point, kPromiseIconScaleInstalling));
 
@@ -1988,7 +2002,26 @@
   if (is_folder_) {
     return folder_icon_->CreateDragImage();
   }
-
+  if (has_host_badge_ && host_badge_icon_view_ &&
+      chromeos::features::IsSeparateWebAppShortcutBadgeIconEnabled()) {
+    const int background_radius =
+        std::round(app_list_config_->GetShortcutBackgroundContainerDimension() /
+                   2.0f * kDragDropAppIconScale);
+    const int badge_background_radius = std::round(
+        app_list_config_->GetShortcutHostBadgeIconContainerDimension() / 2.0f *
+        kDragDropAppIconScale);
+    return gfx::ImageSkiaOperations::CreateIconWithBadge(
+        gfx::ImageSkiaOperations::CreateImageWithCircleBackground(
+            background_radius,
+            GetColorProvider()->GetColor(
+                cros_tokens::kCrosSysSystemOnBaseOpaque),
+            icon_->GetImage()),
+        gfx::ImageSkiaOperations::CreateImageWithCircleBackground(
+            badge_background_radius,
+            GetColorProvider()->GetColor(
+                cros_tokens::kCrosSysSystemOnBaseOpaque),
+            host_badge_icon_view_->GetImage()));
+  }
   return icon_->GetImage();
 }
 
@@ -2072,7 +2105,7 @@
 
 void AppListItemView::ItemHostBadgeIconChanged() {
   DCHECK(item_weak_);
-  SetHostBadgeIcon(item_weak_->GetHostBadgeIcon());
+  UpdateIconView(/*update_item_icon=*/true);
 }
 
 void AppListItemView::ItemBadgeVisibilityChanged() {
@@ -2215,6 +2248,14 @@
   icon_background_->SetVisible(true);
   GetIconView()->SetPaintToLayer();
   GetIconView()->layer()->SetFillsBoundsOpaquely(false);
+  if (host_badge_icon_container_) {
+    host_badge_icon_container_->SetPaintToLayer();
+    host_badge_icon_container_->layer()->SetFillsBoundsOpaquely(false);
+  }
+  if (shortcut_background_container_) {
+    shortcut_background_container_->SetPaintToLayer();
+    shortcut_background_container_->layer()->SetFillsBoundsOpaquely(false);
+  }
   base::AutoReset<bool> auto_reset(&setting_up_icon_animation_, true);
   ui::Layer* const background_layer = GetIconBackgroundLayer();
   DCHECK(background_layer);
@@ -2278,6 +2319,12 @@
   if (!setting_up_icon_animation_ && !extend_icon && !is_folder_) {
     icon_background_->SetVisible(false);
     GetIconView()->DestroyLayer();
+    if (host_badge_icon_container_) {
+      host_badge_icon_container_->DestroyLayer();
+    }
+    if (shortcut_background_container_) {
+      shortcut_background_container_->DestroyLayer();
+    }
   }
 }
 
diff --git a/ash/app_list/views/app_list_item_view.h b/ash/app_list/views/app_list_item_view.h
index 796579d..1053cb1f 100644
--- a/ash/app_list/views/app_list_item_view.h
+++ b/ash/app_list/views/app_list_item_view.h
@@ -172,6 +172,9 @@
   // Sets the icon of this image.
   void SetIcon(const gfx::ImageSkia& icon);
 
+  // Returns the main app icon size for the associated item.
+  gfx::Size GetIconSize() const;
+
   // Whether the icon use on this item is a placeholder icon for a promise app.
   bool HasPromiseIconPlaceholder();
 
diff --git a/ash/capture_mode/capture_mode_education_controller.h b/ash/capture_mode/capture_mode_education_controller.h
index fa500c4..c9f28b7 100644
--- a/ash/capture_mode/capture_mode_education_controller.h
+++ b/ash/capture_mode/capture_mode_education_controller.h
@@ -54,8 +54,6 @@
 
  private:
   friend class CaptureModeEducationControllerTest;
-  FRIEND_TEST_ALL_PREFIXES(CaptureModeEducationControllerTest,
-                           NudgeAppearsOnAcceleratorPressed);
 
   // Used to control the clock in a test setting.
   static void SetOverrideClockForTesting(base::Clock* test_clock);
diff --git a/ash/capture_mode/capture_mode_education_controller_unittest.cc b/ash/capture_mode/capture_mode_education_controller_unittest.cc
index 81dcbcd..1a6505f 100644
--- a/ash/capture_mode/capture_mode_education_controller_unittest.cc
+++ b/ash/capture_mode/capture_mode_education_controller_unittest.cc
@@ -8,17 +8,32 @@
 #include "ash/capture_mode/capture_mode_controller.h"
 #include "ash/constants/ash_features.h"
 #include "ash/constants/ash_pref_names.h"
+#include "ash/constants/notifier_catalogs.h"
 #include "ash/shell.h"
 #include "ash/system/toast/anchored_nudge.h"
 #include "ash/system/toast/anchored_nudge_manager_impl.h"
 #include "ash/test/ash_test_base.h"
+#include "base/test/metrics/histogram_tester.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/test/simple_test_clock.h"
+#include "base/test/task_environment.h"
+#include "base/time/time.h"
+#include "ui/events/event_constants.h"
+#include "ui/events/keycodes/keyboard_codes_posix.h"
 
 namespace ash {
 
 namespace {
 
+constexpr char kCaptureModeNudgeId[] = "kCaptureModeNudge";
+
+constexpr char kNudgeTimeToActionWithin1m[] =
+    "Ash.NotifierFramework.Nudge.TimeToAction.Within1m";
+constexpr char kNudgeTimeToActionWithin1h[] =
+    "Ash.NotifierFramework.Nudge.TimeToAction.Within1h";
+constexpr char kNudgeTimeToActionWithinSession[] =
+    "Ash.NotifierFramework.Nudge.TimeToAction.WithinSession";
+
 PrefService* GetPrefService() {
   return Shell::Get()->session_controller()->GetActivePrefService();
 }
@@ -27,13 +42,12 @@
   Shell::Get()->anchored_nudge_manager()->Cancel(id);
 }
 
-constexpr char kCaptureModeNudgeId[] = "kCaptureModeNudge";
-
 }  // namespace
 
 class CaptureModeEducationControllerTest : public AshTestBase {
  public:
-  CaptureModeEducationControllerTest(const std::string& arm_name = "") {
+  CaptureModeEducationControllerTest(const std::string& arm_name = "")
+      : AshTestBase(base::test::TaskEnvironment::TimeSource::MOCK_TIME) {
     // `kSystemNudgeV2` must be initialized before the test starts as otherwise
     // `AnchoredNudgeManagerImpl` will not be created by the shell.
     scoped_feature_list_.InitWithFeaturesAndParameters(
@@ -53,6 +67,25 @@
     CaptureModeEducationController::SetOverrideClockForTesting(test_clock);
   }
 
+  void ActivateNudgeAndCheckVisibility() {
+    // Attempt to use the Windows Snipping Tool (capture bar) shortcut.
+    PressAndReleaseKey(ui::VKEY_S, ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN);
+
+    // Get the list of visible nudges from the nudge manager and make sure our
+    // education nudge is in the list and visible.
+    const AnchoredNudge* nudge =
+        Shell::Get()->anchored_nudge_manager()->GetNudgeIfShown(
+            kCaptureModeNudgeId);
+    ASSERT_TRUE(nudge);
+    EXPECT_TRUE(nudge->GetVisible());
+  }
+
+  // Skip the 3 times/24 hours show limit for testing.
+  void SkipNudgePrefs() {
+    CaptureModeController::Get()->education_controller()->skip_prefs_for_test_ =
+        true;
+  }
+
  protected:
   base::test::ScopedFeatureList scoped_feature_list_;
 };
@@ -70,25 +103,15 @@
 
   // We will need to show the nudge more than three times, so ignore pref
   // limits.
-  CaptureModeController::Get()->education_controller()->skip_prefs_for_test_ =
-      true;
+  SkipNudgePrefs();
 
-  AnchoredNudgeManagerImpl* nudge_manager =
-      Shell::Get()->anchored_nudge_manager();
   for (auto [tracker_data, metadata] : kAcceleratorTrackerList) {
     // We only want to test capture mode related misinputs.
     if (metadata.type != TrackerType::kCaptureMode) {
       continue;
     }
 
-    PressAndReleaseKey(tracker_data.key_code, tracker_data.flags);
-
-    // Get the list of visible nudges from the nudge manager and make sure our
-    // education nudge is in the list and visible.
-    const AnchoredNudge* nudge =
-        nudge_manager->GetNudgeIfShown(kCaptureModeNudgeId);
-    ASSERT_TRUE(nudge);
-    ASSERT_TRUE(nudge->GetVisible());
+    ActivateNudgeAndCheckVisibility();
 
     // Close nudge to get ready for the next input.
     CancelNudge(kCaptureModeNudgeId);
@@ -118,15 +141,7 @@
   AnchoredNudgeManagerImpl* nudge_manager =
       Shell::Get()->anchored_nudge_manager();
   for (int i = 0; i < 3; i++) {
-    // Attempt to use the Windows Snipping Tool (capture bar) shortcut.
-    PressAndReleaseKey(ui::VKEY_S, ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN);
-
-    // Get the list of visible nudges from the nudge manager and make sure our
-    // education nudge is in the list and visible.
-    const AnchoredNudge* nudge =
-        nudge_manager->GetNudgeIfShown(kCaptureModeNudgeId);
-    ASSERT_TRUE(nudge);
-    EXPECT_TRUE(nudge->GetVisible());
+    ActivateNudgeAndCheckVisibility();
 
     // Showing the nudge should also update the preferences.
     EXPECT_EQ(
@@ -162,17 +177,7 @@
   // Advance clock so we aren't at zero time.
   test_clock.Advance(base::Hours(25));
 
-  // Attempt to use the Windows Snipping Tool (capture bar) shortcut.
-  PressAndReleaseKey(ui::VKEY_S, ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN);
-
-  // Get the list of visible nudges from the nudge manager and make sure our
-  // education nudge is in the list and visible.
-  AnchoredNudgeManagerImpl* nudge_manager =
-      Shell::Get()->anchored_nudge_manager();
-  const AnchoredNudge* nudge =
-      nudge_manager->GetNudgeIfShown(kCaptureModeNudgeId);
-  ASSERT_TRUE(nudge);
-  EXPECT_TRUE(nudge->GetVisible());
+  ActivateNudgeAndCheckVisibility();
 
   // Showing the nudge should also update the preferences.
   EXPECT_EQ(
@@ -189,7 +194,8 @@
 
   // The nudge should not be visible.
   const AnchoredNudge* null_nudge =
-      nudge_manager->GetNudgeIfShown(kCaptureModeNudgeId);
+      Shell::Get()->anchored_nudge_manager()->GetNudgeIfShown(
+          kCaptureModeNudgeId);
   ASSERT_FALSE(null_nudge);
 
   // The nudge count should not increment as the nudge was not shown.
@@ -199,4 +205,85 @@
   CaptureModeEducationControllerTest::SetOverrideClock(nullptr);
 }
 
+// Tests that metrics relating to the shortcut nudge (Arm 1) are properly
+// recorded.
+TEST_F(CaptureModeEducationShortcutNudgeTest, ShortcutNudgeMetrics) {
+  base::HistogramTester histogram_tester;
+
+  // For this test, we do not care about pref limits.
+  SkipNudgePrefs();
+
+  // The nudge has not been activated, so all related buckets should be at 0.
+  Shell::Get()->anchored_nudge_manager()->ResetNudgeRegistryForTesting();
+  histogram_tester.ExpectBucketCount(
+      kNudgeTimeToActionWithin1m,
+      NudgeCatalogName::kCaptureModeEducationShortcutNudge, 0);
+  histogram_tester.ExpectBucketCount(
+      kNudgeTimeToActionWithin1h,
+      NudgeCatalogName::kCaptureModeEducationShortcutNudge, 0);
+  histogram_tester.ExpectBucketCount(
+      kNudgeTimeToActionWithinSession,
+      NudgeCatalogName::kCaptureModeEducationShortcutNudge, 0);
+
+  ActivateNudgeAndCheckVisibility();
+
+  // Attempt to use the screenshot shortcut as soon as possible.
+  PressAndReleaseKey(ui::VKEY_MEDIA_LAUNCH_APP1,
+                     ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN);
+
+  // The buckets do not cascade, so a nudge that has been activated within 1m
+  // will not show up in the `kNudgeTimeToActionWithin1h` bucket or session
+  // bucket.
+  histogram_tester.ExpectBucketCount(
+      kNudgeTimeToActionWithin1m,
+      NudgeCatalogName::kCaptureModeEducationShortcutNudge, 1);
+  histogram_tester.ExpectBucketCount(
+      kNudgeTimeToActionWithin1h,
+      NudgeCatalogName::kCaptureModeEducationShortcutNudge, 0);
+  histogram_tester.ExpectBucketCount(
+      kNudgeTimeToActionWithinSession,
+      NudgeCatalogName::kCaptureModeEducationShortcutNudge, 0);
+
+  // Close the capture session and nudge, and advance the clock so we can show
+  // the nudge again.
+  CaptureModeController::Get()->Stop();
+  CancelNudge(kCaptureModeNudgeId);
+  ActivateNudgeAndCheckVisibility();
+
+  // Attempt to use the screenshot shortcut after more than 1 minute, but less
+  // than 1 hour.
+  task_environment()->FastForwardBy(base::Minutes(30));
+  PressAndReleaseKey(ui::VKEY_MEDIA_LAUNCH_APP1,
+                     ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN);
+  histogram_tester.ExpectBucketCount(
+      kNudgeTimeToActionWithin1m,
+      NudgeCatalogName::kCaptureModeEducationShortcutNudge, 1);
+  histogram_tester.ExpectBucketCount(
+      kNudgeTimeToActionWithin1h,
+      NudgeCatalogName::kCaptureModeEducationShortcutNudge, 1);
+  histogram_tester.ExpectBucketCount(
+      kNudgeTimeToActionWithinSession,
+      NudgeCatalogName::kCaptureModeEducationShortcutNudge, 0);
+
+  // Close the capture session and nudge, and advance the clock so we can show
+  // the nudge again.
+  CaptureModeController::Get()->Stop();
+  CancelNudge(kCaptureModeNudgeId);
+  ActivateNudgeAndCheckVisibility();
+
+  // Attempt to use the screenshot shortcut after more than 1 hour.
+  task_environment()->FastForwardBy(base::Hours(2));
+  PressAndReleaseKey(ui::VKEY_MEDIA_LAUNCH_APP1,
+                     ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN);
+  histogram_tester.ExpectBucketCount(
+      kNudgeTimeToActionWithin1m,
+      NudgeCatalogName::kCaptureModeEducationShortcutNudge, 1);
+  histogram_tester.ExpectBucketCount(
+      kNudgeTimeToActionWithin1h,
+      NudgeCatalogName::kCaptureModeEducationShortcutNudge, 1);
+  histogram_tester.ExpectBucketCount(
+      kNudgeTimeToActionWithinSession,
+      NudgeCatalogName::kCaptureModeEducationShortcutNudge, 1);
+}
+
 }  // namespace ash
diff --git a/ash/capture_mode/capture_mode_metrics.cc b/ash/capture_mode/capture_mode_metrics.cc
index 1f89269..ec9ed20 100644
--- a/ash/capture_mode/capture_mode_metrics.cc
+++ b/ash/capture_mode/capture_mode_metrics.cc
@@ -7,6 +7,7 @@
 #include "ash/capture_mode/capture_mode_behavior.h"
 #include "ash/capture_mode/capture_mode_types.h"
 #include "ash/shell.h"
+#include "ash/system/toast/anchored_nudge_manager_impl.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/time/time.h"
 
@@ -113,6 +114,11 @@
       BuildHistogramName(kEntryPointHistogramRootWord, /*behavior=*/nullptr,
                          /*append_ui_mode_suffix=*/true),
       entry_type);
+  // Record nudge-related metrics.
+  if (entry_type == CaptureModeEntryType::kAccelTakePartialScreenshot) {
+    AnchoredNudgeManager::Get()->MaybeRecordNudgeAction(
+        NudgeCatalogName::kCaptureModeEducationShortcutNudge);
+  }
 }
 
 void RecordCaptureModeRecordingDuration(base::TimeDelta recording_duration,
diff --git a/ash/components/arc/chrome_feature_flags/arc_chrome_feature_flags_bridge.cc b/ash/components/arc/chrome_feature_flags/arc_chrome_feature_flags_bridge.cc
index b49d7b075..72e304d 100644
--- a/ash/components/arc/chrome_feature_flags/arc_chrome_feature_flags_bridge.cc
+++ b/ash/components/arc/chrome_feature_flags/arc_chrome_feature_flags_bridge.cc
@@ -75,7 +75,6 @@
     return;
   }
   mojom::FeatureFlagsPtr flags = mojom::FeatureFlags::New();
-  flags->qs_revamp = ash::features::IsQsRevampEnabled();
   flags->jelly_colors = chromeos::features::IsJellyEnabled();
   flags->touchscreen_emulation =
       base::FeatureList::IsEnabled(kTouchscreenEmulation);
@@ -92,6 +91,7 @@
   flags->enable_pip_double_tap = ash::features::IsPipDoubleTapToResizeEnabled();
   flags->render_arc_notifications_by_chrome =
       ash::features::IsRenderArcNotificationsByChromeEnabled();
+  flags->game_dashboard = ash::features::IsGameDashboardEnabled();
 
   chrome_feature_flags_instance->NotifyFeatureFlags(std::move(flags));
 }
diff --git a/ash/components/arc/chrome_feature_flags/arc_chrome_feature_flags_bridge_unittest.cc b/ash/components/arc/chrome_feature_flags/arc_chrome_feature_flags_bridge_unittest.cc
index 7f73abb..5d54cfb 100644
--- a/ash/components/arc/chrome_feature_flags/arc_chrome_feature_flags_bridge_unittest.cc
+++ b/ash/components/arc/chrome_feature_flags/arc_chrome_feature_flags_bridge_unittest.cc
@@ -65,12 +65,6 @@
   EXPECT_NE(nullptr, bridge());
 }
 
-TEST_F(ArcChromeFeatureFlagsBridgeTest, NotifyQsRevamp_Enabled) {
-  scoped_feature_list()->InitAndEnableFeature(ash::features::kQsRevamp);
-  Connect();
-  EXPECT_TRUE(instance()->flags_called_value()->qs_revamp);
-}
-
 TEST_F(ArcChromeFeatureFlagsBridgeTest, NotifyJelly_Enabled) {
   scoped_feature_list()->InitAndEnableFeature(chromeos::features::kJelly);
   Connect();
@@ -174,5 +168,17 @@
   EXPECT_FALSE(instance()->flags_called_value()->enable_pip_double_tap);
 }
 
+TEST_F(ArcChromeFeatureFlagsBridgeTest, NotifyGameDashboard_Enabled) {
+  scoped_feature_list()->InitAndEnableFeature(ash::features::kGameDashboard);
+  Connect();
+  EXPECT_TRUE(instance()->flags_called_value()->game_dashboard);
+}
+
+TEST_F(ArcChromeFeatureFlagsBridgeTest, NotifyGameDashboard_Disabled) {
+  scoped_feature_list()->InitAndDisableFeature(ash::features::kGameDashboard);
+  Connect();
+  EXPECT_FALSE(instance()->flags_called_value()->game_dashboard);
+}
+
 }  // namespace
 }  // namespace arc
diff --git a/ash/components/arc/mojom/chrome_feature_flags.mojom b/ash/components/arc/mojom/chrome_feature_flags.mojom
index 419f7ea..c483cc5 100644
--- a/ash/components/arc/mojom/chrome_feature_flags.mojom
+++ b/ash/components/arc/mojom/chrome_feature_flags.mojom
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
-// Next MinVersion: 7
+// Next MinVersion: 8
 
 module arc.mojom;
 
@@ -17,8 +17,8 @@
 
 // State of feature flags that ARC++ needs to know from Chrome.
 struct FeatureFlags {
-  // chrome://flags#qs-revamp
-  bool qs_revamp;
+  // DEPRECATED: chrome://flags#qs-revamp
+  bool deprecated_qs_revamp;
   // chrome://flags#jelly-colors
   bool jelly_colors;
   // DEPRECATED: chrome://flags#arc-trackpad-scroll-touchscreen-emulation
@@ -35,6 +35,8 @@
   [MinVersion=5] bool enable_pip_double_tap;
   // chrome://flags#render-arc-notifications-by-chrome;
   [MinVersion=6] bool render_arc_notifications_by_chrome;
+  // ash::features::IsGameDashboardEnabled
+  [MinVersion=7] bool game_dashboard;
 };
 
 // This interface provides methods to propagate the feature flag status to
diff --git a/ash/constants/ash_features.cc b/ash/constants/ash_features.cc
index ba2fd9d..7387891 100644
--- a/ash/constants/ash_features.cc
+++ b/ash/constants/ash_features.cc
@@ -1149,7 +1149,7 @@
 // Enables new directory tree implementation in files.
 BASE_FEATURE(kFilesNewDirectoryTree,
              "FilesNewDirectoryTree",
-             base::FEATURE_DISABLED_BY_DEFAULT);
+             base::FEATURE_ENABLED_BY_DEFAULT);
 
 // Enables local image search by query in the Files app.
 BASE_FEATURE(kFilesLocalImageSearch,
@@ -1850,6 +1850,11 @@
              "NearbyKeepAliveFix",
              base::FEATURE_ENABLED_BY_DEFAULT);
 
+// Enables Nearby Presence for scanning and discovery of nearby devices.
+BASE_FEATURE(kNearbyPresence,
+             "NearbyPresence",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+
 // Enables Notifier Collision to allow popup notifications and tray bubbles not
 // overlap when showing on a display.
 BASE_FEATURE(kNotifierCollision,
@@ -2303,9 +2308,6 @@
              "ProjectorTranscriptChapterTitle",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
-// Enable or disable quick settings revamped view (go/qsrevamp).
-BASE_FEATURE(kQsRevamp, "QsRevamp", base::FEATURE_ENABLED_BY_DEFAULT);
-
 // Controls whether to show toast notification when account switches.
 BASE_FEATURE(kProjectorAccountSwitchNotification,
              "ProjectorAccountSwitchNotification",
@@ -3837,6 +3839,10 @@
   return base::FeatureList::IsEnabled(kNearbyKeepAliveFix);
 }
 
+bool IsNearbyPresenceEnabled() {
+  return base::FeatureList::IsEnabled(kNearbyPresence);
+}
+
 bool IsNotifierCollisionEnabled() {
   return base::FeatureList::IsEnabled(kNotifierCollision);
 }
@@ -4118,12 +4124,6 @@
   return base::FeatureList::IsEnabled(kProjectorUpdateIndexableText);
 }
 
-// TODO(b/305075031): Remove `kQsRevamp` and this method after all the clean up
-// is done.
-bool IsQsRevampEnabled() {
-  return true;
-}
-
 bool IsProjectorAccountSwitchNotificationEnabled() {
   return base::FeatureList::IsEnabled(kProjectorAccountSwitchNotification);
 }
diff --git a/ash/constants/ash_features.h b/ash/constants/ash_features.h
index 3652df2..8bce4cd1 100644
--- a/ash/constants/ash_features.h
+++ b/ash/constants/ash_features.h
@@ -566,6 +566,7 @@
 COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kMultiZoneRgbKeyboard);
 COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kMultilingualTyping);
 COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kNearbyKeepAliveFix);
+COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kNearbyPresence);
 COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kNotifierCollision);
 COMPONENT_EXPORT(ASH_CONSTANTS)
 BASE_DECLARE_FEATURE(kNewLockScreenReauthLayout);
@@ -714,7 +715,6 @@
 BASE_DECLARE_FEATURE(kProjectorTranscriptChapterTitle);
 COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kPromiseIcons);
 COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kPromiseIconsWebApps);
-COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kQsRevamp);
 COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kQuickDim);
 COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kSmartReader);
 COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kQuickAppAccessTestUI);
@@ -1099,6 +1099,7 @@
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsMinimumChromeVersionEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsMultiZoneRgbKeyboardEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsNearbyKeepAliveFixEnabled();
+COMPONENT_EXPORT(ASH_CONSTANTS) bool IsNearbyPresenceEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsNotifierCollisionEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsEducationEnrollmentOobeFlowEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsEnrollmentNudgingForTestingEnabled();
@@ -1191,7 +1192,6 @@
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsProjectorV2Enabled();
 COMPONENT_EXPORT(ASH_CONSTANTS)
 bool IsProjectorTranscriptChapterTitleEnabled();
-COMPONENT_EXPORT(ASH_CONSTANTS) bool IsQsRevampEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsQuickDimEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsPerDeskZOrderEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsPersonalizationJellyEnabled();
diff --git a/ash/display/cursor_window_controller.cc b/ash/display/cursor_window_controller.cc
index 8b73094..5582fac 100644
--- a/ash/display/cursor_window_controller.cc
+++ b/ash/display/cursor_window_controller.cc
@@ -535,13 +535,22 @@
   std::vector<gfx::ImageSkia> images;
   gfx::Point hot_point_in_physical_pixels;
   if (cursor_.type() == ui::mojom::CursorType::kCustom) {
-    const SkBitmap& bitmap = cursor_.custom_bitmap();
+    SkBitmap bitmap = cursor_.custom_bitmap();
+    gfx::Point hotspot = cursor_.custom_hotspot();
     if (bitmap.isNull()) {
       return;
     }
     cursor_scale = cursor_.image_scale_factor();
+
+    // Custom cursor's bitmap is already rotated. Revert the rotation because
+    // software cursor's rotation is handled by viz.
+    const display::Display::Rotation inverted_rotation =
+        static_cast<display::Display::Rotation>(
+            (4 - static_cast<int>(display_.rotation())) % 4);
+    wm::ScaleAndRotateCursorBitmapAndHotpoint(1.0f, inverted_rotation, &bitmap,
+                                              &hotspot);
     images.push_back(gfx::ImageSkia::CreateFromBitmap(bitmap, cursor_scale));
-    hot_point_in_physical_pixels = cursor_.custom_hotspot();
+    hot_point_in_physical_pixels = hotspot;
   } else {
     // Do not use the device scale factor, as the cursor will be scaled
     // by compositor. HW cursor will not be scaled by display zoom, so the
diff --git a/ash/public/cpp/accelerators.cc b/ash/public/cpp/accelerators.cc
index 8795a62..efac4f6 100644
--- a/ash/public/cpp/accelerators.cc
+++ b/ash/public/cpp/accelerators.cc
@@ -191,7 +191,7 @@
      AcceleratorAction::kFocusShelf},
     {true, ui::VKEY_V, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
      AcceleratorAction::kFocusPip},
-    {true, ui::VKEY_HELP, ui::EF_NONE, AcceleratorAction::kShowShortcutViewer},
+    {true, ui::VKEY_HELP, ui::EF_NONE, AcceleratorAction::kOpenGetHelp},
     {true, ui::VKEY_S, ui::EF_CONTROL_DOWN | ui::EF_COMMAND_DOWN,
      AcceleratorAction::kShowShortcutViewer},
     {true, ui::VKEY_F14, ui::EF_NONE, AcceleratorAction::kShowShortcutViewer},
diff --git a/ash/public/cpp/app_list/app_list_config.cc b/ash/public/cpp/app_list/app_list_config.cc
index 030231dfc..15ef99c 100644
--- a/ash/public/cpp/app_list/app_list_config.cc
+++ b/ash/public/cpp/app_list/app_list_config.cc
@@ -161,6 +161,33 @@
   }
 }
 
+int HostBadgeIconDimensionForType(ash::AppListConfigType type) {
+  switch (type) {
+    case ash::AppListConfigType::kRegular:
+      return 26;
+    case ash::AppListConfigType::kDense:
+      return 20;
+  }
+}
+
+int ShortcutIconBorderMarginForType(ash::AppListConfigType type) {
+  switch (type) {
+    case ash::AppListConfigType::kRegular:
+      return 4;
+    case ash::AppListConfigType::kDense:
+      return 3;
+  }
+}
+
+int BadgeIconBorderMarginForType(ash::AppListConfigType type) {
+  switch (type) {
+    case ash::AppListConfigType::kRegular:
+      return 3;
+    case ash::AppListConfigType::kDense:
+      return 2;
+  }
+}
+
 int ItemIconInFolderIconMargin() {
   return 2;
 }
@@ -219,9 +246,11 @@
       item_icon_in_folder_icon_dimension_(
           ItemIconInFolderIconDimensionForType(type)),
       item_icon_in_folder_icon_margin_(ItemIconInFolderIconMargin()),
-      shortcut_host_badge_icon_dimension_(24),
-      shortcut_host_badge_icon_border_dimension_(4),
-      shortcut_background_border_dimension_(6) {}
+      shortcut_host_badge_icon_dimension_(HostBadgeIconDimensionForType(type)),
+      shortcut_host_badge_icon_border_margin_(
+          BadgeIconBorderMarginForType(type)),
+      shortcut_background_border_margin_(
+          ShortcutIconBorderMarginForType(type)) {}
 
 AppListConfig::AppListConfig(const AppListConfig& base_config, float scale_x)
     : type_(base_config.type_),
@@ -258,21 +287,26 @@
           Scale(base_config.item_icon_in_folder_icon_margin_, scale_x)),
       shortcut_host_badge_icon_dimension_(
           Scale(base_config.shortcut_host_badge_icon_dimension_, scale_x)),
-      shortcut_host_badge_icon_border_dimension_(
-          Scale(base_config.shortcut_host_badge_icon_border_dimension_,
-                scale_x)),
-      shortcut_background_border_dimension_(
-          Scale(base_config.shortcut_background_border_dimension_, scale_x)) {}
+      shortcut_host_badge_icon_border_margin_(
+          Scale(base_config.shortcut_host_badge_icon_border_margin_, scale_x)),
+      shortcut_background_border_margin_(
+          Scale(base_config.shortcut_background_border_margin_, scale_x)) {}
 
 AppListConfig::~AppListConfig() = default;
 
 int AppListConfig::GetShortcutHostBadgeIconContainerDimension() const {
   return shortcut_host_badge_icon_dimension_ +
-         shortcut_host_badge_icon_border_dimension_;
+         2 * shortcut_host_badge_icon_border_margin_;
 }
 
 int AppListConfig::GetShortcutBackgroundContainerDimension() const {
-  return grid_icon_dimension_ + shortcut_host_badge_icon_border_dimension_;
+  return grid_icon_dimension_;
+}
+
+gfx::Size AppListConfig::GetShortcutIconSize() const {
+  const int dimension =
+      grid_icon_dimension_ - 2 * shortcut_background_border_margin_;
+  return gfx::Size(dimension, dimension);
 }
 
 }  // namespace ash
diff --git a/ash/public/cpp/app_list/app_list_config.h b/ash/public/cpp/app_list/app_list_config.h
index 7d27bce..e76a0034 100644
--- a/ash/public/cpp/app_list/app_list_config.h
+++ b/ash/public/cpp/app_list/app_list_config.h
@@ -219,14 +219,15 @@
   int shortcut_host_badge_icon_dimension() const {
     return shortcut_host_badge_icon_dimension_;
   }
-  int shortcut_host_badge_icon_border_dimension() const {
-    return shortcut_host_badge_icon_border_dimension_;
+  int shortcut_host_badge_icon_border_margin() const {
+    return shortcut_host_badge_icon_border_margin_;
   }
-  int shortcut_background_border_dimension() const {
-    return shortcut_background_border_dimension_;
+  int shortcut_background_border_margin() const {
+    return shortcut_background_border_margin_;
   }
   int GetShortcutHostBadgeIconContainerDimension() const;
   int GetShortcutBackgroundContainerDimension() const;
+  gfx::Size GetShortcutIconSize() const;
 
   gfx::Size grid_icon_size() const {
     return gfx::Size(grid_icon_dimension_, grid_icon_dimension_);
@@ -318,10 +319,10 @@
   const int shortcut_host_badge_icon_dimension_;
 
   // The dimension of a host badge icon container border of a shortcut.
-  const int shortcut_host_badge_icon_border_dimension_;
+  const int shortcut_host_badge_icon_border_margin_;
 
   // The dimension of a background container border of a shortcut.
-  const int shortcut_background_border_dimension_;
+  const int shortcut_background_border_margin_;
 };
 
 }  // namespace ash
diff --git a/ash/test/ash_test_base.cc b/ash/test/ash_test_base.cc
index f8ae4bfc..531dd22 100644
--- a/ash/test/ash_test_base.cc
+++ b/ash/test/ash_test_base.cc
@@ -248,11 +248,9 @@
   return absl::nullopt;
 }
 
-void AshTestBase::UpdateDisplay(const std::string& display_specs,
-                                bool from_native_platform,
-                                bool generate_new_ids) {
+void AshTestBase::UpdateDisplay(const std::string& display_specs) {
   display::test::DisplayManagerTestApi(Shell::Get()->display_manager())
-      .UpdateDisplay(display_specs, from_native_platform, generate_new_ids);
+      .UpdateDisplay(display_specs);
   ScreenOrientationControllerTestApi(
       Shell::Get()->screen_orientation_controller())
       .UpdateNaturalOrientation();
diff --git a/ash/test/ash_test_base.h b/ash/test/ash_test_base.h
index 530e303..51363d9 100644
--- a/ash/test/ash_test_base.h
+++ b/ash/test/ash_test_base.h
@@ -126,9 +126,7 @@
   // See ash::DisplayManagerTestApi::UpdateDisplay for more details.
   // Note: To properly specify the radii of display's panel upon startup, set it
   // via specifying the command line switch `ash-host-window-bounds`.
-  void UpdateDisplay(const std::string& display_specs,
-                     bool from_native_platform = false,
-                     bool generate_new_ids = false);
+  void UpdateDisplay(const std::string& display_specs);
 
   // Returns a root Window. Usually this is the active root Window, but that
   // method can return NULL sometimes, and in those cases, we fall back on the
diff --git a/ash/webui/common/resources/multidevice_setup/multidevice_setup.html b/ash/webui/common/resources/multidevice_setup/multidevice_setup.html
index e1bc4f5..127adae 100644
--- a/ash/webui/common/resources/multidevice_setup/multidevice_setup.html
+++ b/ash/webui/common/resources/multidevice_setup/multidevice_setup.html
@@ -7,9 +7,9 @@
   }
 
   #container {
-    background-color: var(--cr-card-background-color);
+    background-color: var(--cros-sys-app_base);
     box-sizing: border-box;
-    color: var(--cros-text-color-secondary);
+    color: var(--cros-sys-on_surface_variant);
     display: flex;
     flex-direction: column;
     font-size: 13px;
diff --git a/ash/webui/common/resources/multidevice_setup/multidevice_setup.js b/ash/webui/common/resources/multidevice_setup/multidevice_setup.js
index 3430f8a5..9db931b 100644
--- a/ash/webui/common/resources/multidevice_setup/multidevice_setup.js
+++ b/ash/webui/common/resources/multidevice_setup/multidevice_setup.js
@@ -14,7 +14,6 @@
 import {assert} from '//resources/ash/common/assert.js';
 import {WebUIListenerBehavior} from '//resources/ash/common/web_ui_listener_behavior.js';
 import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {ColorChangeUpdater} from 'chrome://resources/cr_components/color_change_listener/colors_css_updater.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.js';
 import {HostDevice} from 'chrome://resources/mojo/chromeos/ash/services/multidevice_setup/public/mojom/multidevice_setup.mojom-webui.js';
 
@@ -185,18 +184,6 @@
     this.addWebUIListener(
         'multidevice_setup.initializeSetupFlow',
         this.initializeSetupFlow.bind(this));
-
-    if (this.isJellyEnabled) {
-      const link = document.createElement('link');
-      link.rel = 'stylesheet';
-      link.href = 'chrome://theme/colors.css?sets=legacy,sys';
-      document.head.appendChild(link);
-      document.body.classList.add('jelly-enabled');
-      /** @suppress {checkTypes} */
-      (function() {
-        ColorChangeUpdater.forDocument().start();
-      })();
-    }
   },
 
   /** @override */
diff --git a/ash/webui/common/resources/multidevice_setup/multidevice_setup_shared.css b/ash/webui/common/resources/multidevice_setup/multidevice_setup_shared.css
index 5a38bdc..fb1443ed 100644
--- a/ash/webui/common/resources/multidevice_setup/multidevice_setup_shared.css
+++ b/ash/webui/common/resources/multidevice_setup/multidevice_setup_shared.css
@@ -15,6 +15,6 @@
 @import 'ui/webui/resources/cr_elements/chromeos/cros_color_overrides.css';
 
 a {
-  color: var(--cros-link-color);
+  color: var(--cros-sys-primary);
   text-decoration: none;
 }
diff --git a/ash/webui/common/resources/multidevice_setup/password_page.html b/ash/webui/common/resources/multidevice_setup/password_page.html
index a43a9a6a..3ef7e55 100644
--- a/ash/webui/common/resources/multidevice_setup/password_page.html
+++ b/ash/webui/common/resources/multidevice_setup/password_page.html
@@ -1,7 +1,7 @@
 <style include="multidevice-setup-shared">
   #user-info-container  {
     align-items: center;
-    color: var(--cros-text-color-secondary);
+    color: var(--cros-sys-on_surface_variant);
     display: flex;
     padding-top: 32px;
   }
diff --git a/ash/webui/common/resources/multidevice_setup/start_setup_page.html b/ash/webui/common/resources/multidevice_setup/start_setup_page.html
index 0fc4421..e83008b 100644
--- a/ash/webui/common/resources/multidevice_setup/start_setup_page.html
+++ b/ash/webui/common/resources/multidevice_setup/start_setup_page.html
@@ -4,11 +4,11 @@
   }
 
   #singleDeviceName {
-    color: var(--cros-text-color-primary);
+    color: var(--cros-sys-on_surface);
   }
 
   .offline-device-name {
-    color: var(--cros-text-color-secondary);
+    color: var(--cros-sys-on_surface_variant);
   }
 
   :host-context(body.jelly-enabled) #singleDeviceName,
@@ -66,7 +66,7 @@
   }
 
   #feature-details-container {
-    color: var(--cros-text-color-primary);
+    color: var(--cros-sys-on_surface);
     padding-top: 40px;
   }
 
@@ -80,7 +80,7 @@
   }
 
   .feature-detail iron-icon {
-    --iron-icon-fill-color: var(--cros-icon-color-prominent);
+    --iron-icon-fill-color: var(--cros-sys-primary);
     --iron-icon-height: 20px;
     --iron-icon-width: 20px;
     min-width: 20px;
diff --git a/ash/webui/common/resources/multidevice_setup/ui_page.html b/ash/webui/common/resources/multidevice_setup/ui_page.html
index b4f5883..646fc2c 100644
--- a/ash/webui/common/resources/multidevice_setup/ui_page.html
+++ b/ash/webui/common/resources/multidevice_setup/ui_page.html
@@ -38,7 +38,7 @@
   }
 
   h1 {
-    color: var(--cros-text-color-primary);
+    color: var(--cros-sys-on_surface);
     font-size: 28px;
     font-weight: normal;
     line-height: 28px;
@@ -57,7 +57,7 @@
   }
 
   #message-container {
-    color: var(--cros-text-color-secondary);
+    color: var(--cros-sys-on_surface_variant);
     line-height: 18px;
     min-height: 32px;
     overflow-wrap: break-word;
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 616c89e..79cc123 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
@@ -24,7 +24,7 @@
 // The total number of Ash accelerators.
 constexpr int kAshAcceleratorsTotalNum = 149;
 // The hash of Ash accelerators.
-constexpr char kAshAcceleratorsHash[] = "582afb07f8971056401cf30f377f3a95";
+constexpr char kAshAcceleratorsHash[] = "f473ee697346ca5622c887d3155daded";
 
 std::string ToActionName(ash::AcceleratorAction action) {
   return base::StrCat(
diff --git a/base/BUILD.gn b/base/BUILD.gn
index cd1441d..66fdaa456 100644
--- a/base/BUILD.gn
+++ b/base/BUILD.gn
@@ -4452,6 +4452,7 @@
       "android/java/src/org/chromium/base/supplier/OneshotSupplier.java",
       "android/java/src/org/chromium/base/supplier/OneshotSupplierImpl.java",
       "android/java/src/org/chromium/base/supplier/Supplier.java",
+      "android/java/src/org/chromium/base/supplier/SupplierUtils.java",
       "android/java/src/org/chromium/base/supplier/SyncOneshotSupplier.java",
       "android/java/src/org/chromium/base/supplier/SyncOneshotSupplierImpl.java",
       "android/java/src/org/chromium/base/supplier/TransitiveObservableSupplier.java",
@@ -4815,6 +4816,7 @@
       "android/junit/src/org/chromium/base/supplier/ObservableSupplierImplTest.java",
       "android/junit/src/org/chromium/base/supplier/OneShotCallbackTest.java",
       "android/junit/src/org/chromium/base/supplier/OneshotSupplierImplTest.java",
+      "android/junit/src/org/chromium/base/supplier/SupplierUtilsTest.java",
       "android/junit/src/org/chromium/base/supplier/SyncOneshotSupplierImplTest.java",
       "android/junit/src/org/chromium/base/supplier/TransitiveObservableSupplierTest.java",
       "android/junit/src/org/chromium/base/supplier/UnownedUserDataSupplierTest.java",
diff --git a/base/android/field_trial_list.cc b/base/android/field_trial_list.cc
index 8156b7dd..5f29475 100644
--- a/base/android/field_trial_list.cc
+++ b/base/android/field_trial_list.cc
@@ -29,9 +29,9 @@
   TrialLogger(const TrialLogger&) = delete;
   TrialLogger& operator=(const TrialLogger&) = delete;
 
-  void OnFieldTrialGroupFinalized(const base::FieldTrial& trial,
+  void OnFieldTrialGroupFinalized(const std::string& trial_name,
                                   const std::string& group_name) override {
-    Log(trial.trial_name(), group_name);
+    Log(trial_name, group_name);
   }
 
   static void Log(const std::string& trial_name,
diff --git a/base/android/java/src/org/chromium/base/ThreadUtils.java b/base/android/java/src/org/chromium/base/ThreadUtils.java
index 78a8662..d90a4af9 100644
--- a/base/android/java/src/org/chromium/base/ThreadUtils.java
+++ b/base/android/java/src/org/chromium/base/ThreadUtils.java
@@ -47,20 +47,6 @@
      * }
      * }
      * </pre>
-     *
-     * Another way to use this class is to also use the baked in support for destruction:
-     * <pre>
-     * {@code
-     * class Foo {
-     *     // Valid thread is set during construction here.
-     *     private final ThreadChecker mThreadChecker = new ThreadChecker();
-     *
-     *     public void doFoo() {
-     *         mThreadChecker.assertOnValidThreadAndState();
-     *     }
-     * }
-     * }
-     * </pre>
      */
     public static class ThreadChecker {
         private final long mThreadId = Process.myTid();
diff --git a/base/android/java/src/org/chromium/base/supplier/SupplierUtils.java b/base/android/java/src/org/chromium/base/supplier/SupplierUtils.java
new file mode 100644
index 0000000..b4fe503
--- /dev/null
+++ b/base/android/java/src/org/chromium/base/supplier/SupplierUtils.java
@@ -0,0 +1,82 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base.supplier;
+
+import androidx.annotation.NonNull;
+
+import org.chromium.base.Callback;
+import org.chromium.base.ThreadUtils;
+
+/** Utilities for interactions with Suppliers. */
+public class SupplierUtils {
+    private SupplierUtils() {}
+
+    private static class Barrier {
+        private final ThreadUtils.ThreadChecker mThreadChecker = new ThreadUtils.ThreadChecker();
+        private int mWaitingCount;
+        private Runnable mCallback;
+
+        void waitForAll(Runnable callback, Supplier... suppliers) {
+            mThreadChecker.assertOnValidThread();
+            assert mCallback == null;
+            mCallback = callback;
+            int waitingSupplierCount = 0;
+            Callback<?> supplierCallback = (unused) -> onSupplierAvailable();
+            for (Supplier<?> supplier : suppliers) {
+                if (supplier.hasValue()) continue;
+
+                waitingSupplierCount++;
+                if (supplier instanceof ObservableSupplier) {
+                    ObservableSupplier<?> observableSupplier = ((ObservableSupplier) supplier);
+                    new OneShotCallback(observableSupplier, supplierCallback);
+                } else if (supplier instanceof OneshotSupplier) {
+                    ((OneshotSupplier) supplier).onAvailable(supplierCallback);
+                } else if (supplier instanceof SyncOneshotSupplier) {
+                    ((SyncOneshotSupplier) supplier).onAvailable(supplierCallback);
+                } else {
+                    assert false
+                            : "Unexpected Supplier type that does not already have a value: "
+                                    + supplier;
+                }
+            }
+            mWaitingCount = waitingSupplierCount;
+            notifyCallbackIfAppropriate();
+        }
+
+        private void onSupplierAvailable() {
+            mThreadChecker.assertOnValidThread();
+            mWaitingCount--;
+            assert mWaitingCount >= 0;
+            notifyCallbackIfAppropriate();
+        }
+
+        private void notifyCallbackIfAppropriate() {
+            if (mWaitingCount != 0) return;
+            if (mCallback == null) return;
+            mCallback.run();
+            mCallback = null;
+        }
+    }
+
+    /**
+     * Waits for all suppliers to have assigned values, and when that happens, notifies the
+     * specified callback.
+     *
+     * <p>If all suppliers already have values, then the callback will be notified synchronously.
+     *
+     * <p>To prevent leaking objects, it is recommended to use {@link
+     * org.chromium.base.CallbackController} for the {@link Runnable} callback.
+     *
+     * <p>Not thread safe. All passed in suppliers must be notified on the same thread this method
+     * is called.
+     *
+     * @param callback The callback to be notified when all suppliers have values set.
+     * @param suppliers The list of suppliers to check for values.
+     */
+    public static void waitForAll(@NonNull Runnable callback, Supplier... suppliers) {
+        assert callback != null;
+        new Barrier().waitForAll(callback, suppliers);
+    }
+}
diff --git a/base/android/junit/src/org/chromium/base/supplier/SupplierUtilsTest.java b/base/android/junit/src/org/chromium/base/supplier/SupplierUtilsTest.java
new file mode 100644
index 0000000..a4bb71b5
--- /dev/null
+++ b/base/android/junit/src/org/chromium/base/supplier/SupplierUtilsTest.java
@@ -0,0 +1,135 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base.supplier;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.shadows.ShadowLooper;
+
+import org.chromium.base.test.BaseRobolectricTestRunner;
+import org.chromium.base.test.util.CallbackHelper;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.TimeoutException;
+
+/** Unit tests for {@link SupplierUtils}. */
+@RunWith(BaseRobolectricTestRunner.class)
+public class SupplierUtilsTest {
+
+    @Test
+    public void testWaitForAll_NoSuppliers() throws TimeoutException {
+        CallbackHelper callbackHelper = new CallbackHelper();
+        SupplierUtils.waitForAll(callbackHelper::notifyCalled);
+        callbackHelper.waitForFirst();
+    }
+
+    @Test
+    public void testWaitForAll_AllSuppliersAlreadyHaveValues() throws TimeoutException {
+        Supplier<Integer> baseSupplier = () -> 4;
+        OneshotSupplierImpl<String> oneshotSupplier = new OneshotSupplierImpl<>();
+        oneshotSupplier.set("foo");
+        ObservableSupplierImpl<Object> observableSupplier = new ObservableSupplierImpl<>();
+        observableSupplier.set(new Object());
+        SyncOneshotSupplierImpl<List<?>> syncOneshotSupplier = new SyncOneshotSupplierImpl<>();
+        syncOneshotSupplier.set(new ArrayList<>());
+
+        CallbackHelper callbackHelper = new CallbackHelper();
+        SupplierUtils.waitForAll(
+                callbackHelper::notifyCalled,
+                baseSupplier,
+                oneshotSupplier,
+                observableSupplier,
+                syncOneshotSupplier);
+        callbackHelper.waitForFirst();
+    }
+
+    @Test
+    public void testWaitForAll_SomeSuppliersAlreadyHaveValues() throws TimeoutException {
+        Supplier<Integer> baseSupplier = () -> 4;
+        OneshotSupplierImpl<String> oneshotSupplier = new OneshotSupplierImpl<>();
+
+        ObservableSupplierImpl<Object> observableSupplier = new ObservableSupplierImpl<>();
+        observableSupplier.set(new Object());
+
+        SyncOneshotSupplierImpl<List<?>> syncOneshotSupplier = new SyncOneshotSupplierImpl<>();
+
+        CallbackHelper callbackHelper = new CallbackHelper();
+        SupplierUtils.waitForAll(
+                callbackHelper::notifyCalled,
+                baseSupplier,
+                oneshotSupplier,
+                observableSupplier,
+                syncOneshotSupplier);
+
+        Assert.assertEquals(0, callbackHelper.getCallCount());
+        oneshotSupplier.set("foo");
+        Assert.assertEquals(0, callbackHelper.getCallCount());
+        syncOneshotSupplier.set(new ArrayList<>());
+        ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
+        callbackHelper.waitForFirst();
+    }
+
+    @Test
+    public void testWaitForAll_NoSuppliersAlreadyHaveValues() throws TimeoutException {
+        OneshotSupplierImpl<String> oneshotSupplier = new OneshotSupplierImpl<>();
+        ObservableSupplierImpl<Object> observableSupplier = new ObservableSupplierImpl<>();
+        SyncOneshotSupplierImpl<List<?>> syncOneshotSupplier = new SyncOneshotSupplierImpl<>();
+
+        CallbackHelper callbackHelper = new CallbackHelper();
+        SupplierUtils.waitForAll(
+                callbackHelper::notifyCalled,
+                oneshotSupplier,
+                observableSupplier,
+                syncOneshotSupplier);
+
+        Assert.assertEquals(0, callbackHelper.getCallCount());
+        observableSupplier.set(new Object());
+        Assert.assertEquals(0, callbackHelper.getCallCount());
+        oneshotSupplier.set("foo");
+        Assert.assertEquals(0, callbackHelper.getCallCount());
+        syncOneshotSupplier.set(new ArrayList<>());
+        ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
+        callbackHelper.waitForFirst();
+    }
+
+    @Test
+    public void testWaitForAll_WaitForOneshotSupplier() throws TimeoutException {
+        OneshotSupplierImpl<Object> supplier = new OneshotSupplierImpl<>();
+
+        CallbackHelper callbackHelper = new CallbackHelper();
+        SupplierUtils.waitForAll(callbackHelper::notifyCalled, supplier);
+
+        Assert.assertEquals(0, callbackHelper.getCallCount());
+        supplier.set(new Object());
+        ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
+        callbackHelper.waitForFirst();
+    }
+
+    @Test
+    public void testWaitForAll_WaitForObservableSupplier() throws TimeoutException {
+        ObservableSupplierImpl<Object> supplier = new ObservableSupplierImpl<>();
+
+        CallbackHelper callbackHelper = new CallbackHelper();
+        SupplierUtils.waitForAll(callbackHelper::notifyCalled, supplier);
+
+        Assert.assertEquals(0, callbackHelper.getCallCount());
+        supplier.set(new Object());
+        callbackHelper.waitForFirst();
+    }
+
+    @Test
+    public void testWaitForAll_WaitForSyncOneshotSupplier() throws TimeoutException {
+        SyncOneshotSupplierImpl<Object> supplier = new SyncOneshotSupplierImpl<>();
+
+        CallbackHelper callbackHelper = new CallbackHelper();
+        SupplierUtils.waitForAll(callbackHelper::notifyCalled, supplier);
+
+        Assert.assertEquals(0, callbackHelper.getCallCount());
+        supplier.set(new Object());
+        callbackHelper.waitForFirst();
+    }
+}
diff --git a/base/i18n/streaming_utf8_validator.cc b/base/i18n/streaming_utf8_validator.cc
index 4c8189c..2f4ff73 100644
--- a/base/i18n/streaming_utf8_validator.cc
+++ b/base/i18n/streaming_utf8_validator.cc
@@ -21,20 +21,20 @@
 
 }  // namespace
 
-StreamingUtf8Validator::State StreamingUtf8Validator::AddBytes(const char* data,
-                                                               size_t size) {
+StreamingUtf8Validator::State StreamingUtf8Validator::AddBytes(
+    base::span<const uint8_t> data) {
   // Copy |state_| into a local variable so that the compiler doesn't have to be
   // careful of aliasing.
   uint8_t state = state_;
-  for (const char* p = data; p != data + size; ++p) {
-    if ((*p & 0x80) == 0) {
+  for (const uint8_t ch : data) {
+    if ((ch & 0x80) == 0) {
       if (state == 0)
         continue;
       state = internal::I18N_UTF8_VALIDATOR_INVALID_INDEX;
       break;
     }
     const uint8_t shift_amount = StateTableLookup(state);
-    const uint8_t shifted_char = (*p & 0x7F) >> shift_amount;
+    const uint8_t shifted_char = (ch & 0x7F) >> shift_amount;
     state = StateTableLookup(state + shifted_char + 1);
     // State may be INVALID here, but this code is optimised for the case of
     // valid UTF-8 and it is more efficient (by about 2%) to not attempt an
@@ -52,7 +52,7 @@
 }
 
 bool StreamingUtf8Validator::Validate(const std::string& string) {
-  return StreamingUtf8Validator().AddBytes(string.data(), string.size()) ==
+  return StreamingUtf8Validator().AddBytes(base::as_byte_span(string)) ==
          VALID_ENDPOINT;
 }
 
diff --git a/base/i18n/streaming_utf8_validator.h b/base/i18n/streaming_utf8_validator.h
index 53d7c65b..9c392221 100644
--- a/base/i18n/streaming_utf8_validator.h
+++ b/base/i18n/streaming_utf8_validator.h
@@ -16,6 +16,7 @@
 
 #include <string>
 
+#include "base/containers/span.h"
 #include "base/i18n/base_i18n_export.h"
 
 namespace base {
@@ -41,12 +42,12 @@
 
   // Trivial destructor intentionally omitted.
 
-  // Validate |size| bytes starting at |data|. If the concatenation of all calls
+  // Validate bytes described by |data|. If the concatenation of all calls
   // to AddBytes() since this object was constructed or reset is a valid UTF-8
   // string, returns VALID_ENDPOINT. If it could be the prefix of a valid UTF-8
   // string, returns VALID_MIDPOINT. If an invalid byte or UTF-8 sequence was
   // present, returns INVALID.
-  State AddBytes(const char* data, size_t size);
+  State AddBytes(base::span<const uint8_t> data);
 
   // Return the object to a freshly-constructed state so that it can be re-used.
   void Reset();
diff --git a/base/i18n/streaming_utf8_validator_unittest.cc b/base/i18n/streaming_utf8_validator_unittest.cc
index 765edbb..80b356eb 100644
--- a/base/i18n/streaming_utf8_validator_unittest.cc
+++ b/base/i18n/streaming_utf8_validator_unittest.cc
@@ -39,14 +39,12 @@
 
 class StreamingUtf8ValidatorThoroughTest : public ::testing::Test {
  protected:
-  StreamingUtf8ValidatorThoroughTest()
-      : tasks_dispatched_(0), tasks_finished_(0) {}
+  StreamingUtf8ValidatorThoroughTest() = default;
 
   // This uses the same logic as base::IsStringUTF8 except it considers
   // non-characters valid (and doesn't require a string as input).
-  static bool IsStringUtf8(const char* src, int32_t src_len) {
+  static bool IsStringUtf8(const uint8_t* src, int32_t src_len) {
     int32_t char_index = 0;
-
     while (char_index < src_len) {
       base_icu::UChar32 code_point;
       U8_NEXT(src, char_index, src_len, code_point);
@@ -60,17 +58,15 @@
   // verifies that IsStringUtf8 and StreamingUtf8Validator agree on
   // whether it is valid UTF-8 or not.
   void TestNumber(uint32_t n) const {
-    char test[sizeof n];
+    uint8_t test[sizeof n];
     memcpy(test, &n, sizeof n);
     StreamingUtf8Validator validator;
     EXPECT_EQ(IsStringUtf8(test, sizeof n),
-              validator.AddBytes(test, sizeof n) == VALID_ENDPOINT)
+              validator.AddBytes(test) == VALID_ENDPOINT)
         << "Difference of opinion for \""
-        << base::StringPrintf("\\x%02X\\x%02X\\x%02X\\x%02X",
-                              test[0] & 0xFF,
-                              test[1] & 0xFF,
-                              test[2] & 0xFF,
-                              test[3] & 0xFF) << "\"";
+        << base::StringPrintf("\\x%02X\\x%02X\\x%02X\\x%02X", test[0], test[1],
+                              test[2], test[3])
+        << "\"";
   }
 
  public:
@@ -90,8 +86,8 @@
 
  protected:
   base::Lock lock_;
-  int tasks_dispatched_;
-  int tasks_finished_;
+  int tasks_dispatched_ = 0;
+  int tasks_finished_ = 0;
 };
 
 // Enable locally to verify that this class accepts exactly the same set of
@@ -220,8 +216,7 @@
     for (Iterator it = begin; it != end; ++it) {
       StreamingUtf8Validator validator;
       base::StringPiece sequence = *it;
-      EXPECT_EQ(expected,
-                validator.AddBytes(sequence.data(), sequence.size()))
+      EXPECT_EQ(expected, validator.AddBytes(base::as_byte_span(sequence)))
           << "Failed for \"" << sequence << "\"";
     }
   }
@@ -236,7 +231,7 @@
       base::StringPiece sequence = *it;
       StreamingUtf8Validator::State state = VALID_ENDPOINT;
       for (const auto& cit : sequence) {
-        state = validator.AddBytes(&cit, 1);
+        state = validator.AddBytes(base::as_bytes(base::make_span(&cit, 1u)));
       }
       EXPECT_EQ(expected, state) << "Failed for \"" << sequence << "\"";
     }
@@ -260,8 +255,8 @@
       base::StringPiece c1 = *it1;
       for (Iterator2 it2 = begin2; it2 != end2; ++it2) {
         base::StringPiece c2 = *it2;
-        validator.AddBytes(c1.data(), c1.size());
-        EXPECT_EQ(expected, validator.AddBytes(c2.data(), c2.size()))
+        validator.AddBytes(base::as_byte_span(c1));
+        EXPECT_EQ(expected, validator.AddBytes(base::as_byte_span(c2)))
             << "Failed for \"" << c1 << c2 << "\"";
         validator.Reset();
       }
@@ -270,8 +265,7 @@
 };
 
 TEST(StreamingUtf8ValidatorTest, NothingIsValid) {
-  static const char kNothing[] = "";
-  EXPECT_EQ(VALID_ENDPOINT, StreamingUtf8Validator().AddBytes(kNothing, 0));
+  EXPECT_EQ(VALID_ENDPOINT, StreamingUtf8Validator().AddBytes({}));
 }
 
 // Because the members of the |valid| array need to be non-zero length
@@ -280,24 +274,28 @@
 // test.
 TEST(StreamingUtf8ValidatorTest, NulIsValid) {
   static const char kNul[] = "\x00";
-  EXPECT_EQ(VALID_ENDPOINT, StreamingUtf8Validator().AddBytes(kNul, 1));
+  EXPECT_EQ(VALID_ENDPOINT, StreamingUtf8Validator().AddBytes(
+                                base::as_bytes(base::make_span(kNul, 1u))));
 }
 
 // Just a basic sanity test before we start getting fancy.
 TEST(StreamingUtf8ValidatorTest, HelloWorld) {
   static const char kHelloWorld[] = "Hello, World!";
-  EXPECT_EQ(
-      VALID_ENDPOINT,
-      StreamingUtf8Validator().AddBytes(kHelloWorld, strlen(kHelloWorld)));
+  EXPECT_EQ(VALID_ENDPOINT,
+            StreamingUtf8Validator().AddBytes(base::as_bytes(
+                base::make_span(kHelloWorld, strlen(kHelloWorld)))));
 }
 
 // Check that the Reset() method works.
 TEST(StreamingUtf8ValidatorTest, ResetWorks) {
   StreamingUtf8Validator validator;
-  EXPECT_EQ(INVALID, validator.AddBytes("\xC0", 1));
-  EXPECT_EQ(INVALID, validator.AddBytes("a", 1));
+  EXPECT_EQ(INVALID,
+            validator.AddBytes(base::as_bytes(base::make_span("\xC0", 1u))));
+  EXPECT_EQ(INVALID,
+            validator.AddBytes(base::as_bytes(base::make_span("a", 1u))));
   validator.Reset();
-  EXPECT_EQ(VALID_ENDPOINT, validator.AddBytes("a", 1));
+  EXPECT_EQ(VALID_ENDPOINT,
+            validator.AddBytes(base::as_bytes(base::make_span("a", 1u))));
 }
 
 TEST_F(StreamingUtf8ValidatorSingleSequenceTest, Valid) {
diff --git a/base/metrics/field_trial.cc b/base/metrics/field_trial.cc
index 71e82c22..c38e1d9b 100644
--- a/base/metrics/field_trial.cc
+++ b/base/metrics/field_trial.cc
@@ -5,7 +5,6 @@
 #include "base/metrics/field_trial.h"
 
 #include <algorithm>
-#include <string_view>
 #include <utility>
 
 #include "base/auto_reset.h"
@@ -22,7 +21,6 @@
 #include "base/process/process_handle.h"
 #include "base/process/process_info.h"
 #include "base/rand_util.h"
-#include "base/strings/strcat.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_piece.h"
 #include "base/strings/string_split.h"
@@ -97,13 +95,11 @@
 
 // Writes out the field trial's contents (via trial_state) to the pickle. The
 // format of the pickle looks like:
-// TrialName, GroupName, is_overridden, ParamKey1, ParamValue1, ParamKey2,
-// ParamValue2, ... If there are no parameters, then it just ends at
-// is_overridden.
+// TrialName, GroupName, ParamKey1, ParamValue1, ParamKey2, ParamValue2, ...
+// If there are no parameters, then it just ends at GroupName.
 void PickleFieldTrial(const FieldTrial::PickleState& trial_state,
                       Pickle* pickle) {
   WriteStringPair(pickle, *trial_state.trial_name, *trial_state.group_name);
-  pickle->WriteBool(trial_state.is_overridden);
 
   // Get field trial params.
   std::map<std::string, std::string> params;
@@ -134,6 +130,45 @@
   return std::min(result, divisor - 1);
 }
 
+// Parses the --force-fieldtrials string |trials_string| into |entries|.
+// Returns true if the string was parsed correctly. On failure, the |entries|
+// array may end up being partially filled.
+bool ParseFieldTrialsString(const std::string& trials_string,
+                            std::vector<FieldTrial::State>* entries) {
+  const StringPiece trials_string_piece(trials_string);
+
+  size_t next_item = 0;
+  while (next_item < trials_string.length()) {
+    size_t name_end = trials_string.find(kPersistentStringSeparator, next_item);
+    if (name_end == trials_string.npos || next_item == name_end)
+      return false;
+    size_t group_name_end =
+        trials_string.find(kPersistentStringSeparator, name_end + 1);
+    if (name_end + 1 == group_name_end)
+      return false;
+    if (group_name_end == trials_string.npos)
+      group_name_end = trials_string.length();
+
+    FieldTrial::State entry;
+    // Verify if the trial should be activated or not.
+    if (trials_string[next_item] == kActivationMarker) {
+      // Name cannot be only the indicator.
+      if (name_end - next_item == 1)
+        return false;
+      next_item++;
+      entry.activated = true;
+    }
+    entry.trial_name =
+        trials_string_piece.substr(next_item, name_end - next_item);
+    entry.group_name =
+        trials_string_piece.substr(name_end + 1, group_name_end - name_end - 1);
+    next_item = group_name_end + 1;
+
+    entries->push_back(std::move(entry));
+  }
+  return true;
+}
+
 void OnOutOfMemory(size_t size) {
   TerminateBecauseOutOfMemory(size);
 }
@@ -159,28 +194,6 @@
 }
 #endif  // BUILDFLAG(USE_BLINK)
 
-void AppendFieldTrialGroupToString(bool activated,
-                                   std::string_view trial_name,
-                                   std::string_view group_name,
-                                   std::string& field_trials_string) {
-  DCHECK_EQ(std::string::npos, trial_name.find(kPersistentStringSeparator))
-      << " in name " << trial_name;
-  DCHECK_EQ(std::string::npos, group_name.find(kPersistentStringSeparator))
-      << " in name " << group_name;
-
-  if (!field_trials_string.empty()) {
-    // Add a '/' in-between field trial groups.
-    field_trials_string.push_back(kPersistentStringSeparator);
-  }
-  if (activated) {
-    field_trials_string.push_back(kActivationMarker);
-  }
-
-  base::StrAppend(&field_trials_string,
-                  {trial_name, std::string_view(&kPersistentStringSeparator, 1),
-                   group_name});
-}
-
 }  // namespace
 
 // statics
@@ -211,22 +224,20 @@
 
 FieldTrial::PickleState::~PickleState() = default;
 
-bool FieldTrial::FieldTrialEntry::GetState(StringPiece& trial_name,
-                                           StringPiece& group_name,
-                                           bool& overridden) const {
+bool FieldTrial::FieldTrialEntry::GetTrialAndGroupName(
+    StringPiece* trial_name,
+    StringPiece* group_name) const {
   PickleIterator iter = GetPickleIterator();
-  return ReadHeader(iter, trial_name, group_name, overridden);
+  return ReadStringPair(&iter, trial_name, group_name);
 }
 
 bool FieldTrial::FieldTrialEntry::GetParams(
     std::map<std::string, std::string>* params) const {
   PickleIterator iter = GetPickleIterator();
-  StringPiece tmp_string;
-  bool tmp_bool;
-  // Skip reading trial and group name, and overridden bit.
-  if (!ReadHeader(iter, tmp_string, tmp_string, tmp_bool)) {
+  StringPiece tmp;
+  // Skip reading trial and group name.
+  if (!ReadStringPair(&iter, &tmp, &tmp))
     return false;
-  }
 
   while (true) {
     StringPiece key;
@@ -245,14 +256,6 @@
   return PickleIterator(pickle);
 }
 
-bool FieldTrial::FieldTrialEntry::ReadHeader(PickleIterator& iter,
-                                             StringPiece& trial_name,
-                                             StringPiece& group_name,
-                                             bool& overridden) const {
-  return ReadStringPair(&iter, &trial_name, &group_name) &&
-         iter.ReadBool(&overridden);
-}
-
 bool FieldTrial::FieldTrialEntry::ReadStringPair(
     PickleIterator* iter,
     StringPiece* trial_name,
@@ -330,10 +333,6 @@
   forced_ = true;
 }
 
-bool FieldTrial::IsOverridden() const {
-  return is_overridden_;
-}
-
 // static
 void FieldTrial::EnableBenchmarking() {
   // We don't need to see field trials created via CreateFieldTrial() for
@@ -350,77 +349,14 @@
     StringPiece default_group_name,
     double entropy_value) {
   return new FieldTrial(trial_name, total_probability, default_group_name,
-                        entropy_value, /*is_low_anonymity=*/false,
-                        /*is_overridden=*/false);
-}
-
-// static
-bool FieldTrial::ParseFieldTrialsString(const base::StringPiece trials_string,
-                                        std::vector<State>& entries) {
-  const StringPiece trials_string_piece(trials_string);
-
-  size_t next_item = 0;
-  while (next_item < trials_string.length()) {
-    // Parse one entry. Entries have the format
-    // TrialName1/GroupName1/TrialName2/GroupName2. Each loop parses one trial
-    // and group name.
-
-    // Find the first delimiter starting at next_item, or quit.
-    size_t trial_name_end =
-        trials_string.find(kPersistentStringSeparator, next_item);
-    if (trial_name_end == trials_string.npos || next_item == trial_name_end) {
-      return false;
-    }
-    // Find the second delimiter, or end of string.
-    size_t group_name_end =
-        trials_string.find(kPersistentStringSeparator, trial_name_end + 1);
-    if (group_name_end == trials_string.npos) {
-      group_name_end = trials_string.length();
-    }
-    // Group names should not be empty, so quit if it is.
-    if (trial_name_end + 1 == group_name_end) {
-      return false;
-    }
-
-    FieldTrial::State entry;
-    // Verify if the trial should be activated or not.
-    if (trials_string[next_item] == kActivationMarker) {
-      // Name cannot be only the indicator.
-      if (trial_name_end - next_item == 1) {
-        return false;
-      }
-      next_item++;
-      entry.activated = true;
-    }
-    entry.trial_name =
-        trials_string_piece.substr(next_item, trial_name_end - next_item);
-    entry.group_name = trials_string_piece.substr(
-        trial_name_end + 1, group_name_end - trial_name_end - 1);
-    // The next item starts after the delimiter, if it exists.
-    next_item = group_name_end + 1;
-
-    entries.push_back(std::move(entry));
-  }
-  return true;
-}
-
-// static
-std::string FieldTrial::BuildFieldTrialStateString(
-    const std::vector<State>& states) {
-  std::string result;
-  for (const State& state : states) {
-    AppendFieldTrialGroupToString(state.activated, state.trial_name,
-                                  state.group_name, result);
-  }
-  return result;
+                        entropy_value, /*is_low_anonymity=*/false);
 }
 
 FieldTrial::FieldTrial(StringPiece trial_name,
                        const Probability total_probability,
                        StringPiece default_group_name,
                        double entropy_value,
-                       bool is_low_anonymity,
-                       bool is_overridden)
+                       bool is_low_anonymity)
     : trial_name_(trial_name),
       divisor_(total_probability),
       default_group_name_(default_group_name),
@@ -429,7 +365,6 @@
       next_group_number_(kDefaultGroupNumber + 1),
       group_(kNotFinalized),
       forced_(false),
-      is_overridden_(is_overridden),
       group_reported_(false),
       trial_registered_(false),
       ref_(FieldTrialList::FieldTrialAllocator::kReferenceNull),
@@ -473,7 +408,6 @@
   DCHECK_NE(group_, kNotFinalized);
   active_group->trial_name = trial_name_;
   active_group->group_name = group_name_;
-  active_group->is_overridden = is_overridden_;
   return true;
 }
 
@@ -482,7 +416,6 @@
   field_trial_state->trial_name = &trial_name_;
   field_trial_state->group_name = &group_name_;
   field_trial_state->activated = group_reported_;
-  field_trial_state->is_overridden = is_overridden_;
 }
 
 //------------------------------------------------------------------------------
@@ -519,8 +452,7 @@
     StringPiece default_group_name,
     const FieldTrial::EntropyProvider& entropy_provider,
     uint32_t randomization_seed,
-    bool is_low_anonymity,
-    bool is_overridden) {
+    bool is_low_anonymity) {
   // Check if the field trial has already been created in some other way.
   FieldTrial* existing_trial = Find(trial_name);
   if (existing_trial) {
@@ -533,7 +465,7 @@
 
   FieldTrial* field_trial =
       new FieldTrial(trial_name, total_probability, default_group_name,
-                     entropy_value, is_low_anonymity, is_overridden);
+                     entropy_value, is_low_anonymity);
   FieldTrialList::Register(field_trial, /*is_randomized_trial=*/true);
   return field_trial;
 }
@@ -599,8 +531,16 @@
   for (const auto& registered : global_->registered_) {
     FieldTrial::PickleState trial;
     registered.second->GetStateWhileLocked(&trial);
-    AppendFieldTrialGroupToString(trial.activated, *trial.trial_name,
-                                  *trial.group_name, *output);
+    DCHECK_EQ(std::string::npos,
+              trial.trial_name->find(kPersistentStringSeparator));
+    DCHECK_EQ(std::string::npos,
+              trial.group_name->find(kPersistentStringSeparator));
+    if (trial.activated)
+      output->append(1, kActivationMarker);
+    output->append(*trial.trial_name);
+    output->append(1, kPersistentStringSeparator);
+    output->append(*trial.group_name);
+    output->append(1, kPersistentStringSeparator);
   }
 }
 
@@ -632,9 +572,8 @@
         std::string param_str;
         for (const auto& param : params) {
           // Add separator from previous param information if it exists.
-          if (!param_str.empty()) {
+          if (!param_str.empty())
             param_str.append(1, kPersistentStringSeparator);
-          }
           param_str.append(encode_data_func(param.first));
           param_str.append(1, kPersistentStringSeparator);
           param_str.append(encode_data_func(param.second));
@@ -673,10 +612,9 @@
          nullptr) {
     StringPiece trial_name;
     StringPiece group_name;
-    bool is_overridden;
     if (subtle::NoBarrier_Load(&entry->activated) &&
-        entry->GetState(trial_name, group_name, is_overridden)) {
-      result.emplace(trial_name);
+        entry->GetTrialAndGroupName(&trial_name, &group_name)) {
+      result.insert(std::string(trial_name));
     }
   }
   return result;
@@ -689,9 +627,8 @@
     return true;
 
   std::vector<FieldTrial::State> entries;
-  if (!FieldTrial::ParseFieldTrialsString(trials_string, entries)) {
+  if (!ParseFieldTrialsString(trials_string, &entries))
     return false;
-  }
 
   return CreateTrialsFromFieldTrialStatesInternal(entries);
 }
@@ -795,8 +732,7 @@
 // static
 FieldTrial* FieldTrialList::CreateFieldTrial(StringPiece name,
                                              StringPiece group_name,
-                                             bool is_low_anonymity,
-                                             bool is_overridden) {
+                                             bool is_low_anonymity) {
   DCHECK(global_);
   DCHECK_GE(name.size(), 0u);
   DCHECK_GE(group_name.size(), 0u);
@@ -812,8 +748,8 @@
     return field_trial;
   }
   const int kTotalProbability = 100;
-  field_trial = new FieldTrial(name, kTotalProbability, group_name, 0,
-                               is_low_anonymity, is_overridden);
+  field_trial =
+      new FieldTrial(name, kTotalProbability, group_name, 0, is_low_anonymity);
   // The group choice will be finalized in this method. So
   // |is_randomized_trial| should be false.
   FieldTrialList::Register(field_trial, /*is_randomized_trial=*/false);
@@ -862,13 +798,13 @@
 
   if (!field_trial->is_low_anonymity_) {
     for (Observer* observer : local_observers) {
-      observer->OnFieldTrialGroupFinalized(*field_trial,
+      observer->OnFieldTrialGroupFinalized(field_trial->trial_name(),
                                            field_trial->group_name_internal());
     }
   }
 
   for (Observer* observer : local_observers_including_low_anonymity) {
-    observer->OnFieldTrialGroupFinalized(*field_trial,
+    observer->OnFieldTrialGroupFinalized(field_trial->trial_name(),
                                          field_trial->group_name_internal());
   }
 
@@ -958,16 +894,13 @@
         allocator->GetAsObject<FieldTrial::FieldTrialEntry>(prev_ref);
     StringPiece trial_name;
     StringPiece group_name;
-    bool is_overridden;
-    if (!prev_entry->GetState(trial_name, group_name, is_overridden)) {
+    if (!prev_entry->GetTrialAndGroupName(&trial_name, &group_name))
       continue;
-    }
 
     // Write a new entry, minus the params.
     Pickle pickle;
     pickle.WriteString(trial_name);
     pickle.WriteString(group_name);
-    pickle.WriteBool(is_overridden);
     size_t total_size = sizeof(FieldTrial::FieldTrialEntry) + pickle.size();
     FieldTrial::FieldTrialEntry* new_entry =
         allocator->New<FieldTrial::FieldTrialEntry>(total_size);
@@ -1228,14 +1161,10 @@
          nullptr) {
     StringPiece trial_name;
     StringPiece group_name;
-    bool is_overridden;
-    if (!entry->GetState(trial_name, group_name, is_overridden)) {
+    if (!entry->GetTrialAndGroupName(&trial_name, &group_name))
       return false;
-    }
-    // TODO(crbug.com/1431156): Don't set is_low_anonymity=false, but instead
-    // propagate the is_low_anonymity state to the child process.
-    FieldTrial* trial = CreateFieldTrial(
-        trial_name, group_name, /*is_low_anonymity=*/false, is_overridden);
+
+    FieldTrial* trial = CreateFieldTrial(trial_name, group_name);
     trial->ref_ = mem_iter.GetAsReference(entry);
     if (subtle::NoBarrier_Load(&entry->activated)) {
       // Mark the trial as "used" and notify observers, if any.
@@ -1389,9 +1318,7 @@
   DCHECK(global_);
 
   for (const auto& entry : entries) {
-    FieldTrial* trial =
-        CreateFieldTrial(entry.trial_name, entry.group_name,
-                         /*is_low_anonymity=*/false, entry.is_overridden);
+    FieldTrial* trial = CreateFieldTrial(entry.trial_name, entry.group_name);
     if (!trial)
       return false;
     if (entry.activated) {
diff --git a/base/metrics/field_trial.h b/base/metrics/field_trial.h
index 3429519..2096b294 100644
--- a/base/metrics/field_trial.h
+++ b/base/metrics/field_trial.h
@@ -133,27 +133,22 @@
     StringPiece trial_name;
     StringPiece group_name;
     bool activated = false;
-    // Whether the trial was overridden, see `FieldTrial::SetOverridden()`.
-    bool is_overridden = false;
   };
 
-  // Represents a Field Trial, its selected group, and override state.
+  // A pair representing a Field Trial and its selected group.
   struct ActiveGroup {
     std::string trial_name;
     std::string group_name;
-    // Whether the trial was overridden, see `FieldTrial::SetOverridden()`.
-    bool is_overridden = false;
   };
 
-  // Represents a FieldTrial, its selected group, whether it's active, and
-  // whether it's overridden. String members are pointers to the underlying
-  // strings owned by the FieldTrial object. Does not use StringPiece to avoid
-  // conversions back to std::string.
+  // A triplet representing a FieldTrial, its selected group and whether it's
+  // active. String members are pointers to the underlying strings owned by the
+  // FieldTrial object. Does not use StringPiece to avoid conversions back to
+  // std::string.
   struct BASE_EXPORT PickleState {
     raw_ptr<const std::string> trial_name = nullptr;
     raw_ptr<const std::string> group_name = nullptr;
     bool activated = false;
-    bool is_overridden = false;
 
     PickleState();
     PickleState(const PickleState& other);
@@ -187,11 +182,10 @@
     uint64_t pickle_size;
 
     // Calling this is only valid when the entry is initialized. That is, it
-    // resides in shared memory and has a pickle containing the trial name,
-    // group name, and is_overridden.
-    bool GetState(StringPiece& trial_name,
-                  StringPiece& group_name,
-                  bool& is_overridden) const;
+    // resides in shared memory and has a pickle containing the trial name and
+    // group name following it.
+    bool GetTrialAndGroupName(StringPiece* trial_name,
+                              StringPiece* group_name) const;
 
     // Calling this is only valid when the entry is initialized as well. Reads
     // the parameters following the trial and group name and stores them as
@@ -207,13 +201,6 @@
     bool ReadStringPair(PickleIterator* iter,
                         StringPiece* trial_name,
                         StringPiece* group_name) const;
-
-    // Reads the field trial header, which includes the name of the trial and
-    // group, and the is_overridden bool.
-    bool ReadHeader(PickleIterator& iter,
-                    StringPiece& trial_name,
-                    StringPiece& group_name,
-                    bool& is_overridden) const;
   };
 
   typedef std::vector<ActiveGroup> ActiveGroups;
@@ -261,9 +248,6 @@
   // be done from the UI thread.
   void SetForced();
 
-  // Returns whether the trial was overridden.
-  bool IsOverridden() const;
-
   // Supports benchmarking by causing field trials' default groups to be chosen.
   static void EnableBenchmarking();
 
@@ -282,27 +266,11 @@
                                                StringPiece default_group_name,
                                                double entropy_value);
 
-  // Parses a '--force-fieldtrials' formatted string into entries.
-  // Returns true if the string was parsed correctly. On failure, the |entries|
-  // array may end up being partially filled.
-  //
-  // Note that currently, States returned here have is_overridden=false, but we
-  // are in the process of migrating to marking field trials set manually by
-  // command line as overridden. See b/284986126.
-  static bool ParseFieldTrialsString(
-      const base::StringPiece field_trials_string,
-      std::vector<State>& entries);
-
-  // Returns a '--force-fieldtrials' formatted string representing the list of
-  // provided trial states.
-  static std::string BuildFieldTrialStateString(
-      const std::vector<State>& states);
-
   // Whether this field trial is low anonymity or not (see
   // |FieldTrialListIncludingLowAnonymity|).
   // TODO(crbug.com/1431156): remove this once all call sites have been properly
   // migrated to use an appropriate observer.
-  bool is_low_anonymity() const { return is_low_anonymity_; }
+  bool is_low_anonymity() { return is_low_anonymity_; }
 
  private:
   // Allow tests to access our innards for testing purposes.
@@ -353,8 +321,7 @@
              Probability total_probability,
              StringPiece default_group_name,
              double entropy_value,
-             bool is_low_anonymity,
-             bool is_overridden);
+             bool is_low_anonymity);
 
   virtual ~FieldTrial();
 
@@ -418,10 +385,6 @@
   // appropriate.
   bool forced_;
 
-  // Whether the field trial was manually overridden using a command-line flag
-  // or internals page.
-  const bool is_overridden_;
-
   // Specifies whether the group choice has been reported to observers.
   bool group_reported_;
 
@@ -458,10 +421,7 @@
   class BASE_EXPORT Observer {
    public:
     // Notify observers when FieldTrials's group is selected.
-    // Note that it should be safe to eliminate the `group_name` parameter, in
-    // favor of callers using `trial.group_name()`. This wasn't done yet because
-    // `FieldTrial::group_name()` has a non-trivial implementation.
-    virtual void OnFieldTrialGroupFinalized(const FieldTrial& trial,
+    virtual void OnFieldTrialGroupFinalized(const std::string& trial_name,
                                             const std::string& group_name) = 0;
 
    protected:
@@ -507,8 +467,7 @@
       StringPiece default_group_name,
       const FieldTrial::EntropyProvider& entropy_provider,
       uint32_t randomization_seed = 0,
-      bool is_low_anonymity = false,
-      bool is_overridden = false);
+      bool is_low_anonymity = false);
 
   // The Find() method can be used to test to see if a named trial was already
   // registered, or to retrieve a pointer to it from the global map.
@@ -624,8 +583,7 @@
   // |FieldTrialListIncludingLowAnonymity|.
   static FieldTrial* CreateFieldTrial(StringPiece name,
                                       StringPiece group_name,
-                                      bool is_low_anonymity = false,
-                                      bool is_overridden = false);
+                                      bool is_low_anonymity = false);
 
   // Add an observer to be notified when a field trial is irrevocably committed
   // to being part of some specific field_group (and hence the group_name is
diff --git a/base/metrics/field_trial_unittest.cc b/base/metrics/field_trial_unittest.cc
index f1c0fc5..c72dd1c 100644
--- a/base/metrics/field_trial_unittest.cc
+++ b/base/metrics/field_trial_unittest.cc
@@ -71,9 +71,9 @@
 
   ~TestFieldTrialObserver() override { FieldTrialList::RemoveObserver(this); }
 
-  void OnFieldTrialGroupFinalized(const FieldTrial& trial,
+  void OnFieldTrialGroupFinalized(const std::string& trial,
                                   const std::string& group) override {
-    trial_name_ = trial.trial_name();
+    trial_name_ = trial;
     group_name_ = group;
   }
 
@@ -105,7 +105,7 @@
     FieldTrialList::RemoveObserver(this);
   }
 
-  void OnFieldTrialGroupFinalized(const base::FieldTrial& trial,
+  void OnFieldTrialGroupFinalized(const std::string& trial,
                                   const std::string& group) override {
     trial_to_access_->Activate();
   }
@@ -137,9 +137,9 @@
     FieldTrialListIncludingLowAnonymity::RemoveObserver(this);
   }
 
-  void OnFieldTrialGroupFinalized(const base::FieldTrial& trial,
+  void OnFieldTrialGroupFinalized(const std::string& trial,
                                   const std::string& group) override {
-    trial_name_ = trial.trial_name();
+    trial_name_ = trial;
     group_name_ = group;
   }
 
@@ -376,7 +376,7 @@
       CreateFieldTrial("Some name", 10, "Default some name");
   EXPECT_EQ("", trial->group_name_internal());
   FieldTrialList::AllStatesToString(&save_string);
-  EXPECT_EQ("Some name/Default some name", save_string);
+  EXPECT_EQ("Some name/Default some name/", save_string);
   // Getting all states should have finalized the trial.
   EXPECT_EQ("Default some name", trial->group_name_internal());
   save_string.clear();
@@ -386,7 +386,7 @@
   trial->AppendGroup("Winner", 10);
   trial->Activate();
   FieldTrialList::AllStatesToString(&save_string);
-  EXPECT_EQ("Some name/Default some name/*trial2/Winner", save_string);
+  EXPECT_EQ("Some name/Default some name/*trial2/Winner/", save_string);
   save_string.clear();
 
   // Create a second trial and winning group.
@@ -396,7 +396,7 @@
 
   FieldTrialList::AllStatesToString(&save_string);
   // We assume names are alphabetized... though this is not critical.
-  EXPECT_EQ("Some name/Default some name/*trial2/Winner/*xxx/yyyy",
+  EXPECT_EQ("Some name/Default some name/*trial2/Winner/*xxx/yyyy/",
             save_string);
   save_string.clear();
 
@@ -404,12 +404,12 @@
   scoped_refptr<FieldTrial> trial3 = CreateFieldTrial("zzz", 10, "default");
 
   FieldTrialList::AllStatesToString(&save_string);
-  EXPECT_EQ("Some name/Default some name/*trial2/Winner/*xxx/yyyy/zzz/default",
+  EXPECT_EQ("Some name/Default some name/*trial2/Winner/*xxx/yyyy/zzz/default/",
             save_string);
 
   save_string.clear();
   FieldTrialList::AllStatesToString(&save_string);
-  EXPECT_EQ("Some name/Default some name/*trial2/Winner/*xxx/yyyy/zzz/default",
+  EXPECT_EQ("Some name/Default some name/*trial2/Winner/*xxx/yyyy/zzz/default/",
             save_string);
 }
 
@@ -423,13 +423,11 @@
   ASSERT_NE(static_cast<FieldTrial*>(nullptr), trial);
   EXPECT_EQ("Winner", trial->group_name());
   EXPECT_EQ("Some_name", trial->trial_name());
-  EXPECT_FALSE(trial->IsOverridden());
 
   trial = FieldTrialList::Find("xxx");
   ASSERT_NE(static_cast<FieldTrial*>(nullptr), trial);
   EXPECT_EQ("yyyy", trial->group_name());
   EXPECT_EQ("xxx", trial->trial_name());
-  EXPECT_FALSE(trial->IsOverridden());
 }
 
 TEST_F(FieldTrialTest, RestoreNotEndingWithSlash) {
@@ -457,7 +455,7 @@
   std::string save_string;
   FieldTrialList::AllStatesToString(&save_string);
   // * prefix since it is activated.
-  EXPECT_EQ("*Some name/Winner", save_string);
+  EXPECT_EQ("*Some name/Winner/", save_string);
 
   // It is OK if we redundantly specify a winner.
   EXPECT_TRUE(FieldTrialList::CreateTrialsFromString(save_string));
@@ -795,9 +793,8 @@
   for (int i = 0; i < kBucketCount; ++i) {
     const double entropy = i / static_cast<double>(kBucketCount);
 
-    scoped_refptr<FieldTrial> trial(
-        new FieldTrial("test", kBucketCount, "default", entropy,
-                       /*is_low_anonymity=*/false, /*is_overridden=*/false));
+    scoped_refptr<FieldTrial> trial(new FieldTrial(
+        "test", kBucketCount, "default", entropy, /*is_low_anonymity=*/false));
     for (int j = 0; j < kBucketCount; ++j)
       trial->AppendGroup(NumberToString(j), 1);
 
@@ -809,9 +806,8 @@
   const double kEntropyValue = 1.0 - 1e-9;
   ASSERT_LT(kEntropyValue, 1.0);
 
-  scoped_refptr<FieldTrial> trial(
-      new FieldTrial("test", 2, "default", kEntropyValue,
-                     /*is_low_anonymity=*/false, /*is_overridden=*/false));
+  scoped_refptr<FieldTrial> trial(new FieldTrial(
+      "test", 2, "default", kEntropyValue, /*is_low_anonymity=*/false));
   trial->AppendGroup("1", 1);
   trial->AppendGroup("2", 1);
 
@@ -1110,7 +1106,7 @@
   FieldTrialList::CreateTrialsFromSharedMemoryMapping(std::move(shm_mapping));
   std::string check_string;
   FieldTrialList::AllStatesToString(&check_string);
-  EXPECT_EQ("*Trial1/Group1", check_string);
+  EXPECT_EQ("*Trial1/Group1/", check_string);
 }
 
 TEST_F(FieldTrialListTest, DumpAndFetchFromSharedMemory) {
@@ -1122,8 +1118,6 @@
   scoped_feature_list.InitWithEmptyFeatureAndFieldTrialLists();
 
   FieldTrialList::CreateFieldTrial(trial_name, group_name);
-  FieldTrialList::CreateFieldTrial("Trial2", "Group2", false,
-                                   /*is_overridden=*/true);
   std::map<std::string, std::string> params;
   params["key1"] = "value1";
   params["key2"] = "value2";
@@ -1144,30 +1138,22 @@
       FieldTrialList::GetAllFieldTrialsFromPersistentAllocator(allocator);
 
   // Check that we have the entry we put in.
-  EXPECT_EQ(2u, entries.size());
-  const FieldTrial::FieldTrialEntry* entry1 = entries[0];
-  const FieldTrial::FieldTrialEntry* entry2 = entries[1];
+  EXPECT_EQ(1u, entries.size());
+  const FieldTrial::FieldTrialEntry* entry = entries[0];
 
-  // Check that the trial information matches.
+  // Check that the trial and group names match.
   StringPiece shm_trial_name;
   StringPiece shm_group_name;
-  bool overridden;
-  ASSERT_TRUE(entry1->GetState(shm_trial_name, shm_group_name, overridden));
+  entry->GetTrialAndGroupName(&shm_trial_name, &shm_group_name);
   EXPECT_EQ(trial_name, shm_trial_name);
   EXPECT_EQ(group_name, shm_group_name);
-  EXPECT_FALSE(overridden);
 
   // Check that the params match.
   std::map<std::string, std::string> shm_params;
-  entry1->GetParams(&shm_params);
+  entry->GetParams(&shm_params);
   EXPECT_EQ(2u, shm_params.size());
   EXPECT_EQ("value1", shm_params["key1"]);
   EXPECT_EQ("value2", shm_params["key2"]);
-
-  ASSERT_TRUE(entry2->GetState(shm_trial_name, shm_group_name, overridden));
-  EXPECT_EQ("Trial2", shm_trial_name);
-  EXPECT_EQ("Group2", shm_group_name);
-  EXPECT_TRUE(overridden);
 }
 
 #if BUILDFLAG(USE_BLINK)
@@ -1372,66 +1358,4 @@
   EXPECT_EQ(kDefaultGroupName, low_anonymity_observer.group_name());
 }
 
-TEST_F(FieldTrialTest, ParseFieldTrialsString) {
-  std::vector<FieldTrial::State> entries;
-  ASSERT_TRUE(FieldTrial::ParseFieldTrialsString("Trial1/Group1", entries));
-
-  ASSERT_EQ(entries.size(), 1ul);
-  const FieldTrial::State& entry = entries[0];
-  EXPECT_EQ("Trial1", entry.trial_name);
-  EXPECT_EQ("Group1", entry.group_name);
-  EXPECT_EQ(false, entry.activated);
-  EXPECT_EQ(false, entry.is_overridden);
-}
-
-TEST_F(FieldTrialTest, ParseFieldTrialsStringTwoStudies) {
-  std::vector<FieldTrial::State> entries;
-  ASSERT_TRUE(FieldTrial::ParseFieldTrialsString(
-      "Trial1/Group1/*Trial2/Group2/", entries));
-
-  ASSERT_EQ(entries.size(), 2ul);
-  const FieldTrial::State& entry1 = entries[0];
-  EXPECT_EQ("Trial1", entry1.trial_name);
-  EXPECT_EQ("Group1", entry1.group_name);
-  EXPECT_EQ(false, entry1.activated);
-  EXPECT_EQ(false, entry1.is_overridden);
-
-  const FieldTrial::State& entry2 = entries[1];
-  EXPECT_EQ("Trial2", entry2.trial_name);
-  EXPECT_EQ("Group2", entry2.group_name);
-  EXPECT_EQ(true, entry2.activated);
-  EXPECT_EQ(false, entry2.is_overridden);
-}
-
-TEST_F(FieldTrialTest, ParseFieldTrialsStringEmpty) {
-  std::vector<FieldTrial::State> entries;
-  ASSERT_TRUE(FieldTrial::ParseFieldTrialsString("", entries));
-
-  ASSERT_EQ(entries.size(), 0ul);
-}
-
-TEST_F(FieldTrialTest, ParseFieldTrialsStringInvalid) {
-  std::vector<FieldTrial::State> entries;
-  EXPECT_FALSE(FieldTrial::ParseFieldTrialsString("A/", entries));
-  EXPECT_FALSE(FieldTrial::ParseFieldTrialsString("/A", entries));
-  EXPECT_FALSE(FieldTrial::ParseFieldTrialsString("//", entries));
-  EXPECT_FALSE(FieldTrial::ParseFieldTrialsString("///", entries));
-}
-
-TEST_F(FieldTrialTest, BuildFieldTrialStateString) {
-  FieldTrial::State state1;
-  state1.trial_name = "Trial";
-  state1.group_name = "Group";
-  state1.activated = false;
-
-  FieldTrial::State state2;
-  state2.trial_name = "Foo";
-  state2.group_name = "Bar";
-  state2.activated = true;
-
-  EXPECT_EQ("Trial/Group", FieldTrial::BuildFieldTrialStateString({state1}));
-  EXPECT_EQ("Trial/Group/*Foo/Bar",
-            FieldTrial::BuildFieldTrialStateString({state1, state2}));
-}
-
 }  // namespace base
diff --git a/base/pickle.h b/base/pickle.h
index 1464fe7..132ad38 100644
--- a/base/pickle.h
+++ b/base/pickle.h
@@ -168,11 +168,9 @@
   // Initializes a Pickle as a deep copy of another Pickle.
   Pickle(const Pickle& other);
 
-  // Note: There are no virtual methods in this class.  This destructor is
-  // virtual as an element of defensive coding.  Other classes have derived from
-  // this class, and there is a *chance* that they will cast into this base
-  // class before destruction.  At least one such class does have a virtual
-  // destructor, suggesting at least some need to call more derived destructors.
+  // Note: Other classes are derived from this class, and they may well
+  // delete through this parent class, e.g. std::uniuqe_ptr<Pickle> exists
+  // in several places the code.
   virtual ~Pickle();
 
   // Performs a deep copy.
diff --git a/base/trace_event/builtin_categories.h b/base/trace_event/builtin_categories.h
index c4ed2b8..85e8316 100644
--- a/base/trace_event/builtin_categories.h
+++ b/base/trace_event/builtin_categories.h
@@ -190,6 +190,7 @@
   X("webengine.fidl")                                                    \
   X("weblayer")                                                          \
   X("WebCore")                                                           \
+  X("webnn")                                                             \
   X("webrtc")                                                            \
   X("webrtc_stats")                                                      \
   X("xr")                                                                \
@@ -295,6 +296,7 @@
   X(TRACE_DISABLED_BY_DEFAULT("viz.visual_debugger"))                    \
   X(TRACE_DISABLED_BY_DEFAULT("webaudio.audionode"))                     \
   X(TRACE_DISABLED_BY_DEFAULT("webgpu"))                                 \
+  X(TRACE_DISABLED_BY_DEFAULT("webnn"))                                  \
   X(TRACE_DISABLED_BY_DEFAULT("webrtc"))                                 \
   X(TRACE_DISABLED_BY_DEFAULT("worker.scheduler"))                       \
   X(TRACE_DISABLED_BY_DEFAULT("xr.debug"))
diff --git a/chrome/VERSION b/chrome/VERSION
index 5c1e2006..52030bc 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=121
 MINOR=0
-BUILD=6141
+BUILD=6142
 PATCH=0
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/feed/FeedActionDelegateImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/app/feed/FeedActionDelegateImpl.java
index e62eecd0..9d9c1a5 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/app/feed/FeedActionDelegateImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/app/feed/FeedActionDelegateImpl.java
@@ -70,9 +70,10 @@
         mTabModelSelector = tabModelSelector;
         mProfile = profile;
     }
+
     @Override
     public void downloadPage(String url) {
-        RequestCoordinatorBridge.getForProfile(Profile.getLastUsedRegularProfile())
+        RequestCoordinatorBridge.getForProfile(mProfile)
                 .savePageLater(
                         url, OfflinePageBridge.NTP_SUGGESTIONS_NAMESPACE, true /* user requested*/);
     }
@@ -159,14 +160,22 @@
     }
 
     @Override
-    public void showSignInInterstitial(@SigninAccessPoint int signinAccessPoint,
-            BottomSheetController bottomSheetController, WindowAndroid windowAndroid) {
-            SigninMetricsUtils.logSigninStartAccessPoint(signinAccessPoint);
-            SigninMetricsUtils.logSigninUserActionForAccessPoint(signinAccessPoint);
-            SigninBottomSheetCoordinator signinCoordinator = new SigninBottomSheetCoordinator(
-                    windowAndroid, DeviceLockActivityLauncherImpl.get(), bottomSheetController,
-                    Profile.getLastUsedRegularProfile(), null, null, signinAccessPoint);
-            signinCoordinator.show();
+    public void showSignInInterstitial(
+            @SigninAccessPoint int signinAccessPoint,
+            BottomSheetController bottomSheetController,
+            WindowAndroid windowAndroid) {
+        SigninMetricsUtils.logSigninStartAccessPoint(signinAccessPoint);
+        SigninMetricsUtils.logSigninUserActionForAccessPoint(signinAccessPoint);
+        SigninBottomSheetCoordinator signinCoordinator =
+                new SigninBottomSheetCoordinator(
+                        windowAndroid,
+                        DeviceLockActivityLauncherImpl.get(),
+                        bottomSheetController,
+                        mProfile,
+                        null,
+                        null,
+                        signinAccessPoint);
+        signinCoordinator.show();
     }
 
     /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkFolderPickerMediator.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkFolderPickerMediator.java
index a2bdf0e..d90084f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkFolderPickerMediator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkFolderPickerMediator.java
@@ -38,7 +38,7 @@
                 }
             };
 
-    private BookmarkUiPrefs.Observer mBookmarkUiPrefsObserver =
+    private final BookmarkUiPrefs.Observer mBookmarkUiPrefsObserver =
             new BookmarkUiPrefs.Observer() {
                 @Override
                 public void onBookmarkRowDisplayPrefChanged(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkRowCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkRowCoordinator.java
index 86ffd15..f804f556 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkRowCoordinator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkRowCoordinator.java
@@ -58,7 +58,7 @@
 
         propertyModel.set(BookmarkManagerProperties.BOOKMARK_ID, bookmarkId);
 
-        // Title
+        // Title.
         if (displayPref == BookmarkRowDisplayPref.COMPACT && bookmarkItem.isFolder()) {
             propertyModel.set(
                     ImprovedBookmarkRowProperties.TITLE,
@@ -106,7 +106,7 @@
             propertyModel.set(ImprovedBookmarkRowProperties.ACCESSORY_VIEW, null);
         }
 
-        // Icon
+        // Icon.
         resolveImagesForBookmark(propertyModel, bookmarkItem);
 
         return propertyModel;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java
index 1507b103..94674ca 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java
@@ -23,6 +23,7 @@
 import org.chromium.base.supplier.OneShotCallback;
 import org.chromium.base.supplier.OneshotSupplier;
 import org.chromium.base.supplier.Supplier;
+import org.chromium.base.supplier.SupplierUtils;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ActivityTabProvider;
 import org.chromium.chrome.browser.ActivityTabProvider.ActivityTabTabObserver;
@@ -123,7 +124,6 @@
 import org.chromium.components.version_info.VersionInfo;
 import org.chromium.components.webapps.bottomsheet.PwaBottomSheetController;
 import org.chromium.components.webapps.bottomsheet.PwaBottomSheetControllerFactory;
-import org.chromium.content_public.browser.WebContents;
 import org.chromium.ui.base.ActivityWindowAndroid;
 import org.chromium.ui.base.DeviceFormFactor;
 import org.chromium.ui.base.IntentRequestTracker;
@@ -515,8 +515,15 @@
                             }, getBottomSheetController(), true));
         }
 
-        mIntentMetadataOneshotSupplier.onAvailable(mCallbackController.makeCancelable(
-                (metadata) -> initializeIPH(metadata.getIsIntentWithEffect())));
+        SupplierUtils.waitForAll(
+                mCallbackController.makeCancelable(
+                        () -> {
+                            initializeIPH(
+                                    mProfileSupplier.get().getOriginalProfile(),
+                                    mIntentMetadataOneshotSupplier.get().getIsIntentWithEffect());
+                        }),
+                mIntentMetadataOneshotSupplier,
+                mProfileSupplier);
 
         // TODO(https://crbug.com/1157955): Investigate switching to per-Activity coordinator that
         // uses signals from the current Tab to decide when to show the PWA install bottom sheet
@@ -648,7 +655,7 @@
 
     // Private class methods
 
-    private void initializeIPH(boolean intentWithEffect) {
+    private void initializeIPH(Profile profile, boolean intentWithEffect) {
         if (mActivity == null) return;
         mToolbarButtonInProductHelpController =
                 new ToolbarButtonInProductHelpController(
@@ -734,15 +741,20 @@
         }
 
         if (!didTriggerPromo) {
-            didTriggerPromo = DeviceFormFactor.isWindowOnTablet(mWindowAndroid)
-                    && RequestDesktopUtils.maybeShowGlobalSettingOptInMessage(
-                            getPrimaryDisplaySizeInInches(), Profile.getLastUsedRegularProfile(),
-                            mMessageDispatcher, mActivity, mActivityTabProvider);
+            didTriggerPromo =
+                    DeviceFormFactor.isWindowOnTablet(mWindowAndroid)
+                            && RequestDesktopUtils.maybeShowGlobalSettingOptInMessage(
+                                    getPrimaryDisplaySizeInInches(),
+                                    profile,
+                                    mMessageDispatcher,
+                                    mActivity,
+                                    mActivityTabProvider);
         }
 
         if (!didTriggerPromo) {
-            didTriggerPromo = RequestDesktopUtils.maybeShowDefaultEnableGlobalSettingMessage(
-                    Profile.getLastUsedRegularProfile(), mMessageDispatcher, mActivity);
+            didTriggerPromo =
+                    RequestDesktopUtils.maybeShowDefaultEnableGlobalSettingMessage(
+                            profile, mMessageDispatcher, mActivity);
         }
 
         if (!didTriggerPromo) {
@@ -758,7 +770,7 @@
                     mActivity,
                     mWindowAndroid,
                     mActivityTabProvider,
-                    Profile.getLastUsedRegularProfile(),
+                    profile,
                     getToolbarManager().getMenuButtonView(),
                     mAppMenuCoordinator.getAppMenuHandler());
         }
@@ -792,18 +804,12 @@
                         ChromeFeatureList.DARKEN_WEBSITES_CHECKBOX_IN_THEMES_SETTING)) {
             // TODO(crbug.com/1252965): Investigate locking feature engagement system during
             // "second run promos" to avoid !didTriggerPromo check.
-            WebContents webContents;
-
-            Profile profile;
-            if (tab != null && (webContents = tab.getWebContents()) != null) {
-                profile = Profile.fromWebContents(webContents);
-            } else {
-                profile = Profile.getLastUsedRegularProfile();
-                webContents = null;
-            }
-
-            WebContentsDarkModeMessageController.attemptToSendMessage(mActivity, profile,
-                    webContents, new SettingsLauncherImpl(), mMessageDispatcher);
+            WebContentsDarkModeMessageController.attemptToSendMessage(
+                    mActivity,
+                    tab != null ? tab.getProfile() : profile,
+                    tab != null ? tab.getWebContents() : null,
+                    new SettingsLauncherImpl(),
+                    mMessageDispatcher);
         }
 
         if (ChromeFeatureList.isEnabled(ChromeFeatureList.WEB_FEED)) {
diff --git a/chrome/app/app_management_strings.grdp b/chrome/app/app_management_strings.grdp
index 36c6689..606b26a7 100644
--- a/chrome/app/app_management_strings.grdp
+++ b/chrome/app/app_management_strings.grdp
@@ -155,7 +155,7 @@
     Data stored in app: <ph name="APP_SIZE">$1<ex>100 MB</ex></ph>
   </message>
   <message name="IDS_APP_MANAGEMENT_APP_LANGUAGE_LABEL" desc="The label for the settings row button to manage app language selection section of OS Settings which opens a dialog.">
-    App Language
+    App language
   </message>
   <message name="IDS_APP_MANAGEMENT_APP_LANGUAGE_DEVICE_LANGUAGE_LABEL" desc="The label to select or display app language as system default in app language selection of OS Settings.">
     Device language
diff --git a/chrome/app/app_management_strings_grdp/IDS_APP_MANAGEMENT_APP_LANGUAGE_LABEL.png.sha1 b/chrome/app/app_management_strings_grdp/IDS_APP_MANAGEMENT_APP_LANGUAGE_LABEL.png.sha1
index 9bb70bd5..d0ddf0e 100644
--- a/chrome/app/app_management_strings_grdp/IDS_APP_MANAGEMENT_APP_LANGUAGE_LABEL.png.sha1
+++ b/chrome/app/app_management_strings_grdp/IDS_APP_MANAGEMENT_APP_LANGUAGE_LABEL.png.sha1
@@ -1 +1 @@
-bfad2834ff19133940a67b19fdf956fa9111d2f8
\ No newline at end of file
+efd8ace5e0652f174bed00b87d92b92bf74d5253
\ No newline at end of file
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index a8191c1..d26cf44 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -9004,12 +9004,6 @@
       <message name="IDS_TOOLTIP_MIGRATE_LOCAL_CARD" desc="Tooltip for the credit card icon that appears in the address bar. Icon is shown when a user has a credit card stored locally in Chrome but not in Google Pay.">
         Save payment method
       </message>
-      <message name="IDS_MANAGE_IBAN_VALUE_SHOW_VALUE" desc="The tooltip of a button that is used in the manage pending IBAN (International Bank Account Number) bubble for revealing the IBAN value.">
-        Show IBAN value
-      </message>
-      <message name="IDS_MANAGE_IBAN_VALUE_HIDE_VALUE" desc="The tooltip of a button that is used in the manage pending IBAN (International Bank Account Number) bubble for masking the IBAN value.">
-        Hide IBAN value
-      </message>
       <message name="IDS_TOOLTIP_TRANSLATE" desc="The tooltip for translate">
         Translate this page
       </message>
@@ -10013,6 +10007,9 @@
         <message name="IDS_FEEDBACK_IWLWIFI_DEBUG_DUMP_EXPLAINER" desc="Displayed in the system information dialog instead of the actual contents of Intel WiFi debug logs, which are too large to display and too obscure and proprietary for users to understand.">
           &lt;Four files generated by Intel Wi-Fi firmware: csr.lst, fh_regs.lst, radio_reg.lst, monitor.lst.sysmon.  The first three are binary files containing register dumps, and are asserted by Intel to contain no personal or device-identifying information.  The last file is an execution trace from the Intel firmware; it has been scrubbed of any personal or device-identifying information, but is too large to display here.  These files were generated in response to recent Wi-Fi problems with your device, and will be shared with Intel to help troubleshoot these problems.&gt;
         </message>
+        <message name="IDS_FEEDBACK_LOG_ID_CHECKBOX_LABEL" desc="Checkbox label for whether to include log id">
+          Include my server logs.
+        </message>
         <message name="IDS_FEEDBACK_PRIVACY_NOTE" desc="Text for the privacy note included in the feedback app">
           Go to the <ph name="BEGIN_LINK1">&lt;a href="#" id="legal-help-page-url"&gt;</ph>Legal Help page<ph name="END_LINK1">&lt;/a&gt;</ph> to request content changes for legal reasons.  Some account and system information may be sent to Google.  We will use the information you give us to help address technical issues and to improve our services, subject to our <ph name="BEGIN_LINK2">&lt;a href="#" id="privacy-policy-url"&gt;</ph>Privacy Policy<ph name="END_LINK2">&lt;/a&gt;</ph> and <ph name="BEGIN_LINK3">&lt;a href="#" id="terms-of-service-url"&gt;</ph>Terms of Service<ph name="END_LINK3">&lt;/a&gt;</ph>.
         </message>
diff --git a/chrome/app/generated_resources_grd/IDS_FEEDBACK_LOG_ID_CHECKBOX_LABEL.png.sha1 b/chrome/app/generated_resources_grd/IDS_FEEDBACK_LOG_ID_CHECKBOX_LABEL.png.sha1
new file mode 100644
index 0000000..bb854f5
--- /dev/null
+++ b/chrome/app/generated_resources_grd/IDS_FEEDBACK_LOG_ID_CHECKBOX_LABEL.png.sha1
@@ -0,0 +1 @@
+f40ab56b7bf3c3585c746a43086fcbe8d3373246
\ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_MANAGE_IBAN_VALUE_HIDE_VALUE.png.sha1 b/chrome/app/generated_resources_grd/IDS_MANAGE_IBAN_VALUE_HIDE_VALUE.png.sha1
deleted file mode 100644
index 98aec9ef..0000000
--- a/chrome/app/generated_resources_grd/IDS_MANAGE_IBAN_VALUE_HIDE_VALUE.png.sha1
+++ /dev/null
@@ -1 +0,0 @@
-aa18c357454c0ebb8f90421000292b5586fa5324
\ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_MANAGE_IBAN_VALUE_SHOW_VALUE.png.sha1 b/chrome/app/generated_resources_grd/IDS_MANAGE_IBAN_VALUE_SHOW_VALUE.png.sha1
deleted file mode 100644
index be1329e2..0000000
--- a/chrome/app/generated_resources_grd/IDS_MANAGE_IBAN_VALUE_SHOW_VALUE.png.sha1
+++ /dev/null
@@ -1 +0,0 @@
-a5769bfcf1b7f79b0587402aec7b674c828f3305
\ No newline at end of file
diff --git a/chrome/app/settings_chromium_strings.grdp b/chrome/app/settings_chromium_strings.grdp
index b2cb1553..55aef57 100644
--- a/chrome/app/settings_chromium_strings.grdp
+++ b/chrome/app/settings_chromium_strings.grdp
@@ -420,4 +420,18 @@
   <message name="IDS_SETTINGS_SAFETY_HUB_VERSION_RELAUNCH_ARIA_LABEL" desc="Safety Check settings page (chrome://settings/safetyCheck) gives users an overview over their safety status. The version card, which this text is a part of, informs the user whether their Chrome is up to date. This string is for the accesibility label for the card to call out the click on card will result restarting the browser.">
     Relaunch Chromium
   </message>
+
+  <!-- HTTPS-First Mode -->
+  <message name="IDS_SETTINGS_HTTPS_FIRST_MODE_SUBTITLE" desc="Subtitle for HTTPS-First Mode section in Security settings">
+    Chromium will try to upgrade navigations to HTTPS
+  </message>
+  <message name="IDS_SETTINGS_HTTPS_FIRST_MODE_ENABLED_FULL_SUBLABEL" desc="Sublabel for radio button to fully enable HTTPS-First Mode">
+    Chromium will warn you before loading any site using an insecure connection
+  </message>
+  <message name="IDS_SETTINGS_HTTPS_FIRST_MODE_ENABLED_INCOGNITO_SUBLABEL" desc="Sublabel for radio button to enable HTTPS-First Mode in Incognito">
+    When browsing in Incognito mode, Chromium will warn you before loading a site using an insecure connection
+  </message>
+  <message name="IDS_SETTINGS_HTTPS_FIRST_MODE_DISABLED_SUBLABEL" desc="Sublabel for radio button to disable HTTPS-First Mode">
+    When HTTPS isn't available, Chromium will use an insecure connection without warning you
+  </message>
 </grit-part>
diff --git a/chrome/app/settings_chromium_strings_grdp/IDS_SETTINGS_HTTPS_FIRST_MODE_DISABLED_SUBLABEL.png.sha1 b/chrome/app/settings_chromium_strings_grdp/IDS_SETTINGS_HTTPS_FIRST_MODE_DISABLED_SUBLABEL.png.sha1
new file mode 100644
index 0000000..6235ee4
--- /dev/null
+++ b/chrome/app/settings_chromium_strings_grdp/IDS_SETTINGS_HTTPS_FIRST_MODE_DISABLED_SUBLABEL.png.sha1
@@ -0,0 +1 @@
+61982df830a619ce332b5fc5ec3e9d9f59048e68
\ No newline at end of file
diff --git a/chrome/app/settings_chromium_strings_grdp/IDS_SETTINGS_HTTPS_FIRST_MODE_ENABLED_FULL_SUBLABEL.png.sha1 b/chrome/app/settings_chromium_strings_grdp/IDS_SETTINGS_HTTPS_FIRST_MODE_ENABLED_FULL_SUBLABEL.png.sha1
new file mode 100644
index 0000000..6235ee4
--- /dev/null
+++ b/chrome/app/settings_chromium_strings_grdp/IDS_SETTINGS_HTTPS_FIRST_MODE_ENABLED_FULL_SUBLABEL.png.sha1
@@ -0,0 +1 @@
+61982df830a619ce332b5fc5ec3e9d9f59048e68
\ No newline at end of file
diff --git a/chrome/app/settings_chromium_strings_grdp/IDS_SETTINGS_HTTPS_FIRST_MODE_ENABLED_INCOGNITO_SUBLABEL.png.sha1 b/chrome/app/settings_chromium_strings_grdp/IDS_SETTINGS_HTTPS_FIRST_MODE_ENABLED_INCOGNITO_SUBLABEL.png.sha1
new file mode 100644
index 0000000..6235ee4
--- /dev/null
+++ b/chrome/app/settings_chromium_strings_grdp/IDS_SETTINGS_HTTPS_FIRST_MODE_ENABLED_INCOGNITO_SUBLABEL.png.sha1
@@ -0,0 +1 @@
+61982df830a619ce332b5fc5ec3e9d9f59048e68
\ No newline at end of file
diff --git a/chrome/app/settings_chromium_strings_grdp/IDS_SETTINGS_HTTPS_FIRST_MODE_SUBTITLE.png.sha1 b/chrome/app/settings_chromium_strings_grdp/IDS_SETTINGS_HTTPS_FIRST_MODE_SUBTITLE.png.sha1
new file mode 100644
index 0000000..6235ee4
--- /dev/null
+++ b/chrome/app/settings_chromium_strings_grdp/IDS_SETTINGS_HTTPS_FIRST_MODE_SUBTITLE.png.sha1
@@ -0,0 +1 @@
+61982df830a619ce332b5fc5ec3e9d9f59048e68
\ No newline at end of file
diff --git a/chrome/app/settings_google_chrome_strings.grdp b/chrome/app/settings_google_chrome_strings.grdp
index 47655af..88401d7 100644
--- a/chrome/app/settings_google_chrome_strings.grdp
+++ b/chrome/app/settings_google_chrome_strings.grdp
@@ -413,4 +413,18 @@
   <message name="IDS_SETTINGS_SAFETY_HUB_VERSION_RELAUNCH_ARIA_LABEL" desc="Safety Check settings page (chrome://settings/safetyCheck) gives users an overview over their safety status. The version card, which this text is a part of, informs the user whether their Chrome is up to date. This string is for the accesibility label for the card to call out the click on card will result restarting the browser.">
     Relaunch Chrome
   </message>
+
+    <!-- HTTPS-First Mode -->
+  <message name="IDS_SETTINGS_HTTPS_FIRST_MODE_SUBTITLE" desc="Subtitle for HTTPS-First Mode section in Security settings">
+    Chrome will try to upgrade navigations to HTTPS
+  </message>
+  <message name="IDS_SETTINGS_HTTPS_FIRST_MODE_ENABLED_FULL_SUBLABEL" desc="Sublabel for radio button to fully enable HTTPS-First Mode">
+    Chrome will warn you before loading any site using an insecure connection
+  </message>
+  <message name="IDS_SETTINGS_HTTPS_FIRST_MODE_ENABLED_INCOGNITO_SUBLABEL" desc="Sublabel for radio button to enable HTTPS-First Mode in Incognito">
+    When browsing in Incognito mode, Chrome will warn you before loading a site using an insecure connection
+  </message>
+  <message name="IDS_SETTINGS_HTTPS_FIRST_MODE_DISABLED_SUBLABEL" desc="Sublabel for radio button to disable HTTPS-First Mode">
+    When HTTPS isn't available, Chrome will use an insecure connection without warning you
+  </message>
 </grit-part>
diff --git a/chrome/app/settings_google_chrome_strings_grdp/IDS_SETTINGS_HTTPS_FIRST_MODE_DISABLED_SUBLABEL.png.sha1 b/chrome/app/settings_google_chrome_strings_grdp/IDS_SETTINGS_HTTPS_FIRST_MODE_DISABLED_SUBLABEL.png.sha1
new file mode 100644
index 0000000..6235ee4
--- /dev/null
+++ b/chrome/app/settings_google_chrome_strings_grdp/IDS_SETTINGS_HTTPS_FIRST_MODE_DISABLED_SUBLABEL.png.sha1
@@ -0,0 +1 @@
+61982df830a619ce332b5fc5ec3e9d9f59048e68
\ No newline at end of file
diff --git a/chrome/app/settings_google_chrome_strings_grdp/IDS_SETTINGS_HTTPS_FIRST_MODE_ENABLED_FULL_SUBLABEL.png.sha1 b/chrome/app/settings_google_chrome_strings_grdp/IDS_SETTINGS_HTTPS_FIRST_MODE_ENABLED_FULL_SUBLABEL.png.sha1
new file mode 100644
index 0000000..6235ee4
--- /dev/null
+++ b/chrome/app/settings_google_chrome_strings_grdp/IDS_SETTINGS_HTTPS_FIRST_MODE_ENABLED_FULL_SUBLABEL.png.sha1
@@ -0,0 +1 @@
+61982df830a619ce332b5fc5ec3e9d9f59048e68
\ No newline at end of file
diff --git a/chrome/app/settings_google_chrome_strings_grdp/IDS_SETTINGS_HTTPS_FIRST_MODE_ENABLED_INCOGNITO_SUBLABEL.png.sha1 b/chrome/app/settings_google_chrome_strings_grdp/IDS_SETTINGS_HTTPS_FIRST_MODE_ENABLED_INCOGNITO_SUBLABEL.png.sha1
new file mode 100644
index 0000000..6235ee4
--- /dev/null
+++ b/chrome/app/settings_google_chrome_strings_grdp/IDS_SETTINGS_HTTPS_FIRST_MODE_ENABLED_INCOGNITO_SUBLABEL.png.sha1
@@ -0,0 +1 @@
+61982df830a619ce332b5fc5ec3e9d9f59048e68
\ No newline at end of file
diff --git a/chrome/app/settings_google_chrome_strings_grdp/IDS_SETTINGS_HTTPS_FIRST_MODE_SUBTITLE.png.sha1 b/chrome/app/settings_google_chrome_strings_grdp/IDS_SETTINGS_HTTPS_FIRST_MODE_SUBTITLE.png.sha1
new file mode 100644
index 0000000..6235ee4
--- /dev/null
+++ b/chrome/app/settings_google_chrome_strings_grdp/IDS_SETTINGS_HTTPS_FIRST_MODE_SUBTITLE.png.sha1
@@ -0,0 +1 @@
+61982df830a619ce332b5fc5ec3e9d9f59048e68
\ No newline at end of file
diff --git a/chrome/app/settings_strings.grdp b/chrome/app/settings_strings.grdp
index b853c0b..a59ec42 100644
--- a/chrome/app/settings_strings.grdp
+++ b/chrome/app/settings_strings.grdp
@@ -2259,6 +2259,18 @@
   <message name="IDS_SETTINGS_HTTPS_ONLY_MODE_DESCRIPTION_ADVANCED_PROTECTION" desc="Secondary, continued explanation of HTTPS-Only Mode in Security settings when the user can't change the setting">
     Use HTTPS whenever possible and get warned before loading sites that don’t support it. You can’t change this setting because you have Advanced Protection enabled.
   </message>
+  <message name="IDS_SETTINGS_HTTPS_FIRST_MODE_TITLE" desc="Title for HTTPS-First Mode section in Security settings">
+    Warn before using insecure connections
+  </message>
+  <message name="IDS_SETTINGS_HTTPS_FIRST_MODE_ENABLED_FULL_LABEL" desc="Label for radio button to fully enable HTTPS-First Mode">
+    See warnings before going to insecure sites (recommended)
+  </message>
+  <message name="IDS_SETTINGS_HTTPS_FIRST_MODE_ENABLED_INCOGNITO_LABEL" desc="Label for radio button to enable HTTPS-First Mode in Incognito">
+    See warnings before going to insecure sites in Incognito mode
+  </message>
+  <message name="IDS_SETTINGS_HTTPS_FIRST_MODE_DISABLED_LABEL" desc="Label for radio button to disable HTTPS-First Mode">
+    Don't see any warnings before going to insecure sites
+  </message>
   <message name="IDS_SETTINGS_MANAGE_CERTIFICATES" desc="Text for manage certificates button in Privacy options">
     Manage certificates
   </message>
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_HTTPS_FIRST_MODE_DISABLED_LABEL.png.sha1 b/chrome/app/settings_strings_grdp/IDS_SETTINGS_HTTPS_FIRST_MODE_DISABLED_LABEL.png.sha1
new file mode 100644
index 0000000..6235ee4
--- /dev/null
+++ b/chrome/app/settings_strings_grdp/IDS_SETTINGS_HTTPS_FIRST_MODE_DISABLED_LABEL.png.sha1
@@ -0,0 +1 @@
+61982df830a619ce332b5fc5ec3e9d9f59048e68
\ No newline at end of file
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_HTTPS_FIRST_MODE_ENABLED_FULL_LABEL.png.sha1 b/chrome/app/settings_strings_grdp/IDS_SETTINGS_HTTPS_FIRST_MODE_ENABLED_FULL_LABEL.png.sha1
new file mode 100644
index 0000000..6235ee4
--- /dev/null
+++ b/chrome/app/settings_strings_grdp/IDS_SETTINGS_HTTPS_FIRST_MODE_ENABLED_FULL_LABEL.png.sha1
@@ -0,0 +1 @@
+61982df830a619ce332b5fc5ec3e9d9f59048e68
\ No newline at end of file
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_HTTPS_FIRST_MODE_ENABLED_INCOGNITO_LABEL.png.sha1 b/chrome/app/settings_strings_grdp/IDS_SETTINGS_HTTPS_FIRST_MODE_ENABLED_INCOGNITO_LABEL.png.sha1
new file mode 100644
index 0000000..6235ee4
--- /dev/null
+++ b/chrome/app/settings_strings_grdp/IDS_SETTINGS_HTTPS_FIRST_MODE_ENABLED_INCOGNITO_LABEL.png.sha1
@@ -0,0 +1 @@
+61982df830a619ce332b5fc5ec3e9d9f59048e68
\ No newline at end of file
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_HTTPS_FIRST_MODE_TITLE.png.sha1 b/chrome/app/settings_strings_grdp/IDS_SETTINGS_HTTPS_FIRST_MODE_TITLE.png.sha1
new file mode 100644
index 0000000..6235ee4
--- /dev/null
+++ b/chrome/app/settings_strings_grdp/IDS_SETTINGS_HTTPS_FIRST_MODE_TITLE.png.sha1
@@ -0,0 +1 @@
+61982df830a619ce332b5fc5ec3e9d9f59048e68
\ No newline at end of file
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index 5107a22..a01b0f55 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -4312,10 +4312,6 @@
       "search/background/ntp_custom_background_service_observer.h",
       "search/background/wallpaper_search/wallpaper_search_background_manager.cc",
       "search/background/wallpaper_search/wallpaper_search_background_manager.h",
-      "search/background/wallpaper_search/wallpaper_search_service.cc",
-      "search/background/wallpaper_search/wallpaper_search_service.h",
-      "search/background/wallpaper_search/wallpaper_search_service_factory.cc",
-      "search/background/wallpaper_search/wallpaper_search_service_factory.h",
       "search/instant_service.cc",
       "search/instant_service.h",
       "search/instant_service_factory.cc",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index dc5b120..7ee1b7b2 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -7879,6 +7879,10 @@
      flag_descriptions::kFastPairSoftwareScanningDescription, kOsCrOS,
      FEATURE_VALUE_TYPE(ash::features::kFastPairSoftwareScanning)},
 
+    {"nearby-presence", flag_descriptions::kNearbyPresenceName,
+     flag_descriptions::kNearbyPresenceDescription, kOsCrOS,
+     FEATURE_VALUE_TYPE(ash::features::kNearbyPresence)},
+
     {"pcie-billboard-notification",
      flag_descriptions::kPcieBillboardNotificationName,
      flag_descriptions::kPcieBillboardNotificationDescription, kOsCrOS,
diff --git a/chrome/browser/accessibility/DEPS b/chrome/browser/accessibility/DEPS
index b2487c4..8ae5b94 100644
--- a/chrome/browser/accessibility/DEPS
+++ b/chrome/browser/accessibility/DEPS
@@ -1,6 +1,7 @@
 include_rules = [
   "+components/live_caption",
   "+components/soda",
+  "+pdf/pdf_features.h",
   "+services/image_annotation",
   "+testing/gmock",
   "+testing/gtest",
diff --git a/chrome/browser/accessibility/pdf_ocr_controller_browsertest.cc b/chrome/browser/accessibility/pdf_ocr_controller_browsertest.cc
index 85f202e..28e2102 100644
--- a/chrome/browser/accessibility/pdf_ocr_controller_browsertest.cc
+++ b/chrome/browser/accessibility/pdf_ocr_controller_browsertest.cc
@@ -2,7 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include <vector>
+
 #include "base/test/bind.h"
+#include "base/test/scoped_feature_list.h"
+#include "base/test/with_feature_override.h"
 #include "chrome/browser/accessibility/pdf_ocr_controller.h"
 #include "chrome/browser/pdf/pdf_extension_test_base.h"
 #include "chrome/browser/screen_ai/screen_ai_install_state.h"
@@ -14,6 +18,7 @@
 #include "content/public/browser/browser_accessibility_state.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/test/browser_test.h"
+#include "pdf/pdf_features.h"
 #include "ui/accessibility/accessibility_features.h"
 
 #if !BUILDFLAG(IS_CHROMEOS_ASH)
@@ -71,9 +76,11 @@
 
 }  // namespace
 
-class PdfOcrControllerBrowserTest : public PDFExtensionTestBase {
+class PdfOcrControllerBrowserTest : public base::test::WithFeatureOverride,
+                                    public PDFExtensionTestBase {
  public:
-  PdfOcrControllerBrowserTest() = default;
+  PdfOcrControllerBrowserTest()
+      : base::test::WithFeatureOverride(chrome_pdf::features::kPdfOopif) {}
   ~PdfOcrControllerBrowserTest() override = default;
 
   PdfOcrControllerBrowserTest(const PdfOcrControllerBrowserTest&) = delete;
@@ -102,7 +109,8 @@
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
   }
 
- protected:
+  bool UseOopif() const override { return GetParam(); }
+
   std::vector<base::test::FeatureRef> GetEnabledFeatures() const override {
     auto enabled = PDFExtensionTestBase::GetEnabledFeatures();
     enabled.push_back(features::kPdfOcr);
@@ -113,7 +121,7 @@
 // TODO(crbug.com/1443345): Fix flakiness.
 // Enabling PDF OCR should affect the accessibility mode of a new WebContents
 // of PDF Viewer Mimehandler.
-IN_PROC_BROWSER_TEST_F(PdfOcrControllerBrowserTest,
+IN_PROC_BROWSER_TEST_P(PdfOcrControllerBrowserTest,
                        DISABLED_OpenPDFAfterTurningOnPdfOcr) {
   // TODO(crbug.com/1445746): Remove once the test passes for OOPIF PDF.
   if (UseOopif()) {
@@ -150,7 +158,7 @@
 // TODO(crbug.com/1443345): Fix flakiness.
 // Enabling PDF OCR should affect the accessibility mode of an exiting
 // WebContents of PDF Viewer Mimehandler.
-IN_PROC_BROWSER_TEST_F(PdfOcrControllerBrowserTest,
+IN_PROC_BROWSER_TEST_P(PdfOcrControllerBrowserTest,
                        DISABLED_OpenPDFBeforeTurningOnPdfOcr) {
   // TODO(crbug.com/1445746): Remove once the test passes for OOPIF PDF.
   if (UseOopif()) {
@@ -194,7 +202,7 @@
 
 // Enabling PDF OCR should not affect the accessibility mode of WebContents if
 // it's not related to PDF.
-IN_PROC_BROWSER_TEST_F(PdfOcrControllerBrowserTest,
+IN_PROC_BROWSER_TEST_P(PdfOcrControllerBrowserTest,
                        TurningOnPdfOcrNotAffectingNonPdfTab) {
   // TODO(crbug.com/1445746): Remove once the test passes for OOPIF PDF.
   if (UseOopif()) {
@@ -226,7 +234,7 @@
   EXPECT_FALSE(ax_mode.has_mode(ui::AXMode::kPDFOcr));
 }
 
-IN_PROC_BROWSER_TEST_F(PdfOcrControllerBrowserTest,
+IN_PROC_BROWSER_TEST_P(PdfOcrControllerBrowserTest,
                        NotEnabledWithoutScreenReader) {
   // TODO(crbug.com/1445746): Remove once the test passes for OOPIF PDF.
   if (UseOopif()) {
@@ -256,7 +264,7 @@
 #if !BUILDFLAG(IS_CHROMEOS_ASH)
 // Enabling PDF OCR in one profile should not affect the accessibility mode of
 // WebContents in another profile.
-IN_PROC_BROWSER_TEST_F(PdfOcrControllerBrowserTest,
+IN_PROC_BROWSER_TEST_P(PdfOcrControllerBrowserTest,
                        TurningOnPdfOcrInOneProfileNotAffectingAnotherProfile) {
   // TODO(crbug.com/1445746): Remove once the test passes for OOPIF PDF.
   if (UseOopif()) {
@@ -300,3 +308,7 @@
   }
 }
 #endif  // !BUILDFLAG(IS_CHROMEOS_ASH)
+
+// TODO(crbug.com/1445746): Stop testing both modes after OOPIF PDF viewer
+// launches.
+INSTANTIATE_FEATURE_OVERRIDE_TEST_SUITE(PdfOcrControllerBrowserTest);
diff --git a/chrome/browser/ash/BUILD.gn b/chrome/browser/ash/BUILD.gn
index 29a94de8a..e9c2c8f23 100644
--- a/chrome/browser/ash/BUILD.gn
+++ b/chrome/browser/ash/BUILD.gn
@@ -5213,6 +5213,7 @@
     "arc/input_overlay/ui/edit_label_unittest.cc",
     "arc/input_overlay/ui/editing_list_unittest.cc",
     "arc/input_overlay/ui/menu_entry_view_unittest.cc",
+    "arc/input_overlay/ui/target_view_unittest.cc",
     "arc/instance_throttle/arc_active_window_throttle_observer_unittest.cc",
     "arc/instance_throttle/arc_app_launch_throttle_observer_unittest.cc",
     "arc/instance_throttle/arc_boot_phase_throttle_observer_unittest.cc",
diff --git a/chrome/browser/ash/app_list/app_service/app_service_promise_app_item_browsertest.cc b/chrome/browser/ash/app_list/app_service/app_service_promise_app_item_browsertest.cc
index 868f4fb..95da6b0c 100644
--- a/chrome/browser/ash/app_list/app_service/app_service_promise_app_item_browsertest.cc
+++ b/chrome/browser/ash/app_list/app_service/app_service_promise_app_item_browsertest.cc
@@ -23,6 +23,7 @@
 #include "ash/public/cpp/shelf_types.h"
 #include "base/memory/raw_ptr.h"
 #include "base/test/bind.h"
+#include "base/test/test_future.h"
 #include "chrome/browser/apps/app_service/app_service_proxy.h"
 #include "chrome/browser/apps/app_service/app_service_proxy_ash.h"
 #include "chrome/browser/apps/app_service/app_service_proxy_factory.h"
@@ -1002,6 +1003,26 @@
   EXPECT_TRUE(IsItemPinned(app_id));
 }
 
+IN_PROC_BROWSER_TEST_F(AppServicePromiseAppItemBrowserTest, ContextMenu) {
+  apps::PromiseAppPtr promise_app =
+      std::make_unique<PromiseApp>(kTestPackageId);
+  promise_app->should_show = true;
+  cache()->OnPromiseApp(std::move(promise_app));
+
+  // Promise app item should exist in the model.
+  ChromeAppListItem* item = GetChromeAppListItem(kTestPackageId);
+  ASSERT_TRUE(item);
+  base::test::TestFuture<std::unique_ptr<ui::SimpleMenuModel>> future;
+  item->GetContextMenuModel(ash::AppListItemContext::kNone,
+                            future.GetCallback());
+  std::unique_ptr<ui::SimpleMenuModel> menu_model = future.Take();
+
+  // The context menu should only have the option to pin to shelf.
+  EXPECT_EQ(menu_model->GetItemCount(), 1u);
+  EXPECT_EQ(menu_model->GetTypeAt(0), ui::MenuModel::ItemType::TYPE_COMMAND);
+  EXPECT_EQ(menu_model->GetCommandIdAt(0), ash::CommandId::TOGGLE_PIN);
+}
+
 // Test the full promise icon lifecycle where promise icon changes are triggered
 // by ARC mojom updates.
 IN_PROC_BROWSER_TEST_F(AppServicePromiseAppItemBrowserTest,
diff --git a/chrome/browser/ash/arc/input_overlay/constants.h b/chrome/browser/ash/arc/input_overlay/constants.h
index 8b80180..18d442d 100644
--- a/chrome/browser/ash/arc/input_overlay/constants.h
+++ b/chrome/browser/ash/arc/input_overlay/constants.h
@@ -55,6 +55,9 @@
 // Horizontal order inset for `ArrowContainer` and its children.
 constexpr int kArrowContainerHorizontalBorderInset = 16;
 
+// Arrow key move distance per key press event.
+inline constexpr int kArrowKeyMoveDistance = 2;
+
 // Display mode for display overlay.
 enum class DisplayMode {
   kNone,
diff --git a/chrome/browser/ash/arc/input_overlay/test/overlay_view_test_base.cc b/chrome/browser/ash/arc/input_overlay/test/overlay_view_test_base.cc
index 01d6806..dc8fa96 100644
--- a/chrome/browser/ash/arc/input_overlay/test/overlay_view_test_base.cc
+++ b/chrome/browser/ash/arc/input_overlay/test/overlay_view_test_base.cc
@@ -27,12 +27,31 @@
   ASSERT_TRUE(editing_list_);
 }
 
+void OverlayViewTestBase::PressAddButton() {
+  if (!editing_list_) {
+    return;
+  }
+  editing_list_->OnAddButtonPressed();
+}
+
+size_t OverlayViewTestBase::GetActionViewSize() {
+  if (!input_mapping_view_) {
+    return 0;
+  }
+
+  return input_mapping_view_->children().size();
+}
+
 ButtonOptionsMenu* OverlayViewTestBase::ShowButtonOptionsMenu(Action* action) {
   action->action_view()->ShowButtonOptionsMenu();
   DCHECK(controller_->button_options_widget_);
   return controller_->GetButtonOptionsMenu();
 }
 
+views::Widget* OverlayViewTestBase::GetTargetViewWidget() {
+  return controller_->target_widget_.get();
+}
+
 // Create a GIO enabled window with default actions including two action tap and
 // one action move, enable it into edit mode.
 void OverlayViewTestBase::SetUp() {
diff --git a/chrome/browser/ash/arc/input_overlay/test/overlay_view_test_base.h b/chrome/browser/ash/arc/input_overlay/test/overlay_view_test_base.h
index 96a2524..daedccb 100644
--- a/chrome/browser/ash/arc/input_overlay/test/overlay_view_test_base.h
+++ b/chrome/browser/ash/arc/input_overlay/test/overlay_view_test_base.h
@@ -24,7 +24,12 @@
 
  protected:
   void EnableEditMode();
+  void PressAddButton();
+
+  size_t GetActionViewSize();
+
   ButtonOptionsMenu* ShowButtonOptionsMenu(Action* action);
+  views::Widget* GetTargetViewWidget();
 
   // GameControlsTestBase:
   void SetUp() override;
diff --git a/chrome/browser/ash/arc/input_overlay/ui/button_options_menu_unittest.cc b/chrome/browser/ash/arc/input_overlay/ui/button_options_menu_unittest.cc
index 2ecb2b7f3..af95423 100644
--- a/chrome/browser/ash/arc/input_overlay/ui/button_options_menu_unittest.cc
+++ b/chrome/browser/ash/arc/input_overlay/ui/button_options_menu_unittest.cc
@@ -65,8 +65,6 @@
     return -1;
   }
 
-  size_t GetActionViewSize() { return input_mapping_view_->children().size(); }
-
   bool IsEditingListInZeroState() { return editing_list_->is_zero_state_; }
 
   void PressDeleteButton(ButtonOptionsMenu* menu) {
diff --git a/chrome/browser/ash/arc/input_overlay/ui/editing_list_unittest.cc b/chrome/browser/ash/arc/input_overlay/ui/editing_list_unittest.cc
index c5790fe64..bfd2b564 100644
--- a/chrome/browser/ash/arc/input_overlay/ui/editing_list_unittest.cc
+++ b/chrome/browser/ash/arc/input_overlay/ui/editing_list_unittest.cc
@@ -42,21 +42,11 @@
     return 0;
   }
 
-  size_t GetActionViewSize() {
-    DCHECK(input_mapping_view_);
-    return input_mapping_view_->children().size();
-  }
-
   size_t GetTouchInjectorActionSize() {
     DCHECK(touch_injector_);
     return touch_injector_->actions().size();
   }
 
-  void PressAddButton() {
-    DCHECK(editing_list_);
-    editing_list_->OnAddButtonPressed();
-  }
-
   // Add a new action in the center of the main window.
   void AddNewAction() {
     PressAddButton();
@@ -157,10 +147,6 @@
     return controller_->input_mapping_widget_.get();
   }
 
-  views::Widget* GetTargetViewWidget() {
-    return controller_->target_widget_.get();
-  }
-
   bool ButtonOptionsMenuExists() {
     return !!controller_->button_options_widget_;
   }
@@ -234,7 +220,7 @@
   EXPECT_EQ(3u, GetActionViewSize());
   EXPECT_EQ(3u, GetTouchInjectorActionSize());
   EXPECT_FALSE(ButtonOptionsMenuExists());
-  // Press add button and it enters into the button place mode.
+  // Press add button and it enters into the button placement mode.
   PressAddButton();
   auto* target_widget = GetTargetViewWidget();
   EXPECT_TRUE(target_widget);
diff --git a/chrome/browser/ash/arc/input_overlay/ui/reposition_controller.cc b/chrome/browser/ash/arc/input_overlay/ui/reposition_controller.cc
index 0b070a3..16a28134 100644
--- a/chrome/browser/ash/arc/input_overlay/ui/reposition_controller.cc
+++ b/chrome/browser/ash/arc/input_overlay/ui/reposition_controller.cc
@@ -5,6 +5,7 @@
 #include "chrome/browser/ash/arc/input_overlay/ui/reposition_controller.h"
 
 #include "ash/app_list/app_list_util.h"
+#include "chrome/browser/ash/arc/input_overlay/ui/ui_utils.h"
 #include "chrome/browser/ash/arc/input_overlay/util.h"
 #include "ui/views/view.h"
 
@@ -12,26 +13,6 @@
 
 namespace {
 
-// Update `position` according to `key` if `key` is arrow key.
-bool UpdatePositionByArrowKey(ui::KeyboardCode key, gfx::Point& position) {
-  switch (key) {
-    case ui::VKEY_LEFT:
-      position.set_x(position.x() - kArrowKeyMoveDistance);
-      return true;
-    case ui::VKEY_RIGHT:
-      position.set_x(position.x() + kArrowKeyMoveDistance);
-      return true;
-    case ui::VKEY_UP:
-      position.set_y(position.y() - kArrowKeyMoveDistance);
-      return true;
-    case ui::VKEY_DOWN:
-      position.set_y(position.y() + kArrowKeyMoveDistance);
-      return true;
-    default:
-      return false;
-  }
-}
-
 // Clamp position `position` inside of the `parent_size` with padding of
 // `parent_padding`
 void ClampPosition(gfx::Point& position,
@@ -108,7 +89,7 @@
 bool RepositionController::OnKeyPressed(const ui::KeyEvent& event) {
   auto target_position = host_view_->origin();
 
-  if (UpdatePositionByArrowKey(event.key_code(), target_position)) {
+  if (OffsetPositionByArrowKey(event.key_code(), target_position)) {
     ClampPosition(target_position, host_view_->size(),
                   host_view_->parent()->size(), parent_padding_);
     host_view_->SetPosition(target_position);
diff --git a/chrome/browser/ash/arc/input_overlay/ui/target_view.cc b/chrome/browser/ash/arc/input_overlay/ui/target_view.cc
index d254f44..2d74663 100644
--- a/chrome/browser/ash/arc/input_overlay/ui/target_view.cc
+++ b/chrome/browser/ash/arc/input_overlay/ui/target_view.cc
@@ -8,6 +8,7 @@
 
 #include "base/notreached.h"
 #include "cc/paint/paint_flags.h"
+#include "chrome/browser/ash/arc/input_overlay/actions/action.h"
 #include "chrome/browser/ash/arc/input_overlay/constants.h"
 #include "chrome/browser/ash/arc/input_overlay/display_overlay_controller.h"
 #include "chrome/browser/ash/arc/input_overlay/touch_injector.h"
@@ -16,6 +17,8 @@
 #include "ui/base/metadata/metadata_impl_macros.h"
 #include "ui/chromeos/styles/cros_tokens_color_mappings.h"
 #include "ui/color/color_provider.h"
+#include "ui/events/keycodes/keyboard_codes_posix.h"
+#include "ui/events/types/event_type.h"
 #include "ui/gfx/canvas.h"
 #include "ui/views/widget/widget.h"
 
@@ -72,6 +75,9 @@
   const auto& bounds = touch_injector->content_bounds();
   center_.set_x(bounds.width() / 2);
   center_.set_y(bounds.height() / 2);
+  SetFocusBehavior(FocusBehavior::ALWAYS);
+  // TODO(b/279117180): Update a11y properties.
+  SetAccessibilityProperties(ax::mojom::Role::kGroup, u"Targeting");
 }
 
 TargetView::~TargetView() = default;
@@ -83,13 +89,6 @@
   widget->SetBounds(controller_->touch_injector()->content_bounds());
 }
 
-void TargetView::VisibilityChanged(views::View* starting_from,
-                                   bool is_visible) {
-  if (is_visible) {
-    UpdateWidgetBounds();
-  }
-}
-
 int TargetView::GetCircleRadius() {
   switch (action_type_) {
     case ActionType::TAP:
@@ -112,9 +111,68 @@
   }
 }
 
+void TargetView::ClampCenter() {
+  const int circle_ring_radius = GetCircleRadius();
+  const auto& view_size = size();
+  center_.set_x(std::clamp(center_.x(), /*lo=*/circle_ring_radius,
+                           view_size.width() - circle_ring_radius));
+  center_.set_y(std::clamp(center_.y(), /*lo=*/circle_ring_radius,
+                           view_size.height() - circle_ring_radius));
+}
+
+void TargetView::OnCenterChanged() {
+  ClampCenter();
+  SchedulePaint();
+}
+
+void TargetView::VisibilityChanged(views::View* starting_from,
+                                   bool is_visible) {
+  if (is_visible) {
+    UpdateWidgetBounds();
+    RequestFocus();
+  }
+}
+
+void TargetView::OnGestureEvent(ui::GestureEvent* event) {
+  auto type = event->type();
+  center_ = event->location();
+  OnCenterChanged();
+  event->SetHandled();
+
+  // When the gesture event is released, add a new action.
+  if (type == ui::ET_GESTURE_SCROLL_END || type == ui::ET_SCROLL_FLING_START ||
+      type == ui::ET_GESTURE_PINCH_END || type == ui::ET_GESTURE_END) {
+    controller_->AddNewAction(action_type_, center_);
+  }
+}
+
+bool TargetView::OnKeyPressed(const ui::KeyEvent& event) {
+  const auto key_code = event.key_code();
+
+  // Exit the button placement mode when key `esc` is pressed.
+  if (key_code == ui::VKEY_ESCAPE) {
+    controller_->ExitButtonPlaceMode();
+    return true;
+  }
+
+  // Continue to add new action if key `enter` is pressed.
+  if (key_code == ui::VKEY_RETURN) {
+    controller_->AddNewAction(action_type_, center_);
+    return true;
+  }
+
+  // Update `center_` and repaint if arrow keys are pressed.
+  if (OffsetPositionByArrowKey(key_code, center_)) {
+    OnCenterChanged();
+    return true;
+  }
+
+  return false;
+}
+
 void TargetView::OnMouseMoved(const ui::MouseEvent& event) {
   center_ = event.location();
-  SchedulePaint();
+  OnCenterChanged();
 }
 
 bool TargetView::OnMousePressed(const ui::MouseEvent& event) {
diff --git a/chrome/browser/ash/arc/input_overlay/ui/target_view.h b/chrome/browser/ash/arc/input_overlay/ui/target_view.h
index a4b919c..e572ee89 100644
--- a/chrome/browser/ash/arc/input_overlay/ui/target_view.h
+++ b/chrome/browser/ash/arc/input_overlay/ui/target_view.h
@@ -14,7 +14,8 @@
 
 class DisplayOverlayController;
 
-// View shows target circle, crossed line and touch point in button place mode.
+// View shows target circle, crossed line and touch point in button placement
+// mode.
 class TargetView : public views::View {
  public:
   METADATA_HEADER(TargetView);
@@ -28,13 +29,24 @@
   void UpdateWidgetBounds();
 
  private:
+  friend class TargetViewTest;
+
   // The overall target circle radius.
   int GetCircleRadius();
   // The target circle ring radius excluding the ring thickness.
   int GetCircleRingRadius();
 
+  // Clamps `center_` so that the target circle can show completely and
+  // constraint the action position.
+  void ClampCenter();
+
+  // Called when `center_` is updated.
+  void OnCenterChanged();
+
   // views::View:
   void VisibilityChanged(views::View* starting_from, bool is_visible) override;
+  void OnGestureEvent(ui::GestureEvent* event) override;
+  bool OnKeyPressed(const ui::KeyEvent& event) override;
   void OnMouseMoved(const ui::MouseEvent& event) override;
   bool OnMousePressed(const ui::MouseEvent& event) override;
   void OnMouseReleased(const ui::MouseEvent& event) override;
diff --git a/chrome/browser/ash/arc/input_overlay/ui/target_view_unittest.cc b/chrome/browser/ash/arc/input_overlay/ui/target_view_unittest.cc
new file mode 100644
index 0000000..d8c23d3
--- /dev/null
+++ b/chrome/browser/ash/arc/input_overlay/ui/target_view_unittest.cc
@@ -0,0 +1,203 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ash/arc/input_overlay/ui/target_view.h"
+
+#include "chrome/browser/ash/arc/input_overlay/actions/action.h"
+#include "chrome/browser/ash/arc/input_overlay/constants.h"
+#include "chrome/browser/ash/arc/input_overlay/test/overlay_view_test_base.h"
+#include "chrome/browser/ash/arc/input_overlay/touch_injector.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/events/keycodes/keyboard_codes_posix.h"
+#include "ui/events/test/event_generator.h"
+#include "ui/gfx/geometry/point_f.h"
+#include "ui/views/view_utils.h"
+#include "ui/views/widget/widget.h"
+
+namespace arc::input_overlay {
+
+class TargetViewTest : public OverlayViewTestBase {
+ public:
+  TargetViewTest() = default;
+  ~TargetViewTest() override = default;
+
+  gfx::Point GetTargetCenter(TargetView* target) {
+    DCHECK(target);
+    return target->center_;
+  }
+
+  int GetTargetRadius(TargetView* target) {
+    DCHECK(target);
+    return target->GetCircleRadius();
+  }
+
+  TargetView* GetTargetView() {
+    auto* target_widget = GetTargetViewWidget();
+    if (!target_widget) {
+      return nullptr;
+    }
+    return views::AsViewClass<TargetView>(target_widget->GetContentsView());
+  }
+
+  // Convert the point in `TargetView` coordinates to screen coordinates.
+  gfx::Point GetPointInScreenFromTargetView(const gfx::Point& point) const {
+    DCHECK(touch_injector_);
+
+    const auto& bounds_origin = touch_injector_->content_bounds().origin();
+    gfx::Point point_in_screen = point;
+    point_in_screen.Offset(bounds_origin.x(), bounds_origin.y());
+    return point_in_screen;
+  }
+
+  // Verifies whether `touch_injector` has `expect_size` actions and the last
+  // action has `expect_position`.
+  void VerifyLastActionPosition(size_t expect_size,
+                                const gfx::Point& expect_position) {
+    DCHECK(touch_injector_);
+
+    // Verify action view size.
+    EXPECT_GE(expect_size, 1u);
+    EXPECT_EQ(expect_size, GetActionViewSize());
+
+    // Verify action size.
+    const auto& actions = touch_injector_->actions();
+    EXPECT_EQ(expect_size, actions.size());
+
+    // Verify last action position.
+    const auto* new_action = actions[expect_size - 1].get();
+    const auto& positions = new_action->touch_down_positions();
+    EXPECT_EQ(1u, positions.size());
+    EXPECT_EQ(gfx::PointF(expect_position), positions[0]);
+  }
+};
+
+TEST_F(TargetViewTest, TestMouseSupport) {
+  // Enter into the button placement mode and check mouse hover move and click.
+  PressAddButton();
+  auto* target_view = GetTargetView();
+  EXPECT_TRUE(target_view);
+
+  auto* event_generator = GetEventGenerator();
+  auto global_center = target_view->GetBoundsInScreen().CenterPoint();
+  event_generator->MoveMouseTo(global_center);
+  auto local_center = GetTargetCenter(target_view);
+  EXPECT_EQ(global_center, GetPointInScreenFromTargetView(local_center));
+
+  // Move mouse by `dx` and `dy`.
+  const int dx = 5;
+  const int dy = 10;
+  event_generator->MoveMouseBy(/*x=*/dx, /*y=*/dy);
+  global_center.Offset(/*delta_x=*/dx, /*delta_y=*/dy);
+  local_center.Offset(/*delta_x=*/dx, /*delta_y=*/dy);
+  EXPECT_EQ(local_center, GetTargetCenter(target_view));
+  EXPECT_EQ(global_center, GetPointInScreenFromTargetView(local_center));
+
+  const size_t action_view_size = GetActionViewSize();
+  // Mouse click to drop down the action.
+  event_generator->ClickLeftButton();
+  // Check if the action is dropped on the expected position.
+  VerifyLastActionPosition(action_view_size + 1,
+                           GetPointInScreenFromTargetView(local_center));
+}
+
+TEST_F(TargetViewTest, TestCenterClamp) {
+  // Enter into the button placement mode and check when mouse hover moved
+  // to outside of the window.
+  PressAddButton();
+  auto* target_view = GetTargetView();
+  EXPECT_TRUE(target_view);
+
+  auto* event_generator = GetEventGenerator();
+  event_generator->MoveMouseTo(target_view->GetBoundsInScreen().CenterPoint());
+  // Simulate moving mouse to the outside of the window on the left.
+  const auto content_bounds = touch_injector_->content_bounds();
+  for (int i = 0; i < content_bounds.width(); i++) {
+    event_generator->MoveMouseBy(/*x=*/-1, /*y=*/0);
+  }
+  // Stay in the button placement mode and the target center should still stay
+  // inside and show the complete circle.
+  target_view = GetTargetView();
+  EXPECT_TRUE(target_view);
+  EXPECT_EQ(GetTargetCenter(target_view).x(), GetTargetRadius(target_view));
+}
+
+TEST_F(TargetViewTest, TestKeyboardSupport) {
+  // Enter into the button placement mode.
+  PressAddButton();
+  EXPECT_TRUE(GetTargetView());
+
+  // Press a random key and it is still in the button placement mode.
+  auto* event_generator = GetEventGenerator();
+  event_generator->PressAndReleaseKey(ui::VKEY_A, ui::EF_NONE);
+  auto* target_view = GetTargetView();
+  EXPECT_TRUE(target_view);
+
+  // Press the key `left` twice to update the target center.
+  auto local_center = GetTargetCenter(target_view);
+  local_center.Offset(-2 * kArrowKeyMoveDistance, 0);
+  event_generator->PressKey(ui::VKEY_LEFT, ui::EF_NONE);
+  event_generator->PressKey(ui::VKEY_LEFT, ui::EF_NONE);
+  event_generator->ReleaseKey(ui::VKEY_LEFT, ui::EF_NONE);
+  target_view = GetTargetView();
+  EXPECT_TRUE(target_view);
+  EXPECT_EQ(local_center, GetTargetCenter(target_view));
+
+  // Press the key `enter` to place down the action.
+  size_t action_view_size = GetActionViewSize();
+  event_generator->PressAndReleaseKey(ui::VKEY_RETURN, ui::EF_NONE);
+  EXPECT_FALSE(GetTargetView());
+  VerifyLastActionPosition(action_view_size + 1,
+                           GetPointInScreenFromTargetView(local_center));
+
+  // Enter into the button placement mode again and check whether the key `esc`
+  // exits the button placement mode without adding anything.
+  PressAddButton();
+  EXPECT_TRUE(GetTargetView());
+  event_generator->PressAndReleaseKey(ui::VKEY_ESCAPE, ui::EF_NONE);
+  EXPECT_FALSE(GetTargetView());
+  EXPECT_EQ(action_view_size + 1, GetActionViewSize());
+}
+
+TEST_F(TargetViewTest, TestGestureSupport) {
+  // Enter into the button placement mode and test the gesture tap on the
+  // center.
+  PressAddButton();
+  auto* target_view = GetTargetView();
+  EXPECT_TRUE(target_view);
+  const size_t action_view_size = GetActionViewSize();
+  auto global_center = target_view->GetBoundsInScreen().CenterPoint();
+  GestureTapOn(target_view);
+  EXPECT_FALSE(GetTargetView());
+  // Check if the action is dropped on the expect position.
+  VerifyLastActionPosition(action_view_size + 1, global_center);
+
+  // Enter into the button placement mode and test the gesture scroll.
+  PressAddButton();
+  target_view = GetTargetView();
+  EXPECT_TRUE(target_view);
+  auto* event_generator = GetEventGenerator();
+  event_generator->PressTouch(global_center);
+  auto local_center = GetTargetCenter(target_view);
+  EXPECT_EQ(global_center, GetPointInScreenFromTargetView(local_center));
+
+  const int dx = 3;
+  const int dy = 4;
+  global_center.Offset(/*delta_x=*/dx, /*delta_y=*/dy);
+  local_center.Offset(/*delta_x=*/dx, /*delta_y=*/dy);
+  event_generator->MoveTouch(global_center);
+  global_center.Offset(/*delta_x=*/dx, /*delta_y=*/dy);
+  local_center.Offset(/*delta_x=*/dx, /*delta_y=*/dy);
+  // Touch move more than once to trigger scroll gesture.
+  event_generator->MoveTouch(global_center);
+  EXPECT_TRUE(GetTargetView());
+  EXPECT_EQ(local_center, GetTargetCenter(target_view));
+  EXPECT_EQ(global_center, GetPointInScreenFromTargetView(local_center));
+
+  event_generator->ReleaseTouch();
+  // Check if the action is dropped on the expected position.
+  VerifyLastActionPosition(action_view_size + 2,
+                           GetPointInScreenFromTargetView(local_center));
+}
+
+}  // namespace arc::input_overlay
diff --git a/chrome/browser/ash/arc/input_overlay/ui/ui_utils.cc b/chrome/browser/ash/arc/input_overlay/ui/ui_utils.cc
index e6f2b82..71dc70e 100644
--- a/chrome/browser/ash/arc/input_overlay/ui/ui_utils.cc
+++ b/chrome/browser/ash/arc/input_overlay/ui/ui_utils.cc
@@ -164,4 +164,24 @@
                                        opacity_percent);
 }
 
+bool OffsetPositionByArrowKey(ui::KeyboardCode key, gfx::Point& position) {
+  switch (key) {
+    case ui::VKEY_LEFT:
+      position.Offset(-kArrowKeyMoveDistance, 0);
+      break;
+    case ui::VKEY_RIGHT:
+      position.Offset(kArrowKeyMoveDistance, 0);
+      break;
+    case ui::VKEY_UP:
+      position.Offset(0, -kArrowKeyMoveDistance);
+      break;
+    case ui::VKEY_DOWN:
+      position.Offset(0, kArrowKeyMoveDistance);
+      break;
+    default:
+      return false;
+  }
+  return true;
+}
+
 }  // namespace arc::input_overlay
diff --git a/chrome/browser/ash/arc/input_overlay/ui/ui_utils.h b/chrome/browser/ash/arc/input_overlay/ui/ui_utils.h
index 8d9e361..ffd4219 100644
--- a/chrome/browser/ash/arc/input_overlay/ui/ui_utils.h
+++ b/chrome/browser/ash/arc/input_overlay/ui/ui_utils.h
@@ -9,12 +9,14 @@
 
 #include "third_party/skia/include/core/SkColor.h"
 #include "ui/events/keycodes/dom/dom_code.h"
+#include "ui/events/keycodes/keyboard_codes_posix.h"
 
 namespace aura {
 class Window;
 }  // namespace aura
 
 namespace gfx {
+class Point;
 class Rect;
 }  // namespace gfx
 
@@ -34,6 +36,9 @@
 // fully transparent and 1.0 corresponds to fully opaque.
 SkAlpha GetAlpha(float opacity_percent);
 
+// Update `position` according to `key` if `key` is arrow key.
+bool OffsetPositionByArrowKey(ui::KeyboardCode key, gfx::Point& position);
+
 }  // namespace arc::input_overlay
 
 #endif  // CHROME_BROWSER_ASH_ARC_INPUT_OVERLAY_UI_UI_UTILS_H_
diff --git a/chrome/browser/ash/arc/input_overlay/util.h b/chrome/browser/ash/arc/input_overlay/util.h
index 2846bfb5..7759d74 100644
--- a/chrome/browser/ash/arc/input_overlay/util.h
+++ b/chrome/browser/ash/arc/input_overlay/util.h
@@ -35,9 +35,6 @@
 class Action;
 class InputElement;
 
-// Arrow key move distance per key press event.
-constexpr int kArrowKeyMoveDistance = 2;
-
 // Gets the event flags for the modifier domcode. Return ui::DomCode::NONE if
 // `code` is not modifier DomCode.
 int ModifierDomCodeToEventFlag(ui::DomCode code);
diff --git a/chrome/browser/ash/crosapi/browser_manager.cc b/chrome/browser/ash/crosapi/browser_manager.cc
index 213608a..725495b 100644
--- a/chrome/browser/ash/crosapi/browser_manager.cc
+++ b/chrome/browser/ash/crosapi/browser_manager.cc
@@ -734,7 +734,8 @@
 
 bool BrowserManager::IsRunningOrWillRun() const {
   return state_ == State::RUNNING || state_ == State::STARTING ||
-         state_ == State::PREPARING_FOR_LAUNCH || state_ == State::TERMINATING;
+         state_ == State::PREPARING_FOR_LAUNCH ||
+         state_ == State::WAITING_OWNER_FETCH || state_ == State::TERMINATING;
 }
 
 bool BrowserManager::IsInitialized() const {
@@ -865,6 +866,7 @@
 
     case State::MOUNTING:
     case State::PREPARING_FOR_LAUNCH:
+    case State::WAITING_OWNER_FETCH:
     case State::STARTING:
       LOG(WARNING)
           << "Ensuring Lacros launch: already in the process of starting";
@@ -1128,7 +1130,7 @@
 
 void BrowserManager::StartWithLogFile(bool launching_at_login_screen,
                                       LaunchParamsFromBackground params) {
-  DCHECK_EQ(state_, State::PREPARING_FOR_LAUNCH);
+  CHECK_EQ(state_, State::WAITING_OWNER_FETCH);
 
   // Shutdown() might have been called after Start() posted the StartWithLogFile
   // task, so we need to check `shutdown_requested_` again.
@@ -1720,7 +1722,7 @@
   // executed in |InitializeAndStartIfNeeded| (we call |PrelaunchAtLoginScreen|
   // instead) and |StartWithLogFile|, because they required the user to be
   // logged in.
-  DCHECK_EQ(state_, State::PRE_LAUNCHED);
+  CHECK_EQ(state_, State::PRE_LAUNCHED);
   DCHECK(user_manager::UserManager::Get()->IsUserLoggedIn());
 
   // Ensure this isn't run multiple times.
@@ -1779,6 +1781,7 @@
 
 void BrowserManager::WaitForProfileAddedAndThen(base::OnceClosure cb) {
   DCHECK(!primary_profile_creation_waiter_);
+  CHECK_EQ(state_, State::WAITING_OWNER_FETCH);
   primary_profile_creation_waiter_ = PrimaryProfileCreationWaiter::WaitOrRun(
       g_browser_process->profile_manager(), std::move(cb));
 }
@@ -1786,6 +1789,8 @@
 void BrowserManager::WaitForDeviceOwnerFetchedAndThen(
     base::OnceClosure cb,
     bool launching_at_login_screen) {
+  CHECK(state_ == State::PRE_LAUNCHED || state_ == State::PREPARING_FOR_LAUNCH);
+  SetState(State::WAITING_OWNER_FETCH);
   device_ownership_waiter_called_ = true;
   device_ownership_waiter_->WaitForOwnershipFetched(std::move(cb),
                                                     launching_at_login_screen);
@@ -1793,6 +1798,7 @@
 
 void BrowserManager::OnLaunchParamsFetched(bool launching_at_login_screen,
                                            LaunchParamsFromBackground params) {
+  CHECK_EQ(state_, State::PREPARING_FOR_LAUNCH);
   WaitForDeviceOwnerFetchedAndThen(
       base::BindOnce(&BrowserManager::StartWithLogFile,
                      weak_factory_.GetWeakPtr(), launching_at_login_screen,
@@ -1801,6 +1807,7 @@
 }
 
 void BrowserManager::ResumeLaunchAfterProfileAdded() {
+  CHECK_EQ(state_, State::WAITING_OWNER_FETCH);
   // Execute actions that we couldn't run when pre-launching at login screen,
   // because they required the user to be logged in.
   PrepareLacrosPolicies();
@@ -2067,7 +2074,14 @@
       return;
 
     case State::PREPARING_FOR_LAUNCH:
-      LOG(WARNING) << "lacros-chrome is preparing for launching";
+      LOG(WARNING)
+          << "params for lacros-chrome are prepared on a background thread";
+      pending_actions_.PushOrCancel(std::move(action),
+                                    mojom::CreationResult::kBrowserNotRunning);
+      return;
+
+    case State::WAITING_OWNER_FETCH:
+      LOG(WARNING) << "lacros-chrome is waiting for device owner to be fetched";
       pending_actions_.PushOrCancel(std::move(action),
                                     mojom::CreationResult::kBrowserNotRunning);
       return;
diff --git a/chrome/browser/ash/crosapi/browser_manager.h b/chrome/browser/ash/crosapi/browser_manager.h
index 78966cd..05a58c0 100644
--- a/chrome/browser/ash/crosapi/browser_manager.h
+++ b/chrome/browser/ash/crosapi/browser_manager.h
@@ -421,10 +421,13 @@
     // Lacros-chrome is loaded and ready for launching.
     STOPPED,
 
-    // Params for the lacros-chrome are parepared on a background thread, and
-    // the device owner set up is being waited.
+    // Params for lacros-chrome are parepared on a background thread.
     PREPARING_FOR_LAUNCH,
 
+    // Lacros-chrome is waiting for device owner to be fetched after receiving
+    // params. For prelaunching, it also waits for profile to be added.
+    WAITING_OWNER_FETCH,
+
     // Lacros-chrome has been pre-launched at login screen, and it's waiting to
     // be unblocked post-login.
     PRE_LAUNCHED,
diff --git a/chrome/browser/ash/crosapi/field_trial_service_ash.cc b/chrome/browser/ash/crosapi/field_trial_service_ash.cc
index e2d30b5..d28554bc 100644
--- a/chrome/browser/ash/crosapi/field_trial_service_ash.cc
+++ b/chrome/browser/ash/crosapi/field_trial_service_ash.cc
@@ -9,17 +9,22 @@
 namespace {
 crosapi::mojom::FieldTrialGroupInfoPtr CreateFieldTrialGroupInfo(
     const std::string& trial_name,
-    const std::string& group_name,
-    bool is_overridden) {
+    const std::string& group_name) {
   auto info = crosapi::mojom::FieldTrialGroupInfo::New();
   info->trial_name = trial_name;
   info->group_name = group_name;
-  info->is_overridden = is_overridden;
   return info;
 }
 
 static crosapi::FieldTrialServiceAsh* g_field_trial_service_ash = nullptr;
 
+void OnFieldTrialGroupFinalizedCallback(const std::string& trial_name,
+                                        const std::string& group_name) {
+  if (g_field_trial_service_ash)
+    g_field_trial_service_ash->OnFieldTrialGroupFinalized(trial_name,
+                                                          group_name);
+}
+
 }  // namespace
 
 namespace crosapi {
@@ -54,8 +59,8 @@
   base::FieldTrialList::GetActiveFieldTrialGroups(&active_groups);
   std::vector<mojom::FieldTrialGroupInfoPtr> infos;
   for (const auto& group : active_groups) {
-    infos.push_back(CreateFieldTrialGroupInfo(
-        group.trial_name, group.group_name, group.is_overridden));
+    infos.push_back(
+        CreateFieldTrialGroupInfo(group.trial_name, group.group_name));
   }
   remote->OnFieldTrialGroupActivated(std::move(infos));
 
@@ -63,32 +68,19 @@
 }
 
 void FieldTrialServiceAsh::OnFieldTrialGroupFinalized(
-    const base::FieldTrial& trial,
+    const std::string& trial_name,
     const std::string& group_name) {
   if (!content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)) {
     content::GetUIThreadTaskRunner({})->PostTask(
-        FROM_HERE, base::BindOnce(
-                       [](const std::string& trial_name,
-                          const std::string& group_name, bool is_overridden) {
-                         if (g_field_trial_service_ash) {
-                           g_field_trial_service_ash->FieldTrialActivated(
-                               trial_name, group_name, is_overridden);
-                         }
-                       },
-                       trial.trial_name(), group_name, trial.IsOverridden()));
+        FROM_HERE, base::BindOnce(&OnFieldTrialGroupFinalizedCallback,
+                                  trial_name, group_name));
     return;
   }
-  FieldTrialActivated(trial.trial_name(), group_name, trial.IsOverridden());
-}
 
-void FieldTrialServiceAsh::FieldTrialActivated(const std::string& trial_name,
-                                               const std::string& group_name,
-                                               bool is_overridden) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   for (auto& observer : observers_) {
     std::vector<mojom::FieldTrialGroupInfoPtr> infos;
-    infos.push_back(
-        CreateFieldTrialGroupInfo(trial_name, group_name, is_overridden));
+    infos.push_back(CreateFieldTrialGroupInfo(trial_name, group_name));
     observer->OnFieldTrialGroupActivated(std::move(infos));
   }
 }
diff --git a/chrome/browser/ash/crosapi/field_trial_service_ash.h b/chrome/browser/ash/crosapi/field_trial_service_ash.h
index 478fd5a19..1aa4d118 100644
--- a/chrome/browser/ash/crosapi/field_trial_service_ash.h
+++ b/chrome/browser/ash/crosapi/field_trial_service_ash.h
@@ -28,14 +28,10 @@
       mojo::PendingRemote<mojom::FieldTrialObserver> observer) override;
 
   // FieldTrialList::Observer:
-  void OnFieldTrialGroupFinalized(const base::FieldTrial& trial,
+  void OnFieldTrialGroupFinalized(const std::string& trial_name,
                                   const std::string& group_name) override;
 
  private:
-  void FieldTrialActivated(const std::string& trial_name,
-                           const std::string& group_name,
-                           bool is_overridden);
-
   // Support any number of connections.
   mojo::ReceiverSet<mojom::FieldTrialService> receivers_;
 
diff --git a/chrome/browser/ash/crosapi/field_trial_service_ash_unittest.cc b/chrome/browser/ash/crosapi/field_trial_service_ash_unittest.cc
index 52d3f03e..ab218cb 100644
--- a/chrome/browser/ash/crosapi/field_trial_service_ash_unittest.cc
+++ b/chrome/browser/ash/crosapi/field_trial_service_ash_unittest.cc
@@ -6,7 +6,6 @@
 
 #include "base/metrics/field_trial.h"
 #include "base/test/bind.h"
-#include "base/test/scoped_feature_list.h"
 #include "content/public/test/browser_task_environment.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -19,19 +18,15 @@
 constexpr char kGroupName[] = "Default";
 
 void CreateAndActivateFieldTrial(const std::string& trial_name,
-                                 const std::string& group_name,
-                                 bool is_overridden) {
-  base::FieldTrialList::CreateFieldTrial(
-      trial_name, group_name, /*is_low_anonymity=*/false, is_overridden)
-      ->Activate();
+                                 const std::string& group_name) {
+  base::FieldTrialList::CreateFieldTrial(trial_name, group_name)->Activate();
 }
 
 void VerifyFieldTrial(const mojom::FieldTrialGroupInfoPtr& info,
                       const std::string& trial_name,
-                      const std::string& group_name,
-                      bool is_overridden) {
-  EXPECT_EQ(std::tie(trial_name, group_name, is_overridden),
-            std::tie(info->trial_name, info->group_name, info->is_overridden));
+                      const std::string& group_name) {
+  EXPECT_EQ(trial_name, info->trial_name);
+  EXPECT_EQ(group_name, info->group_name);
 }
 
 class TestFieldTrialObserver : public mojom::FieldTrialObserver {
@@ -69,31 +64,24 @@
   FieldTrialServiceAshTest& operator=(const FieldTrialServiceAshTest&) = delete;
   ~FieldTrialServiceAshTest() override = default;
 
-  void SetUp() override {
-    scoped_features_.InitWithEmptyFeatureAndFieldTrialLists();
-  }
-
  protected:
   TestFieldTrialObserver observer_;
 
  private:
   content::BrowserTaskEnvironment task_environment;
-  base::test::ScopedFeatureList scoped_features_;
 };
 
 TEST_F(FieldTrialServiceAshTest, SendInitialFieldTrialsAndUpdate) {
-  CreateAndActivateFieldTrial(kTrialName1, kGroupName, /*is_overridden=*/true);
-  CreateAndActivateFieldTrial(kTrialName2, kGroupName, /*is_overridden=*/false);
+  CreateAndActivateFieldTrial(kTrialName1, kGroupName);
+  CreateAndActivateFieldTrial(kTrialName2, kGroupName);
 
   // Send initial field trials.
   base::RunLoop run_loop1;
   observer_.set_on_activate(base::BindLambdaForTesting(
       [&](const std::vector<mojom::FieldTrialGroupInfoPtr>& infos) {
         ASSERT_EQ(2u, infos.size());
-        VerifyFieldTrial(infos[0], kTrialName1, kGroupName,
-                         /*is_overridden=*/true);
-        VerifyFieldTrial(infos[1], kTrialName2, kGroupName,
-                         /*is_overridden=*/false);
+        VerifyFieldTrial(infos[0], kTrialName1, kGroupName);
+        VerifyFieldTrial(infos[1], kTrialName2, kGroupName);
         run_loop1.Quit();
         // Test won't proceed until this is called.
       }));
@@ -102,13 +90,12 @@
   run_loop1.Run();
 
   // Send field trial updates.
-  CreateAndActivateFieldTrial(kTrialName3, kGroupName, /*is_overridden=*/false);
+  CreateAndActivateFieldTrial(kTrialName3, kGroupName);
   base::RunLoop run_loop2;
   observer_.set_on_activate(base::BindLambdaForTesting(
       [&](const std::vector<mojom::FieldTrialGroupInfoPtr>& infos) {
         EXPECT_EQ(1u, infos.size());
-        VerifyFieldTrial(infos[0], kTrialName3, kGroupName,
-                         /*is_overridden=*/false);
+        VerifyFieldTrial(infos[0], kTrialName3, kGroupName);
         run_loop2.Quit();
         // Test won't exit until this is called.
       }));
diff --git a/chrome/browser/ash/events/event_rewriter_unittest.cc b/chrome/browser/ash/events/event_rewriter_unittest.cc
index 3eeca3d..83b395b 100644
--- a/chrome/browser/ash/events/event_rewriter_unittest.cc
+++ b/chrome/browser/ash/events/event_rewriter_unittest.cc
@@ -559,6 +559,13 @@
           ui::DomKey::AUDIO_VOLUME_UP, ui::VKEY_VOLUME_UP, flags};
 }
 
+constexpr TestKeyEvent PrivacyScreenTogglePressed(
+    ui::EventFlags flags = ui::EF_NONE) {
+  return {ui::ET_KEY_PRESSED, ui::DomCode::PRIVACY_SCREEN_TOGGLE,
+          ui::DomKey::F12,  // no dom-key for PRIVACY_SCREEN_TOGGLE.
+          ui::VKEY_PRIVACY_SCREEN_TOGGLE, flags};
+}
+
 // Hereafter, numpad key events.
 
 constexpr TestKeyEvent Numpad0Pressed(ui::EventFlags flags = ui::EF_NONE) {
@@ -856,6 +863,27 @@
     kExternalGenericKeyboard, kExternalAppleKeyboard,
 };
 
+// Wilco keyboard configs
+
+constexpr TestKeyboard kWilco1_0Keyboard{
+    "Wilco Keyboard",
+    kKbdTopRowLayoutWilcoTag,
+    ui::INPUT_DEVICE_INTERNAL,
+    /*has_custom_top_row=*/false,
+};
+
+constexpr TestKeyboard kWilco1_5Keyboard{
+    "Drallion Keyboard",
+    kKbdTopRowLayoutDrallionTag,
+    ui::INPUT_DEVICE_INTERNAL,
+    /*has_custom_top_row=*/false,
+};
+
+constexpr TestKeyboard kWilcoKeyboardVariants[] = {
+    kWilco1_0Keyboard,
+    kWilco1_5Keyboard,
+};
+
 // Table entry for simple single key event rewriting tests.
 struct KeyTestCase {
   ui::EventType type;
@@ -1007,7 +1035,6 @@
       int_pref->SetValue(static_cast<int>(remap_to));
       return;
     }
-
     if (remap_from == remap_to) {
       keyboard_settings->modifier_remappings.erase(remap_from);
       return;
@@ -1065,6 +1092,12 @@
     return keyboard;
   }
 
+  void SetExtensionCommands(
+      std::optional<base::flat_set<std::pair<ui::KeyboardCode, int>>>
+          commands) {
+    delegate_->SetExtensionCommandsOverrideForTesting(std::move(commands));
+  }
+
   std::vector<std::unique_ptr<ui::Event>> TakeEvents() {
     return sink_.TakeEvents();
   }
@@ -2999,531 +3032,242 @@
             RunRewriter(F12Pressed(ui::EF_COMMAND_DOWN)));
 }
 
-// TODO(crbug.com/1179893): Remove once the feature is enabled permanently.
-TEST_F(EventRewriterTest, TestRewriteFunctionKeysWilcoLayoutsDeprecated) {
-  Preferences::RegisterProfilePrefs(prefs()->registry());
-  scoped_feature_list_.InitAndDisableFeature(
-      ::features::kImprovedKeyboardShortcuts);
-  std::vector<KeyTestCase> wilco_standard_tests({
-      // The number row should be rewritten as the F<number> row with Search
-      // key.
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_1, ui::DomCode::DIGIT1, ui::EF_COMMAND_DOWN,
-        ui::DomKey::Constant<'1'>::Character},
-       {ui::VKEY_F1, ui::DomCode::F1, ui::EF_NONE, ui::DomKey::F1}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_2, ui::DomCode::DIGIT2, ui::EF_COMMAND_DOWN,
-        ui::DomKey::Constant<'2'>::Character},
-       {ui::VKEY_F2, ui::DomCode::F2, ui::EF_NONE, ui::DomKey::F2}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_3, ui::DomCode::DIGIT3, ui::EF_COMMAND_DOWN,
-        ui::DomKey::Constant<'3'>::Character},
-       {ui::VKEY_F3, ui::DomCode::F3, ui::EF_NONE, ui::DomKey::F3}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_4, ui::DomCode::DIGIT4, ui::EF_COMMAND_DOWN,
-        ui::DomKey::Constant<'4'>::Character},
-       {ui::VKEY_F4, ui::DomCode::F4, ui::EF_NONE, ui::DomKey::F4}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_5, ui::DomCode::DIGIT5, ui::EF_COMMAND_DOWN,
-        ui::DomKey::Constant<'5'>::Character},
-       {ui::VKEY_F5, ui::DomCode::F5, ui::EF_NONE, ui::DomKey::F5}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_6, ui::DomCode::DIGIT6, ui::EF_COMMAND_DOWN,
-        ui::DomKey::Constant<'6'>::Character},
-       {ui::VKEY_F6, ui::DomCode::F6, ui::EF_NONE, ui::DomKey::F6}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_7, ui::DomCode::DIGIT7, ui::EF_COMMAND_DOWN,
-        ui::DomKey::Constant<'7'>::Character},
-       {ui::VKEY_F7, ui::DomCode::F7, ui::EF_NONE, ui::DomKey::F7}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_8, ui::DomCode::DIGIT8, ui::EF_COMMAND_DOWN,
-        ui::DomKey::Constant<'8'>::Character},
-       {ui::VKEY_F8, ui::DomCode::F8, ui::EF_NONE, ui::DomKey::F8}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_9, ui::DomCode::DIGIT9, ui::EF_COMMAND_DOWN,
-        ui::DomKey::Constant<'9'>::Character},
-       {ui::VKEY_F9, ui::DomCode::F9, ui::EF_NONE, ui::DomKey::F9}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_0, ui::DomCode::DIGIT0, ui::EF_COMMAND_DOWN,
-        ui::DomKey::Constant<'0'>::Character},
-       {ui::VKEY_F10, ui::DomCode::F10, ui::EF_NONE, ui::DomKey::F10}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_OEM_MINUS, ui::DomCode::MINUS, ui::EF_COMMAND_DOWN,
-        ui::DomKey::Constant<'-'>::Character},
-       {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_OEM_PLUS, ui::DomCode::EQUAL, ui::EF_COMMAND_DOWN,
-        ui::DomKey::Constant<'='>::Character},
-       {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12}},
-  });
-}
-
 TEST_F(EventRewriterTest, TestRewriteFunctionKeysWilcoLayouts) {
   Preferences::RegisterProfilePrefs(prefs()->registry());
 
-  std::vector<KeyTestCase> wilco_standard_tests({
-      // F1 -> F1, Search + F1 -> Back
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_F1, ui::DomCode::F1, ui::EF_NONE, ui::DomKey::F1},
-       {ui::VKEY_F1, ui::DomCode::F1, ui::EF_NONE, ui::DomKey::F1}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_F1, ui::DomCode::F1, ui::EF_COMMAND_DOWN, ui::DomKey::F1},
-       {ui::VKEY_BROWSER_BACK, ui::DomCode::BROWSER_BACK, ui::EF_NONE,
-        ui::DomKey::BROWSER_BACK}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_F1, ui::DomCode::F1, ui::EF_CONTROL_DOWN, ui::DomKey::F1},
-       {ui::VKEY_F1, ui::DomCode::F1, ui::EF_CONTROL_DOWN, ui::DomKey::F1}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_F1, ui::DomCode::F1, ui::EF_ALT_DOWN, ui::DomKey::F1},
-       {ui::VKEY_F1, ui::DomCode::F1, ui::EF_ALT_DOWN, ui::DomKey::F1}},
-      // F2 -> F2, Search + F2 -> Refresh
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_F2, ui::DomCode::F2, ui::EF_NONE, ui::DomKey::F2},
-       {ui::VKEY_F2, ui::DomCode::F2, ui::EF_NONE, ui::DomKey::F2}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_F2, ui::DomCode::F2, ui::EF_COMMAND_DOWN, ui::DomKey::F2},
-       {ui::VKEY_BROWSER_REFRESH, ui::DomCode::BROWSER_REFRESH, ui::EF_NONE,
-        ui::DomKey::BROWSER_REFRESH}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_F2, ui::DomCode::F2, ui::EF_CONTROL_DOWN, ui::DomKey::F2},
-       {ui::VKEY_F2, ui::DomCode::F2, ui::EF_CONTROL_DOWN, ui::DomKey::F2}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_F2, ui::DomCode::F2, ui::EF_ALT_DOWN, ui::DomKey::F2},
-       {ui::VKEY_F2, ui::DomCode::F2, ui::EF_ALT_DOWN, ui::DomKey::F2}},
-      // F3 -> F3, Search + F3 -> Zoom (aka Fullscreen)
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_F3, ui::DomCode::F3, ui::EF_NONE, ui::DomKey::F3},
-       {ui::VKEY_F3, ui::DomCode::F3, ui::EF_NONE, ui::DomKey::F3}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_F3, ui::DomCode::F3, ui::EF_COMMAND_DOWN, ui::DomKey::F3},
-       {ui::VKEY_ZOOM, ui::DomCode::ZOOM_TOGGLE, ui::EF_NONE,
-        ui::DomKey::ZOOM_TOGGLE}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_F3, ui::DomCode::F3, ui::EF_CONTROL_DOWN, ui::DomKey::F3},
-       {ui::VKEY_F3, ui::DomCode::F3, ui::EF_CONTROL_DOWN, ui::DomKey::F3}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_F3, ui::DomCode::F3, ui::EF_ALT_DOWN, ui::DomKey::F3},
-       {ui::VKEY_F3, ui::DomCode::F3, ui::EF_ALT_DOWN, ui::DomKey::F3}},
-      // F4 -> F4, Search + F4 -> Launch App 1
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_F4, ui::DomCode::F4, ui::EF_NONE, ui::DomKey::F4},
-       {ui::VKEY_F4, ui::DomCode::F4, ui::EF_NONE, ui::DomKey::F4}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_F4, ui::DomCode::F4, ui::EF_COMMAND_DOWN, ui::DomKey::F4},
-       {ui::VKEY_MEDIA_LAUNCH_APP1, ui::DomCode::F4, ui::EF_NONE,
-        ui::DomKey::F4}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_F4, ui::DomCode::F4, ui::EF_CONTROL_DOWN, ui::DomKey::F4},
-       {ui::VKEY_F4, ui::DomCode::F4, ui::EF_CONTROL_DOWN, ui::DomKey::F4}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_F4, ui::DomCode::F4, ui::EF_ALT_DOWN, ui::DomKey::F4},
-       {ui::VKEY_F4, ui::DomCode::F4, ui::EF_ALT_DOWN, ui::DomKey::F4}},
-      // F5 -> F5, Search + F5 -> Brightness down
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_F5, ui::DomCode::F5, ui::EF_NONE, ui::DomKey::F5},
-       {ui::VKEY_F5, ui::DomCode::F5, ui::EF_NONE, ui::DomKey::F5}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_F5, ui::DomCode::F5, ui::EF_COMMAND_DOWN, ui::DomKey::F5},
-       {ui::VKEY_BRIGHTNESS_DOWN, ui::DomCode::BRIGHTNESS_DOWN, ui::EF_NONE,
-        ui::DomKey::BRIGHTNESS_DOWN}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_F5, ui::DomCode::F5, ui::EF_CONTROL_DOWN, ui::DomKey::F5},
-       {ui::VKEY_F5, ui::DomCode::F5, ui::EF_CONTROL_DOWN, ui::DomKey::F5}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_F5, ui::DomCode::F5, ui::EF_ALT_DOWN, ui::DomKey::F5},
-       {ui::VKEY_F5, ui::DomCode::F5, ui::EF_ALT_DOWN, ui::DomKey::F5}},
-      // F6 -> F6, Search + F6 -> Brightness up
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_F6, ui::DomCode::F6, ui::EF_NONE, ui::DomKey::F6},
-       {ui::VKEY_F6, ui::DomCode::F6, ui::EF_NONE, ui::DomKey::F6}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_F6, ui::DomCode::F6, ui::EF_COMMAND_DOWN, ui::DomKey::F6},
-       {ui::VKEY_BRIGHTNESS_UP, ui::DomCode::BRIGHTNESS_UP, ui::EF_NONE,
-        ui::DomKey::BRIGHTNESS_UP}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_F6, ui::DomCode::F6, ui::EF_CONTROL_DOWN, ui::DomKey::F6},
-       {ui::VKEY_F6, ui::DomCode::F6, ui::EF_CONTROL_DOWN, ui::DomKey::F6}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_F6, ui::DomCode::F6, ui::EF_ALT_DOWN, ui::DomKey::F6},
-       {ui::VKEY_F6, ui::DomCode::F6, ui::EF_ALT_DOWN, ui::DomKey::F6}},
-      // F7 -> F7, Search + F7 -> Volume mute
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_F7, ui::DomCode::F7, ui::EF_NONE, ui::DomKey::F7},
-       {ui::VKEY_F7, ui::DomCode::F7, ui::EF_NONE, ui::DomKey::F7}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_F7, ui::DomCode::F7, ui::EF_COMMAND_DOWN, ui::DomKey::F7},
-       {ui::VKEY_VOLUME_MUTE, ui::DomCode::VOLUME_MUTE, ui::EF_NONE,
-        ui::DomKey::AUDIO_VOLUME_MUTE}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_F7, ui::DomCode::F7, ui::EF_CONTROL_DOWN, ui::DomKey::F7},
-       {ui::VKEY_F7, ui::DomCode::F7, ui::EF_CONTROL_DOWN, ui::DomKey::F7}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_F7, ui::DomCode::F7, ui::EF_ALT_DOWN, ui::DomKey::F7},
-       {ui::VKEY_F7, ui::DomCode::F7, ui::EF_ALT_DOWN, ui::DomKey::F7}},
-      // F8 -> F8, Search + F8 -> Volume Down
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_F8, ui::DomCode::F8, ui::EF_NONE, ui::DomKey::F8},
-       {ui::VKEY_F8, ui::DomCode::F8, ui::EF_NONE, ui::DomKey::F8}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_F8, ui::DomCode::F8, ui::EF_COMMAND_DOWN, ui::DomKey::F8},
-       {ui::VKEY_VOLUME_DOWN, ui::DomCode::VOLUME_DOWN, ui::EF_NONE,
-        ui::DomKey::AUDIO_VOLUME_DOWN}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_F8, ui::DomCode::F8, ui::EF_CONTROL_DOWN, ui::DomKey::F8},
-       {ui::VKEY_F8, ui::DomCode::F8, ui::EF_CONTROL_DOWN, ui::DomKey::F8}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_F8, ui::DomCode::F8, ui::EF_ALT_DOWN, ui::DomKey::F8},
-       {ui::VKEY_F8, ui::DomCode::F8, ui::EF_ALT_DOWN, ui::DomKey::F8}},
-      // F9 -> F9, Search + F9 -> Volume Up
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_F9, ui::DomCode::F9, ui::EF_NONE, ui::DomKey::F9},
-       {ui::VKEY_F9, ui::DomCode::F9, ui::EF_NONE, ui::DomKey::F9}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_F9, ui::DomCode::F9, ui::EF_COMMAND_DOWN, ui::DomKey::F9},
-       {ui::VKEY_VOLUME_UP, ui::DomCode::VOLUME_UP, ui::EF_NONE,
-        ui::DomKey::AUDIO_VOLUME_UP}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_F9, ui::DomCode::F9, ui::EF_CONTROL_DOWN, ui::DomKey::F9},
-       {ui::VKEY_F9, ui::DomCode::F9, ui::EF_CONTROL_DOWN, ui::DomKey::F9}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_F9, ui::DomCode::F9, ui::EF_ALT_DOWN, ui::DomKey::F9},
-       {ui::VKEY_F9, ui::DomCode::F9, ui::EF_ALT_DOWN, ui::DomKey::F9}},
-      // F10 -> F10, Search + F10 -> F10
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_F10, ui::DomCode::F10, ui::EF_NONE, ui::DomKey::F10},
-       {ui::VKEY_F10, ui::DomCode::F10, ui::EF_NONE, ui::DomKey::F10}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_F10, ui::DomCode::F10, ui::EF_COMMAND_DOWN, ui::DomKey::F10},
-       {ui::VKEY_F10, ui::DomCode::F10, ui::EF_NONE, ui::DomKey::F10}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_F10, ui::DomCode::F10, ui::EF_CONTROL_DOWN, ui::DomKey::F10},
-       {ui::VKEY_F10, ui::DomCode::F10, ui::EF_CONTROL_DOWN, ui::DomKey::F10}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_F10, ui::DomCode::F10, ui::EF_ALT_DOWN, ui::DomKey::F10},
-       {ui::VKEY_F10, ui::DomCode::F10, ui::EF_ALT_DOWN, ui::DomKey::F10}},
-      // F11 -> F11, Search + F11 -> F11
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11},
-       {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_F11, ui::DomCode::F11, ui::EF_COMMAND_DOWN, ui::DomKey::F11},
-       {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_F11, ui::DomCode::F11, ui::EF_CONTROL_DOWN, ui::DomKey::F11},
-       {ui::VKEY_F11, ui::DomCode::F11, ui::EF_CONTROL_DOWN, ui::DomKey::F11}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_F11, ui::DomCode::F11, ui::EF_ALT_DOWN, ui::DomKey::F11},
-       {ui::VKEY_F11, ui::DomCode::F11, ui::EF_ALT_DOWN, ui::DomKey::F11}},
-      // F12 -> F12
-      // Search + F12 differs between Wilco devices so it is tested separately.
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12},
-       {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_F12, ui::DomCode::F12, ui::EF_CONTROL_DOWN, ui::DomKey::F12},
-       {ui::VKEY_F12, ui::DomCode::F12, ui::EF_CONTROL_DOWN, ui::DomKey::F12}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_F12, ui::DomCode::F12, ui::EF_ALT_DOWN, ui::DomKey::F12},
-       {ui::VKEY_F12, ui::DomCode::F12, ui::EF_ALT_DOWN, ui::DomKey::F12}},
-      // The number row should not be rewritten without Search key.
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_1, ui::DomCode::DIGIT1, ui::EF_NONE,
-        ui::DomKey::Constant<'1'>::Character},
-       {ui::VKEY_1, ui::DomCode::DIGIT1, ui::EF_NONE,
-        ui::DomKey::Constant<'1'>::Character}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_2, ui::DomCode::DIGIT2, ui::EF_NONE,
-        ui::DomKey::Constant<'2'>::Character},
-       {ui::VKEY_2, ui::DomCode::DIGIT2, ui::EF_NONE,
-        ui::DomKey::Constant<'2'>::Character}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_3, ui::DomCode::DIGIT3, ui::EF_NONE,
-        ui::DomKey::Constant<'3'>::Character},
-       {ui::VKEY_3, ui::DomCode::DIGIT3, ui::EF_NONE,
-        ui::DomKey::Constant<'3'>::Character}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_4, ui::DomCode::DIGIT4, ui::EF_NONE,
-        ui::DomKey::Constant<'4'>::Character},
-       {ui::VKEY_4, ui::DomCode::DIGIT4, ui::EF_NONE,
-        ui::DomKey::Constant<'4'>::Character}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_5, ui::DomCode::DIGIT5, ui::EF_NONE,
-        ui::DomKey::Constant<'5'>::Character},
-       {ui::VKEY_5, ui::DomCode::DIGIT5, ui::EF_NONE,
-        ui::DomKey::Constant<'5'>::Character}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_6, ui::DomCode::DIGIT6, ui::EF_NONE,
-        ui::DomKey::Constant<'6'>::Character},
-       {ui::VKEY_6, ui::DomCode::DIGIT6, ui::EF_NONE,
-        ui::DomKey::Constant<'6'>::Character}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_7, ui::DomCode::DIGIT7, ui::EF_NONE,
-        ui::DomKey::Constant<'7'>::Character},
-       {ui::VKEY_7, ui::DomCode::DIGIT7, ui::EF_NONE,
-        ui::DomKey::Constant<'7'>::Character}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_8, ui::DomCode::DIGIT8, ui::EF_NONE,
-        ui::DomKey::Constant<'8'>::Character},
-       {ui::VKEY_8, ui::DomCode::DIGIT8, ui::EF_NONE,
-        ui::DomKey::Constant<'8'>::Character}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_9, ui::DomCode::DIGIT9, ui::EF_NONE,
-        ui::DomKey::Constant<'9'>::Character},
-       {ui::VKEY_9, ui::DomCode::DIGIT9, ui::EF_NONE,
-        ui::DomKey::Constant<'9'>::Character}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_0, ui::DomCode::DIGIT0, ui::EF_NONE,
-        ui::DomKey::Constant<'0'>::Character},
-       {ui::VKEY_0, ui::DomCode::DIGIT0, ui::EF_NONE,
-        ui::DomKey::Constant<'0'>::Character}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_OEM_MINUS, ui::DomCode::MINUS, ui::EF_NONE,
-        ui::DomKey::Constant<'-'>::Character},
-       {ui::VKEY_OEM_MINUS, ui::DomCode::MINUS, ui::EF_NONE,
-        ui::DomKey::Constant<'-'>::Character}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_OEM_PLUS, ui::DomCode::EQUAL, ui::EF_NONE,
-        ui::DomKey::Constant<'='>::Character},
-       {ui::VKEY_OEM_PLUS, ui::DomCode::EQUAL, ui::EF_NONE,
-        ui::DomKey::Constant<'='>::Character}},
-  });
+  for (const auto& keyboard : kWilcoKeyboardVariants) {
+    SCOPED_TRACE(keyboard.name);
+    SetUpKeyboard(keyboard);
 
-  KeyTestCase wilco_1_test =
-      // Search + F12 -> Ctrl + Zoom (aka Fullscreen) (Display toggle)
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_F12, ui::DomCode::F12, ui::EF_COMMAND_DOWN, ui::DomKey::F12},
-       {ui::VKEY_ZOOM, ui::DomCode::F12, ui::EF_CONTROL_DOWN, ui::DomKey::F12}};
+    // F1 -> F1, Search + F1 -> Back
+    EXPECT_EQ(F1Pressed(), RunRewriter(F1Pressed()));
+    EXPECT_EQ(BrowserBackPressed(),
+              RunRewriter(F1Pressed(ui::EF_COMMAND_DOWN)));
+    EXPECT_EQ(F1Pressed(ui::EF_CONTROL_DOWN),
+              RunRewriter(F1Pressed(ui::EF_CONTROL_DOWN)));
+    EXPECT_EQ(F1Pressed(ui::EF_ALT_DOWN),
+              RunRewriter(F1Pressed(ui::EF_ALT_DOWN)));
 
-  KeyTestCase drallion_test_no_privacy_screen =
-      // Search + F12 -> F12 (Privacy screen not supported)
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_F12, ui::DomCode::F12, ui::EF_COMMAND_DOWN, ui::DomKey::F12},
-       {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12}};
+    // F2 -> F2, Search + F2 -> Refresh
+    EXPECT_EQ(F2Pressed(), RunRewriter(F2Pressed()));
+    EXPECT_EQ(BrowserRefreshPressed(),
+              RunRewriter(F2Pressed(ui::EF_COMMAND_DOWN)));
+    EXPECT_EQ(F2Pressed(ui::EF_CONTROL_DOWN),
+              RunRewriter(F2Pressed(ui::EF_CONTROL_DOWN)));
+    EXPECT_EQ(F2Pressed(ui::EF_ALT_DOWN),
+              RunRewriter(F2Pressed(ui::EF_ALT_DOWN)));
 
-  KeyTestCase drallion_test_privacy_screen =
-      // F12 -> F12, Search + F12 -> Privacy Screen Toggle
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_F12, ui::DomCode::F12, ui::EF_COMMAND_DOWN, ui::DomKey::F12},
-       {ui::VKEY_PRIVACY_SCREEN_TOGGLE, ui::DomCode::PRIVACY_SCREEN_TOGGLE,
-        ui::EF_NONE, ui::DomKey::F12}};
+    // F3 -> F3, Search + F3 -> Zoom (aka Fullscreen)
+    EXPECT_EQ(F3Pressed(), RunRewriter(F3Pressed()));
+    EXPECT_EQ(ZoomTogglePressed(), RunRewriter(F3Pressed(ui::EF_COMMAND_DOWN)));
+    EXPECT_EQ(F3Pressed(ui::EF_CONTROL_DOWN),
+              RunRewriter(F3Pressed(ui::EF_CONTROL_DOWN)));
+    EXPECT_EQ(F3Pressed(ui::EF_ALT_DOWN),
+              RunRewriter(F3Pressed(ui::EF_ALT_DOWN)));
 
-  // Set keyboard layout to Wilco 1.0
-  SetupKeyboard("Wilco Keyboard", kKbdTopRowLayoutWilcoTag);
-  // Standard key tests using Wilco 1.0 keyboard
-  for (const auto& test : wilco_standard_tests)
-    CheckKeyTestCase(source(), test);
-  CheckKeyTestCase(source(), wilco_1_test);
+    // F4 -> F4, Search + F4 -> Launch App 1
+    EXPECT_EQ(F4Pressed(), RunRewriter(F4Pressed()));
+    EXPECT_EQ((TestKeyEvent{ui::ET_KEY_PRESSED, ui::DomCode::F4, ui::DomKey::F4,
+                            ui::VKEY_MEDIA_LAUNCH_APP1, ui::EF_NONE}),
+              RunRewriter(F4Pressed(ui::EF_COMMAND_DOWN)));
+    EXPECT_EQ(F4Pressed(ui::EF_CONTROL_DOWN),
+              RunRewriter(F4Pressed(ui::EF_CONTROL_DOWN)));
+    EXPECT_EQ(F4Pressed(ui::EF_ALT_DOWN),
+              RunRewriter(F4Pressed(ui::EF_ALT_DOWN)));
 
-  // Set keyboard layout to Drallion (Wilco 1.5)
-  SetupKeyboard("Drallion Keyboard", kKbdTopRowLayoutDrallionTag);
+    // F5 -> F5, Search + F5 -> Brightness down
+    EXPECT_EQ(F5Pressed(), RunRewriter(F5Pressed()));
+    EXPECT_EQ(BrightnessDownPressed(),
+              RunRewriter(F5Pressed(ui::EF_COMMAND_DOWN)));
+    EXPECT_EQ(F5Pressed(ui::EF_CONTROL_DOWN),
+              RunRewriter(F5Pressed(ui::EF_CONTROL_DOWN)));
+    EXPECT_EQ(F5Pressed(ui::EF_ALT_DOWN),
+              RunRewriter(F5Pressed(ui::EF_ALT_DOWN)));
 
-  // Run key tests using Drallion keyboard layout (no privacy screen)
+    // F6 -> F6, Search + F6 -> Brightness up
+    EXPECT_EQ(F6Pressed(), RunRewriter(F6Pressed()));
+    EXPECT_EQ(BrightnessUpPressed(),
+              RunRewriter(F6Pressed(ui::EF_COMMAND_DOWN)));
+    EXPECT_EQ(F6Pressed(ui::EF_CONTROL_DOWN),
+              RunRewriter(F6Pressed(ui::EF_CONTROL_DOWN)));
+    EXPECT_EQ(F6Pressed(ui::EF_ALT_DOWN),
+              RunRewriter(F6Pressed(ui::EF_ALT_DOWN)));
+
+    // F7 -> F7, Search + F7 -> Volume mute
+    EXPECT_EQ(F7Pressed(), RunRewriter(F7Pressed()));
+    EXPECT_EQ(VolumeMutePressed(), RunRewriter(F7Pressed(ui::EF_COMMAND_DOWN)));
+    EXPECT_EQ(F7Pressed(ui::EF_CONTROL_DOWN),
+              RunRewriter(F7Pressed(ui::EF_CONTROL_DOWN)));
+    EXPECT_EQ(F7Pressed(ui::EF_ALT_DOWN),
+              RunRewriter(F7Pressed(ui::EF_ALT_DOWN)));
+
+    // F8 -> F8, Search + F8 -> Volume Down
+    EXPECT_EQ(F8Pressed(), RunRewriter(F8Pressed()));
+    EXPECT_EQ(VolumeDownPressed(), RunRewriter(F8Pressed(ui::EF_COMMAND_DOWN)));
+    EXPECT_EQ(F8Pressed(ui::EF_CONTROL_DOWN),
+              RunRewriter(F8Pressed(ui::EF_CONTROL_DOWN)));
+    EXPECT_EQ(F8Pressed(ui::EF_ALT_DOWN),
+              RunRewriter(F8Pressed(ui::EF_ALT_DOWN)));
+
+    // F9 -> F9, Search + F9 -> Volume Up
+    EXPECT_EQ(F9Pressed(), RunRewriter(F9Pressed()));
+    EXPECT_EQ(VolumeUpPressed(), RunRewriter(F9Pressed(ui::EF_COMMAND_DOWN)));
+    EXPECT_EQ(F9Pressed(ui::EF_CONTROL_DOWN),
+              RunRewriter(F9Pressed(ui::EF_CONTROL_DOWN)));
+    EXPECT_EQ(F9Pressed(ui::EF_ALT_DOWN),
+              RunRewriter(F9Pressed(ui::EF_ALT_DOWN)));
+
+    // F10 -> F10, Search + F10 -> F10
+    EXPECT_EQ(F10Pressed(), RunRewriter(F10Pressed()));
+    EXPECT_EQ(F10Pressed(), RunRewriter(F10Pressed(ui::EF_COMMAND_DOWN)));
+    EXPECT_EQ(F10Pressed(ui::EF_CONTROL_DOWN),
+              RunRewriter(F10Pressed(ui::EF_CONTROL_DOWN)));
+    EXPECT_EQ(F10Pressed(ui::EF_ALT_DOWN),
+              RunRewriter(F10Pressed(ui::EF_ALT_DOWN)));
+
+    // F11 -> F11, Search + F11 -> F11
+    EXPECT_EQ(F11Pressed(), RunRewriter(F11Pressed()));
+    EXPECT_EQ(F11Pressed(), RunRewriter(F11Pressed(ui::EF_COMMAND_DOWN)));
+    EXPECT_EQ(F11Pressed(ui::EF_CONTROL_DOWN),
+              RunRewriter(F11Pressed(ui::EF_CONTROL_DOWN)));
+    EXPECT_EQ(F11Pressed(ui::EF_ALT_DOWN),
+              RunRewriter(F11Pressed(ui::EF_ALT_DOWN)));
+
+    // F12 -> F12
+    // Search + F12 differs between Wilco devices so it is tested separately.
+    EXPECT_EQ(F12Pressed(), RunRewriter(F12Pressed()));
+    EXPECT_EQ(F12Pressed(ui::EF_CONTROL_DOWN),
+              RunRewriter(F12Pressed(ui::EF_CONTROL_DOWN)));
+    EXPECT_EQ(F12Pressed(ui::EF_ALT_DOWN),
+              RunRewriter(F12Pressed(ui::EF_ALT_DOWN)));
+
+    // The number row should not be rewritten without Search key.
+    EXPECT_EQ(Digit1Pressed(), RunRewriter(Digit1Pressed()));
+    EXPECT_EQ(Digit2Pressed(), RunRewriter(Digit2Pressed()));
+    EXPECT_EQ(Digit3Pressed(), RunRewriter(Digit3Pressed()));
+    EXPECT_EQ(Digit4Pressed(), RunRewriter(Digit4Pressed()));
+    EXPECT_EQ(Digit5Pressed(), RunRewriter(Digit5Pressed()));
+    EXPECT_EQ(Digit6Pressed(), RunRewriter(Digit6Pressed()));
+    EXPECT_EQ(Digit7Pressed(), RunRewriter(Digit7Pressed()));
+    EXPECT_EQ(Digit8Pressed(), RunRewriter(Digit8Pressed()));
+    EXPECT_EQ(Digit9Pressed(), RunRewriter(Digit9Pressed()));
+    EXPECT_EQ(Digit0Pressed(), RunRewriter(Digit0Pressed()));
+    EXPECT_EQ(MinusPressed(), RunRewriter(MinusPressed()));
+    EXPECT_EQ(EqualPressed(), RunRewriter(EqualPressed()));
+  }
+
+  SetUpKeyboard(kWilco1_0Keyboard);
+  // Search + F12 -> Ctrl + Zoom (aka Fullscreen) (Display toggle)
+  EXPECT_EQ((TestKeyEvent{ui::ET_KEY_PRESSED, ui::DomCode::F12, ui::DomKey::F12,
+                          ui::VKEY_ZOOM, ui::EF_CONTROL_DOWN}),
+            RunRewriter(F12Pressed(ui::EF_COMMAND_DOWN)));
+
+  SetUpKeyboard(kWilco1_5Keyboard);
+  // Search + F12 -> F12 (Privacy screen not supported)
   event_rewriter_ash_->set_privacy_screen_for_testing(false);
-  for (const auto& test : wilco_standard_tests)
-    CheckKeyTestCase(source(), test);
-  CheckKeyTestCase(source(), drallion_test_no_privacy_screen);
+  EXPECT_EQ(F12Pressed(), RunRewriter(F12Pressed(ui::EF_COMMAND_DOWN)));
 
-  // Run key tests using Drallion keyboard layout (privacy screen supported)
+  // F12 -> F12, Search + F12 -> Privacy Screen Toggle
   event_rewriter_ash_->set_privacy_screen_for_testing(true);
-  for (const auto& test : wilco_standard_tests)
-    CheckKeyTestCase(source(), test);
-  CheckKeyTestCase(source(), drallion_test_privacy_screen);
+  EXPECT_EQ(PrivacyScreenTogglePressed(),
+            RunRewriter(F12Pressed(ui::EF_COMMAND_DOWN)));
 }
 
 TEST_F(EventRewriterTest, TestRewriteActionKeysWilcoLayouts) {
   Preferences::RegisterProfilePrefs(prefs()->registry());
 
-  KeyTestCase wilco_standard_tests[] = {
-      // Back -> Back, Search + Back -> F1
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_BROWSER_BACK, ui::DomCode::BROWSER_BACK, ui::EF_NONE,
-        ui::DomKey::BROWSER_BACK},
-       {ui::VKEY_BROWSER_BACK, ui::DomCode::BROWSER_BACK, ui::EF_NONE,
-        ui::DomKey::BROWSER_BACK}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_BROWSER_BACK, ui::DomCode::BROWSER_BACK, ui::EF_COMMAND_DOWN,
-        ui::DomKey::BROWSER_BACK},
-       {ui::VKEY_F1, ui::DomCode::F1, ui::EF_NONE, ui::DomKey::F1}},
-      // Refresh -> Refresh, Search + Refresh -> F2
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_BROWSER_REFRESH, ui::DomCode::BROWSER_REFRESH, ui::EF_NONE,
-        ui::DomKey::BROWSER_REFRESH},
-       {ui::VKEY_BROWSER_REFRESH, ui::DomCode::BROWSER_REFRESH, ui::EF_NONE,
-        ui::DomKey::BROWSER_REFRESH}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_BROWSER_REFRESH, ui::DomCode::BROWSER_REFRESH,
-        ui::EF_COMMAND_DOWN, ui::DomKey::BROWSER_REFRESH},
-       {ui::VKEY_F2, ui::DomCode::F2, ui::EF_NONE, ui::DomKey::F2}},
-      // Full Screen -> Full Screen, Search + Full Screen -> F3
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_ZOOM, ui::DomCode::ZOOM_TOGGLE, ui::EF_NONE,
-        ui::DomKey::ZOOM_TOGGLE},
-       {ui::VKEY_ZOOM, ui::DomCode::ZOOM_TOGGLE, ui::EF_NONE,
-        ui::DomKey::ZOOM_TOGGLE}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_ZOOM, ui::DomCode::ZOOM_TOGGLE, ui::EF_COMMAND_DOWN,
-        ui::DomKey::ZOOM_TOGGLE},
-       {ui::VKEY_F3, ui::DomCode::F3, ui::EF_NONE, ui::DomKey::F3}},
-      // Launch App 1 -> Launch App 1, Search + Launch App 1 -> F4
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_MEDIA_LAUNCH_APP1, ui::DomCode::F4, ui::EF_NONE,
-        ui::DomKey::F4},
-       {ui::VKEY_MEDIA_LAUNCH_APP1, ui::DomCode::F4, ui::EF_NONE,
-        ui::DomKey::F4}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_MEDIA_LAUNCH_APP1, ui::DomCode::F4, ui::EF_COMMAND_DOWN,
-        ui::DomKey::F4},
-       {ui::VKEY_F4, ui::DomCode::F4, ui::EF_NONE, ui::DomKey::F4}},
-      // Brightness down -> Brightness Down, Search Brightness Down -> F5
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_BRIGHTNESS_DOWN, ui::DomCode::BRIGHTNESS_DOWN, ui::EF_NONE,
-        ui::DomKey::BRIGHTNESS_DOWN},
-       {ui::VKEY_BRIGHTNESS_DOWN, ui::DomCode::BRIGHTNESS_DOWN, ui::EF_NONE,
-        ui::DomKey::BRIGHTNESS_DOWN}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_BRIGHTNESS_DOWN, ui::DomCode::BRIGHTNESS_DOWN,
-        ui::EF_COMMAND_DOWN, ui::DomKey::BRIGHTNESS_DOWN},
-       {ui::VKEY_F5, ui::DomCode::F5, ui::EF_NONE, ui::DomKey::F5}},
-      // Brightness up -> Brightness Up, Search + Brightness Up -> F6
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_BRIGHTNESS_UP, ui::DomCode::BRIGHTNESS_UP, ui::EF_NONE,
-        ui::DomKey::BRIGHTNESS_UP},
-       {ui::VKEY_BRIGHTNESS_UP, ui::DomCode::BRIGHTNESS_UP, ui::EF_NONE,
-        ui::DomKey::BRIGHTNESS_UP}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_BRIGHTNESS_UP, ui::DomCode::BRIGHTNESS_UP, ui::EF_COMMAND_DOWN,
-        ui::DomKey::BRIGHTNESS_UP},
-       {ui::VKEY_F6, ui::DomCode::F6, ui::EF_NONE, ui::DomKey::F6}},
-      // Volume mute -> Volume Mute, Search + Volume Mute -> F7
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_VOLUME_MUTE, ui::DomCode::VOLUME_MUTE, ui::EF_NONE,
-        ui::DomKey::AUDIO_VOLUME_MUTE},
-       {ui::VKEY_VOLUME_MUTE, ui::DomCode::VOLUME_MUTE, ui::EF_NONE,
-        ui::DomKey::AUDIO_VOLUME_MUTE}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_VOLUME_MUTE, ui::DomCode::VOLUME_MUTE, ui::EF_COMMAND_DOWN,
-        ui::DomKey::AUDIO_VOLUME_MUTE},
-       {ui::VKEY_F7, ui::DomCode::F7, ui::EF_NONE, ui::DomKey::F7}},
-      // Volume Down -> Volume Down, Search + Volume Down -> F8
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_VOLUME_DOWN, ui::DomCode::VOLUME_DOWN, ui::EF_NONE,
-        ui::DomKey::AUDIO_VOLUME_DOWN},
-       {ui::VKEY_VOLUME_DOWN, ui::DomCode::VOLUME_DOWN, ui::EF_NONE,
-        ui::DomKey::AUDIO_VOLUME_DOWN}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_VOLUME_DOWN, ui::DomCode::VOLUME_DOWN, ui::EF_COMMAND_DOWN,
-        ui::DomKey::AUDIO_VOLUME_DOWN},
-       {ui::VKEY_F8, ui::DomCode::F8, ui::EF_NONE, ui::DomKey::F8}},
-      // Volume Up -> Volume Up, Search + Volume Up -> F9
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_VOLUME_UP, ui::DomCode::VOLUME_UP, ui::EF_NONE,
-        ui::DomKey::AUDIO_VOLUME_UP},
-       {ui::VKEY_VOLUME_UP, ui::DomCode::VOLUME_UP, ui::EF_NONE,
-        ui::DomKey::AUDIO_VOLUME_UP}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_VOLUME_UP, ui::DomCode::VOLUME_UP, ui::EF_COMMAND_DOWN,
-        ui::DomKey::AUDIO_VOLUME_UP},
-       {ui::VKEY_F9, ui::DomCode::F9, ui::EF_NONE, ui::DomKey::F9}},
-      // F10 -> F10
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_F10, ui::DomCode::F10, ui::EF_NONE, ui::DomKey::F10},
-       {ui::VKEY_F10, ui::DomCode::F10, ui::EF_NONE, ui::DomKey::F10}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_F10, ui::DomCode::F10, ui::EF_COMMAND_DOWN, ui::DomKey::F10},
-       {ui::VKEY_F10, ui::DomCode::F10, ui::EF_NONE, ui::DomKey::F10}},
-      // F11 -> F11
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_F11, ui::DomCode::F11, ui::EF_COMMAND_DOWN, ui::DomKey::F11},
-       {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11},
-       {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11}}};
+  for (const auto& keyboard : kWilcoKeyboardVariants) {
+    SCOPED_TRACE(keyboard.name);
+    SetUpKeyboard(keyboard);
 
-  KeyTestCase wilco_1_tests[] = {
-      // Ctrl + Zoom (Display toggle) -> Unchanged
-      // Search + Ctrl + Zoom (Display toggle) -> F12
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_ZOOM, ui::DomCode::F12, ui::EF_CONTROL_DOWN, ui::DomKey::F12},
-       {ui::VKEY_ZOOM, ui::DomCode::F12, ui::EF_CONTROL_DOWN, ui::DomKey::F12}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_ZOOM, ui::DomCode::F12,
-        ui::EF_COMMAND_DOWN + ui::EF_CONTROL_DOWN, ui::DomKey::F12},
-       {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12}}};
+    // Back -> Back, Search + Back -> F1
+    EXPECT_EQ(BrowserBackPressed(), RunRewriter(BrowserBackPressed()));
+    EXPECT_EQ(F1Pressed(),
+              RunRewriter(BrowserBackPressed(ui::EF_COMMAND_DOWN)));
 
-  KeyTestCase drallion_tests_no_privacy_screen[] = {
-      // Privacy Screen Toggle -> F12 (Privacy Screen not supported),
-      // Search + Privacy Screen Toggle -> F12
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_PRIVACY_SCREEN_TOGGLE, ui::DomCode::PRIVACY_SCREEN_TOGGLE,
-        ui::EF_NONE, ui::DomKey::UNIDENTIFIED},
-       {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_PRIVACY_SCREEN_TOGGLE, ui::DomCode::PRIVACY_SCREEN_TOGGLE,
-        ui::EF_COMMAND_DOWN, ui::DomKey::UNIDENTIFIED},
-       {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12}},
-      // Ctrl + Zoom (Display toggle) -> Unchanged
-      // Search + Ctrl + Zoom (Display toggle) -> Unchanged
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_ZOOM, ui::DomCode::NONE, ui::EF_CONTROL_DOWN,
-        ui::DomKey::UNIDENTIFIED},
-       {ui::VKEY_ZOOM, ui::DomCode::NONE, ui::EF_CONTROL_DOWN,
-        ui::DomKey::UNIDENTIFIED}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_ZOOM, ui::DomCode::NONE,
-        ui::EF_COMMAND_DOWN + ui::EF_CONTROL_DOWN, ui::DomKey::UNIDENTIFIED},
-       {ui::VKEY_ZOOM, ui::DomCode::NONE, ui::EF_CONTROL_DOWN,
-        ui::DomKey::UNIDENTIFIED}}};
+    // Refresh -> Refresh, Search + Refresh -> F2
+    EXPECT_EQ(BrowserRefreshPressed(), RunRewriter(BrowserRefreshPressed()));
+    EXPECT_EQ(F2Pressed(),
+              RunRewriter(BrowserRefreshPressed(ui::EF_COMMAND_DOWN)));
 
-  KeyTestCase drallion_tests_privacy_screen[] = {
-      // Privacy Screen Toggle -> Privacy Screen Toggle,
-      // Search + Privacy Screen Toggle -> F12
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_PRIVACY_SCREEN_TOGGLE, ui::DomCode::PRIVACY_SCREEN_TOGGLE,
-        ui::EF_NONE, ui::DomKey::UNIDENTIFIED},
-       {ui::VKEY_PRIVACY_SCREEN_TOGGLE, ui::DomCode::PRIVACY_SCREEN_TOGGLE,
-        ui::EF_NONE, ui::DomKey::UNIDENTIFIED}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_PRIVACY_SCREEN_TOGGLE, ui::DomCode::PRIVACY_SCREEN_TOGGLE,
-        ui::EF_COMMAND_DOWN, ui::DomKey::UNIDENTIFIED},
-       {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12}},
-      // Ctrl + Zoom (Display toggle) -> Unchanged
-      // Search + Ctrl + Zoom (Display toggle) -> Unchanged
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_ZOOM, ui::DomCode::NONE, ui::EF_CONTROL_DOWN,
-        ui::DomKey::UNIDENTIFIED},
-       {ui::VKEY_ZOOM, ui::DomCode::NONE, ui::EF_CONTROL_DOWN,
-        ui::DomKey::UNIDENTIFIED}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_ZOOM, ui::DomCode::NONE,
-        ui::EF_COMMAND_DOWN + ui::EF_CONTROL_DOWN, ui::DomKey::UNIDENTIFIED},
-       {ui::VKEY_ZOOM, ui::DomCode::NONE, ui::EF_CONTROL_DOWN,
-        ui::DomKey::UNIDENTIFIED}}};
+    // Full Screen -> Full Screen, Search + Full Screen -> F3
+    EXPECT_EQ(ZoomTogglePressed(), RunRewriter(ZoomTogglePressed()));
+    EXPECT_EQ(F3Pressed(), RunRewriter(ZoomTogglePressed(ui::EF_COMMAND_DOWN)));
 
-  // Set keyboard layout to Wilco 1.0
-  SetupKeyboard("Wilco Keyboard", kKbdTopRowLayoutWilcoTag);
-  // Standard key tests using Wilco 1.0 keyboard
-  for (const auto& test : wilco_standard_tests)
-    CheckKeyTestCase(source(), test);
-  // Wilco 1.0 specific key tests
-  for (const auto& test : wilco_1_tests)
-    CheckKeyTestCase(source(), test);
+    // Launch App 1 -> Launch App 1, Search + Launch App 1 -> F4
+    EXPECT_EQ(SelectTaskPressed(), RunRewriter(SelectTaskPressed()));
+    EXPECT_EQ(F4Pressed(), RunRewriter(SelectTaskPressed(ui::EF_COMMAND_DOWN)));
 
-  // Set keyboard layout to Drallion (Wilco 1.5)
-  SetupKeyboard("Drallion Keyboard", kKbdTopRowLayoutDrallionTag);
+    // Brightness down -> Brightness Down, Search Brightness Down -> F5
+    EXPECT_EQ(BrightnessDownPressed(), RunRewriter(BrightnessDownPressed()));
+    EXPECT_EQ(F5Pressed(),
+              RunRewriter(BrightnessDownPressed(ui::EF_COMMAND_DOWN)));
 
-  // Standard key tests using Drallion keyboard layout
-  for (const auto& test : wilco_standard_tests)
-    CheckKeyTestCase(source(), test);
+    // Brightness up -> Brightness Up, Search + Brightness Up -> F6
+    EXPECT_EQ(BrightnessUpPressed(), RunRewriter(BrightnessUpPressed()));
+    EXPECT_EQ(F6Pressed(),
+              RunRewriter(BrightnessUpPressed(ui::EF_COMMAND_DOWN)));
 
-  // Drallion specific key tests (no privacy screen)
-  event_rewriter_ash_->set_privacy_screen_for_testing(false);
-  for (const auto& test : drallion_tests_no_privacy_screen)
-    CheckKeyTestCase(source(), test);
+    // Volume mute -> Volume Mute, Search + Volume Mute -> F7
+    EXPECT_EQ(VolumeMutePressed(), RunRewriter(VolumeMutePressed()));
+    EXPECT_EQ(F7Pressed(), RunRewriter(VolumeMutePressed(ui::EF_COMMAND_DOWN)));
 
-  // Drallion specific key tests (privacy screen supported)
-  event_rewriter_ash_->set_privacy_screen_for_testing(true);
-  for (const auto& test : drallion_tests_privacy_screen)
-    CheckKeyTestCase(source(), test);
+    // Volume Down -> Volume Down, Search + Volume Down -> F8
+    EXPECT_EQ(VolumeDownPressed(), RunRewriter(VolumeDownPressed()));
+    EXPECT_EQ(F8Pressed(), RunRewriter(VolumeDownPressed(ui::EF_COMMAND_DOWN)));
+
+    // Volume Up -> Volume Up, Search + Volume Up -> F9
+    EXPECT_EQ(VolumeUpPressed(), RunRewriter(VolumeUpPressed()));
+    EXPECT_EQ(F9Pressed(), RunRewriter(VolumeUpPressed(ui::EF_COMMAND_DOWN)));
+  }
+
+  SetUpKeyboard(kWilco1_0Keyboard);
+  // Ctrl + Zoom (Display toggle) -> Unchanged
+  // Search + Ctrl + Zoom (Display toggle) -> F12
+  EXPECT_EQ(ZoomTogglePressed(ui::EF_CONTROL_DOWN),
+            RunRewriter(ZoomTogglePressed(ui::EF_CONTROL_DOWN)));
+  EXPECT_EQ(F12Pressed(), RunRewriter(ZoomTogglePressed(ui::EF_CONTROL_DOWN |
+                                                        ui::EF_COMMAND_DOWN)));
+
+  SetUpKeyboard(kWilco1_5Keyboard);
+  {
+    // Drallion specific key tests (no privacy screen)
+    event_rewriter_ash_->set_privacy_screen_for_testing(false);
+
+    // Privacy Screen Toggle -> F12 (Privacy Screen not supported),
+    // Search + Privacy Screen Toggle -> F12
+    EXPECT_EQ(F12Pressed(), RunRewriter(PrivacyScreenTogglePressed()));
+    EXPECT_EQ(F12Pressed(),
+              RunRewriter(PrivacyScreenTogglePressed(ui::EF_COMMAND_DOWN)));
+
+    // Ctrl + Zoom (Display toggle) -> Unchanged
+    // Search + Ctrl + Zoom (Display toggle) -> Unchanged
+    EXPECT_EQ(ZoomTogglePressed(ui::EF_CONTROL_DOWN),
+              RunRewriter(ZoomTogglePressed(ui::EF_CONTROL_DOWN)));
+    EXPECT_EQ(ZoomTogglePressed(ui::EF_CONTROL_DOWN),
+              RunRewriter(ZoomTogglePressed(ui::EF_CONTROL_DOWN |
+                                            ui::EF_COMMAND_DOWN)));
+  }
+
+  {
+    // Drallion specific key tests (privacy screen supported)
+    event_rewriter_ash_->set_privacy_screen_for_testing(true);
+
+    // Privacy Screen Toggle -> Privacy Screen Toggle,
+    // Search + Privacy Screen Toggle -> F12
+    EXPECT_EQ(PrivacyScreenTogglePressed(),
+              RunRewriter(PrivacyScreenTogglePressed()));
+    EXPECT_EQ(F12Pressed(),
+              RunRewriter(PrivacyScreenTogglePressed(ui::EF_COMMAND_DOWN)));
+
+    // Ctrl + Zoom (Display toggle) -> Unchanged
+    // Search + Ctrl + Zoom (Display toggle) -> Unchanged
+    EXPECT_EQ(ZoomTogglePressed(ui::EF_CONTROL_DOWN),
+              RunRewriter(ZoomTogglePressed(ui::EF_CONTROL_DOWN)));
+    EXPECT_EQ(ZoomTogglePressed(ui::EF_CONTROL_DOWN),
+              RunRewriter(ZoomTogglePressed(ui::EF_CONTROL_DOWN |
+                                            ui::EF_COMMAND_DOWN)));
+  }
 }
 
 TEST_F(EventRewriterTest,
@@ -3534,131 +3278,68 @@
 
   // With |SuppressMetaTopRowKeyComboRewrites|, all action keys should be
   // unchanged and keep the search modifier.
-  KeyTestCase wilco_standard_tests[] = {
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_BROWSER_BACK, ui::DomCode::BROWSER_BACK, ui::EF_COMMAND_DOWN,
-        ui::DomKey::BROWSER_BACK},
-       {ui::VKEY_BROWSER_BACK, ui::DomCode::BROWSER_BACK, ui::EF_COMMAND_DOWN,
-        ui::DomKey::BROWSER_BACK}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_BROWSER_REFRESH, ui::DomCode::BROWSER_REFRESH,
-        ui::EF_COMMAND_DOWN, ui::DomKey::BROWSER_REFRESH},
-       {ui::VKEY_BROWSER_REFRESH, ui::DomCode::BROWSER_REFRESH,
-        ui::EF_COMMAND_DOWN, ui::DomKey::BROWSER_REFRESH}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_ZOOM, ui::DomCode::ZOOM_TOGGLE, ui::EF_COMMAND_DOWN,
-        ui::DomKey::ZOOM_TOGGLE},
-       {ui::VKEY_ZOOM, ui::DomCode::ZOOM_TOGGLE, ui::EF_COMMAND_DOWN,
-        ui::DomKey::ZOOM_TOGGLE}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_MEDIA_LAUNCH_APP1, ui::DomCode::F4, ui::EF_COMMAND_DOWN,
-        ui::DomKey::F4},
-       {ui::VKEY_MEDIA_LAUNCH_APP1, ui::DomCode::F4, ui::EF_COMMAND_DOWN,
-        ui::DomKey::F4}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_BRIGHTNESS_DOWN, ui::DomCode::BRIGHTNESS_DOWN,
-        ui::EF_COMMAND_DOWN, ui::DomKey::BRIGHTNESS_DOWN},
-       {ui::VKEY_BRIGHTNESS_DOWN, ui::DomCode::BRIGHTNESS_DOWN,
-        ui::EF_COMMAND_DOWN, ui::DomKey::BRIGHTNESS_DOWN}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_BRIGHTNESS_UP, ui::DomCode::BRIGHTNESS_UP, ui::EF_COMMAND_DOWN,
-        ui::DomKey::BRIGHTNESS_UP},
-       {ui::VKEY_BRIGHTNESS_UP, ui::DomCode::BRIGHTNESS_UP, ui::EF_COMMAND_DOWN,
-        ui::DomKey::BRIGHTNESS_UP}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_VOLUME_MUTE, ui::DomCode::VOLUME_MUTE, ui::EF_COMMAND_DOWN,
-        ui::DomKey::AUDIO_VOLUME_MUTE},
-       {ui::VKEY_VOLUME_MUTE, ui::DomCode::VOLUME_MUTE, ui::EF_COMMAND_DOWN,
-        ui::DomKey::AUDIO_VOLUME_MUTE}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_VOLUME_DOWN, ui::DomCode::VOLUME_DOWN, ui::EF_COMMAND_DOWN,
-        ui::DomKey::AUDIO_VOLUME_DOWN},
-       {ui::VKEY_VOLUME_DOWN, ui::DomCode::VOLUME_DOWN, ui::EF_COMMAND_DOWN,
-        ui::DomKey::AUDIO_VOLUME_DOWN}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_VOLUME_UP, ui::DomCode::VOLUME_UP, ui::EF_COMMAND_DOWN,
-        ui::DomKey::AUDIO_VOLUME_UP},
-       {ui::VKEY_VOLUME_UP, ui::DomCode::VOLUME_UP, ui::EF_COMMAND_DOWN,
-        ui::DomKey::AUDIO_VOLUME_UP}},
-      // F-Keys do not remove Search when pressed.
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_F10, ui::DomCode::F10, ui::EF_COMMAND_DOWN, ui::DomKey::F10},
-       {ui::VKEY_F10, ui::DomCode::F10, ui::EF_COMMAND_DOWN, ui::DomKey::F10}},
-      // F11 -> F11
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_F11, ui::DomCode::F11, ui::EF_COMMAND_DOWN, ui::DomKey::F11},
-       {ui::VKEY_F11, ui::DomCode::F11, ui::EF_COMMAND_DOWN, ui::DomKey::F11}}};
 
-  // With |SuppressMetaTopRowKeyComboRewrites|, all action keys should be
-  // unchanged and keep the search modifier.
-  KeyTestCase wilco_1_tests[] = {
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_ZOOM, ui::DomCode::F12,
-        ui::EF_COMMAND_DOWN + ui::EF_CONTROL_DOWN, ui::DomKey::F12},
-       {ui::VKEY_ZOOM, ui::DomCode::F12,
-        ui::EF_COMMAND_DOWN + ui::EF_CONTROL_DOWN, ui::DomKey::F12}}};
+  for (const auto& keyboard : kWilcoKeyboardVariants) {
+    SCOPED_TRACE(keyboard.name);
+    SetUpKeyboard(keyboard);
 
-  // With |SuppressMetaTopRowKeyComboRewrites|, all action keys should be
-  // unchanged and keep the search modifier.
-  KeyTestCase drallion_tests_no_privacy_screen[] = {
-      // Search + Privacy Screen Toggle -> Search + F12
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_PRIVACY_SCREEN_TOGGLE, ui::DomCode::PRIVACY_SCREEN_TOGGLE,
-        ui::EF_COMMAND_DOWN, ui::DomKey::UNIDENTIFIED},
-       {ui::VKEY_F12, ui::DomCode::F12, ui::EF_COMMAND_DOWN, ui::DomKey::F12}},
-      // Search + Ctrl + Zoom (Display toggle) -> Unchanged
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_ZOOM, ui::DomCode::NONE,
-        ui::EF_COMMAND_DOWN + ui::EF_CONTROL_DOWN, ui::DomKey::UNIDENTIFIED},
-       {ui::VKEY_ZOOM, ui::DomCode::NONE,
-        ui::EF_COMMAND_DOWN + ui::EF_CONTROL_DOWN, ui::DomKey::UNIDENTIFIED}},
-  };
-  // With |SuppressMetaTopRowKeyComboRewrites|, all action keys should be
-  // unchanged and keep the search modifier.
-  KeyTestCase drallion_tests_privacy_screen[] = {
-      // Search + Privacy Screen Toggle -> F12
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_PRIVACY_SCREEN_TOGGLE, ui::DomCode::PRIVACY_SCREEN_TOGGLE,
-        ui::EF_COMMAND_DOWN, ui::DomKey::UNIDENTIFIED},
-       {ui::VKEY_PRIVACY_SCREEN_TOGGLE, ui::DomCode::PRIVACY_SCREEN_TOGGLE,
-        ui::EF_COMMAND_DOWN, ui::DomKey::UNIDENTIFIED}},
-      // Ctrl + Zoom (Display toggle) -> Unchanged
-      // Search + Ctrl + Zoom (Display toggle) -> Unchanged
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_ZOOM, ui::DomCode::NONE,
-        ui::EF_COMMAND_DOWN + ui::EF_CONTROL_DOWN, ui::DomKey::UNIDENTIFIED},
-       {ui::VKEY_ZOOM, ui::DomCode::NONE,
-        ui::EF_COMMAND_DOWN + ui::EF_CONTROL_DOWN, ui::DomKey::UNIDENTIFIED}}};
+    EXPECT_EQ(BrowserBackPressed(ui::EF_COMMAND_DOWN),
+              RunRewriter(BrowserBackPressed(ui::EF_COMMAND_DOWN)));
+    EXPECT_EQ(BrowserRefreshPressed(ui::EF_COMMAND_DOWN),
+              RunRewriter(BrowserRefreshPressed(ui::EF_COMMAND_DOWN)));
+    EXPECT_EQ(ZoomTogglePressed(ui::EF_COMMAND_DOWN),
+              RunRewriter(ZoomTogglePressed(ui::EF_COMMAND_DOWN)));
+    EXPECT_EQ(SelectTaskPressed(ui::EF_COMMAND_DOWN),
+              RunRewriter(SelectTaskPressed(ui::EF_COMMAND_DOWN)));
+    EXPECT_EQ(BrightnessDownPressed(ui::EF_COMMAND_DOWN),
+              RunRewriter(BrightnessDownPressed(ui::EF_COMMAND_DOWN)));
+    EXPECT_EQ(BrightnessUpPressed(ui::EF_COMMAND_DOWN),
+              RunRewriter(BrightnessUpPressed(ui::EF_COMMAND_DOWN)));
+    EXPECT_EQ(VolumeMutePressed(ui::EF_COMMAND_DOWN),
+              RunRewriter(VolumeMutePressed(ui::EF_COMMAND_DOWN)));
+    EXPECT_EQ(VolumeDownPressed(ui::EF_COMMAND_DOWN),
+              RunRewriter(VolumeDownPressed(ui::EF_COMMAND_DOWN)));
+    EXPECT_EQ(VolumeUpPressed(ui::EF_COMMAND_DOWN),
+              RunRewriter(VolumeUpPressed(ui::EF_COMMAND_DOWN)));
 
-  // Set keyboard layout to Wilco 1.0
-  SetupKeyboard("Wilco Keyboard", kKbdTopRowLayoutWilcoTag);
-  // Standard key tests using Wilco 1.0 keyboard
-  for (const auto& test : wilco_standard_tests) {
-    CheckKeyTestCase(source(), test);
-  }
-  // Wilco 1.0 specific key tests
-  for (const auto& test : wilco_1_tests) {
-    CheckKeyTestCase(source(), test);
+    // F-Keys do not remove Search when pressed.
+    EXPECT_EQ(F10Pressed(ui::EF_COMMAND_DOWN),
+              RunRewriter(F10Pressed(ui::EF_COMMAND_DOWN)));
+    EXPECT_EQ(F11Pressed(ui::EF_COMMAND_DOWN),
+              RunRewriter(F11Pressed(ui::EF_COMMAND_DOWN)));
   }
 
-  // Set keyboard layout to Drallion (Wilco 1.5)
-  SetupKeyboard("Drallion Keyboard", kKbdTopRowLayoutDrallionTag);
+  SetUpKeyboard(kWilco1_0Keyboard);
+  EXPECT_EQ(ZoomTogglePressed(ui::EF_CONTROL_DOWN | ui::EF_COMMAND_DOWN),
+            RunRewriter(
+                ZoomTogglePressed(ui::EF_CONTROL_DOWN | ui::EF_COMMAND_DOWN)));
 
-  // Standard key tests using Drallion keyboard layout
-  for (const auto& test : wilco_standard_tests) {
-    CheckKeyTestCase(source(), test);
+  SetUpKeyboard(kWilco1_5Keyboard);
+  {
+    // Drallion specific key tests (no privacy screen)
+    event_rewriter_ash_->set_privacy_screen_for_testing(false);
+
+    // Search + Privacy Screen Toggle -> Search + F12
+    EXPECT_EQ(F12Pressed(ui::EF_COMMAND_DOWN),
+              RunRewriter(PrivacyScreenTogglePressed(ui::EF_COMMAND_DOWN)));
+    // Search + Ctrl + Zoom (Display toggle) -> Unchanged
+    EXPECT_EQ(ZoomTogglePressed(ui::EF_COMMAND_DOWN | ui::EF_CONTROL_DOWN),
+              RunRewriter(ZoomTogglePressed(ui::EF_COMMAND_DOWN |
+                                            ui::EF_CONTROL_DOWN)));
   }
 
-  // Drallion specific key tests (no privacy screen)
-  event_rewriter_ash_->set_privacy_screen_for_testing(false);
-  for (const auto& test : drallion_tests_no_privacy_screen) {
-    CheckKeyTestCase(source(), test);
-  }
+  {
+    // Drallion specific key tests (privacy screen supported)
+    event_rewriter_ash_->set_privacy_screen_for_testing(true);
 
-  // Drallion specific key tests (privacy screen supported)
-  event_rewriter_ash_->set_privacy_screen_for_testing(true);
-  for (const auto& test : drallion_tests_privacy_screen) {
-    CheckKeyTestCase(source(), test);
+    // Search + Privacy Screen Toggle -> F12  TODO
+    EXPECT_EQ(PrivacyScreenTogglePressed(ui::EF_COMMAND_DOWN),
+              RunRewriter(PrivacyScreenTogglePressed(ui::EF_COMMAND_DOWN)));
+    // Ctrl + Zoom (Display toggle) -> Unchanged  TODO
+    // Search + Ctrl + Zoom (Display toggle) -> Unchanged
+    EXPECT_EQ(ZoomTogglePressed(ui::EF_COMMAND_DOWN | ui::EF_CONTROL_DOWN),
+              RunRewriter(ZoomTogglePressed(ui::EF_COMMAND_DOWN |
+                                            ui::EF_CONTROL_DOWN)));
   }
 }
 
@@ -3678,110 +3359,61 @@
 
   // With |SuppressMetaTopRowKeyComboRewrites| and TopRowAreFKeys, all action
   // keys should be remapped to F-Keys and keep the Search modifier.
-  KeyTestCase wilco_standard_tests[] = {
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_BROWSER_BACK, ui::DomCode::BROWSER_BACK, ui::EF_COMMAND_DOWN,
-        ui::DomKey::BROWSER_BACK},
-       {ui::VKEY_F1, ui::DomCode::F1, ui::EF_COMMAND_DOWN, ui::DomKey::F1}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_BROWSER_REFRESH, ui::DomCode::BROWSER_REFRESH,
-        ui::EF_COMMAND_DOWN, ui::DomKey::BROWSER_REFRESH},
-       {ui::VKEY_F2, ui::DomCode::F2, ui::EF_COMMAND_DOWN, ui::DomKey::F2}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_ZOOM, ui::DomCode::ZOOM_TOGGLE, ui::EF_COMMAND_DOWN,
-        ui::DomKey::ZOOM_TOGGLE},
-       {ui::VKEY_F3, ui::DomCode::F3, ui::EF_COMMAND_DOWN, ui::DomKey::F3}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_MEDIA_LAUNCH_APP1, ui::DomCode::F4, ui::EF_COMMAND_DOWN,
-        ui::DomKey::F4},
-       {ui::VKEY_F4, ui::DomCode::F4, ui::EF_COMMAND_DOWN, ui::DomKey::F4}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_BRIGHTNESS_DOWN, ui::DomCode::BRIGHTNESS_DOWN,
-        ui::EF_COMMAND_DOWN, ui::DomKey::BRIGHTNESS_DOWN},
-       {ui::VKEY_F5, ui::DomCode::F5, ui::EF_COMMAND_DOWN, ui::DomKey::F5}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_BRIGHTNESS_UP, ui::DomCode::BRIGHTNESS_UP, ui::EF_COMMAND_DOWN,
-        ui::DomKey::BRIGHTNESS_UP},
-       {ui::VKEY_F6, ui::DomCode::F6, ui::EF_COMMAND_DOWN, ui::DomKey::F6}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_VOLUME_MUTE, ui::DomCode::VOLUME_MUTE, ui::EF_COMMAND_DOWN,
-        ui::DomKey::AUDIO_VOLUME_MUTE},
-       {ui::VKEY_F7, ui::DomCode::F7, ui::EF_COMMAND_DOWN, ui::DomKey::F7}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_VOLUME_DOWN, ui::DomCode::VOLUME_DOWN, ui::EF_COMMAND_DOWN,
-        ui::DomKey::AUDIO_VOLUME_DOWN},
-       {ui::VKEY_F8, ui::DomCode::F8, ui::EF_COMMAND_DOWN, ui::DomKey::F8}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_VOLUME_UP, ui::DomCode::VOLUME_UP, ui::EF_COMMAND_DOWN,
-        ui::DomKey::AUDIO_VOLUME_UP},
-       {ui::VKEY_F9, ui::DomCode::F9, ui::EF_COMMAND_DOWN, ui::DomKey::F9}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_F10, ui::DomCode::F10, ui::EF_COMMAND_DOWN, ui::DomKey::F10},
-       {ui::VKEY_F10, ui::DomCode::F10, ui::EF_COMMAND_DOWN, ui::DomKey::F10}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_F11, ui::DomCode::F11, ui::EF_COMMAND_DOWN, ui::DomKey::F11},
-       {ui::VKEY_F11, ui::DomCode::F11, ui::EF_COMMAND_DOWN, ui::DomKey::F11}}};
+  for (const auto& keyboard : kWilcoKeyboardVariants) {
+    SCOPED_TRACE(keyboard.name);
+    SetUpKeyboard(keyboard);
 
-  // With |SuppressMetaTopRowKeyComboRewrites| and TopRowAreFKeys, all action
-  // keys should be remapped to F-Keys and keep the Search modifier.
-  KeyTestCase wilco_1_tests[] = {
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_ZOOM, ui::DomCode::F12,
-        ui::EF_COMMAND_DOWN + ui::EF_CONTROL_DOWN, ui::DomKey::F12},
-       {ui::VKEY_F12, ui::DomCode::F12, ui::EF_COMMAND_DOWN, ui::DomKey::F12}}};
+    EXPECT_EQ(F1Pressed(ui::EF_COMMAND_DOWN),
+              RunRewriter(BrowserBackPressed(ui::EF_COMMAND_DOWN)));
+    EXPECT_EQ(F2Pressed(ui::EF_COMMAND_DOWN),
+              RunRewriter(BrowserRefreshPressed(ui::EF_COMMAND_DOWN)));
+    EXPECT_EQ(F3Pressed(ui::EF_COMMAND_DOWN),
+              RunRewriter(ZoomTogglePressed(ui::EF_COMMAND_DOWN)));
+    EXPECT_EQ(F4Pressed(ui::EF_COMMAND_DOWN),
+              RunRewriter(SelectTaskPressed(ui::EF_COMMAND_DOWN)));
+    EXPECT_EQ(F5Pressed(ui::EF_COMMAND_DOWN),
+              RunRewriter(BrightnessDownPressed(ui::EF_COMMAND_DOWN)));
+    EXPECT_EQ(F6Pressed(ui::EF_COMMAND_DOWN),
+              RunRewriter(BrightnessUpPressed(ui::EF_COMMAND_DOWN)));
+    EXPECT_EQ(F7Pressed(ui::EF_COMMAND_DOWN),
+              RunRewriter(VolumeMutePressed(ui::EF_COMMAND_DOWN)));
+    EXPECT_EQ(F8Pressed(ui::EF_COMMAND_DOWN),
+              RunRewriter(VolumeDownPressed(ui::EF_COMMAND_DOWN)));
+    EXPECT_EQ(F9Pressed(ui::EF_COMMAND_DOWN),
+              RunRewriter(VolumeUpPressed(ui::EF_COMMAND_DOWN)));
 
-  KeyTestCase drallion_tests_no_privacy_screen[] = {
-      // Search + Privacy Screen Toggle -> Search + F12 (Privacy screen not
-      // supported)
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_PRIVACY_SCREEN_TOGGLE, ui::DomCode::PRIVACY_SCREEN_TOGGLE,
-        ui::EF_COMMAND_DOWN, ui::DomKey::UNIDENTIFIED},
-       {ui::VKEY_F12, ui::DomCode::F12, ui::EF_COMMAND_DOWN, ui::DomKey::F12}},
-      // Search + Ctrl + Zoom (Display toggle) -> Unchanged as Display toggle
-      // should never be remapped to anything else.
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_ZOOM, ui::DomCode::NONE,
-        ui::EF_COMMAND_DOWN + ui::EF_CONTROL_DOWN, ui::DomKey::UNIDENTIFIED},
-       {ui::VKEY_ZOOM, ui::DomCode::NONE,
-        ui::EF_COMMAND_DOWN + ui::EF_CONTROL_DOWN, ui::DomKey::UNIDENTIFIED}}};
-
-  KeyTestCase drallion_tests_privacy_screen[] = {
-      // Search + Privacy Screen Toggle -> Remapped to F12 and
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_PRIVACY_SCREEN_TOGGLE, ui::DomCode::PRIVACY_SCREEN_TOGGLE,
-        ui::EF_COMMAND_DOWN, ui::DomKey::UNIDENTIFIED},
-       {ui::VKEY_F12, ui::DomCode::F12, ui::EF_COMMAND_DOWN, ui::DomKey::F12}},
-  };
-
-  // Set keyboard layout to Wilco 1.0
-  SetupKeyboard("Wilco Keyboard", kKbdTopRowLayoutWilcoTag);
-  // Standard key tests using Wilco 1.0 keyboard
-  for (const auto& test : wilco_standard_tests) {
-    CheckKeyTestCase(source(), test);
-  }
-  // Wilco 1.0 specific key tests
-  for (const auto& test : wilco_1_tests) {
-    CheckKeyTestCase(source(), test);
+    EXPECT_EQ(F10Pressed(ui::EF_COMMAND_DOWN),
+              RunRewriter(F10Pressed(ui::EF_COMMAND_DOWN)));
+    EXPECT_EQ(F11Pressed(ui::EF_COMMAND_DOWN),
+              RunRewriter(F11Pressed(ui::EF_COMMAND_DOWN)));
   }
 
-  // Set keyboard layout to Drallion (Wilco 1.5)
-  SetupKeyboard("Drallion Keyboard", kKbdTopRowLayoutDrallionTag);
+  SetUpKeyboard(kWilco1_0Keyboard);
+  EXPECT_EQ(F12Pressed(ui::EF_COMMAND_DOWN),
+            RunRewriter(
+                ZoomTogglePressed(ui::EF_CONTROL_DOWN | ui::EF_COMMAND_DOWN)));
 
-  // Standard key tests using Drallion keyboard layout
-  for (const auto& test : wilco_standard_tests) {
-    CheckKeyTestCase(source(), test);
+  SetUpKeyboard(kWilco1_5Keyboard);
+  {
+    // Drallion specific key tests (no privacy screen)
+    event_rewriter_ash_->set_privacy_screen_for_testing(false);
+
+    // Search + Privacy Screen Toggle -> Search + F12
+    EXPECT_EQ(F12Pressed(ui::EF_COMMAND_DOWN),
+              RunRewriter(PrivacyScreenTogglePressed(ui::EF_COMMAND_DOWN)));
+    // Search + Ctrl + Zoom (Display toggle) -> Unchanged
+    EXPECT_EQ(ZoomTogglePressed(ui::EF_COMMAND_DOWN | ui::EF_CONTROL_DOWN),
+              RunRewriter(ZoomTogglePressed(ui::EF_COMMAND_DOWN |
+                                            ui::EF_CONTROL_DOWN)));
   }
 
-  // Drallion specific key tests (no privacy screen)
-  event_rewriter_ash_->set_privacy_screen_for_testing(false);
-  for (const auto& test : drallion_tests_no_privacy_screen) {
-    CheckKeyTestCase(source(), test);
-  }
+  {
+    // Drallion specific key tests (privacy screen supported)
+    event_rewriter_ash_->set_privacy_screen_for_testing(true);
 
-  // Drallion specific key tests (privacy screen supported)
-  event_rewriter_ash_->set_privacy_screen_for_testing(true);
-  for (const auto& test : drallion_tests_privacy_screen) {
-    CheckKeyTestCase(source(), test);
+    // Search + Privacy Screen Toggle -> F12
+    EXPECT_EQ(F12Pressed(ui::EF_COMMAND_DOWN),
+              RunRewriter(PrivacyScreenTogglePressed(ui::EF_COMMAND_DOWN)));
   }
 }
 
@@ -3796,185 +3428,102 @@
   top_row_as_fn_key.SetValue(true);
   keyboard_settings->top_row_are_fkeys = true;
 
-  KeyTestCase wilco_standard_tests[] = {
-      // Back -> F1, Search + Back -> Back
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_BROWSER_BACK, ui::DomCode::BROWSER_BACK, ui::EF_NONE,
-        ui::DomKey::BROWSER_BACK},
-       {ui::VKEY_F1, ui::DomCode::F1, ui::EF_NONE, ui::DomKey::F1}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_BROWSER_BACK, ui::DomCode::BROWSER_BACK, ui::EF_COMMAND_DOWN,
-        ui::DomKey::BROWSER_BACK},
-       {ui::VKEY_BROWSER_BACK, ui::DomCode::BROWSER_BACK, ui::EF_NONE,
-        ui::DomKey::BROWSER_BACK}},
-      // Refresh -> F2, Search + Refresh -> Refresh
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_BROWSER_REFRESH, ui::DomCode::BROWSER_REFRESH, ui::EF_NONE,
-        ui::DomKey::BROWSER_REFRESH},
-       {ui::VKEY_F2, ui::DomCode::F2, ui::EF_NONE, ui::DomKey::F2}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_BROWSER_REFRESH, ui::DomCode::BROWSER_REFRESH,
-        ui::EF_COMMAND_DOWN, ui::DomKey::BROWSER_REFRESH},
-       {ui::VKEY_BROWSER_REFRESH, ui::DomCode::BROWSER_REFRESH, ui::EF_NONE,
-        ui::DomKey::BROWSER_REFRESH}},
-      // Full Screen -> F3, Search + Full Screen -> Full Screen
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_ZOOM, ui::DomCode::ZOOM_TOGGLE, ui::EF_NONE,
-        ui::DomKey::ZOOM_TOGGLE},
-       {ui::VKEY_F3, ui::DomCode::F3, ui::EF_NONE, ui::DomKey::F3}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_ZOOM, ui::DomCode::ZOOM_TOGGLE, ui::EF_COMMAND_DOWN,
-        ui::DomKey::ZOOM_TOGGLE},
-       {ui::VKEY_ZOOM, ui::DomCode::ZOOM_TOGGLE, ui::EF_NONE,
-        ui::DomKey::ZOOM_TOGGLE}},
-      // Launch App 1 -> F4, Search + Launch App 1 -> Launch App 1
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_MEDIA_LAUNCH_APP1, ui::DomCode::F4, ui::EF_NONE,
-        ui::DomKey::F4},
-       {ui::VKEY_F4, ui::DomCode::F4, ui::EF_NONE, ui::DomKey::F4}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_MEDIA_LAUNCH_APP1, ui::DomCode::F4, ui::EF_COMMAND_DOWN,
-        ui::DomKey::F4},
-       {ui::VKEY_MEDIA_LAUNCH_APP1, ui::DomCode::F4, ui::EF_NONE,
-        ui::DomKey::F4}},
-      // Brightness down -> F5, Search Brightness Down -> Brightness Down
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_BRIGHTNESS_DOWN, ui::DomCode::BRIGHTNESS_DOWN, ui::EF_NONE,
-        ui::DomKey::BRIGHTNESS_DOWN},
-       {ui::VKEY_F5, ui::DomCode::F5, ui::EF_NONE, ui::DomKey::F5}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_BRIGHTNESS_DOWN, ui::DomCode::BRIGHTNESS_DOWN,
-        ui::EF_COMMAND_DOWN, ui::DomKey::BRIGHTNESS_DOWN},
-       {ui::VKEY_BRIGHTNESS_DOWN, ui::DomCode::BRIGHTNESS_DOWN, ui::EF_NONE,
-        ui::DomKey::BRIGHTNESS_DOWN}},
-      // Brightness up -> F6, Search + Brightness Up -> Brightness Up
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_BRIGHTNESS_UP, ui::DomCode::BRIGHTNESS_UP, ui::EF_NONE,
-        ui::DomKey::BRIGHTNESS_UP},
-       {ui::VKEY_F6, ui::DomCode::F6, ui::EF_NONE, ui::DomKey::F6}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_BRIGHTNESS_UP, ui::DomCode::BRIGHTNESS_UP, ui::EF_COMMAND_DOWN,
-        ui::DomKey::BRIGHTNESS_UP},
-       {ui::VKEY_BRIGHTNESS_UP, ui::DomCode::BRIGHTNESS_UP, ui::EF_NONE,
-        ui::DomKey::BRIGHTNESS_UP}},
-      // Volume mute -> F7, Search + Volume Mute -> Volume Mute
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_VOLUME_MUTE, ui::DomCode::VOLUME_MUTE, ui::EF_NONE,
-        ui::DomKey::AUDIO_VOLUME_MUTE},
-       {ui::VKEY_F7, ui::DomCode::F7, ui::EF_NONE, ui::DomKey::F7}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_VOLUME_MUTE, ui::DomCode::VOLUME_MUTE, ui::EF_COMMAND_DOWN,
-        ui::DomKey::AUDIO_VOLUME_MUTE},
-       {ui::VKEY_VOLUME_MUTE, ui::DomCode::VOLUME_MUTE, ui::EF_NONE,
-        ui::DomKey::AUDIO_VOLUME_MUTE}},
-      // Volume Down -> F8, Search + Volume Down -> Volume Down
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_VOLUME_DOWN, ui::DomCode::VOLUME_DOWN, ui::EF_NONE,
-        ui::DomKey::AUDIO_VOLUME_DOWN},
-       {ui::VKEY_F8, ui::DomCode::F8, ui::EF_NONE, ui::DomKey::F8}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_VOLUME_DOWN, ui::DomCode::VOLUME_DOWN, ui::EF_COMMAND_DOWN,
-        ui::DomKey::AUDIO_VOLUME_DOWN},
-       {ui::VKEY_VOLUME_DOWN, ui::DomCode::VOLUME_DOWN, ui::EF_NONE,
-        ui::DomKey::AUDIO_VOLUME_DOWN}},
-      // Volume Up -> F9, Search + Volume Up -> Volume Up
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_VOLUME_UP, ui::DomCode::VOLUME_UP, ui::EF_NONE,
-        ui::DomKey::AUDIO_VOLUME_UP},
-       {ui::VKEY_F9, ui::DomCode::F9, ui::EF_NONE, ui::DomKey::F9}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_VOLUME_UP, ui::DomCode::VOLUME_UP, ui::EF_COMMAND_DOWN,
-        ui::DomKey::AUDIO_VOLUME_UP},
-       {ui::VKEY_VOLUME_UP, ui::DomCode::VOLUME_UP, ui::EF_NONE,
-        ui::DomKey::AUDIO_VOLUME_UP}},
-      // F10 -> F10
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_F10, ui::DomCode::F10, ui::EF_NONE, ui::DomKey::F10},
-       {ui::VKEY_F10, ui::DomCode::F10, ui::EF_NONE, ui::DomKey::F10}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_F10, ui::DomCode::F10, ui::EF_COMMAND_DOWN, ui::DomKey::F10},
-       {ui::VKEY_F10, ui::DomCode::F10, ui::EF_NONE, ui::DomKey::F10}},
-      // F11 -> F11
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_F11, ui::DomCode::F11, ui::EF_COMMAND_DOWN, ui::DomKey::F11},
-       {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11},
-       {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11}}};
+  for (const auto& keyboard : kWilcoKeyboardVariants) {
+    SCOPED_TRACE(keyboard.name);
+    SetUpKeyboard(keyboard);
 
-  KeyTestCase wilco_1_tests[] = {
-      // Ctrl + Zoom (Display toggle) -> F12
-      // Search + Ctrl + Zoom (Display toggle) -> Unchanged
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_ZOOM, ui::DomCode::F12, ui::EF_CONTROL_DOWN, ui::DomKey::F12},
-       {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_ZOOM, ui::DomCode::F12,
-        ui::EF_COMMAND_DOWN + ui::EF_CONTROL_DOWN, ui::DomKey::F12},
-       {ui::VKEY_ZOOM, ui::DomCode::F12, ui::EF_CONTROL_DOWN,
-        ui::DomKey::F12}}};
+    // Back -> F1, Search + Back -> Back
+    EXPECT_EQ(F1Pressed(), RunRewriter(BrowserBackPressed()));
+    EXPECT_EQ(BrowserBackPressed(),
+              RunRewriter(BrowserBackPressed(ui::EF_COMMAND_DOWN)));
 
-  KeyTestCase drallion_tests_no_privacy_screen[] = {
-      // Privacy Screen Toggle -> F12,
-      // Search + Privacy Screen Toggle -> F12 (Privacy screen not supported)
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_PRIVACY_SCREEN_TOGGLE, ui::DomCode::PRIVACY_SCREEN_TOGGLE,
-        ui::EF_NONE, ui::DomKey::UNIDENTIFIED},
-       {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_PRIVACY_SCREEN_TOGGLE, ui::DomCode::PRIVACY_SCREEN_TOGGLE,
-        ui::EF_COMMAND_DOWN, ui::DomKey::UNIDENTIFIED},
-       {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12}},
-      // Ctrl + Zoom (Display toggle) -> Unchanged
-      // Search + Ctrl + Zoom (Display toggle) -> Unchanged
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_ZOOM, ui::DomCode::NONE, ui::EF_CONTROL_DOWN,
-        ui::DomKey::UNIDENTIFIED},
-       {ui::VKEY_ZOOM, ui::DomCode::NONE, ui::EF_CONTROL_DOWN,
-        ui::DomKey::UNIDENTIFIED}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_ZOOM, ui::DomCode::NONE,
-        ui::EF_COMMAND_DOWN + ui::EF_CONTROL_DOWN, ui::DomKey::UNIDENTIFIED},
-       {ui::VKEY_ZOOM, ui::DomCode::NONE, ui::EF_CONTROL_DOWN,
-        ui::DomKey::UNIDENTIFIED}}};
+    // Refresh -> F2, Search + Refresh -> Refresh
+    EXPECT_EQ(F2Pressed(), RunRewriter(BrowserRefreshPressed()));
+    EXPECT_EQ(BrowserRefreshPressed(),
+              RunRewriter(BrowserRefreshPressed(ui::EF_COMMAND_DOWN)));
 
-  KeyTestCase drallion_tests_privacy_screen[] = {
-      // Privacy Screen Toggle -> F12,
-      // Search + Privacy Screen Toggle -> Unchanged
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_PRIVACY_SCREEN_TOGGLE, ui::DomCode::PRIVACY_SCREEN_TOGGLE,
-        ui::EF_NONE, ui::DomKey::UNIDENTIFIED},
-       {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12}},
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_PRIVACY_SCREEN_TOGGLE, ui::DomCode::PRIVACY_SCREEN_TOGGLE,
-        ui::EF_COMMAND_DOWN, ui::DomKey::UNIDENTIFIED},
-       {ui::VKEY_PRIVACY_SCREEN_TOGGLE, ui::DomCode::PRIVACY_SCREEN_TOGGLE,
-        ui::EF_NONE, ui::DomKey::UNIDENTIFIED}}};
+    // Full Screen -> F3, Search + Full Screen -> Full Screen
+    EXPECT_EQ(F3Pressed(), RunRewriter(ZoomTogglePressed()));
+    EXPECT_EQ(ZoomTogglePressed(),
+              RunRewriter(ZoomTogglePressed(ui::EF_COMMAND_DOWN)));
 
-  // Run key test cases for Wilco 1.0 keyboard layout
-  SetupKeyboard("Wilco Keyboard", kKbdTopRowLayoutWilcoTag);
-  // Standard key tests using Wilco 1.0 keyboard
-  for (const auto& test : wilco_standard_tests)
-    CheckKeyTestCase(source(), test);
-  // Wilco 1.0 specific key tests
-  for (const auto& test : wilco_1_tests)
-    CheckKeyTestCase(source(), test);
+    // Launch App 1 -> F4, Search + Launch App 1 -> Launch App 1
+    EXPECT_EQ(F4Pressed(), RunRewriter(SelectTaskPressed()));
+    EXPECT_EQ(SelectTaskPressed(),
+              RunRewriter(SelectTaskPressed(ui::EF_COMMAND_DOWN)));
 
-  // Run key test cases for Drallion (Wilco 1.5) keyboard layout
-  SetupKeyboard("Drallion Keyboard", kKbdTopRowLayoutDrallionTag);
-  // Standard key tests using Drallion keyboard layout
-  for (const auto& test : wilco_standard_tests)
-    CheckKeyTestCase(source(), test);
+    // Brightness down -> F5, Search Brightness Down -> Brightness Down
+    EXPECT_EQ(F5Pressed(), RunRewriter(BrightnessDownPressed()));
+    EXPECT_EQ(BrightnessDownPressed(),
+              RunRewriter(BrightnessDownPressed(ui::EF_COMMAND_DOWN)));
 
-  // Drallion specific key tests (no privacy screen)
-  event_rewriter_ash_->set_privacy_screen_for_testing(false);
-  for (const auto& test : drallion_tests_no_privacy_screen)
-    CheckKeyTestCase(source(), test);
+    // Brightness up -> F6, Search + Brightness Up -> Brightness Up
+    EXPECT_EQ(F6Pressed(), RunRewriter(BrightnessUpPressed()));
+    EXPECT_EQ(BrightnessUpPressed(),
+              RunRewriter(BrightnessUpPressed(ui::EF_COMMAND_DOWN)));
 
-  // Drallion specific key tests (privacy screen supported)
-  event_rewriter_ash_->set_privacy_screen_for_testing(true);
-  for (const auto& test : drallion_tests_privacy_screen)
-    CheckKeyTestCase(source(), test);
+    // Volume mute -> F7, Search + Volume Mute -> Volume Mute
+    EXPECT_EQ(F7Pressed(), RunRewriter(VolumeMutePressed()));
+    EXPECT_EQ(VolumeMutePressed(),
+              RunRewriter(VolumeMutePressed(ui::EF_COMMAND_DOWN)));
+
+    // Volume Down -> F8, Search + Volume Down -> Volume Down
+    EXPECT_EQ(F8Pressed(), RunRewriter(VolumeDownPressed()));
+    EXPECT_EQ(VolumeDownPressed(),
+              RunRewriter(VolumeDownPressed(ui::EF_COMMAND_DOWN)));
+
+    // Volume Up -> F9, Search + Volume Up -> Volume Up
+    EXPECT_EQ(F9Pressed(), RunRewriter(VolumeUpPressed()));
+    EXPECT_EQ(VolumeUpPressed(),
+              RunRewriter(VolumeUpPressed(ui::EF_COMMAND_DOWN)));
+
+    // F10 -> F10
+    EXPECT_EQ(F10Pressed(), RunRewriter(F10Pressed()));
+    EXPECT_EQ(F10Pressed(), RunRewriter(F10Pressed(ui::EF_COMMAND_DOWN)));
+
+    // F11 -> F11
+    EXPECT_EQ(F11Pressed(), RunRewriter(F11Pressed()));
+    EXPECT_EQ(F11Pressed(), RunRewriter(F11Pressed(ui::EF_COMMAND_DOWN)));
+  }
+
+  SetUpKeyboard(kWilco1_0Keyboard);
+  // Ctrl + Zoom (Display toggle) -> F12
+  // Search + Ctrl + Zoom (Display toggle) -> Search modifier should be removed
+  EXPECT_EQ(F12Pressed(), RunRewriter(ZoomTogglePressed(ui::EF_CONTROL_DOWN)));
+  EXPECT_EQ(ZoomTogglePressed(ui::EF_CONTROL_DOWN),
+            RunRewriter(
+                ZoomTogglePressed(ui::EF_COMMAND_DOWN | ui::EF_CONTROL_DOWN)));
+
+  SetUpKeyboard(kWilco1_5Keyboard);
+  {
+    // Drallion specific key tests (no privacy screen)
+    event_rewriter_ash_->set_privacy_screen_for_testing(false);
+
+    // Privacy Screen Toggle -> F12,
+    // Search + Privacy Screen Toggle -> F12 (Privacy screen not supported)
+    EXPECT_EQ(F12Pressed(), RunRewriter(PrivacyScreenTogglePressed()));
+    EXPECT_EQ(F12Pressed(),
+              RunRewriter(PrivacyScreenTogglePressed(ui::EF_COMMAND_DOWN)));
+
+    // Ctrl + Zoom (Display toggle) -> Unchanged
+    // Search + Ctrl + Zoom (Display toggle) -> Unchanged
+    EXPECT_EQ(ZoomTogglePressed(ui::EF_CONTROL_DOWN),
+              RunRewriter(ZoomTogglePressed(ui::EF_CONTROL_DOWN)));
+    EXPECT_EQ(ZoomTogglePressed(ui::EF_CONTROL_DOWN),
+              RunRewriter(ZoomTogglePressed(ui::EF_COMMAND_DOWN |
+                                            ui::EF_CONTROL_DOWN)));
+  }
+
+  {
+    // Drallion specific key tests (privacy screen supported)
+    event_rewriter_ash_->set_privacy_screen_for_testing(true);
+
+    // Privacy Screen Toggle -> F12,
+    // Search + Privacy Screen Toggle -> Unchanged
+    EXPECT_EQ(F12Pressed(), RunRewriter(PrivacyScreenTogglePressed()));
+    EXPECT_EQ(PrivacyScreenTogglePressed(),
+              RunRewriter(PrivacyScreenTogglePressed(ui::EF_COMMAND_DOWN)));
+  }
 }
 
 TEST_F(EventRewriterTest, TestRewriteFunctionKeysInvalidLayout) {
@@ -4870,101 +4419,55 @@
   EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_MOD3_DOWN));
 }
 
-class ExtensionRewriterInputTest : public EventRewriterTest {
- public:
-  ExtensionRewriterInputTest() = default;
-  ExtensionRewriterInputTest(const ExtensionRewriterInputTest&) = delete;
-  ExtensionRewriterInputTest& operator=(const ExtensionRewriterInputTest&) =
-      delete;
-  ~ExtensionRewriterInputTest() override = default;
-
-  void SetModifierRemapping(ui::mojom::ModifierKey remap_from,
-                            ui::mojom::ModifierKey remap_to) {
-    keyboard_settings->modifier_remappings[remap_from] = remap_to;
-  }
-
-  void SetExtensionCommands(
-      base::flat_set<std::pair<ui::KeyboardCode, int>> commands) {
-    delegate_->SetExtensionCommandsOverrideForTesting(std::move(commands));
-  }
-
-  void RemoveAllExtensionShortcuts() {
-    delegate_->SetExtensionCommandsOverrideForTesting(absl::nullopt);
-  }
-
-  void ExpectEventRewrittenTo(const KeyTestCase& test) {
-    CheckKeyTestCase(source(), test);
-  }
-};
-
-TEST_F(ExtensionRewriterInputTest, RewrittenModifier) {
+TEST_F(EventRewriterTest, RewrittenModifier) {
   // Register Control + B as an extension shortcut.
-  SetExtensionCommands({{ui::VKEY_B, ui::EF_CONTROL_DOWN}});
+  SetExtensionCommands({{{ui::VKEY_B, ui::EF_CONTROL_DOWN}}});
 
   // Check that standard extension input has no rewritten modifiers.
-  ExpectEventRewrittenTo({ui::ET_KEY_PRESSED,
-                          {ui::VKEY_B, ui::DomCode::US_B, ui::EF_CONTROL_DOWN,
-                           ui::DomKey::Constant<'b'>::Character},
-                          {ui::VKEY_B, ui::DomCode::US_B, ui::EF_CONTROL_DOWN,
-                           ui::DomKey::Constant<'b'>::Character}});
+  EXPECT_EQ(BPressed(ui::EF_CONTROL_DOWN),
+            RunRewriter(BPressed(ui::EF_CONTROL_DOWN)));
 
   // Remap Control -> Alt.
-  SetModifierRemapping(ui::mojom::ModifierKey::kControl,
-                       ui::mojom::ModifierKey::kAlt);
+  IntegerPrefMember control;
+  InitModifierKeyPref(&control, ::prefs::kLanguageRemapControlKeyTo,
+                      ui::mojom::ModifierKey::kControl,
+                      ui::mojom::ModifierKey::kAlt);
   // Pressing Control + B should now be remapped to Alt + B.
-  ExpectEventRewrittenTo({ui::ET_KEY_PRESSED,
-                          {ui::VKEY_B, ui::DomCode::US_B, ui::EF_CONTROL_DOWN,
-                           ui::DomKey::Constant<'b'>::Character},
-                          {ui::VKEY_B, ui::DomCode::US_B, ui::EF_ALT_DOWN,
-                           ui::DomKey::Constant<'b'>::Character}});
+  EXPECT_EQ(BPressed(ui::EF_ALT_DOWN),
+            RunRewriter(BPressed(ui::EF_CONTROL_DOWN)));
 
   // Remap Alt -> Control.
-  SetModifierRemapping(ui::mojom::ModifierKey::kAlt,
-                       ui::mojom::ModifierKey::kControl);
+  IntegerPrefMember alt;
+  InitModifierKeyPref(&alt, ::prefs::kLanguageRemapAltKeyTo,
+                      ui::mojom::ModifierKey::kAlt,
+                      ui::mojom::ModifierKey::kControl);
   // Pressing Alt + B should now be remapped to Control + B.
-  ExpectEventRewrittenTo({ui::ET_KEY_PRESSED,
-                          {ui::VKEY_B, ui::DomCode::US_B, ui::EF_ALT_DOWN,
-                           ui::DomKey::Constant<'b'>::Character},
-                          {ui::VKEY_B, ui::DomCode::US_B, ui::EF_CONTROL_DOWN,
-                           ui::DomKey::Constant<'b'>::Character}});
+  EXPECT_EQ(BPressed(ui::EF_CONTROL_DOWN),
+            RunRewriter(BPressed(ui::EF_ALT_DOWN)));
 
   // Remove all extension shortcuts and still expect the remapping to work.
-  RemoveAllExtensionShortcuts();
+  SetExtensionCommands(std::nullopt);
 
-  ExpectEventRewrittenTo({ui::ET_KEY_PRESSED,
-                          {ui::VKEY_B, ui::DomCode::US_B, ui::EF_CONTROL_DOWN,
-                           ui::DomKey::Constant<'b'>::Character},
-                          {ui::VKEY_B, ui::DomCode::US_B, ui::EF_ALT_DOWN,
-                           ui::DomKey::Constant<'b'>::Character}});
-  ExpectEventRewrittenTo({ui::ET_KEY_PRESSED,
-                          {ui::VKEY_B, ui::DomCode::US_B, ui::EF_ALT_DOWN,
-                           ui::DomKey::Constant<'b'>::Character},
-                          {ui::VKEY_B, ui::DomCode::US_B, ui::EF_CONTROL_DOWN,
-                           ui::DomKey::Constant<'b'>::Character}});
+  EXPECT_EQ(BPressed(ui::EF_ALT_DOWN),
+            RunRewriter(BPressed(ui::EF_CONTROL_DOWN)));
+  EXPECT_EQ(BPressed(ui::EF_CONTROL_DOWN),
+            RunRewriter(BPressed(ui::EF_ALT_DOWN)));
 }
 
-TEST_F(ExtensionRewriterInputTest, RewriteNumpadExtensionCommand) {
+TEST_F(EventRewriterTest, RewriteNumpadExtensionCommand) {
   // Register Control + NUMPAD1 as an extension shortcut.
-  SetExtensionCommands({{ui::VKEY_NUMPAD1, ui::EF_CONTROL_DOWN}});
+  SetExtensionCommands({{{ui::VKEY_NUMPAD1, ui::EF_CONTROL_DOWN}}});
   // Check that extension shortcuts that involve numpads keys are properly
   // rewritten. Note that VKEY_END is associated with NUMPAD1 if Num Lock is
   // disabled. The result should be "NumPad 1 with Control".
-  ExpectEventRewrittenTo(
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_END, ui::DomCode::NUMPAD1, ui::EF_CONTROL_DOWN,
-        ui::DomKey::END},
-       {ui::VKEY_NUMPAD1, ui::DomCode::NUMPAD1, ui::EF_CONTROL_DOWN,
-        ui::DomKey::Constant<'1'>::Character}});
+  EXPECT_EQ(Numpad1Pressed(ui::EF_CONTROL_DOWN),
+            RunRewriter(NumpadEndPressed(ui::EF_CONTROL_DOWN)));
 
   // Remove the extension shortcut and expect the numpad event to still be
   // rewritten.
-  RemoveAllExtensionShortcuts();
-  ExpectEventRewrittenTo(
-      {ui::ET_KEY_PRESSED,
-       {ui::VKEY_END, ui::DomCode::NUMPAD1, ui::EF_CONTROL_DOWN,
-        ui::DomKey::END},
-       {ui::VKEY_NUMPAD1, ui::DomCode::NUMPAD1, ui::EF_CONTROL_DOWN,
-        ui::DomKey::Constant<'1'>::Character}});
+  SetExtensionCommands(std::nullopt);
+  EXPECT_EQ(Numpad1Pressed(ui::EF_CONTROL_DOWN),
+            RunRewriter(NumpadEndPressed(ui::EF_CONTROL_DOWN)));
 }
 
 class ModifierPressedMetricsTest
diff --git a/chrome/browser/ash/extensions/autotest_private/autotest_private_api.cc b/chrome/browser/ash/extensions/autotest_private/autotest_private_api.cc
index 1f1074b..25e05c9 100644
--- a/chrome/browser/ash/extensions/autotest_private/autotest_private_api.cc
+++ b/chrome/browser/ash/extensions/autotest_private/autotest_private_api.cc
@@ -2072,6 +2072,8 @@
       return api::autotest_private::LacrosState::kStopped;
     case crosapi::BrowserManager::State::PREPARING_FOR_LAUNCH:
       return api::autotest_private::LacrosState::kPreparingForLaunch;
+    case crosapi::BrowserManager::State::WAITING_OWNER_FETCH:
+      return api::autotest_private::LacrosState::kWaitingOwnerFetch;
     case crosapi::BrowserManager::State::PRE_LAUNCHED:
       return api::autotest_private::LacrosState::kPreLaunched;
     case crosapi::BrowserManager::State::STARTING:
diff --git a/chrome/browser/ash/floating_workspace/floating_workspace_service.cc b/chrome/browser/ash/floating_workspace/floating_workspace_service.cc
index 5505f31..eeb79291 100644
--- a/chrome/browser/ash/floating_workspace/floating_workspace_service.cc
+++ b/chrome/browser/ash/floating_workspace/floating_workspace_service.cc
@@ -18,7 +18,6 @@
 #include "ash/wm/desks/templates/saved_desk_metrics_util.h"
 #include "ash/wm/desks/templates/saved_desk_util.h"
 #include "base/check.h"
-#include "base/check_is_test.h"
 #include "base/task/single_thread_task_runner.h"
 #include "base/time/time.h"
 #include "base/uuid.h"
@@ -48,7 +47,6 @@
 #include "components/sync_sessions/open_tabs_ui_delegate.h"
 #include "components/sync_sessions/session_sync_service.h"
 #include "components/sync_sessions/synced_session.h"
-#include "floating_workspace_service.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/user_activity/user_activity_detector.h"
 #include "ui/chromeos/devicetype_utils.h"
@@ -130,17 +128,6 @@
 void FloatingWorkspaceService::Init(
     syncer::SyncService* sync_service,
     desks_storage::DeskSyncService* desk_sync_service) {
-  if (is_testing_) {
-    CHECK_IS_TEST();
-    if (version_ == floating_workspace_util::FloatingWorkspaceVersion::
-                        kFloatingWorkspaceV1Enabled) {
-      InitForV1();
-    } else {
-      InitForV2(sync_service, desk_sync_service);
-    }
-    return;
-  }
-
   if (ash::SessionController::Get()) {
     ash::SessionController::Get()->AddObserver(this);
   }
diff --git a/chrome/browser/ash/floating_workspace/floating_workspace_service.h b/chrome/browser/ash/floating_workspace/floating_workspace_service.h
index cc659c8..08f9b352 100644
--- a/chrome/browser/ash/floating_workspace/floating_workspace_service.h
+++ b/chrome/browser/ash/floating_workspace/floating_workspace_service.h
@@ -107,8 +107,6 @@
 
  protected:
   std::unique_ptr<DeskTemplate> previously_captured_desk_template_;
-  // Indicate if it is a testing class.
-  bool is_testing_ = false;
 
  private:
   // ash::SessionObserver:
diff --git a/chrome/browser/ash/floating_workspace/floating_workspace_service_unittest.cc b/chrome/browser/ash/floating_workspace/floating_workspace_service_unittest.cc
index a1ec235..d308991 100644
--- a/chrome/browser/ash/floating_workspace/floating_workspace_service_unittest.cc
+++ b/chrome/browser/ash/floating_workspace/floating_workspace_service_unittest.cc
@@ -16,11 +16,15 @@
 #include "base/test/task_environment.h"
 #include "base/time/time.h"
 #include "chrome/browser/ash/floating_workspace/floating_workspace_metrics_util.h"
+#include "chrome/browser/ash/floating_workspace/floating_workspace_service_factory.h"
 #include "chrome/browser/ash/floating_workspace/floating_workspace_util.h"
 #include "chrome/browser/notifications/notification_display_service_tester.h"
+#include "chrome/browser/prefs/browser_prefs.h"
 #include "chrome/browser/ui/ash/desks/desks_client.h"
 #include "chrome/browser/ui/ash/multi_user/multi_user_util.h"
+#include "chrome/test/base/testing_browser_process.h"
 #include "chrome/test/base/testing_profile.h"
+#include "chrome/test/base/testing_profile_manager.h"
 #include "chromeos/ash/components/network/network_handler_test_helper.h"
 #include "components/account_id/account_id.h"
 #include "components/app_restore/app_launch_info.h"
@@ -33,8 +37,11 @@
 #include "components/sync/base/model_type.h"
 #include "components/sync/service/sync_service.h"
 #include "components/sync/test/test_sync_service.h"
+#include "components/sync_preferences/testing_pref_service_syncable.h"
 #include "components/sync_sessions/open_tabs_ui_delegate.h"
 #include "components/sync_sessions/synced_session.h"
+#include "components/user_manager/fake_user_manager.h"
+#include "components/user_manager/scoped_user_manager.h"
 #include "content/public/test/browser_task_environment.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -48,6 +55,7 @@
 constexpr char kLocalSessionName[] = "local_session";
 constexpr char kRemoteSessionOneName[] = "remote_session_1";
 constexpr char kRemoteSession2Name[] = "remote_session_2";
+constexpr char kTestAccount[] = "usertest@gmail.com";
 const base::Time most_recent_time = base::Time::FromSecondsSinceUnixEpoch(15);
 const base::Time more_recent_time = base::Time::FromSecondsSinceUnixEpoch(10);
 const base::Time least_recent_time = base::Time::FromSecondsSinceUnixEpoch(5);
@@ -184,7 +192,6 @@
       raw_ptr<syncer::TestSyncService> mock_sync_service,
       floating_workspace_util::FloatingWorkspaceVersion version)
       : FloatingWorkspaceService(profile, version) {
-    is_testing_ = true;
     Init(mock_sync_service, fake_desk_sync_service);
     mock_open_tabs_ = std::make_unique<MockOpenTabsUIDelegate>();
     mock_desks_client_ = std::make_unique<MockDesksClient>();
@@ -252,7 +259,7 @@
  public:
   FloatingWorkspaceServiceTest() = default;
 
-  ~FloatingWorkspaceServiceTest() override = default;
+  ~FloatingWorkspaceServiceTest() override { profile_ = nullptr; }
 
   TestingProfile* profile() const { return profile_.get(); }
 
@@ -279,6 +286,11 @@
   ui::UserActivityDetector* user_activity_detector() {
     return user_activity_detector_.get();
   }
+
+  user_manager::FakeUserManager* fake_user_manager() const {
+    return fake_user_manager_.Get();
+  }
+
   bool HasNotificationFor(const std::string& id) {
     absl::optional<message_center::Notification> notification =
         display_service()->GetNotification(id);
@@ -310,13 +322,19 @@
   }
 
   void SetUp() override {
+    profile_manager_ = std::make_unique<TestingProfileManager>(
+        TestingBrowserProcess::GetGlobal());
+    ASSERT_TRUE(profile_manager_->SetUp());
     TestingProfile::Builder profile_builder;
     base::ScopedTempDir temp_dir;
     ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-    profile_builder.SetProfileName("user.test@gmail.com");
-    profile_builder.SetPath(
-        temp_dir.GetPath().AppendASCII("TestFloatingWorkspace"));
-    profile_ = profile_builder.Build();
+    fake_user_manager_.Reset(std::make_unique<user_manager::FakeUserManager>());
+    auto prefs =
+        std::make_unique<sync_preferences::TestingPrefServiceSyncable>();
+    RegisterUserProfilePrefs(prefs->registry());
+    profile_ = profile_manager_->CreateTestingProfile(
+        kTestAccount, std::move(prefs), std::u16string(), /*avatar_id=*/0,
+        TestingProfile::TestingFactories());
     fake_desk_sync_service_ =
         std::make_unique<desks_storage::FakeDeskSyncService>(
             /*skip_engine_connection=*/true);
@@ -329,7 +347,14 @@
     user_activity_detector_->set_last_activity_time_for_test(
         base::TimeTicks::Now());
     cache_ = std::make_unique<apps::AppRegistryCache>();
-    account_id_ = multi_user_util::GetAccountIdFromProfile(profile_.get());
+    account_id_ = AccountId::FromUserEmail(kTestAccount);
+    const std::string username_hash =
+        user_manager::FakeUserManager::GetFakeUsernameHash(account_id_);
+    fake_user_manager()->AddUser(account_id_);
+
+    fake_user_manager()->UserLoggedIn(account_id_, username_hash,
+                                      /*browser_restart=*/false,
+                                      /*is_child=*/false);
     apps::AppRegistryCacheWrapper::Get().AddAppRegistryCache(account_id_,
                                                              cache_.get());
   }
@@ -337,7 +362,7 @@
  private:
   content::BrowserTaskEnvironment task_environment_{
       base::test::TaskEnvironment::TimeSource::MOCK_TIME};
-  std::unique_ptr<TestingProfile> profile_;
+  raw_ptr<TestingProfile, ExperimentalAsh> profile_ = nullptr;
   std::unique_ptr<desks_storage::FakeDeskSyncService> fake_desk_sync_service_;
   std::unique_ptr<NotificationDisplayServiceTester> display_service_;
   base::test::ScopedFeatureList scoped_feature_list_;
@@ -346,6 +371,9 @@
   std::unique_ptr<ui::UserActivityDetector> user_activity_detector_;
   std::unique_ptr<apps::AppRegistryCache> cache_;
   AccountId account_id_;
+  std::unique_ptr<TestingProfileManager> profile_manager_;
+  user_manager::TypedScopedUserManager<user_manager::FakeUserManager>
+      fake_user_manager_;
 };
 
 TEST_F(FloatingWorkspaceServiceTest, RestoreRemoteSession) {
diff --git a/chrome/browser/ash/login/oobe_quick_start/connectivity/connection.cc b/chrome/browser/ash/login/oobe_quick_start/connectivity/connection.cc
index 411dd60..379cd05 100644
--- a/chrome/browser/ash/login/oobe_quick_start/connectivity/connection.cc
+++ b/chrome/browser/ash/login/oobe_quick_start/connectivity/connection.cc
@@ -165,11 +165,16 @@
 }
 
 void Connection::RequestAccountInfo(base::OnceClosure callback) {
+  // During this roundtrip the source device may prompt the user to select an
+  // account before responding, so we will provide a very generous timeout. (In
+  // case, for example, the user has walked away after the verification step.)
+  constexpr base::TimeDelta timeout = base::Minutes(30);
   SendMessageAndDecodeResponse(
       requests::BuildBootstrapOptionsRequest(),
       QuickStartResponseType::kBootstrapConfigurations,
       base::BindOnce(&Connection::OnBootstrapConfigurationsResponse,
-                     weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
+                     weak_ptr_factory_.GetWeakPtr(), std::move(callback)),
+      timeout);
 }
 
 void Connection::RequestAccountTransferAssertion(
diff --git a/chrome/browser/ash/login/oobe_quick_start/connectivity/connection.h b/chrome/browser/ash/login/oobe_quick_start/connectivity/connection.h
index 3465e4d..38ee5aa 100644
--- a/chrome/browser/ash/login/oobe_quick_start/connectivity/connection.h
+++ b/chrome/browser/ash/login/oobe_quick_start/connectivity/connection.h
@@ -40,7 +40,7 @@
 class Connection
     : public TargetDeviceConnectionBroker::AuthenticatedConnection {
  public:
-  static constexpr base::TimeDelta kDefaultRoundTripTimeout = base::Seconds(3);
+  static constexpr base::TimeDelta kDefaultRoundTripTimeout = base::Seconds(60);
 
   using HandshakeSuccessCallback = base::OnceCallback<void(bool)>;
   using ConnectionAuthenticatedCallback = base::OnceCallback<void(
diff --git a/chrome/browser/ash/login/oobe_quick_start/connectivity/connection_unittest.cc b/chrome/browser/ash/login/oobe_quick_start/connectivity/connection_unittest.cc
index 6d93ff8e6..b6dc95a 100644
--- a/chrome/browser/ash/login/oobe_quick_start/connectivity/connection_unittest.cc
+++ b/chrome/browser/ash/login/oobe_quick_start/connectivity/connection_unittest.cc
@@ -88,7 +88,7 @@
 constexpr std::array<uint8_t, 12> kNonce = {0x60, 0x3e, 0x87, 0x69, 0xa3, 0x55,
                                             0xd3, 0x49, 0xbd, 0x0a, 0x63, 0xed};
 
-constexpr base::TimeDelta kResponseTimeout = base::Seconds(3);
+constexpr base::TimeDelta kResponseTimeout = base::Seconds(60);
 
 constexpr char kGaiaTransferResultName[] = "QuickStart.GaiaTransferResult";
 
diff --git a/chrome/browser/ash/login/ui/login_feedback.cc b/chrome/browser/ash/login/ui/login_feedback.cc
index 0521d62..e5cb00e 100644
--- a/chrome/browser/ash/login/ui/login_feedback.cc
+++ b/chrome/browser/ash/login/ui/login_feedback.cc
@@ -42,7 +42,8 @@
       /*show_questionnaire=*/false,
       /*from_chrome_labs_or_kaleidoscope=*/false,
       /*from_autofill=*/false,
-      /*autofill_metadata=*/base::Value::Dict());
+      /*autofill_metadata=*/base::Value::Dict(),
+      /*ai_metadata=*/base::Value::Dict());
 
   if (ash::features::IsOsFeedbackDialogEnabled()) {
     OsFeedbackDialog::ShowDialogAsync(profile_, *info, std::move(callback));
diff --git a/chrome/browser/ash/os_feedback/chrome_os_feedback_delegate_browsertest.cc b/chrome/browser/ash/os_feedback/chrome_os_feedback_delegate_browsertest.cc
index 2b34b831..8b915ad2 100644
--- a/chrome/browser/ash/os_feedback/chrome_os_feedback_delegate_browsertest.cc
+++ b/chrome/browser/ash/os_feedback/chrome_os_feedback_delegate_browsertest.cc
@@ -309,7 +309,8 @@
         /*show_questionnaire=*/false,
         /*from_chrome_labs_or_kaleidoscope=*/false,
         /*from_autofill=*/false,
-        /*autofill_metadata=*/base::Value::Dict());
+        /*autofill_metadata=*/base::Value::Dict(),
+        /*ai_metadata=*/base::Value::Dict());
 
     base::test::TestFuture<void> test_future;
     // Open the feedback dialog.
diff --git a/chrome/browser/ash/shimless_rma/diagnostics_app_profile_helper.cc b/chrome/browser/ash/shimless_rma/diagnostics_app_profile_helper.cc
index d10ebd3..a24a8a1 100644
--- a/chrome/browser/ash/shimless_rma/diagnostics_app_profile_helper.cc
+++ b/chrome/browser/ash/shimless_rma/diagnostics_app_profile_helper.cc
@@ -286,6 +286,9 @@
   }
 
   GetExtensionService(state->context)->EnableExtension(extension->id());
+  // Reload the extension to make sure old service worker are cleaned. This is
+  // important when the extension has already been installed to the profile.
+  GetExtensionService(state->context)->ReloadExtension(extension->id());
 
   GURL script_url = extension->GetResourceURL(
       extensions::BackgroundInfo::GetBackgroundServiceWorkerScript(extension));
diff --git a/chrome/browser/ash/system_web_apps/apps/settings_app_integration_browsertest.cc b/chrome/browser/ash/system_web_apps/apps/settings_app_integration_browsertest.cc
index ac989761..74785b0 100644
--- a/chrome/browser/ash/system_web_apps/apps/settings_app_integration_browsertest.cc
+++ b/chrome/browser/ash/system_web_apps/apps/settings_app_integration_browsertest.cc
@@ -14,8 +14,6 @@
 #include "components/policy/core/common/policy_pref_names.h"
 #include "components/prefs/scoped_user_pref_update.h"
 #include "components/strings/grit/components_strings.h"
-#include "content/public/browser/notification_service.h"
-#include "content/public/browser/notification_types.h"
 #include "content/public/test/browser_test.h"
 #include "content/public/test/test_navigation_observer.h"
 #include "ui/base/l10n/l10n_util.h"
@@ -70,12 +68,12 @@
       ->InstallSystemAppsForTesting();
   GURL old_url = browser()->tab_strip_model()->GetActiveWebContents()->GetURL();
   {
-    content::WindowedNotificationObserver observer(
-        content::NOTIFICATION_LOAD_STOP,
-        content::NotificationService::AllSources());
+    ui_test_utils::AllBrowserTabAddedWaiter waiter;
     chrome::SettingsWindowManager::GetInstance()->ShowOSSettings(
         browser()->profile());
-    observer.Wait();
+    auto* web_contents = waiter.Wait();
+    ASSERT_TRUE(web_contents);
+    content::WaitForLoadStop(web_contents);
   }
   // browser() tab contents should be unaffected.
   EXPECT_EQ(1, browser()->tab_strip_model()->count());
diff --git a/chrome/browser/autofill/autofill_interactive_uitest.cc b/chrome/browser/autofill/autofill_interactive_uitest.cc
index ed9aa0fa..ca4850b 100644
--- a/chrome/browser/autofill/autofill_interactive_uitest.cc
+++ b/chrome/browser/autofill/autofill_interactive_uitest.cc
@@ -163,6 +163,10 @@
 constexpr std::string_view kNumElementsMatchesNumFields =
     "Autofill.NumElementsMatchesNumFields";
 
+ACTION_P(InvokeClosure, closure) {
+  closure.Run();
+}
+
 // Continuously merges histograms from all subprocesses and checks if the
 // histogram `histogram_name` got observed with `expected_count` and
 // `expected_sample`. Then runs `base::HistogramTester::ExpectUniqueSample`.
@@ -268,21 +272,6 @@
   return AssertionSuccess();
 }
 
-// Executes `EnterTextIntoField()` for a series of fields.
-[[nodiscard]] AssertionResult EnterTextsIntoFields(
-    std::vector<std::pair<autofill::ElementExpr, std::string>> values,
-    AutofillUiTest* test,
-    content::ToRenderFrameHost execution_target) {
-  for (const auto& [element, value] : values) {
-    AssertionResult a =
-        EnterTextIntoField(element, value, test, execution_target);
-    if (!a) {
-      return AssertionFailure() << __func__ << "(): " << a;
-    }
-  }
-  return AssertionSuccess();
-}
-
 const std::vector<FieldValue> kEmptyAddress{
     {"firstname", ""}, {"lastname", ""}, {"address1", ""},
     {"address2", ""},  {"city", ""},     {"state", ""},
@@ -292,6 +281,7 @@
   const char* first_name = "Milton";
   const char* middle_name = "C.";
   const char* last_name = "Waddams";
+  const char* full_name = "Milton C. Waddams";
   const char* address1 = "4120 Freidrich Lane";
   const char* address2 = "Basement";
   const char* city = "Austin";
@@ -528,11 +518,16 @@
 // Matcher for a FormData which checks that the submitted fields correspond
 // to the name/value pairs in `expected`.
 auto SubmittedValuesAre(
-    const std::map<std::u16string, std::u16string>& expected) {
-  auto get_submitted_values = [](const FormData& form) {
-    std::map<std::u16string, std::u16string> result;
+    const std::vector<std::u16string FormFieldData::*>& property_accessors,
+    const std::vector<std::vector<std::u16string>>& expected) {
+  auto get_submitted_values = [property_accessors](const FormData& form) {
+    std::vector<std::vector<std::u16string>> result;
     for (const auto& field : form.fields) {
-      result[field.name] = field.value;
+      std::vector<std::u16string> field_properties;
+      for (std::u16string FormFieldData::*field_member : property_accessors) {
+        field_properties.push_back(field.*field_member);
+      }
+      result.push_back(field_properties);
     }
     return result;
   };
@@ -3818,20 +3813,19 @@
         autofill_manager(), base::BindRepeating([](const FormStructure& form) {
           return form.active_field_count() == 5;
         })));
-
-    EnterValues();
   }
 
   void SetUpServer() {
     SetTestUrlResponse(R"(
         <html><body>
-        <form id='form' method='POST' action='/success.html'>
+        <form id='shipping' method='POST' action='/success.html'>
         Name: <input type='text' id='name'><br>
         Address: <input type='text' id='address'><br>
         City: <input type='text' id='city'><br>
         ZIP: <input type='text' id='zip'><br>
         State: <select id='state'>
           <option value='CA'>CA</option>
+          <option value='TX'>TX</option>
           <option value='WA'>WA</option>
         </select><br>
         </form>
@@ -3841,21 +3835,29 @@
   }
 
   void EnterValues() {
-    TestAutofillManagerWaiter waiter(
-        *autofill_manager(), {AutofillManagerEvent::kTextFieldDidChange});
-    // Normally we would enter the state last, but we don't have a
-    // kSelectElementDidChange event, yet. Therefore, we just wait until
-    // the second text field was reported to the autofill manager.
-    ASSERT_TRUE(
-        EnterTextsIntoFields({{GetElementById("name"), "Sarah"},
-                              {GetElementById("state"), "WA"},
-                              {GetElementById("address"), "123 Main Road"}},
-                             this, GetWebContents()));
-    ASSERT_TRUE(waiter.Wait(2u));
+    // Normally we would enter the "US state" last, but we don't have a
+    // kSelectElementDidChange event, yet. Use multi-arg version of
+    // EnterValues() to wait until the last field was reported to the autofill
+    // manager.
+    EnterValues(
+        {{"name", "Sarah"}, {"state", "WA"}, {"address", "123 Main Road"}},
+        /*num_modified_textfields=*/2u);
   }
 
-  std::map<std::u16string, std::u16string> GetExpectedValues() {
-    return std::map<std::u16string, std::u16string>{
+  void EnterValues(const std::vector<FieldValue>& values,
+                   size_t num_modified_textfields) {
+    TestAutofillManagerWaiter waiter(
+        *autofill_manager(), {AutofillManagerEvent::kTextFieldDidChange});
+    for (const FieldValue& value : values) {
+      ASSERT_TRUE(EnterTextIntoField(GetElementById(value.id), value.value,
+                                     this, GetWebContents()));
+    }
+    ASSERT_TRUE(waiter.Wait(num_modified_textfields));
+  }
+
+  std::vector<std::vector<std::u16string>> GetExpectedValues() {
+    // name, value
+    return std::vector<std::vector<std::u16string>>{
         {u"name", u"Sarah"},
         {u"address", u"123 Main Road"},
         {u"city", u""},
@@ -3875,17 +3877,20 @@
 // BrowserAutofillManager.
 IN_PROC_BROWSER_TEST_F(MAYBE_AutofillInteractiveFormSubmissionTest,
                        Submission) {
+  EnterValues();
+
   base::RunLoop run_loop;
   // Ensure that only expected form submissions are recorded.
   EXPECT_CALL(*autofill_manager(), OnFormSubmittedImpl).Times(0);
-  EXPECT_CALL(*autofill_manager(),
-              OnFormSubmittedImpl(SubmittedValuesAre(GetExpectedValues()),
-                                  /*known_success=*/false,
-                                  mojom::SubmissionSource::FORM_SUBMISSION))
+  EXPECT_CALL(
+      *autofill_manager(),
+      OnFormSubmittedImpl(
+          SubmittedValuesAre({&FormFieldData::name, &FormFieldData::value},
+                             GetExpectedValues()),
+          /*known_success=*/false, mojom::SubmissionSource::FORM_SUBMISSION))
       .Times(1)
-      .WillRepeatedly(
-          testing::InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); }));
-  ExecuteScript("document.getElementById('form').submit();");
+      .WillRepeatedly(InvokeClosure(run_loop.QuitClosure()));
+  ExecuteScript("document.getElementById('shipping').submit();");
   run_loop.Run();
 }
 
@@ -3893,17 +3898,20 @@
 // submission event in BrowserAutofillManager.
 IN_PROC_BROWSER_TEST_F(MAYBE_AutofillInteractiveFormSubmissionTest,
                        ProbableSubmission) {
+  EnterValues();
+
   base::RunLoop run_loop;
   // Ensure that only expected form submissions are recorded.
   EXPECT_CALL(*autofill_manager(), OnFormSubmittedImpl).Times(0);
   EXPECT_CALL(
       *autofill_manager(),
-      OnFormSubmittedImpl(SubmittedValuesAre(GetExpectedValues()),
-                          /*known_success=*/false,
-                          mojom::SubmissionSource::PROBABLY_FORM_SUBMITTED))
+      OnFormSubmittedImpl(
+          SubmittedValuesAre({&FormFieldData::name, &FormFieldData::value},
+                             GetExpectedValues()),
+          /*known_success=*/false,
+          mojom::SubmissionSource::PROBABLY_FORM_SUBMITTED))
       .Times(1)
-      .WillRepeatedly(
-          testing::InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); }));
+      .WillRepeatedly(InvokeClosure(run_loop.QuitClosure()));
   // Add a delay before navigating away to avoid race conditions. This is
   // appropriate since we're faking user interaction here.
   ExecuteScript(
@@ -3914,29 +3922,32 @@
 // Tests that a same document navigation can trigger a form submission.
 IN_PROC_BROWSER_TEST_F(MAYBE_AutofillInteractiveFormSubmissionTest,
                        SameDocumentNavigation) {
+  EnterValues();
+
   base::RunLoop run_loop;
   // Ensure that only expected form submissions are recorded.
   EXPECT_CALL(*autofill_manager(), OnFormSubmittedImpl).Times(0);
   EXPECT_CALL(
       *autofill_manager(),
-      OnFormSubmittedImpl(SubmittedValuesAre(GetExpectedValues()),
-                          /*known_success=*/true,
-                          mojom::SubmissionSource::SAME_DOCUMENT_NAVIGATION))
+      OnFormSubmittedImpl(
+          SubmittedValuesAre({&FormFieldData::name, &FormFieldData::value},
+                             GetExpectedValues()),
+          /*known_success=*/true,
+          mojom::SubmissionSource::SAME_DOCUMENT_NAVIGATION))
       .Times(1)
-      .WillRepeatedly(
-          testing::InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); }));
+      .WillRepeatedly(InvokeClosure(run_loop.QuitClosure()));
 
   // Simulate form submission.
   ExecuteScript(
       R"(
       // Same document navigation:
-      document.getElementById('form').style.display = 'none';
+      document.getElementById('shipping').style.display = 'none';
       const url = new URL(window.location);
       url.searchParams.set('foo', 'bar');
       window.history.pushState({}, '', url);
 
       // Hide form, which is the trigger for the submission event.
-      document.getElementById('form').style.display = 'none';
+      document.getElementById('shipping').style.display = 'none';
       )");
   run_loop.Run();
 }
@@ -3944,24 +3955,27 @@
 // Tests that an XHR request can indicate a form submission.
 IN_PROC_BROWSER_TEST_F(MAYBE_AutofillInteractiveFormSubmissionTest,
                        XhrSucceededAndHideForm) {
+  EnterValues();
+
   base::RunLoop run_loop;
 
   // Ensure that only expected form submissions are recorded.
   EXPECT_CALL(*autofill_manager(), OnFormSubmittedImpl).Times(0);
-  EXPECT_CALL(*autofill_manager(),
-              OnFormSubmittedImpl(SubmittedValuesAre(GetExpectedValues()),
-                                  /*known_success=*/true,
-                                  mojom::SubmissionSource::XHR_SUCCEEDED))
+  EXPECT_CALL(
+      *autofill_manager(),
+      OnFormSubmittedImpl(
+          SubmittedValuesAre({&FormFieldData::name, &FormFieldData::value},
+                             GetExpectedValues()),
+          /*known_success=*/true, mojom::SubmissionSource::XHR_SUCCEEDED))
       .Times(1)
-      .WillRepeatedly(
-          testing::InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); }));
+      .WillRepeatedly(InvokeClosure(run_loop.QuitClosure()));
 
   // Simulate form submission.
   ExecuteScript(
       R"(
       // SubmissionSource::XHR_SUCCEEDED is triggered if an XHR is observed
       // after the form has been made invisible.
-      document.getElementById('form').style.display = 'none';
+      document.getElementById('shipping').style.display = 'none';
 
       const xhr = new XMLHttpRequest();
       xhr.open('GET', '/xhr', true);
@@ -3974,24 +3988,27 @@
 // is deleted from the DOM.
 IN_PROC_BROWSER_TEST_F(MAYBE_AutofillInteractiveFormSubmissionTest,
                        XhrSucceededAndDeleteForm) {
+  EnterValues();
+
   base::RunLoop run_loop;
 
   // Ensure that only expected form submissions are recorded.
   EXPECT_CALL(*autofill_manager(), OnFormSubmittedImpl).Times(0);
-  EXPECT_CALL(*autofill_manager(),
-              OnFormSubmittedImpl(SubmittedValuesAre(GetExpectedValues()),
-                                  /*known_success=*/true,
-                                  mojom::SubmissionSource::XHR_SUCCEEDED))
+  EXPECT_CALL(
+      *autofill_manager(),
+      OnFormSubmittedImpl(
+          SubmittedValuesAre({&FormFieldData::name, &FormFieldData::value},
+                             GetExpectedValues()),
+          /*known_success=*/true, mojom::SubmissionSource::XHR_SUCCEEDED))
       .Times(1)
-      .WillRepeatedly(
-          testing::InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); }));
+      .WillRepeatedly(InvokeClosure(run_loop.QuitClosure()));
 
   // Simulate form submission.
   ExecuteScript(
       R"(
       // SubmissionSource::XHR_SUCCEEDED is triggered if an XHR is observed
       // after the form has been deleted.
-      const form = document.getElementById('form');
+      const form = document.getElementById('shipping');
       form.remove();
 
       const xhr = new XMLHttpRequest();
@@ -4004,18 +4021,21 @@
 // Tests that a DOM mutation after an XHR can indicate a form submission.
 IN_PROC_BROWSER_TEST_F(MAYBE_AutofillInteractiveFormSubmissionTest,
                        DomMutationAfterXhr) {
+  EnterValues();
+
   base::RunLoop run_loop;
 
   // Ensure that only expected form submissions are recorded.
   EXPECT_CALL(*autofill_manager(), OnFormSubmittedImpl).Times(0);
   EXPECT_CALL(
       *autofill_manager(),
-      OnFormSubmittedImpl(SubmittedValuesAre(GetExpectedValues()),
-                          /*known_success=*/true,
-                          mojom::SubmissionSource::DOM_MUTATION_AFTER_XHR))
+      OnFormSubmittedImpl(
+          SubmittedValuesAre({&FormFieldData::name, &FormFieldData::value},
+                             GetExpectedValues()),
+          /*known_success=*/true,
+          mojom::SubmissionSource::DOM_MUTATION_AFTER_XHR))
       .Times(1)
-      .WillRepeatedly(
-          testing::InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); }));
+      .WillRepeatedly(InvokeClosure(run_loop.QuitClosure()));
 
   // Simulate form submission.
   ExecuteScript(
@@ -4028,7 +4048,7 @@
         // The DOM modification has to happen asynchronously. Otherwise this
         // is reported as an XHR_SUCCEEDED event.
         setTimeout(() => {
-            document.getElementById('form').style.display = 'none';
+            document.getElementById('shipping').style.display = 'none';
           }, 50);
       }
       xhr.send(null);
@@ -4036,4 +4056,162 @@
   run_loop.Run();
 }
 
+// Tests that FormFieldData::user_input has the text that the user typed into
+// the field. This is needed in order to show the save-card dialog when the
+// page replaces the <input> value with '***'.
+IN_PROC_BROWSER_TEST_F(MAYBE_AutofillInteractiveFormSubmissionTest,
+                       RememberUserInput) {
+  EnterValues();
+
+  // name, value, user_input
+  const std::vector<std::vector<std::u16string>> kExpectedSubmittedValues{
+      {u"name", u"JS Modified Name", u"Sarah"},
+      {u"address", u"JS Modified Address", u"123 Main Road"},
+      {u"city", u"", u""},
+      {u"zip", u"", u""},
+      // user_input is not set for <select>
+      {u"state", u"WA", u""}};
+
+  ExecuteScript("document.getElementById('name').value = 'JS Modified Name';");
+  ExecuteScript(
+      "document.getElementById('address').value = 'JS Modified Address';");
+
+  base::RunLoop run_loop;
+  // Ensure that only expected form submissions are recorded.
+  EXPECT_CALL(*autofill_manager(), OnFormSubmittedImpl).Times(0);
+  EXPECT_CALL(
+      *autofill_manager(),
+      OnFormSubmittedImpl(
+          SubmittedValuesAre({&FormFieldData::name, &FormFieldData::value,
+                              &FormFieldData::user_input},
+                             kExpectedSubmittedValues),
+          /*known_success=*/false, mojom::SubmissionSource::FORM_SUBMISSION))
+      .Times(1)
+      .WillRepeatedly(InvokeClosure(run_loop.QuitClosure()));
+  ExecuteScript("document.getElementById('shipping').submit();");
+  run_loop.Run();
+}
+
+// Tests scenario where in sequence:
+// 1) The user types into a form
+// 2) The form is cleared via JavaScript
+// 3) The user autofills the form
+// 4) The user submits the form
+// That FormFieldData::user_input is empty and does not contain stale data that
+// the user typed into the form.
+IN_PROC_BROWSER_TEST_F(MAYBE_AutofillInteractiveFormSubmissionTest,
+                       TreatAutofillAsUserInput) {
+  CreateTestProfile();
+
+  EnterValues({{"address", "User Entered Address"}},
+              /*num_modified_textfields=*/1u);
+  ExecuteScript("document.getElementById('address').value = '';");
+
+  ASSERT_TRUE(AutofillFlow(GetElementById("name"), this,
+                           {.show_method = ShowMethod::ByChar('M')}));
+  const std::vector<FieldValue> kExpectedAddress{
+      {"name", kDefaultAddressValues.full_name},
+      {"address", kDefaultAddressValues.address1},
+      {"city", kDefaultAddressValues.city},
+      {"zip", kDefaultAddressValues.zip},
+      {"state", kDefaultAddressValues.state_short}};
+  EXPECT_THAT(GetFormValues(), ValuesAre(kExpectedAddress));
+
+  std::vector<std::vector<std::u16string>> expected_submitted_values;
+  for (const FieldValue& field_value : kExpectedAddress) {
+    expected_submitted_values.push_back(
+        {/*name=*/base::UTF8ToUTF16(field_value.id),
+         /*value=*/base::UTF8ToUTF16(field_value.value),
+         /*user_input=*/u""});
+  }
+
+  base::RunLoop run_loop;
+  // Ensure that only expected form submissions are recorded.
+  EXPECT_CALL(*autofill_manager(), OnFormSubmittedImpl).Times(0);
+  EXPECT_CALL(
+      *autofill_manager(),
+      OnFormSubmittedImpl(
+          SubmittedValuesAre({&FormFieldData::name, &FormFieldData::value,
+                              &FormFieldData::user_input},
+                             expected_submitted_values),
+          /*known_success=*/false, mojom::SubmissionSource::FORM_SUBMISSION))
+      .Times(1)
+      .WillRepeatedly(InvokeClosure(run_loop.QuitClosure()));
+  ExecuteScript("document.getElementById('shipping').submit();");
+  run_loop.Run();
+}
+
+// MAYBE_AutofillInteractiveFormSubmissionTest subclass which disables
+// features::kAutofillUndo
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+#define MAYBE_AutofillInteractiveFormSubmissionClearFormTest \
+  DISABLED_AutofillInteractiveFormSubmissionClearFormTest
+#else
+#define MAYBE_AutofillInteractiveFormSubmissionClearFormTest \
+  AutofillInteractiveFormSubmissionClearFormTest
+#endif
+class MAYBE_AutofillInteractiveFormSubmissionClearFormTest
+    : public MAYBE_AutofillInteractiveFormSubmissionTest {
+ public:
+   MAYBE_AutofillInteractiveFormSubmissionClearFormTest() {
+    scoped_feature_list_.InitAndDisableFeature(features::kAutofillUndo);
+   }
+
+ private:
+  base::test::ScopedFeatureList scoped_feature_list_;
+};
+
+// Tests scenario where in sequence:
+// 1) The user autofills the form
+// 2) The user clears the form via the context menu
+// 3) The user submits the form
+// That FormFieldData::user_input is empty and does not contain stale data.
+IN_PROC_BROWSER_TEST_F(MAYBE_AutofillInteractiveFormSubmissionClearFormTest,
+                       ClearFormClearsUserInput) {
+  CreateTestProfile();
+
+  // Autofill
+  ASSERT_TRUE(AutofillFlow(GetElementById("name"), this,
+                           {.show_method = ShowMethod::ByChar('M')}));
+  const std::vector<FieldValue> kAutofilledAddress{
+      {"name", kDefaultAddressValues.full_name},
+      {"address", kDefaultAddressValues.address1},
+      {"city", kDefaultAddressValues.city},
+      {"zip", kDefaultAddressValues.zip},
+      {"state", kDefaultAddressValues.state_short}};
+  EXPECT_THAT(GetFormValues(), ValuesAre(kAutofilledAddress));
+
+  // Clear form.
+  ASSERT_TRUE(AutofillFlow(GetElementById("name"), this, {.target_index = 1}));
+  const std::vector<FieldValue> kClearedAddress{{"name", ""},
+                                                {"address", ""},
+                                                {"city", ""},
+                                                {"zip", ""},
+                                                {"state", "CA"}};
+  EXPECT_THAT(GetFormValues(), ValuesAre(kClearedAddress));
+
+  // name, value, user_input
+  std::vector<std::vector<std::u16string>> kSubmittedValues = {
+      {u"name", u"", u""},
+      {u"address", u"", u""},
+      {u"city", u"", u""},
+      {u"zip", u"", u""},
+      {u"state", u"CA", u""}};
+
+  base::RunLoop run_loop;
+  // Ensure that only expected form submissions are recorded.
+  EXPECT_CALL(*autofill_manager(), OnFormSubmittedImpl).Times(0);
+  EXPECT_CALL(
+      *autofill_manager(),
+      OnFormSubmittedImpl(
+          SubmittedValuesAre({&FormFieldData::name, &FormFieldData::value,
+                              &FormFieldData::user_input},
+                             kSubmittedValues),
+          /*known_success=*/false, mojom::SubmissionSource::FORM_SUBMISSION))
+      .Times(1)
+      .WillRepeatedly(InvokeClosure(run_loop.QuitClosure()));
+  ExecuteScript("document.getElementById('shipping').submit();");
+  run_loop.Run();
+}
+
 }  // namespace autofill
diff --git a/chrome/browser/component_updater/screen_ai_component_installer.cc b/chrome/browser/component_updater/screen_ai_component_installer.cc
index fc6041c..5ec634af 100644
--- a/chrome/browser/component_updater/screen_ai_component_installer.cc
+++ b/chrome/browser/component_updater/screen_ai_component_installer.cc
@@ -7,8 +7,6 @@
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/logging.h"
-#include "base/metrics/histogram_functions.h"
-#include "base/native_library.h"
 #include "base/values.h"
 #include "chrome/browser/screen_ai/screen_ai_install_state.h"
 #include "components/component_updater/component_updater_service.h"
@@ -87,36 +85,7 @@
     return false;
   }
 
-  // Check the file iterator heuristic to find the library in the sandbox
-  // returns the same directory as `install_dir`.
-  base::FilePath binary_path = screen_ai::GetLatestComponentBinaryPath();
-  bool expected_path = (binary_path.DirName() == install_dir);
-
-#if !BUILDFLAG(IS_WIN)
-  return expected_path;
-#else
-  // TODO(crbug.com/1498394): Remove the following after the crash reason is
-  // found.
-  base::UmaHistogramBoolean("Accessibility.ScreenAI.LibraryPathVerified",
-                            expected_path);
-  if (!expected_path) {
-    return false;
-  }
-
-  base::NativeLibraryLoadError lib_error;
-  HMODULE h_mod = base::LoadNativeLibrary(binary_path, &lib_error);
-  bool result = h_mod != nullptr;
-  base::UmaHistogramSparse("Accessibility.ScreenAI.LibraryAccessResultOnVerify",
-                           lib_error.code);
-  base::UmaHistogramBoolean("Accessibility.ScreenAI.LibraryAvailableOnVerify",
-                            result);
-
-  if (h_mod) {
-    base::UnloadNativeLibrary(h_mod);
-  }
-
-  return result;
-#endif
+  return screen_ai::ScreenAIInstallState::VerifyLibraryAvailablity(install_dir);
 }
 
 base::FilePath ScreenAIComponentInstallerPolicy::GetRelativeInstallDir() const {
@@ -145,15 +114,14 @@
 
 // static
 void ScreenAIComponentInstallerPolicy::DeleteComponent() {
-  base::FilePath component_binary_path =
-      screen_ai::GetLatestComponentBinaryPath();
-
-  if (!component_binary_path.empty()) {
-    base::DeletePathRecursively(component_binary_path.DirName());
-    screen_ai::ScreenAIInstallState::RecordComponentInstallationResult(
-        /*install=*/false,
-        /*successful=*/true);
+  if (screen_ai::GetLatestComponentBinaryPath().empty()) {
+    return;
   }
+
+  base::DeletePathRecursively(screen_ai::GetComponentDir());
+  screen_ai::ScreenAIInstallState::RecordComponentInstallationResult(
+      /*install=*/false,
+      /*successful=*/true);
 }
 
 void ManageScreenAIComponentRegistration(ComponentUpdateService* cus,
diff --git a/chrome/browser/extensions/extension_untrusted_webui_apitest.cc b/chrome/browser/extensions/extension_untrusted_webui_apitest.cc
index 74e1482..38244ebec 100644
--- a/chrome/browser/extensions/extension_untrusted_webui_apitest.cc
+++ b/chrome/browser/extensions/extension_untrusted_webui_apitest.cc
@@ -28,7 +28,8 @@
 class ExtensionUntrustedWebUITest : public ExtensionApiTest {
  public:
   ExtensionUntrustedWebUITest() {
-    scoped_feature_list_.InitWithFeatures({features::kReadAnything}, {});
+    scoped_feature_list_.InitWithFeatures(
+        {features::kReadAnything, features::kReadAnythingLocalSidePanel}, {});
   }
 
   ~ExtensionUntrustedWebUITest() override = default;
diff --git a/chrome/browser/feedback/show_feedback_page.cc b/chrome/browser/feedback/show_feedback_page.cc
index 5214e87..347abfa 100644
--- a/chrome/browser/feedback/show_feedback_page.cc
+++ b/chrome/browser/feedback/show_feedback_page.cc
@@ -217,7 +217,8 @@
                          const std::string& description_placeholder_text,
                          const std::string& category_tag,
                          const std::string& extra_diagnostics,
-                         base::Value::Dict autofill_metadata) {
+                         base::Value::Dict autofill_metadata,
+                         base::Value::Dict ai_metadata) {
   feedback_private::FeedbackFlow flow = GetFeedbackFlowFromSource(source);
   bool include_bluetooth_logs = false;
   bool show_questionnaire = false;
@@ -250,7 +251,8 @@
       include_bluetooth_logs, show_questionnaire,
       source == kFeedbackSourceChromeLabs ||
           source == kFeedbackSourceKaleidoscope,
-      source == kFeedbackSourceAutofillContextMenu, autofill_metadata);
+      source == kFeedbackSourceAutofillContextMenu, autofill_metadata,
+      ai_metadata);
 
   FeedbackDialog::CreateOrShow(profile, *info);
 }
@@ -277,7 +279,8 @@
                       const std::string& description_placeholder_text,
                       const std::string& category_tag,
                       const std::string& extra_diagnostics,
-                      base::Value::Dict autofill_metadata) {
+                      base::Value::Dict autofill_metadata,
+                      base::Value::Dict ai_metadata) {
   GURL page_url;
   if (browser) {
     page_url = GetTargetTabUrl(browser->session_id(),
@@ -304,7 +307,8 @@
 #else
   ShowFeedbackPage(page_url, profile, source, description_template,
                    description_placeholder_text, category_tag,
-                   extra_diagnostics, std::move(autofill_metadata));
+                   extra_diagnostics, std::move(autofill_metadata),
+                   std::move(ai_metadata));
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 }
 
@@ -315,7 +319,8 @@
                       const std::string& description_placeholder_text,
                       const std::string& category_tag,
                       const std::string& extra_diagnostics,
-                      base::Value::Dict autofill_metadata) {
+                      base::Value::Dict autofill_metadata,
+                      base::Value::Dict ai_metadata) {
   if (!profile) {
     LOG(ERROR) << "Cannot invoke feedback: No profile found!";
     return;
@@ -328,8 +333,10 @@
                             kFeedbackSourceCount);
 
 #if BUILDFLAG(IS_CHROMEOS_LACROS)
-  // After M87 beta, Feedback API should be supported in crosapi with all ash
-  // versions on chromeOS platform where lacros is deployed.
+  // TODO(crbug.com/1501057): Update enhanced feedback dialog crosapi API for
+  // Lacros.
+  // After M87 beta, Feedback API should be supported in crosapi with
+  // all ash versions on chromeOS platform where lacros is deployed.
   DCHECK(
       chromeos::LacrosService::Get()->IsAvailable<crosapi::mojom::Feedback>());
   // Send request to ash via crosapi mojo to show Feedback ui from ash.
@@ -340,7 +347,8 @@
   // Show feedback dialog using feedback extension API.
   RequestFeedbackFlow(page_url, profile, source, description_template,
                       description_placeholder_text, category_tag,
-                      extra_diagnostics, std::move(autofill_metadata));
+                      extra_diagnostics, std::move(autofill_metadata),
+                      std::move(ai_metadata));
 #endif  //  BUILDFLAG(IS_CHROMEOS_LACROS)
 }
 
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index 9a1bf725..6bba1321 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -1463,7 +1463,7 @@
   {
     "name": "csc-companion-enable-page-content",
     "owners": ["manukh@google.com", "stanfield@google.com", "mcrouse@google.com", "lens-chrome@google.com"],
-    "expiry_milestone": 120
+    "expiry_milestone": 125
   },
   {
     "name": "csc-force-companion-pinned-state",
@@ -5460,6 +5460,11 @@
     "owners": [ "knollr@chromium.org", "peter@chromium.org" ],
     "expiry_milestone": 96
   },
+  {
+    "name": "nearby-presence",
+    "owners": ["chromeos-cross-device-eng@google.com", "hansberry@chromium.org"],
+    "expiry_milestone": 125
+  },
   {"name": "nearby-sharing-self-share",
    "owners": ["brandosocarras@google.com", "hansenmichael@google.com", "chromeos-cross-device-eng@google.com"],
    "expiry_milestone": 125
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index 873f75b..8443cfd 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -6844,6 +6844,10 @@
     "Enables Self Share auto-accept and UI features to allow seamless sharing "
     "between a user's own devices.";
 
+const char kNearbyPresenceName[] = "Nearby Presence";
+const char kNearbyPresenceDescription[] =
+    "Enables Nearby Presence for scanning and discovery of nearby devices.";
+
 const char kOobeHidDetectionRevampName[] = "OOBE HID Detection Revamp";
 const char kOobeHidDetectionRevampDescription[] =
     "Enables the ChromeOS HID Detection Revamp, which updates OOBE HID "
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index 8b9a6d6..157c48a 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -3931,6 +3931,9 @@
 extern const char kNearbySharingSelfShareName[];
 extern const char kNearbySharingSelfShareDescription[];
 
+extern const char kNearbyPresenceName[];
+extern const char kNearbyPresenceDescription[];
+
 extern const char kOobeHidDetectionRevampName[];
 extern const char kOobeHidDetectionRevampDescription[];
 
diff --git a/chrome/browser/installable/ml_promotion_browsertest_base.cc b/chrome/browser/installable/ml_promotion_browsertest_base.cc
index 991e869..523f641 100644
--- a/chrome/browser/installable/ml_promotion_browsertest_base.cc
+++ b/chrome/browser/installable/ml_promotion_browsertest_base.cc
@@ -86,9 +86,11 @@
   base::test::TestFuture<const webapps::AppId&, InstallResultCode>
       install_future;
 
+  // TODO(crbug.com/1504023): Use OMNIBOX_INSTALL_ICON and
+  // TestAcceptInstallDialogCallback to represent a real installation.
   provider->scheduler().FetchManifestAndInstall(
-      WebappInstallSource::OMNIBOX_INSTALL_ICON, web_contents()->GetWeakPtr(),
-      base::BindOnce(web_app::test::TestAcceptDialogCallback),
+      WebappInstallSource::MENU_CREATE_SHORTCUT, web_contents()->GetWeakPtr(),
+      base::BindOnce(web_app::test::TestAcceptCreateShortcutDialogCallback),
       install_future.GetCallback(), /*use_fallback=*/false);
 
   bool success = install_future.Wait();
diff --git a/chrome/browser/lacros/field_trial_observer.cc b/chrome/browser/lacros/field_trial_observer.cc
index c4d3f2a..99d2503 100644
--- a/chrome/browser/lacros/field_trial_observer.cc
+++ b/chrome/browser/lacros/field_trial_observer.cc
@@ -4,10 +4,8 @@
 
 #include "chrome/browser/lacros/field_trial_observer.h"
 
-#include "base/strings/strcat.h"
 #include "chrome/browser/metrics/chrome_metrics_service_accessor.h"
 #include "chromeos/lacros/lacros_service.h"
-#include "components/variations/active_field_trials.h"
 
 namespace {
 // Prefix prepended by Lacros before sending ash field trials as
@@ -40,9 +38,6 @@
     std::vector<crosapi::mojom::FieldTrialGroupInfoPtr> infos) {
   for (const auto& info : infos) {
     ChromeMetricsServiceAccessor::RegisterSyntheticFieldTrial(
-        ASH_FIELD_TRIAL_PREFIX + info->trial_name,
-        info->is_overridden.value_or(false)
-            ? base::StrCat({info->group_name, variations::kOverrideSuffix})
-            : info->group_name);
+        ASH_FIELD_TRIAL_PREFIX + info->trial_name, info->group_name);
   }
 }
diff --git a/chrome/browser/pdf/pdf_extension_accessibility_test.cc b/chrome/browser/pdf/pdf_extension_accessibility_test.cc
index 7866ee01..e09d937 100644
--- a/chrome/browser/pdf/pdf_extension_accessibility_test.cc
+++ b/chrome/browser/pdf/pdf_extension_accessibility_test.cc
@@ -6,6 +6,8 @@
 
 #include <map>
 #include <string>
+#include <tuple>
+#include <variant>
 #include <vector>
 
 #include "base/containers/contains.h"
@@ -17,7 +19,9 @@
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/metrics/histogram_tester.h"
+#include "base/test/scoped_feature_list.h"
 #include "base/test/test_future.h"
+#include "base/test/with_feature_override.h"
 #include "base/threading/thread_restrictions.h"
 #include "build/branding_buildflags.h"
 #include "build/build_config.h"
@@ -162,7 +166,8 @@
 
  protected:
   std::vector<base::test::FeatureRef> GetDisabledFeatures() const override {
-    auto disabled = PDFExtensionTestBase::GetDisabledFeatures();
+    std::vector<base::test::FeatureRef> disabled =
+        PDFExtensionTestBase::GetDisabledFeatures();
     // PDF OCR should not be enabled in `PDFExtensionAccessibilityTest`. If a
     // new test class is derived from this class and needs to test PDF OCR,
     // make sure that `GetDisabledFeatures()` is overridden to exclude
@@ -185,8 +190,18 @@
   }
 };
 
+class PDFExtensionAccessibilityTestWithOopifOverride
+    : public base::test::WithFeatureOverride,
+      public PDFExtensionAccessibilityTest {
+ public:
+  PDFExtensionAccessibilityTestWithOopifOverride()
+      : base::test::WithFeatureOverride(chrome_pdf::features::kPdfOopif) {}
+
+  bool UseOopif() const override { return GetParam(); }
+};
+
 // Flaky, see crbug.com/1477361
-IN_PROC_BROWSER_TEST_F(PDFExtensionAccessibilityTest,
+IN_PROC_BROWSER_TEST_P(PDFExtensionAccessibilityTestWithOopifOverride,
                        DISABLED_PdfAccessibility) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
@@ -209,7 +224,7 @@
 }
 
 // Flaky, see crbug.com/1477361
-IN_PROC_BROWSER_TEST_F(PDFExtensionAccessibilityTest,
+IN_PROC_BROWSER_TEST_P(PDFExtensionAccessibilityTestWithOopifOverride,
                        DISABLED_PdfAccessibilityEnableLater) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
@@ -234,7 +249,7 @@
 }
 
 // Flaky, see crbug.com/1477361
-IN_PROC_BROWSER_TEST_F(PDFExtensionAccessibilityTest,
+IN_PROC_BROWSER_TEST_P(PDFExtensionAccessibilityTestWithOopifOverride,
                        DISABLED_PdfAccessibilityInIframe) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
@@ -254,7 +269,8 @@
   ASSERT_MULTILINE_STREQ(kExpectedPDFAXTree, ax_tree_dump);
 }
 
-IN_PROC_BROWSER_TEST_F(PDFExtensionAccessibilityTest, PdfAccessibilityInOOPIF) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionAccessibilityTestWithOopifOverride,
+                       PdfAccessibilityInOOPIF) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -281,7 +297,7 @@
 #else
 #define MAYBE_PdfAccessibilityWordBoundaries PdfAccessibilityWordBoundaries
 #endif
-IN_PROC_BROWSER_TEST_F(PDFExtensionAccessibilityTest,
+IN_PROC_BROWSER_TEST_P(PDFExtensionAccessibilityTestWithOopifOverride,
                        MAYBE_PdfAccessibilityWordBoundaries) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
@@ -321,7 +337,7 @@
 }
 
 // Flaky, see crbug.com/1477361
-IN_PROC_BROWSER_TEST_F(PDFExtensionAccessibilityTest,
+IN_PROC_BROWSER_TEST_P(PDFExtensionAccessibilityTestWithOopifOverride,
                        DISABLED_PdfAccessibilitySelection) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
@@ -375,7 +391,7 @@
 }
 
 // Flaky, see crbug.com/1477361
-IN_PROC_BROWSER_TEST_F(PDFExtensionAccessibilityTest,
+IN_PROC_BROWSER_TEST_P(PDFExtensionAccessibilityTestWithOopifOverride,
                        DISABLED_PdfAccessibilityContextMenuAction) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
@@ -438,7 +454,7 @@
 }
 
 // Flaky, see crbug.com/1477361
-IN_PROC_BROWSER_TEST_F(PDFExtensionAccessibilityTest,
+IN_PROC_BROWSER_TEST_P(PDFExtensionAccessibilityTestWithOopifOverride,
                        DISABLED_RecordHasAccessibleTextToUmaWithAccessiblePdf) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
@@ -465,7 +481,7 @@
 }
 
 // Flaky, see crbug.com/1477361
-IN_PROC_BROWSER_TEST_F(PDFExtensionAccessibilityTest,
+IN_PROC_BROWSER_TEST_P(PDFExtensionAccessibilityTestWithOopifOverride,
                        DISABLED_RecordInaccessiblePdfUKM) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
@@ -500,8 +516,8 @@
 }
 
 // Flaky, see crbug.com/1477361
-IN_PROC_BROWSER_TEST_F(
-    PDFExtensionAccessibilityTest,
+IN_PROC_BROWSER_TEST_P(
+    PDFExtensionAccessibilityTestWithOopifOverride,
     DISABLED_RecordHasAccessibleTextToUmaWithInaccessiblePdf) {
   // TODO(crbug.com/1445746): Remove this when it passes for OOPIF PDF.
   if (UseOopif()) {
@@ -537,7 +553,7 @@
 #if BUILDFLAG(GOOGLE_CHROME_BRANDING)
 // Test a particular PDF encountered in the wild that triggered a crash
 // when accessibility is enabled.  (http://crbug.com/668724)
-IN_PROC_BROWSER_TEST_F(PDFExtensionAccessibilityTest,
+IN_PROC_BROWSER_TEST_P(PDFExtensionAccessibilityTestWithOopifOverride,
                        PdfAccessibilityTextRunCrash) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
@@ -559,7 +575,7 @@
 // TreeDumpTests, this allows us to verify the kNextOnLine and kPreviousOnLine
 // relationships.
 class PDFExtensionAccessibilityTextExtractionTest
-    : public PDFExtensionAccessibilityTest {
+    : public PDFExtensionAccessibilityTestWithOopifOverride {
  public:
   PDFExtensionAccessibilityTextExtractionTest() = default;
   ~PDFExtensionAccessibilityTextExtractionTest() override = default;
@@ -579,7 +595,8 @@
 
  protected:
   std::vector<base::test::FeatureRef> GetEnabledFeatures() const override {
-    auto enabled = PDFExtensionAccessibilityTest::GetEnabledFeatures();
+    std::vector<base::test::FeatureRef> enabled =
+        PDFExtensionAccessibilityTestWithOopifOverride::GetEnabledFeatures();
     enabled.push_back(chrome_pdf::features::kAccessiblePDFForm);
     return enabled;
   }
@@ -715,7 +732,7 @@
 
 // Test that Previous/NextOnLineId attributes are present and properly linked on
 // InlineTextBoxes within a line.
-IN_PROC_BROWSER_TEST_F(PDFExtensionAccessibilityTextExtractionTest,
+IN_PROC_BROWSER_TEST_P(PDFExtensionAccessibilityTextExtractionTest,
                        NextOnLine) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
@@ -726,7 +743,7 @@
 }
 
 // Test that a drop-cap is grouped with the correct line.
-IN_PROC_BROWSER_TEST_F(PDFExtensionAccessibilityTextExtractionTest, DropCap) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionAccessibilityTextExtractionTest, DropCap) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -736,7 +753,7 @@
 }
 
 // Test that simulated superscripts and subscripts don't cause a line break.
-IN_PROC_BROWSER_TEST_F(PDFExtensionAccessibilityTextExtractionTest,
+IN_PROC_BROWSER_TEST_P(PDFExtensionAccessibilityTextExtractionTest,
                        SuperscriptSubscript) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
@@ -748,7 +765,7 @@
 
 // Test that simple font and font-size changes in the middle of a line don't
 // cause line breaks.
-IN_PROC_BROWSER_TEST_F(PDFExtensionAccessibilityTextExtractionTest,
+IN_PROC_BROWSER_TEST_P(PDFExtensionAccessibilityTextExtractionTest,
                        FontChange) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
@@ -760,7 +777,7 @@
 
 // Test one property of pdf_private/accessibility_crash_2.pdf, where a page has
 // only whitespace characters.
-IN_PROC_BROWSER_TEST_F(PDFExtensionAccessibilityTextExtractionTest,
+IN_PROC_BROWSER_TEST_P(PDFExtensionAccessibilityTextExtractionTest,
                        OnlyWhitespaceText) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
@@ -771,7 +788,7 @@
 }
 
 // Test data of inline text boxes for PDF with weblinks.
-IN_PROC_BROWSER_TEST_F(PDFExtensionAccessibilityTextExtractionTest, WebLinks) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionAccessibilityTextExtractionTest, WebLinks) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -781,7 +798,7 @@
 }
 
 // Test data of inline text boxes for PDF with highlights.
-IN_PROC_BROWSER_TEST_F(PDFExtensionAccessibilityTextExtractionTest,
+IN_PROC_BROWSER_TEST_P(PDFExtensionAccessibilityTextExtractionTest,
                        Highlights) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
@@ -792,7 +809,7 @@
 }
 
 // Test data of inline text boxes for PDF with text fields.
-IN_PROC_BROWSER_TEST_F(PDFExtensionAccessibilityTextExtractionTest,
+IN_PROC_BROWSER_TEST_P(PDFExtensionAccessibilityTextExtractionTest,
                        TextFields) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
@@ -804,7 +821,7 @@
 
 // Test data of inline text boxes for PDF with multi-line and various font-sized
 // text.
-IN_PROC_BROWSER_TEST_F(PDFExtensionAccessibilityTextExtractionTest,
+IN_PROC_BROWSER_TEST_P(PDFExtensionAccessibilityTextExtractionTest,
                        ParagraphsAndHeadingUntagged) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
@@ -817,7 +834,7 @@
 
 // Test data of inline text boxes for PDF with text, weblinks, images and
 // annotation links.
-IN_PROC_BROWSER_TEST_F(PDFExtensionAccessibilityTextExtractionTest,
+IN_PROC_BROWSER_TEST_P(PDFExtensionAccessibilityTextExtractionTest,
                        LinksImagesAndText) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
@@ -828,7 +845,7 @@
 }
 
 // Test data of inline text boxes for PDF with overlapping annotations.
-IN_PROC_BROWSER_TEST_F(PDFExtensionAccessibilityTextExtractionTest,
+IN_PROC_BROWSER_TEST_P(PDFExtensionAccessibilityTextExtractionTest,
                        OverlappingAnnots) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
@@ -840,9 +857,10 @@
 
 class PDFExtensionAccessibilityTreeDumpTest
     : public PDFExtensionAccessibilityTest,
-      public ::testing::WithParamInterface<ui::AXApiType::Type> {
+      public ::testing::WithParamInterface<
+          std::tuple<ui::AXApiType::Type, bool>> {
  public:
-  PDFExtensionAccessibilityTreeDumpTest() : test_helper_(GetParam()) {}
+  PDFExtensionAccessibilityTreeDumpTest() : test_helper_(ax_inspect_type()) {}
   ~PDFExtensionAccessibilityTreeDumpTest() override = default;
 
   void SetUpCommandLine(base::CommandLine* command_line) override {
@@ -852,13 +870,20 @@
     test_helper_.InitializeFeatureList();
   }
 
- protected:
+  ui::AXApiType::Type ax_inspect_type() const {
+    return std::get<0>(GetParam());
+  }
+
+  bool UseOopif() const override { return std::get<1>(GetParam()); }
+
   std::vector<base::test::FeatureRef> GetEnabledFeatures() const override {
-    auto enabled = PDFExtensionAccessibilityTest::GetEnabledFeatures();
+    std::vector<base::test::FeatureRef> enabled =
+        PDFExtensionAccessibilityTest::GetEnabledFeatures();
     enabled.push_back(chrome_pdf::features::kAccessiblePDFForm);
     return enabled;
   }
 
+ protected:
   void RunPDFTest(const base::FilePath::CharType* pdf_file) {
     base::FilePath test_path = ui_test_utils::GetTestFilePath(
         base::FilePath(FILE_PATH_LITERAL("pdf")),
@@ -904,7 +929,7 @@
     ui::AXInspectScenario scenario = ParsePdfForExtraDirectives(pdf_contents);
 
     std::unique_ptr<ui::AXTreeFormatter> formatter =
-        content::AXInspectFactory::CreateFormatter(GetParam());
+        content::AXInspectFactory::CreateFormatter(ax_inspect_type());
     formatter->SetPropertyFilters(scenario.property_filters,
                                   ui::AXTreeFormatter::kFiltersDefaultSet);
 
@@ -951,7 +976,7 @@
     // TODO(b/1473176): Either keep the banner and status node in the output or
     // modify `pdf_root` above to remove the banner and status nodes from the
     // tree so that they are not in the format output.
-    RemoveBannerAndStatusNodesFromFormatOutput(actual_lines, GetParam());
+    RemoveBannerAndStatusNodesFromFormatOutput(actual_lines, ax_inspect_type());
 
     // Validate the dump against the expectation file.
     EXPECT_TRUE(test_helper_.ValidateAgainstExpectation(
@@ -1048,14 +1073,17 @@
 
 struct PDFExtensionAccessibilityTreeDumpTestPassToString {
   std::string operator()(
-      const ::testing::TestParamInfo<ui::AXApiType::Type>& i) const {
-    return std::string(i.param);
+      const ::testing::TestParamInfo<std::tuple<ui::AXApiType::Type, bool>>& i)
+      const {
+    return std::string(std::get<1>(i.param) ? "OOPIF_" : "GUESTVIEW_") +
+           std::string(std::get<0>(i.param));
   }
 };
 
 INSTANTIATE_TEST_SUITE_P(All,
                          PDFExtensionAccessibilityTreeDumpTest,
-                         testing::ValuesIn(GetAXTestValues()),
+                         testing::Combine(testing::ValuesIn(GetAXTestValues()),
+                                          testing::Bool()),
                          PDFExtensionAccessibilityTreeDumpTestPassToString());
 
 IN_PROC_BROWSER_TEST_P(PDFExtensionAccessibilityTreeDumpTest, HelloWorld) {
@@ -1191,7 +1219,8 @@
 }
 
 // This test suite validates the navigation done using the accessibility client.
-using PDFExtensionAccessibilityNavigationTest = PDFExtensionAccessibilityTest;
+using PDFExtensionAccessibilityNavigationTest =
+    PDFExtensionAccessibilityTestWithOopifOverride;
 
 // TODO(crbug.com/1487426): Fix the flakiness on ChromeOS.
 #if BUILDFLAG(IS_CHROMEOS)
@@ -1199,7 +1228,7 @@
 #else
 #define MAYBE_LinkNavigation LinkNavigation
 #endif  // BUILDFLAG(IS_CHROMEOS)
-IN_PROC_BROWSER_TEST_F(PDFExtensionAccessibilityNavigationTest,
+IN_PROC_BROWSER_TEST_P(PDFExtensionAccessibilityNavigationTest,
                        MAYBE_LinkNavigation) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
@@ -1242,23 +1271,29 @@
 #if BUILDFLAG(ENABLE_SCREEN_AI_SERVICE)
 // This test suite contains simple tests for the PDF OCR feature.
 class PDFExtensionAccessibilityPdfOcrTest
-    : public PDFExtensionAccessibilityTest {
+    : public PDFExtensionAccessibilityTestWithOopifOverride {
  public:
   PDFExtensionAccessibilityPdfOcrTest() = default;
   ~PDFExtensionAccessibilityPdfOcrTest() override = default;
 
  protected:
   std::vector<base::test::FeatureRef> GetEnabledFeatures() const override {
-    auto enabled = PDFExtensionAccessibilityTest::GetEnabledFeatures();
+    std::vector<base::test::FeatureRef> enabled =
+        PDFExtensionAccessibilityTest::GetEnabledFeatures();
     enabled.push_back(::features::kPdfOcr);
     return enabled;
   }
 
   std::vector<base::test::FeatureRef> GetDisabledFeatures() const override {
-    // `PDFExtensionAccessibilityTest` has `::features::kPdfOcr` in a list of
-    // disabled features. Now that `::features::kPdfOcr` is used in this test,
-    // just return an empty list to exclude the feature from the list.
-    return {};
+    // `PDFExtensionAccessibilityTest` has
+    // `::features::kPdfOcr` in a list of disabled features. Now that
+    // `::features::kPdfOcr` is used in this test, don't include it in the
+    // disabled list.
+    std::vector<base::test::FeatureRef> disabled;
+    if (!UseOopif()) {
+      disabled.push_back(chrome_pdf::features::kPdfOopif);
+    }
+    return disabled;
   }
 
   void ClickPdfOcrToggleButton(MimeHandlerViewGuest* guest_view) {
@@ -1276,7 +1311,7 @@
 
 // TODO(b/289010799): Re-enable it when integrating PDF OCR with
 // Select-to-Speak.
-IN_PROC_BROWSER_TEST_F(PDFExtensionAccessibilityPdfOcrTest,
+IN_PROC_BROWSER_TEST_P(PDFExtensionAccessibilityPdfOcrTest,
                        DISABLED_CheckUmaWhenTurnOnPdfOcrFromMoreActions) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
@@ -1300,7 +1335,7 @@
 
 // TODO(b/289010799): Re-enable it when integrating PDF OCR with
 // Select-to-Speak.
-IN_PROC_BROWSER_TEST_F(PDFExtensionAccessibilityPdfOcrTest,
+IN_PROC_BROWSER_TEST_P(PDFExtensionAccessibilityPdfOcrTest,
                        DISABLED_CheckUmaWhenTurnOffPdfOcrFromMoreActions) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
@@ -1324,3 +1359,15 @@
                                 /*expected_bucket_count=*/1);
 }
 #endif  // BUILDFLAG(ENABLE_SCREEN_AI_SERVICE)
+
+// TODO(crbug.com/1445746): Stop testing both modes after OOPIF PDF viewer
+// launches.
+INSTANTIATE_FEATURE_OVERRIDE_TEST_SUITE(
+    PDFExtensionAccessibilityTestWithOopifOverride);
+INSTANTIATE_FEATURE_OVERRIDE_TEST_SUITE(
+    PDFExtensionAccessibilityTextExtractionTest);
+INSTANTIATE_FEATURE_OVERRIDE_TEST_SUITE(
+    PDFExtensionAccessibilityNavigationTest);
+#if BUILDFLAG(ENABLE_SCREEN_AI_SERVICE)
+INSTANTIATE_FEATURE_OVERRIDE_TEST_SUITE(PDFExtensionAccessibilityPdfOcrTest);
+#endif  // BUILDFLAG(ENABLE_SCREEN_AI_SERVICE)
diff --git a/chrome/browser/pdf/pdf_extension_interactive_uitest.cc b/chrome/browser/pdf/pdf_extension_interactive_uitest.cc
index fa479a9..93e7453 100644
--- a/chrome/browser/pdf/pdf_extension_interactive_uitest.cc
+++ b/chrome/browser/pdf/pdf_extension_interactive_uitest.cc
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 #include "base/run_loop.h"
+#include "base/test/with_feature_override.h"
 #include "build/build_config.h"
 #include "build/buildflag.h"
 #include "chrome/app/chrome_command_ids.h"
@@ -25,6 +26,7 @@
 #include "extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.h"
 #include "net/dns/mock_host_resolver.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
+#include "pdf/pdf_features.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/public/mojom/input/focus_type.mojom-shared.h"
@@ -54,8 +56,12 @@
 using ::pdf_extension_test_util::GetOnlyMimeHandlerView;
 using ::pdf_extension_test_util::SetInputFocusOnPlugin;
 
-class PDFExtensionInteractiveUITest : public PDFExtensionTestBase {
+class PDFExtensionInteractiveUITest : public base::test::WithFeatureOverride,
+                                      public PDFExtensionTestBase {
  public:
+  PDFExtensionInteractiveUITest()
+      : base::test::WithFeatureOverride(chrome_pdf::features::kPdfOopif) {}
+
   void SetUpCommandLine(base::CommandLine* command_line) override {
     content::IsolateAllSitesForTesting(command_line);
   }
@@ -74,6 +80,8 @@
     }
     return focus_observer.Wait();
   }
+
+  bool UseOopif() const override { return GetParam(); }
 };
 
 class TabChangedWaiter : public TabStripModelObserver {
@@ -103,7 +111,7 @@
 }  // namespace
 
 // For crbug.com/1038918
-IN_PROC_BROWSER_TEST_F(PDFExtensionInteractiveUITest,
+IN_PROC_BROWSER_TEST_P(PDFExtensionInteractiveUITest,
                        CtrlPageUpDownSwitchesTabs) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
@@ -144,7 +152,7 @@
   EXPECT_EQ(1, tab_strip_model->active_index());
 }
 
-IN_PROC_BROWSER_TEST_F(PDFExtensionInteractiveUITest, FocusForwardTraversal) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionInteractiveUITest, FocusForwardTraversal) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -162,7 +170,7 @@
   EXPECT_EQ(blink::mojom::FocusType::kNone, details.focus_type);
 }
 
-IN_PROC_BROWSER_TEST_F(PDFExtensionInteractiveUITest, FocusReverseTraversal) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionInteractiveUITest, FocusReverseTraversal) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -206,7 +214,7 @@
 
 // On text selection, a touch selection menu should pop up. On clicking ellipsis
 // icon on the menu, the context menu should open up.
-IN_PROC_BROWSER_TEST_F(PDFExtensionInteractiveUITest,
+IN_PROC_BROWSER_TEST_P(PDFExtensionInteractiveUITest,
                        ContextMenuOpensFromTouchSelectionMenu) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
@@ -259,7 +267,7 @@
 #else
 #define MAYBE_TouchSelectionBounds TouchSelectionBounds
 #endif  // BUILDFLAG(IS_WIN)
-IN_PROC_BROWSER_TEST_F(PDFExtensionInteractiveUITest,
+IN_PROC_BROWSER_TEST_P(PDFExtensionInteractiveUITest,
                        MAYBE_TouchSelectionBounds) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
@@ -297,3 +305,7 @@
   EXPECT_POINTF_NEAR(gfx::PointF(492.0f, 171.0f), end_bound.edge_end(), 1.0f);
 }
 #endif  // defined(TOOLKIT_VIEWS) && defined(USE_AURA)
+
+// TODO(crbug.com/1445746): Stop testing both modes after OOPIF PDF viewer
+// launches.
+INSTANTIATE_FEATURE_OVERRIDE_TEST_SUITE(PDFExtensionInteractiveUITest);
diff --git a/chrome/browser/pdf/pdf_extension_js_test.cc b/chrome/browser/pdf/pdf_extension_js_test.cc
index 10bc49e..27b5c9f0 100644
--- a/chrome/browser/pdf/pdf_extension_js_test.cc
+++ b/chrome/browser/pdf/pdf_extension_js_test.cc
@@ -11,6 +11,7 @@
 #include "base/path_service.h"
 #include "base/strings/stringprintf.h"
 #include "base/test/icu_test_util.h"
+#include "base/test/with_feature_override.h"
 #include "build/branding_buildflags.h"
 #include "build/build_config.h"
 #include "build/chromeos_buildflags.h"
@@ -36,12 +37,20 @@
 #include "extensions/test/result_catcher.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
 #include "pdf/buildflags.h"
+#include "pdf/pdf_features.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/base/resource/resource_bundle.h"
 #include "url/gurl.h"
 
-class PDFExtensionJSTest : public PDFExtensionTestBase {
+class PDFExtensionJSTest : public base::test::WithFeatureOverride,
+                           public PDFExtensionTestBase {
+ public:
+  PDFExtensionJSTest()
+      : base::test::WithFeatureOverride(chrome_pdf::features::kPdfOopif) {}
+
+  bool UseOopif() const override { return GetParam(); }
+
  protected:
   void SetUpOnMainThread() override {
     PDFExtensionTestBase::SetUpOnMainThread();
@@ -128,7 +137,7 @@
   std::unique_ptr<DevToolsAgentCoverageObserver> coverage_handler_;
 };
 
-IN_PROC_BROWSER_TEST_F(PDFExtensionJSTest, Basic) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionJSTest, Basic) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -138,7 +147,7 @@
   EXPECT_EQ(1, CountPDFProcesses());
 }
 
-IN_PROC_BROWSER_TEST_F(PDFExtensionJSTest, BasicPlugin) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionJSTest, BasicPlugin) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -147,7 +156,7 @@
   RunTestsInJsModule("basic_plugin_test.js", "test.pdf");
 }
 
-IN_PROC_BROWSER_TEST_F(PDFExtensionJSTest, PluginController) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionJSTest, PluginController) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -156,7 +165,7 @@
   RunTestsInJsModule("plugin_controller_test.js", "test.pdf");
 }
 
-IN_PROC_BROWSER_TEST_F(PDFExtensionJSTest, Viewport) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionJSTest, Viewport) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -165,7 +174,7 @@
   RunTestsInJsModule("viewport_test.js", "test.pdf");
 }
 
-IN_PROC_BROWSER_TEST_F(PDFExtensionJSTest, ViewportScroller) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionJSTest, ViewportScroller) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -174,7 +183,7 @@
   RunTestsInJsModule("viewport_scroller_test.js", "test.pdf");
 }
 
-IN_PROC_BROWSER_TEST_F(PDFExtensionJSTest, Layout3) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionJSTest, Layout3) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -183,7 +192,7 @@
   RunTestsInJsModule("layout_test.js", "test-layout3.pdf");
 }
 
-IN_PROC_BROWSER_TEST_F(PDFExtensionJSTest, Layout4) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionJSTest, Layout4) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -192,7 +201,7 @@
   RunTestsInJsModule("layout_test.js", "test-layout4.pdf");
 }
 
-IN_PROC_BROWSER_TEST_F(PDFExtensionJSTest, Bookmark) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionJSTest, Bookmark) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -201,7 +210,7 @@
   RunTestsInJsModule("bookmarks_test.js", "test-bookmarks-with-zoom.pdf");
 }
 
-IN_PROC_BROWSER_TEST_F(PDFExtensionJSTest, Navigator) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionJSTest, Navigator) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -210,7 +219,7 @@
   RunTestsInJsModule("navigator_test.js", "test.pdf");
 }
 
-IN_PROC_BROWSER_TEST_F(PDFExtensionJSTest, ParamsParser) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionJSTest, ParamsParser) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -219,7 +228,7 @@
   RunTestsInJsModule("params_parser_test.js", "test.pdf");
 }
 
-IN_PROC_BROWSER_TEST_F(PDFExtensionJSTest, ZoomManager) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionJSTest, ZoomManager) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -228,7 +237,7 @@
   RunTestsInJsModule("zoom_manager_test.js", "test.pdf");
 }
 
-IN_PROC_BROWSER_TEST_F(PDFExtensionJSTest, GestureDetector) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionJSTest, GestureDetector) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -237,7 +246,7 @@
   RunTestsInJsModule("gesture_detector_test.js", "test.pdf");
 }
 
-IN_PROC_BROWSER_TEST_F(PDFExtensionJSTest, SwipeDetector) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionJSTest, SwipeDetector) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -246,7 +255,7 @@
   RunTestsInJsModule("swipe_detector_test.js", "test.pdf");
 }
 
-IN_PROC_BROWSER_TEST_F(PDFExtensionJSTest, TouchHandling) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionJSTest, TouchHandling) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -255,7 +264,7 @@
   RunTestsInJsModule("touch_handling_test.js", "test.pdf");
 }
 
-IN_PROC_BROWSER_TEST_F(PDFExtensionJSTest, Elements) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionJSTest, Elements) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -266,7 +275,7 @@
   RunTestsInJsModule("material_elements_test.js", "test.pdf");
 }
 
-IN_PROC_BROWSER_TEST_F(PDFExtensionJSTest, DownloadControls) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionJSTest, DownloadControls) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -277,7 +286,7 @@
   RunTestsInJsModule("download_controls_test.js", "test.pdf");
 }
 
-IN_PROC_BROWSER_TEST_F(PDFExtensionJSTest, Title) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionJSTest, Title) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -286,7 +295,7 @@
   RunTestsInJsModule("title_test.js", "test-title.pdf");
 }
 
-IN_PROC_BROWSER_TEST_F(PDFExtensionJSTest, WhitespaceTitle) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionJSTest, WhitespaceTitle) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -295,7 +304,7 @@
   RunTestsInJsModule("whitespace_title_test.js", "test-whitespace-title.pdf");
 }
 
-IN_PROC_BROWSER_TEST_F(PDFExtensionJSTest, PageChange) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionJSTest, PageChange) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -304,7 +313,7 @@
   RunTestsInJsModule("page_change_test.js", "test-bookmarks.pdf");
 }
 
-IN_PROC_BROWSER_TEST_F(PDFExtensionJSTest, ScrollWithFormFieldFocusedTest) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionJSTest, ScrollWithFormFieldFocusedTest) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -314,7 +323,7 @@
                      "test-bookmarks.pdf");
 }
 
-IN_PROC_BROWSER_TEST_F(PDFExtensionJSTest, Metrics) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionJSTest, Metrics) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -323,7 +332,7 @@
   RunTestsInJsModule("metrics_test.js", "test.pdf");
 }
 
-IN_PROC_BROWSER_TEST_F(PDFExtensionJSTest, ViewerPasswordDialog) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionJSTest, ViewerPasswordDialog) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -332,7 +341,7 @@
   RunTestsInJsModule("viewer_password_dialog_test.js", "encrypted.pdf");
 }
 
-IN_PROC_BROWSER_TEST_F(PDFExtensionJSTest, ArrayBufferAllocator) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionJSTest, ArrayBufferAllocator) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -344,7 +353,7 @@
   RunTestsInJsModule("beep_test.js", "array_buffer.pdf");
 }
 
-IN_PROC_BROWSER_TEST_F(PDFExtensionJSTest, ViewerToolbar) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionJSTest, ViewerToolbar) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -355,7 +364,7 @@
   RunTestsInJsModule("viewer_toolbar_test.js", "test.pdf");
 }
 
-IN_PROC_BROWSER_TEST_F(PDFExtensionJSTest, ViewerPdfSidenav) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionJSTest, ViewerPdfSidenav) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -366,7 +375,7 @@
   RunTestsInJsModule("viewer_pdf_sidenav_test.js", "test.pdf");
 }
 
-IN_PROC_BROWSER_TEST_F(PDFExtensionJSTest, ViewerThumbnailBar) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionJSTest, ViewerThumbnailBar) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -377,7 +386,7 @@
   RunTestsInJsModule("viewer_thumbnail_bar_test.js", "test.pdf");
 }
 
-IN_PROC_BROWSER_TEST_F(PDFExtensionJSTest, ViewerThumbnail) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionJSTest, ViewerThumbnail) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -388,7 +397,7 @@
   RunTestsInJsModule("viewer_thumbnail_test.js", "test.pdf");
 }
 
-IN_PROC_BROWSER_TEST_F(PDFExtensionJSTest, ViewerAttachmentBar) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionJSTest, ViewerAttachmentBar) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -399,7 +408,7 @@
   RunTestsInJsModule("viewer_attachment_bar_test.js", "test.pdf");
 }
 
-IN_PROC_BROWSER_TEST_F(PDFExtensionJSTest, ViewerAttachment) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionJSTest, ViewerAttachment) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -410,7 +419,7 @@
   RunTestsInJsModule("viewer_attachment_test.js", "test.pdf");
 }
 
-IN_PROC_BROWSER_TEST_F(PDFExtensionJSTest, Fullscreen) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionJSTest, Fullscreen) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -421,7 +430,7 @@
   RunTestsInJsModule("fullscreen_test.js", "test-bookmarks.pdf");
 }
 
-IN_PROC_BROWSER_TEST_F(PDFExtensionJSTest, ViewerPropertiesDialog) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionJSTest, ViewerPropertiesDialog) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -435,7 +444,7 @@
   RunTestsInJsModule("viewer_properties_dialog_test.js", "document_info.pdf");
 }
 
-IN_PROC_BROWSER_TEST_F(PDFExtensionJSTest, PostMessageProxy) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionJSTest, PostMessageProxy) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -447,7 +456,7 @@
 }
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
-IN_PROC_BROWSER_TEST_F(PDFExtensionJSTest, Printing) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionJSTest, Printing) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -465,7 +474,7 @@
 #else
 #define MAYBE_AnnotationsFeatureEnabled AnnotationsFeatureEnabled
 #endif
-IN_PROC_BROWSER_TEST_F(PDFExtensionJSTest, MAYBE_AnnotationsFeatureEnabled) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionJSTest, MAYBE_AnnotationsFeatureEnabled) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -474,7 +483,7 @@
   RunTestsInJsModule("annotations_feature_enabled_test.js", "test.pdf");
 }
 
-IN_PROC_BROWSER_TEST_F(PDFExtensionJSTest, AnnotationsToolbar) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionJSTest, AnnotationsToolbar) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -485,7 +494,7 @@
   RunTestsInJsModule("annotations_toolbar_test.js", "test.pdf");
 }
 
-IN_PROC_BROWSER_TEST_F(PDFExtensionJSTest, ViewerToolbarDropdown) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionJSTest, ViewerToolbarDropdown) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -500,7 +509,7 @@
 #if BUILDFLAG(ENABLE_SCREEN_AI_SERVICE)
 // TODO(crbug.com/1444895): Re-enable it when integrating PDF OCR with
 // Select-to-Speak.
-IN_PROC_BROWSER_TEST_F(PDFExtensionJSTest, DISABLED_PdfOcrToolbar) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionJSTest, DISABLED_PdfOcrToolbar) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -529,7 +538,7 @@
   }
 };
 
-IN_PROC_BROWSER_TEST_F(PDFExtensionContentSettingJSTest, Beep) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionContentSettingJSTest, Beep) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -538,7 +547,7 @@
   RunTestsInJsModule("beep_test.js", "test-beep.pdf");
 }
 
-IN_PROC_BROWSER_TEST_F(PDFExtensionContentSettingJSTest, NoBeep) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionContentSettingJSTest, NoBeep) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -548,7 +557,7 @@
   RunTestsInJsModule("nobeep_test.js", "test-beep.pdf");
 }
 
-IN_PROC_BROWSER_TEST_F(PDFExtensionContentSettingJSTest, BeepThenNoBeep) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionContentSettingJSTest, BeepThenNoBeep) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -566,7 +575,7 @@
   EXPECT_EQ(1, CountPDFProcesses());
 }
 
-IN_PROC_BROWSER_TEST_F(PDFExtensionContentSettingJSTest, NoBeepThenBeep) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionContentSettingJSTest, NoBeepThenBeep) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -585,7 +594,7 @@
   EXPECT_EQ(1, CountPDFProcesses());
 }
 
-IN_PROC_BROWSER_TEST_F(PDFExtensionContentSettingJSTest, BeepCsp) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionContentSettingJSTest, BeepCsp) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -596,7 +605,7 @@
   RunTestsInJsModule("beep_test.js", "test-beep-csp.pdf");
 }
 
-IN_PROC_BROWSER_TEST_F(PDFExtensionContentSettingJSTest, DISABLED_NoBeepCsp) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionContentSettingJSTest, DISABLED_NoBeepCsp) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -618,7 +627,7 @@
 };
 
 // Regression test for https://crbug.com/1239148.
-IN_PROC_BROWSER_TEST_F(PDFExtensionWebUICodeCacheJSTest, Basic) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionWebUICodeCacheJSTest, Basic) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -652,7 +661,7 @@
 
 // Test navigating to a PDF in the scope of a service worker with no fetch event
 // handler.
-IN_PROC_BROWSER_TEST_F(PDFExtensionServiceWorkerJSTest, NoFetchHandler) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionServiceWorkerJSTest, NoFetchHandler) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -663,7 +672,7 @@
 
 // Test navigating to a PDF when a service worker intercepts the request and
 // then falls back to network by not calling FetchEvent.respondWith().
-IN_PROC_BROWSER_TEST_F(PDFExtensionServiceWorkerJSTest, NetworkFallback) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionServiceWorkerJSTest, NetworkFallback) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -674,7 +683,7 @@
 
 // Test navigating to a PDF when a service worker intercepts the request and
 // provides a response.
-IN_PROC_BROWSER_TEST_F(PDFExtensionServiceWorkerJSTest, Interception) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionServiceWorkerJSTest, Interception) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -682,3 +691,10 @@
 
   RunServiceWorkerTest("respond_with_fetch_worker.js");
 }
+
+// TODO(crbug.com/1445746): Stop testing both modes after OOPIF PDF viewer
+// launches.
+INSTANTIATE_FEATURE_OVERRIDE_TEST_SUITE(PDFExtensionJSTest);
+INSTANTIATE_FEATURE_OVERRIDE_TEST_SUITE(PDFExtensionContentSettingJSTest);
+INSTANTIATE_FEATURE_OVERRIDE_TEST_SUITE(PDFExtensionWebUICodeCacheJSTest);
+INSTANTIATE_FEATURE_OVERRIDE_TEST_SUITE(PDFExtensionServiceWorkerJSTest);
diff --git a/chrome/browser/pdf/pdf_extension_printing_test.cc b/chrome/browser/pdf/pdf_extension_printing_test.cc
index a1990287..b40dc16 100644
--- a/chrome/browser/pdf/pdf_extension_printing_test.cc
+++ b/chrome/browser/pdf/pdf_extension_printing_test.cc
@@ -3,7 +3,9 @@
 // found in the LICENSE file.
 
 #include <memory>
+#include <tuple>
 #include <utility>
+#include <variant>
 
 #include "base/functional/callback_helpers.h"
 #include "base/memory/raw_ptr.h"
@@ -28,6 +30,7 @@
 #include "content/public/test/browser_test_utils.h"
 #include "extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
+#include "pdf/pdf_features.h"
 #include "printing/backend/print_backend.h"
 #include "printing/backend/test_print_backend.h"
 #include "printing/buildflags/buildflags.h"
@@ -67,6 +70,14 @@
 using testing::NiceMock;
 #endif
 
+struct PDFExtensionPrintingTestPassToString {
+  std::string operator()(
+      const ::testing::TestParamInfo<std::tuple<bool, bool>>& i) const {
+    return std::string(std::get<1>(i.param) ? "OOPIF_" : "GUESTVIEW_") +
+           std::string(std::get<0>(i.param) ? "SERVICE" : "BROWSER");
+  }
+};
+
 #if BUILDFLAG(IS_CHROMEOS_ASH)
 
 std::unique_ptr<KeyedService> BuildTestCupsPrintJobManager(
@@ -95,9 +106,10 @@
 using ::extensions::MimeHandlerViewGuest;
 using ::pdf_extension_test_util::SetInputFocusOnPlugin;
 
-class PDFExtensionPrintingTest : public PDFExtensionTestBase,
-                                 public printing::PrintJob::Observer,
-                                 public testing::WithParamInterface<bool> {
+class PDFExtensionPrintingTest
+    : public PDFExtensionTestBase,
+      public printing::PrintJob::Observer,
+      public testing::WithParamInterface<std::tuple<bool, bool>> {
  public:
   PDFExtensionPrintingTest() = default;
   ~PDFExtensionPrintingTest() override = default;
@@ -168,21 +180,26 @@
     printing::PrintingContext::SetPrintingContextFactoryForTest(nullptr);
     printing::PrintBackend::SetPrintBackendForTesting(nullptr);
   }
+  bool UseOopif() const override { return std::get<1>(GetParam()); }
   std::vector<base::test::FeatureRef> GetEnabledFeatures() const override {
+    std::vector<base::test::FeatureRef> enabled =
+        PDFExtensionTestBase::GetEnabledFeatures();
 #if BUILDFLAG(ENABLE_OOP_PRINTING)
     if (UseService()) {
-      return {printing::features::kEnableOopPrintDrivers};
+      enabled.push_back(printing::features::kEnableOopPrintDrivers);
     }
 #endif
-    return {};
+    return enabled;
   }
   std::vector<base::test::FeatureRef> GetDisabledFeatures() const override {
+    std::vector<base::test::FeatureRef> disabled =
+        PDFExtensionTestBase::GetDisabledFeatures();
 #if BUILDFLAG(ENABLE_OOP_PRINTING)
     if (!UseService()) {
-      return {printing::features::kEnableOopPrintDrivers};
+      disabled.push_back(printing::features::kEnableOopPrintDrivers);
     }
 #endif
-    return {};
+    return disabled;
   }
 
   void SetupPrintViewManagerForJobMonitoring(content::RenderFrameHost* frame) {
@@ -209,7 +226,7 @@
 #endif
 
  private:
-  bool UseService() const { return GetParam(); }
+  bool UseService() const { return std::get<0>(GetParam()); }
 
   void OnCreatedPrintJob(printing::PrintJob* print_job) {
     EXPECT_FALSE(observing_print_job_);
@@ -428,12 +445,14 @@
 
 INSTANTIATE_TEST_SUITE_P(All,
                          PDFExtensionPrintingTest,
+                         testing::Combine(
 #if BUILDFLAG(ENABLE_OOP_PRINTING)
-                         testing::Bool()
+                             testing::Bool(),
 #else
-                         testing::Values(false)
+                             testing::Values(false),
 #endif
-);
+                             testing::Bool()),
+                         PDFExtensionPrintingTestPassToString());
 
 class PDFExtensionBasicPrintingTest : public PDFExtensionPrintingTest {
  public:
@@ -482,4 +501,7 @@
   WaitForPrintJobDestruction();
 }
 
-INSTANTIATE_TEST_SUITE_P(All, PDFExtensionBasicPrintingTest, testing::Bool());
+INSTANTIATE_TEST_SUITE_P(All,
+                         PDFExtensionBasicPrintingTest,
+                         testing::Combine(testing::Bool(), testing::Bool()),
+                         PDFExtensionPrintingTestPassToString());
diff --git a/chrome/browser/pdf/pdf_extension_test.cc b/chrome/browser/pdf/pdf_extension_test.cc
index 724d123..9604ea7 100644
--- a/chrome/browser/pdf/pdf_extension_test.cc
+++ b/chrome/browser/pdf/pdf_extension_test.cc
@@ -5,6 +5,8 @@
 #include <stddef.h>
 
 #include <string>
+#include <tuple>
+#include <variant>
 #include <vector>
 
 #include "base/files/file_enumerator.h"
@@ -15,6 +17,7 @@
 #include "base/path_service.h"
 #include "base/ranges/algorithm.h"
 #include "base/run_loop.h"
+#include "base/strings/string_number_conversions.h"
 #include "base/strings/string_piece.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
@@ -23,6 +26,7 @@
 #include "base/test/bind.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/metrics/user_action_tester.h"
+#include "base/test/scoped_feature_list.h"
 #include "base/test/test_timeouts.h"
 #include "base/test/with_feature_override.h"
 #include "base/thread_annotations.h"
@@ -130,6 +134,23 @@
 const int kDefaultKeyModifier = blink::WebInputEvent::kControlKey;
 #endif
 
+struct PDFExtensionLoadTestPassToString {
+  std::string operator()(
+      const ::testing::TestParamInfo<std::tuple<int, bool>>& i) const {
+    return std::string(std::get<1>(i.param) ? "OOPIF_" : "GUESTVIEW_") +
+           base::NumberToString(std::get<0>(i.param));
+  }
+};
+
+struct PDFExtensionIsolatedContentTestPassToString {
+  std::string operator()(
+      const ::testing::TestParamInfo<std::tuple<bool, bool>>& i) const {
+    return std::string(std::get<1>(i.param) ? "OOPIF_" : "GUESTVIEW_") +
+           std::string(std::get<0>(i.param) ? "SITE_ISOLATED"
+                                            : "SITE_UNISOLATED");
+  }
+};
+
 // Calling PluginService::GetPlugins ensures that LoadPlugins is called
 // internally. This is an asynchronous task and this method uses a run loop to
 // wait for the loading task to complete.
@@ -145,7 +166,16 @@
 
 }  // namespace
 
-using PDFExtensionTest = PDFExtensionTestBase;
+class PDFExtensionTest : public base::test::WithFeatureOverride,
+                         public PDFExtensionTestBase {
+ public:
+  PDFExtensionTest()
+      : base::test::WithFeatureOverride(chrome_pdf::features::kPdfOopif) {}
+
+  bool UseOopif() const override { return GetParam(); }
+};
+
+using PDFExtensionTestWithoutOopifOverride = PDFExtensionTestBase;
 
 class PDFExtensionTestWithPartialLoading : public PDFExtensionTest {
  protected:
@@ -162,7 +192,7 @@
 // for https://crbug.com/536637. The original implementation checked that the
 // BrowserPlugin hosting the pdf extension was focused; in this re-write, we
 // make sure the guest view's WebContents has focus.
-IN_PROC_BROWSER_TEST_F(PDFExtensionTest, PdfInMainFrameHasFocus) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionTest, PdfInMainFrameHasFocus) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -190,7 +220,7 @@
 // has the correct URL for the PDF extension.
 // TODO(wjmaclean): Are there any attributes we can/should test with respect to
 // the extension's loaded html?
-IN_PROC_BROWSER_TEST_F(PDFExtensionTest, PdfExtensionLoadedInGuest) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionTest, PdfExtensionLoadedInGuest) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -272,7 +302,7 @@
 // attaching an inner WebContents for a PDF, the inner WebContents can still
 // successfully complete its attachment and subsequent navigation.  See
 // https://crbug.com/1295431.
-IN_PROC_BROWSER_TEST_F(PDFExtensionTest, PdfExtensionLoadedWhileOldPdfCloses) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionTest, PdfExtensionLoadedWhileOldPdfCloses) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -347,7 +377,7 @@
 // This test verifies that when a PDF is served with a restrictive
 // Content-Security-Policy, the embed tag is still sized correctly.
 // Regression test for https://crbug.com/271452.
-IN_PROC_BROWSER_TEST_F(PDFExtensionTest, CSPDoesNotBlockEmbedStyles) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionTest, CSPDoesNotBlockEmbedStyles) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -382,7 +412,7 @@
 // This test verifies that when a PDF is served with
 // Content-Security-Policy: sandbox, this is ignored and the PDF is displayed.
 // Regression test for https://crbug.com/1187122.
-IN_PROC_BROWSER_TEST_F(PDFExtensionTest, CSPWithSandboxDoesNotBlockPDF) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionTest, CSPWithSandboxDoesNotBlockPDF) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -412,7 +442,7 @@
 // This test verifies that Content-Security-Policy's frame-ancestors 'none'
 // directive is effective on a PDF response.
 // Regression test for https://crbug.com/1107535.
-IN_PROC_BROWSER_TEST_F(PDFExtensionTest, CSPFrameAncestorsCanBlockEmbedding) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionTest, CSPFrameAncestorsCanBlockEmbedding) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -436,7 +466,7 @@
 // This test verifies that Content-Security-Policy's frame-ancestors directive
 // overrides an X-Frame-Options header on a PDF response.
 // Regression test for https://crbug.com/1107535.
-IN_PROC_BROWSER_TEST_F(PDFExtensionTest,
+IN_PROC_BROWSER_TEST_P(PDFExtensionTest,
                        CSPFrameAncestorsOverridesXFrameOptions) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
@@ -464,9 +494,14 @@
   EXPECT_EQ(main_url, primary_main_frame->GetLastCommittedURL());
 }
 
-class PDFExtensionLoadTest : public PDFExtensionTest,
-                             public testing::WithParamInterface<int> {
+class PDFExtensionLoadTest
+    : public PDFExtensionTestWithoutOopifOverride,
+      public testing::WithParamInterface<std::tuple<int, bool>> {
  protected:
+  int load_test_part() const { return std::get<0>(GetParam()); }
+
+  bool UseOopif() const override { return std::get<1>(GetParam()); }
+
   // Load all the PDFs contained in chrome/test/data/<dir_name>. The files are
   // sharded across kNumberLoadTestParts using base::PersistentHash(filename).
   void LoadAllPdfsTest(const std::string& dir_name) {
@@ -485,7 +520,8 @@
 
       std::string pdf_file = dir_name + "/" + filename;
       SCOPED_TRACE(pdf_file);
-      if (base::PersistentHash(filename) % kNumberLoadTestParts == GetParam()) {
+      if (base::PersistentHash(filename) % kNumberLoadTestParts ==
+          load_test_part()) {
         LOG(INFO) << "Loading: " << pdf_file;
         testing::AssertionResult success =
             LoadPdf(embedded_test_server()->GetURL("/" + pdf_file));
@@ -522,13 +558,15 @@
 #endif
 
 // We break PDFExtensionLoadTest up into kNumberLoadTestParts.
-INSTANTIATE_TEST_SUITE_P(PDFTestFiles,
-                         PDFExtensionLoadTest,
-                         testing::Range(0, kNumberLoadTestParts));
+INSTANTIATE_TEST_SUITE_P(
+    PDFTestFiles,
+    PDFExtensionLoadTest,
+    testing::Combine(testing::Range(0, kNumberLoadTestParts), testing::Bool()),
+    PDFExtensionLoadTestPassToString());
 
 using PDFExtensionBlobNavigationTest = PDFExtensionTest;
 
-IN_PROC_BROWSER_TEST_F(PDFExtensionBlobNavigationTest, NewTab) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionBlobNavigationTest, NewTab) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -551,7 +589,7 @@
   EXPECT_TRUE(pdf_extension_test_util::EnsurePDFHasLoaded(new_tab_contents));
 }
 
-IN_PROC_BROWSER_TEST_F(PDFExtensionBlobNavigationTest, SameTab) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionBlobNavigationTest, SameTab) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -565,7 +603,7 @@
       pdf_extension_test_util::EnsurePDFHasLoaded(GetActiveWebContents()));
 }
 
-IN_PROC_BROWSER_TEST_F(PDFExtensionTest, LoadInPlatformApp) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionTest, LoadInPlatformApp) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -720,7 +758,7 @@
   std::unique_ptr<DownloadAwaiter> download_awaiter_;
 };
 
-IN_PROC_BROWSER_TEST_F(PDFPluginDisabledTest, DirectNavigationToPDF) {
+IN_PROC_BROWSER_TEST_P(PDFPluginDisabledTest, DirectNavigationToPDF) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -742,7 +780,7 @@
 #define MAYBE_EmbedPdfPlaceholderWithCSP EmbedPdfPlaceholderWithCSP
 #endif  // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) ||
         // BUILDFLAG(IS_WIN)
-IN_PROC_BROWSER_TEST_F(PDFPluginDisabledTest,
+IN_PROC_BROWSER_TEST_P(PDFPluginDisabledTest,
                        MAYBE_EmbedPdfPlaceholderWithCSP) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
@@ -772,7 +810,7 @@
 #else
 #define MAYBE_IframePdfPlaceholderWithCSP IframePdfPlaceholderWithCSP
 #endif
-IN_PROC_BROWSER_TEST_F(PDFPluginDisabledTest,
+IN_PROC_BROWSER_TEST_P(PDFPluginDisabledTest,
                        MAYBE_IframePdfPlaceholderWithCSP) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
@@ -787,7 +825,7 @@
   ValidateSingleSuccessfulDownloadAndNoPDFPluginLaunch();
 }
 
-IN_PROC_BROWSER_TEST_F(PDFPluginDisabledTest,
+IN_PROC_BROWSER_TEST_P(PDFPluginDisabledTest,
                        IframePlaceholderInjectedIntoNewWindow) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
@@ -820,7 +858,7 @@
 //
 // Note that this can happen only during partial loading, as the initial URL
 // load is handled by MimeHandlerView, and the plugin only gets the response.
-IN_PROC_BROWSER_TEST_F(PDFExtensionTestWithPartialLoading,
+IN_PROC_BROWSER_TEST_P(PDFExtensionTestWithPartialLoading,
                        PartialRedirectsFailInPlugin) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
@@ -895,7 +933,7 @@
 
 // Ensure that the internal PDF plugin application/x-google-chrome-pdf won't be
 // loaded if it's not loaded in the chrome extension page.
-IN_PROC_BROWSER_TEST_F(PDFExtensionTest, EnsureInternalPluginDisabled) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionTest, EnsureInternalPluginDisabled) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -921,7 +959,7 @@
 }
 
 // Ensure cross-origin replies won't work for getSelectedText.
-IN_PROC_BROWSER_TEST_F(PDFExtensionTest, EnsureCrossOriginRepliesBlocked) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionTest, EnsureCrossOriginRepliesBlocked) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -939,7 +977,7 @@
 }
 
 // Ensure same-origin replies do work for getSelectedText.
-IN_PROC_BROWSER_TEST_F(PDFExtensionTest, EnsureSameOriginRepliesAllowed) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionTest, EnsureSameOriginRepliesAllowed) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -950,7 +988,7 @@
 }
 
 // TODO(crbug.com/1004425): Should be allowed?
-IN_PROC_BROWSER_TEST_F(PDFExtensionTest, EnsureOpaqueOriginRepliesBlocked) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionTest, EnsureOpaqueOriginRepliesBlocked) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -961,7 +999,7 @@
 }
 
 // Ensure that the PDF component extension cannot be loaded directly.
-IN_PROC_BROWSER_TEST_F(PDFExtensionTest, BlockDirectAccess) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionTest, BlockDirectAccess) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -983,7 +1021,7 @@
 }
 
 // This test ensures that PDF can be loaded from local file
-IN_PROC_BROWSER_TEST_F(PDFExtensionTest, EnsurePDFFromLocalFileLoads) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionTest, EnsurePDFFromLocalFileLoads) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -1006,7 +1044,7 @@
 }
 
 // Tests that PDF with no filename extension can be loaded from local file.
-IN_PROC_BROWSER_TEST_F(PDFExtensionTest, ExtensionlessPDFLocalFileLoads) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionTest, ExtensionlessPDFLocalFileLoads) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -1029,7 +1067,7 @@
 }
 
 // This test ensures that link permissions are enforced properly in PDFs.
-IN_PROC_BROWSER_TEST_F(PDFExtensionTest, LinkPermissions) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionTest, LinkPermissions) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -1057,7 +1095,7 @@
 }
 
 // This test ensures that titles are set properly for PDFs without /Title.
-IN_PROC_BROWSER_TEST_F(PDFExtensionTest, TabTitleWithNoTitle) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionTest, TabTitleWithNoTitle) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -1073,7 +1111,7 @@
 }
 
 // This test ensures that titles are set properly for PDFs with /Title.
-IN_PROC_BROWSER_TEST_F(PDFExtensionTest, TabTitleWithTitle) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionTest, TabTitleWithTitle) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -1089,7 +1127,7 @@
 }
 
 // This test ensures that titles are set properly for embedded PDFs with /Title.
-IN_PROC_BROWSER_TEST_F(PDFExtensionTest, TabTitleWithEmbeddedPdf) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionTest, TabTitleWithEmbeddedPdf) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -1113,7 +1151,7 @@
 #else
 #define MAYBE_PdfZoomWithoutBubble PdfZoomWithoutBubble
 #endif
-IN_PROC_BROWSER_TEST_F(PDFExtensionTest, MAYBE_PdfZoomWithoutBubble) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionTest, MAYBE_PdfZoomWithoutBubble) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -1236,7 +1274,7 @@
   }
 };
 
-IN_PROC_BROWSER_TEST_F(PDFExtensionScrollTest, WithSpace) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionScrollTest, WithSpace) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -1295,7 +1333,7 @@
               kScrollPositionEpsilon);
 }
 
-IN_PROC_BROWSER_TEST_F(PDFExtensionScrollTest, WithPageDownUp) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionScrollTest, WithPageDownUp) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -1355,7 +1393,7 @@
               kScrollPositionEpsilon);
 }
 
-IN_PROC_BROWSER_TEST_F(PDFExtensionScrollTest, WithArrowLeftRight) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionScrollTest, WithArrowLeftRight) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -1405,7 +1443,7 @@
   EXPECT_EQ(kScrollIncrement, GetViewportScrollPositionX(guest_mainframe));
 }
 
-IN_PROC_BROWSER_TEST_F(PDFExtensionScrollTest, WithArrowDownUp) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionScrollTest, WithArrowDownUp) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -1455,7 +1493,7 @@
   EXPECT_EQ(kScrollIncrement, GetViewportScrollPositionY(guest_mainframe));
 }
 
-IN_PROC_BROWSER_TEST_F(PDFExtensionTest, SelectAllShortcut) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionTest, SelectAllShortcut) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -1501,7 +1539,7 @@
 
 // Test that even if a different tab is selected when a navigation occurs,
 // the correct tab still gets navigated (see crbug.com/672563).
-IN_PROC_BROWSER_TEST_F(PDFExtensionTest, NavigationOnCorrectTab) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionTest, NavigationOnCorrectTab) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -1533,7 +1571,7 @@
   EXPECT_FALSE(active_web_contents->GetController().GetPendingEntry());
 }
 
-IN_PROC_BROWSER_TEST_F(PDFExtensionTest, MultipleDomains) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionTest, MultipleDomains) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -1548,14 +1586,37 @@
 
 namespace {
 
-class PDFExtensionIsolatedContentTest : public base::test::WithFeatureOverride,
-                                        public PDFExtensionTest {
+class PDFExtensionIsolatedContentTest
+    : public PDFExtensionTestWithoutOopifOverride,
+      public testing::WithParamInterface<std::tuple<bool, bool>> {
  protected:
-  PDFExtensionIsolatedContentTest()
-      : base::test::WithFeatureOverride(features::kSitePerProcess) {}
+  bool site_isolated() const { return std::get<0>(GetParam()); }
+
+  bool UseOopif() const override { return std::get<1>(GetParam()); }
+
+  std::vector<base::test::FeatureRef> GetEnabledFeatures() const override {
+    std::vector<base::test::FeatureRef> enabled =
+        PDFExtensionTestWithoutOopifOverride::GetEnabledFeatures();
+    if (site_isolated()) {
+      enabled.push_back(features::kSitePerProcess);
+    }
+    return enabled;
+  }
+
+  std::vector<base::test::FeatureRef> GetDisabledFeatures() const override {
+    std::vector<base::test::FeatureRef> disabled =
+        PDFExtensionTestWithoutOopifOverride::GetDisabledFeatures();
+    if (!site_isolated()) {
+      disabled.push_back(features::kSitePerProcess);
+    }
+    return disabled;
+  }
 };
 
-INSTANTIATE_FEATURE_OVERRIDE_TEST_SUITE(PDFExtensionIsolatedContentTest);
+INSTANTIATE_TEST_SUITE_P(All,
+                         PDFExtensionIsolatedContentTest,
+                         testing::Combine(testing::Bool(), testing::Bool()),
+                         PDFExtensionIsolatedContentTestPassToString());
 
 }  // namespace
 
@@ -1570,7 +1631,7 @@
     GTEST_SKIP();
   }
 
-  EXPECT_EQ(IsParamFeatureEnabled(),
+  EXPECT_EQ(site_isolated(),
             content::SiteIsolationPolicy::UseDedicatedProcessesForAllSites());
 }
 
@@ -1690,7 +1751,7 @@
   }
 };
 
-IN_PROC_BROWSER_TEST_F(PDFExtensionLinkClickTest, CtrlLeft) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionLinkClickTest, CtrlLeft) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -1720,7 +1781,7 @@
   EXPECT_EQ("http://www.example.com/", url.spec());
 }
 
-IN_PROC_BROWSER_TEST_F(PDFExtensionLinkClickTest, Middle) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionLinkClickTest, Middle) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -1749,7 +1810,7 @@
   EXPECT_EQ("http://www.example.com/", url.spec());
 }
 
-IN_PROC_BROWSER_TEST_F(PDFExtensionLinkClickTest, CtrlShiftLeft) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionLinkClickTest, CtrlShiftLeft) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -1775,7 +1836,7 @@
   EXPECT_EQ("http://www.example.com/", url.spec());
 }
 
-IN_PROC_BROWSER_TEST_F(PDFExtensionLinkClickTest, ShiftMiddle) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionLinkClickTest, ShiftMiddle) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -1800,7 +1861,7 @@
   EXPECT_EQ("http://www.example.com/", url.spec());
 }
 
-IN_PROC_BROWSER_TEST_F(PDFExtensionLinkClickTest, ShiftLeft) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionLinkClickTest, ShiftLeft) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -1831,7 +1892,7 @@
 // the PDF is loaded and functional by clicking a link in the PDF. The link
 // click in the PDF opens a new tab. The main page handles the pageShow event
 // and updates the history state.
-IN_PROC_BROWSER_TEST_F(PDFExtensionLinkClickTest, OpenPDFWithReplaceState) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionLinkClickTest, OpenPDFWithReplaceState) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -1899,7 +1960,7 @@
 // If the PDF viewer can't navigate the tab using a tab id, make sure it doesn't
 // try to navigate the mime handler extension's frame.
 // Regression test for https://crbug.com/1158381
-IN_PROC_BROWSER_TEST_F(PDFExtensionLinkClickTest, LinkClickInPdfInNonTab) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionLinkClickTest, LinkClickInPdfInNonTab) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -1947,7 +2008,7 @@
   }
 };
 
-IN_PROC_BROWSER_TEST_F(PDFExtensionInternalLinkClickTest, CtrlLeft) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionInternalLinkClickTest, CtrlLeft) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -1978,7 +2039,7 @@
   EXPECT_EQ("page=2&zoom=100,0,200", url.ref());
 }
 
-IN_PROC_BROWSER_TEST_F(PDFExtensionInternalLinkClickTest, Middle) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionInternalLinkClickTest, Middle) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -2008,7 +2069,7 @@
   EXPECT_EQ("page=2&zoom=100,0,200", url.ref());
 }
 
-IN_PROC_BROWSER_TEST_F(PDFExtensionInternalLinkClickTest, ShiftLeft) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionInternalLinkClickTest, ShiftLeft) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -2173,7 +2234,7 @@
 #else
 #define MAYBE_Save Save
 #endif
-IN_PROC_BROWSER_TEST_F(PDFExtensionSaveTest, MAYBE_Save) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionSaveTest, MAYBE_Save) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -2250,7 +2311,7 @@
 #else
 #define MAYBE_SaveWithPolicy SaveWithPolicy
 #endif
-IN_PROC_BROWSER_TEST_F(PDFExtensionSaveWithPolicyTest, MAYBE_SaveWithPolicy) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionSaveWithPolicyTest, MAYBE_SaveWithPolicy) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -2279,7 +2340,7 @@
 #else
 #define MAYBE_SaveWithPolicyUniqueNumberSuffix SaveWithPolicyUniqueNumberSuffix
 #endif
-IN_PROC_BROWSER_TEST_F(PDFExtensionSaveWithPolicyTest,
+IN_PROC_BROWSER_TEST_P(PDFExtensionSaveWithPolicyTest,
                        MAYBE_SaveWithPolicyUniqueNumberSuffix) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
@@ -2308,7 +2369,7 @@
 }
 
 // TODO(crbug.com/1269103): Make this test non-flaky.
-IN_PROC_BROWSER_TEST_F(PDFExtensionSaveWithPolicyTest,
+IN_PROC_BROWSER_TEST_P(PDFExtensionSaveWithPolicyTest,
                        DISABLED_SaveWithPolicyUniqueTimeSuffix) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
@@ -2417,7 +2478,7 @@
 #else
 #define MAYBE_IndividualShiftRightArrowPresses IndividualShiftRightArrowPresses
 #endif
-IN_PROC_BROWSER_TEST_F(PDFExtensionClipboardTest,
+IN_PROC_BROWSER_TEST_P(PDFExtensionClipboardTest,
                        MAYBE_IndividualShiftRightArrowPresses) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
@@ -2444,7 +2505,7 @@
 }
 
 // TODO(crbug.com/897801): test is flaky.
-IN_PROC_BROWSER_TEST_F(PDFExtensionClipboardTest,
+IN_PROC_BROWSER_TEST_P(PDFExtensionClipboardTest,
                        DISABLED_IndividualShiftLeftArrowPresses) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
@@ -2484,7 +2545,7 @@
 #else
 #define MAYBE_CombinedShiftRightArrowPresses CombinedShiftRightArrowPresses
 #endif
-IN_PROC_BROWSER_TEST_F(PDFExtensionClipboardTest,
+IN_PROC_BROWSER_TEST_P(PDFExtensionClipboardTest,
                        MAYBE_CombinedShiftRightArrowPresses) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
@@ -2517,7 +2578,7 @@
 }
 
 // Flaky on multiple platforms (https://crbug.com/1121446)
-IN_PROC_BROWSER_TEST_F(PDFExtensionClipboardTest,
+IN_PROC_BROWSER_TEST_P(PDFExtensionClipboardTest,
                        DISABLED_CombinedShiftArrowPresses) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
@@ -2569,7 +2630,7 @@
 // message to the <embed> is correctly forwarded to the extension. This is for
 // catching future regression in docs/ and slides/ pages (see
 // https://crbug.com/763812).
-IN_PROC_BROWSER_TEST_F(PDFExtensionTest, PostMessageForZeroSizedEmbed) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionTest, PostMessageForZeroSizedEmbed) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -2622,7 +2683,7 @@
 }
 
 // Ensure that touchpad pinch events are handled by the PDF viewer.
-IN_PROC_BROWSER_TEST_F(PDFExtensionTest, TouchpadPinchInvokesCustomZoom) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionTest, TouchpadPinchInvokesCustomZoom) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -2654,7 +2715,7 @@
 
 #if !BUILDFLAG(IS_MAC)
 // Ensure that ctrl-wheel events are handled by the PDF viewer.
-IN_PROC_BROWSER_TEST_F(PDFExtensionTest, CtrlWheelInvokesCustomZoom) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionTest, CtrlWheelInvokesCustomZoom) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -2692,7 +2753,7 @@
 #define MAYBE_TouchscreenPinchInvokesCustomZoom \
   TouchscreenPinchInvokesCustomZoom
 #endif
-IN_PROC_BROWSER_TEST_F(PDFExtensionTest,
+IN_PROC_BROWSER_TEST_P(PDFExtensionTest,
                        MAYBE_TouchscreenPinchInvokesCustomZoom) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
@@ -2729,7 +2790,7 @@
 using PDFExtensionHitTestTest = PDFExtensionTest;
 
 // Flaky in nearly all configurations; see https://crbug.com/856169.
-IN_PROC_BROWSER_TEST_F(PDFExtensionHitTestTest, DISABLED_MouseLeave) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionHitTestTest, DISABLED_MouseLeave) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -2778,7 +2839,7 @@
   EXPECT_EQ(1, EvalJs(guest_mainframe, "enter_count;"));
 }
 
-IN_PROC_BROWSER_TEST_F(PDFExtensionHitTestTest, ContextMenuCoordinates) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionHitTestTest, ContextMenuCoordinates) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -2829,7 +2890,7 @@
 
 // The plugin document and the mime handler should both use the same background
 // color.
-IN_PROC_BROWSER_TEST_F(PDFExtensionTest, BackgroundColor) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionTest, BackgroundColor) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -2855,7 +2916,7 @@
   EXPECT_EQ(inner, outer);
 }
 
-IN_PROC_BROWSER_TEST_F(PDFExtensionTest, DefaultFocusForEmbeddedPDF) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionTest, DefaultFocusForEmbeddedPDF) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -2877,7 +2938,7 @@
   ASSERT_EQ(true, content::EvalJs(guest_mainframe, script));
 }
 
-IN_PROC_BROWSER_TEST_F(PDFExtensionTest, DefaultFocusForNonEmbeddedPDF) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionTest, DefaultFocusForNonEmbeddedPDF) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -2952,7 +3013,7 @@
 // This is a regression test for a problem where DidStopLoading didn't get
 // propagated from a remote frame into the main frame.  See also
 // https://crbug.com/964364.
-IN_PROC_BROWSER_TEST_F(PDFExtensionTest, DidStopLoading) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionTest, DidStopLoading) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -2997,7 +3058,7 @@
 // This test verifies that it is possible to add an <embed src=pdf> element into
 // a new popup window when using document.write.  See also
 // https://crbug.com/1041880.
-IN_PROC_BROWSER_TEST_F(PDFExtensionTest, DocumentWriteIntoNewPopup) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionTest, DocumentWriteIntoNewPopup) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -3029,7 +3090,7 @@
   ASSERT_TRUE(pdf_extension_test_util::EnsurePDFHasLoaded(popup));
 }
 
-IN_PROC_BROWSER_TEST_F(PDFExtensionTest, LoadPdfFromExtension) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionTest, LoadPdfFromExtension) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -3045,7 +3106,7 @@
 // Tests that the PDF extension loads in the presence of an extension that, on
 // the completion of document loading, adds an <iframe> to the body element.
 // https://bugs.chromium.org/p/chromium/issues/detail?id=1046795
-IN_PROC_BROWSER_TEST_F(PDFExtensionTest,
+IN_PROC_BROWSER_TEST_P(PDFExtensionTest,
                        PdfLoadsWithExtensionThatInjectsFrame) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
@@ -3059,7 +3120,7 @@
   EXPECT_TRUE(LoadPdf(embedded_test_server()->GetURL("/pdf/test.pdf")));
 }
 
-IN_PROC_BROWSER_TEST_F(PDFExtensionTest, Metrics) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionTest, Metrics) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -3090,7 +3151,7 @@
 }
 
 // Flaky. See https://crbug.com/1101514.
-IN_PROC_BROWSER_TEST_F(PDFExtensionTest, DISABLED_TabInAndOutOfPDFPlugin) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionTest, DISABLED_TabInAndOutOfPDFPlugin) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -3179,7 +3240,7 @@
 // TODO(1205920): The PDF viewer cannot currently be prerendered correctly. This
 // tests that prerendering is cancelled. Once we're able to support this, this
 // test should be replaced with one that prerenders the PDF viewer.
-IN_PROC_BROWSER_TEST_F(PDFExtensionPrerenderTest, CancelPrerender) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionPrerenderTest, CancelPrerender) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -3204,7 +3265,7 @@
 // tests that prerendering is cancelled if a PDF is embedded in a prerendered
 // page. Once we're able to support this, this test should be replaced with one
 // that prerenders the PDF viewer.
-IN_PROC_BROWSER_TEST_F(PDFExtensionPrerenderTest,
+IN_PROC_BROWSER_TEST_P(PDFExtensionPrerenderTest,
                        CancelPrerenderWithEmbeddedPdf) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
@@ -3229,7 +3290,7 @@
 // Cross-origin subframe navigations are deferred during prerendering, which
 // means that an embedded cross-site PDF will not cause the PDF viewer to be
 // created until prerender activation.
-IN_PROC_BROWSER_TEST_F(PDFExtensionPrerenderTest,
+IN_PROC_BROWSER_TEST_P(PDFExtensionPrerenderTest,
                        PrerenderWithCrossSiteEmbeddedPdf) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
@@ -3289,7 +3350,7 @@
   base::OnceClosure quit_closure_;
 };
 
-IN_PROC_BROWSER_TEST_F(PDFExtensionSubmitFormTest, SubmitForm) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionSubmitFormTest, SubmitForm) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -3345,7 +3406,7 @@
 
 // TODO(1205920): The PDF viewer cannot currently be prerendered correctly. Once
 // this is supported, this test should be re-enabled.
-IN_PROC_BROWSER_TEST_F(PDFExtensionPrerenderAndFencedFrameTest,
+IN_PROC_BROWSER_TEST_P(PDFExtensionPrerenderAndFencedFrameTest,
                        DISABLED_LoadPDFInPrerender) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
@@ -3387,7 +3448,7 @@
 
 // Test that ensures we cannot navigate a fenced frame to a PDF because PDF
 // isn't allowed by default static sandbox flags of fenced frames.
-IN_PROC_BROWSER_TEST_F(PDFExtensionPrerenderAndFencedFrameTest,
+IN_PROC_BROWSER_TEST_P(PDFExtensionPrerenderAndFencedFrameTest,
                        LoadPdfInFencedFrame) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
@@ -3406,7 +3467,7 @@
 }
 
 // Like `LoadPdfInFencedFrame`, but without Supports-Loading-Mode headers set.
-IN_PROC_BROWSER_TEST_F(PDFExtensionPrerenderAndFencedFrameTest,
+IN_PROC_BROWSER_TEST_P(PDFExtensionPrerenderAndFencedFrameTest,
                        LoadPdfInFencedFrameWithoutFencedFrameOptIn) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
@@ -3426,7 +3487,7 @@
 
 // Test that ensures a fenced frame cannot load a document embedding a PDF
 // because PDF isn't allowed in fenced frames.
-IN_PROC_BROWSER_TEST_F(PDFExtensionPrerenderAndFencedFrameTest,
+IN_PROC_BROWSER_TEST_P(PDFExtensionPrerenderAndFencedFrameTest,
                        LoadEmbeddedPdfInFencedFrame) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
@@ -3485,7 +3546,7 @@
 // cancels them, and posts a task to navigate to the original URL instead.
 // Triggering profile destruction after this task is posted but before it runs
 // has previously led to issues in https://crbug.com/1382761.
-IN_PROC_BROWSER_TEST_F(PDFExtensionTest, PdfNavigationDuringProfileShutdown) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionTest, PdfNavigationDuringProfileShutdown) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -3549,7 +3610,7 @@
 
 // Ensure that extensions do not get multiple bound LocalMainFrames for guest
 // views. This is a regression test for crbug.com/1367582.
-IN_PROC_BROWSER_TEST_F(PDFExtensionTest, ExtensionsBindingLocalHost) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionTest, ExtensionsBindingLocalHost) {
   // TODO(crbug.com/1445746): Remove this once the test passes for OOPIF PDF.
   if (UseOopif()) {
     GTEST_SKIP();
@@ -3586,3 +3647,21 @@
   EXPECT_EQ(1, content::EvalJs(primary_main_frame, "1;").ExtractInt());
   EXPECT_EQ(1, content::EvalJs(guest_view->web_contents(), "1;").ExtractInt());
 }
+
+// TODO(crbug.com/1445746): Stop testing both modes after OOPIF PDF viewer
+// launches.
+INSTANTIATE_FEATURE_OVERRIDE_TEST_SUITE(PDFExtensionTest);
+INSTANTIATE_FEATURE_OVERRIDE_TEST_SUITE(PDFExtensionBlobNavigationTest);
+INSTANTIATE_FEATURE_OVERRIDE_TEST_SUITE(PDFPluginDisabledTest);
+INSTANTIATE_FEATURE_OVERRIDE_TEST_SUITE(PDFExtensionTestWithPartialLoading);
+INSTANTIATE_FEATURE_OVERRIDE_TEST_SUITE(PDFExtensionScrollTest);
+INSTANTIATE_FEATURE_OVERRIDE_TEST_SUITE(PDFExtensionLinkClickTest);
+INSTANTIATE_FEATURE_OVERRIDE_TEST_SUITE(PDFExtensionInternalLinkClickTest);
+INSTANTIATE_FEATURE_OVERRIDE_TEST_SUITE(PDFExtensionSaveTest);
+INSTANTIATE_FEATURE_OVERRIDE_TEST_SUITE(PDFExtensionSaveWithPolicyTest);
+INSTANTIATE_FEATURE_OVERRIDE_TEST_SUITE(PDFExtensionClipboardTest);
+INSTANTIATE_FEATURE_OVERRIDE_TEST_SUITE(PDFExtensionHitTestTest);
+INSTANTIATE_FEATURE_OVERRIDE_TEST_SUITE(PDFExtensionPrerenderTest);
+INSTANTIATE_FEATURE_OVERRIDE_TEST_SUITE(PDFExtensionSubmitFormTest);
+INSTANTIATE_FEATURE_OVERRIDE_TEST_SUITE(
+    PDFExtensionPrerenderAndFencedFrameTest);
diff --git a/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc b/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc
index 20a2184..f0e55233 100644
--- a/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc
+++ b/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc
@@ -455,7 +455,6 @@
 #include "chrome/browser/privacy_sandbox/tracking_protection_notice_factory.h"
 #include "chrome/browser/search/background/ntp_background_service_factory.h"
 #include "chrome/browser/search/background/ntp_custom_background_service_factory.h"
-#include "chrome/browser/search/background/wallpaper_search/wallpaper_search_service_factory.h"
 #include "chrome/browser/serial/serial_chooser_context_factory.h"
 #include "chrome/browser/sessions/closed_tab_cache_service_factory.h"
 #include "chrome/browser/speech/speech_recognition_service_factory.h"
@@ -469,7 +468,6 @@
 #include "chrome/browser/usb/usb_connection_tracker_factory.h"
 #include "chrome/browser/user_notes/user_note_service_factory.h"
 #include "components/manta/features.h"
-#include "components/optimization_guide/core/model_execution/model_execution_features.h"
 #endif
 
 #if BUILDFLAG(ENABLE_SCREEN_AI_SERVICE)
@@ -1215,12 +1213,6 @@
   user_notes::UserNoteServiceFactory::EnsureFactoryBuilt();
   UserEducationServiceFactory::GetInstance();
 #endif
-#if !BUILDFLAG(IS_ANDROID)
-  if (base::FeatureList::IsEnabled(optimization_guide::features::internal::
-                                       kWallpaperSearchSettingsVisibility)) {
-    WallpaperSearchServiceFactory::GetInstance();
-  }
-#endif
 #if BUILDFLAG(ENABLE_EXTENSIONS)
   web_app::IsolatedWebAppReaderRegistryFactory::GetInstance();
   web_app::WebAppMetricsFactory::GetInstance();
diff --git a/chrome/browser/profiles/profile_manager.cc b/chrome/browser/profiles/profile_manager.cc
index 46061377..ae867056 100644
--- a/chrome/browser/profiles/profile_manager.cc
+++ b/chrome/browser/profiles/profile_manager.cc
@@ -126,12 +126,10 @@
 #include "chrome/browser/accessibility/live_caption/live_caption_controller_factory.h"
 #include "chrome/browser/lifetime/application_lifetime_desktop.h"
 #include "chrome/browser/profiles/nuke_profile_directory_utils.h"
-#include "chrome/browser/search/background/wallpaper_search/wallpaper_search_service_factory.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_finder.h"
 #include "chrome/browser/ui/browser_list.h"
 #include "components/live_caption/live_caption_controller.h"
-#include "components/optimization_guide/core/model_execution/model_execution_features.h"
 #else
 #include "chrome/browser/profiles/profile_manager_android.h"
 #endif
@@ -1555,14 +1553,6 @@
   // Ensure NavigationPredictorKeyedService is started.
   NavigationPredictorKeyedServiceFactory::GetForProfile(profile);
 
-#if !BUILDFLAG(IS_ANDROID)
-  // Ensure WallpaperSearchServiceFactory is started.
-  if (base::FeatureList::IsEnabled(optimization_guide::features::internal::
-                                       kWallpaperSearchSettingsVisibility)) {
-    WallpaperSearchServiceFactory::GetForProfile(profile);
-  }
-#endif  // !BUILDFLAG(IS_ANDROID)
-
   // Ensure PreloadingModelKeyedService is started.
   PreloadingModelKeyedServiceFactory::GetForProfile(profile);
 
diff --git a/chrome/browser/resources/ash/settings/os_languages_page/language_settings_card.html b/chrome/browser/resources/ash/settings/os_languages_page/language_settings_card.html
index e010de6..be5382b 100644
--- a/chrome/browser/resources/ash/settings/os_languages_page/language_settings_card.html
+++ b/chrome/browser/resources/ash/settings/os_languages_page/language_settings_card.html
@@ -3,6 +3,7 @@
 <settings-card header-text="[[getHeaderText_()]]">
   <cr-link-row
       id="languagesRow"
+      start-icon="[[rowIcons_.languages]]"
       label="$i18n{languagesPageTitle}"
       sub-label="[[getLanguageDisplayName_(
           languages.prospectiveUILanguage, languageHelper)]]"
diff --git a/chrome/browser/resources/ash/settings/os_languages_page/language_settings_card.ts b/chrome/browser/resources/ash/settings/os_languages_page/language_settings_card.ts
index 130a7c4..8b7847b 100644
--- a/chrome/browser/resources/ash/settings/os_languages_page/language_settings_card.ts
+++ b/chrome/browser/resources/ash/settings/os_languages_page/language_settings_card.ts
@@ -48,6 +48,20 @@
       languageHelper: Object,
 
       isRevampWayfindingEnabled_: Boolean,
+
+      rowIcons_: {
+        type: Object,
+        value() {
+          if (isRevampWayfindingEnabled()) {
+            return {
+              languages: 'os-settings:language',
+            };
+          }
+          return {
+            languages: '',
+          };
+        },
+      },
     };
   }
 
@@ -61,6 +75,7 @@
 
   // Internal state.
   private isRevampWayfindingEnabled_ = isRevampWayfindingEnabled();
+  private rowIcons_: Record<string, string>;
 
   // Internal properties for mixins.
   // From RouteOriginMixin. This needs to be defined after
diff --git a/chrome/browser/resources/ash/settings/settings_shared.css b/chrome/browser/resources/ash/settings/settings_shared.css
index bc34dfbe..b3251d5 100644
--- a/chrome/browser/resources/ash/settings/settings_shared.css
+++ b/chrome/browser/resources/ash/settings/settings_shared.css
@@ -363,3 +363,7 @@
 cr-button {
   font: var(--cros-button-2-font);
 }
+
+:host-context(body.revamp-wayfinding-enabled) cr-link-row {
+  --cr-link-row-start-icon-color: var(--cros-sys-primary);
+}
diff --git a/chrome/browser/resources/chromeos/multidevice_setup/multidevice_setup_dialog.html b/chrome/browser/resources/chromeos/multidevice_setup/multidevice_setup_dialog.html
index cd2769c..6acd915 100644
--- a/chrome/browser/resources/chromeos/multidevice_setup/multidevice_setup_dialog.html
+++ b/chrome/browser/resources/chromeos/multidevice_setup/multidevice_setup_dialog.html
@@ -1,11 +1,12 @@
 <!doctype html>
-<html dir="$i18n{textdirection}" lang="$i18n{language}">
+<html dir="$i18n{textdirection}" lang="$i18n{language}" cros>
 <head>
   <meta charset="utf8">
   <base href="chrome://multidevice-setup">
   <link rel="stylesheet" href="chrome://resources/css/md_colors.css">
   <link rel="stylesheet" href="chrome://resources/css/text_defaults_md.css">
   <link rel="stylesheet" href="chrome://resources/chromeos/colors/cros_styles.css">
+  <link rel="stylesheet" href="chrome://theme/colors.css?sets=sys">
   <title>$i18n{dialogAccessibilityTitle}</title>
   <style>
     html,
diff --git a/chrome/browser/resources/chromeos/multidevice_setup/multidevice_setup_post_oobe.html b/chrome/browser/resources/chromeos/multidevice_setup/multidevice_setup_post_oobe.html
index b57d5eb7..05c6eb4 100644
--- a/chrome/browser/resources/chromeos/multidevice_setup/multidevice_setup_post_oobe.html
+++ b/chrome/browser/resources/chromeos/multidevice_setup/multidevice_setup_post_oobe.html
@@ -1,4 +1,4 @@
-<style include="multidevice-setup-shared">
+<style include="multidevice-setup-shared cros-color-overrides">
   :host {
     width: 100%;
   }
diff --git a/chrome/browser/resources/chromeos/multidevice_setup/multidevice_setup_post_oobe.js b/chrome/browser/resources/chromeos/multidevice_setup/multidevice_setup_post_oobe.js
index 3eef9f4..1d235f5 100644
--- a/chrome/browser/resources/chromeos/multidevice_setup/multidevice_setup_post_oobe.js
+++ b/chrome/browser/resources/chromeos/multidevice_setup/multidevice_setup_post_oobe.js
@@ -4,11 +4,13 @@
 
 import 'chrome://resources/cr_elements/cr_button/cr_button.js';
 import './strings.m.js';
+import '//resources/cr_elements/chromeos/cros_color_overrides.css.js';
 
 import {loadTimeData} from '//resources/ash/common/load_time_data.m.js';
+import {ColorChangeUpdater} from '//resources/cr_components/color_change_listener/colors_css_updater.js';
+import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {PageName} from 'chrome://resources/ash/common/multidevice_setup/multidevice_setup.js';
 import {MultiDeviceSetupDelegate} from 'chrome://resources/ash/common/multidevice_setup/multidevice_setup_delegate.js';
-import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {PostOobeDelegate} from './post_oobe_delegate.js';
@@ -78,6 +80,14 @@
   /** @override */
   ready() {
     this.onWindowSizeUpdated_();
+
+    document.body.classList.add('jelly-enabled');
+
+    // Start listening for color changes in 'chrome://theme/colors.css'.
+    /** @suppress {checkTypes} */
+    (function() {
+      ColorChangeUpdater.forDocument().start();
+    })();
   },
 
   /** @override */
diff --git a/chrome/browser/resources/feedback/html/default.html b/chrome/browser/resources/feedback/html/default.html
index 9b45c28..5ae331c 100644
--- a/chrome/browser/resources/feedback/html/default.html
+++ b/chrome/browser/resources/feedback/html/default.html
@@ -66,6 +66,12 @@
           aria-labelledby="offensive-checkbox-label">
       <label id="offensive-checkbox-label">$i18n{offensiveCheckboxLabel}</label>
     </div>
+    <!-- Show log id -->
+    <div id="log-id-container" class="checkbox-field-container" hidden>
+      <input id="log-id-checkbox" type="checkbox"
+          aria-labelledby="log-id-checkbox-label" checked>
+      <label id="log-id-checkbox-label">$i18n{logIdCheckboxLabel}</label>
+    </div>
     <!-- Screenshot -->
     <div class="checkbox-field-container">
       <input id="screenshot-checkbox" type="checkbox"
diff --git a/chrome/browser/resources/feedback/js/feedback.ts b/chrome/browser/resources/feedback/js/feedback.ts
index 9cf7789..c888973 100644
--- a/chrome/browser/resources/feedback/js/feedback.ts
+++ b/chrome/browser/resources/feedback/js/feedback.ts
@@ -10,6 +10,7 @@
 
 import {assert} from 'chrome://resources/js/assert.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.js';
+import {OpenWindowProxyImpl} from 'chrome://resources/js/open_window_proxy.js';
 import {$, getRequiredElement} from 'chrome://resources/js/util.js';
 
 import {FeedbackBrowserProxy, FeedbackBrowserProxyImpl} from './feedback_browser_proxy.js';
@@ -46,6 +47,7 @@
   systemInformation: [],
   useSystemWindowFrame: false,
   isOffensiveOrUnsafe: undefined,
+  aiMetadata: undefined,
 };
 
 
@@ -64,7 +66,7 @@
               chrome.feedbackPrivate.LandingPageType.NORMAL ?
           FEEDBACK_LANDING_PAGE :
           FEEDBACK_LANDING_PAGE_TECHSTOP;
-      window.open(landingPage, '_blank');
+      OpenWindowProxyImpl.getInstance().openUrl(landingPage);
     }
   } else {
     console.warn(
@@ -460,6 +462,9 @@
   if (feedbackInfo.flow === chrome.feedbackPrivate.FeedbackFlow.AI) {
     feedbackInfo.isOffensiveOrUnsafe =
         getRequiredElement<HTMLInputElement>('offensive-checkbox').checked;
+    if (!getRequiredElement<HTMLInputElement>('log-id-checkbox').checked) {
+      feedbackInfo.aiMetadata = undefined;
+    }
   }
 
   feedbackInfo.description = textarea.value;
@@ -641,6 +646,7 @@
       getRequiredElement('free-form-text').textContent =
           loadTimeData.getString('freeFormTextAi');
       getRequiredElement('offensive-container').hidden = false;
+      getRequiredElement('log-id-container').hidden = false;
     }
 
     const whenScreenshotUpdated = takeScreenshot().then(function(
diff --git a/chrome/browser/resources/new_tab_page/modules/modules.ts b/chrome/browser/resources/new_tab_page/modules/modules.ts
index 4ce03b4..4b1aea95 100644
--- a/chrome/browser/resources/new_tab_page/modules/modules.ts
+++ b/chrome/browser/resources/new_tab_page/modules/modules.ts
@@ -213,10 +213,8 @@
                     moduleWrapper.addEventListener(
                         'mousedown', e => this.onDragStart_(e));
                   }
-                  if (!loadTimeData.getBoolean('modulesRedesignedEnabled')) {
-                    moduleWrapper.addEventListener(
-                        'dismiss-module', e => this.onDismissModule_(e));
-                  }
+                  moduleWrapper.addEventListener(
+                      'dismiss-module', e => this.onDismissModule_(e));
                   moduleWrapper.addEventListener(
                       'disable-module', e => this.onDisableModule_(e));
                   moduleWrapper.addEventListener('detect-impression', () => {
diff --git a/chrome/browser/resources/settings/lazy_load.ts b/chrome/browser/resources/settings/lazy_load.ts
index 4cd48d7..a49ea98 100644
--- a/chrome/browser/resources/settings/lazy_load.ts
+++ b/chrome/browser/resources/settings/lazy_load.ts
@@ -197,7 +197,7 @@
 export {SecurityKeysPhonesSubpageElement} from './privacy_page/security_keys_phones_subpage.js';
 export {ResetDialogPage, SettingsSecurityKeysResetDialogElement} from './privacy_page/security_keys_reset_dialog.js';
 export {SetPinDialogPage, SettingsSecurityKeysSetPinDialogElement} from './privacy_page/security_keys_set_pin_dialog.js';
-export {SafeBrowsingSetting, SettingsSecurityPageElement} from './privacy_page/security_page.js';
+export {HttpsFirstModeSetting, SafeBrowsingSetting, SettingsSecurityPageElement} from './privacy_page/security_page.js';
 export {SettingsPrivacySandboxAdMeasurementSubpageElement} from './privacy_sandbox/privacy_sandbox_ad_measurement_subpage.js';
 export {SettingsPrivacySandboxFledgeSubpageElement} from './privacy_sandbox/privacy_sandbox_fledge_subpage.js';
 export {PrivacySandboxInterestItemElement} from './privacy_sandbox/privacy_sandbox_interest_item.js';
diff --git a/chrome/browser/resources/settings/privacy_page/security_page.html b/chrome/browser/resources/settings/privacy_page/security_page.html
index 043c0a4..43682e9 100644
--- a/chrome/browser/resources/settings/privacy_page/security_page.html
+++ b/chrome/browser/resources/settings/privacy_page/security_page.html
@@ -72,6 +72,15 @@
         --cr-radio-button-unchecked-ripple-color:
             var(--cr-radio-button-checked-ripple-color);
       }
+
+      #httpsFirstModeSettingHeader .cr-padded-text {
+        padding-block-end: 0;
+      }
+
+      #httpsFirstModeRadioGroup .list-item {
+        padding-block-start: var(--cr-section-vertical-padding);
+        padding-block-end: var(--cr-section-vertical-padding);
+      }
     </style>
     <picture>
       <source
@@ -256,13 +265,53 @@
     <div class="cr-row first">
       <h2>$i18n{advancedPageTitle}</h2>
     </div>
-    <settings-toggle-button id="httpsOnlyModeToggle"
-        pref="{{prefs.generated.https_first_mode_enabled}}"
-        label="$i18n{httpsOnlyModeTitle}"
-        sub-label="[[getHttpsFirstModeSubLabel_(
-                       prefs.generated.https_first_mode_enabled.*)]]"
-        numeric-checked-value="[[httpsFirstModeSettingEnum_.ENABLED_FULL]]">
-    </settings-toggle-button>
+    <template is="dom-if" if="[[!enableHttpsFirstModeNewSettings_]]">
+      <settings-toggle-button id="httpsOnlyModeToggle"
+          pref="{{prefs.generated.https_first_mode_enabled}}"
+          label="$i18n{httpsOnlyModeTitle}"
+          sub-label="[[getHttpsFirstModeSubLabel_(
+                         prefs.generated.https_first_mode_enabled.*)]]"
+          numeric-checked-value="[[httpsFirstModeSettingEnum_.ENABLED_FULL]]">
+      </settings-toggle-button>
+    </template>
+    <template is="dom-if" if="[[enableHttpsFirstModeNewSettings_]]">
+      <div id="httpsFirstModeSettingHeader" class="cr-row first">
+        <div class="cr-padded-text">
+          <div>$i18n{httpsFirstModeSectionLabel}</div>
+          <div class="cr-secondary-text">
+            $i18n{httpsFirstModeSectionSubLabel}
+          </div>
+        </div>
+      </div>
+      <div class="list-frame">
+        <settings-radio-group id="httpsFirstModeRadioGroup"
+            pref="{{prefs.generated.https_first_mode_enabled}}">
+          <controlled-radio-button id="httpsFirstModeEnabledFull"
+              name="[[httpsFirstModeSettingEnum_.ENABLED_FULL]]"
+              pref="[[prefs.generated.https_first_mode_enabled]]"
+              label="$i18n{httpsFirstModeEnabledFullLabel}" class="list-item">
+            <div class="cr-secondary-text">
+              $i18n{httpsFirstModeEnabledFullSubLabel}
+            </div>
+          </controlled-radio-button>
+          <controlled-radio-button id="httpsFirstModeEnabledIncognito"
+              name="[[httpsFirstModeSettingEnum_.ENABLED_INCOGNITO]]"
+              pref="[[prefs.generated.https_first_mode_enabled]]"
+              label="$i18n{httpsFirstModeEnabledIncognitoLabel}"
+              class="list-item hr">
+            <div class="cr-secondary-text">
+              $i18n{httpsFirstModeEnabledIncognitoSubLabel}</div>
+          </controlled-radio-button>
+          <controlled-radio-button id="httpsFirstModeDisabled"
+              name="[[httpsFirstModeSettingEnum_.DISABLED]]"
+              pref="[[prefs.generated.https_first_mode_enabled]]"
+              label="$i18n{httpsFirstModeDisabledLabel}" class="list-item hr">
+            <div class="cr-secondary-text">$i18n{httpsFirstModeDisabledSubLabel}
+            </div>
+          </controlled-radio-button>
+        </settings-radio-group>
+      </div>
+    </template>
     <template is="dom-if" if="[[showSecureDnsSetting_]]">
       <settings-secure-dns prefs="{{prefs}}"></settings-secure-dns>
     </template>
diff --git a/chrome/browser/resources/settings/privacy_page/security_page.ts b/chrome/browser/resources/settings/privacy_page/security_page.ts
index 640c867..834f9eb 100644
--- a/chrome/browser/resources/settings/privacy_page/security_page.ts
+++ b/chrome/browser/resources/settings/privacy_page/security_page.ts
@@ -52,7 +52,7 @@
  * the enum of the same name located in:
  * chrome/browser/ssl/https_first_mode_settings_tracker.h
  */
-enum HttpsFirstModeSetting {
+export enum HttpsFirstModeSetting {
   DISABLED = 0,
   ENABLED_INCOGNITO = 1,
   ENABLED_FULL = 2,
@@ -146,6 +146,14 @@
         value: HttpsFirstModeSetting,
       },
 
+      enableHttpsFirstModeNewSettings_: {
+        type: Boolean,
+        readOnly: true,
+        value() {
+          return loadTimeData.getBoolean('enableHttpsFirstModeNewSettings');
+        },
+      },
+
       enableSecurityKeysSubpage_: {
         type: Boolean,
         readOnly: true,
@@ -202,6 +210,7 @@
   private showDisableSafebrowsingDialog_: boolean;
   private enableFriendlierSafeBrowsingSettings_: boolean;
   private enableHashPrefixRealTimeLookups_: boolean;
+  private enableHttpsFirstModeNewSettings_: boolean;
 
   private browserProxy_: PrivacyPageBrowserProxy =
       PrivacyPageBrowserProxyImpl.getInstance();
@@ -244,9 +253,13 @@
         this.$.safeBrowsingStandard.expanded = true;
       }
 
-      assert(
-          this.getPref('generated.https_first_mode_enabled').value !==
-          HttpsFirstModeSetting.ENABLED_INCOGNITO);
+      // The HTTPS-First Mode generated pref should never be set to
+      // ENABLED_INCOGNITO if the feature flag is not enabled.
+      if (!loadTimeData.getBoolean('enableHttpsFirstModeNewSettings')) {
+        assert(
+            this.getPref('generated.https_first_mode_enabled').value !==
+            HttpsFirstModeSetting.ENABLED_INCOGNITO);
+      }
     });
 
     this.registerHelpBubble(
diff --git a/chrome/browser/screen_ai/screen_ai_install_state.cc b/chrome/browser/screen_ai/screen_ai_install_state.cc
index f8058b63..bf0de442 100644
--- a/chrome/browser/screen_ai/screen_ai_install_state.cc
+++ b/chrome/browser/screen_ai/screen_ai_install_state.cc
@@ -12,6 +12,7 @@
 #include "base/functional/bind.h"
 #include "base/logging.h"
 #include "base/metrics/histogram_functions.h"
+#include "base/native_library.h"
 #include "base/ranges/algorithm.h"
 #include "base/task/thread_pool.h"
 #include "base/time/time.h"
@@ -70,6 +71,37 @@
   return false;
 }
 
+// static
+bool ScreenAIInstallState::VerifyLibraryAvailablity(
+    const base::FilePath& install_dir) {
+  // Check the file iterator heuristic to find the library in the sandbox
+  // returns the same directory as `install_dir`.
+  base::FilePath binary_path = screen_ai::GetLatestComponentBinaryPath();
+  if (binary_path.DirName() != install_dir) {
+    VLOG(0) << "Screen AI library is installed in an unexpected folder.";
+    return false;
+  }
+
+  // Sometimes the library cannot be loaded due to an installation error or OS
+  // limitations.
+  base::NativeLibraryLoadError lib_error;
+  base::NativeLibrary library =
+      base::LoadNativeLibrary(binary_path, &lib_error);
+  bool available = (library != nullptr);
+  base::UmaHistogramBoolean("Accessibility.ScreenAI.LibraryAvailableOnVerify",
+                            available);
+#if BUILDFLAG(IS_WIN)
+  base::UmaHistogramSparse("Accessibility.ScreenAI.LibraryAccessResultOnVerify",
+                           lib_error.code);
+#endif
+
+  if (available) {
+    base::UnloadNativeLibrary(library);
+  }
+
+  return available;
+}
+
 ScreenAIInstallState::ScreenAIInstallState() {
   CHECK_EQ(g_instance, nullptr);
   g_instance = this;
diff --git a/chrome/browser/screen_ai/screen_ai_install_state.h b/chrome/browser/screen_ai/screen_ai_install_state.h
index b88f4e3..7697e6f 100644
--- a/chrome/browser/screen_ai/screen_ai_install_state.h
+++ b/chrome/browser/screen_ai/screen_ai_install_state.h
@@ -58,6 +58,9 @@
   // expected.
   static bool VerifyLibraryVersion(const std::string& version);
 
+  // Verifies that the library is in the expected folder and can be loaded.
+  static bool VerifyLibraryAvailablity(const base::FilePath& install_dir);
+
   // Returns true if the library is used recently and we need to keep it on
   // device and updated.
   static bool ShouldInstall(PrefService* local_state);
diff --git a/chrome/browser/search/background/wallpaper_search/wallpaper_search_service.cc b/chrome/browser/search/background/wallpaper_search/wallpaper_search_service.cc
deleted file mode 100644
index a9f9e04..0000000
--- a/chrome/browser/search/background/wallpaper_search/wallpaper_search_service.cc
+++ /dev/null
@@ -1,99 +0,0 @@
-// Copyright 2023 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/search/background/wallpaper_search/wallpaper_search_service.h"
-#include "chrome/browser/about_flags.h"
-#include "chrome/browser/browser_process.h"
-#include "chrome/browser/flag_descriptions.h"
-#include "chrome/browser/optimization_guide/optimization_guide_keyed_service_factory.h"
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/ui/webui/flags/flags_ui_handler.h"
-
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-#include "base/system/sys_info.h"
-#include "chrome/browser/ash/crosapi/browser_data_migrator.h"
-#include "chrome/browser/ash/ownership/owner_settings_service_ash.h"
-#include "chrome/browser/ash/ownership/owner_settings_service_ash_factory.h"
-#include "chrome/browser/ash/settings/about_flags.h"
-#endif
-
-WallpaperSearchService::WallpaperSearchService(Profile* profile)
-    : SettingsEnabledObserver(optimization_guide::proto::ModelExecutionFeature::
-                                  MODEL_EXECUTION_FEATURE_WALLPAPER_SEARCH),
-      profile_(profile),
-      optimization_guide_keyed_service_(
-          OptimizationGuideKeyedServiceFactory::GetForProfile(profile_)) {
-  if (optimization_guide_keyed_service_) {
-    optimization_guide_keyed_service_->AddModelExecutionSettingsEnabledObserver(
-        this);
-  }
-}
-WallpaperSearchService::~WallpaperSearchService() = default;
-
-void WallpaperSearchService::Shutdown() {
-  if (optimization_guide_keyed_service_) {
-    optimization_guide_keyed_service_
-        ->RemoveModelExecutionSettingsEnabledObserver(this);
-    optimization_guide_keyed_service_ = nullptr;
-  }
-}
-
-void WallpaperSearchService::EnableWallpaperSearchFeatures(
-    flags_ui::FlagsStorage* flags_storage) {
-  about_flags::SetFeatureEntryEnabled(
-      flags_storage,
-      std::string(flag_descriptions::kChromeRefresh2023Id) +
-          flags_ui::kMultiSeparatorChar +
-          /*enable_feature_index=*/"1",
-      true);
-  about_flags::SetFeatureEntryEnabled(
-      flags_storage,
-      std::string(flag_descriptions::kChromeWebuiRefresh2023Id) +
-          flags_ui::kMultiSeparatorChar +
-          /*enable_feature_index=*/"1",
-      true);
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-  ash::about_flags::FeatureFlagsUpdate(*flags_storage,
-                                       g_browser_process->local_state())
-      .UpdateSessionManager();
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
-}
-
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-void WallpaperSearchService::EnableWallpaperSearchFeaturesForChromeAsh(
-    bool is_owner) {
-  std::unique_ptr<flags_ui::FlagsStorage> flags_storage;
-  is_owner
-      ? flags_storage = std::make_unique<ash::about_flags::OwnerFlagsStorage>(
-            g_browser_process->local_state(),
-            ash::OwnerSettingsServiceAshFactory::GetForBrowserContext(
-                profile_->GetOriginalProfile()))
-      : flags_storage = std::make_unique<flags_ui::PrefServiceFlagsStorage>(
-            g_browser_process->local_state());
-  EnableWallpaperSearchFeatures(flags_storage.get());
-}
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
-
-void WallpaperSearchService::PrepareToEnableOnRestart() {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-  // Bypass possible incognito profile same as chrome://flags does.
-  Profile* original_profile = profile_->GetOriginalProfile();
-  // Chrome OS builds sometimes run on non-Chrome OS environments.
-  if ((base::SysInfo::IsRunningOnChromeOS() ||
-       skip_chrome_os_device_check_for_testing_) &&
-      ash::OwnerSettingsServiceAshFactory::GetForBrowserContext(
-          original_profile)) {
-    // Ash-chrome uses a different FlagsStorage if the user is the owner.
-    ash::OwnerSettingsServiceAshFactory::GetForBrowserContext(original_profile)
-        ->IsOwnerAsync(base::BindOnce(
-            &WallpaperSearchService::EnableWallpaperSearchFeaturesForChromeAsh,
-            weak_factory_.GetWeakPtr()));
-    return;
-  }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
-  std::unique_ptr<flags_ui::FlagsStorage> flags_storage =
-      std::make_unique<flags_ui::PrefServiceFlagsStorage>(
-          g_browser_process->local_state());
-  EnableWallpaperSearchFeatures(flags_storage.get());
-}
diff --git a/chrome/browser/search/background/wallpaper_search/wallpaper_search_service.h b/chrome/browser/search/background/wallpaper_search/wallpaper_search_service.h
deleted file mode 100644
index 1377f6b..0000000
--- a/chrome/browser/search/background/wallpaper_search/wallpaper_search_service.h
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2023 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_SEARCH_BACKGROUND_WALLPAPER_SEARCH_WALLPAPER_SEARCH_SERVICE_H_
-#define CHROME_BROWSER_SEARCH_BACKGROUND_WALLPAPER_SEARCH_WALLPAPER_SEARCH_SERVICE_H_
-
-#include "base/memory/raw_ptr.h"
-#include "base/memory/weak_ptr.h"
-#include "base/scoped_observation.h"
-#include "chrome/browser/optimization_guide/optimization_guide_keyed_service.h"
-#include "components/flags_ui/pref_service_flags_storage.h"
-#include "components/keyed_service/core/keyed_service.h"
-#include "components/optimization_guide/core/model_execution/settings_enabled_observer.h"
-
-class Profile;
-
-// A service that enables GM3 features when Wallpaper Search is enabled.
-class WallpaperSearchService
-    : public KeyedService,
-      public optimization_guide::SettingsEnabledObserver {
- public:
-  explicit WallpaperSearchService(Profile* profile);
-
-  WallpaperSearchService(const WallpaperSearchService&) = delete;
-  WallpaperSearchService& operator=(const WallpaperSearchService&) = delete;
-
-  ~WallpaperSearchService() override;
-
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-  void SkipChromeOSDeviceCheckForTesting(bool should_skip_check) {
-    skip_chrome_os_device_check_for_testing_ = should_skip_check;
-  }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
-
- private:
-  // KeyedService implementation:
-  void Shutdown() override;
-
-  void EnableWallpaperSearchFeatures(flags_ui::FlagsStorage* flags_storage);
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-  void EnableWallpaperSearchFeaturesForChromeAsh(bool is_owner);
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
-
-  // optimization_guide::SettingsEnabledObserver implementation;
-  void PrepareToEnableOnRestart() override;
-
-  raw_ptr<Profile> profile_;
-  raw_ptr<OptimizationGuideKeyedService> optimization_guide_keyed_service_;
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-  bool skip_chrome_os_device_check_for_testing_ = false;
-#endif
-  base::WeakPtrFactory<WallpaperSearchService> weak_factory_{this};
-};
-
-#endif  // CHROME_BROWSER_SEARCH_BACKGROUND_WALLPAPER_SEARCH_WALLPAPER_SEARCH_SERVICE_H_
diff --git a/chrome/browser/search/background/wallpaper_search/wallpaper_search_service_browsertest.cc b/chrome/browser/search/background/wallpaper_search/wallpaper_search_service_browsertest.cc
deleted file mode 100644
index 756c6f4..0000000
--- a/chrome/browser/search/background/wallpaper_search/wallpaper_search_service_browsertest.cc
+++ /dev/null
@@ -1,123 +0,0 @@
-// Copyright 2023 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/feature_list.h"
-#include "base/test/scoped_feature_list.h"
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/search/background/wallpaper_search/wallpaper_search_service.h"
-#include "chrome/browser/search/background/wallpaper_search/wallpaper_search_service_factory.h"
-#include "chrome/browser/signin/identity_manager_factory.h"
-#include "chrome/browser/ui/browser.h"
-#include "chrome/browser/ui/search/search_tab_helper.h"
-#include "chrome/test/base/in_process_browser_test.h"
-#include "components/optimization_guide/core/model_execution/model_execution_features.h"
-#include "components/optimization_guide/core/optimization_guide_features.h"
-#include "components/optimization_guide/core/optimization_guide_prefs.h"
-#include "components/prefs/pref_service.h"
-#include "components/search/ntp_features.h"
-#include "components/signin/public/identity_manager/identity_manager.h"
-#include "components/signin/public/identity_manager/identity_test_utils.h"
-#include "content/public/test/browser_test.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "ui/base/ui_base_features.h"
-
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-#include "chrome/browser/ash/ownership/owner_settings_service_ash.h"
-#include "chrome/browser/ash/ownership/owner_settings_service_ash_factory.h"
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
-
-class WallpaperSearchServiceBrowserTest : public InProcessBrowserTest {
- public:
-  WallpaperSearchServiceBrowserTest() = default;
-  ~WallpaperSearchServiceBrowserTest() override = default;
-
-  void SetUp() override {
-    scoped_feature_list_.InitWithFeatures(
-        {optimization_guide::features::internal::
-             kWallpaperSearchSettingsVisibility,
-         ntp_features::kCustomizeChromeWallpaperSearch,
-         optimization_guide::features::kOptimizationGuideModelExecution},
-        {});
-    InProcessBrowserTest::SetUp();
-  }
-
-  // private:
-  base::test::ScopedFeatureList scoped_feature_list_;
-};
-
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
-// PRE_ simulates a browser restart.
-IN_PROC_BROWSER_TEST_F(WallpaperSearchServiceBrowserTest,
-                       PRE_EnablingWallpaperSearchEnablesGM3) {
-  signin::MakePrimaryAccountAvailable(
-      IdentityManagerFactory::GetForProfile(browser()->profile()),
-      "test@example.com", signin::ConsentLevel::kSync);
-  // Enable Wallpaper Search via Optimization Guide Prefs.
-  browser()->profile()->GetPrefs()->SetInteger(
-      optimization_guide::prefs::GetSettingEnabledPrefName(
-          optimization_guide::proto::ModelExecutionFeature::
-              MODEL_EXECUTION_FEATURE_WALLPAPER_SEARCH),
-      static_cast<int>(optimization_guide::prefs::FeatureOptInState::kEnabled));
-
-  // Enabling Wallpaper Search should enable GM3 when the browser restarts.
-  EXPECT_FALSE(base::FeatureList::IsEnabled(features::kChromeRefresh2023));
-  EXPECT_FALSE(base::FeatureList::IsEnabled(features::kChromeWebuiRefresh2023));
-  EXPECT_FALSE(features::IsChromeWebuiRefresh2023());
-}
-
-IN_PROC_BROWSER_TEST_F(WallpaperSearchServiceBrowserTest,
-                       EnablingWallpaperSearchEnablesGM3) {
-  EXPECT_TRUE(base::FeatureList::IsEnabled(features::kChromeRefresh2023));
-  EXPECT_TRUE(base::FeatureList::IsEnabled(features::kChromeWebuiRefresh2023));
-  EXPECT_TRUE(features::IsChromeWebuiRefresh2023());
-}
-#endif  // !BUILDFLAG(IS_CHROMEOS_ASH)
-
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-class WallpaperSearchServiceBrowserChromeAshTest
-    : public WallpaperSearchServiceBrowserTest,
-      public ::testing::WithParamInterface<std::tuple<bool, bool>> {
- public:
-  bool IsDeviceOwner() const { return std::get<0>(GetParam()); }
-  // Chrome OS builds sometimes run on non-Chrome OS environments.
-  bool IsRunningOnChromeOS() const { return std::get<1>(GetParam()); }
-};
-
-INSTANTIATE_TEST_SUITE_P(All,
-                         WallpaperSearchServiceBrowserChromeAshTest,
-                         ::testing::Combine(::testing::Bool(),
-                                            ::testing::Bool()));
-
-IN_PROC_BROWSER_TEST_P(WallpaperSearchServiceBrowserChromeAshTest,
-                       PRE_EnablingWallpaperSearchEnablesGM3) {
-  signin::MakePrimaryAccountAvailable(
-      IdentityManagerFactory::GetForProfile(browser()->profile()),
-      "test@example.com", signin::ConsentLevel::kSync);
-  // Skip checking if user's device is ChromeOS.
-  WallpaperSearchServiceFactory::GetForProfile(browser()->profile())
-      ->SkipChromeOSDeviceCheckForTesting(IsRunningOnChromeOS());
-  // Enable Wallpaper Search via Optimization Guide Prefs.
-  browser()->profile()->GetPrefs()->SetInteger(
-      optimization_guide::prefs::GetSettingEnabledPrefName(
-          optimization_guide::proto::ModelExecutionFeature::
-              MODEL_EXECUTION_FEATURE_WALLPAPER_SEARCH),
-      static_cast<int>(optimization_guide::prefs::FeatureOptInState::kEnabled));
-  // Declare if the user is the device owner.
-  ash::OwnerSettingsServiceAshFactory::GetForBrowserContext(
-      browser()->profile()->GetOriginalProfile())
-      ->RunPendingIsOwnerCallbacksForTesting(IsDeviceOwner());
-
-  // Enabling Wallpaper Search should enable GM3 when the browser restarts.
-  EXPECT_FALSE(base::FeatureList::IsEnabled(features::kChromeRefresh2023));
-  EXPECT_FALSE(base::FeatureList::IsEnabled(features::kChromeWebuiRefresh2023));
-  EXPECT_FALSE(features::IsChromeWebuiRefresh2023());
-}
-
-IN_PROC_BROWSER_TEST_P(WallpaperSearchServiceBrowserChromeAshTest,
-                       EnablingWallpaperSearchEnablesGM3) {
-  // TODO(b/311263522): Figure out why features::kChromeWebuiRefresh2023 does
-  // not enable on linux-chromeos-rel bot.
-  EXPECT_TRUE(base::FeatureList::IsEnabled(features::kChromeRefresh2023));
-}
-#endif  // !BUILDFLAG(IS_CHROMEOS_ASH)
diff --git a/chrome/browser/search/background/wallpaper_search/wallpaper_search_service_factory.cc b/chrome/browser/search/background/wallpaper_search/wallpaper_search_service_factory.cc
deleted file mode 100644
index a52f2ce..0000000
--- a/chrome/browser/search/background/wallpaper_search/wallpaper_search_service_factory.cc
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2023 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/search/background/wallpaper_search/wallpaper_search_service_factory.h"
-
-#include "base/no_destructor.h"
-#include "chrome/browser/optimization_guide/optimization_guide_keyed_service_factory.h"
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/profiles/profile_keyed_service_factory.h"
-#include "chrome/browser/search/background/wallpaper_search/wallpaper_search_service.h"
-#include "components/optimization_guide/core/optimization_guide_features.h"
-#include "components/search/ntp_features.h"
-
-// static
-WallpaperSearchService* WallpaperSearchServiceFactory::GetForProfile(
-    Profile* profile) {
-  if (base::FeatureList::IsEnabled(
-          ntp_features::kCustomizeChromeWallpaperSearch) &&
-      base::FeatureList::IsEnabled(
-          optimization_guide::features::kOptimizationGuideModelExecution)) {
-    return static_cast<WallpaperSearchService*>(
-        GetInstance()->GetServiceForBrowserContext(profile, true));
-  }
-  return nullptr;
-}
-
-// static
-WallpaperSearchServiceFactory* WallpaperSearchServiceFactory::GetInstance() {
-  static base::NoDestructor<WallpaperSearchServiceFactory> factory;
-  return factory.get();
-}
-
-WallpaperSearchServiceFactory::WallpaperSearchServiceFactory()
-    : ProfileKeyedServiceFactory(
-          "WallpaperSearchService",
-          // Uses same selections as OptimizationGuideKeyedService.
-          ProfileSelections::Builder()
-              .WithRegular(ProfileSelection::kOwnInstance)
-              .WithGuest(ProfileSelection::kOwnInstance)
-              .WithAshInternals(ProfileSelection::kNone)
-              .Build()) {
-  DependsOn(OptimizationGuideKeyedServiceFactory::GetInstance());
-}
-
-WallpaperSearchServiceFactory::~WallpaperSearchServiceFactory() = default;
-
-std::unique_ptr<KeyedService>
-WallpaperSearchServiceFactory::BuildServiceInstanceForBrowserContext(
-    content::BrowserContext* context) const {
-  return std::make_unique<WallpaperSearchService>(
-      Profile::FromBrowserContext(context));
-}
diff --git a/chrome/browser/search/background/wallpaper_search/wallpaper_search_service_factory.h b/chrome/browser/search/background/wallpaper_search/wallpaper_search_service_factory.h
deleted file mode 100644
index 72ab258c..0000000
--- a/chrome/browser/search/background/wallpaper_search/wallpaper_search_service_factory.h
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2023 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_SEARCH_BACKGROUND_WALLPAPER_SEARCH_WALLPAPER_SEARCH_SERVICE_FACTORY_H_
-#define CHROME_BROWSER_SEARCH_BACKGROUND_WALLPAPER_SEARCH_WALLPAPER_SEARCH_SERVICE_FACTORY_H_
-
-#include "base/no_destructor.h"
-#include "chrome/browser/profiles/profile_keyed_service_factory.h"
-
-class WallpaperSearchService;
-class Profile;
-
-class WallpaperSearchServiceFactory : public ProfileKeyedServiceFactory {
- public:
-  // Returns the WallpaperSearchService for |profile|.
-  //
-  // Returns null if WallpaperSearch is disabled.
-  static WallpaperSearchService* GetForProfile(Profile* profile);
-
-  // Gets the LazyInstance that owns all WallpaperSearchService(s).
-  static WallpaperSearchServiceFactory* GetInstance();
-
-  WallpaperSearchServiceFactory(const WallpaperSearchServiceFactory&) = delete;
-  WallpaperSearchServiceFactory& operator=(
-      const WallpaperSearchServiceFactory&) = delete;
-
- private:
-  friend base::NoDestructor<WallpaperSearchServiceFactory>;
-
-  WallpaperSearchServiceFactory();
-  ~WallpaperSearchServiceFactory() override;
-
-  // BrowserContextKeyedServiceFactory:
-  std::unique_ptr<KeyedService> BuildServiceInstanceForBrowserContext(
-      content::BrowserContext* context) const override;
-};
-
-#endif  // CHROME_BROWSER_SEARCH_BACKGROUND_WALLPAPER_SEARCH_WALLPAPER_SEARCH_SERVICE_FACTORY_H_
diff --git a/chrome/browser/sync/test/integration/single_client_sessions_sync_test.cc b/chrome/browser/sync/test/integration/single_client_sessions_sync_test.cc
index dd2b081..22b0575 100644
--- a/chrome/browser/sync/test/integration/single_client_sessions_sync_test.cc
+++ b/chrome/browser/sync/test/integration/single_client_sessions_sync_test.cc
@@ -271,6 +271,7 @@
   void UpdateCookieJarAccountsAndWait(std::vector<CoreAccountInfo> accounts,
                                       bool expected_cookie_jar_mismatch) {
     signin::AccountsInCookieJarInfo cookies;
+    cookies.accounts_are_fresh = true;
     for (const CoreAccountInfo& account : accounts) {
       cookies.signed_in_accounts.emplace_back();
       cookies.signed_in_accounts.back().id = account.account_id;
diff --git a/chrome/browser/sync/test/integration/two_client_web_apps_bmo_sync_test.cc b/chrome/browser/sync/test/integration/two_client_web_apps_bmo_sync_test.cc
index 96c73734..d79764d1 100644
--- a/chrome/browser/sync/test/integration/two_client_web_apps_bmo_sync_test.cc
+++ b/chrome/browser/sync/test/integration/two_client_web_apps_bmo_sync_test.cc
@@ -125,7 +125,7 @@
     provider->scheduler().FetchManifestAndInstall(
         source,
         browser->tab_strip_model()->GetActiveWebContents()->GetWeakPtr(),
-        base::BindOnce(test::TestAcceptDialogCallback),
+        base::BindOnce(test::TestAcceptInstallDialogCallback),
         base::BindLambdaForTesting([&](const webapps::AppId& new_app_id,
                                        webapps::InstallResultCode code) {
           EXPECT_EQ(code, webapps::InstallResultCode::kSuccessNewInstall);
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index 6d18cbbe..c1c92c5 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -5044,8 +5044,6 @@
       "views/controls/hover_button.h",
       "views/controls/md_text_button_with_down_arrow.cc",
       "views/controls/md_text_button_with_down_arrow.h",
-      "views/controls/obscurable_label_with_toggle_button.cc",
-      "views/controls/obscurable_label_with_toggle_button.h",
       "views/controls/page_switcher_view.cc",
       "views/controls/page_switcher_view.h",
       "views/controls/rich_controls_container_view.cc",
@@ -5995,6 +5993,8 @@
       "views/web_apps/pwa_confirmation_bubble_view.cc",
       "views/web_apps/pwa_confirmation_bubble_view.h",
       "views/web_apps/sub_apps_install_dialog.cc",
+      "views/web_apps/view_visible_in_active_widget_notifier.cc",
+      "views/web_apps/view_visible_in_active_widget_notifier.h",
       "views/web_apps/web_app_detailed_install_dialog.cc",
       "views/web_apps/web_app_detailed_install_dialog.h",
       "views/web_apps/web_app_identity_update_confirmation_view.cc",
diff --git a/chrome/browser/ui/ash/shelf/chrome_shelf_item_factory.cc b/chrome/browser/ui/ash/shelf/chrome_shelf_item_factory.cc
index d7a5f833..ba0584a 100644
--- a/chrome/browser/ui/ash/shelf/chrome_shelf_item_factory.cc
+++ b/chrome/browser/ui/ash/shelf/chrome_shelf_item_factory.cc
@@ -48,12 +48,6 @@
     item->is_promise_app =
         ShelfControllerHelper::IsPromiseApp(profile_, app_id);
     item->package_id = ShelfControllerHelper::GetAppPackageId(profile_, app_id);
-
-    if (item->is_promise_app) {
-      // TODO(b/302408509): Temporary fix for ShelfViews crash that happens only
-      // when a ShelfItem created by sync has kPending/ kInstalling app states.
-      item->app_status = ash::AppStatus::kReady;
-    }
   }
 
   return item;
diff --git a/chrome/browser/ui/chrome_pages.h b/chrome/browser/ui/chrome_pages.h
index 7d3910cd..7e9bb8c 100644
--- a/chrome/browser/ui/chrome_pages.h
+++ b/chrome/browser/ui/chrome_pages.h
@@ -146,25 +146,25 @@
 
 // ShowFeedbackPage() uses |browser| to determine the URL of the current tab.
 // |browser| should be NULL if there are no currently open browser windows.
-void ShowFeedbackPage(
-    const Browser* browser,
-    FeedbackSource source,
-    const std::string& description_template,
-    const std::string& description_placeholder_text,
-    const std::string& category_tag,
-    const std::string& extra_diagnostics,
-    base::Value::Dict autofill_metadata = base::Value::Dict());
+void ShowFeedbackPage(const Browser* browser,
+                      FeedbackSource source,
+                      const std::string& description_template,
+                      const std::string& description_placeholder_text,
+                      const std::string& category_tag,
+                      const std::string& extra_diagnostics,
+                      base::Value::Dict autofill_metadata = base::Value::Dict(),
+                      base::Value::Dict ai_metadata = base::Value::Dict());
 
 // Displays the Feedback ui.
-void ShowFeedbackPage(
-    const GURL& page_url,
-    Profile* profile,
-    FeedbackSource source,
-    const std::string& description_template,
-    const std::string& description_placeholder_text,
-    const std::string& category_tag,
-    const std::string& extra_diagnostics,
-    base::Value::Dict autofill_metadata = base::Value::Dict());
+void ShowFeedbackPage(const GURL& page_url,
+                      Profile* profile,
+                      FeedbackSource source,
+                      const std::string& description_template,
+                      const std::string& description_placeholder_text,
+                      const std::string& category_tag,
+                      const std::string& extra_diagnostics,
+                      base::Value::Dict autofill_metadata = base::Value::Dict(),
+                      base::Value::Dict ai_metadata = base::Value::Dict());
 
 void ShowHelp(Browser* browser, HelpSource source);
 void ShowHelpForProfile(Profile* profile, HelpSource source);
diff --git a/chrome/browser/ui/tab_helpers.cc b/chrome/browser/ui/tab_helpers.cc
index fab9c2c..2cfa049 100644
--- a/chrome/browser/ui/tab_helpers.cc
+++ b/chrome/browser/ui/tab_helpers.cc
@@ -613,7 +613,8 @@
   if (companion::IsCompanionFeatureEnabled()) {
     companion::CompanionTabHelper::CreateForWebContents(web_contents);
   }
-  if (features::IsReadAnythingEnabled()) {
+  if (features::IsReadAnythingEnabled() &&
+      features::IsReadAnythingLocalSidePanelEnabled()) {
     ReadAnythingTabHelper::CreateForWebContents(web_contents);
   }
   if (base::FeatureList::IsEnabled(
diff --git a/chrome/browser/ui/tabs/organization/trigger_policies.cc b/chrome/browser/ui/tabs/organization/trigger_policies.cc
index 666a63d..cc15586 100644
--- a/chrome/browser/ui/tabs/organization/trigger_policies.cc
+++ b/chrome/browser/ui/tabs/organization/trigger_policies.cc
@@ -7,6 +7,7 @@
 #include <cmath>
 #include <numbers>
 
+#include "base/metrics/histogram_functions.h"
 #include "base/time/time.h"
 #include "chrome/browser/metrics/desktop_session_duration/desktop_session_duration_tracker.h"
 #include "chrome/browser/profiles/profile.h"
@@ -100,6 +101,9 @@
   if (current_time > cycle_start_time_ + period) {
     cycle_start_time_ += period;
     best_score = absl::nullopt;
+    base::UmaHistogramBoolean("TabOrganization.Trigger.TriggeredInPeriod",
+                              has_triggered_);
+    has_triggered_ = false;
   }
 
   // Update the best score if we're in the observation phase.
@@ -111,8 +115,9 @@
   }
 
   // Trigger if we haven't triggered yet and have a new high score.
-  if (best_score.has_value() && score > best_score) {
+  if (!has_triggered_ && best_score.has_value() && score > best_score) {
     best_score = absl::nullopt;
+    has_triggered_ = true;
     return true;
   }
 
diff --git a/chrome/browser/ui/tabs/organization/trigger_policies.h b/chrome/browser/ui/tabs/organization/trigger_policies.h
index 0bee0e6..4ef148d4 100644
--- a/chrome/browser/ui/tabs/organization/trigger_policies.h
+++ b/chrome/browser/ui/tabs/organization/trigger_policies.h
@@ -120,6 +120,7 @@
 
   base::TimeTicks cycle_start_time_;
   absl::optional<float> best_score = absl::nullopt;
+  bool has_triggered_ = false;
 };
 
 // Trigger only first time a trigger moment occurs.
diff --git a/chrome/browser/ui/views/autofill/payments/dialog_view_ids.h b/chrome/browser/ui/views/autofill/payments/dialog_view_ids.h
index 9a661dd..5e63b4c0 100644
--- a/chrome/browser/ui/views/autofill/payments/dialog_view_ids.h
+++ b/chrome/browser/ui/views/autofill/payments/dialog_view_ids.h
@@ -47,8 +47,6 @@
   MANAGE_CARDS_BUTTON,  // Typically says [Manage cards]
   MANAGE_IBANS_BUTTON,  // Typically says [Manage payments]
 
-  TOGGLE_IBAN_VALUE_MASKING_BUTTON,  // Used to mask/unmask IBAN value.
-
   // The following are views::Link objects (clickable).
   LEARN_MORE_LINK,
 
@@ -66,7 +64,6 @@
 
   // The following are views::Label objects.
   EXPIRATION_DATE_LABEL,  // Appears during save offer bubble
-  IBAN_VALUE_LABEL,       // Shows or hides during IBAN offer bubble
   NICKNAME_LABEL,         // Appears during manage saved IBAN bubble.
 
   // The following are views::StyledLabel objects.
diff --git a/chrome/browser/ui/views/autofill/payments/iban_bubble_view_uitest.cc b/chrome/browser/ui/views/autofill/payments/iban_bubble_view_uitest.cc
index 09e5a5c..c499e4b7 100644
--- a/chrome/browser/ui/views/autofill/payments/iban_bubble_view_uitest.cc
+++ b/chrome/browser/ui/views/autofill/payments/iban_bubble_view_uitest.cc
@@ -240,25 +240,6 @@
     CHECK(!GetSaveIbanBubbleView());
   }
 
-  void ClickOnIbanValueToggleButton() {
-    ClickOnDialogView(
-        FindViewInBubbleById(DialogViewId::TOGGLE_IBAN_VALUE_MASKING_BUTTON));
-  }
-
-  std::u16string GetDisplayedIbanValue() {
-    AutofillBubbleBase* iban_bubble_views = GetIbanBubbleView();
-    CHECK(iban_bubble_views);
-    views::Label* iban_value = static_cast<views::Label*>(
-        FindViewInBubbleById(DialogViewId::IBAN_VALUE_LABEL));
-    CHECK(iban_value);
-    std::u16string iban_value_label = iban_value->GetText();
-    // To simplify the expectations in tests, replaces the returned IBAN value
-    // ellipsis ('\u2006') with a whitespace and oneDot ('\u2022') with '*'.
-    base::ReplaceChars(iban_value_label, u"\u2022", u"*", &iban_value_label);
-    base::ReplaceChars(iban_value_label, u"\u2006", u" ", &iban_value_label);
-    return iban_value_label;
-  }
-
   SaveIbanBubbleView* GetSaveIbanBubbleView() {
     AutofillBubbleBase* iban_bubble_view = GetIbanBubbleView();
     if (!iban_bubble_view) {
@@ -567,28 +548,6 @@
       autofill_metrics::SaveIbanBubbleResult::kClosed, 1);
 }
 
-// Tests the local save bubble. Ensures that clicking the eye icon button
-// successfully causes the IBAN value to be hidden or shown.
-IN_PROC_BROWSER_TEST_F(IbanBubbleViewFullFormBrowserTest,
-                       Local_ClickingHideOrShowIbanValueEyeIcon) {
-  FillForm(kIbanValue);
-  SubmitFormAndWaitForIbanLocalSaveBubble();
-
-  ResetEventWaiterForSequence({DialogEvent::ACCEPT_SAVE_IBAN_COMPLETE});
-
-  ClickOnIbanValueToggleButton();
-  EXPECT_EQ(GetDisplayedIbanValue(), u"DE91 1000 0000 0123 4567 89");
-
-  ClickOnIbanValueToggleButton();
-  EXPECT_EQ(GetDisplayedIbanValue(), u"DE91 **** **** **** **67 89");
-
-  ClickOnIbanValueToggleButton();
-  EXPECT_EQ(GetDisplayedIbanValue(), u"DE91 1000 0000 0123 4567 89");
-
-  ClickOnIbanValueToggleButton();
-  EXPECT_EQ(GetDisplayedIbanValue(), u"DE91 **** **** **** **67 89");
-}
-
 // Tests the local save bubble. Ensures that clicking the omnibox icon opens
 // manage saved IBAN bubble with IBAN nickname.
 IN_PROC_BROWSER_TEST_F(IbanBubbleViewFullFormBrowserTest,
@@ -636,35 +595,4 @@
   ASSERT_EQ(GetBubbleType(), IbanBubbleType::kManageSavedIban);
 }
 
-// Tests the manage saved bubble. Ensures that clicking the eye icon button
-// successfully causes the IBAN value to be masked or unmasked.
-IN_PROC_BROWSER_TEST_F(IbanBubbleViewFullFormBrowserTest,
-                       Local_ClickingHideOrShowIbanValueManageView) {
-  FillForm(kIbanValue);
-  SubmitFormAndWaitForIbanLocalSaveBubble();
-
-  ResetEventWaiterForSequence({DialogEvent::ACCEPT_SAVE_IBAN_COMPLETE});
-  ClickOnSaveButton();
-  ASSERT_TRUE(WaitForObservedEvent());
-
-  // Open up manage IBANs bubble.
-  ResetEventWaiterForSequence({DialogEvent::BUBBLE_SHOWN});
-  ClickOnView(GetSaveIbanIconView());
-  ASSERT_TRUE(WaitForObservedEvent());
-
-  // Verify the bubble type is manage saved IBAN.
-  ASSERT_EQ(GetBubbleType(), IbanBubbleType::kManageSavedIban);
-  ClickOnIbanValueToggleButton();
-  EXPECT_EQ(GetDisplayedIbanValue(), u"DE91 1000 0000 0123 4567 89");
-
-  ClickOnIbanValueToggleButton();
-  EXPECT_EQ(GetDisplayedIbanValue(), u"DE91 **** **** **** **67 89");
-
-  ClickOnIbanValueToggleButton();
-  EXPECT_EQ(GetDisplayedIbanValue(), u"DE91 1000 0000 0123 4567 89");
-
-  ClickOnIbanValueToggleButton();
-  EXPECT_EQ(GetDisplayedIbanValue(), u"DE91 **** **** **** **67 89");
-}
-
 }  // namespace autofill
diff --git a/chrome/browser/ui/views/autofill/payments/manage_saved_iban_bubble_view.cc b/chrome/browser/ui/views/autofill/payments/manage_saved_iban_bubble_view.cc
index c204f6d..5f50aec 100644
--- a/chrome/browser/ui/views/autofill/payments/manage_saved_iban_bubble_view.cc
+++ b/chrome/browser/ui/views/autofill/payments/manage_saved_iban_bubble_view.cc
@@ -88,11 +88,6 @@
   if (nickname_label_) {
     nickname_label_->SetID(DialogViewId::NICKNAME_LABEL);
   }
-
-  DCHECK(iban_value_and_toggle_);
-  iban_value_and_toggle_->value()->SetID(DialogViewId::IBAN_VALUE_LABEL);
-  iban_value_and_toggle_->toggle_obscured()->SetID(
-      DialogViewId::TOGGLE_IBAN_VALUE_MASKING_BUTTON);
 }
 
 void ManageSavedIbanBubbleView::Init() {
@@ -126,14 +121,17 @@
       l10n_util::GetStringUTF16(IDS_AUTOFILL_SAVE_IBAN_LABEL),
       views::style::CONTEXT_DIALOG_BODY_TEXT, views::style::STYLE_PRIMARY));
 
-  iban_value_and_toggle_ =
-      AddChildView(std::make_unique<ObscurableLabelWithToggleButton>(
-          controller_->GetIban().GetIdentifierStringForAutofillDisplay(
-              /*is_value_masked=*/true),
-          controller_->GetIban().GetIdentifierStringForAutofillDisplay(
-              /*is_value_masked=*/false),
-          l10n_util::GetStringUTF16(IDS_MANAGE_IBAN_VALUE_SHOW_VALUE),
-          l10n_util::GetStringUTF16(IDS_MANAGE_IBAN_VALUE_HIDE_VALUE)));
+  views::Label* iban_value = AddChildView(std::make_unique<views::Label>(
+      controller_->GetIban().GetIdentifierStringForAutofillDisplay(
+          /*is_value_masked=*/false),
+      views::style::CONTEXT_LABEL, views::style::STYLE_SECONDARY));
+
+  iban_value->SetProperty(
+      views::kFlexBehaviorKey,
+      views::FlexSpecification(views::MinimumFlexSizeRule::kPreferred,
+                               views::MaximumFlexSizeRule::kScaleToMaximum));
+  iban_value->SetHorizontalAlignment(gfx::ALIGN_LEFT);
+  iban_value->SetMultiLine(true);
 
   // Nickname label row will be added if a nickname was saved in the IBAN save
   // bubble, which is displayed previously in the flow.
diff --git a/chrome/browser/ui/views/autofill/payments/manage_saved_iban_bubble_view.h b/chrome/browser/ui/views/autofill/payments/manage_saved_iban_bubble_view.h
index fa753cb..4a57fa4 100644
--- a/chrome/browser/ui/views/autofill/payments/manage_saved_iban_bubble_view.h
+++ b/chrome/browser/ui/views/autofill/payments/manage_saved_iban_bubble_view.h
@@ -8,9 +8,7 @@
 #include "base/memory/raw_ptr.h"
 #include "chrome/browser/ui/autofill/autofill_bubble_base.h"
 #include "chrome/browser/ui/autofill/payments/iban_bubble_controller.h"
-#include "chrome/browser/ui/views/controls/obscurable_label_with_toggle_button.h"
 #include "chrome/browser/ui/views/location_bar/location_bar_bubble_delegate_view.h"
-#include "ui/views/controls/button/image_button.h"
 
 namespace autofill {
 
@@ -56,10 +54,6 @@
   // saving the IBAN in the IBAN save bubble.
   raw_ptr<views::Label> nickname_label_ = nullptr;
 
-  // The view that toggles the masking/unmasking of the IBAN value displayed in
-  // the bubble.
-  raw_ptr<ObscurableLabelWithToggleButton> iban_value_and_toggle_;
-
   raw_ptr<IbanBubbleController> controller_;
 };
 
diff --git a/chrome/browser/ui/views/autofill/payments/save_card_offer_bubble_views.cc b/chrome/browser/ui/views/autofill/payments/save_card_offer_bubble_views.cc
index 212c801d..b4db7fd 100644
--- a/chrome/browser/ui/views/autofill/payments/save_card_offer_bubble_views.cc
+++ b/chrome/browser/ui/views/autofill/payments/save_card_offer_bubble_views.cc
@@ -282,7 +282,9 @@
                           base::Unretained(this));
 
   if (base::FeatureList::IsEnabled(
-          features::kAutofillEnableNewSaveCardBubbleUi)) {
+          features::kAutofillEnableNewSaveCardBubbleUi) ||
+      base::FeatureList::IsEnabled(
+          features::kAutofillEnableUserAvatarInSaveCardFooter)) {
     return (std::make_unique<LegalMessageView>(
         message_lines, base::UTF8ToUTF16(controller()->GetAccountInfo().email),
         GetProfileAvatar(controller()->GetAccountInfo()),
diff --git a/chrome/browser/ui/views/autofill/payments/save_iban_bubble_view.cc b/chrome/browser/ui/views/autofill/payments/save_iban_bubble_view.cc
index f57603a2..6667135 100644
--- a/chrome/browser/ui/views/autofill/payments/save_iban_bubble_view.cc
+++ b/chrome/browser/ui/views/autofill/payments/save_iban_bubble_view.cc
@@ -162,14 +162,18 @@
       l10n_util::GetStringUTF16(IDS_AUTOFILL_SAVE_IBAN_LABEL),
       views::style::CONTEXT_DIALOG_BODY_TEXT, views::style::STYLE_PRIMARY));
 
-  iban_value_and_toggle_ = iban_content->AddChildView(
-      std::make_unique<ObscurableLabelWithToggleButton>(
-          controller_->GetIban().GetIdentifierStringForAutofillDisplay(
-              /*is_value_masked=*/true),
+  views::Label* iban_value =
+      iban_content->AddChildView(std::make_unique<views::Label>(
           controller_->GetIban().GetIdentifierStringForAutofillDisplay(
               /*is_value_masked=*/false),
-          l10n_util::GetStringUTF16(IDS_MANAGE_IBAN_VALUE_SHOW_VALUE),
-          l10n_util::GetStringUTF16(IDS_MANAGE_IBAN_VALUE_HIDE_VALUE)));
+          views::style::CONTEXT_LABEL, views::style::STYLE_SECONDARY));
+
+  iban_value->SetProperty(
+      views::kFlexBehaviorKey,
+      views::FlexSpecification(views::MinimumFlexSizeRule::kPreferred,
+                               views::MaximumFlexSizeRule::kScaleToMaximum));
+  iban_value->SetHorizontalAlignment(gfx::ALIGN_LEFT);
+  iban_value->SetMultiLine(true);
 
   iban_content->AddChildView(std::make_unique<views::Label>(
       l10n_util::GetStringUTF16(IDS_AUTOFILL_SAVE_IBAN_PROMPT_NICKNAME),
@@ -231,11 +235,6 @@
     cancel_button->SetID(DialogViewId::CANCEL_BUTTON);
   }
 
-  DCHECK(iban_value_and_toggle_);
-  iban_value_and_toggle_->value()->SetID(DialogViewId::IBAN_VALUE_LABEL);
-  iban_value_and_toggle_->toggle_obscured()->SetID(
-      DialogViewId::TOGGLE_IBAN_VALUE_MASKING_BUTTON);
-
   if (nickname_textfield_) {
     nickname_textfield_->SetID(DialogViewId::NICKNAME_TEXTFIELD);
   }
diff --git a/chrome/browser/ui/views/autofill/payments/save_iban_bubble_view.h b/chrome/browser/ui/views/autofill/payments/save_iban_bubble_view.h
index 24704b7..40685cb 100644
--- a/chrome/browser/ui/views/autofill/payments/save_iban_bubble_view.h
+++ b/chrome/browser/ui/views/autofill/payments/save_iban_bubble_view.h
@@ -9,9 +9,7 @@
 #include "chrome/browser/ui/autofill/autofill_bubble_base.h"
 #include "chrome/browser/ui/autofill/payments/iban_bubble_controller.h"
 #include "chrome/browser/ui/views/autofill/payments/payments_view_util.h"
-#include "chrome/browser/ui/views/controls/obscurable_label_with_toggle_button.h"
 #include "chrome/browser/ui/views/location_bar/location_bar_bubble_delegate_view.h"
-#include "ui/views/controls/button/image_button.h"
 #include "ui/views/controls/textfield/textfield.h"
 #include "ui/views/controls/textfield/textfield_controller.h"
 
@@ -80,10 +78,6 @@
   raw_ptr<views::Textfield> nickname_textfield_ = nullptr;
   raw_ptr<views::Label> nickname_length_label_ = nullptr;
 
-  // The view that toggles the masking/unmasking of the IBAN value displayed in
-  // the bubble.
-  raw_ptr<ObscurableLabelWithToggleButton> iban_value_and_toggle_;
-
   raw_ptr<IbanBubbleController> controller_;
 };
 
diff --git a/chrome/browser/ui/views/controls/obscurable_label_with_toggle_button.cc b/chrome/browser/ui/views/controls/obscurable_label_with_toggle_button.cc
deleted file mode 100644
index 188ba40d..0000000
--- a/chrome/browser/ui/views/controls/obscurable_label_with_toggle_button.cc
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright 2023 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/ui/views/controls/obscurable_label_with_toggle_button.h"
-
-#include "ui/base/metadata/metadata_impl_macros.h"
-#include "ui/color/color_id.h"
-#include "ui/views/controls/button/image_button.h"
-#include "ui/views/controls/button/image_button_factory.h"
-#include "ui/views/controls/label.h"
-#include "ui/views/layout/flex_layout_types.h"
-#include "ui/views/layout/layout_provider.h"
-#include "ui/views/style/typography.h"
-#include "ui/views/vector_icons.h"
-#include "ui/views/view_class_properties.h"
-
-ObscurableLabelWithToggleButton::ObscurableLabelWithToggleButton(
-    const std::u16string& obscured_value,
-    const std::u16string& revealed_value,
-    const std::u16string& toggle_button_tooltip,
-    const std::u16string& toggle_button_toggled_tooltip)
-    : obscured_value_(obscured_value), revealed_value_(revealed_value) {
-  views::LayoutProvider* provider = views::LayoutProvider::Get();
-  SetBetweenChildSpacing(
-      provider->GetDistanceMetric(views::DISTANCE_RELATED_CONTROL_HORIZONTAL));
-  value_ = AddChildView(std::make_unique<views::Label>(
-      obscured_value, views::style::CONTEXT_DIALOG_BODY_TEXT,
-      views::style::STYLE_PRIMARY));
-  value_->SetProperty(
-      views::kFlexBehaviorKey,
-      views::FlexSpecification(views::MinimumFlexSizeRule::kPreferred,
-                               views::MaximumFlexSizeRule::kScaleToMaximum));
-  value_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
-  value_->SetMultiLine(true);
-
-  toggle_obscured_ = AddChildView(std::make_unique<views::ToggleImageButton>(
-      base::BindRepeating(&ObscurableLabelWithToggleButton::ToggleValueObscured,
-                          base::Unretained(this))));
-  toggle_obscured_->SetImageHorizontalAlignment(
-      views::ImageButton::ALIGN_CENTER);
-  toggle_obscured_->SetImageVerticalAlignment(views::ImageButton::ALIGN_MIDDLE);
-  toggle_obscured_->SetToggled(false);
-  views::SetImageFromVectorIconWithColorId(toggle_obscured_, views::kEyeIcon,
-                                           ui::kColorIcon,
-                                           ui::kColorIconDisabled);
-  views::SetToggledImageFromVectorIconWithColorId(
-      toggle_obscured_, views::kEyeCrossedIcon, ui::kColorIcon,
-      ui::kColorIconDisabled);
-  toggle_obscured_->SetTooltipText(toggle_button_tooltip);
-  toggle_obscured_->SetToggledTooltipText(toggle_button_toggled_tooltip);
-}
-
-ObscurableLabelWithToggleButton::~ObscurableLabelWithToggleButton() = default;
-
-views::Label* ObscurableLabelWithToggleButton::value() {
-  return value_;
-}
-
-views::ToggleImageButton* ObscurableLabelWithToggleButton::toggle_obscured() {
-  return toggle_obscured_;
-}
-
-void ObscurableLabelWithToggleButton::ToggleValueObscured() {
-  const bool was_revealed = toggle_obscured_->GetToggled();
-  toggle_obscured_->SetToggled(!was_revealed);
-  value_->SetText(was_revealed ? obscured_value_ : revealed_value_);
-}
-
-BEGIN_METADATA(ObscurableLabelWithToggleButton, views::BoxLayoutView)
-END_METADATA
diff --git a/chrome/browser/ui/views/controls/obscurable_label_with_toggle_button.h b/chrome/browser/ui/views/controls/obscurable_label_with_toggle_button.h
deleted file mode 100644
index 7e4ea4d..0000000
--- a/chrome/browser/ui/views/controls/obscurable_label_with_toggle_button.h
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2023 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_UI_VIEWS_CONTROLS_OBSCURABLE_LABEL_WITH_TOGGLE_BUTTON_H_
-#define CHROME_BROWSER_UI_VIEWS_CONTROLS_OBSCURABLE_LABEL_WITH_TOGGLE_BUTTON_H_
-
-#include <string>
-
-#include "base/memory/raw_ptr.h"
-#include "ui/views/layout/box_layout_view.h"
-
-namespace views {
-class Label;
-class ToggleImageButton;
-}  // namespace views
-
-// Creates a view with label and eye icon button that displays the obscured or
-// unobscured label on clicking.
-class ObscurableLabelWithToggleButton : public views::BoxLayoutView {
- public:
-  METADATA_HEADER(ObscurableLabelWithToggleButton);
-  ObscurableLabelWithToggleButton(
-      const std::u16string& obscured_value,
-      const std::u16string& revealed_value,
-      const std::u16string& toggle_button_tooltip,
-      const std::u16string& toggle_button_toggled_tooltip);
-  ObscurableLabelWithToggleButton(const ObscurableLabelWithToggleButton&) =
-      delete;
-  ObscurableLabelWithToggleButton& operator=(
-      const ObscurableLabelWithToggleButton&) = delete;
-  ~ObscurableLabelWithToggleButton() override;
-
-  views::Label* value();
-  views::ToggleImageButton* toggle_obscured();
-
- private:
-  // Toggles between the obscured and revealed values.
-  void ToggleValueObscured();
-
-  const std::u16string obscured_value_;
-  const std::u16string revealed_value_;
-
-  raw_ptr<views::Label> value_ = nullptr;
-  // The button that toggles whether the value is obscured.
-  raw_ptr<views::ToggleImageButton> toggle_obscured_ = nullptr;
-};
-
-#endif  // CHROME_BROWSER_UI_VIEWS_CONTROLS_OBSCURABLE_LABEL_WITH_TOGGLE_BUTTON_H_
diff --git a/chrome/browser/ui/views/side_panel/read_anything/read_anything_coordinator.cc b/chrome/browser/ui/views/side_panel/read_anything/read_anything_coordinator.cc
index 8cc8a8ba..8aa8246 100644
--- a/chrome/browser/ui/views/side_panel/read_anything/read_anything_coordinator.cc
+++ b/chrome/browser/ui/views/side_panel/read_anything/read_anything_coordinator.cc
@@ -22,7 +22,6 @@
 #include "chrome/browser/ui/views/frame/browser_view.h"
 #include "chrome/browser/ui/views/side_panel/read_anything/read_anything_container_view.h"
 #include "chrome/browser/ui/views/side_panel/read_anything/read_anything_controller.h"
-#include "chrome/browser/ui/views/side_panel/read_anything/read_anything_side_panel_controller.h"
 #include "chrome/browser/ui/views/side_panel/read_anything/read_anything_toolbar_view.h"
 #include "chrome/browser/ui/views/side_panel/side_panel_coordinator.h"
 #include "chrome/browser/ui/views/side_panel/side_panel_entry.h"
@@ -78,7 +77,9 @@
 
   browser->tab_strip_model()->AddObserver(this);
   Observe(GetActiveWebContents());
-  CreateAndRegisterEntriesForExistingWebContents(browser->tab_strip_model());
+  if (features::IsReadAnythingLocalSidePanelEnabled()) {
+    CreateAndRegisterEntriesForExistingWebContents(browser->tab_strip_model());
+  }
 
   if (features::IsDataCollectionModeForScreen2xEnabled()) {
     BrowserList::GetInstance()->AddObserver(this);
@@ -148,10 +149,32 @@
     return;
   }
 
+  // Deregisters the Read Anything side panel if it is not local. When a side
+  // panel entry is global, it has the same lifetime as the browser.
+  if (!features::IsReadAnythingLocalSidePanelEnabled()) {
+    SidePanelRegistry* global_registry =
+        SidePanelCoordinator::GetGlobalSidePanelRegistry(browser);
+    global_registry->Deregister(
+        SidePanelEntry::Key(SidePanelEntry::Id::kReadAnything));
+  }
+
   browser->tab_strip_model()->RemoveObserver(this);
   Observe(nullptr);
 }
 
+void ReadAnythingCoordinator::CreateAndRegisterEntry(
+    SidePanelRegistry* global_registry) {
+  auto side_panel_entry = std::make_unique<SidePanelEntry>(
+      SidePanelEntry::Id::kReadAnything,
+      l10n_util::GetStringUTF16(IDS_READING_MODE_TITLE),
+      ui::ImageModel::FromVectorIcon(kMenuBookChromeRefreshIcon,
+                                     ui::kColorIcon),
+      base::BindRepeating(&ReadAnythingCoordinator::CreateContainerView,
+                          base::Unretained(this)));
+  side_panel_entry->AddObserver(this);
+  global_registry->Register(std::move(side_panel_entry));
+}
+
 void ReadAnythingCoordinator::CreateAndRegisterEntriesForExistingWebContents(
     TabStripModel* tab_strip_model) {
   for (int index = 0; index < tab_strip_model->GetTabCount(); ++index) {
@@ -201,6 +224,16 @@
   model_->RemoveObserver(observer);
 }
 
+void ReadAnythingCoordinator::OnEntryShown(SidePanelEntry* entry) {
+  DCHECK(entry->key().id() == SidePanelEntry::Id::kReadAnything);
+  OnReadAnythingSidePanelEntryShown();
+}
+
+void ReadAnythingCoordinator::OnEntryHidden(SidePanelEntry* entry) {
+  DCHECK(entry->key().id() == SidePanelEntry::Id::kReadAnything);
+  OnReadAnythingSidePanelEntryHidden();
+}
+
 void ReadAnythingCoordinator::OnReadAnythingSidePanelEntryShown() {
   for (Observer& obs : observers_) {
     obs.Activate(true);
@@ -213,6 +246,40 @@
   }
 }
 
+std::unique_ptr<views::View> ReadAnythingCoordinator::CreateContainerView() {
+  Browser* browser = &GetBrowser();
+  auto web_view =
+      std::make_unique<SidePanelWebUIViewT<ReadAnythingUntrustedUI>>(
+          /* on_show_cb= */ base::RepeatingClosure(),
+          /* close_cb= */ base::RepeatingClosure(),
+          /* contents_wrapper= */
+          std::make_unique<BubbleContentsWrapperT<ReadAnythingUntrustedUI>>(
+              /* webui_url= */ GURL(
+                  chrome::kChromeUIUntrustedReadAnythingSidePanelURL),
+              /* browser_context= */ browser->profile(),
+              /* task_manager_string_id= */ IDS_READING_MODE_TITLE,
+              /* webui_resizes_host= */ false,
+              /* esc_closes_ui= */ false));
+
+  if (features::IsReadAnythingWebUIToolbarEnabled()) {
+    return std::move(web_view);
+  }
+
+  // Create the views.
+  auto toolbar = std::make_unique<ReadAnythingToolbarView>(
+      this,
+      /* ReadAnythingToolbarView::Delegate* = */ controller_.get(),
+      /* ReadAnythingFontCombobox::Delegate* = */ controller_.get());
+
+  // Create the component.
+  // Note that a coordinator would normally maintain ownership of these objects,
+  // but objects extending {ui/views/view.h} prefer ownership over raw pointers.
+  auto container_view = std::make_unique<ReadAnythingContainerView>(
+      this, std::move(toolbar), std::move(web_view));
+
+  return std::move(container_view);
+}
+
 void ReadAnythingCoordinator::StartPageChangeDelay() {
   // Reset the delay status.
   post_tab_change_delay_complete_ = false;
@@ -237,15 +304,19 @@
     TabStripModel* tab_strip_model,
     const TabStripModelChange& change,
     const TabStripSelectionChange& selection) {
-  if (change.type() == TabStripModelChange::Type::kInserted) {
-    for (const auto& inserted_tab : change.GetInsert()->contents) {
-      CreateAndRegisterEntryForWebContents(inserted_tab.contents);
+  // If the Read Anything side panel is local, creates and registers a side
+  // panel entry for each tab.
+  if (features::IsReadAnythingLocalSidePanelEnabled()) {
+    if (change.type() == TabStripModelChange::Type::kInserted) {
+      for (const auto& inserted_tab : change.GetInsert()->contents) {
+        CreateAndRegisterEntryForWebContents(inserted_tab.contents);
+      }
     }
-  }
-  if (change.type() == TabStripModelChange::Type::kReplaced) {
-    content::WebContents* new_contents = change.GetReplace()->new_contents;
-    if (new_contents) {
-      CreateAndRegisterEntryForWebContents(new_contents);
+    if (change.type() == TabStripModelChange::Type::kReplaced) {
+      content::WebContents* new_contents = change.GetReplace()->new_contents;
+      if (new_contents) {
+        CreateAndRegisterEntryForWebContents(new_contents);
+      }
     }
   }
   if (!selection.active_tab_changed()) {
diff --git a/chrome/browser/ui/views/side_panel/read_anything/read_anything_coordinator.h b/chrome/browser/ui/views/side_panel/read_anything/read_anything_coordinator.h
index 6daf49ab..e0151675 100644
--- a/chrome/browser/ui/views/side_panel/read_anything/read_anything_coordinator.h
+++ b/chrome/browser/ui/views/side_panel/read_anything/read_anything_coordinator.h
@@ -20,6 +20,10 @@
 
 class Browser;
 class ReadAnythingController;
+class SidePanelRegistry;
+namespace views {
+class View;
+}  // namespace views
 
 ///////////////////////////////////////////////////////////////////////////////
 // ReadAnythingCoordinator
@@ -33,6 +37,7 @@
 //  This class has the same lifetime as the browser.
 //
 class ReadAnythingCoordinator : public BrowserUserData<ReadAnythingCoordinator>,
+                                public SidePanelEntryObserver,
                                 public TabStripModelObserver,
                                 public content::WebContentsObserver,
                                 public BrowserListObserver {
@@ -45,6 +50,7 @@
     virtual void SetDefaultLanguageCode(const std::string& code) {}
   };
 
+  void CreateAndRegisterEntry(SidePanelRegistry* global_registry);
   explicit ReadAnythingCoordinator(Browser* browser);
   ~ReadAnythingCoordinator() override;
 
@@ -78,6 +84,14 @@
   // Occurs when the timer set when changing tabs is finished.
   void OnTabChangeDelayComplete();
 
+  // SidePanelEntryObserver:
+  void OnEntryShown(SidePanelEntry* entry) override;
+  void OnEntryHidden(SidePanelEntry* entry) override;
+
+  // Callback passed to SidePanelCoordinator. This function creates the
+  // container view and all its child views and returns it.
+  std::unique_ptr<views::View> CreateContainerView();
+
   // TabStripModelObserver:
   void OnTabStripModelChanged(
       TabStripModel* tab_strip_model,
diff --git a/chrome/browser/ui/views/side_panel/read_anything/read_anything_coordinator_unittest.cc b/chrome/browser/ui/views/side_panel/read_anything/read_anything_coordinator_unittest.cc
index d249fe1f..ae017df 100644
--- a/chrome/browser/ui/views/side_panel/read_anything/read_anything_coordinator_unittest.cc
+++ b/chrome/browser/ui/views/side_panel/read_anything/read_anything_coordinator_unittest.cc
@@ -34,7 +34,8 @@
  public:
   void SetUp() override {
     base::test::ScopedFeatureList features;
-    scoped_feature_list_.InitWithFeatures({features::kReadAnything}, {});
+    scoped_feature_list_.InitWithFeatures(
+        {features::kReadAnything, features::kReadAnythingLocalSidePanel}, {});
     TestWithBrowserView::SetUp();
 
     side_panel_coordinator_ =
@@ -88,6 +89,9 @@
   void RemoveObserver(ReadAnythingCoordinator::Observer* observer) {
     read_anything_coordinator_->RemoveObserver(observer);
   }
+  std::unique_ptr<views::View> CreateContainerView() {
+    return read_anything_coordinator_->CreateContainerView();
+  }
 
   void OnBrowserSetLastActive(Browser* browser) {
     read_anything_coordinator_->OnBrowserSetLastActive(browser);
@@ -142,6 +146,12 @@
   EXPECT_NE(nullptr, GetController());
 }
 
+TEST_F(ReadAnythingCoordinatorTest, ContainerViewsAreUnique) {
+  auto view1 = CreateContainerView();
+  auto view2 = CreateContainerView();
+  EXPECT_NE(view1, view2);
+}
+
 TEST_F(ReadAnythingCoordinatorTest, OnCoordinatorDestroyedCalled) {
   AddObserver(&coordinator_observer_);
   EXPECT_CALL(coordinator_observer_, OnCoordinatorDestroyed()).Times(1);
diff --git a/chrome/browser/ui/views/side_panel/read_anything/read_anything_toolbar_view_browsertest.cc b/chrome/browser/ui/views/side_panel/read_anything/read_anything_toolbar_view_browsertest.cc
index f18ec07..98a6e9c 100644
--- a/chrome/browser/ui/views/side_panel/read_anything/read_anything_toolbar_view_browsertest.cc
+++ b/chrome/browser/ui/views/side_panel/read_anything/read_anything_toolbar_view_browsertest.cc
@@ -4,7 +4,6 @@
 
 #include "chrome/browser/ui/views/side_panel/read_anything/read_anything_toolbar_view.h"
 
-#include "chrome/browser/ui/side_panel/read_anything/read_anything_tab_helper.h"
 #include "chrome/browser/ui/ui_features.h"
 #include "chrome/browser/ui/views/side_panel/read_anything/read_anything_coordinator.h"
 #include "chrome/common/accessibility/read_anything_constants.h"
@@ -43,6 +42,9 @@
   explicit MockReadAnythingCoordinator(Browser* browser)
       : ReadAnythingCoordinator(browser) {}
 
+  MOCK_METHOD(void,
+              CreateAndRegisterEntry,
+              (SidePanelRegistry * global_registry));
   MOCK_METHOD(ReadAnythingController*, GetController, ());
   MOCK_METHOD(ReadAnythingModel*, GetModel, ());
   MOCK_METHOD(void,
@@ -57,12 +59,6 @@
  public:
   // InProcessBrowserTest:
   void SetUpOnMainThread() override {
-    TabStripModel* tab_strip_model = browser()->tab_strip_model();
-    for (int index = 0; index < tab_strip_model->GetTabCount(); index++) {
-      ReadAnythingTabHelper::CreateForWebContents(
-          tab_strip_model->GetWebContentsAt(index));
-    }
-
     coordinator_ = std::make_unique<MockReadAnythingCoordinator>(browser());
 
     toolbar_view_ = std::make_unique<ReadAnythingToolbarView>(
diff --git a/chrome/browser/ui/views/side_panel/side_panel_util.cc b/chrome/browser/ui/views/side_panel/side_panel_util.cc
index 9c562105..fd94f43 100644
--- a/chrome/browser/ui/views/side_panel/side_panel_util.cc
+++ b/chrome/browser/ui/views/side_panel/side_panel_util.cc
@@ -77,7 +77,13 @@
 
   // Add read anything.
   if (features::IsReadAnythingEnabled()) {
-    ReadAnythingCoordinator::GetOrCreateForBrowser(browser);
+    auto* read_anything_coordinator =
+        ReadAnythingCoordinator::GetOrCreateForBrowser(browser);
+    // If the local side panel is not enabled, create and register a global side
+    // panel entry for Reading Anything.
+    if (!features::IsReadAnythingLocalSidePanelEnabled()) {
+      read_anything_coordinator->CreateAndRegisterEntry(global_registry);
+    }
   }
 
   // Create Search Companion coordinator.
diff --git a/chrome/browser/ui/views/tabs/tab_search_container.cc b/chrome/browser/ui/views/tabs/tab_search_container.cc
index efb7c9f..001d40d 100644
--- a/chrome/browser/ui/views/tabs/tab_search_container.cc
+++ b/chrome/browser/ui/views/tabs/tab_search_container.cc
@@ -18,6 +18,17 @@
 
 namespace {
 
+// These values are persisted to logs. Entries should not be renumbered and
+// numeric values should never be reused.
+enum class TriggerOutcome {
+  kAccepted = 0,
+  kDismissed = 1,
+  kTimedOut = 2,
+  kMaxValue = kTimedOut,
+};
+
+constexpr char kTriggerOutcomeName[] = "TabOrganization.Trigger.Outcome";
+
 Edge GetFlatEdge(bool is_search_button, bool before_tab_strip) {
   const bool is_rtl = base::i18n::IsRTL();
   if ((!is_search_button && before_tab_strip) ||
@@ -120,6 +131,7 @@
 }
 
 void TabSearchContainer::OnOrganizeButtonClicked() {
+  base::UmaHistogramEnumeration(kTriggerOutcomeName, TriggerOutcome::kAccepted);
   tab_organization_service_->OnActionUIAccepted(browser_);
 
   // Force hide the button when pressed, bypassing locked expansion mode.
@@ -127,12 +139,22 @@
 }
 
 void TabSearchContainer::OnOrganizeButtonDismissed() {
+  base::UmaHistogramEnumeration(kTriggerOutcomeName,
+                                TriggerOutcome::kDismissed);
   tab_organization_service_->OnActionUIDismissed(browser_);
 
   // Force hide the button when pressed, bypassing locked expansion mode.
   ExecuteHideTabOrganization();
 }
 
+void TabSearchContainer::OnOrganizeButtonTimeout() {
+  base::UmaHistogramEnumeration(kTriggerOutcomeName, TriggerOutcome::kTimedOut);
+
+  // Hide the button if not pressed. Use locked expansion mode to avoid
+  // disrupting the user.
+  HideTabOrganization();
+}
+
 void TabSearchContainer::SetLockedExpansionMode(LockedExpansionMode mode) {
   if (mode == LockedExpansionMode::kNone) {
     if (locked_expansion_mode_ == LockedExpansionMode::kWillShow) {
@@ -150,8 +172,8 @@
   expansion_animation_.Show();
 
   const base::TimeDelta delta = base::Seconds(16);
-  hide_tab_organization_timer_.Start(FROM_HERE, delta, this,
-                                     &TabSearchContainer::HideTabOrganization);
+  hide_tab_organization_timer_.Start(
+      FROM_HERE, delta, this, &TabSearchContainer::OnOrganizeButtonTimeout);
 }
 
 void TabSearchContainer::ExecuteHideTabOrganization() {
diff --git a/chrome/browser/ui/views/tabs/tab_search_container.h b/chrome/browser/ui/views/tabs/tab_search_container.h
index 716837576..069394c 100644
--- a/chrome/browser/ui/views/tabs/tab_search_container.h
+++ b/chrome/browser/ui/views/tabs/tab_search_container.h
@@ -59,6 +59,7 @@
 
   void OnOrganizeButtonClicked();
   void OnOrganizeButtonDismissed();
+  void OnOrganizeButtonTimeout();
 
   // views::MouseWatcherListener:
   void MouseMovedOutOfHost() override;
diff --git a/chrome/browser/ui/views/tabs/tab_search_container_browsertest.cc b/chrome/browser/ui/views/tabs/tab_search_container_browsertest.cc
index a8d6f87f..0b574bb 100644
--- a/chrome/browser/ui/views/tabs/tab_search_container_browsertest.cc
+++ b/chrome/browser/ui/views/tabs/tab_search_container_browsertest.cc
@@ -93,3 +93,45 @@
   ASSERT_TRUE(
       tab_search_container()->expansion_animation_for_testing()->IsClosing());
 }
+
+IN_PROC_BROWSER_TEST_F(TabSearchContainerBrowserTest,
+                       ImmediatelyHidesWhenOrganizeButtonClicked) {
+  tab_search_container()->expansion_animation_for_testing()->Reset(1);
+  tab_search_container()->SetLockedExpansionModeForTesting(
+      LockedExpansionMode::kWillHide);
+
+  tab_search_container()->OnOrganizeButtonClicked();
+
+  EXPECT_TRUE(
+      tab_search_container()->expansion_animation_for_testing()->IsClosing());
+}
+
+IN_PROC_BROWSER_TEST_F(TabSearchContainerBrowserTest,
+                       ImmediatelyHidesWhenOrganizeButtonDismissed) {
+  tab_search_container()->expansion_animation_for_testing()->Reset(1);
+  tab_search_container()->SetLockedExpansionModeForTesting(
+      LockedExpansionMode::kWillHide);
+
+  tab_search_container()->OnOrganizeButtonDismissed();
+
+  EXPECT_TRUE(
+      tab_search_container()->expansion_animation_for_testing()->IsClosing());
+}
+
+IN_PROC_BROWSER_TEST_F(TabSearchContainerBrowserTest,
+                       DelayedHidesWhenOrganizeButtonTimesOut) {
+  tab_search_container()->expansion_animation_for_testing()->Reset(1);
+  tab_search_container()->SetLockedExpansionModeForTesting(
+      LockedExpansionMode::kWillHide);
+
+  tab_search_container()->OnOrganizeButtonTimeout();
+
+  EXPECT_FALSE(
+      tab_search_container()->expansion_animation_for_testing()->IsClosing());
+
+  tab_search_container()->SetLockedExpansionModeForTesting(
+      LockedExpansionMode::kNone);
+
+  ASSERT_TRUE(
+      tab_search_container()->expansion_animation_for_testing()->IsClosing());
+}
diff --git a/chrome/browser/ui/views/web_apps/view_visible_in_active_widget_notifier.cc b/chrome/browser/ui/views/web_apps/view_visible_in_active_widget_notifier.cc
new file mode 100644
index 0000000..4b24c8e
--- /dev/null
+++ b/chrome/browser/ui/views/web_apps/view_visible_in_active_widget_notifier.cc
@@ -0,0 +1,109 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <utility>
+
+#include "base/functional/bind.h"
+#include "base/memory/weak_ptr.h"
+#include "base/task/sequenced_task_runner.h"
+#include "chrome/browser/ui/views/web_apps/view_visible_in_active_widget_notifier.h"
+#include "ui/base/interaction/element_identifier.h"
+#include "ui/base/interaction/element_tracker.h"
+#include "ui/views/interaction/element_tracker_views.h"
+#include "ui/views/widget/widget.h"
+
+namespace web_app {
+
+base::WeakPtr<ViewVisibleInActiveWidgetNotifier>
+ViewVisibleInActiveWidgetNotifier::Create(
+    views::Widget* widget,
+    ui::ElementIdentifier element_identifier,
+    Callback callback) {
+  ViewVisibleInActiveWidgetNotifier* notifier =
+      new ViewVisibleInActiveWidgetNotifier(widget, element_identifier,
+                                            std::move(callback));
+  return notifier->weak_ptr_factory_.GetWeakPtr();
+}
+
+ViewVisibleInActiveWidgetNotifier::~ViewVisibleInActiveWidgetNotifier() =
+    default;
+
+ViewVisibleInActiveWidgetNotifier::ViewVisibleInActiveWidgetNotifier(
+    views::Widget* widget,
+    ui::ElementIdentifier element_identifier,
+    Callback callback)
+    : widget_(widget),
+      element_identifier_(element_identifier),
+      callback_(std::move(callback)) {
+  CHECK(widget_);
+  CHECK(element_identifier_);
+  element_context_ = views::ElementTrackerViews::GetContextForWidget(widget_);
+  CHECK(element_context_);
+
+  // This always needs to observe the widget even if the notification is
+  // fired in case the widget is destroyed before the posted call to
+  // `RunCallback()`.
+  widget_observation_.Observe(widget_);
+
+  // If the widget is active and the element is shown, immediately queue the
+  // callback without adding observers.
+  if (!MaybePostCallback()) {
+    // If the surface is not ready, then the callback_ was not posted, so
+    // subscribe to changes in the widget and the element tracker.
+    element_shown_subscription_ =
+        ui::ElementTracker::GetElementTracker()->AddElementShownCallback(
+            element_identifier_, element_context_,
+            base::BindRepeating(
+                &ViewVisibleInActiveWidgetNotifier::OnElementShown,
+                weak_ptr_factory_.GetWeakPtr()));
+
+    paint_as_active_subscription_ =
+        widget_->RegisterPaintAsActiveChangedCallback(base::BindRepeating(
+            &ViewVisibleInActiveWidgetNotifier::OnWidgetPaintedAsActive,
+            weak_ptr_factory_.GetWeakPtr()));
+  }
+}
+
+void ViewVisibleInActiveWidgetNotifier::OnWidgetDestroying(
+    views::Widget* widget) {
+  RunCallback(/*conditions_met=*/false);
+}
+
+void ViewVisibleInActiveWidgetNotifier::OnWidgetPaintedAsActive() {
+  MaybePostCallback();
+}
+
+void ViewVisibleInActiveWidgetNotifier::OnElementShown(
+    ui::TrackedElement* element_shown) {
+  MaybePostCallback();
+}
+
+bool ViewVisibleInActiveWidgetNotifier::MaybePostCallback() {
+  const bool is_widget_activate = widget_->ShouldPaintAsActive();
+  const bool is_element_visible =
+      ui::ElementTracker::GetElementTracker()->IsElementVisible(
+          element_identifier_, element_context_);
+  if (!is_widget_activate || !is_element_visible) {
+    return false;
+  }
+
+  // Ensure the widget activation callback posted is asynchronous so that
+  // widget destruction in the current message loop are handled gracefully.
+  base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
+      FROM_HERE, base::BindOnce(&ViewVisibleInActiveWidgetNotifier::RunCallback,
+                                weak_ptr_factory_.GetWeakPtr(),
+                                /*conditions_met=*/true));
+  return true;
+}
+
+void ViewVisibleInActiveWidgetNotifier::RunCallback(bool conditions_met) {
+  if (callback_) {
+    weak_ptr_factory_.InvalidateWeakPtrs();
+    widget_observation_.Reset();
+    std::move(callback_).Run(conditions_met);
+    delete this;
+  }
+}
+
+}  // namespace web_app
diff --git a/chrome/browser/ui/views/web_apps/view_visible_in_active_widget_notifier.h b/chrome/browser/ui/views/web_apps/view_visible_in_active_widget_notifier.h
new file mode 100644
index 0000000..f6f338c7
--- /dev/null
+++ b/chrome/browser/ui/views/web_apps/view_visible_in_active_widget_notifier.h
@@ -0,0 +1,70 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_VIEWS_WEB_APPS_VIEW_VISIBLE_IN_ACTIVE_WIDGET_NOTIFIER_H_
+#define CHROME_BROWSER_UI_VIEWS_WEB_APPS_VIEW_VISIBLE_IN_ACTIVE_WIDGET_NOTIFIER_H_
+
+#include "base/callback_list.h"
+#include "base/functional/callback.h"
+#include "base/memory/weak_ptr.h"
+#include "base/scoped_observation.h"
+#include "ui/base/interaction/element_identifier.h"
+#include "ui/base/interaction/element_tracker.h"
+#include "ui/views/widget/widget.h"
+#include "ui/views/widget/widget_observer.h"
+
+namespace web_app {
+
+class ViewVisibleInActiveWidgetNotifier : public views::WidgetObserver {
+ public:
+  using Callback = base::OnceCallback<void(bool conditions_met)>;
+  // A fire-and-forget utility that runs `callback` when `widget` is active (or
+  // "paint-as-active"), and the specified element in the widget is visible. If
+  // those conditions are never met, the callback is called on `widget`
+  // destruction. The notifier deletes itself after invoking the callback.
+  static base::WeakPtr<ViewVisibleInActiveWidgetNotifier> Create(
+      views::Widget* widget,
+      ui::ElementIdentifier element_identifier,
+      Callback callback);
+
+  ~ViewVisibleInActiveWidgetNotifier() override;
+  ViewVisibleInActiveWidgetNotifier(const ViewVisibleInActiveWidgetNotifier&) =
+      delete;
+  void operator=(const ViewVisibleInActiveWidgetNotifier&) = delete;
+
+ private:
+  // Creates the notifier and calls `MaybePostCallback()` in case the conditions
+  // are already met; otherwise, subscribes to the relevant observations.
+  ViewVisibleInActiveWidgetNotifier(views::Widget* widget,
+                                    ui::ElementIdentifier element_identifier,
+                                    Callback callback);
+
+  // views::WidgetObserver:
+  void OnWidgetDestroying(views::Widget* widget) override;
+
+  // Widget paint as active observers.
+  void OnWidgetPaintedAsActive();
+
+  // ui::ElementTracker listeners:
+  void OnElementShown(ui::TrackedElement* element_shown);
+
+  bool MaybePostCallback();
+  void RunCallback(bool conditions_met);
+
+  const raw_ptr<views::Widget> widget_;
+  const ui::ElementIdentifier element_identifier_;
+  ui::ElementContext element_context_;
+  Callback callback_;
+
+  base::CallbackListSubscription paint_as_active_subscription_;
+  base::CallbackListSubscription element_shown_subscription_;
+  base::ScopedObservation<views::Widget, views::WidgetObserver>
+      widget_observation_{this};
+  base::WeakPtrFactory<ViewVisibleInActiveWidgetNotifier> weak_ptr_factory_{
+      this};
+};
+
+}  // namespace web_app
+
+#endif  // CHROME_BROWSER_UI_VIEWS_WEB_APPS_VIEW_VISIBLE_IN_ACTIVE_WIDGET_NOTIFIER_H_
diff --git a/chrome/browser/ui/views/web_apps/view_visible_in_active_widget_notifier_unittest.cc b/chrome/browser/ui/views/web_apps/view_visible_in_active_widget_notifier_unittest.cc
new file mode 100644
index 0000000..f754e4c
--- /dev/null
+++ b/chrome/browser/ui/views/web_apps/view_visible_in_active_widget_notifier_unittest.cc
@@ -0,0 +1,130 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <memory>
+
+#include "chrome/browser/ui/views/web_apps/view_visible_in_active_widget_notifier.h"
+
+#include "base/memory/weak_ptr.h"
+#include "base/run_loop.h"
+#include "base/test/test_future.h"
+#include "chrome/test/views/chrome_views_test_base.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/base/interaction/element_identifier.h"
+#include "ui/views/controls/label.h"
+#include "ui/views/view_class_properties.h"
+#include "ui/views/widget/widget.h"
+
+namespace web_apps {
+
+namespace {
+
+DEFINE_LOCAL_ELEMENT_IDENTIFIER_VALUE(kRandomLabel);
+
+class ViewVisibleInActiveWidgetNotifierTest : public ChromeViewsTestBase {
+ public:
+  ViewVisibleInActiveWidgetNotifierTest() = default;
+  ~ViewVisibleInActiveWidgetNotifierTest() override = default;
+
+ protected:
+  void SetUp() override {
+    ChromeViewsTestBase::SetUp();
+    widget_ = CreateTestWidget();
+    widget_->SetContentsView(
+        views::Builder<views::Label>(
+            std::make_unique<views::Label>(u"Random Label"))
+            .SetProperty(views::kElementIdentifierKey, kRandomLabel)
+            .Build());
+  }
+
+  void TearDown() override {
+    widget_.reset();
+    ChromeViewsTestBase::TearDown();
+  }
+  views::Widget* widget() { return widget_.get(); }
+
+ private:
+  std::unique_ptr<views::Widget> widget_;
+};
+
+TEST_F(ViewVisibleInActiveWidgetNotifierTest, WorksBeforeWidgetShown) {
+  base::test::TestFuture<bool> future;
+  base::WeakPtr<web_app::ViewVisibleInActiveWidgetNotifier> notifier =
+      web_app::ViewVisibleInActiveWidgetNotifier::Create(widget(), kRandomLabel,
+                                                         future.GetCallback());
+  base::RunLoop().RunUntilIdle();
+  EXPECT_FALSE(future.IsReady());
+
+  widget()->Show();
+  EXPECT_TRUE(future.Wait());
+  EXPECT_TRUE(future.Get());
+  EXPECT_FALSE(notifier);
+}
+
+TEST_F(ViewVisibleInActiveWidgetNotifierTest, WorksAfterWidgetShown) {
+  widget()->Show();
+  base::test::TestFuture<bool> future;
+  base::WeakPtr<web_app::ViewVisibleInActiveWidgetNotifier> notifier =
+      web_app::ViewVisibleInActiveWidgetNotifier::Create(widget(), kRandomLabel,
+                                                         future.GetCallback());
+  EXPECT_TRUE(future.Wait());
+  EXPECT_TRUE(future.Get());
+  EXPECT_FALSE(notifier);
+}
+
+TEST_F(ViewVisibleInActiveWidgetNotifierTest, WidgetDestructionNoDangling) {
+  base::test::TestFuture<bool> future;
+  base::WeakPtr<web_app::ViewVisibleInActiveWidgetNotifier> notifier =
+      web_app::ViewVisibleInActiveWidgetNotifier::Create(widget(), kRandomLabel,
+                                                         future.GetCallback());
+  base::RunLoop().RunUntilIdle();
+  EXPECT_FALSE(future.IsReady());
+
+  SimulateNativeDestroy(widget());
+  EXPECT_TRUE(future.Wait());
+  EXPECT_FALSE(future.Get());
+  EXPECT_FALSE(notifier);
+}
+
+TEST_F(ViewVisibleInActiveWidgetNotifierTest,
+       WorksBeforeWidgetShownOrViewVisible) {
+  // Test the view not being visible (or added) when the widget is shown.
+  widget()->GetContentsView()->SetVisible(false);
+
+  base::test::TestFuture<bool> future;
+  base::WeakPtr<web_app::ViewVisibleInActiveWidgetNotifier> notifier =
+      web_app::ViewVisibleInActiveWidgetNotifier::Create(widget(), kRandomLabel,
+                                                         future.GetCallback());
+  widget()->Show();
+  base::RunLoop().RunUntilIdle();
+  EXPECT_FALSE(widget()->GetContentsView()->GetVisible());
+  EXPECT_FALSE(future.IsReady());
+
+  widget()->GetContentsView()->SetVisible(true);
+  EXPECT_TRUE(future.Wait());
+  EXPECT_TRUE(future.Get());
+  EXPECT_FALSE(notifier);
+}
+
+TEST_F(ViewVisibleInActiveWidgetNotifierTest, WorksWhenNotifierWeakPtrRemoved) {
+  base::test::TestFuture<bool> future;
+  base::WeakPtr<web_app::ViewVisibleInActiveWidgetNotifier> notifier =
+      web_app::ViewVisibleInActiveWidgetNotifier::Create(widget(), kRandomLabel,
+                                                         future.GetCallback());
+  base::RunLoop().RunUntilIdle();
+  EXPECT_FALSE(future.IsReady());
+
+  notifier.reset();
+  EXPECT_FALSE(notifier);
+  base::RunLoop().RunUntilIdle();
+  EXPECT_FALSE(future.IsReady());
+
+  widget()->Show();
+  EXPECT_TRUE(future.Wait());
+  EXPECT_TRUE(future.Get());
+}
+
+}  // namespace
+
+}  // namespace web_apps
diff --git a/chrome/browser/ui/web_applications/test/web_app_browsertest_util.cc b/chrome/browser/ui/web_applications/test/web_app_browsertest_util.cc
index 4964f9b..81901f9 100644
--- a/chrome/browser/ui/web_applications/test/web_app_browsertest_util.cc
+++ b/chrome/browser/ui/web_applications/test/web_app_browsertest_util.cc
@@ -82,6 +82,8 @@
     content::WebContents* initiator_web_contents,
     std::unique_ptr<WebAppInstallInfo> web_app_info,
     WebAppInstallationAcceptanceCallback acceptance_callback) {
+  // TODO(crbug.com/1503010): Delete the WebAppInstallDialogCallback callback
+  // on FetchManifestAndInstall entirely and test the prod behavior better.
   web_app_info->user_display_mode = mojom::UserDisplayMode::kStandalone;
   std::move(acceptance_callback)
       .Run(
diff --git a/chrome/browser/ui/web_applications/web_app_browser_controller.cc b/chrome/browser/ui/web_applications/web_app_browser_controller.cc
index b9a486c5..1c95992 100644
--- a/chrome/browser/ui/web_applications/web_app_browser_controller.cc
+++ b/chrome/browser/ui/web_applications/web_app_browser_controller.cc
@@ -325,6 +325,7 @@
   if (updated_app_id == app_id()) {
     UpdateThemePack();
     app_icon_.reset();
+    home_tab_scope_.reset();
     browser()->window()->UpdateTitleBar();
 
     if (ManifestUpdateAppliedCallbackForTesting()) {
diff --git a/chrome/browser/ui/web_applications/web_app_browsertest.cc b/chrome/browser/ui/web_applications/web_app_browsertest.cc
index 07d29c9..4658dfc 100644
--- a/chrome/browser/ui/web_applications/web_app_browsertest.cc
+++ b/chrome/browser/ui/web_applications/web_app_browsertest.cc
@@ -1676,7 +1676,7 @@
   provider->scheduler().FetchManifestAndInstall(
       webapps::WebappInstallSource::OMNIBOX_INSTALL_ICON,
       browser()->tab_strip_model()->GetActiveWebContents()->GetWeakPtr(),
-      base::BindOnce(test::TestAcceptDialogCallback),
+      base::BindOnce(test::TestAcceptInstallDialogCallback),
       install_future.GetCallback(),
       /*use_fallback=*/false);
 
diff --git a/chrome/browser/ui/webui/feedback/feedback_ui.cc b/chrome/browser/ui/webui/feedback/feedback_ui.cc
index c5e8c477..75bdebf 100644
--- a/chrome/browser/ui/webui/feedback/feedback_ui.cc
+++ b/chrome/browser/ui/webui/feedback/feedback_ui.cc
@@ -43,6 +43,7 @@
       {"consentCheckboxLabel", IDS_FEEDBACK_CONSENT_CHECKBOX_LABEL},
       {"freeFormText", IDS_FEEDBACK_FREE_TEXT_LABEL},
       {"freeFormTextAi", IDS_FEEDBACK_FREE_TEXT_AI_LABEL},
+      {"logIdCheckboxLabel", IDS_FEEDBACK_LOG_ID_CHECKBOX_LABEL},
       {"logsMapPageCollapseAllBtn", IDS_ABOUT_SYS_COLLAPSE_ALL},
       {"logsMapPageCollapseBtn", IDS_ABOUT_SYS_COLLAPSE},
       {"logsMapPageExpandAllBtn", IDS_ABOUT_SYS_EXPAND_ALL},
diff --git a/chrome/browser/ui/webui/settings/incompatible_applications_handler_win.cc b/chrome/browser/ui/webui/settings/incompatible_applications_handler_win.cc
index 668bcc23..c84d9cb 100644
--- a/chrome/browser/ui/webui/settings/incompatible_applications_handler_win.cc
+++ b/chrome/browser/ui/webui/settings/incompatible_applications_handler_win.cc
@@ -10,7 +10,6 @@
 
 #include "base/check_op.h"
 #include "base/functional/bind.h"
-#include "base/metrics/histogram_macros.h"
 #include "base/metrics/user_metrics.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/values.h"
@@ -106,9 +105,6 @@
     application_list.Append(std::move(dict));
   }
 
-  UMA_HISTOGRAM_COUNTS_100("IncompatibleApplicationsPage.NumApplications",
-                           incompatible_applications.size());
-
   const base::Value& callback_id = args.front();
   ResolveJavascriptCallback(callback_id, application_list);
 }
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 b411fd59..663df9f 100644
--- a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
+++ b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
@@ -1599,174 +1599,188 @@
 void AddPrivacyStrings(content::WebUIDataSource* html_source,
                        Profile* profile) {
   static constexpr webui::LocalizedString kLocalizedStrings[] = {
-    {"privacyPageTitle", IDS_SETTINGS_PRIVACY},
-    {"privacyPageMore", IDS_SETTINGS_PRIVACY_MORE},
-    {"doNotTrack", IDS_SETTINGS_ENABLE_DO_NOT_TRACK},
-    {"doNotTrackDialogTitle", IDS_SETTINGS_ENABLE_DO_NOT_TRACK_DIALOG_TITLE},
-    // TODO(crbug.com/1062607): This string is no longer used. Remove.
-    {"permissionsPageTitle", IDS_SETTINGS_PERMISSIONS},
-    {"permissionsPageDescription", IDS_SETTINGS_PERMISSIONS_DESCRIPTION},
-    {"securityPageTitle", IDS_SETTINGS_SECURITY},
-    {"securityPageDescription", IDS_SETTINGS_SECURITY_DESCRIPTION},
-    {"advancedProtectionProgramTitle",
-     IDS_SETTINGS_ADVANCED_PROTECTION_PROGRAM},
-    {"advancedProtectionProgramDesc",
-     IDS_SETTINGS_ADVANCED_PROTECTION_PROGRAM_DESC},
-    {"httpsOnlyModeTitle", IDS_SETTINGS_HTTPS_ONLY_MODE},
-    {"httpsOnlyModeDescription", IDS_SETTINGS_HTTPS_ONLY_MODE_DESCRIPTION},
-    {"httpsOnlyModeDescriptionAdvancedProtection",
-     IDS_SETTINGS_HTTPS_ONLY_MODE_DESCRIPTION_ADVANCED_PROTECTION},
-    {"manageCertificates", IDS_SETTINGS_MANAGE_CERTIFICATES},
-    {"manageCertificatesDescription",
-     IDS_SETTINGS_MANAGE_CERTIFICATES_DESCRIPTION},
-    {"contentSettings", IDS_SETTINGS_CONTENT_SETTINGS},
-    {"siteSettings", IDS_SETTINGS_SITE_SETTINGS},
-    {"siteSettingsDescription", IDS_SETTINGS_SITE_SETTINGS_DESCRIPTION},
-    {"clearData", IDS_SETTINGS_CLEAR_DATA},
-    {"clearingData", IDS_SETTINGS_CLEARING_DATA},
-    {"clearedData", IDS_SETTINGS_CLEARED_DATA},
-    {"clearBrowsingData", IDS_SETTINGS_CLEAR_BROWSING_DATA},
-    {"clearBrowsingDataDescription", IDS_SETTINGS_CLEAR_DATA_DESCRIPTION},
-    {"titleAndCount", IDS_SETTINGS_TITLE_AND_COUNT},
-    {"safeBrowsingEnableExtendedReportingDesc",
-     IDS_SETTINGS_SAFEBROWSING_ENABLE_REPORTING_DESC},
-    {"safeBrowsingEnhanced", IDS_SETTINGS_SAFEBROWSING_ENHANCED},
-    {"safeBrowsingEnhancedDesc", IDS_SETTINGS_SAFEBROWSING_ENHANCED_DESC},
-    {"safeBrowsingEnhancedDescUpdated",
-     IDS_SETTINGS_SAFEBROWSING_ENHANCED_DESC_UPDATED},
-    {"safeBrowsingEnhancedExpandA11yLabel",
-     IDS_SETTINGS_SAFEBROWSING_ENHANCED_EXPAND_ACCESSIBILITY_LABEL},
-    {"safeBrowsingEnhancedBulOne",
-     IDS_SETTINGS_SAFEBROWSING_ENHANCED_BULLET_ONE},
-    {"safeBrowsingEnhancedBulTwo",
-     IDS_SETTINGS_SAFEBROWSING_ENHANCED_BULLET_TWO},
-    {"safeBrowsingEnhancedBulThree",
-     IDS_SETTINGS_SAFEBROWSING_ENHANCED_BULLET_THREE},
-    {"safeBrowsingEnhancedBulFour",
-     IDS_SETTINGS_SAFEBROWSING_ENHANCED_BULLET_FOUR},
-    {"safeBrowsingEnhancedBulFive",
-     IDS_SETTINGS_SAFEBROWSING_ENHANCED_BULLET_FIVE},
-    {"safeBrowsingEnhancedWhenOnLabel",
-     IDS_SETTINGS_SAFEBROWSING_ENHANCED_WHEN_ON_LABEL},
-    {"safeBrowsingEnhancedWhenOnBulOne",
-     IDS_SETTINGS_SAFEBROWSING_ENHANCED_WHEN_ON_BULLET_ONE},
-    {"safeBrowsingEnhancedWhenOnBulTwo",
-     IDS_SETTINGS_SAFEBROWSING_ENHANCED_WHEN_ON_BULLET_TWO},
-    {"safeBrowsingEnhancedWhenOnBulThree",
-     IDS_SETTINGS_SAFEBROWSING_ENHANCED_WHEN_ON_BULLET_THREE},
-    {"safeBrowsingEnhancedWhenOnBulFour",
-     IDS_SETTINGS_SAFEBROWSING_ENHANCED_WHEN_ON_BULLET_FOUR},
-    {"safeBrowsingEnhancedWhenOnBulFive",
-     IDS_SETTINGS_SAFEBROWSING_ENHANCED_WHEN_ON_BULLET_FIVE},
-    {"safeBrowsingEnhancedThingsToConsiderLabel",
-     IDS_SETTINGS_SAFEBROWSING_ENHANCED_THINGS_TO_CONSIDER_LABEL},
-    {"safeBrowsingEnhancedThingsToConsiderBulOne",
-     IDS_SETTINGS_SAFEBROWSING_ENHANCED_THINGS_TO_CONSIDER_BULLET_ONE},
-    {"safeBrowsingEnhancedThingsToConsiderBulTwo",
-     IDS_SETTINGS_SAFEBROWSING_ENHANCED_THINGS_TO_CONSIDER_BULLET_TWO},
-    {"safeBrowsingEnhancedThingsToConsiderBulThree",
-     IDS_SETTINGS_SAFEBROWSING_ENHANCED_THINGS_TO_CONSIDER_BULLET_THREE},
-    {"safeBrowsingStandard", IDS_SETTINGS_SAFEBROWSING_STANDARD},
-    {"safeBrowsingStandardDesc", IDS_SETTINGS_SAFEBROWSING_STANDARD_DESC},
-    {"safeBrowsingStandardDescUpdated",
-     IDS_SETTINGS_SAFEBROWSING_STANDARD_DESC_UPDATED},
+      {"privacyPageTitle", IDS_SETTINGS_PRIVACY},
+      {"privacyPageMore", IDS_SETTINGS_PRIVACY_MORE},
+      {"doNotTrack", IDS_SETTINGS_ENABLE_DO_NOT_TRACK},
+      {"doNotTrackDialogTitle", IDS_SETTINGS_ENABLE_DO_NOT_TRACK_DIALOG_TITLE},
+      // TODO(crbug.com/1062607): This string is no longer used. Remove.
+      {"permissionsPageTitle", IDS_SETTINGS_PERMISSIONS},
+      {"permissionsPageDescription", IDS_SETTINGS_PERMISSIONS_DESCRIPTION},
+      {"securityPageTitle", IDS_SETTINGS_SECURITY},
+      {"securityPageDescription", IDS_SETTINGS_SECURITY_DESCRIPTION},
+      {"advancedProtectionProgramTitle",
+       IDS_SETTINGS_ADVANCED_PROTECTION_PROGRAM},
+      {"advancedProtectionProgramDesc",
+       IDS_SETTINGS_ADVANCED_PROTECTION_PROGRAM_DESC},
+      {"httpsOnlyModeTitle", IDS_SETTINGS_HTTPS_ONLY_MODE},
+      {"httpsOnlyModeDescription", IDS_SETTINGS_HTTPS_ONLY_MODE_DESCRIPTION},
+      {"httpsOnlyModeDescriptionAdvancedProtection",
+       IDS_SETTINGS_HTTPS_ONLY_MODE_DESCRIPTION_ADVANCED_PROTECTION},
+      {"httpsFirstModeSectionLabel", IDS_SETTINGS_HTTPS_FIRST_MODE_TITLE},
+      {"httpsFirstModeSectionSubLabel", IDS_SETTINGS_HTTPS_FIRST_MODE_SUBTITLE},
+      {"httpsFirstModeEnabledFullLabel",
+       IDS_SETTINGS_HTTPS_FIRST_MODE_ENABLED_FULL_LABEL},
+      {"httpsFirstModeEnabledFullSubLabel",
+       IDS_SETTINGS_HTTPS_FIRST_MODE_ENABLED_FULL_SUBLABEL},
+      {"httpsFirstModeEnabledIncognitoLabel",
+       IDS_SETTINGS_HTTPS_FIRST_MODE_ENABLED_INCOGNITO_LABEL},
+      {"httpsFirstModeEnabledIncognitoSubLabel",
+       IDS_SETTINGS_HTTPS_FIRST_MODE_ENABLED_INCOGNITO_SUBLABEL},
+      {"httpsFirstModeDisabledLabel",
+       IDS_SETTINGS_HTTPS_FIRST_MODE_DISABLED_LABEL},
+      {"httpsFirstModeDisabledSubLabel",
+       IDS_SETTINGS_HTTPS_FIRST_MODE_DISABLED_SUBLABEL},
+      {"manageCertificates", IDS_SETTINGS_MANAGE_CERTIFICATES},
+      {"manageCertificatesDescription",
+       IDS_SETTINGS_MANAGE_CERTIFICATES_DESCRIPTION},
+      {"contentSettings", IDS_SETTINGS_CONTENT_SETTINGS},
+      {"siteSettings", IDS_SETTINGS_SITE_SETTINGS},
+      {"siteSettingsDescription", IDS_SETTINGS_SITE_SETTINGS_DESCRIPTION},
+      {"clearData", IDS_SETTINGS_CLEAR_DATA},
+      {"clearingData", IDS_SETTINGS_CLEARING_DATA},
+      {"clearedData", IDS_SETTINGS_CLEARED_DATA},
+      {"clearBrowsingData", IDS_SETTINGS_CLEAR_BROWSING_DATA},
+      {"clearBrowsingDataDescription", IDS_SETTINGS_CLEAR_DATA_DESCRIPTION},
+      {"titleAndCount", IDS_SETTINGS_TITLE_AND_COUNT},
+      {"safeBrowsingEnableExtendedReportingDesc",
+       IDS_SETTINGS_SAFEBROWSING_ENABLE_REPORTING_DESC},
+      {"safeBrowsingEnhanced", IDS_SETTINGS_SAFEBROWSING_ENHANCED},
+      {"safeBrowsingEnhancedDesc", IDS_SETTINGS_SAFEBROWSING_ENHANCED_DESC},
+      {"safeBrowsingEnhancedDescUpdated",
+       IDS_SETTINGS_SAFEBROWSING_ENHANCED_DESC_UPDATED},
+      {"safeBrowsingEnhancedExpandA11yLabel",
+       IDS_SETTINGS_SAFEBROWSING_ENHANCED_EXPAND_ACCESSIBILITY_LABEL},
+      {"safeBrowsingEnhancedBulOne",
+       IDS_SETTINGS_SAFEBROWSING_ENHANCED_BULLET_ONE},
+      {"safeBrowsingEnhancedBulTwo",
+       IDS_SETTINGS_SAFEBROWSING_ENHANCED_BULLET_TWO},
+      {"safeBrowsingEnhancedBulThree",
+       IDS_SETTINGS_SAFEBROWSING_ENHANCED_BULLET_THREE},
+      {"safeBrowsingEnhancedBulFour",
+       IDS_SETTINGS_SAFEBROWSING_ENHANCED_BULLET_FOUR},
+      {"safeBrowsingEnhancedBulFive",
+       IDS_SETTINGS_SAFEBROWSING_ENHANCED_BULLET_FIVE},
+      {"safeBrowsingEnhancedWhenOnLabel",
+       IDS_SETTINGS_SAFEBROWSING_ENHANCED_WHEN_ON_LABEL},
+      {"safeBrowsingEnhancedWhenOnBulOne",
+       IDS_SETTINGS_SAFEBROWSING_ENHANCED_WHEN_ON_BULLET_ONE},
+      {"safeBrowsingEnhancedWhenOnBulTwo",
+       IDS_SETTINGS_SAFEBROWSING_ENHANCED_WHEN_ON_BULLET_TWO},
+      {"safeBrowsingEnhancedWhenOnBulThree",
+       IDS_SETTINGS_SAFEBROWSING_ENHANCED_WHEN_ON_BULLET_THREE},
+      {"safeBrowsingEnhancedWhenOnBulFour",
+       IDS_SETTINGS_SAFEBROWSING_ENHANCED_WHEN_ON_BULLET_FOUR},
+      {"safeBrowsingEnhancedWhenOnBulFive",
+       IDS_SETTINGS_SAFEBROWSING_ENHANCED_WHEN_ON_BULLET_FIVE},
+      {"safeBrowsingEnhancedThingsToConsiderLabel",
+       IDS_SETTINGS_SAFEBROWSING_ENHANCED_THINGS_TO_CONSIDER_LABEL},
+      {"safeBrowsingEnhancedThingsToConsiderBulOne",
+       IDS_SETTINGS_SAFEBROWSING_ENHANCED_THINGS_TO_CONSIDER_BULLET_ONE},
+      {"safeBrowsingEnhancedThingsToConsiderBulTwo",
+       IDS_SETTINGS_SAFEBROWSING_ENHANCED_THINGS_TO_CONSIDER_BULLET_TWO},
+      {"safeBrowsingEnhancedThingsToConsiderBulThree",
+       IDS_SETTINGS_SAFEBROWSING_ENHANCED_THINGS_TO_CONSIDER_BULLET_THREE},
+      {"safeBrowsingStandard", IDS_SETTINGS_SAFEBROWSING_STANDARD},
+      {"safeBrowsingStandardDesc", IDS_SETTINGS_SAFEBROWSING_STANDARD_DESC},
+      {"safeBrowsingStandardDescUpdated",
+       IDS_SETTINGS_SAFEBROWSING_STANDARD_DESC_UPDATED},
 #if BUILDFLAG(GOOGLE_CHROME_BRANDING)
-    {"safeBrowsingStandardDescUpdatedProxy",
-     IDS_SETTINGS_SAFEBROWSING_STANDARD_DESC_UPDATED_PROXY},
+      {"safeBrowsingStandardDescUpdatedProxy",
+       IDS_SETTINGS_SAFEBROWSING_STANDARD_DESC_UPDATED_PROXY},
 #endif
-    {"safeBrowsingStandardExpandA11yLabel",
-     IDS_SETTINGS_SAFEBROWSING_STANDARD_EXPAND_ACCESSIBILITY_LABEL},
-    {"safeBrowsingStandardBulOne",
-     IDS_SETTINGS_SAFEBROWSING_STANDARD_BULLET_ONE},
-    {"safeBrowsingStandardBulTwo",
-     IDS_SETTINGS_SAFEBROWSING_STANDARD_BULLET_TWO},
+      {"safeBrowsingStandardExpandA11yLabel",
+       IDS_SETTINGS_SAFEBROWSING_STANDARD_EXPAND_ACCESSIBILITY_LABEL},
+      {"safeBrowsingStandardBulOne",
+       IDS_SETTINGS_SAFEBROWSING_STANDARD_BULLET_ONE},
+      {"safeBrowsingStandardBulTwo",
+       IDS_SETTINGS_SAFEBROWSING_STANDARD_BULLET_TWO},
 #if BUILDFLAG(GOOGLE_CHROME_BRANDING)
-    {"safeBrowsingStandardBulTwoProxy",
-     IDS_SETTINGS_SAFEBROWSING_STANDARD_BULLET_TWO_PROXY},
+      {"safeBrowsingStandardBulTwoProxy",
+       IDS_SETTINGS_SAFEBROWSING_STANDARD_BULLET_TWO_PROXY},
 #endif
-    {"safeBrowsingStandardReportingLabel",
-     IDS_SETTINGS_SAFEBROWSING_STANDARD_HELP_IMPROVE},
-    {"safeBrowsingNone", IDS_SETTINGS_SAFEBROWSING_NONE},
-    {"safeBrowsingNoneDesc", IDS_SETTINGS_SAFEBROWSING_NONE_DESC},
-    {"safeBrowsingNoneDescUpdated",
-     IDS_SETTINGS_SAFEBROWSING_NONE_DESC_UPDATED},
-    {"safeBrowsingDisableDialog",
-     IDS_SETTINGS_SAFEBROWSING_DISABLE_DIALOG_TITLE},
-    {"safeBrowsingDisableDialogDesc",
-     IDS_SETTINGS_SAFEBROWSING_DISABLE_DIALOG_DESC},
-    {"safeBrowsingDisableDialogConfirm",
-     IDS_SETTINGS_SAFEBROWSING_DISABLE_DIALOG_CONFIRM},
-    {"safeBrowsingEnableProtection",
-     IDS_SETTINGS_SAFEBROWSING_ENABLEPROTECTION},
-    {"safeBrowsingEnableProtectionDesc",
-     IDS_SETTINGS_SAFEBROWSING_ENABLEPROTECTION_DESC},
-    {"safeBrowsingSectionLabel", IDS_SETTINGS_SAFEBROWSING_SECTION_LABEL},
-    {"syncAndGoogleServicesPrivacyDescription",
-     IDS_SETTINGS_SYNC_AND_GOOGLE_SERVICES_PRIVACY_DESC_UNIFIED_CONSENT},
-    {"urlKeyedAnonymizedDataCollection",
-     IDS_SETTINGS_ENABLE_URL_KEYED_ANONYMIZED_DATA_COLLECTION},
-    {"urlKeyedAnonymizedDataCollectionDesc",
-     IDS_SETTINGS_ENABLE_URL_KEYED_ANONYMIZED_DATA_COLLECTION_DESC},
-    {"noRecentPermissions", IDS_SETTINGS_RECENT_PERMISSIONS_NO_CHANGES},
-    {"recentPermissionAllowedOneItem",
-     IDS_SETTINGS_RECENT_PERMISSIONS_ALLOWED_ONE_ITEM},
-    {"recentPermissionAllowedTwoItems",
-     IDS_SETTINGS_RECENT_PERMISSIONS_ALLOWED_TWO_ITEMS},
-    {"recentPermissionAllowedMoreThanTwoItems",
-     IDS_SETTINGS_RECENT_PERMISSIONS_ALLOWED_MORE_THAN_TWO_ITEMS},
-    {"recentPermissionAutoBlockedOneItem",
-     IDS_SETTINGS_RECENT_PERMISSIONS_AUTOMATICALLY_BLOCKED_ONE_ITEM},
-    {"recentPermissionAutoBlockedTwoItems",
-     IDS_SETTINGS_RECENT_PERMISSIONS_AUTOMATICALLY_BLOCKED_TWO_ITEMS},
-    {"recentPermissionAutoBlockedMoreThanTwoItems",
-     IDS_SETTINGS_RECENT_PERMISSIONS_AUTOMATICALLY_BLOCKED_MORE_THAN_TWO_ITEMS},
-    {"recentPermissionBlockedOneItem",
-     IDS_SETTINGS_RECENT_PERMISSIONS_BLOCKED_ONE_ITEM},
-    {"recentPermissionBlockedTwoItems",
-     IDS_SETTINGS_RECENT_PERMISSIONS_BLOCKED_TWO_ITEMS},
-    {"recentPermissionBlockedMoreThanTwoItems",
-     IDS_SETTINGS_RECENT_PERMISSIONS_BLOCKED_MORE_THAN_TWO_ITEMS},
-    {"networkPredictionEnabledDesc",
-     IDS_SETTINGS_NETWORK_PREDICTION_ENABLED_DESC},
-    {"networkPredictionEnabledDescCookiesPage",
-     IDS_SETTINGS_NETWORK_PREDICTION_ENABLED_DESC_COOKIES_PAGE},
-    {"preloadingPageTitle", IDS_SETTINGS_PRELOAD_PAGES_TITLE},
-    {"preloadingPageSummary", IDS_SETTINGS_PRELOAD_PAGES_SUMMARY},
-    {"preloadingPageNoPreloadingTitle",
-     IDS_SETTINGS_PRELOAD_PAGES_NO_PRELOADING_TITLE},
-    {"preloadingPageNoPreloadingSummary",
-     IDS_SETTINGS_PRELOAD_PAGES_NO_PRELOADING_SUMMARY},
-    {"preloadingPageStandardPreloadingTitle",
-     IDS_SETTINGS_PRELOAD_PAGES_STANDARD_PRELOADING_TITLE},
-    {"preloadingPageStandardPreloadingSummary",
-     IDS_SETTINGS_PRELOAD_PAGES_STANDARD_PRELOADING_SUMMARY},
-    {"preloadingPageStandardPreloadingWhenOnBulletOne",
-     IDS_SETTINGS_PRELOAD_PAGES_STANDARD_PRELOADING_WHEN_ON_BULLET_ONE},
-    {"preloadingPageStandardPreloadingWhenOnBulletTwo",
-     IDS_SETTINGS_PRELOAD_PAGES_STANDARD_PRELOADING_WHEN_ON_BULLET_TWO},
-    {"preloadingPageExtendedPreloadingTitle",
-     IDS_SETTINGS_PRELOAD_PAGES_EXTENDED_PRELOADING_TITLE},
-    {"preloadingPageExtendedPreloadingSummary",
-     IDS_SETTINGS_PRELOAD_PAGES_EXTENDED_PRELOADING_SUMMARY},
-    {"preloadingPageExtendedPreloadingWhenOnBulletOne",
-     IDS_SETTINGS_PRELOAD_PAGES_EXTENDED_PRELOADING_WHEN_ON_BULLET_ONE},
-    {"preloadingPageExtendedPreloadingWhenOnBulletTwo",
-     IDS_SETTINGS_PRELOAD_PAGES_EXTENDED_PRELOADING_WHEN_ON_BULLET_TWO},
-    {"preloadingPageExtendedPreloadingThingsToConsiderBulletTwo",
-     IDS_SETTINGS_PRELOAD_PAGES_EXTENDED_PRELOADING_THINGS_TO_CONSIDER_BULLET_TWO},
-    {"preloadingPageThingsToConsiderBulletOne",
-     IDS_SETTINGS_PRELOAD_PAGES_THINGS_TO_CONSIDER_BULLET_ONE},
+      {"safeBrowsingStandardReportingLabel",
+       IDS_SETTINGS_SAFEBROWSING_STANDARD_HELP_IMPROVE},
+      {"safeBrowsingNone", IDS_SETTINGS_SAFEBROWSING_NONE},
+      {"safeBrowsingNoneDesc", IDS_SETTINGS_SAFEBROWSING_NONE_DESC},
+      {"safeBrowsingNoneDescUpdated",
+       IDS_SETTINGS_SAFEBROWSING_NONE_DESC_UPDATED},
+      {"safeBrowsingDisableDialog",
+       IDS_SETTINGS_SAFEBROWSING_DISABLE_DIALOG_TITLE},
+      {"safeBrowsingDisableDialogDesc",
+       IDS_SETTINGS_SAFEBROWSING_DISABLE_DIALOG_DESC},
+      {"safeBrowsingDisableDialogConfirm",
+       IDS_SETTINGS_SAFEBROWSING_DISABLE_DIALOG_CONFIRM},
+      {"safeBrowsingEnableProtection",
+       IDS_SETTINGS_SAFEBROWSING_ENABLEPROTECTION},
+      {"safeBrowsingEnableProtectionDesc",
+       IDS_SETTINGS_SAFEBROWSING_ENABLEPROTECTION_DESC},
+      {"safeBrowsingSectionLabel", IDS_SETTINGS_SAFEBROWSING_SECTION_LABEL},
+      {"syncAndGoogleServicesPrivacyDescription",
+       IDS_SETTINGS_SYNC_AND_GOOGLE_SERVICES_PRIVACY_DESC_UNIFIED_CONSENT},
+      {"urlKeyedAnonymizedDataCollection",
+       IDS_SETTINGS_ENABLE_URL_KEYED_ANONYMIZED_DATA_COLLECTION},
+      {"urlKeyedAnonymizedDataCollectionDesc",
+       IDS_SETTINGS_ENABLE_URL_KEYED_ANONYMIZED_DATA_COLLECTION_DESC},
+      {"noRecentPermissions", IDS_SETTINGS_RECENT_PERMISSIONS_NO_CHANGES},
+      {"recentPermissionAllowedOneItem",
+       IDS_SETTINGS_RECENT_PERMISSIONS_ALLOWED_ONE_ITEM},
+      {"recentPermissionAllowedTwoItems",
+       IDS_SETTINGS_RECENT_PERMISSIONS_ALLOWED_TWO_ITEMS},
+      {"recentPermissionAllowedMoreThanTwoItems",
+       IDS_SETTINGS_RECENT_PERMISSIONS_ALLOWED_MORE_THAN_TWO_ITEMS},
+      {"recentPermissionAutoBlockedOneItem",
+       IDS_SETTINGS_RECENT_PERMISSIONS_AUTOMATICALLY_BLOCKED_ONE_ITEM},
+      {"recentPermissionAutoBlockedTwoItems",
+       IDS_SETTINGS_RECENT_PERMISSIONS_AUTOMATICALLY_BLOCKED_TWO_ITEMS},
+      {"recentPermissionAutoBlockedMoreThanTwoItems",
+       IDS_SETTINGS_RECENT_PERMISSIONS_AUTOMATICALLY_BLOCKED_MORE_THAN_TWO_ITEMS},
+      {"recentPermissionBlockedOneItem",
+       IDS_SETTINGS_RECENT_PERMISSIONS_BLOCKED_ONE_ITEM},
+      {"recentPermissionBlockedTwoItems",
+       IDS_SETTINGS_RECENT_PERMISSIONS_BLOCKED_TWO_ITEMS},
+      {"recentPermissionBlockedMoreThanTwoItems",
+       IDS_SETTINGS_RECENT_PERMISSIONS_BLOCKED_MORE_THAN_TWO_ITEMS},
+      {"networkPredictionEnabledDesc",
+       IDS_SETTINGS_NETWORK_PREDICTION_ENABLED_DESC},
+      {"networkPredictionEnabledDescCookiesPage",
+       IDS_SETTINGS_NETWORK_PREDICTION_ENABLED_DESC_COOKIES_PAGE},
+      {"preloadingPageTitle", IDS_SETTINGS_PRELOAD_PAGES_TITLE},
+      {"preloadingPageSummary", IDS_SETTINGS_PRELOAD_PAGES_SUMMARY},
+      {"preloadingPageNoPreloadingTitle",
+       IDS_SETTINGS_PRELOAD_PAGES_NO_PRELOADING_TITLE},
+      {"preloadingPageNoPreloadingSummary",
+       IDS_SETTINGS_PRELOAD_PAGES_NO_PRELOADING_SUMMARY},
+      {"preloadingPageStandardPreloadingTitle",
+       IDS_SETTINGS_PRELOAD_PAGES_STANDARD_PRELOADING_TITLE},
+      {"preloadingPageStandardPreloadingSummary",
+       IDS_SETTINGS_PRELOAD_PAGES_STANDARD_PRELOADING_SUMMARY},
+      {"preloadingPageStandardPreloadingWhenOnBulletOne",
+       IDS_SETTINGS_PRELOAD_PAGES_STANDARD_PRELOADING_WHEN_ON_BULLET_ONE},
+      {"preloadingPageStandardPreloadingWhenOnBulletTwo",
+       IDS_SETTINGS_PRELOAD_PAGES_STANDARD_PRELOADING_WHEN_ON_BULLET_TWO},
+      {"preloadingPageExtendedPreloadingTitle",
+       IDS_SETTINGS_PRELOAD_PAGES_EXTENDED_PRELOADING_TITLE},
+      {"preloadingPageExtendedPreloadingSummary",
+       IDS_SETTINGS_PRELOAD_PAGES_EXTENDED_PRELOADING_SUMMARY},
+      {"preloadingPageExtendedPreloadingWhenOnBulletOne",
+       IDS_SETTINGS_PRELOAD_PAGES_EXTENDED_PRELOADING_WHEN_ON_BULLET_ONE},
+      {"preloadingPageExtendedPreloadingWhenOnBulletTwo",
+       IDS_SETTINGS_PRELOAD_PAGES_EXTENDED_PRELOADING_WHEN_ON_BULLET_TWO},
+      {"preloadingPageExtendedPreloadingThingsToConsiderBulletTwo",
+       IDS_SETTINGS_PRELOAD_PAGES_EXTENDED_PRELOADING_THINGS_TO_CONSIDER_BULLET_TWO},
+      {"preloadingPageThingsToConsiderBulletOne",
+       IDS_SETTINGS_PRELOAD_PAGES_THINGS_TO_CONSIDER_BULLET_ONE},
 #if BUILDFLAG(IS_CHROMEOS)
-    {"openChromeOSSecureDnsSettingsLabel",
-     IDS_SETTINGS_SECURE_DNS_OPEN_CHROME_OS_SETTINGS_LABEL},
+      {"openChromeOSSecureDnsSettingsLabel",
+       IDS_SETTINGS_SECURE_DNS_OPEN_CHROME_OS_SETTINGS_LABEL},
 #endif
 #if BUILDFLAG(CHROME_ROOT_STORE_SUPPORTED)
-    {"manageDeviceCertificates", IDS_SETTINGS_MANAGE_DEVICE_CERTIFICATES},
-    {"manageDeviceCertificatesDescription",
-     IDS_SETTINGS_MANAGE_DEVICE_CERTIFICATES_DESCRIPTION},
-    {"chromeCertificates", IDS_SETTINGS_CHROME_CERTIFICATES},
-    {"chromeCertificatesDescription",
-     IDS_SETTINGS_CHROME_CERTIFICATES_DESCRIPTION},
+      {"manageDeviceCertificates", IDS_SETTINGS_MANAGE_DEVICE_CERTIFICATES},
+      {"manageDeviceCertificatesDescription",
+       IDS_SETTINGS_MANAGE_DEVICE_CERTIFICATES_DESCRIPTION},
+      {"chromeCertificates", IDS_SETTINGS_CHROME_CERTIFICATES},
+      {"chromeCertificatesDescription",
+       IDS_SETTINGS_CHROME_CERTIFICATES_DESCRIPTION},
 #endif
   };
   html_source->AddLocalizedStrings(kLocalizedStrings);
diff --git a/chrome/browser/ui/webui/settings/settings_ui.cc b/chrome/browser/ui/webui/settings/settings_ui.cc
index 6e2e1772..76a7fb51 100644
--- a/chrome/browser/ui/webui/settings/settings_ui.cc
+++ b/chrome/browser/ui/webui/settings/settings_ui.cc
@@ -379,6 +379,10 @@
                               IsHashRealTimeLookupEligibleInSession());
 
   html_source->AddBoolean(
+      "enableHttpsFirstModeNewSettings",
+      base::FeatureList::IsEnabled(features::kHttpsFirstModeIncognito));
+
+  html_source->AddBoolean(
       "enablePageContentSetting",
       base::FeatureList::IsEnabled(features::kPageContentOptIn) ||
           base::FeatureList::IsEnabled(
diff --git a/chrome/browser/ui/webui/side_panel/read_anything/read_anything_app_browsertest.cc b/chrome/browser/ui/webui/side_panel/read_anything/read_anything_app_browsertest.cc
index 824f1d9..fea6bb2 100644
--- a/chrome/browser/ui/webui/side_panel/read_anything/read_anything_app_browsertest.cc
+++ b/chrome/browser/ui/webui/side_panel/read_anything/read_anything_app_browsertest.cc
@@ -20,7 +20,8 @@
 class ReadAnythingAppTest : public InProcessBrowserTest {
  public:
   ReadAnythingAppTest() {
-    scoped_feature_list_.InitAndEnableFeature(features::kReadAnything);
+    scoped_feature_list_.InitWithFeatures(
+        {features::kReadAnything, features::kReadAnythingLocalSidePanel}, {});
   }
   ~ReadAnythingAppTest() override = default;
   ReadAnythingAppTest(const ReadAnythingAppTest&) = delete;
diff --git a/chrome/browser/web_applications/commands/externally_managed_install_command_browsertest.cc b/chrome/browser/web_applications/commands/externally_managed_install_command_browsertest.cc
index 6c9ce907..dcbc942f 100644
--- a/chrome/browser/web_applications/commands/externally_managed_install_command_browsertest.cc
+++ b/chrome/browser/web_applications/commands/externally_managed_install_command_browsertest.cc
@@ -287,7 +287,7 @@
   provider().scheduler().FetchManifestAndInstall(
       webapps::WebappInstallSource::OMNIBOX_INSTALL_ICON,
       browser()->tab_strip_model()->GetActiveWebContents()->GetWeakPtr(),
-      base::BindOnce(test::TestAcceptDialogCallback),
+      base::BindOnce(test::TestAcceptInstallDialogCallback),
       future_first_install.GetCallback(),
       /*use_fallback=*/false);
 
@@ -323,7 +323,10 @@
   EXPECT_EQ(second_install_code,
             webapps::InstallResultCode::kSuccessNewInstall);
   EXPECT_TRUE(provider().registrar_unsafe().IsLocallyInstalled(second_app_id));
-  EXPECT_EQ(mojom::UserDisplayMode::kBrowser,
+
+  // UserDisplayMode is not updated as it's not a manifest field and policy only
+  // sets a default.
+  EXPECT_EQ(mojom::UserDisplayMode::kStandalone,
             provider()
                 .registrar_unsafe()
                 .GetAppUserDisplayMode(second_app_id)
diff --git a/chrome/browser/web_applications/commands/launch_web_app_command_browsertest.cc b/chrome/browser/web_applications/commands/launch_web_app_command_browsertest.cc
index 530d3ae1..2e3b66d 100644
--- a/chrome/browser/web_applications/commands/launch_web_app_command_browsertest.cc
+++ b/chrome/browser/web_applications/commands/launch_web_app_command_browsertest.cc
@@ -144,7 +144,7 @@
     GetProvider().scheduler().FetchManifestAndInstall(
         webapps::WebappInstallSource::OMNIBOX_INSTALL_ICON,
         browser()->tab_strip_model()->GetActiveWebContents()->GetWeakPtr(),
-        base::BindOnce(test::TestAcceptDialogCallback),
+        base::BindOnce(test::TestAcceptInstallDialogCallback),
         base::BindLambdaForTesting([&](const webapps::AppId& new_app_id,
                                        webapps::InstallResultCode code) {
           EXPECT_EQ(code, webapps::InstallResultCode::kSuccessNewInstall);
diff --git a/chrome/browser/web_applications/manifest_update_manager_browsertest.cc b/chrome/browser/web_applications/manifest_update_manager_browsertest.cc
index 3f193a8..a99e3f3c 100644
--- a/chrome/browser/web_applications/manifest_update_manager_browsertest.cc
+++ b/chrome/browser/web_applications/manifest_update_manager_browsertest.cc
@@ -358,8 +358,6 @@
         &ManifestUpdateManagerBrowserTest::RequestHandlerOverride,
         base::Unretained(this)));
     ASSERT_TRUE(http_server_.Start());
-    // Suppress globally to avoid OS hooks deployed for system web app during
-    // WebAppProvider setup.
     WebAppControllerBrowserTest::SetUp();
   }
 
@@ -483,13 +481,12 @@
     GURL app_url = GetAppURLWithoutManifest();
     EXPECT_TRUE(ui_test_utils::NavigateToURL(browser(), app_url));
 
-    webapps::AppId app_id;
     base::test::TestFuture<const webapps::AppId&, webapps::InstallResultCode>
         install_future;
     GetProvider().scheduler().FetchManifestAndInstall(
         webapps::WebappInstallSource::MENU_CREATE_SHORTCUT,
         browser()->tab_strip_model()->GetActiveWebContents()->GetWeakPtr(),
-        base::BindOnce(test::TestAcceptDialogCallback),
+        base::BindOnce(test::TestAcceptCreateShortcutDialogCallback),
         install_future.GetCallback(),
         /*use_fallback=*/true);
     EXPECT_EQ(install_future.Get<webapps::InstallResultCode>(),
@@ -501,49 +498,43 @@
     GURL app_url = GetAppURL();
     EXPECT_TRUE(ui_test_utils::NavigateToURL(browser(), app_url));
 
-    webapps::AppId app_id;
-    base::RunLoop run_loop;
+    base::test::TestFuture<const webapps::AppId&, webapps::InstallResultCode>
+        install_future;
     GetProvider().scheduler().FetchManifestAndInstall(
         webapps::WebappInstallSource::OMNIBOX_INSTALL_ICON,
         browser()->tab_strip_model()->GetActiveWebContents()->GetWeakPtr(),
-        base::BindOnce(test::TestAcceptDialogCallback),
-        base::BindLambdaForTesting([&](const webapps::AppId& new_app_id,
-                                       webapps::InstallResultCode code) {
-          EXPECT_EQ(code, webapps::InstallResultCode::kSuccessNewInstall);
-          app_id = new_app_id;
-          run_loop.Quit();
-        }),
+        base::BindOnce(test::TestAcceptInstallDialogCallback),
+        install_future.GetCallback(),
         /*use_fallback=*/true);
 
-    run_loop.Run();
-    return app_id;
+    EXPECT_EQ(install_future.Get<webapps::InstallResultCode>(),
+              webapps::InstallResultCode::kSuccessNewInstall);
+    return install_future.Get<webapps::AppId>();
   }
 
   webapps::AppId InstallOemWebApp() {
     const GURL app_url = GetAppURL();
     EXPECT_TRUE(ui_test_utils::NavigateToURL(browser(), app_url));
 
-    webapps::AppId app_id;
-    base::RunLoop run_loop;
+    base::test::TestFuture<const webapps::AppId&, webapps::InstallResultCode>
+        install_future;
     GetProvider().scheduler().FetchManifestAndInstall(
         webapps::WebappInstallSource::PRELOADED_OEM,
         browser()->tab_strip_model()->GetActiveWebContents()->GetWeakPtr(),
-        base::BindOnce(test::TestAcceptDialogCallback),
-        base::BindLambdaForTesting([&](const webapps::AppId& new_app_id,
-                                       webapps::InstallResultCode code) {
-          EXPECT_EQ(code, webapps::InstallResultCode::kSuccessNewInstall);
-          app_id = new_app_id;
-          run_loop.Quit();
-        }),
+        base::BindOnce(test::TestAcceptInstallDialogCallback),
+        install_future.GetCallback(),
         /*use_fallback=*/true);
 
-    run_loop.Run();
-    return app_id;
+    EXPECT_EQ(install_future.Get<webapps::InstallResultCode>(),
+              webapps::InstallResultCode::kSuccessNewInstall);
+    return install_future.Get<webapps::AppId>();
   }
 
   webapps::AppId InstallDefaultApp() {
     const GURL app_url = GetAppURL();
-    base::RunLoop run_loop;
+    base::test::TestFuture<const GURL&,
+                           ExternallyManagedAppManager::InstallResult>
+        install_future;
     ExternalInstallOptions install_options(
         app_url, mojom::UserDisplayMode::kStandalone,
         ExternalInstallSource::kInternalDefault);
@@ -552,16 +543,12 @@
     install_options.add_to_quick_launch_bar = false;
     install_options.install_placeholder = true;
     GetProvider().externally_managed_app_manager().Install(
-        std::move(install_options),
-        base::BindLambdaForTesting(
-            [&](const GURL& installed_app_url,
-                ExternallyManagedAppManager::InstallResult result) {
-              EXPECT_EQ(installed_app_url, app_url);
-              EXPECT_EQ(result.code,
-                        webapps::InstallResultCode::kSuccessNewInstall);
-              run_loop.Quit();
-            }));
-    run_loop.Run();
+        std::move(install_options), install_future.GetCallback());
+
+    EXPECT_EQ(install_future.Get<GURL>(), app_url);
+    EXPECT_EQ(
+        install_future.Get<ExternallyManagedAppManager::InstallResult>().code,
+        webapps::InstallResultCode::kSuccessNewInstall);
     return GetProvider()
         .registrar_unsafe()
         .LookupExternalAppId(app_url)
@@ -570,7 +557,9 @@
 
   webapps::AppId InstallPolicyApp() {
     const GURL app_url = GetAppURL();
-    base::RunLoop run_loop;
+    base::test::TestFuture<const GURL&,
+                           ExternallyManagedAppManager::InstallResult>
+        install_future;
     ExternalInstallOptions install_options(
         app_url, mojom::UserDisplayMode::kStandalone,
         ExternalInstallSource::kExternalPolicy);
@@ -579,16 +568,12 @@
     install_options.add_to_quick_launch_bar = false;
     install_options.install_placeholder = true;
     GetProvider().externally_managed_app_manager().Install(
-        std::move(install_options),
-        base::BindLambdaForTesting(
-            [&](const GURL& installed_app_url,
-                ExternallyManagedAppManager::InstallResult result) {
-              EXPECT_EQ(installed_app_url, app_url);
-              EXPECT_EQ(result.code,
-                        webapps::InstallResultCode::kSuccessNewInstall);
-              run_loop.Quit();
-            }));
-    run_loop.Run();
+        std::move(install_options), install_future.GetCallback());
+
+    EXPECT_EQ(install_future.Get<GURL>(), app_url);
+    EXPECT_EQ(
+        install_future.Get<ExternallyManagedAppManager::InstallResult>().code,
+        webapps::InstallResultCode::kSuccessNewInstall);
     return GetProvider()
         .registrar_unsafe()
         .LookupExternalAppId(app_url)
@@ -597,22 +582,20 @@
 
   webapps::AppId InstallKioskApp() {
     const GURL app_url = GetAppURL();
-    base::RunLoop run_loop;
+    base::test::TestFuture<const GURL&,
+                           ExternallyManagedAppManager::InstallResult>
+        install_future;
     ExternalInstallOptions install_options(app_url,
                                            mojom::UserDisplayMode::kStandalone,
                                            ExternalInstallSource::kKiosk);
     install_options.install_placeholder = true;
     GetProvider().externally_managed_app_manager().Install(
-        std::move(install_options),
-        base::BindLambdaForTesting(
-            [&](const GURL& installed_app_url,
-                ExternallyManagedAppManager::InstallResult result) {
-              EXPECT_EQ(installed_app_url, app_url);
-              EXPECT_EQ(result.code,
-                        webapps::InstallResultCode::kSuccessNewInstall);
-              run_loop.Quit();
-            }));
-    run_loop.Run();
+        std::move(install_options), install_future.GetCallback());
+
+    EXPECT_EQ(install_future.Get<GURL>(), app_url);
+    EXPECT_EQ(
+        install_future.Get<ExternallyManagedAppManager::InstallResult>().code,
+        webapps::InstallResultCode::kSuccessNewInstall);
     return GetProvider()
         .registrar_unsafe()
         .LookupExternalAppId(app_url)
@@ -672,9 +655,14 @@
         .set_time_override_for_testing(time_override);
   }
 
-  ManifestUpdateResult GetResultAfterPageLoad(const GURL& url) {
+  ManifestUpdateResult GetResultAfterPageLoad(
+      const GURL& url,
+      Browser* browser_to_navigate = nullptr) {
     UpdateCheckResultAwaiter awaiter(url);
-    EXPECT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
+    if (!browser_to_navigate) {
+      browser_to_navigate = browser();
+    }
+    EXPECT_TRUE(ui_test_utils::NavigateToURL(browser_to_navigate, url));
     return std::move(awaiter).AwaitNextResult();
   }
 
@@ -763,7 +751,7 @@
 
   webapps::AppId app_id = InstallWebApp();
 
-  EXPECT_EQ(GetResultAfterPageLoad(GURL("http://example.org")),
+  EXPECT_EQ(GetResultAfterPageLoad(GURL("https://example.org")),
             ManifestUpdateResult::kNoAppInScope);
 
   histogram_tester_.ExpectTotalCount(kUpdateHistogramName, 0);
@@ -4565,16 +4553,20 @@
   base::AutoReset<absl::optional<AppIdentityUpdate>> update_dialog_scope =
       SetIdentityUpdateDialogActionForTesting(AppIdentityUpdate::kAllowed);
 
-  // Setup the web app, install it and immediately update the manifest.
+  // Setup the web app, install it, and wait for it to open in a dedicated PWA
+  // window (due to installation as a standalone app).
   OverrideManifest(kManifestTemplate, {"Test app name", kIconList});
+  BrowserWaiter browser_waiter;
   webapps::AppId app_id = InstallWebApp();
+  Browser* web_app_browser = browser_waiter.AwaitAdded();
+
+  // Update the manifest.
   OverrideManifest(kManifestTemplate,
                    {"Different app name", kUpdatedSingleIconList});
 
-  // Navigate to the app in a dedicated PWA window. Note that this opens a
-  // second browser window.
+  // Navigate the app to trigger an update check.
   GURL url = GetAppURL();
-  Browser* web_app_browser = LaunchWebAppBrowserAndWait(app_id);
+  EXPECT_TRUE(ui_test_utils::NavigateToURL(web_app_browser, url));
 
   // Wait for the PWA to a) detect that an update is needed and b) start waiting
   // on its window to close.
@@ -4632,16 +4624,22 @@
       "background_color": "$2"
     }
   )";
+
+  // Setup the web app, install it, and wait for it to open in a dedicated PWA
+  // window (due to installation as a standalone app).
   OverrideManifest(kManifestTemplate, {kInstallableIconList, "blue"});
+  BrowserWaiter browser_waiter;
   webapps::AppId app_id = InstallWebApp();
   EXPECT_EQ(GetProvider().registrar_unsafe().GetAppBackgroundColor(app_id),
             SK_ColorBLUE);
+  Browser* web_app_browser = browser_waiter.AwaitAdded();
+
+  // Update the manifest.
   OverrideManifest(kManifestTemplate, {kInstallableIconList, "red"});
 
-  // Navigate to the app in a dedicated PWA window. Note that this opens a
-  // second browser window.
+  // Navigate the app to trigger an update check.
   GURL url = GetAppURL();
-  Browser* web_app_browser = LaunchWebAppBrowserAndWait(app_id);
+  EXPECT_TRUE(ui_test_utils::NavigateToURL(web_app_browser, url));
 
   // Wait for the PWA to a) detect that an update is needed and b) start waiting
   // on its window to close.
@@ -4954,7 +4952,9 @@
   )";
 
   OverrideManifest(kTabStripManifestTemplate, {kInstallableIconList});
+  BrowserWaiter browser_waiter;
   webapps::AppId app_id = InstallWebApp();
+  Browser* app_browser = browser_waiter.AwaitAdded();
   const WebApp* web_app = GetProvider().registrar_unsafe().GetAppById(app_id);
   EXPECT_TRUE(web_app->tab_strip().has_value());
   EXPECT_EQ(http_server_.GetURL("/new-tab-url"),
@@ -4964,7 +4964,7 @@
 
   OverrideManifest(kTabStripManifestTemplate, {kInstallableIconList});
   EXPECT_EQ(ManifestUpdateResult::kAppUpToDate,
-            GetResultAfterPageLoad(GetAppURL()));
+            GetResultAfterPageLoad(GetAppURL(), app_browser));
   histogram_tester_.ExpectBucketCount(kUpdateHistogramName,
                                       ManifestUpdateResult::kAppUpToDate, 1);
   EXPECT_TRUE(web_app->tab_strip().has_value());
@@ -4986,30 +4986,64 @@
       "tab_strip": {
         "new_tab_button": {
           "url": "$1"
+        },
+        "home_tab": {
+          $2
         }
       },
-      "icons": $2
+      "icons": $3
     }
   )";
 
+  // Install with manifest for a tabbed web app.
   OverrideManifest(kTabStripManifestTemplate,
-                   {"old-relative-url", kInstallableIconList});
+                   {"old-relative-url", "", kInstallableIconList});
+  BrowserWaiter browser_waiter;
   webapps::AppId app_id = InstallWebApp();
   const WebApp* web_app = GetProvider().registrar_unsafe().GetAppById(app_id);
+  // Tabbed app display mode only applies if UserDisplayMode is standalone.
+  ASSERT_TRUE(web_app->user_display_mode().has_value());
+  EXPECT_EQ(web_app->user_display_mode().value(),
+            mojom::UserDisplayMode::kStandalone);
   // URL parsed relative to manifest URL, which is in /banners/.
   EXPECT_TRUE(web_app->tab_strip().has_value());
   EXPECT_EQ(http_server_.GetURL("/banners/old-relative-url"),
             web_app->tab_strip().value().new_tab_button.url);
 
+  // Wait for the app window (from installation) to appear.
+  Browser* web_app_browser = browser_waiter.AwaitAdded();
+  AppBrowserController* app_controller = web_app_browser->app_controller();
+  DCHECK(app_controller);
+  // Check the start URL (ignoring query and ref) is in home tab scope but other
+  // URLs are not.
+  EXPECT_TRUE(app_controller->IsUrlInHomeTabScope(web_app->start_url()));
+  EXPECT_TRUE(app_controller->IsUrlInHomeTabScope(
+      web_app->start_url().Resolve("?query=foo#ref")));
+  EXPECT_FALSE(app_controller->IsUrlInHomeTabScope(
+      web_app->start_url().Resolve("sub/dir")));
+  EXPECT_FALSE(
+      app_controller->IsUrlInHomeTabScope(http_server_.GetURL("/foo/bar")));
+
+  // Update manifest and navigate the app browser to trigger the update.
+  base::test::TestFuture<void> update_applied_future;
+  WebAppBrowserController::SetManifestUpdateAppliedCallbackForTesting(
+      update_applied_future.GetCallback());
+  std::string home_tab_json = R"("scope_patterns": [ {"pathname": "/foo/*"} ])";
   OverrideManifest(kTabStripManifestTemplate,
-                   {"/new-tab-url", kInstallableIconList});
+                   {"/new-tab-url", home_tab_json, kInstallableIconList});
   EXPECT_EQ(ManifestUpdateResult::kAppUpdated,
-            GetResultAfterPageLoad(GetAppURL()));
+            GetResultAfterPageLoad(GetAppURL(), web_app_browser));
   histogram_tester_.ExpectBucketCount(kUpdateHistogramName,
                                       ManifestUpdateResult::kAppUpdated, 1);
   EXPECT_TRUE(web_app->tab_strip().has_value());
   EXPECT_EQ(http_server_.GetURL("/new-tab-url"),
             web_app->tab_strip().value().new_tab_button.url);
+
+  // Check update takes effect on live app window.
+  ASSERT_TRUE(update_applied_future.Wait());
+  EXPECT_TRUE(app_controller->IsUrlInHomeTabScope(web_app->start_url()));
+  EXPECT_TRUE(
+      app_controller->IsUrlInHomeTabScope(http_server_.GetURL("/foo/bar")));
 }
 
 IN_PROC_BROWSER_TEST_F(ManifestUpdateManagerBrowserTest_TabStrip,
@@ -5043,7 +5077,9 @@
   )";
 
   OverrideManifest(kTabStripManifestTemplate, {kInstallableIconList});
+  BrowserWaiter browser_waiter;
   webapps::AppId app_id = InstallWebApp();
+  Browser* app_browser = browser_waiter.AwaitAdded();
   const WebApp* web_app = GetProvider().registrar_unsafe().GetAppById(app_id);
   EXPECT_TRUE(web_app->tab_strip().has_value());
   EXPECT_EQ(http_server_.GetURL("/new-tab-url"),
@@ -5053,7 +5089,7 @@
 
   OverrideManifest(kManifestTemplate, {kInstallableIconList});
   EXPECT_EQ(ManifestUpdateResult::kAppUpdated,
-            GetResultAfterPageLoad(GetAppURL()));
+            GetResultAfterPageLoad(GetAppURL(), app_browser));
   histogram_tester_.ExpectBucketCount(kUpdateHistogramName,
                                       ManifestUpdateResult::kAppUpdated, 1);
   EXPECT_FALSE(web_app->tab_strip().has_value());
diff --git a/chrome/browser/web_applications/test/web_app_test_utils.cc b/chrome/browser/web_applications/test/web_app_test_utils.cc
index b0c78110..060c818 100644
--- a/chrome/browser/web_applications/test/web_app_test_utils.cc
+++ b/chrome/browser/web_applications/test/web_app_test_utils.cc
@@ -956,10 +956,25 @@
   return app;
 }
 
-void TestAcceptDialogCallback(
+void TestAcceptInstallDialogCallback(
     content::WebContents* initiator_web_contents,
     std::unique_ptr<WebAppInstallInfo> web_app_info,
     WebAppInstallationAcceptanceCallback acceptance_callback) {
+  // TODO(crbug.com/1503010): Delete the WebAppInstallDialogCallback callback
+  // entirely and test the prod behavior better.
+  web_app_info->user_display_mode = mojom::UserDisplayMode::kStandalone;
+  base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
+      FROM_HERE, base::BindOnce(std::move(acceptance_callback), true /*accept*/,
+                                std::move(web_app_info)));
+}
+
+void TestAcceptCreateShortcutDialogCallback(
+    content::WebContents* initiator_web_contents,
+    std::unique_ptr<WebAppInstallInfo> web_app_info,
+    WebAppInstallationAcceptanceCallback acceptance_callback) {
+  // TODO(crbug.com/1503010): Delete the WebAppInstallDialogCallback callback
+  // entirely and test the prod behavior better.
+  web_app_info->user_display_mode = mojom::UserDisplayMode::kBrowser;
   base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
       FROM_HERE, base::BindOnce(std::move(acceptance_callback), true /*accept*/,
                                 std::move(web_app_info)));
diff --git a/chrome/browser/web_applications/test/web_app_test_utils.h b/chrome/browser/web_applications/test/web_app_test_utils.h
index cbd38710..1b93dfb9 100644
--- a/chrome/browser/web_applications/test/web_app_test_utils.h
+++ b/chrome/browser/web_applications/test/web_app_test_utils.h
@@ -63,7 +63,14 @@
 };
 std::unique_ptr<WebApp> CreateRandomWebApp(CreateRandomWebAppParams params);
 
-void TestAcceptDialogCallback(
+// Mock dialog for the "install web app" flow.
+void TestAcceptInstallDialogCallback(
+    content::WebContents* initiator_web_contents,
+    std::unique_ptr<WebAppInstallInfo> web_app_info,
+    WebAppInstallationAcceptanceCallback acceptance_callback);
+
+// Mock dialog for the "create shortcut" flow.
+void TestAcceptCreateShortcutDialogCallback(
     content::WebContents* initiator_web_contents,
     std::unique_ptr<WebAppInstallInfo> web_app_info,
     WebAppInstallationAcceptanceCallback acceptance_callback);
diff --git a/chrome/browser/web_applications/web_app_internals_browsertest.cc b/chrome/browser/web_applications/web_app_internals_browsertest.cc
index 4c6958a..689f531 100644
--- a/chrome/browser/web_applications/web_app_internals_browsertest.cc
+++ b/chrome/browser/web_applications/web_app_internals_browsertest.cc
@@ -94,7 +94,7 @@
     GetProvider().scheduler().FetchManifestAndInstall(
         webapps::WebappInstallSource::OMNIBOX_INSTALL_ICON,
         browser()->tab_strip_model()->GetActiveWebContents()->GetWeakPtr(),
-        base::BindOnce(test::TestAcceptDialogCallback),
+        base::BindOnce(test::TestAcceptInstallDialogCallback),
         base::BindLambdaForTesting([&](const webapps::AppId& new_app_id,
                                        webapps::InstallResultCode code) {
           EXPECT_EQ(code, webapps::InstallResultCode::kSuccessNewInstall);
diff --git a/chrome/build/android-arm32.pgo.txt b/chrome/build/android-arm32.pgo.txt
index c28652a..18bb8ce4 100644
--- a/chrome/build/android-arm32.pgo.txt
+++ b/chrome/build/android-arm32.pgo.txt
@@ -1 +1 @@
-chrome-android32-main-1700546273-7daa42f8e4282949d5f27a5080981fee3f6c606a.profdata
+chrome-android32-main-1700611171-475d0cd3e0b8a83bd73f656abaa9a2c35c70453a.profdata
diff --git a/chrome/build/android-arm64.pgo.txt b/chrome/build/android-arm64.pgo.txt
index e3308aac..d33722c 100644
--- a/chrome/build/android-arm64.pgo.txt
+++ b/chrome/build/android-arm64.pgo.txt
@@ -1 +1 @@
-chrome-android64-main-1700567863-ba34b19306575ecd157ba1f4775f1ee4f1704824.profdata
+chrome-android64-main-1700611171-dea4af77064e366db1101e36f96775efe0fb97f3.profdata
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt
index 2c6e66eb..5ccb043 100644
--- a/chrome/build/linux.pgo.txt
+++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@
-chrome-linux-main-1700589473-699e64cd585d8de76223499957338fe3b3cd76a5.profdata
+chrome-linux-main-1700611171-e336a3fa5caa7657627ecf1230488bed60041503.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt
index e24946a..72d95f35 100644
--- a/chrome/build/mac-arm.pgo.txt
+++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@
-chrome-mac-arm-main-1700602376-5f69592d511c0c2613ae7bd03211f2fbef79f706.profdata
+chrome-mac-arm-main-1700625540-9be3bc100a56979893edc5339adcf90244b0f60d.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt
index 921babd..0f7900f 100644
--- a/chrome/build/mac.pgo.txt
+++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@
-chrome-mac-main-1700589473-4bb8a44fbc3d524b42959a36dbf244de4d84a22f.profdata
+chrome-mac-main-1700611171-ce492f81617bdb4c43457f603c7c045a5e38401e.profdata
diff --git a/chrome/build/win-arm64.pgo.txt b/chrome/build/win-arm64.pgo.txt
index 6096cb8..d3b88f0 100644
--- a/chrome/build/win-arm64.pgo.txt
+++ b/chrome/build/win-arm64.pgo.txt
@@ -1 +1 @@
-chrome-win-arm64-main-1700589473-464ebb753a148c706c919678ace67ccf9abcb2f4.profdata
+chrome-win-arm64-main-1700611171-c3eedf60a3f6a1b7d2e36f0d615669172fd4cd0c.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt
index f1a9da8..af2cfd7 100644
--- a/chrome/build/win32.pgo.txt
+++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@
-chrome-win32-main-1700589473-02f6e4d265c29dbdbbcfc2a97b6ca209ff60ab2d.profdata
+chrome-win32-main-1700600341-7b97a5d46936a859de05e5d5f1893a0b0a433d3d.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt
index 06e39fb9..09e1952 100644
--- a/chrome/build/win64.pgo.txt
+++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@
-chrome-win64-main-1700589473-3d65e0bb85a7c516362d9d61a1795442c4008300.profdata
+chrome-win64-main-1700600341-da337938e82150f43a469c93fcfadb863dccd0da.profdata
diff --git a/chrome/common/extensions/api/autotest_private.idl b/chrome/common/extensions/api/autotest_private.idl
index f580c096..338e7b6 100644
--- a/chrome/common/extensions/api/autotest_private.idl
+++ b/chrome/common/extensions/api/autotest_private.idl
@@ -288,6 +288,7 @@
     Unavailable,
     Stopped,
     PreparingForLaunch,
+    WaitingOwnerFetch,
     PreLaunched,
     Starting,
     Running,
diff --git a/chrome/renderer/autofill/form_autofill_browsertest.cc b/chrome/renderer/autofill/form_autofill_browsertest.cc
index 4cbcc99..dd9c185 100644
--- a/chrome/renderer/autofill/form_autofill_browsertest.cc
+++ b/chrome/renderer/autofill/form_autofill_browsertest.cc
@@ -22,6 +22,7 @@
 #include "components/autofill/core/common/autocomplete_parsing_util.h"
 #include "components/autofill/core/common/autofill_data_validation.h"
 #include "components/autofill/core/common/autofill_features.h"
+#include "components/autofill/core/common/field_data_manager.h"
 #include "components/autofill/core/common/form_data.h"
 #include "components/autofill/core/common/form_field_data.h"
 #include "components/autofill/core/common/mojom/autofill_types.mojom-shared.h"
@@ -282,6 +283,14 @@
   return form_cache.UpdateFormCache(*base::MakeRefCounted<FieldDataManager>());
 }
 
+void ApplyFillFormAction(base::span<const FormFieldData> fields,
+                         const blink::WebFormControlElement& initiating_element,
+                         mojom::ActionPersistence action_persistence) {
+  ApplyFormAction(fields, initiating_element, mojom::ActionType::kFill,
+                  action_persistence,
+                  *base::MakeRefCounted<FieldDataManager>());
+}
+
 }  // namespace
 
 class FormAutofillTest : public ChromeRenderViewTest {
@@ -474,8 +483,7 @@
     }
 
     // Autofill the form using the given fill form function.
-    ApplyFormAction(form.fields, input_element, mojom::ActionType::kFill,
-                    action_persistence);
+    ApplyFillFormAction(form.fields, input_element, action_persistence);
 
     // Validate Autofill or Preview results.
     for (size_t i = 0; i < number_of_field_cases; ++i) {
@@ -839,8 +847,8 @@
     form.fields[0].is_autofilled = true;
     form.fields[1].is_autofilled = true;
     form.fields[2].is_autofilled = true;
-    ApplyFormAction(form.fields, input_element, mojom::ActionType::kFill,
-                    mojom::ActionPersistence::kFill);
+    ApplyFillFormAction(form.fields, input_element,
+                        mojom::ActionPersistence::kFill);
 
     // Find the newly-filled form that contains the input element.
     FormData form2;
@@ -926,8 +934,8 @@
     form.fields[0].value = u"Brother";
     form.fields[1].value = u"Jonathan";
     form.fields[2].value = u"brotherj@example.com";
-    ApplyFormAction(form.fields, input_element, mojom::ActionType::kFill,
-                    mojom::ActionPersistence::kFill);
+    ApplyFillFormAction(form.fields, input_element,
+                        mojom::ActionPersistence::kFill);
 
     // Find the newly-filled form that contains the input element.
     FormData form2;
@@ -1005,8 +1013,8 @@
     form.fields[0].value = u"Wyatt";
     form.fields[1].value = u"Earp";
     form.fields[2].value = u"wyatt@example.com";
-    ApplyFormAction(form.fields, input_element, mojom::ActionType::kFill,
-                    mojom::ActionPersistence::kFill);
+    ApplyFillFormAction(form.fields, input_element,
+                        mojom::ActionPersistence::kFill);
 
     // Find the newly-filled form that contains the input element.
     FormData form2;
@@ -1095,8 +1103,8 @@
     form.fields[unowned_offset + 0].is_autofilled = true;
     form.fields[unowned_offset + 1].is_autofilled = true;
     form.fields[unowned_offset + 2].is_autofilled = true;
-    ApplyFormAction(form.fields, input_element, mojom::ActionType::kFill,
-                    mojom::ActionPersistence::kFill);
+    ApplyFillFormAction(form.fields, input_element,
+                        mojom::ActionPersistence::kFill);
 
     // Find the newly-filled form that contains the input element.
     FormData form2;
@@ -1219,15 +1227,15 @@
     form.fields[0].is_autofilled = true;
     form.fields[1].is_autofilled = true;
     form.fields[2].is_autofilled = true;
-    ApplyFormAction(form.fields, input_element, mojom::ActionType::kFill,
-                    mojom::ActionPersistence::kPreview);
+    ApplyFillFormAction(form.fields, input_element,
+                        mojom::ActionPersistence::kPreview);
     // The selection should be set after the second character.
     EXPECT_EQ(2u, input_element.SelectionStart());
     EXPECT_EQ(2u, input_element.SelectionEnd());
 
     // Fill the form.
-    ApplyFormAction(form.fields, input_element, mojom::ActionType::kFill,
-                    mojom::ActionPersistence::kFill);
+    ApplyFillFormAction(form.fields, input_element,
+                        mojom::ActionPersistence::kFill);
 
     // Find the newly-filled form that contains the input element.
     FormData form2;
@@ -1355,15 +1363,15 @@
     form.fields[3].is_autofilled = true;
     form.fields[4].is_autofilled = true;
     form.fields[5].is_autofilled = true;
-    ApplyFormAction(form.fields, input_element, mojom::ActionType::kFill,
-                    mojom::ActionPersistence::kPreview);
+    ApplyFillFormAction(form.fields, input_element,
+                        mojom::ActionPersistence::kPreview);
     // The selection should be set after the fifth character.
     EXPECT_EQ(5u, input_element.SelectionStart());
     EXPECT_EQ(5u, input_element.SelectionEnd());
 
     // Fill the form.
-    ApplyFormAction(form.fields, input_element, mojom::ActionType::kFill,
-                    mojom::ActionPersistence::kFill);
+    ApplyFillFormAction(form.fields, input_element,
+                        mojom::ActionPersistence::kFill);
 
     // Find the newly-filled form that contains the input element.
     FormData form2;
@@ -1514,15 +1522,15 @@
     form.fields[0].is_autofilled = true;
     form.fields[1].is_autofilled = true;
     form.fields[2].is_autofilled = false;
-    ApplyFormAction(form.fields, input_element, mojom::ActionType::kFill,
-                    mojom::ActionPersistence::kPreview);
+    ApplyFillFormAction(form.fields, input_element,
+                        mojom::ActionPersistence::kPreview);
     // The selection should be set after the fifth character.
     EXPECT_EQ(5u, input_element.SelectionStart());
     EXPECT_EQ(5u, input_element.SelectionEnd());
 
     // Fill the form.
-    ApplyFormAction(form.fields, input_element, mojom::ActionType::kFill,
-                    mojom::ActionPersistence::kFill);
+    ApplyFillFormAction(form.fields, input_element,
+                        mojom::ActionPersistence::kFill);
 
     // Find the newly-filled form that contains the input element.
     FormData form2;
@@ -1631,15 +1639,15 @@
     form.fields[0].is_autofilled = true;
     form.fields[1].is_autofilled = true;
     form.fields[2].is_autofilled = true;
-    ApplyFormAction(form.fields, input_element, mojom::ActionType::kFill,
-                    mojom::ActionPersistence::kPreview);
+    ApplyFillFormAction(form.fields, input_element,
+                        mojom::ActionPersistence::kPreview);
     // The selection should be set after the 19th character.
     EXPECT_EQ(19u, input_element.SelectionStart());
     EXPECT_EQ(19u, input_element.SelectionEnd());
 
     // Fill the form.
-    ApplyFormAction(form.fields, input_element, mojom::ActionType::kFill,
-                    mojom::ActionPersistence::kFill);
+    ApplyFillFormAction(form.fields, input_element,
+                        mojom::ActionPersistence::kFill);
 
     // Find the newly-filled form that contains the input element.
     FormData form2;
@@ -1751,15 +1759,15 @@
     form.fields[0].is_autofilled = true;
     form.fields[1].is_autofilled = true;
     form.fields[2].is_autofilled = true;
-    ApplyFormAction(form.fields, input_element, mojom::ActionType::kFill,
-                    mojom::ActionPersistence::kPreview);
+    ApplyFillFormAction(form.fields, input_element,
+                        mojom::ActionPersistence::kPreview);
     // The selection should be set after the 19th character.
     EXPECT_EQ(19u, input_element.SelectionStart());
     EXPECT_EQ(19u, input_element.SelectionEnd());
 
     // Fill the form.
-    ApplyFormAction(form.fields, input_element, mojom::ActionType::kFill,
-                    mojom::ActionPersistence::kFill);
+    ApplyFillFormAction(form.fields, input_element,
+                        mojom::ActionPersistence::kFill);
 
     // Find the newly-filled form that contains the input element.
     FormData form2;
@@ -1845,7 +1853,9 @@
     notenabled.SetValue(WebString::FromUTF8("no clear"));
 
     // Clear the form.
-    EXPECT_TRUE(form_cache.ClearSectionWithElement(firstname));
+    scoped_refptr<FieldDataManager> field_data_manager(new FieldDataManager);
+    EXPECT_TRUE(
+        form_cache.ClearSectionWithElement(firstname, *field_data_manager));
 
     // Verify that the auto-filled attribute has been turned off.
     EXPECT_FALSE(firstname.IsAutofilled());
@@ -1975,7 +1985,9 @@
     city_billing.SetAutofillSection("billing");
 
     // Clear the first (shipping) section.
-    EXPECT_TRUE(form_cache.ClearSectionWithElement(firstname_shipping));
+    scoped_refptr<FieldDataManager> field_data_manager(new FieldDataManager);
+    EXPECT_TRUE(form_cache.ClearSectionWithElement(firstname_shipping,
+                                                   *field_data_manager));
 
     // Verify that the autofilled attribute is false only for the shipping
     // section.
@@ -2063,7 +2075,9 @@
     state.SetAutofillState(WebAutofillState::kAutofilled);
 
     // Clear the form.
-    EXPECT_TRUE(form_cache.ClearSectionWithElement(firstname));
+    scoped_refptr<FieldDataManager> field_data_manager(new FieldDataManager);
+    EXPECT_TRUE(
+        form_cache.ClearSectionWithElement(firstname, *field_data_manager));
 
     // Verify that the auto-filled attribute has been turned off.
     EXPECT_FALSE(firstname.IsAutofilled());
@@ -2284,7 +2298,9 @@
     phone.SetAutofillState(WebAutofillState::kAutofilled);
 
     // Clear the fields.
-    EXPECT_TRUE(form_cache.ClearSectionWithElement(firstname));
+    scoped_refptr<FieldDataManager> field_data_manager(new FieldDataManager);
+    EXPECT_TRUE(
+        form_cache.ClearSectionWithElement(firstname, *field_data_manager));
 
     // Verify only autofilled fields are cleared.
     EXPECT_EQ(u"Wyatt", firstname.Value().Utf16());
@@ -5121,9 +5137,11 @@
     undo_fields.push_back(form.fields[i]);
   }
 
+  scoped_refptr<FieldDataManager> field_data_manager(new FieldDataManager);
+
   form.fields = undo_fields;
   ApplyFormAction(form.fields, text_element_1, mojom::ActionType::kUndo,
-                  mojom::ActionPersistence::kFill);
+                  mojom::ActionPersistence::kFill, *field_data_manager);
   EXPECT_THAT(text_element_1,
               HasAutofillValue("undo_text_1", WebAutofillState::kNotFilled));
   EXPECT_THAT(text_element_2, HasAutofillValue("autofill_text_2",
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 8d648ea4..4b8e44e 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -2536,7 +2536,6 @@
       "../browser/safe_browsing/test_safe_browsing_database_helper.cc",
       "../browser/safe_browsing/test_safe_browsing_database_helper.h",
       "../browser/safe_xml_parser_browsertest.cc",
-      "../browser/search/background/wallpaper_search/wallpaper_search_service_browsertest.cc",
       "../browser/search/ntp_custom_background_enabled_policy_handler_browsertest.cc",
       "../browser/search_engines/template_url_scraper_browsertest.cc",
       "../browser/secure_origin_allowlist_browsertest.cc",
@@ -10012,6 +10011,7 @@
       "../browser/ui/views/user_education/help_bubble_view_timeout_unittest.cc",
       "../browser/ui/views/user_education/views_tutorial_unittest.cc",
       "../browser/ui/views/web_apps/isolated_web_apps/isolated_web_app_installer_view_controller_unittest.cc",
+      "../browser/ui/views/web_apps/view_visible_in_active_widget_notifier_unittest.cc",
       "../browser/ui/window_name_prompt/window_name_prompt_unittest.cc",
     ]
     if (is_linux) {
@@ -10361,6 +10361,7 @@
       "//components/captive_portal/core:buildflags",
       "//components/commerce/core:feature_list",
       "//components/content_settings/core/browser",
+      "//components/custom_handlers:test_support",
       "//components/embedder_support",
       "//components/feature_engagement",
       "//components/feature_engagement/test:test_support",
@@ -11046,7 +11047,10 @@
       ]
       if (enable_pdf) {
         sources += [ "../browser/pdf/pdf_extension_interactive_uitest.cc" ]
-        deps += [ "../browser/pdf:pdf_extension_test_utils" ]
+        deps += [
+          "../browser/pdf:pdf_extension_test_utils",
+          "//pdf:features",
+        ]
       }
       if (is_chromeos) {
         sources += [
diff --git a/chrome/test/DEPS b/chrome/test/DEPS
index 5890a9f..b934fc83 100644
--- a/chrome/test/DEPS
+++ b/chrome/test/DEPS
@@ -21,6 +21,7 @@
   "+components/constrained_window",
   "+components/content_settings/core/browser",
   "+components/contextual_search/core/browser",
+  "+components/custom_handlers",
   "+components/crash/core/app",
   "+components/domain_reliability",
   "+components/download/public/common",
diff --git a/chrome/test/base/in_process_browser_test.cc b/chrome/test/base/in_process_browser_test.cc
index 9d0d64fc..db2cc381 100644
--- a/chrome/test/base/in_process_browser_test.cc
+++ b/chrome/test/base/in_process_browser_test.cc
@@ -33,6 +33,7 @@
 #include "chrome/browser/chrome_browser_main.h"
 #include "chrome/browser/chrome_browser_main_extra_parts.h"
 #include "chrome/browser/chrome_content_browser_client.h"
+#include "chrome/browser/custom_handlers/protocol_handler_registry_factory.h"
 #include "chrome/browser/devtools/devtools_window.h"
 #include "chrome/browser/lifetime/application_lifetime.h"
 #include "chrome/browser/lifetime/application_lifetime_desktop.h"
@@ -75,9 +76,11 @@
 #include "chrome/test/base/testing_browser_process.h"
 #include "chrome/test/base/ui_test_utils.h"
 #include "components/captive_portal/core/buildflags.h"
+#include "components/custom_handlers/test_protocol_handler_registry_delegate.h"
 #include "components/embedder_support/switches.h"
 #include "components/feature_engagement/public/feature_list.h"
 #include "components/google/core/common/google_util.h"
+#include "components/keyed_service/content/browser_context_dependency_manager.h"
 #include "components/os_crypt/sync/os_crypt_mocker.h"
 #include "components/search_engines/search_engine_choice_utils.h"
 #include "content/public/browser/browser_main_parts.h"
@@ -426,6 +429,12 @@
 
   scoped_feature_list_.InitWithFeatures({}, disabled_features);
 
+  create_services_subscription_ =
+      BrowserContextDependencyManager::GetInstance()
+          ->RegisterCreateServicesCallbackForTesting(base::BindRepeating(
+              &InProcessBrowserTest::SetupProtocolHandlerTestFactories,
+              base::Unretained(this)));
+
 #if BUILDFLAG(IS_CHROMEOS_ASH)
   launch_browser_for_testing_ =
       std::make_unique<ash::full_restore::ScopedLaunchBrowserForTesting>();
@@ -999,6 +1008,20 @@
 #endif
 }
 
+void InProcessBrowserTest::SetupProtocolHandlerTestFactories(
+    content::BrowserContext* context) {
+  // Use TestProtocolHandlerRegistryDelegate to prevent OS integration during
+  // the protocol registration process.
+  ProtocolHandlerRegistryFactory::GetInstance()->SetTestingFactory(
+      context, base::BindRepeating([](content::BrowserContext* context)
+                                       -> std::unique_ptr<KeyedService> {
+        return custom_handlers::ProtocolHandlerRegistry::Create(
+            Profile::FromBrowserContext(context)->GetPrefs(),
+            std::make_unique<
+                custom_handlers::TestProtocolHandlerRegistryDelegate>());
+      }));
+}
+
 #if BUILDFLAG(IS_CHROMEOS_LACROS)
 void InProcessBrowserTest::StartUniqueAshChrome(
     const std::vector<std::string>& enabled_features,
diff --git a/chrome/test/base/in_process_browser_test.h b/chrome/test/base/in_process_browser_test.h
index cbd4276..66bd7cd 100644
--- a/chrome/test/base/in_process_browser_test.h
+++ b/chrome/test/base/in_process_browser_test.h
@@ -9,6 +9,7 @@
 #include <memory>
 #include <string>
 
+#include "base/callback_list.h"
 #include "base/files/file_path.h"
 #include "base/files/scoped_temp_dir.h"
 #include "base/memory/raw_ptr.h"
@@ -404,6 +405,12 @@
   // Quits all open browsers and waits until there are no more browsers.
   void QuitBrowsers();
 
+  // This is called to set up the test factories for each browser context.
+  // It ensures that ProtocolHandlerRegistry instances use
+  // TestProtocolHandlerRegistryDelegate, which prevents browser tests
+  // from changing the OS integration of protocols.
+  void SetupProtocolHandlerTestFactories(content::BrowserContext* context);
+
   static SetUpBrowserFunction* global_browser_set_up_function_;
 
   // Usually references the browser created in BrowserMain().
@@ -463,6 +470,9 @@
 
   std::unique_ptr<MainThreadStackSamplingProfiler> sampling_profiler_;
 
+  // Used to set up test factories for each browser context.
+  base::CallbackListSubscription create_services_subscription_;
+
 #if BUILDFLAG(IS_CHROMEOS_ASH)
   // ChromeOS does not create a browser by default when the full restore feature
   // is enabled. However almost all existing browser tests assume a browser is
diff --git a/chrome/test/data/webui/feedback/feedback_test.ts b/chrome/test/data/webui/feedback/feedback_test.ts
index 78fefb71..a5769a1 100644
--- a/chrome/test/data/webui/feedback/feedback_test.ts
+++ b/chrome/test/data/webui/feedback/feedback_test.ts
@@ -4,8 +4,10 @@
 
 import {FeedbackBrowserProxyImpl} from 'chrome://feedback/js/feedback_browser_proxy.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.js';
+import {OpenWindowProxyImpl} from 'chrome://resources/js/open_window_proxy.js';
 import {getRequiredElement} from 'chrome://resources/js/util.js';
-import {assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js';
+import {assertDeepEquals, assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js';
+import {TestOpenWindowProxy} from 'chrome://webui-test/test_open_window_proxy.js';
 import {eventToPromise, isVisible} from 'chrome://webui-test/test_util.js';
 
 import {TestFeedbackBrowserProxy} from './test_feedback_browser_proxy.js';
@@ -47,16 +49,24 @@
 });
 
 suite('AIFeedbackTest', function() {
+  const LOG_ID: string = 'TEST_LOG_ID';
   let browserProxy: TestFeedbackBrowserProxy;
+  let openWindowProxy: TestOpenWindowProxy;
 
   suiteSetup(function() {
     const whenReadyForTesting =
         eventToPromise('ready-for-testing', document.documentElement);
 
+    openWindowProxy = new TestOpenWindowProxy();
+    OpenWindowProxyImpl.setInstance(openWindowProxy);
+
     // Signal to the prod page that test setup steps have completed.
     browserProxy = new TestFeedbackBrowserProxy();
-    browserProxy.setDialogArguments(JSON.stringify(
-        {flow: chrome.feedbackPrivate.FeedbackFlow.AI, categoryTag: 'test'}));
+    browserProxy.setDialogArguments(JSON.stringify({
+      flow: chrome.feedbackPrivate.FeedbackFlow.AI,
+      categoryTag: 'test',
+      aiMetadata: JSON.stringify({log_id: LOG_ID}),
+    }));
     FeedbackBrowserProxyImpl.setInstance(browserProxy);
     window.whenTestSetupDoneResolver.resolve();
 
@@ -71,6 +81,16 @@
     // could leak between tests here.
   });
 
+  function simulateSendReport() {
+    // Make sure description is not empty and send button is not disabled.
+    getRequiredElement<HTMLTextAreaElement>('description-text').value = 'test';
+    const button = getRequiredElement<HTMLButtonElement>('send-report-button');
+    // Send button is being disabled after click in production code, but in
+    // tests we want to be able to click on the button multiple times.
+    button.disabled = false;
+    button.click();
+  }
+
   test('Description', function() {
     assertEquals(
         loadTimeData.getString('freeFormTextAi'),
@@ -85,10 +105,26 @@
   test('OffensiveContainerVisibility', async function() {
     assertTrue(isVisible(getRequiredElement('offensive-container')));
     getRequiredElement('offensive-checkbox').click();
-    getRequiredElement<HTMLTextAreaElement>('description-text').value = 'test';
-    getRequiredElement('send-report-button').click();
+    simulateSendReport();
     const feedbackInfo: chrome.feedbackPrivate.FeedbackInfo =
         await browserProxy.whenCalled('sendFeedback');
     assertTrue(feedbackInfo.isOffensiveOrUnsafe!);
   });
+
+  test('IncludeServerLogs', async function() {
+    assertTrue(isVisible(getRequiredElement('log-id-container')));
+    simulateSendReport();
+    const feedbackInfo: chrome.feedbackPrivate.FeedbackInfo =
+        await browserProxy.whenCalled('sendFeedback');
+    assertDeepEquals({log_id: LOG_ID}, JSON.parse(feedbackInfo.aiMetadata!));
+  });
+
+  test('ExcludeServerLogs', async function() {
+    assertTrue(isVisible(getRequiredElement('log-id-container')));
+    getRequiredElement('log-id-checkbox').click();
+    simulateSendReport();
+    const feedbackInfo: chrome.feedbackPrivate.FeedbackInfo =
+        await browserProxy.whenCalled('sendFeedback');
+    assertEquals(undefined, feedbackInfo.aiMetadata);
+  });
 });
diff --git a/chrome/test/data/webui/settings/security_page_test.ts b/chrome/test/data/webui/settings/security_page_test.ts
index 2e98815..46382cc 100644
--- a/chrome/test/data/webui/settings/security_page_test.ts
+++ b/chrome/test/data/webui/settings/security_page_test.ts
@@ -5,7 +5,7 @@
 // clang-format off
 import {loadTimeData} from 'chrome://resources/js/load_time_data.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {SafeBrowsingSetting, SettingsSecurityPageElement} from 'chrome://settings/lazy_load.js';
+import {HttpsFirstModeSetting, SafeBrowsingSetting, SettingsSecurityPageElement} from 'chrome://settings/lazy_load.js';
 import {HatsBrowserProxyImpl, CrSettingsPrefs, MetricsBrowserProxyImpl, OpenWindowProxyImpl, PrivacyElementInteractions, PrivacyPageBrowserProxyImpl, Router, routes, SafeBrowsingInteractions, SecureDnsMode, SecurityPageInteraction, SettingsPrefsElement, SettingsToggleButtonElement} from 'chrome://settings/settings.js';
 import {assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js';
 import {isChildVisible} from 'chrome://webui-test/test_util.js';
@@ -32,11 +32,17 @@
         value: SafeBrowsingSetting.STANDARD,
       },
       password_leak_detection: {value: false},
-      https_first_mode_enabled: {value: false},
+      https_first_mode_enabled: {
+        type: chrome.settingsPrivate.PrefType.NUMBER,
+        value: HttpsFirstModeSetting.DISABLED,
+      },
     },
     dns_over_https:
         {mode: {value: SecureDnsMode.AUTOMATIC}, templates: {value: ''}},
-    https_only_mode_enabled: {value: false},
+    https_only_mode_enabled: {
+      type: chrome.settingsPrivate.PrefType.NUMBER,
+      value: HttpsFirstModeSetting.DISABLED,
+    },
   };
 }
 
@@ -50,6 +56,7 @@
     loadTimeData.overrideValues({
       enableSecurityKeysSubpage: true,
       showChromeRootStoreCertificates: true,
+      enableHttpsFirstModeNewSettings: true,
     });
   });
 
@@ -112,37 +119,35 @@
     assertFalse(isChildVisible(page, '#security-keys-phones-subpage-trigger'));
   });
 
-  // Tests that toggling the HTTPS-Only Mode setting sets the associated pref.
-  test('httpsOnlyModeToggle', function() {
-    const httpsOnlyModeToggle =
-        page.shadowRoot!.querySelector<HTMLElement>('#httpsOnlyModeToggle')!;
-    assertFalse(page.prefs.generated.https_first_mode_enabled.value);
+  // Tests that changing the HTTPS-First Mode setting sets the associated pref.
+  test('HttpsFirstModeRadioButtons', function() {
+    let radioButton = page.shadowRoot!.querySelector<HTMLElement>(
+        '#httpsFirstModeEnabledFull');
+    assertTrue(!!radioButton);
+    radioButton.click();
+    assertEquals(
+        HttpsFirstModeSetting.ENABLED_FULL,
+        page.getPref('generated.https_first_mode_enabled').value);
 
-    httpsOnlyModeToggle.click();
-    assertTrue(page.prefs.generated.https_first_mode_enabled.value);
+    radioButton = page.shadowRoot!.querySelector<HTMLElement>(
+        '#httpsFirstModeEnabledIncognito');
+    assertTrue(!!radioButton);
+    radioButton.click();
+    assertEquals(
+        HttpsFirstModeSetting.ENABLED_INCOGNITO,
+        page.getPref('generated.https_first_mode_enabled').value);
+
+    radioButton =
+        page.shadowRoot!.querySelector<HTMLElement>('#httpsFirstModeDisabled');
+    assertTrue(!!radioButton);
+    radioButton.click();
+    assertEquals(
+        HttpsFirstModeSetting.DISABLED,
+        page.getPref('generated.https_first_mode_enabled').value);
   });
 
-  test('HttpsOnlyModeSettingSubLabel', function() {
-    const toggle = page.shadowRoot!.querySelector<SettingsToggleButtonElement>(
-        '#httpsOnlyModeToggle');
-    assertTrue(!!toggle);
-    const defaultSubLabel = loadTimeData.getString('httpsOnlyModeDescription');
-    assertEquals(defaultSubLabel, toggle.subLabel);
-
-    page.set('prefs.https_only_mode_enabled.value', false);
-    page.set(
-        'prefs.generated.https_first_mode_enabled.userControlDisabled', true);
-    flush();
-    const lockedSubLabel =
-        loadTimeData.getString('httpsOnlyModeDescriptionAdvancedProtection');
-    assertEquals(lockedSubLabel, toggle.subLabel);
-
-    page.set('prefs.https_only_mode_enabled.value', true);
-    page.set(
-        'prefs.generated.https_first_mode_enabled.userControlDisabled', true);
-    flush();
-    assertEquals(lockedSubLabel, toggle.subLabel);
-  });
+  // TODO(crbug.com/1494186): Add test for alternate sub-label when Advanced
+  // Protection is enabled.
 });
 
 suite('SecurityPageHappinessTrackingSurveys', function() {
@@ -196,6 +201,7 @@
       enableSecurityKeysSubpage: false,
       enableFriendlierSafeBrowsingSettings: false,
       enableHashPrefixRealTimeLookups: false,
+      enableHttpsFirstModeNewSettings: false,
     });
   });
 
@@ -300,6 +306,49 @@
     flush();
     assertEquals(defaultSubLabel, toggle.subLabel);
   });
+
+  // Tests that toggling the HTTPS-Only Mode setting sets the associated pref.
+  test('HttpsOnlyModeToggle', function() {
+    const httpsOnlyModeToggle =
+        page.shadowRoot!.querySelector<HTMLElement>('#httpsOnlyModeToggle');
+    assertTrue(!!httpsOnlyModeToggle);
+
+    assertEquals(
+        HttpsFirstModeSetting.DISABLED,
+        page.getPref('generated.https_first_mode_enabled').value);
+
+    httpsOnlyModeToggle.click();
+    assertEquals(
+        HttpsFirstModeSetting.ENABLED_FULL,
+        page.getPref('generated.https_first_mode_enabled').value);
+  });
+
+  // Tests that the correct Advanced Protection sublabel is used when the
+  // HTTPS-Only Mode setting toggle has user control disabled.
+  test('HttpsOnlyModeSettingSubLabel', function() {
+    const toggle = page.shadowRoot!.querySelector<SettingsToggleButtonElement>(
+        '#httpsOnlyModeToggle');
+    assertTrue(!!toggle);
+    const defaultSubLabel = loadTimeData.getString('httpsOnlyModeDescription');
+    assertEquals(defaultSubLabel, toggle.subLabel);
+
+    page.setPrefValue(
+        'generated.https_first_mode_enabled', HttpsFirstModeSetting.DISABLED);
+    page.set(
+        'prefs.generated.https_first_mode_enabled.userControlDisabled', true);
+    flush();
+    const lockedSubLabel =
+        loadTimeData.getString('httpsOnlyModeDescriptionAdvancedProtection');
+    assertEquals(lockedSubLabel, toggle.subLabel);
+
+    page.setPrefValue(
+        'generated.https_first_mode_enabled',
+        HttpsFirstModeSetting.ENABLED_FULL);
+    page.set(
+        'prefs.generated.https_first_mode_enabled.userControlDisabled', true);
+    flush();
+    assertEquals(lockedSubLabel, toggle.subLabel);
+  });
 });
 
 // Separate test suite for tests specifically related to Safe Browsing controls.
diff --git a/chromeos/ash/components/drivefs/drivefs_auth.cc b/chromeos/ash/components/drivefs/drivefs_auth.cc
index 5db78f8..701a27aa 100644
--- a/chromeos/ash/components/drivefs/drivefs_auth.cc
+++ b/chromeos/ash/components/drivefs/drivefs_auth.cc
@@ -39,24 +39,24 @@
   return token;
 }
 
-void DriveFsAuth::GetAccessToken(
-    bool use_cached,
-    mojom::DriveFsDelegate::GetAccessTokenCallback callback) {
+void DriveFsAuth::GetAccessToken(bool use_cached,
+                                 AccessTokenCallback callback) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (get_access_token_callback_) {
-    std::move(callback).Run(mojom::AccessTokenStatus::kTransientError, "");
+    std::move(callback).Run(mojom::AccessTokenStatus::kTransientError, {});
     return;
   }
 
   const std::string& token = GetOrResetCachedToken(use_cached);
   if (!token.empty()) {
-    std::move(callback).Run(mojom::AccessTokenStatus::kSuccess, token);
+    std::move(callback).Run(mojom::AccessTokenStatus::kSuccess,
+                            mojom::AccessToken::New(token, last_token_expiry_));
     return;
   }
 
   signin::IdentityManager* identity_manager = delegate_->GetIdentityManager();
   if (!identity_manager) {
-    std::move(callback).Run(mojom::AccessTokenStatus::kAuthError, "");
+    std::move(callback).Run(mojom::AccessTokenStatus::kAuthError, {});
     return;
   }
   get_access_token_callback_ = std::move(callback);
@@ -86,12 +86,14 @@
         .Run(error.IsPersistentError()
                  ? mojom::AccessTokenStatus::kAuthError
                  : mojom::AccessTokenStatus::kTransientError,
-             "");
+             {});
     return;
   }
   UpdateCachedToken(access_token_info.token, access_token_info.expiration_time);
   std::move(get_access_token_callback_)
-      .Run(mojom::AccessTokenStatus::kSuccess, access_token_info.token);
+      .Run(mojom::AccessTokenStatus::kSuccess,
+           mojom::AccessToken::New(access_token_info.token,
+                                   access_token_info.expiration_time));
 }
 
 const std::string& DriveFsAuth::GetOrResetCachedToken(bool use_cached) {
@@ -111,7 +113,7 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   access_token_fetcher_.reset();
   std::move(get_access_token_callback_)
-      .Run(mojom::AccessTokenStatus::kTransientError, "");
+      .Run(mojom::AccessTokenStatus::kTransientError, {});
 }
 
 }  // namespace drivefs
diff --git a/chromeos/ash/components/drivefs/drivefs_auth.h b/chromeos/ash/components/drivefs/drivefs_auth.h
index a5f8ef5e..e322082 100644
--- a/chromeos/ash/components/drivefs/drivefs_auth.h
+++ b/chromeos/ash/components/drivefs/drivefs_auth.h
@@ -32,6 +32,9 @@
 
 namespace drivefs {
 
+using AccessTokenCallback =
+    mojom::DriveFsDelegate::GetAccessTokenWithExpiryCallback;
+
 class COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_DRIVEFS) DriveFsAuth {
  public:
   class Delegate {
@@ -75,9 +78,7 @@
 
   absl::optional<std::string> GetCachedAccessToken();
 
-  virtual void GetAccessToken(
-      bool use_cached,
-      mojom::DriveFsDelegate::GetAccessTokenCallback callback);
+  virtual void GetAccessToken(bool use_cached, AccessTokenCallback callback);
 
  private:
   void GotChromeAccessToken(GoogleServiceAuthError error,
@@ -98,8 +99,8 @@
   std::unique_ptr<signin::PrimaryAccountAccessTokenFetcher>
       access_token_fetcher_;
 
-  // Pending callback for an in-flight GetAccessToken request.
-  mojom::DriveFsDelegate::GetAccessTokenCallback get_access_token_callback_;
+  // Pending callback for an in-flight GetAccessToken{WithExpiry} request.
+  AccessTokenCallback get_access_token_callback_;
 
   std::string last_token_;
   base::Time last_token_expiry_;
diff --git a/chromeos/ash/components/drivefs/drivefs_auth_unittest.cc b/chromeos/ash/components/drivefs/drivefs_auth_unittest.cc
index a9bbf7b..5fd0bfe 100644
--- a/chromeos/ash/components/drivefs/drivefs_auth_unittest.cc
+++ b/chromeos/ash/components/drivefs/drivefs_auth_unittest.cc
@@ -112,12 +112,16 @@
 };
 
 TEST_F(DriveFsAuthTest, GetAccessToken_Success) {
+  const base::Time time_now = base::Time::Now();
+  clock_.SetNow(time_now);
   base::RunLoop run_loop;
   auth_->GetAccessToken(
-      false, base::BindLambdaForTesting([&](mojom::AccessTokenStatus status,
-                                            const std::string& token) {
+      false,
+      base::BindLambdaForTesting([&](mojom::AccessTokenStatus status,
+                                     mojom::AccessTokenPtr access_token) {
         EXPECT_EQ(mojom::AccessTokenStatus::kSuccess, status);
-        EXPECT_EQ("auth token", token);
+        EXPECT_EQ("auth token", access_token->token);
+        EXPECT_EQ(time_now + kTokenLifetime, access_token->expiry_time);
         run_loop.Quit();
       }));
   RespondWithAccessToken("auth token");
@@ -127,10 +131,11 @@
 TEST_F(DriveFsAuthTest, GetAccessToken_GetAccessTokenFailure_Permanent) {
   base::RunLoop run_loop;
   auth_->GetAccessToken(
-      false, base::BindLambdaForTesting([&](mojom::AccessTokenStatus status,
-                                            const std::string& token) {
+      false,
+      base::BindLambdaForTesting([&](mojom::AccessTokenStatus status,
+                                     mojom::AccessTokenPtr access_token) {
         EXPECT_EQ(mojom::AccessTokenStatus::kAuthError, status);
-        EXPECT_TRUE(token.empty());
+        EXPECT_TRUE(access_token.is_null());
         run_loop.Quit();
       }));
   RespondWithAuthError(GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS);
@@ -140,10 +145,11 @@
 TEST_F(DriveFsAuthTest, GetAccessToken_GetAccessTokenFailure_Transient) {
   base::RunLoop run_loop;
   auth_->GetAccessToken(
-      false, base::BindLambdaForTesting([&](mojom::AccessTokenStatus status,
-                                            const std::string& token) {
+      false,
+      base::BindLambdaForTesting([&](mojom::AccessTokenStatus status,
+                                     mojom::AccessTokenPtr access_token) {
         EXPECT_EQ(mojom::AccessTokenStatus::kTransientError, status);
-        EXPECT_TRUE(token.empty());
+        EXPECT_TRUE(access_token.is_null());
         run_loop.Quit();
       }));
   RespondWithAuthError(GoogleServiceAuthError::SERVICE_UNAVAILABLE);
@@ -155,7 +161,7 @@
   auto quit_closure = run_loop.QuitClosure();
   auth_->GetAccessToken(
       false, base::BindLambdaForTesting(
-                 [&](mojom::AccessTokenStatus status, const std::string&) {
+                 [&](mojom::AccessTokenStatus status, mojom::AccessTokenPtr) {
                    EXPECT_EQ(mojom::AccessTokenStatus::kTransientError, status);
                    std::move(quit_closure).Run();
                  }));
@@ -169,7 +175,7 @@
   auto quit_closure = run_loop.QuitClosure();
   auth_->GetAccessToken(
       false, base::BindLambdaForTesting(
-                 [&](mojom::AccessTokenStatus status, const std::string&) {
+                 [&](mojom::AccessTokenStatus status, mojom::AccessTokenPtr) {
                    EXPECT_EQ(mojom::AccessTokenStatus::kTransientError, status);
                    std::move(quit_closure).Run();
                  }));
@@ -181,20 +187,25 @@
 }
 
 TEST_F(DriveFsAuthTest, GetAccessToken_ParallelRequests) {
+  const base::Time time_now = base::Time::Now();
+  clock_.SetNow(time_now);
   base::RunLoop run_loop;
   auto quit_closure = run_loop.QuitClosure();
   auth_->GetAccessToken(
-      false, base::BindLambdaForTesting([&](mojom::AccessTokenStatus status,
-                                            const std::string& token) {
+      false,
+      base::BindLambdaForTesting([&](mojom::AccessTokenStatus status,
+                                     mojom::AccessTokenPtr access_token) {
         EXPECT_EQ(mojom::AccessTokenStatus::kSuccess, status);
-        EXPECT_EQ("auth token", token);
+        EXPECT_EQ("auth token", access_token->token);
+        EXPECT_EQ(time_now + kTokenLifetime, access_token->expiry_time);
         std::move(quit_closure).Run();
       }));
   auth_->GetAccessToken(
-      false, base::BindLambdaForTesting([&](mojom::AccessTokenStatus status,
-                                            const std::string& token) {
+      false,
+      base::BindLambdaForTesting([&](mojom::AccessTokenStatus status,
+                                     mojom::AccessTokenPtr access_token) {
         EXPECT_EQ(mojom::AccessTokenStatus::kTransientError, status);
-        EXPECT_TRUE(token.empty());
+        EXPECT_TRUE(access_token.is_null());
       }));
   RespondWithAccessToken("auth token");
   run_loop.Run();
@@ -204,10 +215,11 @@
   for (int i = 0; i < 3; ++i) {
     base::RunLoop run_loop;
     auth_->GetAccessToken(
-        false, base::BindLambdaForTesting([&](mojom::AccessTokenStatus status,
-                                              const std::string& token) {
+        false,
+        base::BindLambdaForTesting([&](mojom::AccessTokenStatus status,
+                                       mojom::AccessTokenPtr access_token) {
           EXPECT_EQ(mojom::AccessTokenStatus::kSuccess, status);
-          EXPECT_EQ("auth token", token);
+          EXPECT_EQ("auth token", access_token->token);
           run_loop.Quit();
         }));
     RespondWithAccessToken("auth token");
@@ -216,10 +228,11 @@
   for (int i = 0; i < 3; ++i) {
     base::RunLoop run_loop;
     auth_->GetAccessToken(
-        false, base::BindLambdaForTesting([&](mojom::AccessTokenStatus status,
-                                              const std::string& token) {
+        false,
+        base::BindLambdaForTesting([&](mojom::AccessTokenStatus status,
+                                       mojom::AccessTokenPtr access_token) {
           EXPECT_EQ(mojom::AccessTokenStatus::kAuthError, status);
-          EXPECT_TRUE(token.empty());
+          EXPECT_TRUE(access_token.is_null());
           run_loop.Quit();
         }));
     RespondWithAuthError(GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS);
@@ -228,46 +241,72 @@
 }
 
 TEST_F(DriveFsAuthTest, Caching) {
-  auth_->GetAccessToken(true, base::BindOnce([](mojom::AccessTokenStatus status,
-                                                const std::string& token) {
-                          EXPECT_EQ(mojom::AccessTokenStatus::kSuccess, status);
-                          EXPECT_EQ("auth token", token);
-                        }));
+  const base::Time time_now = base::Time::Now();
+  clock_.SetNow(time_now);
+  const base::Time expiry_time = time_now + kTokenLifetime;
+  auth_->GetAccessToken(
+      true, base::BindLambdaForTesting(
+                [&expiry_time](mojom::AccessTokenStatus status,
+                               mojom::AccessTokenPtr access_token) {
+                  EXPECT_EQ(mojom::AccessTokenStatus::kSuccess, status);
+                  EXPECT_EQ("auth token", access_token->token);
+                  EXPECT_EQ(expiry_time, access_token->expiry_time);
+                }));
   EXPECT_TRUE(identity_test_env_.IsAccessTokenRequestPending());
   RespondWithAccessToken("auth token");
 
   // Second attempt should reuse already available token.
-  auth_->GetAccessToken(true, base::BindOnce([](mojom::AccessTokenStatus status,
-                                                const std::string& token) {
-                          EXPECT_EQ(mojom::AccessTokenStatus::kSuccess, status);
-                          EXPECT_EQ("auth token", token);
-                        }));
+  auth_->GetAccessToken(
+      true, base::BindLambdaForTesting(
+                [&expiry_time](mojom::AccessTokenStatus status,
+                               mojom::AccessTokenPtr access_token) {
+                  EXPECT_EQ(mojom::AccessTokenStatus::kSuccess, status);
+                  EXPECT_EQ("auth token", access_token->token);
+                  EXPECT_EQ(expiry_time, access_token->expiry_time);
+                }));
   EXPECT_FALSE(identity_test_env_.IsAccessTokenRequestPending());
 }
 
 TEST_F(DriveFsAuthTest, CachedAndNotCached) {
-  auth_->GetAccessToken(true, base::BindOnce([](mojom::AccessTokenStatus status,
-                                                const std::string& token) {
-                          EXPECT_EQ(mojom::AccessTokenStatus::kSuccess, status);
-                          EXPECT_EQ("auth token", token);
-                        }));
+  base::Time time_now = base::Time::Now();
+  clock_.SetNow(time_now);
+  const base::Time expiry_time = time_now + kTokenLifetime;
+  auth_->GetAccessToken(
+      true, base::BindLambdaForTesting(
+                [&expiry_time](mojom::AccessTokenStatus status,
+                               mojom::AccessTokenPtr access_token) {
+                  EXPECT_EQ(mojom::AccessTokenStatus::kSuccess, status);
+                  EXPECT_EQ("auth token", access_token->token);
+                  EXPECT_EQ(expiry_time, access_token->expiry_time);
+                }));
   EXPECT_TRUE(identity_test_env_.IsAccessTokenRequestPending());
   RespondWithAccessToken("auth token");
 
+  // Advance the clock 30 mins, the token should still retain the old expiry
+  // time.
+  clock_.Advance(base::Minutes(30));
+  time_now = time_now + base::Minutes(30);
+
   // Second attempt should reuse already available token.
-  auth_->GetAccessToken(true, base::BindOnce([](mojom::AccessTokenStatus status,
-                                                const std::string& token) {
-                          EXPECT_EQ(mojom::AccessTokenStatus::kSuccess, status);
-                          EXPECT_EQ("auth token", token);
-                        }));
+  auth_->GetAccessToken(
+      true, base::BindLambdaForTesting(
+                [&expiry_time](mojom::AccessTokenStatus status,
+                               mojom::AccessTokenPtr access_token) {
+                  EXPECT_EQ(mojom::AccessTokenStatus::kSuccess, status);
+                  EXPECT_EQ("auth token", access_token->token);
+                  EXPECT_EQ(expiry_time, access_token->expiry_time);
+                }));
   EXPECT_FALSE(identity_test_env_.IsAccessTokenRequestPending());
 
   // Now ask for token explicitly bypassing the cache.
   auth_->GetAccessToken(
-      false, base::BindOnce(
-                 [](mojom::AccessTokenStatus status, const std::string& token) {
+      false, base::BindLambdaForTesting(
+                 [&time_now](mojom::AccessTokenStatus status,
+                             mojom::AccessTokenPtr access_token) {
                    EXPECT_EQ(mojom::AccessTokenStatus::kSuccess, status);
-                   EXPECT_EQ("auth token 2", token);
+                   EXPECT_EQ("auth token 2", access_token->token);
+                   EXPECT_EQ(time_now + kTokenLifetime,
+                             access_token->expiry_time);
                  }));
   EXPECT_TRUE(identity_test_env_.IsAccessTokenRequestPending());
   RespondWithAccessToken("auth token 2");
@@ -275,22 +314,24 @@
 }
 
 TEST_F(DriveFsAuthTest, CacheExpired) {
-  auth_->GetAccessToken(true, base::BindOnce([](mojom::AccessTokenStatus status,
-                                                const std::string& token) {
-                          EXPECT_EQ(mojom::AccessTokenStatus::kSuccess, status);
-                          EXPECT_EQ("auth token", token);
-                        }));
+  auth_->GetAccessToken(
+      true, base::BindLambdaForTesting([](mojom::AccessTokenStatus status,
+                                          mojom::AccessTokenPtr access_token) {
+        EXPECT_EQ(mojom::AccessTokenStatus::kSuccess, status);
+        EXPECT_EQ("auth token", access_token->token);
+      }));
   EXPECT_TRUE(identity_test_env_.IsAccessTokenRequestPending());
   RespondWithAccessToken("auth token");
 
   clock_.Advance(base::Hours(2));
 
   // The token expired so a new one is requested.
-  auth_->GetAccessToken(true, base::BindOnce([](mojom::AccessTokenStatus status,
-                                                const std::string& token) {
-                          EXPECT_EQ(mojom::AccessTokenStatus::kSuccess, status);
-                          EXPECT_EQ("auth token 2", token);
-                        }));
+  auth_->GetAccessToken(
+      true, base::BindLambdaForTesting([](mojom::AccessTokenStatus status,
+                                          mojom::AccessTokenPtr access_token) {
+        EXPECT_EQ(mojom::AccessTokenStatus::kSuccess, status);
+        EXPECT_EQ("auth token 2", access_token->token);
+      }));
   RespondWithAccessToken("auth token 2");
   EXPECT_FALSE(identity_test_env_.IsAccessTokenRequestPending());
 }
diff --git a/chromeos/ash/components/drivefs/drivefs_host.cc b/chromeos/ash/components/drivefs/drivefs_host.cc
index 116af87a..4bbfb74 100644
--- a/chromeos/ash/components/drivefs/drivefs_host.cc
+++ b/chromeos/ash/components/drivefs/drivefs_host.cc
@@ -125,6 +125,27 @@
                       const std::vector<std::string>& scopes,
                       GetAccessTokenCallback callback) override {
     DCHECK_CALLED_ON_VALID_SEQUENCE(host_->sequence_checker_);
+    host_->account_token_delegate_->GetAccessToken(
+        !token_fetch_attempted_,
+        base::BindOnce(
+            [](GetAccessTokenCallback callback, mojom::AccessTokenStatus status,
+               mojom::AccessTokenPtr access_token) {
+              if (status != mojom::AccessTokenStatus::kSuccess) {
+                std::move(callback).Run(status, "");
+                return;
+              }
+              std::move(callback).Run(status, access_token->token);
+            },
+            std::move(callback)));
+    token_fetch_attempted_ = true;
+  }
+
+  void GetAccessTokenWithExpiry(
+      const std::string& client_id,
+      const std::string& app_id,
+      const std::vector<std::string>& scopes,
+      GetAccessTokenWithExpiryCallback callback) override {
+    DCHECK_CALLED_ON_VALID_SEQUENCE(host_->sequence_checker_);
     host_->account_token_delegate_->GetAccessToken(!token_fetch_attempted_,
                                                    std::move(callback));
     token_fetch_attempted_ = true;
diff --git a/chromeos/ash/components/drivefs/drivefs_session_unittest.cc b/chromeos/ash/components/drivefs/drivefs_session_unittest.cc
index 4f10c3e..4745465 100644
--- a/chromeos/ash/components/drivefs/drivefs_session_unittest.cc
+++ b/chromeos/ash/components/drivefs/drivefs_session_unittest.cc
@@ -228,6 +228,11 @@
                       const std::string& app_id,
                       const std::vector<std::string>& scopes,
                       GetAccessTokenCallback callback) override {}
+  void GetAccessTokenWithExpiry(
+      const std::string& client_id,
+      const std::string& app_id,
+      const std::vector<std::string>& scopes,
+      GetAccessTokenWithExpiryCallback callback) override {}
   void OnSyncingStatusUpdate(mojom::SyncingStatusPtr status) override {}
   void OnItemProgress(mojom::ProgressEventPtr item_progress) override {}
   void OnFilesChanged(std::vector<mojom::FileChangePtr> changes) override {}
diff --git a/chromeos/ash/components/drivefs/mojom/drivefs.mojom b/chromeos/ash/components/drivefs/mojom/drivefs.mojom
index 358278ee..995cf78d 100644
--- a/chromeos/ash/components/drivefs/mojom/drivefs.mojom
+++ b/chromeos/ash/components/drivefs/mojom/drivefs.mojom
@@ -266,6 +266,13 @@
   // incompleted state).
   // For more details, see: b/269694669
   OnItemProgress(ProgressEvent progress_event);
+
+  // Get an access token for `client_id` and `app_id` with access to `scopes`.
+  // `access_token` is only valid if the `status` is `kSuccess`.
+  GetAccessTokenWithExpiry(string client_id,
+    string app_id,
+    array<string> scopes) => (AccessTokenStatus status,
+                              AccessToken? access_token);
 };
 
 [Extensible]
@@ -312,6 +319,12 @@
   CSESupport cse_support = kNone;
 };
 
+// The OAuth token in string form along with the time the token expires.
+struct AccessToken {
+  string token;
+  mojo_base.mojom.Time expiry_time;
+};
+
 enum AccessTokenStatus {
   // Getting an access token succeeded.
   kSuccess,
diff --git a/chromeos/ash/components/language_packs/language_pack_manager.cc b/chromeos/ash/components/language_packs/language_pack_manager.cc
index e78c2db..bb6db99 100644
--- a/chromeos/ash/components/language_packs/language_pack_manager.cc
+++ b/chromeos/ash/components/language_packs/language_pack_manager.cc
@@ -290,7 +290,8 @@
           {{kTtsFeatureId, "ne"}, "tts-ne-np-b"},
           {{kTtsFeatureId, "nl"}, "tts-nl-nl-b"},
           {{kTtsFeatureId, "pl"}, "tts-pl-pl-b"},
-          {{kTtsFeatureId, "pt"}, "tts-pt-br-b"},
+          {{kTtsFeatureId, "pt-br"}, "tts-pt-br-b"},
+          {{kTtsFeatureId, "pt-pt"}, "tts-pt-pt-b"},
           {{kTtsFeatureId, "si"}, "tts-si-lk-b"},
           {{kTtsFeatureId, "sk"}, "tts-sk-sk-b"},
           {{kTtsFeatureId, "sv"}, "tts-sv-se-b"},
diff --git a/chromeos/ash/components/language_packs/language_packs_util.cc b/chromeos/ash/components/language_packs/language_packs_util.cc
index 7d407d37..23b16b6b 100644
--- a/chromeos/ash/components/language_packs/language_packs_util.cc
+++ b/chromeos/ash/components/language_packs/language_packs_util.cc
@@ -37,7 +37,9 @@
       base::EqualsCaseInsensitiveASCII(input_locale, "en-gb") ||
       base::EqualsCaseInsensitiveASCII(input_locale, "en-us") ||
       base::EqualsCaseInsensitiveASCII(input_locale, "es-es") ||
-      base::EqualsCaseInsensitiveASCII(input_locale, "es-us")) {
+      base::EqualsCaseInsensitiveASCII(input_locale, "es-us") ||
+      base::EqualsCaseInsensitiveASCII(input_locale, "pt-br") ||
+      base::EqualsCaseInsensitiveASCII(input_locale, "pt-pt")) {
     return base::ToLowerASCII(input_locale);
   }
   return std::string(language::ExtractBaseLanguage(input_locale));
diff --git a/chromeos/ash/components/language_packs/language_packs_util_unittest.cc b/chromeos/ash/components/language_packs/language_packs_util_unittest.cc
index 96a4f13..3c88d3f 100644
--- a/chromeos/ash/components/language_packs/language_packs_util_unittest.cc
+++ b/chromeos/ash/components/language_packs/language_packs_util_unittest.cc
@@ -169,6 +169,10 @@
   EXPECT_EQ(ResolveLocale(kTtsFeatureId, "es-es"), "es-es");
   EXPECT_EQ(ResolveLocale(kTtsFeatureId, "es-US"), "es-us");
   EXPECT_EQ(ResolveLocale(kTtsFeatureId, "es-us"), "es-us");
+  EXPECT_EQ(ResolveLocale(kTtsFeatureId, "pt-BR"), "pt-br");
+  EXPECT_EQ(ResolveLocale(kTtsFeatureId, "pt-br"), "pt-br");
+  EXPECT_EQ(ResolveLocale(kTtsFeatureId, "pt-PT"), "pt-pt");
+  EXPECT_EQ(ResolveLocale(kTtsFeatureId, "pt-pt"), "pt-pt");
 
   // For all other locales we only keep the language.
   EXPECT_EQ(ResolveLocale(kTtsFeatureId, "bn-bd"), "bn");
diff --git a/chromeos/crosapi/mojom/field_trial.mojom b/chromeos/crosapi/mojom/field_trial.mojom
index f6f67e3..5996723 100644
--- a/chromeos/crosapi/mojom/field_trial.mojom
+++ b/chromeos/crosapi/mojom/field_trial.mojom
@@ -9,7 +9,6 @@
 struct FieldTrialGroupInfo {
   string trial_name;
   string group_name;
-  [MinVersion=1] bool? is_overridden;
 };
 
 // Interface for field trial observers. Implemented by lacros-chrome.
diff --git a/chromeos/printing/uri_impl.cc b/chromeos/printing/uri_impl.cc
index 48c9d108..63bf95a 100644
--- a/chromeos/printing/uri_impl.cc
+++ b/chromeos/printing/uri_impl.cc
@@ -105,7 +105,8 @@
     } else {
       // Try to parse UTF-8 character.
       base::StreamingUtf8Validator utf_parser;
-      base::StreamingUtf8Validator::State state = utf_parser.AddBytes(&c, 1);
+      base::StreamingUtf8Validator::State state =
+          utf_parser.AddBytes(base::as_bytes(base::make_span(&c, 1u)));
       if (state != base::StreamingUtf8Validator::State::VALID_MIDPOINT) {
         parser_error_.status = ParserStatus::kDisallowedASCIICharacter;
         return false;
@@ -121,7 +122,7 @@
           parser_error_.status = ParserStatus::kInvalidPercentEncoding;
           return false;
         }
-        state = utf_parser.AddBytes(&c, 1);
+        state = utf_parser.AddBytes(base::as_bytes(base::make_span(&c, 1u)));
         if (state == base::StreamingUtf8Validator::State::INVALID) {
           parser_error_.status = ParserStatus::kInvalidUTF8Character;
           return false;
diff --git a/clank b/clank
index 4c64d76..9d6f2af 160000
--- a/clank
+++ b/clank
@@ -1 +1 @@
-Subproject commit 4c64d76d7fb4c9dcf9928bd978247dd34f8fc0e5
+Subproject commit 9d6f2af52bdf55ec345bd603c28235cc48f91c14
diff --git a/components/autofill/content/renderer/autofill_agent.cc b/components/autofill/content/renderer/autofill_agent.cc
index 9ed10428..94d4cbf7 100644
--- a/components/autofill/content/renderer/autofill_agent.cc
+++ b/components/autofill/content/renderer/autofill_agent.cc
@@ -548,11 +548,9 @@
   // showing up.
   ClearPreviewedForm();
 
-  const auto input_element = element.DynamicTo<WebInputElement>();
-  if (!input_element.IsNull()) {
-    password_autofill_agent_->UpdateStateForTextChange(input_element);
-  }
+  UpdateStateForTextChange(element, FieldPropertiesFlags::kUserTyped);
 
+  const auto input_element = element.DynamicTo<WebInputElement>();
   if (password_generation_agent_ && !input_element.IsNull() &&
       password_generation_agent_->TextDidChangeInTextField(input_element)) {
     is_popup_possibly_visible_ = true;
@@ -698,14 +696,16 @@
   if (action_persistence == mojom::ActionPersistence::kPreview) {
     query_node_autofill_state_ = last_queried_element.GetAutofillState();
     previewed_elements_ = form_util::ApplyFormAction(
-        form.fields, last_queried_element, action_type, action_persistence);
+        form.fields, last_queried_element, action_type, action_persistence,
+        field_data_manager());
   } else {
     was_last_action_fill_ = true;
 
     query_node_autofill_state_ = last_queried_element.GetAutofillState();
     bool filled_some_fields =
         !form_util::ApplyFormAction(form.fields, last_queried_element,
-                                    action_type, action_persistence)
+                                    action_type, action_persistence,
+                                    field_data_manager())
              .empty();
 
     if (!last_queried_element.Form().IsNull()) {
@@ -746,7 +746,8 @@
   if (last_queried_element.IsNull() || !form_cache_) {
     return;
   }
-  form_cache_->ClearSectionWithElement(last_queried_element);
+  form_cache_->ClearSectionWithElement(last_queried_element,
+                                       field_data_manager());
 }
 
 void AutofillAgent::ClearPreviewedForm() {
@@ -1133,11 +1134,10 @@
 
   element.SetAutofillValue(blink::WebString::FromUTF16(value), autofill_state);
 
-  WebInputElement input_element = element.DynamicTo<WebInputElement>();
-  // `input_element` can be null for textarea elements.
-  if (!input_element.IsNull()) {
-    password_autofill_agent_->UpdateStateForTextChange(input_element);
-  }
+  UpdateStateForTextChange(element,
+                           autofill_state == WebAutofillState::kAutofilled
+                               ? FieldPropertiesFlags::kAutofilled
+                               : FieldPropertiesFlags::kUserTyped);
 
   form_tracker_.set_ignore_control_changes(false);
 }
@@ -1654,6 +1654,20 @@
   form_tracker_.TrackAutofilledElement(element);
 }
 
+void AutofillAgent::UpdateStateForTextChange(
+    const WebFormControlElement& element,
+    FieldPropertiesFlags flag) {
+  const auto input_element = element.DynamicTo<WebInputElement>();
+  if (input_element.IsNull() || !input_element.IsTextField()) {
+    return;
+  }
+
+  field_data_manager_->UpdateFieldDataMap(
+      form_util::GetFieldRendererId(element), element.Value().Utf16(), flag);
+
+  password_autofill_agent_->UpdatePasswordStateForTextChange(input_element);
+}
+
 std::optional<FormData> AutofillAgent::GetSubmittedForm() const {
   // Checks whether all elements represented by `element_ids` in `document` have
   // disappeared (removed/hidden).
diff --git a/components/autofill/content/renderer/autofill_agent.h b/components/autofill/content/renderer/autofill_agent.h
index 99251a8d..a88b115 100644
--- a/components/autofill/content/renderer/autofill_agent.h
+++ b/components/autofill/content/renderer/autofill_agent.h
@@ -168,6 +168,13 @@
   // Instructs `form_tracker_` to track the autofilled `element`.
   void TrackAutofilledElement(const blink::WebFormControlElement& element);
 
+  // Function that should be called whenever the value of |element| changes due
+  // to user input. This is separate from OnTextFieldDidChange() as that
+  // function may trigger UI and should only be called when other UI won't be
+  // shown.
+  void UpdateStateForTextChange(const blink::WebFormControlElement& element,
+                                FieldPropertiesFlags flag);
+
   FormTracker* form_tracker_for_testing() { return &form_tracker_; }
 
   bool is_heavy_form_data_scraping_enabled() {
@@ -475,7 +482,8 @@
 
   // Map WebFormControlElement to the pair of:
   // 1) The most recent text that user typed or autofilled in input elements.
-  // Used for storing username/password before JavaScript changes them.
+  // Used for storing credit card number/username/password before JavaScript
+  // changes them.
   // 2) Field properties mask, i.e. whether the field was autofilled, modified
   // by user, etc. (see FieldPropertiesMask).
   scoped_refptr<FieldDataManager> field_data_manager_;
diff --git a/components/autofill/content/renderer/form_autofill_util.cc b/components/autofill/content/renderer/form_autofill_util.cc
index 55e74e84..0625be6 100644
--- a/components/autofill/content/renderer/form_autofill_util.cc
+++ b/components/autofill/content/renderer/form_autofill_util.cc
@@ -1165,7 +1165,8 @@
 // causing the background to be blue.
 void FillFormField(const FormFieldData& data,
                    bool is_initiating_node,
-                   blink::WebFormControlElement* field) {
+                   blink::WebFormControlElement* field,
+                   FieldDataManager& field_data_manager) {
   CHECK(!IsCheckableElement(*field));
   WebInputElement input_element = field->DynamicTo<WebInputElement>();
   WebAutofillState new_autofill_state = data.is_autofilled
@@ -1178,6 +1179,11 @@
     // returns the default maxlength value.
     value = std::move(value).substr(0, input_element.MaxLength());
   }
+
+  if (IsTextInput(input_element)) {
+    field_data_manager.UpdateFieldDataMap(GetFieldRendererId(*field), value,
+                                          FieldPropertiesFlags::kAutofilled);
+  }
   field->SetAutofillValue(blink::WebString::FromUTF16(value),
                           new_autofill_state);
   // Changing the field's value might trigger JavaScript, which is capable of
@@ -1204,7 +1210,8 @@
 // Also sets the "autofilled" attribute, causing the background to be blue.
 void PreviewFormField(const FormFieldData& data,
                       bool is_initiating_node,
-                      blink::WebFormControlElement* field) {
+                      blink::WebFormControlElement* field,
+                      FieldDataManager& field_data_manager) {
   CHECK(!IsCheckableElement(*field));
   // Preview input, textarea and select fields. For input fields, excludes
   // checkboxes and radio buttons, as there is no provision for
@@ -1529,9 +1536,9 @@
   return success;
 }
 
-// Check if a script modified username is suitable for Password Manager to
-// remember.
-bool ScriptModifiedUsernameAcceptable(
+// Returns if a script-modified username or credit card number is suitable to
+// store in Password Manager/Autofill given `typed_value`.
+bool ScriptModifiedUsernameOrCreditCardNumberAcceptable(
     const std::u16string& value,
     const std::u16string& typed_value,
     const FieldDataManager& field_data_manager) {
@@ -1754,6 +1761,10 @@
   return !element.IsNull() && element.IsTextField();
 }
 
+bool IsTextInput(const blink::WebFormControlElement& element) {
+  return IsTextInput(element.DynamicTo<WebInputElement>());
+}
+
 bool IsSelectOrSelectListElement(const WebFormControlElement& element) {
   return IsSelectElement(element) || IsSelectListElement(element);
 }
@@ -1774,8 +1785,7 @@
 }
 
 bool IsTextAreaElementOrTextInput(const WebFormControlElement& element) {
-  return IsTextAreaElement(element) ||
-         IsTextInput(element.DynamicTo<WebInputElement>());
+  return IsTextAreaElement(element) || IsTextInput(element);
 }
 
 bool IsCheckableElement(const WebFormControlElement& element) {
@@ -1864,9 +1874,8 @@
 }
 
 uint64_t GetMaxLength(const blink::WebFormControlElement& element) {
-  if (IsTextInput(element.DynamicTo<WebInputElement>()) ||
-      element.FormControlTypeForAutofill() ==
-          blink::mojom::FormControlType::kTextArea) {
+  if (IsTextInput(element) || element.FormControlTypeForAutofill() ==
+                                  blink::mojom::FormControlType::kTextArea) {
     auto max_length = element.MaxLength();
     static_assert(uint64_t{std::numeric_limits<decltype(max_length)>::max()} <=
                   FormFieldData::kDefaultMaxLength);
@@ -2121,11 +2130,12 @@
         field_data_manager->GetUserInput(GetFieldRendererId(element));
 
     // The typed value is preserved for all passwords. It is also preserved for
-    // potential usernames, as long as the |value| is not deemed acceptable.
+    // potential usernames and credit cards, as long as the |value| is not
+    // deemed acceptable.
     if (field->form_control_type == FormControlType::kInputPassword ||
-        !ScriptModifiedUsernameAcceptable(field->value, user_input,
-                                          *field_data_manager)) {
-      field->user_input = user_input;
+        !ScriptModifiedUsernameOrCreditCardNumberAcceptable(
+            field->value, user_input, *field_data_manager)) {
+      field->user_input = user_input.substr(0, kMaxStringLength);
     }
   }
 }
@@ -2339,7 +2349,8 @@
     base::span<const FormFieldData> fields,
     const WebFormControlElement& initiating_element,
     mojom::ActionType action_type,
-    mojom::ActionPersistence action_persistence) {
+    mojom::ActionPersistence action_persistence,
+    FieldDataManager& field_data_manager) {
   DCHECK(!initiating_element.IsNull());
 
   WebFormElement form_element = GetOwningForm(initiating_element);
@@ -2423,7 +2434,8 @@
           field.value != element.Value().Utf16() ||
           !base::FeatureList::IsEnabled(
               features::kAutofillHighlightOnlyChangedValuesInPreviewMode)) {
-        fill_or_preview(field, is_initiating_element, &element);
+        fill_or_preview(field, is_initiating_element, &element,
+                        field_data_manager);
       }
       continue;
     }
@@ -2449,7 +2461,7 @@
   for (const auto& [filled_element, field_data] :
        autofillable_elements_index_pairs) {
     matching_fields.emplace_back(*filled_element);
-    fill_or_preview(*field_data, false, filled_element);
+    fill_or_preview(*field_data, false, filled_element, field_data_manager);
   }
 
   // A focus event is emitted for the initiating element after autofilling is
diff --git a/components/autofill/content/renderer/form_autofill_util.h b/components/autofill/content/renderer/form_autofill_util.h
index e53b64ad..63f2286 100644
--- a/components/autofill/content/renderer/form_autofill_util.h
+++ b/components/autofill/content/renderer/form_autofill_util.h
@@ -147,6 +147,9 @@
 // Returns true if |element| is a text input element.
 bool IsTextInput(const blink::WebInputElement& element);
 
+// Returns true if |element| is a text input element.
+bool IsTextInput(const blink::WebFormControlElement& element);
+
 // Returns true if `element` is either a select or a selectlist element.
 bool IsSelectOrSelectListElement(const blink::WebFormControlElement& element);
 
@@ -357,7 +360,8 @@
     base::span<const FormFieldData> fields,
     const blink::WebFormControlElement& initiating_element,
     mojom::ActionType action_type,
-    mojom::ActionPersistence action_persistence);
+    mojom::ActionPersistence action_persistence,
+    FieldDataManager& field_data_manager);
 
 // Clears the suggested values in `previewed_elements`.
 // `initiating_element` is the element that initiated the preview operation.
diff --git a/components/autofill/content/renderer/form_cache.cc b/components/autofill/content/renderer/form_cache.cc
index 9ca1226..443c204 100644
--- a/components/autofill/content/renderer/form_cache.cc
+++ b/components/autofill/content/renderer/form_cache.cc
@@ -227,7 +227,8 @@
 }
 
 void FormCache::ClearElement(WebFormControlElement& control_element,
-                             const WebFormControlElement& trigger_element) {
+                             const WebFormControlElement& trigger_element,
+                             FieldDataManager& field_data_manager) {
   // Don't modify the value of disabled fields.
   if (!control_element.IsEnabled())
     return;
@@ -248,10 +249,15 @@
 
   WebInputElement web_input_element =
       control_element.DynamicTo<WebInputElement>();
-  if (form_util::IsTextInput(web_input_element) ||
-      form_util::IsMonthInput(web_input_element)) {
+  bool is_text_input = form_util::IsTextInput(web_input_element);
+  if (is_text_input || form_util::IsMonthInput(web_input_element)) {
     web_input_element.SetAutofillValue(blink::WebString(),
                                        WebAutofillState::kNotFilled);
+    if (is_text_input) {
+      field_data_manager.UpdateFieldDataMap(
+          form_util::GetFieldRendererId(web_input_element), std::u16string(),
+          FieldPropertiesFlags::kNoFlags);
+    }
 
     // Clearing the value in the focused node (above) can cause the selection
     // to be lost. We force the selection range to restore the text cursor.
@@ -281,7 +287,8 @@
   }
 }
 
-bool FormCache::ClearSectionWithElement(const WebFormControlElement& element) {
+bool FormCache::ClearSectionWithElement(const WebFormControlElement& element,
+                                        FieldDataManager& field_data_manager) {
   // The intended behaviour is:
   // * Clear the currently focused element.
   // * Send the blur event.
@@ -300,7 +307,7 @@
   if (control_elements.size() < 2 && control_elements[0].Focused()) {
     // If there is no other field to be cleared, sending the blur event and then
     // the focus event for the currently focused element does not make sense.
-    ClearElement(control_elements[0], element);
+    ClearElement(control_elements[0], element, field_data_manager);
     return true;
   }
 
@@ -308,7 +315,7 @@
   for (WebFormControlElement& control_element : control_elements) {
     if (control_element.Focused()) {
       initially_focused_element = &control_element;
-      ClearElement(control_element, element);
+      ClearElement(control_element, element, field_data_manager);
       // A blur event is emitted for the focused element if it is an initiating
       // element before the clearing happens.
       initially_focused_element->DispatchBlurEvent();
@@ -319,7 +326,7 @@
   for (WebFormControlElement& control_element : control_elements) {
     if (control_element.Focused())
       continue;
-    ClearElement(control_element, element);
+    ClearElement(control_element, element, field_data_manager);
   }
 
   // A focus event is emitted for the initiating element after clearing is
diff --git a/components/autofill/content/renderer/form_cache.h b/components/autofill/content/renderer/form_cache.h
index e49a5c8..a02ff33 100644
--- a/components/autofill/content/renderer/form_cache.h
+++ b/components/autofill/content/renderer/form_cache.h
@@ -89,7 +89,8 @@
 
   // Clears the values of all input elements in the section of the form that
   // contains |element|.  Returns false if the form is not found.
-  bool ClearSectionWithElement(const blink::WebFormControlElement& element);
+  bool ClearSectionWithElement(const blink::WebFormControlElement& element,
+                               FieldDataManager& field_data_manager);
 
   // For each field in the |form|, if |attach_predictions_to_dom| is true, sets
   // the title to include the field's heuristic type, server type, and
@@ -115,7 +116,8 @@
   // |trigger_element| is the element on which the user triggered a request
   // to clear the form.
   void ClearElement(blink::WebFormControlElement& control_element,
-                    const blink::WebFormControlElement& trigger_element);
+                    const blink::WebFormControlElement& trigger_element,
+                    FieldDataManager& field_data_manager);
 
   // Clears all entries from |initial_select_values_| and
   // |initial_checked_state_| whose keys not contained in |ids_to_retain|.
diff --git a/components/autofill/content/renderer/form_cache_browsertest.cc b/components/autofill/content/renderer/form_cache_browsertest.cc
index 6a3bc56..6f885f08 100644
--- a/components/autofill/content/renderer/form_cache_browsertest.cc
+++ b/components/autofill/content/renderer/form_cache_browsertest.cc
@@ -76,20 +76,30 @@
                             base::Unretained(this)));
     scoped_feature_list_.InitAndEnableFeature(
         features::kAutofillEnableSelectList);
+    field_data_manager_ = base::MakeRefCounted<FieldDataManager>();
   }
   ~FormCacheBrowserTest() override = default;
   FormCacheBrowserTest(const FormCacheBrowserTest&) = delete;
   FormCacheBrowserTest& operator=(const FormCacheBrowserTest&) = delete;
 
+  FormCache::UpdateFormCacheResult UpdateFormCache(FormCache& form_cache) {
+    return form_cache.UpdateFormCache(GetFieldDataManager());
+  }
+
  protected:
   std::string GetFocusLog() {
     return focus_test_utils_->GetFocusLog(GetMainFrame()->GetDocument());
   }
 
+  FieldDataManager& GetFieldDataManager() const {
+    return *field_data_manager_.get();
+  }
+
   std::unique_ptr<test::FocusTestUtils> focus_test_utils_;
 
  private:
   base::test::ScopedFeatureList scoped_feature_list_;
+  scoped_refptr<FieldDataManager> field_data_manager_;
 };
 
 TEST_F(FormCacheBrowserTest, UpdatedForms) {
@@ -412,6 +422,7 @@
 // autofill.
 void FillAndCheckState(
     const FormData& form_data,
+    FieldDataManager& field_data_manager,
     const blink::WebFormControlElement& autofill_initiating_element,
     const std::vector<FillElementData>& form_to_fill,
     absl::optional<blink::WebInputElement> checkbox_element = absl::nullopt,
@@ -436,7 +447,8 @@
 
   form_util::ApplyFormAction(values_to_fill.fields, autofill_initiating_element,
                              mojom::ActionType::kFill,
-                             mojom::ActionPersistence::kFill);
+                             mojom::ActionPersistence::kFill,
+                             field_data_manager);
 
   for (const FillElementData& field_to_fill : form_to_fill) {
     EXPECT_EQ(field_to_fill.value, field_to_fill.element.Value().Utf16());
@@ -474,14 +486,14 @@
   auto select_element = GetFormControlElementById(doc, "select");
   auto selectlist_element = GetFormControlElementById(doc, "selectlist");
 
-  FillAndCheckState(forms.updated_forms[0], text,
+  FillAndCheckState(forms.updated_forms[0], GetFieldDataManager(), text,
                     {{text, u"test"},
                      {select_element, u"first"},
                      {selectlist_element, u"uno"}});
 
   // Validate that clearing works, in particular that the previous values
   // were saved correctly.
-  form_cache.ClearSectionWithElement(text);
+  form_cache.ClearSectionWithElement(text, GetFieldDataManager());
 
   EXPECT_EQ("", text.Value().Ascii());
   EXPECT_EQ("second", select_element.Value().Ascii());
@@ -520,10 +532,11 @@
 
   // Simulate filling the form using Autofill.
   form_util::ApplyFormAction(values_to_fill, fname, mojom::ActionType::kFill,
-                             mojom::ActionPersistence::kFill);
+                             mojom::ActionPersistence::kFill,
+                             GetFieldDataManager());
 
   // Simulate clearing the form.
-  form_cache.ClearSectionWithElement(fname);
+  form_cache.ClearSectionWithElement(fname, GetFieldDataManager());
 
   // Expected Result in order:
   // - from filling
diff --git a/components/autofill/content/renderer/password_autofill_agent.cc b/components/autofill/content/renderer/password_autofill_agent.cc
index 6809e88..d37448c3 100644
--- a/components/autofill/content/renderer/password_autofill_agent.cc
+++ b/components/autofill/content/renderer/password_autofill_agent.cc
@@ -769,18 +769,11 @@
   return ShowSuggestions(element, ShowAll(false));
 }
 
-void PasswordAutofillAgent::UpdateStateForTextChange(
+void PasswordAutofillAgent::UpdatePasswordStateForTextChange(
     const WebInputElement& element) {
-  if (!element.IsTextField())
-    return;
   // TODO(crbug.com/415449): Do this through const WebInputElement.
   WebInputElement mutable_element = element;  // We need a non-const.
 
-  const std::u16string element_value = element.Value().Utf16();
-  field_data_manager().UpdateFieldDataMap(
-      form_util::GetFieldRendererId(element), element_value,
-      FieldPropertiesFlags::kUserTyped);
-
   InformBrowserAboutUserInput(element.Form(), element);
 
   if (element.IsPasswordFieldForAutofill()) {
@@ -805,6 +798,7 @@
   // Exclude 1-symbol inputs, as they are unlikely to be usernames and likely
   // to be characters/digits of OTPs.
   // Exclude too large inputs, as they are usually not usernames.
+  const std::u16string element_value = element.Value().Utf16();
   if (element_value.size() == 1 || element_value.size() > 100) {
     return;
   }
diff --git a/components/autofill/content/renderer/password_autofill_agent.h b/components/autofill/content/renderer/password_autofill_agent.h
index a5a768fb..ccc6b2e 100644
--- a/components/autofill/content/renderer/password_autofill_agent.h
+++ b/components/autofill/content/renderer/password_autofill_agent.h
@@ -160,11 +160,9 @@
   // be used for any other autofill activity.
   bool TextDidChangeInTextField(const blink::WebInputElement& element);
 
-  // Function that should be called whenever the value of |element| changes due
-  // to user input. This is separate from TextDidChangeInTextField() as that
-  // function may trigger UI and should only be called when other UI won't be
-  // shown.
-  void UpdateStateForTextChange(const blink::WebInputElement& element);
+  // Called from AutofillAgent::UpdateStateForTextChange() to do
+  // password-manager specific work.
+  void UpdatePasswordStateForTextChange(const blink::WebInputElement& element);
 
   // Instructs `autofill_agent_` to track the autofilled `element`.
   void TrackAutofilledElement(const blink::WebFormControlElement& element);
@@ -252,6 +250,8 @@
     return autofill_agent_->focused_element();
   }
 
+  AutofillAgent& autofill_agent() { return *autofill_agent_; }
+
  private:
   using OnPasswordField = base::StrongAlias<class OnPasswordFieldTag, bool>;
 
diff --git a/components/autofill/content/renderer/password_generation_agent.cc b/components/autofill/content/renderer/password_generation_agent.cc
index 3dd2fb7..fd0b300 100644
--- a/components/autofill/content/renderer/password_generation_agent.cc
+++ b/components/autofill/content/renderer/password_generation_agent.cc
@@ -386,7 +386,8 @@
     // has changed. Without this we will overwrite the generated
     // password with an Autofilled password when saving.
     // https://crbug.com/493455
-    password_agent_->UpdateStateForTextChange(password_element);
+    password_agent_->autofill_agent().UpdateStateForTextChange(
+        password_element, FieldPropertiesFlags::kUserTyped);
   }
 }
 
@@ -629,7 +630,8 @@
     // password fields.
     for (const auto& password_element :
          current_generation_item_->password_elements_) {
-      password_agent_->UpdateStateForTextChange(password_element);
+      password_agent_->autofill_agent().UpdateStateForTextChange(
+          password_element, FieldPropertiesFlags::kUserTyped);
     }
   }
   return true;
diff --git a/components/autofill/core/browser/form_data_importer.cc b/components/autofill/core/browser/form_data_importer.cc
index 65c28cb..c90ec1e 100644
--- a/components/autofill/core/browser/form_data_importer.cc
+++ b/components/autofill/core/browser/form_data_importer.cc
@@ -941,13 +941,10 @@
 
   ServerFieldTypeSet types_seen;
   for (const auto& field : form) {
-    std::u16string value;
-    base::TrimWhitespace(field->value, base::TRIM_ALL, &value);
-
-    // If we don't know the type of the field, or the user hasn't entered any
-    // information into the field, then skip it.
-    if (!field->IsFieldFillable() || value.empty())
+    // If we don't know the type of the field, then skip it.
+    if (!field->IsFieldFillable()) {
       continue;
+    }
 
     AutofillType field_type = field->Type();
     // Field was not identified as a credit card field.
@@ -955,6 +952,25 @@
       continue;
 
     ServerFieldType server_field_type = field_type.GetStorableType();
+
+    std::u16string value_view = field->value;
+    std::u16string_view user_input_view =
+        base::TrimWhitespace(field->user_input, base::TRIM_ALL);
+    if (base::FeatureList::IsEnabled(
+            features::kAutofillUseTypedCreditCardNumber) &&
+        server_field_type == ServerFieldType::CREDIT_CARD_NUMBER &&
+        !user_input_view.empty()) {
+      value_view = user_input_view;
+    }
+    value_view = base::TrimWhitespace(value_view, base::TRIM_ALL);
+
+    // If the user hasn't entered any information into the field, then skip it.
+    if (value_view.empty()) {
+      continue;
+    }
+
+    std::u16string value = value_view;
+
     result.has_duplicate_credit_card_field_type |=
         types_seen.contains(server_field_type);
     types_seen.insert(server_field_type);
diff --git a/components/autofill/core/browser/form_data_importer_unittest.cc b/components/autofill/core/browser/form_data_importer_unittest.cc
index 9f876b7ab..d2f8a1f0 100644
--- a/components/autofill/core/browser/form_data_importer_unittest.cc
+++ b/components/autofill/core/browser/form_data_importer_unittest.cc
@@ -1800,6 +1800,41 @@
   ASSERT_EQ(0U, personal_data_manager_->GetCreditCards().size());
 }
 
+// Tests that FormFieldData::user_input is preferred over FormFieldData::value
+// for credit card numbers.
+// Using FormFieldData::user_input enables showing the save-card prompt for
+// sites which use JavaScript to set the credit-card <input> to '***'.
+TEST_F(FormDataImporterTest,
+       ExtractCreditCard_PreferUserInputForCreditCardNumber) {
+  FormData form = CreateFullCreditCardForm("Jim Johansen", "4111111111111111",
+                                           "02", "2999");
+
+  FormFieldData* card_number_field = form.FindFieldByName(u"card_number");
+  ASSERT_TRUE(card_number_field != nullptr);
+  card_number_field->user_input = u"4444333322221111";
+
+  // FormFieldData::user_input for non-credit card fields should be ignored.
+  ASSERT_EQ(nullptr, form.FindFieldByName(u"cvc"));
+  FormFieldData cvc_field =
+      CreateTestFormField("CVC", "cvc", "001", FormControlType::kInputText);
+  cvc_field.user_input = u"002";
+  form.fields.push_back(cvc_field);
+
+  FormStructure form_structure(form);
+  form_structure.DetermineHeuristicTypes(GeoIpCountryCode(""), nullptr,
+                                         nullptr);
+  absl::optional<CreditCard> extracted_credit_card =
+      ExtractCreditCard(form_structure);
+  EXPECT_TRUE(extracted_credit_card);
+
+  personal_data_manager_->OnAcceptedLocalCreditCardSave(*extracted_credit_card);
+
+  CreditCard expected = test::CreateCreditCardWithInfo(
+      "Jim Johansen", "4444333322221111", "02", "2999", "", u"001");
+  EXPECT_THAT(personal_data_manager_->GetCreditCards(),
+              UnorderedElementsCompareEqual(expected));
+}
+
 // Tests that a credit card with an empty expiration can be extracted due to the
 // expiration date fix flow.
 TEST_F(FormDataImporterTest,
diff --git a/components/autofill/core/common/autofill_features.cc b/components/autofill/core/common/autofill_features.cc
index b57f3a0..ad68c54 100644
--- a/components/autofill/core/common/autofill_features.cc
+++ b/components/autofill/core/common/autofill_features.cc
@@ -649,6 +649,12 @@
 const base::FeatureParam<bool> kAutofillSectioningModeExpand{
     &kAutofillUseParameterizedSectioning, "expand_assigned_sections", false};
 
+// Whether to favor credit card number that user typed into input field vs
+// input field value (which was potentially modified via JavaScript).
+BASE_FEATURE(kAutofillUseTypedCreditCardNumber,
+             "AutofillUseTypedCreditCardNumber",
+             base::FEATURE_ENABLED_BY_DEFAULT);
+
 // Controls an ablation study in which autofill for addresses and payment data
 // can be suppressed.
 BASE_FEATURE(kAutofillEnableAblationStudy,
diff --git a/components/autofill/core/common/autofill_features.h b/components/autofill/core/common/autofill_features.h
index 4e7fbfcc..6e5a0b0 100644
--- a/components/autofill/core/common/autofill_features.h
+++ b/components/autofill/core/common/autofill_features.h
@@ -212,6 +212,8 @@
 COMPONENT_EXPORT(AUTOFILL)
 BASE_DECLARE_FEATURE(kAutofillUseParameterizedSectioning);
 COMPONENT_EXPORT(AUTOFILL)
+BASE_DECLARE_FEATURE(kAutofillUseTypedCreditCardNumber);
+COMPONENT_EXPORT(AUTOFILL)
 extern const base::FeatureParam<bool> kAutofillSectioningModeIgnoreAutocomplete;
 COMPONENT_EXPORT(AUTOFILL)
 extern const base::FeatureParam<bool> kAutofillSectioningModeCreateGaps;
diff --git a/components/autofill/core/common/form_field_data.h b/components/autofill/core/common/form_field_data.h
index 6d4c73d..693dc0b 100644
--- a/components/autofill/core/common/form_field_data.h
+++ b/components/autofill/core/common/form_field_data.h
@@ -350,8 +350,8 @@
   // serialised for storage.
   bool is_enabled = false;
   bool is_readonly = false;
-  // Contains value that was either manually typed or autofilled on user
-  // trigger.
+  // Contains password, username or credit card number value that was either
+  // manually typed or autofilled on user trigger into a text-mode input field.
   std::u16string user_input;
 
   // The options of a select box.
diff --git a/components/exo/wayland/server.cc b/components/exo/wayland/server.cc
index 404ba9ae..a13734130 100644
--- a/components/exo/wayland/server.cc
+++ b/components/exo/wayland/server.cc
@@ -40,7 +40,6 @@
 #include <utility>
 
 #include "ash/constants/ash_features.h"
-#include "ash/shell.h"
 #include "base/command_line.h"
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
@@ -262,7 +261,6 @@
 
   wl_display_.reset(wl_display_create());
   SetSecurityDelegate(wl_display_.get(), security_delegate_.get());
-  display_manager_observation_.Observe(ash::Shell::Get()->display_manager());
 
   client_tracker_ = std::make_unique<ClientTracker>(wl_display_.get());
 }
@@ -291,10 +289,9 @@
                    kZAuraOutputManagerVersion, this, bind_aura_output_manager);
   wl_global_create(wl_display_.get(), &wl_subcompositor_interface,
                    /*version=*/1, display_, bind_subcompositor);
-  OnDidProcessDisplayChanges(
-      {ash::Shell::Get()->display_manager()->active_display_list(),
-       Displays(),
-       {}});
+  for (const auto& display : display::Screen::GetScreen()->GetAllDisplays()) {
+    OnDisplayAdded(display);
+  }
   wl_global_create(wl_display_.get(), &zcr_vsync_feedback_v1_interface,
                    /*version=*/1, display_, bind_vsync_feedback);
 
@@ -501,35 +498,21 @@
   wl_display_flush_clients(wl_display_.get());
 }
 
-void Server::OnDidProcessDisplayChanges(
-    const DisplayConfigurationChange& configuration_change) {
-  // Process added displays before removed displays to ensure exo does not leave
-  // clients in a temporary state where no outputs are present.
-  for (const display::Display& added_display :
-       configuration_change.added_displays) {
-    auto output = std::make_unique<WaylandDisplayOutput>(added_display.id());
-    output->set_global(wl_global_create(wl_display_.get(), &wl_output_interface,
-                                        kWlOutputVersion, output.get(),
-                                        bind_output));
-    CHECK_EQ(outputs_.count(added_display.id()), 0u);
-    outputs_.insert(std::make_pair(added_display.id(), std::move(output)));
-  }
+void Server::OnDisplayAdded(const display::Display& new_display) {
+  auto output = std::make_unique<WaylandDisplayOutput>(new_display.id());
+  output->set_global(wl_global_create(wl_display_.get(), &wl_output_interface,
+                                      kWlOutputVersion, output.get(),
+                                      bind_output));
+  DCHECK_EQ(outputs_.count(new_display.id()), 0u);
+  outputs_.insert(std::make_pair(new_display.id(), std::move(output)));
+}
 
-  for (const display::Display& removed_display :
-       configuration_change.removed_displays) {
-    // There should always be at least one display tracked by Exo.
-    CHECK(outputs_.size() > 1);
-    CHECK_EQ(outputs_.count(removed_display.id()), 1u);
-    std::unique_ptr<WaylandDisplayOutput> output =
-        std::move(outputs_[removed_display.id()]);
-    outputs_.erase(removed_display.id());
-    output.release()->OnDisplayRemoved();
-  }
-
-  // Flush updated outputs to clients immediately.
-  // TODO(crbug.com/1502682): Exo should be updated to automatically flush
-  // buffers at the end of task processing if necessary.
-  Flush();
+void Server::OnDisplayRemoved(const display::Display& old_display) {
+  DCHECK_EQ(outputs_.count(old_display.id()), 1u);
+  std::unique_ptr<WaylandDisplayOutput> output =
+      std::move(outputs_[old_display.id()]);
+  outputs_.erase(old_display.id());
+  output.release()->OnDisplayRemoved();
 }
 
 wl_resource* Server::GetOutputResource(wl_client* client, int64_t display_id) {
diff --git a/components/exo/wayland/server.h b/components/exo/wayland/server.h
index 1d280a9..2ba3507 100644
--- a/components/exo/wayland/server.h
+++ b/components/exo/wayland/server.h
@@ -14,11 +14,9 @@
 #include "base/files/scoped_temp_dir.h"
 #include "base/functional/callback.h"
 #include "base/memory/raw_ptr.h"
-#include "base/scoped_observation.h"
 #include "base/time/time.h"
 #include "components/exo/wayland/scoped_wl.h"
-#include "ui/display/manager/display_manager.h"
-#include "ui/display/manager/display_manager_observer.h"
+#include "ui/display/display_observer.h"
 
 struct wl_resource;
 struct wl_client;
@@ -46,7 +44,7 @@
 
 // This class is a thin wrapper around a Wayland display server. All Wayland
 // requests are dispatched into the given Exosphere display.
-class Server : public display::DisplayManagerObserver {
+class Server : public display::DisplayObserver {
  public:
   using ServerGetter = base::RepeatingCallback<Server*(wl_display*)>;
   using StartCallback = base::OnceCallback<void(bool)>;
@@ -96,9 +94,9 @@
   // Send all buffered events to the clients.
   void Flush();
 
-  // display::DisplayManagerObserver:
-  void OnDidProcessDisplayChanges(
-      const DisplayConfigurationChange& configuration_change) override;
+  // Overridden from display::DisplayObserver:
+  void OnDisplayAdded(const display::Display& new_display) override;
+  void OnDisplayRemoved(const display::Display& old_display) override;
 
   wl_resource* GetOutputResource(wl_client* client, int64_t display_id);
 
@@ -131,6 +129,7 @@
   base::flat_map<int64_t, std::unique_ptr<WaylandDisplayOutput>> outputs_;
   std::unique_ptr<WaylandDataDeviceManager> data_device_manager_data_;
   std::unique_ptr<WaylandSeat> seat_data_;
+  display::ScopedDisplayObserver display_observer_{this};
   std::unique_ptr<wayland::WaylandWatcher> wayland_watcher_;
   std::unique_ptr<WaylandDmabufFeedbackManager> wayland_feedback_manager_;
 
@@ -141,10 +140,6 @@
   std::unique_ptr<WaylandRemoteShellData> remote_shell_data_;
   std::unique_ptr<UiControls> ui_controls_holder_;
   std::unique_ptr<ClientTracker> client_tracker_;
-
-  base::ScopedObservation<display::DisplayManager,
-                          display::DisplayManagerObserver>
-      display_manager_observation_{this};
 };
 
 }  // namespace wayland
diff --git a/components/exo/wayland/wayland_display_output_unittest.cc b/components/exo/wayland/wayland_display_output_unittest.cc
index 331ecaf..85d4960 100644
--- a/components/exo/wayland/wayland_display_output_unittest.cc
+++ b/components/exo/wayland/wayland_display_output_unittest.cc
@@ -124,25 +124,4 @@
                                     WaylandDisplayOutput::kDeleteRetries);
 }
 
-// Tests to ensure exo processes added displays before removed displays for
-// display configuration updates. This ensures exo's clients always see a valid
-// Output during such configuration updates.
-// TODO(1503560) Test consistently fails on builder Linux Chromium OS ASan LSan
-// Tests.
-#if defined(LEAK_SANITIZER) && defined(ADDRESS_SANITIZER)
-#define MAYBE_MaintainsNonEmptyOutputList DISABLED_MaintainsNonEmptyOutputList
-#else
-#define MAYBE_MaintainsNonEmptyOutputList MaintainsNonEmptyOutputList
-#endif
-TEST_F(WaylandDisplayOutputTest, MAYBE_MaintainsNonEmptyOutputList) {
-  // Start with 2 displays.
-  UpdateDisplay("300x400,500x600");
-
-  // Update to a new display configuration. The total global Outputs maintained
-  // by exo should remain non-zero while processing the change (exo will CHECK
-  // crash if it enters a zero output state).
-  UpdateDisplay("700x800,900x1000", /*from_native_platform=*/false,
-                /*generate_new_ids=*/true);
-}
-
 }  // namespace exo::wayland
diff --git a/components/feedback/feedback_common.cc b/components/feedback/feedback_common.cc
index d1cbf385..4321ab5 100644
--- a/components/feedback/feedback_common.cc
+++ b/components/feedback/feedback_common.cc
@@ -7,8 +7,10 @@
 #include <utility>
 
 #include "base/files/file_path.h"
+#include "base/json/json_reader.h"
 #include "base/memory/ptr_util.h"
 #include "base/ranges/algorithm.h"
+#include "base/values.h"
 #include "build/chromeos_buildflags.h"
 #include "components/feedback/feedback_report.h"
 #include "components/feedback/feedback_util.h"
@@ -219,6 +221,15 @@
     AddFeedbackData(feedback_data, kIsOffensiveOrUnsafeKey,
                     is_offensive_or_unsafe_.value() ? "true" : "false");
   }
+  if (!ai_metadata_.empty()) {
+    // Add feedback data for each key/value pair.
+    absl::optional<base::Value::Dict> dict =
+        base::JSONReader::ReadDict(ai_metadata_);
+    CHECK(dict);
+    for (auto pair : dict.value()) {
+      AddFeedbackData(feedback_data, pair.first, pair.second.GetString());
+    }
+  }
 }
 
 void FeedbackCommon::RedactDescription(redaction::RedactionTool& redactor) {
diff --git a/components/feedback/feedback_common.h b/components/feedback/feedback_common.h
index 7a49a844..c550afc 100644
--- a/components/feedback/feedback_common.h
+++ b/components/feedback/feedback_common.h
@@ -78,6 +78,7 @@
   const absl::optional<bool>& is_offensive_or_unsafe() {
     return is_offensive_or_unsafe_;
   }
+  std::string& ai_metadata() { return ai_metadata_; }
 
   const AttachedFile* attachment(size_t i) const { return &attachments_[i]; }
   size_t attachments() const { return attachments_.size(); }
@@ -113,6 +114,7 @@
   void set_is_offensive_or_unsafe(const absl::optional<bool>& value) {
     is_offensive_or_unsafe_ = value;
   }
+  void set_ai_metadata(const std::string& value) { ai_metadata_ = value; }
 
  protected:
   virtual ~FeedbackCommon();
@@ -147,6 +149,7 @@
   std::string autofill_metadata_;
   bool include_chrome_platform_ = true;
   absl::optional<bool> is_offensive_or_unsafe_;
+  std::string ai_metadata_;
 
   std::string image_;
 
diff --git a/components/feedback/feedback_common_unittest.cc b/components/feedback/feedback_common_unittest.cc
index 0c9892d9..59db5fd5 100644
--- a/components/feedback/feedback_common_unittest.cc
+++ b/components/feedback/feedback_common_unittest.cc
@@ -128,3 +128,22 @@
   EXPECT_FALSE(FeedbackCommon::IncludeInSystemLogs(
       feedback::FeedbackReport::kAllCrashReportIdsKey, google_email));
 }
+
+TEST_F(FeedbackCommonTest, IsOffensiveOrUnsafe) {
+  feedback_->set_is_offensive_or_unsafe(true);
+  feedback_->PrepareReport(&report_);
+
+  EXPECT_EQ(1, report_.web_data().product_specific_data_size());
+  EXPECT_EQ("is_offensive_or_unsafe",
+            report_.web_data().product_specific_data(0).key());
+  EXPECT_EQ("true", report_.web_data().product_specific_data(0).value());
+}
+
+TEST_F(FeedbackCommonTest, AiMetadata) {
+  feedback_->set_ai_metadata("{\"log_id\":\"TEST_ID\"}");
+  feedback_->PrepareReport(&report_);
+
+  EXPECT_EQ(1, report_.web_data().product_specific_data_size());
+  EXPECT_EQ("log_id", report_.web_data().product_specific_data(0).key());
+  EXPECT_EQ("TEST_ID", report_.web_data().product_specific_data(0).value());
+}
diff --git a/components/ml/webnn/graph_validation_utils.cc b/components/ml/webnn/graph_validation_utils.cc
index ec38fbd..b14c70c 100644
--- a/components/ml/webnn/graph_validation_utils.cc
+++ b/components/ml/webnn/graph_validation_utils.cc
@@ -278,7 +278,8 @@
           "The bias shape should be [%u].", output_info.channels));
     }
     if (attributes.bias_operand->data_type != input.data_type) {
-      return base::unexpected("The bias type doesn't match input type.");
+      return base::unexpected(
+          "The bias data type doesn't match input data type.");
     }
   }
 
@@ -361,10 +362,10 @@
   if (input.dimensions.size() != 2) {
     return base::unexpected("The input must be a 2-D tensor.");
   }
-  // The input type must be one of the floating point types.
+  // The input data type must be one of the floating point types.
   if (!IsFloatingPointType(input.data_type)) {
     return base::unexpected(
-        "The input type must be one of the floating point types.");
+        "The input data type must be one of the floating point types.");
   }
   // The output tensor of softmax is the same shape as the input tensor.
   return Operand(input.data_type, std::move(input.dimensions));
@@ -552,7 +553,8 @@
   }
   // Validate filter operand.
   if (filter.data_type != input.data_type) {
-    return base::unexpected("The filter type doesn't match the input type.");
+    return base::unexpected(
+        "The filter data type doesn't match the input data type.");
   }
   const auto filter_shape = filter.dimensions;
   if (filter_shape.size() != 4) {
@@ -641,7 +643,8 @@
   }
   // Validate filter operand.
   if (filter.data_type != input.data_type) {
-    return base::unexpected("The filter type doesn't match the input type.");
+    return base::unexpected(
+        "The filter data type doesn't match the input data type.");
   }
   const auto filter_shape = filter.dimensions;
   if (filter_shape.size() != 4) {
@@ -794,7 +797,7 @@
     const Operand& a,
     const Operand& b) {
   if (a.data_type != b.data_type) {
-    return base::unexpected("The types of first two inputs don't match.");
+    return base::unexpected("The data types of first two inputs don't match.");
   }
 
   std::vector<uint32_t> a_dimensions = a.dimensions;
@@ -1071,7 +1074,7 @@
     const Operand& b,
     const GemmAttributes& attributes) {
   if (a.data_type != b.data_type) {
-    return base::unexpected("The types of first two inputs don't match.");
+    return base::unexpected("The data types of first two inputs don't match.");
   }
   // According to WebNN spec:
   // https://www.w3.org/TR/webnn/#api-mlgraphbuilder-gemm, the first input 2-D
@@ -1109,7 +1112,7 @@
   if (attributes.c_operand) {
     if (attributes.c_operand->data_type != a.data_type) {
       return base::unexpected(
-          "The third input type doesn't match other inputs' type.");
+          "The third input data type doesn't match other inputs' data type.");
     }
     const auto shape_c = attributes.c_operand->dimensions;
     if (shape_c.size() > 2) {
@@ -1148,7 +1151,7 @@
   // The loop skips the first input to avoid repeated checks.
   for (size_t i = 1; i < inputs.size(); ++i) {
     if (inputs[i].data_type != output_type) {
-      return base::unexpected("The input types don't match.");
+      return base::unexpected("The input data types don't match.");
     }
     // According to WebNN spec:
     // https://www.w3.org/TR/webnn/#api-mlgraphbuilder-concat, all input tensors
@@ -1192,11 +1195,12 @@
     const Operand& slope) {
   if (input.data_type != slope.data_type) {
     return base::unexpected(
-        "The type of slope doesn't match the type of input.");
+        "The data type of slope doesn't match the data type of input.");
   }
   if (!IsFloatingPointType(input.data_type)) {
     return base::unexpected(
-        "The type of input and slope must be one of the floating point types.");
+        "The data type of input and slope must be one of the floating point "
+        "types.");
   }
   // BroadcastShape unidirectionally broadcasts slope.dimensions to
   // input.dimensions.
@@ -1309,7 +1313,7 @@
       kind == ReduceKind::kLogSum || kind == ReduceKind::kLogSumExp) {
     if (!IsFloatingPointType(input.data_type)) {
       return base::unexpected(
-          "The input type must be one of the floating point types.");
+          "The input data type must be one of the floating point types.");
     }
   }
 
diff --git a/components/ml/webnn/graph_validation_utils.h b/components/ml/webnn/graph_validation_utils.h
index 053d7d3..095f4b7 100644
--- a/components/ml/webnn/graph_validation_utils.h
+++ b/components/ml/webnn/graph_validation_utils.h
@@ -21,7 +21,7 @@
 // Represents the `MLOperand` which describes not only input and constant
 // operand, but also the output operand of operator.
 struct Operand {
-  // Represents the `MLOperandType` in the WebIDL definition.
+  // Represents the `MLOperandDataType` in the WebIDL definition.
   enum DataType {
     kMinValue = 0,
     kFloat32 = 0,
diff --git a/components/performance_manager/features.cc b/components/performance_manager/features.cc
index 558b0ef..dddf913 100644
--- a/components/performance_manager/features.cc
+++ b/components/performance_manager/features.cc
@@ -16,7 +16,7 @@
 namespace performance_manager::features {
 
 BASE_FEATURE(kRunOnMainThread,
-             "RunOnMainThread",
+             "RunPerformanceManagerOnMainThread",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
 BASE_FEATURE(kRunOnDedicatedThreadPoolThread,
diff --git a/components/performance_manager/performance_manager_impl.cc b/components/performance_manager/performance_manager_impl.cc
index 042aaa7..0b28186 100644
--- a/components/performance_manager/performance_manager_impl.cc
+++ b/components/performance_manager/performance_manager_impl.cc
@@ -105,10 +105,17 @@
   std::unique_ptr<PerformanceManagerImpl> instance =
       base::WrapUnique(new PerformanceManagerImpl());
 
-  GetTaskRunner()->PostTask(
-      FROM_HERE,
-      base::BindOnce(&PerformanceManagerImpl::OnStartImpl,
-                     base::Unretained(instance.get()), std::move(on_start)));
+  if (base::FeatureList::IsEnabled(features::kRunOnMainThread)) {
+    // Invoke `OnStartImpl()` synchronously instead of via a posted task, so
+    // that any call to `CallOnGraphImpl()` that follows can access
+    // `g_performance_manager->ui_task_runner_`.
+    instance->OnStartImpl(std::move(on_start));
+  } else {
+    GetTaskRunner()->PostTask(
+        FROM_HERE,
+        base::BindOnce(&PerformanceManagerImpl::OnStartImpl,
+                       base::Unretained(instance.get()), std::move(on_start)));
+  }
 
   return instance;
 }
diff --git a/components/previous_session_info/previous_session_info.mm b/components/previous_session_info/previous_session_info.mm
index 9daecc2..e6be803 100644
--- a/components/previous_session_info/previous_session_info.mm
+++ b/components/previous_session_info/previous_session_info.mm
@@ -111,7 +111,7 @@
       delete;
 
   // base::FieldTrialList::Observer:
-  void OnFieldTrialGroupFinalized(const base::FieldTrial& trial,
+  void OnFieldTrialGroupFinalized(const std::string& trial_name,
                                   const std::string& group_name) override {
     dispatch_async(dispatch_get_main_queue(), ^{
       variations::ExperimentListInfo info = variations::GetExperimentListInfo();
diff --git a/components/privacy_sandbox/masked_domain_list/masked_domain_list.proto b/components/privacy_sandbox/masked_domain_list/masked_domain_list.proto
index 14eaa8a2..d58b49e 100644
--- a/components/privacy_sandbox/masked_domain_list/masked_domain_list.proto
+++ b/components/privacy_sandbox/masked_domain_list/masked_domain_list.proto
@@ -1,15 +1,12 @@
 syntax = "proto2";
 
-option optimize_for = LITE_RUNTIME;
-
 package masked_domain_list;
 
+option optimize_for = LITE_RUNTIME;
+
 // Resource that is used in a 3rd party context.
 message Resource {
-  enum Category {
-    CATEGORY_UNKNOWN = 0;
-    // TODO(aakallam): Add the categories once they have been finalized.
-  }
+  reserved 2;
 
   enum Experiment {
     EXPERIMENT_UNKNOWN = 0;
@@ -17,7 +14,6 @@
   }
 
   optional string domain = 1;
-  repeated Category categories = 2 [packed = true];
   repeated Experiment experiments = 3 [packed = true];
 }
 
diff --git a/components/stylus_handwriting/android/java/src/org/chromium/components/stylus_handwriting/DirectWritingTrigger.java b/components/stylus_handwriting/android/java/src/org/chromium/components/stylus_handwriting/DirectWritingTrigger.java
index 7fa84b05..8c9b31a 100644
--- a/components/stylus_handwriting/android/java/src/org/chromium/components/stylus_handwriting/DirectWritingTrigger.java
+++ b/components/stylus_handwriting/android/java/src/org/chromium/components/stylus_handwriting/DirectWritingTrigger.java
@@ -109,11 +109,11 @@
         } else {
             // Stop recognition and hide DW toolbar as focused node is not editable.
             hideDWToolbar();
-            onStopRecognition(/* motionEvent */ null, /*editableBounds */ null, currentView);
+            onStopRecognition(/* motionEvent= */ null, /* editableBounds= */ null, currentView);
         }
 
         mEditableNodeBounds = roundedBounds;
-        mCallback.updateEditableBounds(roundedBounds, /* cursorPosition */ new Point());
+        mCallback.updateEditableBounds(roundedBounds, /* cursorPosition= */ new Point());
         return editorBoundsInfo;
     }
 
@@ -194,7 +194,7 @@
         if (!hasFocus) {
             // Hide DW toolbar and Stop Recognition when View focus is lost.
             hideDWToolbar();
-            onStopRecognition(/* motionEvent */ null, /*editableBounds */ null);
+            onStopRecognition(/* motionEvent= */ null, /* editableBounds= */ null);
         }
     }
 
@@ -399,7 +399,8 @@
                 // Post task to stop recognition and hide DW toolbar as stylus is moved away.
                 mHideDwToolbarCallbackToken = new Object();
                 mHandler.postDelayed(() -> {
-                    onStopRecognition(/* motionEvent */ null, /*editableBounds */ null, rootView);
+                    onStopRecognition(
+                            /* motionEvent= */ null, /* editableBounds= */ null, rootView);
                     mHideDwToolbarCallbackToken = null;
                 }, mHideDwToolbarCallbackToken, mConfig.getHideDwToolbarDelayMs());
                 break;
@@ -473,14 +474,15 @@
         return DirectWritingConstants.STYLUS_WRITING_ICON_VALUE;
     }
 
-    private void onStopRecognition(MotionEvent me, Rect editableBounds) {
+    private void onStopRecognition(MotionEvent motionEvent, Rect editableBounds) {
         if (mStylusWritingImeCallback == null) return;
-        onStopRecognition(me, editableBounds, mStylusWritingImeCallback.getContainerView());
+        onStopRecognition(
+                motionEvent, editableBounds, mStylusWritingImeCallback.getContainerView());
     }
 
-    private void onStopRecognition(MotionEvent me, Rect editableBounds, View currentView) {
+    private void onStopRecognition(MotionEvent motionEvent, Rect editableBounds, View currentView) {
         if (!mDwServiceEnabled) return;
-        mBinder.onStopRecognition(me, editableBounds, currentView);
+        mBinder.onStopRecognition(motionEvent, editableBounds, currentView);
         resetRecognition();
     }
 
diff --git a/components/variations/active_field_trials.cc b/components/variations/active_field_trials.cc
index e74366a..78f5e4f2 100644
--- a/components/variations/active_field_trials.cc
+++ b/components/variations/active_field_trials.cc
@@ -14,7 +14,6 @@
 #include "base/no_destructor.h"
 #include "base/process/launch.h"
 #include "base/ranges/algorithm.h"
-#include "base/strings/strcat.h"
 #include "base/strings/string_piece.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
@@ -41,52 +40,13 @@
   }
 }
 
-uint32_t HashNameAndSuffix(base::StringPiece base_name,
-                           base::StringPiece optional_suffix) {
-  // Note that most of the time, suffixes are empty, so this avoids creating new
-  // strings if not necessary.
-  if (optional_suffix.empty()) {
-    return HashName(base_name);
-  }
-  return HashName(base::StrCat({base_name, optional_suffix}));
-}
-
-uint32_t HashNameAndSuffix(base::StringPiece base_name,
-                           base::StringPiece optional_suffix,
-                           base::StringPiece optional_suffix2) {
-  if (optional_suffix.empty() && optional_suffix2.empty()) {
-    return HashName(base_name);
-  }
-  return HashName(base::StrCat({base_name, optional_suffix, optional_suffix2}));
-}
-
-ActiveGroupId MakeActiveGroupIdWithSuffix(base::StringPiece trial_name,
-                                          base::StringPiece group_name,
-                                          base::StringPiece optional_suffix,
-                                          bool is_overridden) {
-  ActiveGroupId id;
-  id.name = HashNameAndSuffix(trial_name, optional_suffix);
-  id.group =
-      HashNameAndSuffix(group_name, optional_suffix,
-                        is_overridden ? kOverrideSuffix : base::StringPiece());
-  return id;
-}
-
 }  // namespace
 
 ActiveGroupId MakeActiveGroupId(base::StringPiece trial_name,
                                 base::StringPiece group_name) {
-  return MakeActiveGroupId(trial_name, group_name, /*is_overridden=*/false);
-}
-
-ActiveGroupId MakeActiveGroupId(base::StringPiece trial_name,
-                                base::StringPiece group_name,
-                                bool is_overridden) {
   ActiveGroupId id;
   id.name = HashName(trial_name);
-  id.group = !is_overridden ? HashName(group_name)
-                            : HashNameAndSuffix(group_name, kOverrideSuffix);
-
+  id.group = HashName(group_name);
   return id;
 }
 
@@ -96,10 +56,9 @@
     std::vector<ActiveGroupId>* name_group_ids) {
   DCHECK(name_group_ids->empty());
   for (const auto& active_group : active_groups) {
-    ActiveGroupId group_id = MakeActiveGroupIdWithSuffix(
-        active_group.trial_name, active_group.group_name, suffix,
-        active_group.is_overridden);
-    name_group_ids->push_back(std::move(group_id));
+    name_group_ids->push_back(
+        MakeActiveGroupId(active_group.trial_name + std::string(suffix),
+                          active_group.group_name + std::string(suffix)));
   }
 }
 
@@ -152,8 +111,9 @@
 bool HasSyntheticTrial(const std::string& trial_name) {
   std::vector<std::string> synthetic_trials;
   variations::GetSyntheticTrialGroupIdsAsString(&synthetic_trials);
-  std::string trial_hash = variations::HashNameAsHexString(trial_name);
-  return base::ranges::any_of(synthetic_trials, [&trial_hash](
+  std::string trial_hash =
+      base::StringPrintf("%x", variations::HashName(trial_name));
+  return base::ranges::any_of(synthetic_trials, [trial_hash](
                                                     const auto& trial) {
     return base::StartsWith(trial, trial_hash, base::CompareCase::SENSITIVE);
   });
diff --git a/components/variations/active_field_trials.h b/components/variations/active_field_trials.h
index 8698a47..4e5951d 100644
--- a/components/variations/active_field_trials.h
+++ b/components/variations/active_field_trials.h
@@ -17,12 +17,6 @@
 
 namespace variations {
 
-// Suffix added to field trial group names when they are manually forced with
-// command line flags or internals page. Using a suffix ensures that consumers
-// of these names (or hashes of the names) treat manually forced groups distinct
-// from non-forced groups.
-inline constexpr base::StringPiece kOverrideSuffix = "_MANUALLY_FORCED";
-
 // The Unique ID of a trial and its active group, where the name and group
 // identifiers are hashes of the trial and group name strings.
 struct COMPONENT_EXPORT(VARIATIONS) ActiveGroupId {
@@ -34,10 +28,6 @@
 COMPONENT_EXPORT(VARIATIONS)
 ActiveGroupId MakeActiveGroupId(base::StringPiece trial_name,
                                 base::StringPiece group_name);
-COMPONENT_EXPORT(VARIATIONS)
-ActiveGroupId MakeActiveGroupId(base::StringPiece trial_name,
-                                base::StringPiece group_name,
-                                bool is_overridden);
 
 // We need to supply a Compare class for templates since ActiveGroupId is a
 // user-defined type.
diff --git a/components/variations/active_field_trials_unittest.cc b/components/variations/active_field_trials_unittest.cc
index 8a2f5d7..1739f20 100644
--- a/components/variations/active_field_trials_unittest.cc
+++ b/components/variations/active_field_trials_unittest.cc
@@ -73,30 +73,4 @@
   EXPECT_EQ(expected_group, active_group_ids[0].group);
 }
 
-TEST(ActiveFieldTrialsTest,
-     GetFieldTrialActiveGroupsProvidesDifferentHashesForOverriddenTrials) {
-  std::string trial_one("trial one");
-  std::string group_one("group one");
-
-  base::FieldTrial::ActiveGroup active_group;
-  active_group.trial_name = trial_one;
-  active_group.group_name = group_one;
-  active_group.is_overridden = true;
-
-  std::vector<ActiveGroupId> active_group_ids;
-  testing::TestGetFieldTrialActiveGroupIds(base::StringPiece(), {active_group},
-                                           &active_group_ids);
-  ASSERT_EQ(1U, active_group_ids.size());
-  EXPECT_EQ(active_group_ids[0].name, HashName(trial_one));
-  EXPECT_EQ(active_group_ids[0].group, HashName("group one_MANUALLY_FORCED"));
-
-  active_group_ids.clear();
-  testing::TestGetFieldTrialActiveGroupIds("_suffix", {active_group},
-                                           &active_group_ids);
-  ASSERT_EQ(1U, active_group_ids.size());
-  EXPECT_EQ(active_group_ids[0].name, HashName("trial one_suffix"));
-  EXPECT_EQ(active_group_ids[0].group,
-            HashName("group one_suffix_MANUALLY_FORCED"));
-}
-
 }  // namespace variations
diff --git a/components/variations/child_process_field_trial_syncer.cc b/components/variations/child_process_field_trial_syncer.cc
index 375d3f9f..0e65fcb 100644
--- a/components/variations/child_process_field_trial_syncer.cc
+++ b/components/variations/child_process_field_trial_syncer.cc
@@ -98,12 +98,12 @@
 }
 
 void ChildProcessFieldTrialSyncer::OnFieldTrialGroupFinalized(
-    const base::FieldTrial& trial,
+    const std::string& trial_name,
     const std::string& group_name) {
   // It is not necessary to notify the browser if this is invoked from
   // SetFieldTrialGroupFromBrowser().
   if (!in_set_field_trial_group_from_browser) {
-    activated_callback_.Run(trial.trial_name());
+    activated_callback_.Run(trial_name);
   }
 }
 
diff --git a/components/variations/child_process_field_trial_syncer.h b/components/variations/child_process_field_trial_syncer.h
index a80e4de..01460de 100644
--- a/components/variations/child_process_field_trial_syncer.h
+++ b/components/variations/child_process_field_trial_syncer.h
@@ -68,7 +68,7 @@
   void Init(const std::set<std::string>& initially_active_trials);
 
   // base::FieldTrialList::Observer:
-  void OnFieldTrialGroupFinalized(const base::FieldTrial& trial,
+  void OnFieldTrialGroupFinalized(const std::string& trial_name,
                                   const std::string& group_name) override;
 
   // Callback to invoke when a field trial is activated.
diff --git a/components/variations/child_process_field_trial_syncer_unittest.cc b/components/variations/child_process_field_trial_syncer_unittest.cc
index 1f9d234a..366ddf4 100644
--- a/components/variations/child_process_field_trial_syncer_unittest.cc
+++ b/components/variations/child_process_field_trial_syncer_unittest.cc
@@ -33,7 +33,7 @@
 
   std::string states_string;
   base::FieldTrialList::AllStatesToString(&states_string);
-  EXPECT_EQ("*A/G1/B/G2/C/G3", states_string);
+  EXPECT_EQ("*A/G1/B/G2/C/G3/", states_string);
 
   // Active trial 2 before creating the syncer.
   trial2->Activate();
diff --git a/components/variations/hashing.cc b/components/variations/hashing.cc
index 68ab65e..eff0acf 100644
--- a/components/variations/hashing.cc
+++ b/components/variations/hashing.cc
@@ -4,10 +4,7 @@
 
 #include "components/variations/hashing.h"
 
-#include <string.h>
-
 #include "base/metrics/metrics_hashes.h"
-#include "base/strings/stringprintf.h"
 
 namespace variations {
 
@@ -15,8 +12,4 @@
   return base::HashFieldTrialName(name);
 }
 
-std::string HashNameAsHexString(base::StringPiece name) {
-  return base::StringPrintf("%x", HashName(name));
-}
-
 }  // namespace variations
diff --git a/components/variations/hashing.h b/components/variations/hashing.h
index 3926a931..243c920 100644
--- a/components/variations/hashing.h
+++ b/components/variations/hashing.h
@@ -6,7 +6,6 @@
 #define COMPONENTS_VARIATIONS_HASHING_H_
 
 #include <stdint.h>
-#include <string>
 
 #include "base/component_export.h"
 #include "base/strings/string_piece.h"
@@ -17,10 +16,6 @@
 // for uniquely identifying field trial names and group names.
 COMPONENT_EXPORT(VARIATIONS) uint32_t HashName(base::StringPiece name);
 
-// Returns the hex string representation of HashName(name).
-COMPONENT_EXPORT(VARIATIONS)
-std::string HashNameAsHexString(base::StringPiece name);
-
 }  // namespace variations
 
 #endif  // COMPONENTS_VARIATIONS_HASHING_H_
diff --git a/components/variations/hashing_unittest.cc b/components/variations/hashing_unittest.cc
index c8d0106..7db19738 100644
--- a/components/variations/hashing_unittest.cc
+++ b/components/variations/hashing_unittest.cc
@@ -30,8 +30,4 @@
   }
 }
 
-TEST(HashingTest, HashNameAsHexString) {
-  EXPECT_EQ("37e4f786", HashNameAsHexString("a"));
-}
-
 }  // namespace variations
diff --git a/components/variations/net/variations_command_line_unittest.cc b/components/variations/net/variations_command_line_unittest.cc
index 6aebfe5b..daee693 100644
--- a/components/variations/net/variations_command_line_unittest.cc
+++ b/components/variations/net/variations_command_line_unittest.cc
@@ -15,7 +15,7 @@
 namespace variations {
 
 TEST(VariationsCommandLineTest, TestGetVariationsCommandLine) {
-  std::string trial_list = "trial1/group1/*trial2/group2";
+  std::string trial_list = "trial1/group1/*trial2/group2/";
   std::string param_list = "trial1.group1:p1/v1/p2/2";
   std::string enable_feature_list = "feature1<trial1";
   std::string disable_feature_list = "feature2<trial2";
diff --git a/components/variations/variations_crash_keys.cc b/components/variations/variations_crash_keys.cc
index be36edc..776f1b29 100644
--- a/components/variations/variations_crash_keys.cc
+++ b/components/variations/variations_crash_keys.cc
@@ -89,7 +89,7 @@
   ~VariationsCrashKeys() override;
 
   // base::FieldTrialList::Observer:
-  void OnFieldTrialGroupFinalized(const base::FieldTrial& trial,
+  void OnFieldTrialGroupFinalized(const std::string& trial_name,
                                   const std::string& group_name) override;
 
   // Notifies the object that the list of synthetic field trial groups has
@@ -106,16 +106,11 @@
   // updating crash keys. Returns true if it was successfully added. Returns
   // false otherwise (i.e., the trial was already added previously).
   bool AppendFieldTrial(const std::string& trial_name,
-                        const std::string& group_name,
-                        bool is_overridden);
+                        const std::string& group_name);
 
   // Updates crash keys based on internal state.
   void UpdateCrashKeys();
 
-  void AppendFieldTrialAndUpdateCrashKeys(const std::string& trial_name,
-                                          const std::string& group_name,
-                                          bool is_overridden);
-
   // List of active trials, used to prevent duplicates from being appended to
   // |variations_string_|.
   std::set<std::string> active_trials_;
@@ -166,7 +161,7 @@
   base::FieldTrialListIncludingLowAnonymity::GetActiveFieldTrialGroups(
       &active_groups);
   for (const auto& entry : active_groups) {
-    AppendFieldTrial(entry.trial_name, entry.group_name, entry.is_overridden);
+    AppendFieldTrial(entry.trial_name, entry.group_name);
   }
 #if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS)
   background_thread_task_runner_ = base::ThreadPool::CreateSequencedTaskRunner(
@@ -184,7 +179,7 @@
 }
 
 void VariationsCrashKeys::OnFieldTrialGroupFinalized(
-    const base::FieldTrial& trial,
+    const std::string& trial_name,
     const std::string& group_name) {
   // If this is called on a different thread, post it back to the UI thread.
   // Note: This is safe to do because in production, this object is never
@@ -193,30 +188,29 @@
   if (!ui_thread_task_runner_->RunsTasksInCurrentSequence()) {
     ui_thread_task_runner_->PostTask(
         FROM_HERE,
-        BindOnce(&VariationsCrashKeys::AppendFieldTrialAndUpdateCrashKeys,
+        BindOnce(&VariationsCrashKeys::OnFieldTrialGroupFinalized,
                  // base::Unretained() is safe here because this object is
                  // never deleted in production.
-                 base::Unretained(this), trial.trial_name(), group_name,
-                 trial.IsOverridden()));
+                 base::Unretained(this), trial_name, group_name));
     return;
   }
 
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
-  AppendFieldTrialAndUpdateCrashKeys(trial.trial_name(), group_name,
-                                     trial.IsOverridden());
+  if (AppendFieldTrial(trial_name, group_name)) {
+    UpdateCrashKeys();
+  }
 }
 
 bool VariationsCrashKeys::AppendFieldTrial(const std::string& trial_name,
-                                           const std::string& group_name,
-                                           bool is_overridden) {
+                                           const std::string& group_name) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
   if (!active_trials_.insert(trial_name).second) {
     return false;
   }
 
-  auto active_group_id =
-      MakeActiveGroupId(trial_name, group_name, is_overridden);
+  auto active_group_id = MakeActiveGroupId(trial_name, group_name);
   auto variation = ActiveGroupToString(active_group_id);
 
   variations_string_ += variation;
@@ -224,15 +218,6 @@
   return true;
 }
 
-void VariationsCrashKeys::AppendFieldTrialAndUpdateCrashKeys(
-    const std::string& trial_name,
-    const std::string& group_name,
-    bool is_overridden) {
-  if (AppendFieldTrial(trial_name, group_name, is_overridden)) {
-    UpdateCrashKeys();
-  }
-}
-
 ExperimentListInfo VariationsCrashKeys::GetExperimentListInfo() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   ExperimentListInfo result;
diff --git a/components/variations/variations_crash_keys_unittest.cc b/components/variations/variations_crash_keys_unittest.cc
index 7573215..ddc01c0 100644
--- a/components/variations/variations_crash_keys_unittest.cc
+++ b/components/variations/variations_crash_keys_unittest.cc
@@ -146,18 +146,4 @@
   EXPECT_EQ("version-456", GetVariationsSeedVersionCrashKey());
 }
 
-TEST_F(VariationsCrashKeysTest, OverriddenFieldTrial) {
-  base::FieldTrialList::CreateFieldTrial("Trial1", "Group1",
-                                         /*is_low_anonymity=*/false,
-                                         /*is_overridden=*/true)
-      ->Activate();
-
-  InitCrashKeys();
-
-  // Because the trial is overridden, it has a different group variation ID.
-  EXPECT_EQ("1", GetNumExperimentsCrashKey());
-  EXPECT_EQ("2a140065", HashNameAsHexString("Group1_MANUALLY_FORCED"));
-  EXPECT_EQ("8e7abfb0-2a140065,", GetVariationsCrashKey());
-}
-
 }  // namespace variations
diff --git a/components/variations/variations_ids_provider.cc b/components/variations/variations_ids_provider.cc
index 6032b5e..c841531 100644
--- a/components/variations/variations_ids_provider.cc
+++ b/components/variations/variations_ids_provider.cc
@@ -276,11 +276,11 @@
 }
 
 void VariationsIdsProvider::OnFieldTrialGroupFinalized(
-    const base::FieldTrial& trial,
+    const std::string& trial_name,
     const std::string& group_name) {
   base::AutoLock scoped_lock(lock_);
   const size_t old_size = variation_ids_set_.size();
-  CacheVariationsId(trial.trial_name(), group_name);
+  CacheVariationsId(trial_name, group_name);
   if (variation_ids_set_.size() != old_size)
     UpdateVariationIDsHeaderValue();
 }
diff --git a/components/variations/variations_ids_provider.h b/components/variations/variations_ids_provider.h
index c236708..5c1ee52 100644
--- a/components/variations/variations_ids_provider.h
+++ b/components/variations/variations_ids_provider.h
@@ -207,7 +207,7 @@
   // base::FieldTrialList::Observer:
   // This will add the variation ID associated with |trial_name| and
   // |group_name| to the variation ID cache.
-  void OnFieldTrialGroupFinalized(const base::FieldTrial& trial,
+  void OnFieldTrialGroupFinalized(const std::string& trial_name,
                                   const std::string& group_name) override;
 
   // metrics::SyntheticTrialObserver:
diff --git a/components/webcrypto/algorithms/ecdh.cc b/components/webcrypto/algorithms/ecdh.cc
index 5795d63..1007e18d 100644
--- a/components/webcrypto/algorithms/ecdh.cc
+++ b/components/webcrypto/algorithms/ecdh.cc
@@ -88,11 +88,12 @@
     // secret are zero. So for P-521, the maximum length is 528 bits, not 521.
     int field_size_bytes =
         NumBitsToBytes(EC_GROUP_get_degree(EC_KEY_get0_group(private_key_ec)));
+    unsigned int field_size_bits =
+        static_cast<unsigned int>(field_size_bytes * 8);
 
     // If a desired key length was not specified, default to the field size
     // (rounded up to nearest byte).
-    unsigned int actual_length_bits =
-        length_bits.value_or(field_size_bytes * 8);
+    unsigned int actual_length_bits = length_bits.value_or(field_size_bits);
 
     // Short-circuit when deriving an empty key.
     // TODO(eroman): ECDH_compute_key() is not happy when given a NULL output.
@@ -102,8 +103,8 @@
       return Status::Success();
     }
 
-    if (actual_length_bits > static_cast<unsigned int>(field_size_bytes * 8)) {
-      return Status::ErrorEcdhLengthTooBig(field_size_bytes * 8);
+    if (actual_length_bits > field_size_bits) {
+      return Status::ErrorEcdhLengthTooBig(field_size_bits);
     }
 
     // Resize to target length in bytes (BoringSSL can operate on a shorter
@@ -116,7 +117,9 @@
       return Status::OperationError();
 
     TruncateToBitLength(actual_length_bits, derived_bytes);
-    return Status::Success();
+    return actual_length_bits < field_size_bits
+               ? Status::SuccessDeriveBitsTruncation()
+               : Status::Success();
   }
 };
 
diff --git a/components/webcrypto/algorithms/x25519.cc b/components/webcrypto/algorithms/x25519.cc
index f71a859..7a2aff83 100644
--- a/components/webcrypto/algorithms/x25519.cc
+++ b/components/webcrypto/algorithms/x25519.cc
@@ -219,7 +219,8 @@
     return Status::Success();
   }
 
-  if (8 * derived_len < *length_bits) {
+  size_t derived_len_bits = 8 * derived_len;
+  if (derived_len_bits < *length_bits) {
     return Status::ErrorX25519LengthTooLong();
   }
 
@@ -228,7 +229,8 @@
   // Truncation isn't safe!
   TruncateToBitLength(*length_bits, derived_bytes);
 
-  return Status::Success();
+  return *length_bits < derived_len_bits ? Status::SuccessDeriveBitsTruncation()
+                                         : Status::Success();
 }
 
 Status X25519Implementation::ImportKeyRaw(
diff --git a/components/webcrypto/status.cc b/components/webcrypto/status.cc
index d95d0d0..6032a85 100644
--- a/components/webcrypto/status.cc
+++ b/components/webcrypto/status.cc
@@ -23,6 +23,12 @@
   return Status(TYPE_SUCCESS);
 }
 
+Status Status::SuccessDeriveBitsTruncation() {
+  Status status(TYPE_SUCCESS);
+  status.warning_type_ = blink::kWebCryptoWarningTypeDeriveBitsTruncated;
+  return status;
+}
+
 Status Status::OperationError() {
   return Status(blink::kWebCryptoErrorTypeOperation, "");
 }
diff --git a/components/webcrypto/status.h b/components/webcrypto/status.h
index aeff312..75db538 100644
--- a/components/webcrypto/status.h
+++ b/components/webcrypto/status.h
@@ -35,9 +35,15 @@
 
   blink::WebCryptoErrorType error_type() const { return error_type_; }
 
+  blink::WebCryptoWarningType warning_type() const { return warning_type_; }
+
   // Constructs a status representing success.
   static Status Success();
 
+  // Constructs a status representing success, but informing the derived key has
+  // been truncated.
+  static Status SuccessDeriveBitsTruncation();
+
   // Constructs a status representing a generic operation error. It contains no
   // extra details.
   static Status OperationError();
@@ -313,6 +319,7 @@
 
   Type type_;
   blink::WebCryptoErrorType error_type_;
+  blink::WebCryptoWarningType warning_type_{blink::kWebCryptoWarningTypeNone};
   std::string error_details_;
 };
 
diff --git a/components/webcrypto/webcrypto_impl.cc b/components/webcrypto/webcrypto_impl.cc
index 6ce6149..83b2011d 100644
--- a/components/webcrypto/webcrypto_impl.cc
+++ b/components/webcrypto/webcrypto_impl.cc
@@ -580,6 +580,7 @@
 void DoDeriveBitsReply(std::unique_ptr<DeriveBitsState> state) {
   TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"),
                "DoDeriveBitsReply");
+  state->result.SetWarning(state->status.warning_type());
   CompleteWithBufferOrError(state->status, state->derived_bytes,
                             &state->result);
 }
diff --git a/content/browser/android/DIR_METADATA b/content/browser/android/DIR_METADATA
index c7bcc21..7a2580a 100644
--- a/content/browser/android/DIR_METADATA
+++ b/content/browser/android/DIR_METADATA
@@ -1,4 +1 @@
-monorail {
-  component: "Content>WebApps"
-}
 os: ANDROID
diff --git a/content/browser/field_trial_synchronizer.cc b/content/browser/field_trial_synchronizer.cc
index 7d280f4..cc8f7a2 100644
--- a/content/browser/field_trial_synchronizer.cc
+++ b/content/browser/field_trial_synchronizer.cc
@@ -8,10 +8,8 @@
 #include "base/functional/bind.h"
 #include "base/metrics/field_trial.h"
 #include "base/metrics/field_trial_list_including_low_anonymity.h"
-#include "base/strings/strcat.h"
 #include "base/threading/thread.h"
 #include "components/metrics/persistent_system_profile.h"
-#include "components/variations/active_field_trials.h"
 #include "components/variations/variations_client.h"
 #include "content/common/renderer_variations_configuration.mojom.h"
 #include "content/public/browser/browser_context.h"
@@ -30,26 +28,23 @@
 // Notifies all renderer processes about the |group_name| that is finalized for
 // the given field trail (|field_trial_name|). This is called on UI thread.
 void NotifyAllRenderersOfFieldTrial(const std::string& field_trial_name,
-                                    const std::string& group_name,
-                                    bool is_low_anonymity,
-                                    bool is_overridden) {
+                                    const std::string& group_name) {
   // To iterate over RenderProcessHosts, or to send messages to the hosts, we
   // need to be on the UI thread.
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
 
-  // Low anonymity or overridden field trials must not be written to persistent
-  // data, otherwise they might end up being logged in metrics.
+  // Low anonymity field trials must not be written to persistent data,
+  // otherwise they might end up being logged in metrics.
   //
   // TODO(crbug.com/1431156): split this out into a separate class that
   // registers using |FieldTrialList::AddObserver()| (and so doesn't get told
   // about low anonymity trials at all).
-  if (!is_low_anonymity) {
+  base::FieldTrial* trial = base::FieldTrialList::Find(field_trial_name);
+  if (trial && !trial->is_low_anonymity()) {
     // Note this in the persistent profile as it will take a while for a new
     // "complete" profile to be generated.
     metrics::GlobalPersistentSystemProfile::GetInstance()->AddFieldTrial(
-        field_trial_name,
-        is_overridden ? base::StrCat({group_name, variations::kOverrideSuffix})
-                      : group_name);
+        field_trial_name, group_name);
   }
 
   for (RenderProcessHost::iterator it(RenderProcessHost::AllHostsIterator());
@@ -89,20 +84,14 @@
 }
 
 void FieldTrialSynchronizer::OnFieldTrialGroupFinalized(
-    const base::FieldTrial& trial,
+    const std::string& field_trial_name,
     const std::string& group_name) {
   if (BrowserThread::CurrentlyOn(BrowserThread::UI)) {
-    NotifyAllRenderersOfFieldTrial(trial.trial_name(), group_name,
-                                   trial.is_low_anonymity(),
-                                   trial.IsOverridden());
+    NotifyAllRenderersOfFieldTrial(field_trial_name, group_name);
   } else {
-    // Note that in some tests, `trial` may not be alive when the posted task is
-    // called.
     GetUIThreadTaskRunner({})->PostTask(
-        FROM_HERE,
-        base::BindOnce(&NotifyAllRenderersOfFieldTrial, trial.trial_name(),
-                       group_name, trial.is_low_anonymity(),
-                       trial.IsOverridden()));
+        FROM_HERE, base::BindOnce(&NotifyAllRenderersOfFieldTrial,
+                                  field_trial_name, group_name));
   }
 }
 
diff --git a/content/browser/field_trial_synchronizer.h b/content/browser/field_trial_synchronizer.h
index 0729884..80859e7 100644
--- a/content/browser/field_trial_synchronizer.h
+++ b/content/browser/field_trial_synchronizer.h
@@ -47,7 +47,7 @@
   // is finalized. This method contacts all renderers (by calling
   // NotifyAllRenderers) to create a FieldTrial that carries the randomly
   // selected state from the browser process into all the renderer processes.
-  void OnFieldTrialGroupFinalized(const base::FieldTrial& trial,
+  void OnFieldTrialGroupFinalized(const std::string& name,
                                   const std::string& group_name) override;
 
   // VariationsIdsProvider::Observer methods:
diff --git a/content/browser/network/network_field_trial_browsertest.cc b/content/browser/network/network_field_trial_browsertest.cc
index 98ec97b8..821815e 100644
--- a/content/browser/network/network_field_trial_browsertest.cc
+++ b/content/browser/network/network_field_trial_browsertest.cc
@@ -37,9 +37,9 @@
   void WaitForTrialGroupToBeFinalized() { run_loop_.Run(); }
 
   // base::FieldTrialList::Observer:
-  void OnFieldTrialGroupFinalized(const base::FieldTrial& trial,
+  void OnFieldTrialGroupFinalized(const std::string& trial_name,
                                   const std::string& group_name) override {
-    if (trial.trial_name() == kFieldTrialName) {
+    if (trial_name == kFieldTrialName) {
       EXPECT_EQ(kFieldTrialGroup, group_name);
       run_loop_.Quit();
     }
diff --git a/content/browser/renderer_host/render_frame_host_impl.h b/content/browser/renderer_host/render_frame_host_impl.h
index c0628ba1..dc32df81 100644
--- a/content/browser/renderer_host/render_frame_host_impl.h
+++ b/content/browser/renderer_host/render_frame_host_impl.h
@@ -3232,7 +3232,7 @@
       NavigationBrowserTest,
       NavigationSuddenTerminationDisablerTypeRecordUmaActivation);
   FRIEND_TEST_ALL_PREFIXES(NavigationRequestTest, SharedStorageWritable);
-  FRIEND_TEST_ALL_PREFIXES(WebContentsImplBrowserTest, SetTitleOnUnload);
+  FRIEND_TEST_ALL_PREFIXES(WebContentsImplBrowserTest, SetTitleOnPagehide);
   FRIEND_TEST_ALL_PREFIXES(SitePerProcessBrowserTest,
                            DetachedIframeUnloadHandlerABCB);
 
diff --git a/content/browser/security_exploit_browsertest.cc b/content/browser/security_exploit_browsertest.cc
index fc2dae6..904901b 100644
--- a/content/browser/security_exploit_browsertest.cc
+++ b/content/browser/security_exploit_browsertest.cc
@@ -1372,13 +1372,15 @@
   // WebUI page below), try to bind to a WebUI interface from the web
   // RenderFrameHost. Ensure the unload timer and bfcache are disabled so that
   // the handler has a chance to run.
+  // This test uses `pagehide` rather than `unload` since they occur at the
+  // same timing but `unload` is being deprecated.
   main_frame->DisableUnloadTimerForTesting();
   DisableBackForwardCacheForTesting(shell()->web_contents(),
-                                    BackForwardCache::TEST_USES_UNLOAD_EVENT);
+                                    BackForwardCache::TEST_REQUIRES_NO_CACHING);
   ASSERT_TRUE(ExecJs(main_frame, R"(
         // Intentionally leak pipe as a global so it doesn't get GCed.
         newMessagePipe = Mojo.createMessagePipe();
-        onunload = function () {
+        onpagehide = function () {
           Mojo.bindInterface('mojom.ProcessInternalsHandler',
                              newMessagePipe.handle0);
         };
diff --git a/content/browser/service_worker/service_worker_main_resource_loader_interceptor.cc b/content/browser/service_worker/service_worker_main_resource_loader_interceptor.cc
index c526f29..91e819ec 100644
--- a/content/browser/service_worker/service_worker_main_resource_loader_interceptor.cc
+++ b/content/browser/service_worker/service_worker_main_resource_loader_interceptor.cc
@@ -96,7 +96,7 @@
       request_info.isolation_info));
 }
 
-std::unique_ptr<NavigationLoaderInterceptor>
+std::unique_ptr<ServiceWorkerMainResourceLoaderInterceptor>
 ServiceWorkerMainResourceLoaderInterceptor::CreateForWorker(
     const network::ResourceRequest& resource_request,
     const net::IsolationInfo& isolation_info,
diff --git a/content/browser/service_worker/service_worker_main_resource_loader_interceptor.h b/content/browser/service_worker/service_worker_main_resource_loader_interceptor.h
index 9720adef..c88cadf 100644
--- a/content/browser/service_worker/service_worker_main_resource_loader_interceptor.h
+++ b/content/browser/service_worker/service_worker_main_resource_loader_interceptor.h
@@ -51,7 +51,8 @@
   // Creates a ServiceWorkerMainResourceLoaderInterceptor for a worker.
   // Returns nullptr if the interceptor could not be created for the URL of the
   // worker.
-  static std::unique_ptr<NavigationLoaderInterceptor> CreateForWorker(
+  static std::unique_ptr<ServiceWorkerMainResourceLoaderInterceptor>
+  CreateForWorker(
       const network::ResourceRequest& resource_request,
       const net::IsolationInfo& isolation_info,
       int process_id,
diff --git a/content/browser/web_contents/web_contents_impl_browsertest.cc b/content/browser/web_contents/web_contents_impl_browsertest.cc
index b16d3bf..7c1c480 100644
--- a/content/browser/web_contents/web_contents_impl_browsertest.cc
+++ b/content/browser/web_contents/web_contents_impl_browsertest.cc
@@ -71,6 +71,7 @@
 #include "content/public/common/content_paths.h"
 #include "content/public/common/content_switches.h"
 #include "content/public/common/url_constants.h"
+#include "content/public/test/back_forward_cache_util.h"
 #include "content/public/test/browser_test.h"
 #include "content/public/test/browser_test_utils.h"
 #include "content/public/test/content_browser_test.h"
@@ -489,11 +490,13 @@
   EXPECT_EQ(new_size, shell()->web_contents()->GetContainerBounds().size());
 }
 
-IN_PROC_BROWSER_TEST_F(WebContentsImplBrowserTest, SetTitleOnUnload) {
+IN_PROC_BROWSER_TEST_F(WebContentsImplBrowserTest, SetTitleOnPagehide) {
+  DisableBackForwardCacheForTesting(shell()->web_contents(),
+                                    BackForwardCache::TEST_REQUIRES_NO_CACHING);
   GURL url(
       "data:text/html,"
       "<title>A</title>"
-      "<body onunload=\"document.title = 'B'\"></body>");
+      "<body onpagehide=\"document.title = 'B'\"></body>");
   ASSERT_TRUE(NavigateToURL(shell(), url));
   ASSERT_EQ(1, shell()->web_contents()->GetController().GetEntryCount());
   NavigationEntryImpl* entry1 = NavigationEntryImpl::FromNavigationEntry(
diff --git a/content/browser/worker_host/worker_script_loader.cc b/content/browser/worker_host/worker_script_loader.cc
index 0347d86..5561cce 100644
--- a/content/browser/worker_host/worker_script_loader.cc
+++ b/content/browser/worker_host/worker_script_loader.cc
@@ -48,13 +48,9 @@
     Abort();
     return;
   }
-  auto service_worker_interceptor =
-      ServiceWorkerMainResourceLoaderInterceptor::CreateForWorker(
-          resource_request_, isolation_info, process_id, worker_token,
-          service_worker_handle_);
-
-  if (service_worker_interceptor)
-    interceptors_.push_back(std::move(service_worker_interceptor));
+  interceptor_ = ServiceWorkerMainResourceLoaderInterceptor::CreateForWorker(
+      resource_request_, isolation_info, process_id, worker_token,
+      service_worker_handle_);
 
   Start();
 }
@@ -89,12 +85,11 @@
     return;
   }
 
-  if (interceptor_index_ < interceptors_.size()) {
-    auto* interceptor = interceptors_[interceptor_index_++].get();
-    interceptor->MaybeCreateLoader(
+  if (interceptor_) {
+    interceptor_->MaybeCreateLoader(
         resource_request_, browser_context,
         base::BindOnce(&WorkerScriptLoader::MaybeStartLoader,
-                       weak_factory_.GetWeakPtr(), interceptor),
+                       weak_factory_.GetWeakPtr(), interceptor_.get()),
         base::BindOnce(
             [](base::WeakPtr<WorkerScriptLoader> self,
                bool /*reset_subresource_loader_params*/,
@@ -111,7 +106,7 @@
 }
 
 void WorkerScriptLoader::MaybeStartLoader(
-    NavigationLoaderInterceptor* interceptor,
+    ServiceWorkerMainResourceLoaderInterceptor* interceptor,
     scoped_refptr<network::SharedURLLoaderFactory> single_request_factory) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   DCHECK(!completed_);
@@ -142,14 +137,8 @@
     return;
   }
 
-  // We shouldn't try the remaining interceptors if this interceptor provides
-  // SubresourceLoaderParams. For details, see comments on
-  // NavigationLoaderInterceptor::MaybeCreateSubresourceLoaderParams().
-  if (subresource_loader_params_)
-    interceptor_index_ = interceptors_.size();
-
-  // Continue until all the interceptors are tried.
-  Start();
+  // The interceptor didn't elect to handle the request. Fallback to network.
+  LoadFromNetwork();
 }
 
 void WorkerScriptLoader::LoadFromNetwork() {
@@ -199,7 +188,6 @@
   resource_request_.referrer_policy = redirect_info_->new_referrer_policy;
 
   // Restart the request.
-  interceptor_index_ = 0;
   url_loader_client_receiver_.reset();
   redirect_info_.reset();
 
@@ -304,10 +292,10 @@
   // of WorkerScriptLoader and WorkerScriptFetcher and the interceptors. The
   // interceptors should be owned by WorkerScriptFetcher.
   DCHECK(default_loader_used_);
-  for (auto& interceptor : interceptors_) {
+  if (interceptor_) {
     bool skip_other_interceptors = false;
     bool will_return_unsafe_redirect = false;
-    if (interceptor->MaybeCreateLoaderForResponse(
+    if (interceptor_->MaybeCreateLoaderForResponse(
             status, resource_request_, response_head, response_body,
             response_url_loader, response_client_receiver, url_loader,
             &skip_other_interceptors, &will_return_unsafe_redirect)) {
@@ -316,7 +304,7 @@
       DCHECK(!skip_other_interceptors);
       DCHECK(!will_return_unsafe_redirect);
       subresource_loader_params_ =
-          interceptor->MaybeCreateSubresourceLoaderParams();
+          interceptor_->MaybeCreateSubresourceLoaderParams();
       return true;
     }
   }
diff --git a/content/browser/worker_host/worker_script_loader.h b/content/browser/worker_host/worker_script_loader.h
index e764298..ebdcc40 100644
--- a/content/browser/worker_host/worker_script_loader.h
+++ b/content/browser/worker_host/worker_script_loader.h
@@ -43,6 +43,7 @@
 class BrowserContext;
 class NavigationLoaderInterceptor;
 class ServiceWorkerMainResourceHandle;
+class ServiceWorkerMainResourceLoaderInterceptor;
 
 // The URLLoader for loading a shared worker script. Only used for the main
 // script request.
@@ -63,10 +64,9 @@
   using BrowserContextGetter = base::RepeatingCallback<BrowserContext*(void)>;
 
   // |default_loader_factory| is used to load the script if the load is not
-  // intercepted by a feature like service worker. Typically it will load the
-  // script from the NetworkService. However, it may internally contain
-  // non-NetworkService factories used for non-http(s) URLs, e.g., a
-  // chrome-extension:// URL.
+  // intercepted by a service worker. Typically it will load the script from the
+  // NetworkService. However, it may internally contain non-NetworkService
+  // factories used for non-http(s) URLs, e.g., a chrome-extension:// URL.
   WorkerScriptLoader(
       int process_id,
       const DedicatedOrSharedWorkerToken& worker_token,
@@ -137,15 +137,12 @@
   void Abort();
   void Start();
   void MaybeStartLoader(
-      NavigationLoaderInterceptor* interceptor,
+      ServiceWorkerMainResourceLoaderInterceptor* interceptor,
       scoped_refptr<network::SharedURLLoaderFactory> single_request_factory);
   void LoadFromNetwork();
   void CommitCompleted(const network::URLLoaderCompletionStatus& status);
 
-  // The order of the interceptors is important. The former interceptor can
-  // preferentially get a chance to intercept a network request.
-  std::vector<std::unique_ptr<NavigationLoaderInterceptor>> interceptors_;
-  size_t interceptor_index_ = 0;
+  std::unique_ptr<ServiceWorkerMainResourceLoaderInterceptor> interceptor_;
 
   absl::optional<SubresourceLoaderParams> subresource_loader_params_;
 
@@ -166,8 +163,8 @@
   mojo::Receiver<network::mojom::URLLoaderClient> url_loader_client_receiver_{
       this};
   // The factory used to request the script. This is the same as
-  // |default_loader_factory_| if a service worker or other interceptor didn't
-  // elect to handle the request.
+  // |default_loader_factory_| if a service worker didn't elect to handle the
+  // request.
   scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_;
 
   bool completed_ = false;
diff --git a/content/renderer/render_frame_impl_browsertest.cc b/content/renderer/render_frame_impl_browsertest.cc
index 1e0210b..fa12ff0 100644
--- a/content/renderer/render_frame_impl_browsertest.cc
+++ b/content/renderer/render_frame_impl_browsertest.cc
@@ -7,6 +7,7 @@
 #include <tuple>
 #include <utility>
 
+#include "base/check_deref.h"
 #include "base/command_line.h"
 #include "base/debug/leak_annotations.h"
 #include "base/functional/bind.h"
@@ -88,8 +89,9 @@
   explicit RenderFrameImplTest(
       RenderFrameImpl::CreateRenderFrameImplFunction hook_function = nullptr)
       : RenderViewTest(/*hook_render_frame_creation=*/!hook_function) {
-    if (hook_function)
+    if (hook_function) {
       RenderFrameImpl::InstallCreateHook(hook_function);
+    }
   }
   ~RenderFrameImplTest() override = default;
 
@@ -177,9 +179,7 @@
             mock_policy_container_host.BindNewEndpointAndPassDedicatedRemote()),
         /*is_for_nested_main_frame=*/false);
 
-    frame_ = static_cast<TestRenderFrame*>(
-        RenderFrameImpl::FromRoutingID(kSubframeRouteId));
-    EXPECT_FALSE(frame_->is_main_frame_);
+    EXPECT_FALSE(child_frame().is_main_frame_);
   }
 
   void TearDown() override {
@@ -195,10 +195,13 @@
     return static_cast<TestRenderFrame*>(RenderViewTest::GetMainRenderFrame());
   }
 
-  TestRenderFrame* frame() { return frame_; }
+  TestRenderFrame& child_frame() const {
+    return CHECK_DEREF(static_cast<TestRenderFrame*>(
+        RenderFrameImpl::FromRoutingID(kSubframeRouteId)));
+  }
 
   blink::WebFrameWidget* frame_widget() const {
-    return frame_->GetLocalRootWebFrameWidget();
+    return child_frame().GetLocalRootWebFrameWidget();
   }
 
   mojo::AssociatedRemote<blink::mojom::Widget>& widget_remote() {
@@ -209,12 +212,11 @@
     return url::Origin(frame->GetWebFrame()->GetSecurityOrigin());
   }
 
-  static int32_t AutoplayFlagsForFrame(TestRenderFrame* frame) {
-    return frame->GetWebView()->AutoplayFlagsForTest();
+  static int32_t AutoplayFlagsForFrame(const TestRenderFrame& frame) {
+    return frame.GetWebView()->AutoplayFlagsForTest();
   }
 
  private:
-  raw_ptr<TestRenderFrame, DanglingUntriaged> frame_;
   mojo::AssociatedRemote<blink::mojom::Widget> widget_remote_;
 };
 
@@ -298,7 +300,7 @@
 
 // Verify a subframe RenderWidget properly processes a WasShown message.
 TEST_F(RenderFrameImplTest, FrameWasShown) {
-  RenderFrameTestObserver observer(frame());
+  RenderFrameTestObserver observer(&child_frame());
 
   widget_remote()->WasShown(
       /* was_evicted=*/false,
@@ -364,7 +366,7 @@
             &DownloadURLTestRenderFrame::CreateTestRenderFrame) {}
 
   DownloadURLMockLocalFrameHost* download_url_mock_local_frame_host() {
-    return static_cast<DownloadURLTestRenderFrame*>(frame())
+    return static_cast<DownloadURLTestRenderFrame*>(&child_frame())
         ->download_url_mock_local_frame_host();
   }
 };
@@ -379,14 +381,14 @@
   EXPECT_CALL(*download_url_mock_local_frame_host(), DownloadURL(testing::_))
       .Times(10);
   for (int i = 0; i < 10; ++i) {
-    frame()->GetWebFrame()->DownloadURL(
+    child_frame().GetWebFrame()->DownloadURL(
         request, network::mojom::RedirectMode::kManual, mojo::NullRemote());
     base::RunLoop().RunUntilIdle();
   }
 
   EXPECT_CALL(*download_url_mock_local_frame_host(), DownloadURL(testing::_))
       .Times(0);
-  frame()->GetWebFrame()->DownloadURL(
+  child_frame().GetWebFrame()->DownloadURL(
       request, network::mojom::RedirectMode::kManual, mojo::NullRemote());
   base::RunLoop().RunUntilIdle();
 }
@@ -395,13 +397,13 @@
 // text finding, and then delete the frame immediately before the text finding
 // returns any text match.
 TEST_F(RenderFrameImplTest, NoCrashWhenDeletingFrameDuringFind) {
-  frame()->GetWebFrame()->FindForTesting(
+  child_frame().GetWebFrame()->FindForTesting(
       1, "foo", true /* match_case */, true /* forward */,
       true /* new_session */, true /* force */, false /* wrap_within_frame */,
       false /* async */);
 
-  static_cast<mojom::Frame*>(frame())->Delete(
-      mojom::FrameDeleteIntention::kNotMainFrame);
+  static_cast<mojom::Frame*>(&child_frame())
+      ->Delete(mojom::FrameDeleteIntention::kNotMainFrame);
 }
 
 TEST_F(RenderFrameImplTest, AutoplayFlags) {
@@ -415,16 +417,16 @@
 
   // Check the flags have been set correctly.
   EXPECT_EQ(blink::mojom::kAutoplayFlagHighMediaEngagement,
-            AutoplayFlagsForFrame(GetMainRenderFrame()));
+            AutoplayFlagsForFrame(*GetMainRenderFrame()));
 
   // Navigate the child frame.
   LoadChildFrame();
 
   // Check the flags are set on both frames.
   EXPECT_EQ(blink::mojom::kAutoplayFlagHighMediaEngagement,
-            AutoplayFlagsForFrame(GetMainRenderFrame()));
+            AutoplayFlagsForFrame(*GetMainRenderFrame()));
   EXPECT_EQ(blink::mojom::kAutoplayFlagHighMediaEngagement,
-            AutoplayFlagsForFrame(frame()));
+            AutoplayFlagsForFrame(child_frame()));
 
   // Navigate the top frame.
   LoadHTMLWithUrlOverride(kParentFrameHTML, "https://www.example.com");
@@ -432,8 +434,9 @@
 
   // Check the flags have been cleared.
   EXPECT_EQ(blink::mojom::kAutoplayFlagNone,
-            AutoplayFlagsForFrame(GetMainRenderFrame()));
-  EXPECT_EQ(blink::mojom::kAutoplayFlagNone, AutoplayFlagsForFrame(frame()));
+            AutoplayFlagsForFrame(*GetMainRenderFrame()));
+  EXPECT_EQ(blink::mojom::kAutoplayFlagNone,
+            AutoplayFlagsForFrame(child_frame()));
 }
 
 TEST_F(RenderFrameImplTest, AutoplayFlags_WrongOrigin) {
@@ -446,7 +449,7 @@
 
   // Check the flags have been not been set.
   EXPECT_EQ(blink::mojom::kAutoplayFlagNone,
-            AutoplayFlagsForFrame(GetMainRenderFrame()));
+            AutoplayFlagsForFrame(*GetMainRenderFrame()));
 }
 
 TEST_F(RenderFrameImplTest, FileUrlPathAlias) {
@@ -474,9 +477,9 @@
 }
 
 TEST_F(RenderFrameImplTest, MainFrameIntersectionRecorded) {
-  RenderFrameTestObserver observer(frame());
+  RenderFrameTestObserver observer(&child_frame());
   gfx::Rect mainframe_intersection(0, 0, 200, 140);
-  frame()->OnMainFrameIntersectionChanged(mainframe_intersection);
+  child_frame().OnMainFrameIntersectionChanged(mainframe_intersection);
   // Setting a new frame intersection in a local frame triggers the render frame
   // observer call.
   EXPECT_EQ(observer.last_intersection_rect(), mainframe_intersection);
@@ -571,8 +574,9 @@
  private:
   // blink::mojom::BrowserInterfaceBroker:
   void GetInterface(mojo::GenericPendingReceiver receiver) override {
-    if (receiver.interface_name().value() == interface_name_)
+    if (receiver.interface_name().value() == interface_name_) {
       binder_callback_.Run(receiver.PassPipe());
+    }
   }
 
   mojo::Receiver<blink::mojom::BrowserInterfaceBroker> receiver_;
@@ -669,8 +673,9 @@
   FrameCommitWaiter& operator=(const FrameCommitWaiter&) = delete;
 
   void Wait() {
-    if (did_commit_)
+    if (did_commit_) {
       return;
+    }
     run_loop_.Run();
   }
 
@@ -711,8 +716,9 @@
  protected:
   void RenderFrameCreated(RenderFrame* render_frame) override {
     ContentRendererClient::RenderFrameCreated(render_frame);
-    if (callback_)
+    if (callback_) {
       callback_.Run(static_cast<TestRenderFrame*>(render_frame));
+    }
   }
 
  private:
@@ -1090,6 +1096,7 @@
   common_params->base_url_for_data_url = GURL("about:blank");
   auto commit_params = blink::CreateCommitNavigationParams();
   auto waiter = std::make_unique<FrameLoadWaiter>(GetMainRenderFrame());
+
   GetMainRenderFrame()->Navigate(std::move(common_params),
                                  std::move(commit_params));
   waiter->Wait();
diff --git a/content/test/data/accessibility/html/dialog-expected-android-external.txt b/content/test/data/accessibility/html/dialog-expected-android-external.txt
index 0faee2b..b18bca0 100644
--- a/content/test/data/accessibility/html/dialog-expected-android-external.txt
+++ b/content/test/data/accessibility/html/dialog-expected-android-external.txt
@@ -1,2 +1,2 @@
 WebView focusable focused scrollable actions:[CLEAR_FOCUS, AX_FOCUS] bundle:[chromeRole="rootWebArea"]
-++Dialog text:"Text in dialog" paneTitle:"dialog opened." actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="dialog", roleDescription="dialog"]
\ No newline at end of file
+++Dialog text:"Text in dialog" paneTitle:"dialog opened." focusable actions:[FOCUS, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="dialog", roleDescription="dialog"]
diff --git a/content/test/data/accessibility/html/dialog-expected-android.txt b/content/test/data/accessibility/html/dialog-expected-android.txt
index a00521f8..91a5af1b 100644
--- a/content/test/data/accessibility/html/dialog-expected-android.txt
+++ b/content/test/data/accessibility/html/dialog-expected-android.txt
@@ -1,2 +1,2 @@
 android.webkit.WebView focusable focused scrollable
-++android.app.Dialog role_description='dialog' name='Text in dialog'
\ No newline at end of file
+++android.app.Dialog role_description='dialog' focusable name='Text in dialog'
diff --git a/content/test/data/accessibility/html/dialog-expected-fuchsia.txt b/content/test/data/accessibility/html/dialog-expected-fuchsia.txt
index 0f7f56d..b37b420 100644
--- a/content/test/data/accessibility/html/dialog-expected-fuchsia.txt
+++ b/content/test/data/accessibility/html/dialog-expected-fuchsia.txt
@@ -1,6 +1,6 @@
 UNKNOWN focusable has_input_focus
 ++UNKNOWN hidden
 ++++UNKNOWN hidden
-++++++UNKNOWN
+++++++UNKNOWN focusable
 ++++++++STATIC_TEXT label='Text in dialog'
-++++++++++UNKNOWN label='Text in dialog'
\ No newline at end of file
+++++++++++UNKNOWN label='Text in dialog'
diff --git a/content/test/data/accessibility/html/dialog-expected-uia-win.txt b/content/test/data/accessibility/html/dialog-expected-uia-win.txt
index 002cbb2..0bb79b0 100644
--- a/content/test/data/accessibility/html/dialog-expected-uia-win.txt
+++ b/content/test/data/accessibility/html/dialog-expected-uia-win.txt
@@ -1,3 +1,3 @@
 Document
-++Window IsControlElement=false Window.IsModal=false
+++Window Window.IsModal=false
 ++++Text Name='Text in dialog'
diff --git a/content/test/data/accessibility/html/dialog-expected-win.txt b/content/test/data/accessibility/html/dialog-expected-win.txt
index 5cecfd7d..3c7f082 100644
--- a/content/test/data/accessibility/html/dialog-expected-win.txt
+++ b/content/test/data/accessibility/html/dialog-expected-win.txt
@@ -1,3 +1,3 @@
 ROLE_SYSTEM_DOCUMENT READONLY FOCUSABLE
-++ROLE_SYSTEM_DIALOG
+++ROLE_SYSTEM_DIALOG FOCUSABLE
 ++++ROLE_SYSTEM_STATICTEXT name='Text in dialog'
diff --git a/content/test/data/accessibility/html/modal-dialog-opened-expected-android.txt b/content/test/data/accessibility/html/modal-dialog-opened-expected-android.txt
index bd53d4cd..3821663 100644
--- a/content/test/data/accessibility/html/modal-dialog-opened-expected-android.txt
+++ b/content/test/data/accessibility/html/modal-dialog-opened-expected-android.txt
@@ -1,5 +1,5 @@
 android.webkit.WebView focusable scrollable
-++android.app.Dialog role_description='dialog'
+++android.app.Dialog role_description='dialog' focusable
 ++++android.widget.TextView name='The dialog subtree should be the only text content in the accessibility tree. '
 ++++android.view.View role_description='link' clickable focusable focused link name='Link inside the dialog.'
 ++++++android.widget.TextView name='Link inside the dialog.'
diff --git a/content/test/data/accessibility/html/modal-dialog-opened-expected-fuchsia.txt b/content/test/data/accessibility/html/modal-dialog-opened-expected-fuchsia.txt
index e181239..40bbbb8 100644
--- a/content/test/data/accessibility/html/modal-dialog-opened-expected-fuchsia.txt
+++ b/content/test/data/accessibility/html/modal-dialog-opened-expected-fuchsia.txt
@@ -2,7 +2,7 @@
 ++UNKNOWN hidden
 ++++UNKNOWN hidden
 ++++++UNKNOWN hidden
-++++++++UNKNOWN
+++++++++UNKNOWN focusable
 ++++++++++STATIC_TEXT label='The dialog subtree should be the only text content in the accessibility tree. '
 ++++++++++++UNKNOWN label='The dialog subtree should be the only text content in the accessibility tree. '
 ++++++++++LINK focusable has_input_focus label='Link inside the dialog.' actions='{DEFAULT}'
diff --git a/content/test/data/accessibility/html/modal-dialog-opened-expected-uia-win.txt b/content/test/data/accessibility/html/modal-dialog-opened-expected-uia-win.txt
index 341f2a5..bcd24fd 100644
--- a/content/test/data/accessibility/html/modal-dialog-opened-expected-uia-win.txt
+++ b/content/test/data/accessibility/html/modal-dialog-opened-expected-uia-win.txt
@@ -1,5 +1,5 @@
 Document
-++Window IsControlElement=false Window.IsModal=true
+++Window Window.IsModal=true
 ++++Text Name='The dialog subtree should be the only text content in the accessibility tree. '
 ++++Hyperlink Name='Link inside the dialog.'
 ++++++Text Name='Link inside the dialog.' IsControlElement=false
diff --git a/content/test/data/accessibility/html/modal-dialog-opened-expected-win.txt b/content/test/data/accessibility/html/modal-dialog-opened-expected-win.txt
index c134aa6..f944e87 100644
--- a/content/test/data/accessibility/html/modal-dialog-opened-expected-win.txt
+++ b/content/test/data/accessibility/html/modal-dialog-opened-expected-win.txt
@@ -1,5 +1,5 @@
 ROLE_SYSTEM_DOCUMENT READONLY FOCUSABLE
-++ROLE_SYSTEM_DIALOG IA2_STATE_MODAL
+++ROLE_SYSTEM_DIALOG FOCUSABLE IA2_STATE_MODAL
 ++++ROLE_SYSTEM_STATICTEXT name='The dialog subtree should be the only text content in the accessibility tree. '
 ++++ROLE_SYSTEM_LINK name='Link inside the dialog.' FOCUSABLE
 ++++++ROLE_SYSTEM_STATICTEXT name='Link inside the dialog.'
diff --git a/content/test/data/accessibility/html/modal-dialog-stack-expected-android.txt b/content/test/data/accessibility/html/modal-dialog-stack-expected-android.txt
index 8b85f273..d3bed5e 100644
--- a/content/test/data/accessibility/html/modal-dialog-stack-expected-android.txt
+++ b/content/test/data/accessibility/html/modal-dialog-stack-expected-android.txt
@@ -1,4 +1,4 @@
 android.webkit.WebView focusable focused scrollable
-++android.app.Dialog role_description='dialog'
+++android.app.Dialog role_description='dialog' focusable
 ++++android.widget.TextView name='This is the now active dialog. Of course it should be in the tree. '
 ++++android.widget.Button role_description='button' clickable focusable name='This is in the active dialog and should be in the tree.'
diff --git a/content/test/data/accessibility/html/modal-dialog-stack-expected-fuchsia.txt b/content/test/data/accessibility/html/modal-dialog-stack-expected-fuchsia.txt
index d11f5ec..501fc15 100644
--- a/content/test/data/accessibility/html/modal-dialog-stack-expected-fuchsia.txt
+++ b/content/test/data/accessibility/html/modal-dialog-stack-expected-fuchsia.txt
@@ -8,7 +8,7 @@
 ++++++++++UNKNOWN hidden
 ++++++UNKNOWN hidden
 ++++++++STATIC_TEXT hidden label='<newline>  This was the middle dialog and should be marked ignored in the tree.<newline>'
-++++++UNKNOWN
+++++++UNKNOWN focusable
 ++++++++STATIC_TEXT label='This is the now active dialog. Of course it should be in the tree. '
 ++++++++++UNKNOWN label='This is the now active dialog. Of course it should be in the tree. '
 ++++++++BUTTON focusable label='This is in the active dialog and should be in the tree.' actions='{DEFAULT}'
diff --git a/content/test/data/accessibility/html/modal-dialog-stack-expected-uia-win.txt b/content/test/data/accessibility/html/modal-dialog-stack-expected-uia-win.txt
index b37f7026..ae292bd1 100644
--- a/content/test/data/accessibility/html/modal-dialog-stack-expected-uia-win.txt
+++ b/content/test/data/accessibility/html/modal-dialog-stack-expected-uia-win.txt
@@ -1,4 +1,4 @@
 Document
-++Window IsControlElement=false Window.IsModal=true
+++Window Window.IsModal=true
 ++++Text Name='This is the now active dialog. Of course it should be in the tree. '
 ++++Button Name='This is in the active dialog and should be in the tree.'
diff --git a/content/test/data/accessibility/html/modal-dialog-stack-expected-win.txt b/content/test/data/accessibility/html/modal-dialog-stack-expected-win.txt
index 6371f34..c2e96d3c 100644
--- a/content/test/data/accessibility/html/modal-dialog-stack-expected-win.txt
+++ b/content/test/data/accessibility/html/modal-dialog-stack-expected-win.txt
@@ -1,4 +1,4 @@
 ROLE_SYSTEM_DOCUMENT READONLY FOCUSABLE
-++ROLE_SYSTEM_DIALOG IA2_STATE_MODAL
+++ROLE_SYSTEM_DIALOG FOCUSABLE IA2_STATE_MODAL
 ++++ROLE_SYSTEM_STATICTEXT name='This is the now active dialog. Of course it should be in the tree. '
 ++++ROLE_SYSTEM_PUSHBUTTON name='This is in the active dialog and should be in the tree.' FOCUSABLE
diff --git a/device/fido/device_response_converter.cc b/device/fido/device_response_converter.cc
index 5bf1fecc..b010e62 100644
--- a/device/fido/device_response_converter.cc
+++ b/device/fido/device_response_converter.cc
@@ -828,8 +828,7 @@
   size_t longest_valid_prefix_len = 0;
 
   for (size_t i = 0; i < utf8_bytes.size(); i++) {
-    state =
-        validator.AddBytes(reinterpret_cast<const char*>(&utf8_bytes[i]), 1);
+    state = validator.AddBytes(utf8_bytes.subspan(i, 1));
     switch (state) {
       case base::StreamingUtf8Validator::VALID_ENDPOINT:
         longest_valid_prefix_len = i + 1;
diff --git a/device/gamepad/gamepad_device_linux.cc b/device/gamepad/gamepad_device_linux.cc
index 639fe467..cb5d522 100644
--- a/device/gamepad/gamepad_device_linux.cc
+++ b/device/gamepad/gamepad_device_linux.cc
@@ -11,11 +11,12 @@
 #include <linux/joystick.h>
 #include <sys/ioctl.h>
 
+#include <string_view>
+
 #include "base/containers/fixed_flat_set.h"
 #include "base/functional/callback_helpers.h"
 #include "base/posix/eintr_wrapper.h"
 #include "base/strings/string_number_conversions.h"
-#include "base/strings/string_piece.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/task/sequenced_task_runner.h"
@@ -191,7 +192,7 @@
   return nbytes == sizeof(start_stop);
 }
 
-uint16_t HexStringToUInt16WithDefault(base::StringPiece input,
+uint16_t HexStringToUInt16WithDefault(std::string_view input,
                                       uint16_t default_value) {
   uint32_t out = 0;
   if (!base::HexStringToUInt(input, &out) ||
@@ -235,9 +236,9 @@
 }
 #endif  // BUILDFLAG(IS_CHROMEOS)
 
-// Small helper to avoid constructing a StringPiece from nullptr.
-base::StringPiece ToStringPiece(const char* str) {
-  return str ? base::StringPiece(str) : base::StringPiece();
+// Small helper to avoid constructing a std::string_view from nullptr.
+std::string_view ToStringView(const char* str) {
+  return str ? std::string_view(str) : std::string_view();
 }
 
 }  // namespace
@@ -455,14 +456,14 @@
       device::udev_device_get_parent_with_subsystem_devtype(
           device, kInputSubsystem, nullptr);
 
-  const base::StringPiece vendor_id =
-      ToStringPiece(udev_device_get_sysattr_value(parent_device, "id/vendor"));
-  const base::StringPiece product_id =
-      ToStringPiece(udev_device_get_sysattr_value(parent_device, "id/product"));
-  const base::StringPiece hid_version =
-      ToStringPiece(udev_device_get_sysattr_value(parent_device, "id/version"));
-  const base::StringPiece name =
-      ToStringPiece(udev_device_get_sysattr_value(parent_device, "name"));
+  const std::string_view vendor_id =
+      ToStringView(udev_device_get_sysattr_value(parent_device, "id/vendor"));
+  const std::string_view product_id =
+      ToStringView(udev_device_get_sysattr_value(parent_device, "id/product"));
+  const std::string_view hid_version =
+      ToStringView(udev_device_get_sysattr_value(parent_device, "id/version"));
+  const std::string_view name =
+      ToStringView(udev_device_get_sysattr_value(parent_device, "name"));
 
   uint16_t vendor_id_int = HexStringToUInt16WithDefault(vendor_id, 0);
   uint16_t product_id_int = HexStringToUInt16WithDefault(product_id, 0);
@@ -478,10 +479,10 @@
           parent_device, kUsbSubsystem, kUsbDeviceType);
   std::string name_string(name);
   if (usb_device) {
-    const base::StringPiece usb_vendor_id =
-        ToStringPiece(udev_device_get_sysattr_value(usb_device, "idVendor"));
-    const base::StringPiece usb_product_id =
-        ToStringPiece(udev_device_get_sysattr_value(usb_device, "idProduct"));
+    const std::string_view usb_vendor_id =
+        ToStringView(udev_device_get_sysattr_value(usb_device, "idVendor"));
+    const std::string_view usb_product_id =
+        ToStringView(udev_device_get_sysattr_value(usb_device, "idProduct"));
 
     if (vendor_id == usb_vendor_id && product_id == usb_product_id) {
       const char* manufacturer =
@@ -496,8 +497,8 @@
       }
     }
 
-    const base::StringPiece version_number =
-        ToStringPiece(udev_device_get_sysattr_value(usb_device, "bcdDevice"));
+    const std::string_view version_number =
+        ToStringView(udev_device_get_sysattr_value(usb_device, "bcdDevice"));
     version_number_int = HexStringToUInt16WithDefault(version_number, 0);
   }
 
diff --git a/device/gamepad/gamepad_device_mac.h b/device/gamepad/gamepad_device_mac.h
index 4b34b2add..01f3594 100644
--- a/device/gamepad/gamepad_device_mac.h
+++ b/device/gamepad/gamepad_device_mac.h
@@ -11,6 +11,8 @@
 #include <ForceFeedback/ForceFeedback.h>
 #include <IOKit/hid/IOHIDManager.h>
 
+#include <string_view>
+
 #include "base/memory/weak_ptr.h"
 #include "device/gamepad/abstract_haptic_gamepad.h"
 #include "device/gamepad/gamepad_standard_mappings.h"
@@ -32,7 +34,7 @@
  public:
   GamepadDeviceMac(int location_id,
                    IOHIDDeviceRef device_ref,
-                   base::StringPiece product_name,
+                   std::string_view product_name,
                    int vendor_id,
                    int product_id);
   ~GamepadDeviceMac() override;
diff --git a/device/gamepad/gamepad_device_mac.mm b/device/gamepad/gamepad_device_mac.mm
index f02350d..352c6ae 100644
--- a/device/gamepad/gamepad_device_mac.mm
+++ b/device/gamepad/gamepad_device_mac.mm
@@ -93,7 +93,7 @@
 
 GamepadDeviceMac::GamepadDeviceMac(int location_id,
                                    IOHIDDeviceRef device_ref,
-                                   base::StringPiece product_name,
+                                   std::string_view product_name,
                                    int vendor_id,
                                    int product_id)
     : location_id_(location_id),
diff --git a/device/gamepad/gamepad_id_list.cc b/device/gamepad/gamepad_id_list.cc
index 5038a90..cab8b47 100644
--- a/device/gamepad/gamepad_id_list.cc
+++ b/device/gamepad/gamepad_id_list.cc
@@ -670,7 +670,7 @@
   return entry ? entry->xtype : kXInputTypeNone;
 }
 
-GamepadId GamepadIdList::GetGamepadId(base::StringPiece product_name,
+GamepadId GamepadIdList::GetGamepadId(std::string_view product_name,
                                       uint16_t vendor_id,
                                       uint16_t product_id) const {
   const auto* entry = GetGamepadInfo(vendor_id, product_id);
diff --git a/device/gamepad/gamepad_id_list.h b/device/gamepad/gamepad_id_list.h
index ada093fc..5fab67e6 100644
--- a/device/gamepad/gamepad_id_list.h
+++ b/device/gamepad/gamepad_id_list.h
@@ -8,12 +8,12 @@
 #include <stddef.h>
 #include <stdint.h>
 
+#include <string_view>
 #include <tuple>
 #include <unordered_set>
 #include <vector>
 
 #include "base/lazy_instance.h"
-#include "base/strings/string_piece.h"
 #include "device/gamepad/gamepad_export.h"
 
 namespace device {
@@ -136,7 +136,7 @@
   // Returns a GamepadId value suitable for identifying a specific model of
   // gamepad. If the gamepad is not contained in the list of known gamepads,
   // returns kUnknownGamepad.
-  GamepadId GetGamepadId(base::StringPiece product_name,
+  GamepadId GetGamepadId(std::string_view product_name,
                          uint16_t vendor_id,
                          uint16_t product_id) const;
 
diff --git a/device/gamepad/gamepad_id_list_unittest.cc b/device/gamepad/gamepad_id_list_unittest.cc
index 4923d45c8..64a257f8 100644
--- a/device/gamepad/gamepad_id_list_unittest.cc
+++ b/device/gamepad/gamepad_id_list_unittest.cc
@@ -4,6 +4,8 @@
 
 #include "device/gamepad/gamepad_id_list.h"
 
+#include <string_view>
+
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace device {
@@ -20,7 +22,7 @@
     uint16_t product = std::get<1>(item);
     uint32_t vendor_product_id = (vendor << 16) | product;
     GamepadId gamepad_id =
-        GamepadIdList::Get().GetGamepadId(base::StringPiece(), vendor, product);
+        GamepadIdList::Get().GetGamepadId(std::string_view(), vendor, product);
     seen_vendor_product_ids.insert(vendor_product_id);
     seen_gamepad_ids.insert(gamepad_id);
     EXPECT_NE(gamepad_id, GamepadId::kUnknownGamepad);
diff --git a/device/gamepad/gamepad_standard_mappings.h b/device/gamepad/gamepad_standard_mappings.h
index 71a35a9..9759ed41 100644
--- a/device/gamepad/gamepad_standard_mappings.h
+++ b/device/gamepad/gamepad_standard_mappings.h
@@ -5,7 +5,8 @@
 #ifndef DEVICE_GAMEPAD_GAMEPAD_STANDARD_MAPPINGS_H_
 #define DEVICE_GAMEPAD_GAMEPAD_STANDARD_MAPPINGS_H_
 
-#include "base/strings/string_piece.h"
+#include <string_view>
+
 #include "device/gamepad/public/cpp/gamepad.h"
 
 namespace device {
@@ -31,7 +32,7 @@
 // number reported by the device (bcdDevice). |bus_type| is the transport
 // used to connect to this device, or GAMEPAD_BUS_UNKNOWN if unknown.
 GamepadStandardMappingFunction GetGamepadStandardMappingFunction(
-    const base::StringPiece product_name,
+    const std::string_view product_name,
     const uint16_t vendor_id,
     const uint16_t product_id,
     const uint16_t hid_specification_version,
diff --git a/device/gamepad/gamepad_standard_mappings_linux.cc b/device/gamepad/gamepad_standard_mappings_linux.cc
index 3b109a2..8bf4a482 100644
--- a/device/gamepad/gamepad_standard_mappings_linux.cc
+++ b/device/gamepad/gamepad_standard_mappings_linux.cc
@@ -1086,7 +1086,7 @@
 }  // namespace
 
 GamepadStandardMappingFunction GetGamepadStandardMappingFunction(
-    const base::StringPiece product_name,
+    const std::string_view product_name,
     const uint16_t vendor_id,
     const uint16_t product_id,
     const uint16_t hid_specification_version,
diff --git a/device/gamepad/gamepad_standard_mappings_mac.mm b/device/gamepad/gamepad_standard_mappings_mac.mm
index 421987d..ee40a26 100644
--- a/device/gamepad/gamepad_standard_mappings_mac.mm
+++ b/device/gamepad/gamepad_standard_mappings_mac.mm
@@ -887,7 +887,7 @@
 }  // namespace
 
 GamepadStandardMappingFunction GetGamepadStandardMappingFunction(
-    const base::StringPiece product_name,
+    const std::string_view product_name,
     const uint16_t vendor_id,
     const uint16_t product_id,
     const uint16_t hid_specification_version,
diff --git a/device/gamepad/gamepad_standard_mappings_win.cc b/device/gamepad/gamepad_standard_mappings_win.cc
index 1b11c794..a9fa9da 100644
--- a/device/gamepad/gamepad_standard_mappings_win.cc
+++ b/device/gamepad/gamepad_standard_mappings_win.cc
@@ -617,7 +617,7 @@
 }  // namespace
 
 GamepadStandardMappingFunction GetGamepadStandardMappingFunction(
-    const base::StringPiece product_name,
+    const std::string_view product_name,
     const uint16_t vendor_id,
     const uint16_t product_id,
     const uint16_t hid_specification_version,
diff --git a/device/gamepad/test_support/fake_igamepad_statics.cc b/device/gamepad/test_support/fake_igamepad_statics.cc
index c0435d0d..8c03969 100644
--- a/device/gamepad/test_support/fake_igamepad_statics.cc
+++ b/device/gamepad/test_support/fake_igamepad_statics.cc
@@ -6,7 +6,6 @@
 
 #include "base/notreached.h"
 #include "base/run_loop.h"
-#include "base/strings/string_piece.h"
 #include "base/task/sequenced_task_runner.h"
 #include "base/task/thread_pool.h"
 #include "device/gamepad/test_support/fake_igamepad.h"
@@ -168,7 +167,7 @@
     const Microsoft::WRL::ComPtr<FakeIGamepad>& gamepad_to_add,
     uint16_t hardware_product_id,
     uint16_t hardware_vendor_id,
-    base::StringPiece display_name) {
+    std::string_view display_name) {
   CacheGamepad(gamepad_to_add, hardware_product_id, hardware_vendor_id,
                display_name);
   SimulateGamepadEvent(
@@ -217,7 +216,7 @@
     Microsoft::WRL::ComPtr<FakeIGamepad> fake_gamepad_to_add,
     uint16_t hardware_product_id,
     uint16_t hardware_vendor_id,
-    base::StringPiece display_name) {
+    std::string_view display_name) {
   uint64_t gamepad_id = next_gamepad_id_++;
 
   fake_gamepad_to_add->SetId(gamepad_id);
diff --git a/device/gamepad/test_support/fake_igamepad_statics.h b/device/gamepad/test_support/fake_igamepad_statics.h
index 9612061e..f97dd6f 100644
--- a/device/gamepad/test_support/fake_igamepad_statics.h
+++ b/device/gamepad/test_support/fake_igamepad_statics.h
@@ -10,11 +10,11 @@
 #include <windows.foundation.collections.h>
 #include <wrl.h>
 
+#include <string_view>
 #include <unordered_map>
 
 #include "base/containers/flat_map.h"
 #include "base/functional/callback_forward.h"
-#include "base/strings/string_piece.h"
 #include "device/gamepad/test_support/fake_igamepad.h"
 #include "device/gamepad/test_support/fake_iraw_game_controller.h"
 
@@ -78,7 +78,7 @@
       const Microsoft::WRL::ComPtr<FakeIGamepad>& gamepad_to_add,
       uint16_t hardware_product_id,
       uint16_t hardware_vendor_id,
-      base::StringPiece display_name);
+      std::string_view display_name);
 
   // Uses a fake gamepad to simulate a gamepad disconnection operation for test.
   // Due to the multi-threaded apartment nature of IGamepadStatics COM API, the
@@ -119,7 +119,7 @@
   void CacheGamepad(Microsoft::WRL::ComPtr<FakeIGamepad> fake_gamepad_to_add,
                     uint16_t hardware_product_id,
                     uint16_t hardware_vendor_id,
-                    base::StringPiece display_name);
+                    std::string_view display_name);
   void RemoveCachedGamepad(
       const Microsoft::WRL::ComPtr<FakeIGamepad>& fake_gamepad_to_remove);
 
diff --git a/device/gamepad/test_support/fake_iraw_game_controller.cc b/device/gamepad/test_support/fake_iraw_game_controller.cc
index 374e99b..460bbba 100644
--- a/device/gamepad/test_support/fake_iraw_game_controller.cc
+++ b/device/gamepad/test_support/fake_iraw_game_controller.cc
@@ -5,7 +5,6 @@
 #include "device/gamepad/test_support/fake_iraw_game_controller.h"
 
 #include "base/notreached.h"
-#include "base/strings/string_piece.h"
 #include "base/win/scoped_hstring.h"
 #include "device/gamepad/test_support/fake_winrt_wgi_environment.h"
 
@@ -14,7 +13,7 @@
 FakeIRawGameController::FakeIRawGameController(int64_t gamepad_id,
                                                UINT16 hardware_product_id,
                                                UINT16 hardware_vendor_id,
-                                               base::StringPiece display_name)
+                                               std::string_view display_name)
     : gamepad_id_(gamepad_id),
       hardware_product_id_(hardware_product_id),
       hardware_vendor_id_(hardware_vendor_id),
diff --git a/device/gamepad/test_support/fake_iraw_game_controller.h b/device/gamepad/test_support/fake_iraw_game_controller.h
index 2e9f7fbb1..aa2f15f 100644
--- a/device/gamepad/test_support/fake_iraw_game_controller.h
+++ b/device/gamepad/test_support/fake_iraw_game_controller.h
@@ -10,7 +10,7 @@
 #include <windows.gaming.input.h>
 #include <wrl.h>
 
-#include "base/strings/string_piece.h"
+#include <string_view>
 
 namespace device {
 
@@ -24,7 +24,7 @@
   FakeIRawGameController(int64_t gamepad_id,
                          UINT16 hardware_product_id,
                          UINT16 hardware_vendor_id,
-                         base::StringPiece display_name);
+                         std::string_view display_name);
 
   FakeIRawGameController(const FakeIRawGameController&) = delete;
   FakeIRawGameController& operator=(const FakeIRawGameController&) = delete;
@@ -71,7 +71,7 @@
   uint64_t gamepad_id_;
   UINT16 hardware_product_id_;
   UINT16 hardware_vendor_id_;
-  base::StringPiece display_name_;
+  std::string_view display_name_;
 };
 
 }  // namespace device
diff --git a/device/gamepad/udev_gamepad_linux.cc b/device/gamepad/udev_gamepad_linux.cc
index 288fb70..a7578ef 100644
--- a/device/gamepad/udev_gamepad_linux.cc
+++ b/device/gamepad/udev_gamepad_linux.cc
@@ -15,20 +15,20 @@
 // Extract the device |index| from a device node |path|. The path must begin
 // with |prefix| and the remainder of the string must be parsable as an integer.
 // Returns true if parsing succeeded.
-bool DeviceIndexFromDevicePath(base::StringPiece path,
-                               base::StringPiece prefix,
+bool DeviceIndexFromDevicePath(std::string_view path,
+                               std::string_view prefix,
                                int* index) {
   DCHECK(index);
   if (!base::StartsWith(path, prefix))
     return false;
-  base::StringPiece index_str = path;
+  std::string_view index_str = path;
   index_str.remove_prefix(prefix.length());
   return base::StringToInt(index_str, index);
 }
 
-// Small helper to avoid constructing a `StringPiece` from nullptr.
-base::StringPiece ToStringPiece(const char* str) {
-  return str ? base::StringPiece(str) : base::StringPiece();
+// Small helper to avoid constructing a `std::string_view` from nullptr.
+std::string_view ToStringView(const char* str) {
+  return str ? std::string_view(str) : std::string_view();
 }
 
 }  // namespace
@@ -38,8 +38,8 @@
 
 UdevGamepadLinux::UdevGamepadLinux(Type type,
                                    int index,
-                                   base::StringPiece path,
-                                   base::StringPiece syspath_prefix)
+                                   std::string_view path,
+                                   std::string_view syspath_prefix)
     : type(type), index(index), path(path), syspath_prefix(syspath_prefix) {}
 
 // static
@@ -54,24 +54,24 @@
   if (!dev)
     return nullptr;
 
-  const auto node_path = ToStringPiece(device::udev_device_get_devnode(dev));
+  const auto node_path = ToStringView(device::udev_device_get_devnode(dev));
   if (node_path.empty())
     return nullptr;
 
-  const auto node_syspath = ToStringPiece(device::udev_device_get_syspath(dev));
+  const auto node_syspath = ToStringView(device::udev_device_get_syspath(dev));
   if (node_syspath.empty())
     return nullptr;
 
-  base::StringPiece parent_syspath;
+  std::string_view parent_syspath;
   udev_device* parent_dev =
       device::udev_device_get_parent_with_subsystem_devtype(
           dev, kInputSubsystem, nullptr);
   if (parent_dev)
-    parent_syspath = ToStringPiece(device::udev_device_get_syspath(parent_dev));
+    parent_syspath = ToStringView(device::udev_device_get_syspath(parent_dev));
 
   for (const auto& entry : device_roots) {
     const Type node_type = entry.first;
-    const base::StringPiece prefix = entry.second;
+    const std::string_view prefix = entry.second;
     int index_value;
     if (!DeviceIndexFromDevicePath(node_path, prefix, &index_value))
       continue;
@@ -90,8 +90,8 @@
     //     /sys/devices/[...]/0003:054C:09CC.0026/hidraw/hidraw3
     // Then |syspath_prefix| is the common prefix before "input" or "hidraw":
     //     /sys/devices/[...]/0003:054C:09CC.0026/
-    base::StringPiece syspath;
-    base::StringPiece subsystem;
+    std::string_view syspath;
+    std::string_view subsystem;
     if (node_type == Type::EVDEV || node_type == Type::JOYDEV) {
       // If the device is in the input subsystem but does not have the
       // ID_INPUT_JOYSTICK property, ignore it.
@@ -105,7 +105,7 @@
       subsystem = kHidrawSubsystem;
     }
 
-    base::StringPiece syspath_prefix;
+    std::string_view syspath_prefix;
     if (!syspath.empty()) {
       size_t subsystem_start = syspath.find(subsystem);
       if (subsystem_start == std::string::npos)
diff --git a/device/gamepad/udev_gamepad_linux.h b/device/gamepad/udev_gamepad_linux.h
index 65c7ee3e5..7bd22e8 100644
--- a/device/gamepad/udev_gamepad_linux.h
+++ b/device/gamepad/udev_gamepad_linux.h
@@ -7,8 +7,7 @@
 
 #include <memory>
 #include <string>
-
-#include "base/strings/string_piece.h"
+#include <string_view>
 
 extern "C" {
 struct udev_device;
@@ -29,8 +28,8 @@
 
   UdevGamepadLinux(Type type,
                    int index,
-                   base::StringPiece path,
-                   base::StringPiece syspath_prefix);
+                   std::string_view path,
+                   std::string_view syspath_prefix);
   ~UdevGamepadLinux() = default;
 
   // Factory method for creating UdevGamepadLinux instances. Extracts info
diff --git a/device/gamepad/xbox_controller_mac.mm b/device/gamepad/xbox_controller_mac.mm
index 96abc0a..7bf7673b 100644
--- a/device/gamepad/xbox_controller_mac.mm
+++ b/device/gamepad/xbox_controller_mac.mm
@@ -14,6 +14,7 @@
 #include <algorithm>
 #include <cmath>
 #include <limits>
+#include <string_view>
 
 #include "base/apple/foundation_util.h"
 #include "base/check_op.h"
@@ -378,7 +379,7 @@
   // elsewhere.
   xinput_type_ = GamepadIdList::Get().GetXInputType(vendor_id_, product_id_);
   DCHECK_NE(xinput_type_, kXInputTypeNone);
-  gamepad_id_ = GamepadIdList::Get().GetGamepadId(base::StringPiece(),
+  gamepad_id_ = GamepadIdList::Get().GetGamepadId(std::string_view(),
                                                   vendor_id_, product_id_);
   RecordConnectedGamepad(gamepad_id_);
 
diff --git a/device/udev_linux/udev_watcher.cc b/device/udev_linux/udev_watcher.cc
index 7d98667..f03009f 100644
--- a/device/udev_linux/udev_watcher.cc
+++ b/device/udev_linux/udev_watcher.cc
@@ -9,13 +9,12 @@
 #include "base/functional/bind.h"
 #include "base/logging.h"
 #include "base/memory/ptr_util.h"
-#include "base/strings/string_piece.h"
 #include "base/threading/scoped_blocking_call.h"
 
 namespace device {
 
-UdevWatcher::Filter::Filter(base::StringPiece subsystem_in,
-                            base::StringPiece devtype_in) {
+UdevWatcher::Filter::Filter(std::string_view subsystem_in,
+                            std::string_view devtype_in) {
   if (!subsystem_in.empty())
     subsystem_ = std::string(subsystem_in);
   if (!devtype_in.empty())
diff --git a/device/udev_linux/udev_watcher.h b/device/udev_linux/udev_watcher.h
index 524e661..350faf11 100644
--- a/device/udev_linux/udev_watcher.h
+++ b/device/udev_linux/udev_watcher.h
@@ -7,13 +7,13 @@
 
 #include <memory>
 #include <string>
+#include <string_view>
 #include <vector>
 
 #include "base/component_export.h"
 #include "base/files/file_descriptor_watcher_posix.h"
 #include "base/memory/raw_ptr.h"
 #include "base/sequence_checker.h"
-#include "base/strings/string_piece.h"
 #include "device/udev_linux/scoped_udev.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
@@ -37,7 +37,7 @@
   // udev_monitor_filter_add_match_subsystem_devtype().
   class Filter {
    public:
-    Filter(base::StringPiece subsystem_in, base::StringPiece devtype_in);
+    Filter(std::string_view subsystem_in, std::string_view devtype_in);
     Filter(const Filter&);
     ~Filter();
 
diff --git a/device/udev_linux/udev_watcher_unittest.cc b/device/udev_linux/udev_watcher_unittest.cc
index 1ca68ed..6270386 100644
--- a/device/udev_linux/udev_watcher_unittest.cc
+++ b/device/udev_linux/udev_watcher_unittest.cc
@@ -18,8 +18,8 @@
   UdevWatcher::Filter subsystem_devtype_filter(kSubsystem, kDevtype);
   EXPECT_TRUE(subsystem_devtype_filter.subsystem());
   EXPECT_TRUE(subsystem_devtype_filter.devtype());
-  base::StringPiece filter_subsystem = subsystem_devtype_filter.subsystem();
-  base::StringPiece filter_devtype = subsystem_devtype_filter.devtype();
+  std::string_view filter_subsystem = subsystem_devtype_filter.subsystem();
+  std::string_view filter_devtype = subsystem_devtype_filter.devtype();
   EXPECT_EQ(kSubsystem, filter_subsystem);
   EXPECT_EQ(kDevtype, filter_devtype);
 }
diff --git a/docs/windows_build_instructions.md b/docs/windows_build_instructions.md
index 54db02b..773241e 100644
--- a/docs/windows_build_instructions.md
+++ b/docs/windows_build_instructions.md
@@ -136,6 +136,13 @@
 $ git config --global branch.autosetuprebase always
 ```
 
+While not necessarily required it can be helpful to configure git to allow long
+path support (beyond the Windows MAX_PATH limit):
+
+```shell
+git config --global core.longpaths true
+```
+
 Create a `chromium` directory for the checkout and change to it. You can call
 this whatever you like and put it wherever you like, as long as the full path
 has no spaces. However there are some performance benefits for Googlers in
diff --git a/extensions/browser/api/feedback_private/feedback_private_api.cc b/extensions/browser/api/feedback_private/feedback_private_api.cc
index ff17bbb3..f4d818e 100644
--- a/extensions/browser/api/feedback_private/feedback_private_api.cc
+++ b/extensions/browser/api/feedback_private/feedback_private_api.cc
@@ -229,7 +229,8 @@
     bool show_questionnaire,
     bool from_chrome_labs_or_kaleidoscope,
     bool from_autofill,
-    const base::Value::Dict& autofill_metadata) {
+    const base::Value::Dict& autofill_metadata,
+    const base::Value::Dict& ai_metadata) {
   auto info = std::make_unique<FeedbackInfo>();
 
   info->description = description_template;
@@ -240,7 +241,10 @@
   info->from_autofill = from_autofill;
   std::string autofill_metadata_json;
   base::JSONWriter::Write(autofill_metadata, &autofill_metadata_json);
-  info->autofill_metadata = autofill_metadata_json;
+  info->autofill_metadata = std::move(autofill_metadata_json);
+  std::string ai_metadata_json;
+  base::JSONWriter::Write(ai_metadata, &ai_metadata_json);
+  info->ai_metadata = std::move(ai_metadata_json);
 #if BUILDFLAG(IS_CHROMEOS_ASH)
   info->from_assistant = from_assistant;
   info->include_bluetooth_logs = include_bluetooth_logs;
diff --git a/extensions/browser/api/feedback_private/feedback_private_api.h b/extensions/browser/api/feedback_private/feedback_private_api.h
index c28ad64..29e1835 100644
--- a/extensions/browser/api/feedback_private/feedback_private_api.h
+++ b/extensions/browser/api/feedback_private/feedback_private_api.h
@@ -51,7 +51,8 @@
       bool show_questionnaire,
       bool from_chrome_labs_or_kaleidoscope,
       bool from_autofill,
-      const base::Value::Dict& autofill_metadata);
+      const base::Value::Dict& autofill_metadata,
+      const base::Value::Dict& ai_metadata);
 
   // BrowserContextKeyedAPI implementation.
   static BrowserContextKeyedAPIFactory<FeedbackPrivateAPI>*
diff --git a/extensions/common/api/feedback_private.idl b/extensions/common/api/feedback_private.idl
index 896ee0c..14fa2982 100644
--- a/extensions/common/api/feedback_private.idl
+++ b/extensions/common/api/feedback_private.idl
@@ -117,6 +117,9 @@
 
     // Whether or not the content is offensive or unsafe.
     boolean? isOffensiveOrUnsafe;
+
+    // A JSON formatted string containing ai metadata.
+    DOMString? aiMetadata;
   };
 
   // Possible statuses that can result from sending feedback.
diff --git a/gpu/command_buffer/service/dawn_context_provider.cc b/gpu/command_buffer/service/dawn_context_provider.cc
index 44fa417..228e8b88 100644
--- a/gpu/command_buffer/service/dawn_context_provider.cc
+++ b/gpu/command_buffer/service/dawn_context_provider.cc
@@ -333,6 +333,7 @@
   }
 
   const wgpu::FeatureName kOptionalFeatures[] = {
+      wgpu::FeatureName::BGRA8UnormStorage,
       wgpu::FeatureName::DualSourceBlending,
       wgpu::FeatureName::MultiPlanarFormatExtendedUsages,
       wgpu::FeatureName::MultiPlanarFormatP010,
diff --git a/internal b/internal
index 6b1a25b..e823fb2 160000
--- a/internal
+++ b/internal
@@ -1 +1 @@
-Subproject commit 6b1a25bd76bb7b2eb1682803a9e6ebfffe217162
+Subproject commit e823fb2b9ea82ebaae5a6bbc711094e9fce2011d
diff --git a/ios/web/crw_navigation_item_storage.mm b/ios/web/crw_navigation_item_storage.mm
index 6e90d7f..e6ad7931 100644
--- a/ios/web/crw_navigation_item_storage.mm
+++ b/ios/web/crw_navigation_item_storage.mm
@@ -5,7 +5,6 @@
 #import "ios/web/public/session/crw_navigation_item_storage.h"
 
 #import "base/apple/foundation_util.h"
-#import "base/metrics/histogram_functions.h"
 #import "base/strings/sys_string_conversions.h"
 #import "base/strings/utf_string_conversions.h"
 #import "ios/web/navigation/nscoder_util.h"
@@ -28,19 +27,6 @@
 NSString* const kNavigationItemStorageHTTPRequestHeadersKey = @"httpHeaders";
 NSString* const kNavigationItemStorageUserAgentTypeKey = @"userAgentType";
 
-const char kNavigationItemSerializedSizeHistogram[] =
-    "Session.WebStates.NavigationItem.SerializedSize";
-const char kNavigationItemSerializedVirtualURLSizeHistogram[] =
-    "Session.WebStates.NavigationItem.SerializedVirtualURLSize";
-const char kNavigationItemSerializedURLSizeHistogram[] =
-    "Session.WebStates.NavigationItem.SerializedURLSize";
-const char kNavigationItemSerializedReferrerURLSizeHistogram[] =
-    "Session.WebStates.NavigationItem.SerializedReferrerURLSize";
-const char kNavigationItemSerializedTitleSizeHistogram[] =
-    "Session.WebStates.NavigationItem.SerializedTitleSize";
-const char kNavigationItemSerializedRequestHeadersSizeHistogram[] =
-    "Session.WebStates.NavigationItem.SerializedRequestHeadersSize";
-
 }  // namespace web
 
 @implementation CRWNavigationItemStorage {
@@ -180,79 +166,36 @@
 - (void)encodeWithCoder:(NSCoder*)aCoder {
   // Desktop Chrome doesn't persist `url_` or `originalUrl_`, only
   // `virtualUrl_`. Chrome on iOS is persisting `url_`.
-  int serializedSizeInBytes = 0;
-  int serializedVirtualURLSizeInBytes = 0;
   if (_virtualURL != _URL && _virtualURL.is_valid()) {
     // In most cases _virtualURL is the same as URL. Not storing virtual URL
     // will save memory during unarchiving.
     const std::string& virtualURLSpec = _virtualURL.spec();
     web::nscoder_util::EncodeString(
         aCoder, web::kNavigationItemStorageVirtualURLKey, virtualURLSpec);
-    serializedVirtualURLSizeInBytes = virtualURLSpec.size();
-    serializedSizeInBytes += serializedVirtualURLSizeInBytes;
   }
-  base::UmaHistogramMemoryKB(
-      web::kNavigationItemSerializedVirtualURLSizeHistogram,
-      serializedVirtualURLSizeInBytes / 1024);
 
-  int serializedURLSizeInBytes = 0;
   if (_URL.is_valid()) {
-    const std::string& URLSpec = _URL.spec();
     web::nscoder_util::EncodeString(aCoder, web::kNavigationItemStorageURLKey,
-                                    URLSpec);
-    serializedURLSizeInBytes = URLSpec.size();
-    serializedSizeInBytes += serializedURLSizeInBytes;
+                                    _URL.spec());
   }
-  base::UmaHistogramMemoryKB(web::kNavigationItemSerializedURLSizeHistogram,
-                             serializedURLSizeInBytes / 1024);
 
-  int serializedReferrerURLSizeInBytes = 0;
   if (_referrer.url.is_valid()) {
-    const std::string& referrerURLSpec = _referrer.url.spec();
-    web::nscoder_util::EncodeString(
-        aCoder, web::kNavigationItemStorageReferrerURLKey, referrerURLSpec);
-    serializedReferrerURLSizeInBytes = referrerURLSpec.size();
-    serializedSizeInBytes += serializedReferrerURLSizeInBytes;
+    web::nscoder_util::EncodeString(aCoder,
+                                    web::kNavigationItemStorageReferrerURLKey,
+                                    _referrer.url.spec());
   }
-  base::UmaHistogramMemoryKB(
-      web::kNavigationItemSerializedReferrerURLSizeHistogram,
-      serializedReferrerURLSizeInBytes / 1024);
 
   [aCoder encodeInt:_referrer.policy
              forKey:web::kNavigationItemStorageReferrerPolicyKey];
   [aCoder encodeInt64:_timestamp.ToInternalValue()
                forKey:web::kNavigationItemStorageTimestampKey];
-  // Size of int is negligible, do not log or count towards session size.
-
-  NSString* title = base::SysUTF16ToNSString(_title);
-  [aCoder encodeObject:title forKey:web::kNavigationItemStorageTitleKey];
-  int serializedTitleSizeInBytes =
-      [[NSKeyedArchiver archivedDataWithRootObject:title
-                             requiringSecureCoding:NO
-                                             error:nullptr] length];
-  serializedSizeInBytes += serializedTitleSizeInBytes;
-  base::UmaHistogramMemoryKB(web::kNavigationItemSerializedTitleSizeHistogram,
-                             serializedTitleSizeInBytes / 1024);
-
-  std::string userAgent = web::GetUserAgentTypeDescription(_userAgentType);
+  [aCoder encodeObject:base::SysUTF16ToNSString(_title)
+                forKey:web::kNavigationItemStorageTitleKey];
   web::nscoder_util::EncodeString(
-      aCoder, web::kNavigationItemStorageUserAgentTypeKey, userAgent);
-  serializedSizeInBytes += userAgent.size();
-  // No need to log the user agent type size, because it's a set of constants.
-
+      aCoder, web::kNavigationItemStorageUserAgentTypeKey,
+      web::GetUserAgentTypeDescription(_userAgentType));
   [aCoder encodeObject:_HTTPRequestHeaders
                 forKey:web::kNavigationItemStorageHTTPRequestHeadersKey];
-  int serializedRequestHeadersSizeInBytes =
-      [[NSKeyedArchiver archivedDataWithRootObject:_HTTPRequestHeaders
-                             requiringSecureCoding:NO
-                                             error:nullptr] length];
-  serializedSizeInBytes += serializedRequestHeadersSizeInBytes;
-  base::UmaHistogramMemoryKB(
-      web::kNavigationItemSerializedRequestHeadersSizeHistogram,
-      serializedRequestHeadersSizeInBytes / 1024);
-
-  base::UmaHistogramMemoryKB(web::kNavigationItemSerializedSizeHistogram,
-                             serializedSizeInBytes / 1024);
 }
 
 #pragma mark - Properties
diff --git a/ios/web/crw_navigation_item_storage_unittest.mm b/ios/web/crw_navigation_item_storage_unittest.mm
index f750b1ad..12e61ff 100644
--- a/ios/web/crw_navigation_item_storage_unittest.mm
+++ b/ios/web/crw_navigation_item_storage_unittest.mm
@@ -11,8 +11,6 @@
 
 #import "base/apple/foundation_util.h"
 #import "base/strings/sys_string_conversions.h"
-#import "base/strings/utf_string_conversions.h"
-#import "base/test/metrics/histogram_tester.h"
 #import "ios/web/navigation/navigation_item_impl.h"
 #import "ios/web/public/navigation/referrer.h"
 #import "ios/web/public/session/proto/navigation.pb.h"
@@ -68,42 +66,6 @@
   EXPECT_NSEQ(item_storage(), decoded);
 }
 
-// Tests histograms recording.
-TEST_F(CRWNavigationItemStorageTest, Histograms) {
-  CRWNavigationItemStorage* storage = [[CRWNavigationItemStorage alloc] init];
-
-  [storage setURL:GURL("http://" + std::string(2048, 'a') + ".test")];
-  [storage setVirtualURL:GURL("http://" + std::string(3072, 'b') + ".test")];
-  [storage setReferrer:web::Referrer(
-                           GURL("http://" + std::string(4096, 'c') + ".test"),
-                           web::ReferrerPolicyDefault)];
-  [storage setTimestamp:base::Time::Now()];
-  [storage setTitle:base::UTF8ToUTF16(std::string(5120, 'd'))];
-  [storage setHTTPRequestHeaders:@{
-    @"HeaderKey1" : @"HeaderValue1",
-    @"HeaderKey2" : @"HeaderValue2",
-    @"HeaderKey3" : @"HeaderValue3",
-  }];
-  [storage setUserAgentType:web::UserAgentType::DESKTOP];
-
-  base::HistogramTester histogram_tester;
-  [NSKeyedArchiver archivedDataWithRootObject:storage
-                        requiringSecureCoding:NO
-                                        error:nil];
-  histogram_tester.ExpectBucketCount(
-      web::kNavigationItemSerializedSizeHistogram, 16 /*KB*/, 1);
-  histogram_tester.ExpectBucketCount(
-      web::kNavigationItemSerializedVirtualURLSizeHistogram, 3 /*KB*/, 1);
-  histogram_tester.ExpectBucketCount(
-      web::kNavigationItemSerializedURLSizeHistogram, 2 /*KB*/, 1);
-  histogram_tester.ExpectBucketCount(
-      web::kNavigationItemSerializedReferrerURLSizeHistogram, 4 /*KB*/, 1);
-  histogram_tester.ExpectBucketCount(
-      web::kNavigationItemSerializedTitleSizeHistogram, 5 /*KB*/, 1);
-  histogram_tester.ExpectBucketCount(
-      web::kNavigationItemSerializedRequestHeadersSizeHistogram, 1 /*KB*/, 1);
-}
-
 // CRWNavigationItemStorage does not store "virtualURL" if the it's the same
 // as "URL" to save memory. This test verifies that virtualURL actually gets
 // restored correctly.
diff --git a/ios/web/public/session/crw_navigation_item_storage.h b/ios/web/public/session/crw_navigation_item_storage.h
index 48aaac8e..56a4db3 100644
--- a/ios/web/public/session/crw_navigation_item_storage.h
+++ b/ios/web/public/session/crw_navigation_item_storage.h
@@ -45,14 +45,6 @@
 // The user agent type (std::string).
 extern NSString* const kNavigationItemStorageUserAgentTypeKey;
 
-// Constants for histogram names.
-extern const char kNavigationItemSerializedSizeHistogram[];
-extern const char kNavigationItemSerializedVirtualURLSizeHistogram[];
-extern const char kNavigationItemSerializedURLSizeHistogram[];
-extern const char kNavigationItemSerializedReferrerURLSizeHistogram[];
-extern const char kNavigationItemSerializedTitleSizeHistogram[];
-extern const char kNavigationItemSerializedRequestHeadersSizeHistogram[];
-
 }  // namespace web
 
 // NSCoding-compliant class used to serialize NavigationItem's persisted
diff --git a/ios_internal b/ios_internal
index 4159c45..c54b03b 160000
--- a/ios_internal
+++ b/ios_internal
@@ -1 +1 @@
-Subproject commit 4159c451256544d96e42efed8781757f5087830e
+Subproject commit c54b03b5aeddf91251fd9d39ed0ff0a4c6d141b0
diff --git a/media/base/media_switches.cc b/media/base/media_switches.cc
index cbfedb6..9d22cdd5 100644
--- a/media/base/media_switches.cc
+++ b/media/base/media_switches.cc
@@ -792,6 +792,12 @@
              base::FEATURE_DISABLED_BY_DEFAULT);
 #endif  // BUILDFLAG(IS_LINUX)
 
+// NVIDIA VA-API drivers do not support Chromium and can sometimes cause
+// crashes, disable VA-API on NVIDIA GPUs by default. See crbug.com/1492880.
+BASE_FEATURE(kVaapiOnNvidiaGPUs,
+             "VaapiOnNvidiaGPUs",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+
 // Enable VA-API hardware low power encoder for all codecs on intel Gen9x gpu.
 BASE_FEATURE(kVaapiLowPowerEncoderGen9x,
              "VaapiLowPowerEncoderGen9x",
diff --git a/media/base/media_switches.h b/media/base/media_switches.h
index 57bbe9d..e6d9899 100644
--- a/media/base/media_switches.h
+++ b/media/base/media_switches.h
@@ -329,6 +329,7 @@
 MEDIA_EXPORT BASE_DECLARE_FEATURE(kVaapiVideoEncodeLinux);
 MEDIA_EXPORT BASE_DECLARE_FEATURE(kVaapiIgnoreDriverChecks);
 #endif  // BUILDFLAG(IS_LINUX)
+MEDIA_EXPORT BASE_DECLARE_FEATURE(kVaapiOnNvidiaGPUs);
 MEDIA_EXPORT BASE_DECLARE_FEATURE(kVaapiLowPowerEncoderGen9x);
 MEDIA_EXPORT BASE_DECLARE_FEATURE(kVaapiEnforceVideoMinMaxResolution);
 MEDIA_EXPORT BASE_DECLARE_FEATURE(kVaapiVideoMinResolutionForPerformance);
diff --git a/media/gpu/vaapi/vaapi_wrapper.cc b/media/gpu/vaapi/vaapi_wrapper.cc
index 078bdcf..6b63221 100644
--- a/media/gpu/vaapi/vaapi_wrapper.cc
+++ b/media/gpu/vaapi/vaapi_wrapper.cc
@@ -1445,54 +1445,6 @@
   return VASupportedProfiles::Get().IsProfileSupported(mode, va_profile);
 }
 
-#if BUILDFLAG(IS_LINUX)
-// Some VA-API drivers (vdpau-va-driver) will crash if used with VA/DRM on
-// NVIDIA GPUs. This function checks if such drivers are present.
-bool IsBrokenNvidiaVaapiDriverPresent() {
-  std::vector<std::string> va_drivers_paths;
-
-  std::string va_drivers_paths_env;
-  auto env = base::Environment::Create();
-  if (env->GetVar("LIBVA_DRIVERS_PATH", &va_drivers_paths_env)) {
-    va_drivers_paths =
-        base::SplitString(va_drivers_paths_env, ":", base::KEEP_WHITESPACE,
-                          base::SPLIT_WANT_NONEMPTY);
-  } else {
-    // All known default VA driver paths of distributions shipping
-    // vdpau-va-driver
-    va_drivers_paths = {
-        "/usr/lib32/dri",
-        "/usr/lib64/dri",
-        "/usr/lib/dri",
-
-        "/usr/lib/aarch64-linux-gnu/dri",
-        "/usr/lib/i386-linux-gnu/dri",
-        "/usr/lib/x86_64-linux-gnu/dri",
-    };
-  }
-
-  // For NVIDIA GPUs (i.e., DRM driver name "nvidia-drm"), libva will look for
-  // nvidia_drv_video.so [1]. Therefore, all we need to check is whether
-  // nvidia_drv_video.so actually points to vdpau_drv_video.so. This check is
-  // best effort: base::MakeAbsoluteFilePath() resolves symbolic links, but it's
-  // entirely possible that nvidia_drv_video.so is actually a hard link to
-  // vdpau_drv_video.so or just a plain rename of it. We don't attempt to detect
-  // those cases.
-  //
-  // [1]
-  // https://github.com/intel/libva/blob/b4870fdfe2d41b579036dae280dfc7a5e732127f/va/drm/va_drm_utils.c#L67
-  for (const auto& va_drivers_path : va_drivers_paths) {
-    const auto nvidia_va_driver_path = base::MakeAbsoluteFilePath(
-        base::FilePath(va_drivers_path).Append("nvidia_drv_video.so"));
-    if (nvidia_va_driver_path.BaseName().value() == "vdpau_drv_video.so") {
-      return true;
-    }
-  }
-
-  return false;
-}
-#endif
-
 }  // namespace
 
 // static
@@ -1506,19 +1458,6 @@
   VADisplayStateSingleton& va_display_state = GetInstance();
   base::AutoLock lock(va_display_state.lock_);
 
-#if BUILDFLAG(IS_LINUX)
-  std::string va_driver_name;
-  auto env = base::Environment::Create();
-  if (env->GetVar("LIBVA_DRIVER_NAME", &va_driver_name) &&
-      va_driver_name == "vdpau") {
-    // The vdpau VA driver will crash if used with VA/DRM. Do not open any DRM
-    // device if the user explicitly requested this driver.
-    return;
-  }
-
-  const bool is_nvidia_va_drm_broken = IsBrokenNvidiaVaapiDriverPresent();
-#endif
-
   constexpr char kRenderNodeFilePattern[] = "/dev/dri/renderD%d";
   // This loop ends on either the first card that does not exist or the first
   // render node that is not vgem.
@@ -1543,14 +1482,13 @@
     if (base::EqualsCaseInsensitiveASCII(version_name, "vgem")) {
       continue;
     }
-#if BUILDFLAG(IS_LINUX)
-    // Skip NVIDIA GPUs if the VA-API driver used for them is known for crashing
-    // with VA/DRM.
-    if (is_nvidia_va_drm_broken &&
-        base::EqualsCaseInsensitiveASCII(version_name, "nvidia-drm")) {
+    // Skip NVIDIA device because their VA-API drivers do not support
+    // Chromium and can sometimes cause crashes (see crbug.com/1492880).
+    if (base::EqualsCaseInsensitiveASCII(version_name, "nvidia-drm") &&
+        !base::FeatureList::IsEnabled(kVaapiOnNvidiaGPUs)) {
+      LOG(WARNING) << "Skipping nVidia device named: " << version_name;
       continue;
     }
-#endif
     va_display_state.drm_fd_ = base::ScopedFD(drm_file.TakePlatformFile());
     return;
   }
diff --git a/net/http/http_auth_controller.cc b/net/http/http_auth_controller.cc
index be4d89f0..a3bfb754 100644
--- a/net/http/http_auth_controller.cc
+++ b/net/http/http_auth_controller.cc
@@ -521,7 +521,6 @@
     embedded_identity_used_ = true;
     // TODO(eroman): If the password is blank, should we also try combining
     // with a password from the cache?
-    UMA_HISTOGRAM_BOOLEAN("net.HttpIdentSrcURL", true);
     return true;
   }
 
diff --git a/net/http/transport_security_state.cc b/net/http/transport_security_state.cc
index 7ea8987..a2474cd 100644
--- a/net/http/transport_security_state.cc
+++ b/net/http/transport_security_state.cc
@@ -21,8 +21,6 @@
 #include "base/logging.h"
 #include "base/metrics/field_trial.h"
 #include "base/metrics/field_trial_params.h"
-#include "base/metrics/histogram_functions.h"
-#include "base/metrics/histogram_macros.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
@@ -445,19 +443,10 @@
     return PKPStatus::OK;
   }
 
-  PKPStatus pin_validity = CheckPublicKeyPinsImpl(
-      host_port_pair, is_issued_by_known_root, public_key_hashes,
-      served_certificate_chain, validated_certificate_chain, report_status,
-      network_anonymization_key, pinning_failure_log);
-
-  // Don't track statistics when a local trust anchor would override the pinning
-  // anyway.
-  if (!is_issued_by_known_root)
-    return pin_validity;
-
-  UMA_HISTOGRAM_BOOLEAN("Net.PublicKeyPinSuccess",
-                        pin_validity == PKPStatus::OK);
-  return pin_validity;
+  return CheckPublicKeyPinsImpl(host_port_pair, is_issued_by_known_root,
+                                public_key_hashes, served_certificate_chain,
+                                validated_certificate_chain, report_status,
+                                network_anonymization_key, pinning_failure_log);
 }
 
 bool TransportSecurityState::HasPublicKeyPins(const std::string& host) {
diff --git a/net/websockets/websocket_channel.cc b/net/websockets/websocket_channel.cc
index 7e555c8..01f2b0c 100644
--- a/net/websockets/websocket_channel.cc
+++ b/net/websockets/websocket_channel.cc
@@ -324,8 +324,8 @@
   if (op_code == WebSocketFrameHeader::kOpCodeText ||
       (op_code == WebSocketFrameHeader::kOpCodeContinuation &&
        sending_text_message_)) {
-    StreamingUtf8Validator::State state =
-        outgoing_utf8_validator_.AddBytes(buffer->data(), buffer_size);
+    StreamingUtf8Validator::State state = outgoing_utf8_validator_.AddBytes(
+        base::make_span(buffer->bytes(), buffer_size));
     if (state == StreamingUtf8Validator::INVALID ||
         (state == StreamingUtf8Validator::VALID_MIDPOINT && fin)) {
       // TODO(ricea): Kill renderer.
@@ -800,8 +800,8 @@
        receiving_text_message_)) {
     // This call is not redundant when size == 0 because it tells us what
     // the current state is.
-    StreamingUtf8Validator::State state = incoming_utf8_validator_.AddBytes(
-        payload.data(), static_cast<size_t>(payload.size()));
+    StreamingUtf8Validator::State state =
+        incoming_utf8_validator_.AddBytes(base::as_byte_span(payload));
     if (state == StreamingUtf8Validator::INVALID ||
         (state == StreamingUtf8Validator::VALID_MIDPOINT && final)) {
       FailChannel("Could not decode a text frame as UTF-8.",
diff --git a/ppapi/buildflags/buildflags.gni b/ppapi/buildflags/buildflags.gni
index 0bc0e153..10ce8caa 100644
--- a/ppapi/buildflags/buildflags.gni
+++ b/ppapi/buildflags/buildflags.gni
@@ -3,7 +3,6 @@
 # found in the LICENSE file.
 
 import("//build/config/cast.gni")
-import("//components/nacl/features.gni")
 
 declare_args() {
   # Enables basic plugin support. This enables support for registering and
@@ -17,9 +16,7 @@
 
 declare_args() {
   # Enables Pepper API (PPAPI) plugin support.
-  # The only remaining PPAPI plugin supported is NaCl and if is disabled
-  # we can disable PPAPI.
-  enable_ppapi = enable_plugins && enable_nacl && !is_fuchsia
+  enable_ppapi = enable_plugins && !is_fuchsia
 }
 
 assert(enable_plugins || !enable_ppapi)
diff --git a/rlz/chromeos/lib/rlz_value_store_chromeos.cc b/rlz/chromeos/lib/rlz_value_store_chromeos.cc
index d527ff1..0bb1592 100644
--- a/rlz/chromeos/lib/rlz_value_store_chromeos.cc
+++ b/rlz/chromeos/lib/rlz_value_store_chromeos.cc
@@ -18,7 +18,6 @@
 #include "base/lazy_instance.h"
 #include "base/logging.h"
 #include "base/memory/ptr_util.h"
-#include "base/metrics/histogram_macros.h"
 #include "base/path_service.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_piece.h"
@@ -142,12 +141,10 @@
 // Callback invoked for DebugDaemonClient::SetRlzPingSent.
 void OnSetRlzPingSent(int retry_count, bool success) {
   if (success) {
-    UMA_HISTOGRAM_BOOLEAN("Rlz.SetRlzPingSent", true);
     return;
   }
 
   if (retry_count >= RlzValueStoreChromeOS::kMaxRetryCount) {
-    UMA_HISTOGRAM_BOOLEAN("Rlz.SetRlzPingSent", false);
     LOG(ERROR) << "Setting " << ash::system::kShouldSendRlzPingKey
                << " failed after " << RlzValueStoreChromeOS::kMaxRetryCount
                << " attempts.";
diff --git a/services/network/ip_protection_config_cache_impl.cc b/services/network/ip_protection_config_cache_impl.cc
index d3ded71..530cc61 100644
--- a/services/network/ip_protection_config_cache_impl.cc
+++ b/services/network/ip_protection_config_cache_impl.cc
@@ -13,6 +13,7 @@
 #include "services/network/ip_protection_proxy_list_manager_impl.h"
 #include "services/network/ip_protection_token_cache_manager.h"
 #include "services/network/ip_protection_token_cache_manager_impl.h"
+#include "services/network/public/mojom/network_context.mojom-shared.h"
 #include "services/network/public/mojom/network_context.mojom.h"
 
 namespace network {
@@ -44,12 +45,20 @@
 }
 
 bool IpProtectionConfigCacheImpl::AreAuthTokensAvailable() {
+  // Verify there is at least one cache manager and all have available tokens.
+  bool all_caches_have_tokens = !ipp_token_cache_managers_.empty();
   for (const auto& manager : ipp_token_cache_managers_) {
     if (!manager.second->IsAuthTokenAvailable()) {
-      return false;
+      base::UmaHistogramEnumeration(
+          "NetworkService.IpProtection.EmptyTokenCache", manager.first);
+      all_caches_have_tokens = false;
     }
   }
-  return !ipp_token_cache_managers_.empty();
+
+  base::UmaHistogramBoolean(
+      "NetworkService.IpProtection.AreAuthTokensAvailable",
+      all_caches_have_tokens);
+  return all_caches_have_tokens;
 }
 
 absl::optional<network::mojom::BlindSignedAuthTokenPtr>
diff --git a/services/network/ip_protection_config_cache_impl_unittest.cc b/services/network/ip_protection_config_cache_impl_unittest.cc
index af52d38..f94e1824 100644
--- a/services/network/ip_protection_config_cache_impl_unittest.cc
+++ b/services/network/ip_protection_config_cache_impl_unittest.cc
@@ -13,6 +13,7 @@
 #include "services/network/ip_protection_config_cache_impl.h"
 #include "services/network/ip_protection_proxy_list_manager.h"
 #include "services/network/ip_protection_proxy_list_manager_impl.h"
+#include "services/network/public/mojom/network_context.mojom-shared.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
@@ -20,6 +21,11 @@
 
 namespace {
 
+constexpr char kAreAuthTokensAvailableHistogram[] =
+    "NetworkService.IpProtection.AreAuthTokensAvailable";
+constexpr char kEmptyTokenCacheHistogram[] =
+    "NetworkService.IpProtection.EmptyTokenCache";
+
 class MockIpProtectionTokenCacheManager : public IpProtectionTokenCacheManager {
  public:
   bool IsAuthTokenAvailable() override { return auth_token_.has_value(); }
@@ -79,6 +85,8 @@
         ipp_config_cache_(std::make_unique<IpProtectionConfigCacheImpl>(
             receiver_.BindNewPipeAndPassRemote())) {}
 
+  base::HistogramTester histogram_tester_;
+
   base::test::TaskEnvironment task_environment_{
       base::test::TaskEnvironment::TimeSource::MOCK_TIME};
 
@@ -103,6 +111,9 @@
   ASSERT_FALSE(
       ipp_config_cache_->GetAuthToken(1).has_value());  // ProxyB has no tokens.
   ASSERT_TRUE(ipp_config_cache_->GetAuthToken(0));
+  histogram_tester_.ExpectTotalCount(kAreAuthTokensAvailableHistogram, 1);
+  histogram_tester_.ExpectBucketCount(kAreAuthTokensAvailableHistogram, true,
+                                      1);
 }
 
 // Token cache manager returns available token for proxyB.
@@ -120,6 +131,40 @@
   ASSERT_FALSE(
       ipp_config_cache_->GetAuthToken(0).has_value());  // ProxyA has no tokens.
   ASSERT_TRUE(ipp_config_cache_->GetAuthToken(1));
+  histogram_tester_.ExpectTotalCount(kAreAuthTokensAvailableHistogram, 1);
+  histogram_tester_.ExpectBucketCount(kAreAuthTokensAvailableHistogram, true,
+                                      1);
+}
+
+TEST_F(IpProtectionConfigCacheImplTest,
+       AreAuthTokensAvailable_OneTokenCacheIsEmpty) {
+  auto exp_token = mojom::BlindSignedAuthToken::New();
+  exp_token->token = "a-token";
+  auto ipp_token_cache_manager =
+      std::make_unique<MockIpProtectionTokenCacheManager>();
+  ipp_token_cache_manager->SetAuthToken(std::move(exp_token));
+  ipp_config_cache_->SetIpProtectionTokenCacheManagerForTesting(
+      network::mojom::IpProtectionProxyLayer::kProxyA,
+      std::move(ipp_token_cache_manager));
+  ipp_config_cache_->SetIpProtectionTokenCacheManagerForTesting(
+      network::mojom::IpProtectionProxyLayer::kProxyB,
+      std::make_unique<MockIpProtectionTokenCacheManager>());
+
+  ASSERT_FALSE(ipp_config_cache_->AreAuthTokensAvailable());
+  histogram_tester_.ExpectTotalCount(kAreAuthTokensAvailableHistogram, 1);
+  histogram_tester_.ExpectBucketCount(kAreAuthTokensAvailableHistogram, false,
+                                      1);
+  histogram_tester_.ExpectTotalCount(kEmptyTokenCacheHistogram, 1);
+  histogram_tester_.ExpectBucketCount(
+      kEmptyTokenCacheHistogram, mojom::IpProtectionProxyLayer::kProxyB, 1);
+}
+
+TEST_F(IpProtectionConfigCacheImplTest,
+       AreAuthTokensAvailable_NoProxiesConfigured) {
+  ASSERT_FALSE(ipp_config_cache_->AreAuthTokensAvailable());
+  histogram_tester_.ExpectTotalCount(kAreAuthTokensAvailableHistogram, 1);
+  histogram_tester_.ExpectBucketCount(kAreAuthTokensAvailableHistogram, false,
+                                      1);
 }
 
 // Proxy list manager returns currently cached proxy hostnames.
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index 4236f97..69a6fb7 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -7676,31 +7676,6 @@
             ]
         }
     ],
-    "GwpAsanAndroid": [
-        {
-            "platforms": [
-                "android",
-                "android_webview"
-            ],
-            "experiments": [
-                {
-                    "name": "EnabledLowerTotalPages_08312023",
-                    "params": {
-                        "AllocationSamplingMultiplier": "2000",
-                        "AllocationSamplingRange": "20",
-                        "MaxAllocations": "70",
-                        "MaxMetadata": "255",
-                        "ProcessSamplingProbability": "0.015",
-                        "TotalPages": "512"
-                    },
-                    "enable_features": [
-                        "GwpAsanMalloc",
-                        "GwpAsanPartitionAlloc"
-                    ]
-                }
-            ]
-        }
-    ],
     "GwpAsanLinux": [
         {
             "platforms": [
@@ -14168,21 +14143,6 @@
             ]
         }
     ],
-    "QsRevampStudy": [
-        {
-            "platforms": [
-                "chromeos"
-            ],
-            "experiments": [
-                {
-                    "name": "Enabled",
-                    "enable_features": [
-                        "QsRevamp"
-                    ]
-                }
-            ]
-        }
-    ],
     "QueryTiles": [
         {
             "platforms": [
@@ -14815,6 +14775,27 @@
             ]
         }
     ],
+    "RunPerformanceManagerOnMainThread": [
+        {
+            "platforms": [
+                "android",
+                "android_webview",
+                "chromeos",
+                "chromeos_lacros",
+                "linux",
+                "mac",
+                "windows"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "RunPerformanceManagerOnMainThread"
+                    ]
+                }
+            ]
+        }
+    ],
     "RunTasksByBatches": [
         {
             "platforms": [
diff --git a/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom b/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom
index 76ae104..4a00e6d 100644
--- a/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom
+++ b/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom
@@ -4081,6 +4081,8 @@
   kLinkRelOpenerTargetingSameFrame = 4742,
   kCSSSelectorPseudoHas = 4743,
   kWakeLockAcquireScreenLockWithoutStickyActivation = 4744,
+  kSubtleCryptoDeriveBitsZeroLength = 4745,
+  kSubtleCryptoDeriveBitsTruncation = 4746,
 
   // Add new features immediately above this line. Don't change assigned
   // numbers of any item, and don't reuse removed slots.
diff --git a/third_party/blink/public/platform/web_crypto.h b/third_party/blink/public/platform/web_crypto.h
index 5742600..6ae7b61 100644
--- a/third_party/blink/public/platform/web_crypto.h
+++ b/third_party/blink/public/platform/web_crypto.h
@@ -58,6 +58,11 @@
   kWebCryptoErrorTypeOperation,
 };
 
+enum WebCryptoWarningType {
+  kWebCryptoWarningTypeNone,
+  kWebCryptoWarningTypeDeriveBitsTruncated,
+};
+
 class BLINK_PLATFORM_EXPORT WebCryptoResult {
  public:
   WebCryptoResult(const WebCryptoResult& o) { Assign(o); }
@@ -89,6 +94,8 @@
   // This method can be called from any thread.
   bool Cancelled() const;
 
+  void SetWarning(WebCryptoWarningType code);
+
 #if INSIDE_BLINK
   WebCryptoResult(CryptoResult*, scoped_refptr<CryptoResultCancel>);
 #endif
diff --git a/third_party/blink/public/web/web_view.h b/third_party/blink/public/web/web_view.h
index c7c74f4..6219ead 100644
--- a/third_party/blink/public/web/web_view.h
+++ b/third_party/blink/public/web/web_view.h
@@ -63,7 +63,7 @@
 class Rect;
 class Size;
 class SizeF;
-}
+}  // namespace gfx
 
 namespace blink {
 struct ColorProviderColorMaps;
@@ -413,7 +413,7 @@
   // third_party/blink/public/platform/autoplay.mojom
   virtual void AddAutoplayFlags(int32_t flags) = 0;
   virtual void ClearAutoplayFlags() = 0;
-  virtual int32_t AutoplayFlagsForTest() = 0;
+  virtual int32_t AutoplayFlagsForTest() const = 0;
   virtual gfx::Size GetPreferredSizeForTest() = 0;
 
   // Non-composited support -----------------------------------------------
diff --git a/third_party/blink/renderer/bindings/core/v8/script_controller.cc b/third_party/blink/renderer/bindings/core/v8/script_controller.cc
index 674ebc70..641d2998 100644
--- a/third_party/blink/renderer/bindings/core/v8/script_controller.cc
+++ b/third_party/blink/renderer/bindings/core/v8/script_controller.cc
@@ -121,11 +121,6 @@
   return TextPosition::MinimumPosition();
 }
 
-void ScriptController::EnableEval() {
-  SetEvalForWorld(DOMWrapperWorld::MainWorld(), true /* allow_eval */,
-                  g_empty_string /* error_message */);
-}
-
 void ScriptController::DisableEval(const String& error_message) {
   SetEvalForWorld(DOMWrapperWorld::MainWorld(), false /* allow_eval */,
                   error_message);
diff --git a/third_party/blink/renderer/bindings/core/v8/script_controller.h b/third_party/blink/renderer/bindings/core/v8/script_controller.h
index 39f6230..b3323e63 100644
--- a/third_party/blink/renderer/bindings/core/v8/script_controller.h
+++ b/third_party/blink/renderer/bindings/core/v8/script_controller.h
@@ -120,7 +120,6 @@
   v8::Isolate* GetIsolate() const {
     return window_proxy_manager_->GetIsolate();
   }
-  void EnableEval();
 
   // Sets whether eval is enabled for the context corresponding to the given
   // |world|. |error_message| is used only when |allow_eval| is false.
diff --git a/third_party/blink/renderer/bindings/generated_in_modules.gni b/third_party/blink/renderer/bindings/generated_in_modules.gni
index 3812937..bc9ceff 100644
--- a/third_party/blink/renderer/bindings/generated_in_modules.gni
+++ b/third_party/blink/renderer/bindings/generated_in_modules.gni
@@ -1481,8 +1481,8 @@
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_interpolation_mode.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_model_format.cc",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_model_format.h",
-  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_operand_type.cc",
-  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_operand_type.h",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_operand_data_type.cc",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_operand_data_type.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_padding_mode.cc",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_padding_mode.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_power_preference.cc",
diff --git a/third_party/blink/renderer/core/dom/document.h b/third_party/blink/renderer/core/dom/document.h
index 1a539d8..052e00a 100644
--- a/third_party/blink/renderer/core/dom/document.h
+++ b/third_party/blink/renderer/core/dom/document.h
@@ -447,6 +447,12 @@
 
   DOMImplementation& implementation();
 
+  // Typically, but not guaranteed, to be non-null.
+  //
+  // ```js
+  // document.documentElement.remove();
+  // // document.documentElement is now null
+  // ```
   Element* documentElement() const { return document_element_.Get(); }
 
   Location* location() const;
diff --git a/third_party/blink/renderer/core/exported/web_view_impl.cc b/third_party/blink/renderer/core/exported/web_view_impl.cc
index 0e3841d9..e830d82 100644
--- a/third_party/blink/renderer/core/exported/web_view_impl.cc
+++ b/third_party/blink/renderer/core/exported/web_view_impl.cc
@@ -3960,7 +3960,7 @@
   page_->ClearAutoplayFlags();
 }
 
-int32_t WebViewImpl::AutoplayFlagsForTest() {
+int32_t WebViewImpl::AutoplayFlagsForTest() const {
   return page_->AutoplayFlags();
 }
 
diff --git a/third_party/blink/renderer/core/exported/web_view_impl.h b/third_party/blink/renderer/core/exported/web_view_impl.h
index 91c5d243c..5a99921 100644
--- a/third_party/blink/renderer/core/exported/web_view_impl.h
+++ b/third_party/blink/renderer/core/exported/web_view_impl.h
@@ -523,7 +523,7 @@
 
   void AddAutoplayFlags(int32_t) override;
   void ClearAutoplayFlags() override;
-  int32_t AutoplayFlagsForTest() override;
+  int32_t AutoplayFlagsForTest() const override;
   gfx::Size GetPreferredSizeForTest() override;
 
   gfx::Size Size();
@@ -533,9 +533,7 @@
 
   gfx::Vector2dF ElasticOverscroll() const { return elastic_overscroll_; }
 
-  class ChromeClient& GetChromeClient() const {
-    return *chrome_client_.Get();
-  }
+  class ChromeClient& GetChromeClient() const { return *chrome_client_.Get(); }
 
   // Allows main frame updates to occur if they were previously blocked. They
   // are blocked during loading a navigation, to allow Blink to proceed without
diff --git a/third_party/blink/renderer/core/frame/local_frame_view.cc b/third_party/blink/renderer/core/frame/local_frame_view.cc
index 8a86e29..047fdf1 100644
--- a/third_party/blink/renderer/core/frame/local_frame_view.cc
+++ b/third_party/blink/renderer/core/frame/local_frame_view.cc
@@ -1148,15 +1148,16 @@
   }
 }
 
-void LocalFrameView::AddBackgroundAttachmentFixedObject(LayoutObject* object) {
-  DCHECK(!background_attachment_fixed_objects_.Contains(object));
-  background_attachment_fixed_objects_.insert(object);
+void LocalFrameView::AddBackgroundAttachmentFixedObject(
+    LayoutBoxModelObject& object) {
+  DCHECK(!background_attachment_fixed_objects_.Contains(&object));
+  background_attachment_fixed_objects_.insert(&object);
   SetNeedsPaintPropertyUpdate();
 }
 
 void LocalFrameView::RemoveBackgroundAttachmentFixedObject(
-    LayoutObject* object) {
-  background_attachment_fixed_objects_.erase(object);
+    LayoutBoxModelObject& object) {
+  background_attachment_fixed_objects_.erase(&object);
   SetNeedsPaintPropertyUpdate();
 }
 
@@ -1260,6 +1261,20 @@
          page->GetFocusController().IsActive();
 }
 
+void LocalFrameView::UpdateCanCompositeBackgroundAttachmentFixed() {
+  // Too many composited background-attachment:fixed hurt performance, so we
+  // want to avoid that with this heuristic (which doesn't need to be accurate
+  // so we simply check the number of all background-attachment:fixed objects).
+  constexpr wtf_size_t kMaxCompositedBackgroundAttachmentFixed = 8;
+  bool enable_composited_background_attachment_fixed =
+      background_attachment_fixed_objects_.size() <=
+      kMaxCompositedBackgroundAttachmentFixed;
+  for (const auto& object : background_attachment_fixed_objects_) {
+    object->UpdateCanCompositeBackgroundAttachmentFixed(
+        enable_composited_background_attachment_fixed);
+  }
+}
+
 void LocalFrameView::InvalidateBackgroundAttachmentFixedDescendantsOnScroll(
     const LayoutBox& scroller) {
   for (const auto& layout_object : background_attachment_fixed_objects_) {
@@ -3150,6 +3165,8 @@
       });
     }
 
+    UpdateCanCompositeBackgroundAttachmentFixed();
+
     if (NeedsLayout()) {
       SCOPED_UMA_AND_UKM_TIMER(GetUkmAggregator(),
                                LocalFrameUkmAggregator::kLayout);
diff --git a/third_party/blink/renderer/core/frame/local_frame_view.h b/third_party/blink/renderer/core/frame/local_frame_view.h
index 88dd206..7c39e4e 100644
--- a/third_party/blink/renderer/core/frame/local_frame_view.h
+++ b/third_party/blink/renderer/core/frame/local_frame_view.h
@@ -88,6 +88,7 @@
 class JSONObject;
 class KURL;
 class LayoutBox;
+class LayoutBoxModelObject;
 class LayoutEmbeddedObject;
 class LayoutObject;
 class LayoutShiftTracker;
@@ -296,11 +297,11 @@
   void AdjustMediaTypeForPrinting(bool printing);
 
   // Objects with background-attachment:fixed.
-  typedef HeapHashSet<Member<LayoutObject>> ObjectSet;
-  void AddBackgroundAttachmentFixedObject(LayoutObject*);
-  void RemoveBackgroundAttachmentFixedObject(LayoutObject*);
+  typedef HeapHashSet<Member<LayoutBoxModelObject>> BoxModelObjectSet;
+  void AddBackgroundAttachmentFixedObject(LayoutBoxModelObject&);
+  void RemoveBackgroundAttachmentFixedObject(LayoutBoxModelObject&);
   bool RequiresMainThreadScrollingForBackgroundAttachmentFixed() const;
-  const ObjectSet& BackgroundAttachmentFixedObjects() const {
+  const BoxModelObjectSet& BackgroundAttachmentFixedObjects() const {
     return background_attachment_fixed_objects_;
   }
   void InvalidateBackgroundAttachmentFixedDescendantsOnScroll(
@@ -1005,6 +1006,8 @@
 
   bool HasViewTransitionThrottlingRendering() const;
 
+  void UpdateCanCompositeBackgroundAttachmentFixed();
+
   typedef HeapHashSet<Member<LayoutEmbeddedObject>> EmbeddedObjectSet;
   EmbeddedObjectSet part_update_set_;
 
@@ -1048,7 +1051,7 @@
   Member<ScrollableAreaSet> animating_scrollable_areas_;
   // Scrollable areas which are user-scrollable, whether they overflow or not.
   Member<ScrollableAreaSet> user_scrollable_areas_;
-  ObjectSet background_attachment_fixed_objects_;
+  BoxModelObjectSet background_attachment_fixed_objects_;
   Member<FrameViewAutoSizeInfo> auto_size_info_;
 
   gfx::Size layout_size_;
diff --git a/third_party/blink/renderer/core/html/html_dialog_element.cc b/third_party/blink/renderer/core/html/html_dialog_element.cc
index ebe5e9b..b1ca6e3 100644
--- a/third_party/blink/renderer/core/html/html_dialog_element.cc
+++ b/third_party/blink/renderer/core/html/html_dialog_element.cc
@@ -231,14 +231,15 @@
   }
 }
 
-bool HTMLDialogElement::IsFocusable(UpdateBehavior update_behavior) const {
-  // TODO(crbug.com/1499838) HTMLDialogElement should only need to override
-  // SupportsFocus() to be always-true, and should not need to override
-  // IsFocusable() at all. Dialog focus behavior is to focus the dialog itself
-  // if there are no focusable descendants, which means they support focus.
-  // However, making SupportsFocus always true makes dialogs always keyboard
-  // focusable, and that breaks things.
-  return isConnected() && IsFocusableStyle(update_behavior);
+bool HTMLDialogElement::IsKeyboardFocusable(
+    UpdateBehavior update_behavior) const {
+  if (!IsFocusable(update_behavior)) {
+    return false;
+  }
+  // This handles cases such as <dialog tabindex=0>, <dialog contenteditable>,
+  // etc.
+  return Element::SupportsFocus(update_behavior) &&
+         GetIntegralAttribute(html_names::kTabindexAttr, 0) >= 0;
 }
 
 class DialogCloseWatcherEventListener : public NativeEventListener {
diff --git a/third_party/blink/renderer/core/html/html_dialog_element.h b/third_party/blink/renderer/core/html/html_dialog_element.h
index b5cfdd1..96066110 100644
--- a/third_party/blink/renderer/core/html/html_dialog_element.h
+++ b/third_party/blink/renderer/core/html/html_dialog_element.h
@@ -59,8 +59,13 @@
   void CloseWatcherFiredCancel(Event*);
   void CloseWatcherFiredClose();
 
-  bool IsFocusable(UpdateBehavior update_behavior =
-                       UpdateBehavior::kStyleAndLayout) const override;
+  // Dialogs support focus, since the dialog focus algorithm
+  // https://html.spec.whatwg.org/multipage/interactive-elements.html#dialog-focusing-steps
+  // can decide to focus the dialog itself if the dialog does not have a focus
+  // delegate.
+  bool SupportsFocus(UpdateBehavior) const override { return true; }
+  bool IsKeyboardFocusable(UpdateBehavior update_behavior =
+                               UpdateBehavior::kStyleAndLayout) const override;
 
   // https://html.spec.whatwg.org/C/#the-dialog-element
   // Chooses the focused element when show() or showModal() is invoked.
diff --git a/third_party/blink/renderer/core/layout/flex/flex_layout_algorithm.cc b/third_party/blink/renderer/core/layout/flex/flex_layout_algorithm.cc
index 65cf9ba4..c21c8e9 100644
--- a/third_party/blink/renderer/core/layout/flex/flex_layout_algorithm.cc
+++ b/third_party/blink/renderer/core/layout/flex/flex_layout_algorithm.cc
@@ -635,7 +635,7 @@
   // child. See the bottom of GiveItemsFinalPositionAndSize().
   if (Node().IsButton()) {
     space_builder.SetBaselineAlgorithmType(
-        GetConstraintSpace().BaselineAlgorithmType());
+        GetConstraintSpace().GetBaselineAlgorithmType());
   }
 
   return space_builder.ToConstraintSpace();
@@ -2135,7 +2135,7 @@
   LogicalBoxFragment fragment(space.GetWritingDirection(),
                               To<NGPhysicalBoxFragment>(*child.fragment));
   absl::optional<LayoutUnit> child_baseline =
-      space.BaselineAlgorithmType() == NGBaselineAlgorithmType::kDefault
+      space.GetBaselineAlgorithmType() == BaselineAlgorithmType::kDefault
           ? fragment.FirstBaseline()
           : fragment.LastBaseline();
   if (child_baseline)
diff --git a/third_party/blink/renderer/core/layout/inline/README.md b/third_party/blink/renderer/core/layout/inline/README.md
index 947b7d50..8dbc6db 100644
--- a/third_party/blink/renderer/core/layout/inline/README.md
+++ b/third_party/blink/renderer/core/layout/inline/README.md
@@ -281,11 +281,11 @@
 calling [NGBoxFragmentBuilder]`::AddBaseline()`
 to add them to [NGPhysicalBoxFragment].
 
-[NGBaselineRequest] consists of [NGBaselineAlgorithmType] and [FontBaseline].
+[NGBaselineRequest] consists of [BaselineAlgorithmType] and [FontBaseline].
 
 In most normal cases,
 algorithms should decide which box should provide the baseline
-for the specified [NGBaselineAlgorithmType] and delegate to it.
+for the specified [BaselineAlgorithmType] and delegate to it.
 
 [FontBaseline] currently has only two baseline types,
 alphabetic and ideographic,
@@ -369,6 +369,7 @@
 [UAX#9 Resolving Embedding Levels]: http://www.unicode.org/reports/tr9/#Resolving_Embedding_Levels
 [UAX#9 Reordering Resolved Levels]: http://www.unicode.org/reports/tr9/#Reordering_Resolved_Levels
 
+[BaselineAlgorithmType]: ../ng/ng_constraint_space.h
 [BidiParagraph]: ../../../platform/text/bidi_paragraph.h
 [BlockNode]: ../ng/ng_block_node.h
 [FontBaseline]: ../../../platform/fonts/font_baseline.h
@@ -383,7 +384,6 @@
 [LineBreaker]: ng_line_breaker.h
 [LogicalLineItem]: ng_logical_line_item.h
 [LogicalLineItems]: ng_logical_line_items.h
-[NGBaselineAlgorithmType]: ng_baseline.h
 [NGBaselineRequest]: ng_baseline.h
 [NGBoxFragment]: ../ng/ng_box_fragment.h
 [NGBoxFragmentBuilder]: ../ng/ng_box_fragment_builder.h
diff --git a/third_party/blink/renderer/core/layout/inline/inline_layout_algorithm.cc b/third_party/blink/renderer/core/layout/inline/inline_layout_algorithm.cc
index 2bf37c5..a3d00e9 100644
--- a/third_party/blink/renderer/core/layout/inline/inline_layout_algorithm.cc
+++ b/third_party/blink/renderer/core/layout/inline/inline_layout_algorithm.cc
@@ -883,7 +883,7 @@
 
   end_margin_strut_ = result.EndMarginStrut();
   container_builder_.SetExclusionSpace(result.GetExclusionSpace());
-  container_builder_.SetAdjoiningObjectTypes(result.AdjoiningObjectTypes());
+  container_builder_.SetAdjoiningObjectTypes(result.GetAdjoiningObjectTypes());
   lines_until_clamp_ = result.LinesUntilClamp();
   if (UNLIKELY(box_fragment.MayHaveDescendantAboveBlockStart()))
     container_builder_.SetMayHaveDescendantAboveBlockStart(true);
@@ -1371,7 +1371,7 @@
 
   end_margin_strut_ = constraint_space.GetMarginStrut();
   container_builder_.SetAdjoiningObjectTypes(
-      constraint_space.AdjoiningObjectTypes());
+      constraint_space.GetAdjoiningObjectTypes());
   lines_until_clamp_ = constraint_space.LinesUntilClamp();
 
   // In order to get the correct list of layout opportunities, we need to
@@ -1543,7 +1543,7 @@
       }
 
       // Abort if something before needs to know the correct BFC block-offset.
-      if (container_builder_.AdjoiningObjectTypes() &&
+      if (container_builder_.GetAdjoiningObjectTypes() &&
           bfc_block_offset != constraint_space.ExpectedBfcBlockOffset()) {
         items_builder->ReleaseCurrentLogicalLineItems();
         return container_builder_.Abort(
diff --git a/third_party/blink/renderer/core/layout/inline/line_breaker.cc b/third_party/blink/renderer/core/layout/inline/line_breaker.cc
index 1db925f..83b86ec 100644
--- a/third_party/blink/renderer/core/layout/inline/line_breaker.cc
+++ b/third_party/blink/renderer/core/layout/inline/line_breaker.cc
@@ -2577,10 +2577,10 @@
   if (mode_ == LineBreakerMode::kContent || UNLIKELY(is_initial_letter_box)) {
     // If our baseline-source is non-auto use the easier to reason about
     // "default" algorithm type.
-    NGBaselineAlgorithmType baseline_algorithm_type =
+    BaselineAlgorithmType baseline_algorithm_type =
         style.BaselineSource() == EBaselineSource::kAuto
-            ? NGBaselineAlgorithmType::kInlineBlock
-            : NGBaselineAlgorithmType::kDefault;
+            ? BaselineAlgorithmType::kInlineBlock
+            : BaselineAlgorithmType::kDefault;
 
     // https://drafts.csswg.org/css-pseudo-4/#first-text-line
     // > The first line of a table-cell or inline-block cannot be the first
diff --git a/third_party/blink/renderer/core/layout/layout_box.cc b/third_party/blink/renderer/core/layout/layout_box.cc
index 41d8fa4..884146896 100644
--- a/third_party/blink/renderer/core/layout/layout_box.cc
+++ b/third_party/blink/renderer/core/layout/layout_box.cc
@@ -707,7 +707,7 @@
       SetNeedsCollectInlines();
     }
 
-    if (CanCompositeBackgroundAttachmentFixed() &&
+    if (IsBackgroundAttachmentFixedObject() &&
         new_style.BackgroundLayers().Clip() !=
             old_style->BackgroundLayers().Clip()) {
       SetNeedsPaintPropertyUpdate();
diff --git a/third_party/blink/renderer/core/layout/layout_box_model_object.cc b/third_party/blink/renderer/core/layout/layout_box_model_object.cc
index fb9acb2..6f8f5ad 100644
--- a/third_party/blink/renderer/core/layout/layout_box_model_object.cc
+++ b/third_party/blink/renderer/core/layout/layout_box_model_object.cc
@@ -109,6 +109,10 @@
   if (HasLayer())
     DestroyLayer();
 
+  if (GetFrameView()) {
+    SetIsBackgroundAttachmentFixedObject(false);
+  }
+
   // Our layer should have been destroyed and cleared by now
   DCHECK(!HasLayer());
   DCHECK(!Layer());
@@ -433,20 +437,15 @@
   SetCanContainAbsolutePositionObjects(
       ComputeIsAbsoluteContainer(&style_to_use));
   SetCanContainFixedPositionObjects(ComputeIsFixedContainer(&style_to_use));
-
-  bool is_background_attachment_fixed_object =
+  SetIsBackgroundAttachmentFixedObject(
       !BackgroundTransfersToView() &&
-      StyleRef().HasFixedAttachmentBackgroundImage();
-  SetIsBackgroundAttachmentFixedObject(is_background_attachment_fixed_object);
-  constexpr wtf_size_t kMaxCompositedBackgroundAttachmentFixed = 20;
+      StyleRef().HasFixedAttachmentBackgroundImage());
+}
+
+void LayoutBoxModelObject::UpdateCanCompositeBackgroundAttachmentFixed(
+    bool enable_composited_background_attachment_fixed) {
   SetCanCompositeBackgroundAttachmentFixed(
-      is_background_attachment_fixed_object &&
-      // Too many composited background-attachment:fixed hurt performance, so
-      // we want to avoid that with this heuristic (which doesn't need to be
-      // accurate so we simply check the number of all
-      // background-attachment:fixed objects).
-      GetFrameView()->BackgroundAttachmentFixedObjects().size() <=
-          kMaxCompositedBackgroundAttachmentFixed &&
+      enable_composited_background_attachment_fixed &&
       ComputeCanCompositeBackgroundAttachmentFixed());
 }
 
diff --git a/third_party/blink/renderer/core/layout/layout_box_model_object.h b/third_party/blink/renderer/core/layout/layout_box_model_object.h
index a5f06d0..92f5135 100644
--- a/third_party/blink/renderer/core/layout/layout_box_model_object.h
+++ b/third_party/blink/renderer/core/layout/layout_box_model_object.h
@@ -406,6 +406,9 @@
                                         const PhysicalOffset& additional_offset,
                                         NGOutlineType) const;
 
+  void UpdateCanCompositeBackgroundAttachmentFixed(
+      bool enable_composited_background_attachment_fixed);
+
  protected:
   void WillBeDestroyed() override;
 
diff --git a/third_party/blink/renderer/core/layout/layout_object.cc b/third_party/blink/renderer/core/layout/layout_object.cc
index bf19b66..835d39f 100644
--- a/third_party/blink/renderer/core/layout/layout_object.cc
+++ b/third_party/blink/renderer/core/layout/layout_object.cc
@@ -3772,7 +3772,6 @@
   if (GetFrameView()) {
     GetFrameView()->RemovePendingTransformUpdate(*this);
     GetFrameView()->RemovePendingOpacityUpdate(*this);
-    SetIsBackgroundAttachmentFixedObject(false);
   }
 }
 
@@ -4799,15 +4798,21 @@
     bool is_background_attachment_fixed_object) {
   NOT_DESTROYED();
   DCHECK(GetFrameView());
+  DCHECK(IsBoxModelObject());
   if (bitfields_.IsBackgroundAttachmentFixedObject() ==
-      is_background_attachment_fixed_object)
+      is_background_attachment_fixed_object) {
     return;
+  }
   bitfields_.SetIsBackgroundAttachmentFixedObject(
       is_background_attachment_fixed_object);
-  if (is_background_attachment_fixed_object)
-    GetFrameView()->AddBackgroundAttachmentFixedObject(this);
-  else
-    GetFrameView()->RemoveBackgroundAttachmentFixedObject(this);
+  if (is_background_attachment_fixed_object) {
+    GetFrameView()->AddBackgroundAttachmentFixedObject(
+        To<LayoutBoxModelObject>(*this));
+  } else {
+    SetCanCompositeBackgroundAttachmentFixed(false);
+    GetFrameView()->RemoveBackgroundAttachmentFixedObject(
+        To<LayoutBoxModelObject>(*this));
+  }
 }
 
 void LayoutObject::SetCanCompositeBackgroundAttachmentFixed(
diff --git a/third_party/blink/renderer/core/layout/list/unpositioned_list_marker.cc b/third_party/blink/renderer/core/layout/list/unpositioned_list_marker.cc
index 134eea0c..c9aed81d 100644
--- a/third_party/blink/renderer/core/layout/list/unpositioned_list_marker.cc
+++ b/third_party/blink/renderer/core/layout/list/unpositioned_list_marker.cc
@@ -47,7 +47,7 @@
   // typical atomic-inline baseline.
   const NGLayoutResult* marker_layout_result = marker_node.LayoutAtomicInline(
       parent_space, parent_style, parent_space.UseFirstLineStyle(),
-      NGBaselineAlgorithmType::kDefault);
+      BaselineAlgorithmType::kDefault);
   DCHECK(marker_layout_result);
   return marker_layout_result;
 }
diff --git a/third_party/blink/renderer/core/layout/ng/layout_ng_block_flow.h b/third_party/blink/renderer/core/layout/ng/layout_ng_block_flow.h
index c1a07a1..3f8fb11 100644
--- a/third_party/blink/renderer/core/layout/ng/layout_ng_block_flow.h
+++ b/third_party/blink/renderer/core/layout/ng/layout_ng_block_flow.h
@@ -10,7 +10,6 @@
 
 namespace blink {
 
-enum class NGBaselineAlgorithmType;
 struct InlineNodeData;
 
 // This overrides the default layout block algorithm to use Layout NG.
diff --git a/third_party/blink/renderer/core/layout/ng/ng_base_layout_algorithm_test.cc b/third_party/blink/renderer/core/layout/ng/ng_base_layout_algorithm_test.cc
index 420b4a6..c7dc649 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_base_layout_algorithm_test.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_base_layout_algorithm_test.cc
@@ -104,10 +104,10 @@
     bool stretch_inline_size_if_auto,
     bool is_new_formatting_context,
     LayoutUnit fragmentainer_space_available) {
-  NGFragmentationType block_fragmentation =
+  FragmentationType block_fragmentation =
       fragmentainer_space_available != kIndefiniteSize
-          ? NGFragmentationType::kFragmentColumn
-          : NGFragmentationType::kFragmentNone;
+          ? FragmentationType::kFragmentColumn
+          : FragmentationType::kFragmentNone;
 
   NGConstraintSpaceBuilder builder(writing_direction.GetWritingMode(),
                                    writing_direction,
@@ -119,8 +119,9 @@
                                     : AutoSizeBehavior::kFitContent);
   builder.SetFragmentainerBlockSize(fragmentainer_space_available);
   builder.SetFragmentationType(block_fragmentation);
-  if (block_fragmentation != NGFragmentationType::kFragmentNone)
+  if (block_fragmentation != FragmentationType::kFragmentNone) {
     builder.SetShouldPropagateChildBreakValues();
+  }
   return builder.ToConstraintSpace();
 }
 
diff --git a/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.cc
index d4cdbee..3873f8c 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.cc
@@ -117,7 +117,7 @@
                           To<BlockNode>(node));
 }
 
-NGAdjoiningObjectTypes ToAdjoiningObjectTypes(EClear clear) {
+AdjoiningObjectTypes ToAdjoiningObjectTypes(EClear clear) {
   switch (clear) {
     default:
       NOTREACHED();
@@ -140,7 +140,7 @@
 // since that's what clearance is all about. This means that if we have any such
 // floats to clear, we know for sure that we get clearance, even before layout.
 inline bool HasClearancePastAdjoiningFloats(
-    NGAdjoiningObjectTypes adjoining_object_types,
+    AdjoiningObjectTypes adjoining_object_types,
     const ComputedStyle& child_style,
     const ComputedStyle& cb_style) {
   return ToAdjoiningObjectTypes(child_style.Clear(cb_style)) &
@@ -580,8 +580,8 @@
   container_builder_.SetBfcLineOffset(
       constraint_space.GetBfcOffset().line_offset);
 
-  if (NGAdjoiningObjectTypes adjoining_object_types =
-          constraint_space.AdjoiningObjectTypes()) {
+  if (auto adjoining_object_types =
+          constraint_space.GetAdjoiningObjectTypes()) {
     DCHECK(!constraint_space.IsNewFormattingContext());
     DCHECK(!container_builder_.BfcBlockOffset());
 
@@ -1159,8 +1159,8 @@
 
   OutOfFlowLayoutPart(Node(), constraint_space, &container_builder_).Run();
 
-  if (constraint_space.BaselineAlgorithmType() ==
-      NGBaselineAlgorithmType::kInlineBlock) {
+  if (constraint_space.GetBaselineAlgorithmType() ==
+      BaselineAlgorithmType::kInlineBlock) {
     container_builder_.SetUseLastBaselineForInlineBaseline();
   }
 
@@ -1493,7 +1493,7 @@
 
   if (!container_builder_.BfcBlockOffset()) {
     has_adjoining_floats =
-        container_builder_.AdjoiningObjectTypes() & kAdjoiningFloatBoth;
+        container_builder_.GetAdjoiningObjectTypes() & kAdjoiningFloatBoth;
 
     // If this node, or an arbitrary ancestor had clearance past adjoining
     // floats, we consider the margin "separated". We should *never* attempt to
@@ -1501,7 +1501,7 @@
     bool has_clearance_past_adjoining_floats =
         constraint_space.AncestorHasClearancePastAdjoiningFloats() ||
         HasClearancePastAdjoiningFloats(
-            container_builder_.AdjoiningObjectTypes(), child_style, Style());
+            container_builder_.GetAdjoiningObjectTypes(), child_style, Style());
 
     if (has_clearance_past_adjoining_floats) {
       child_bfc_offset_estimate = NextBorderEdge(*previous_inflow_position);
@@ -1917,8 +1917,8 @@
 
   bool has_clearance_past_adjoining_floats =
       !container_builder_.BfcBlockOffset() && child.IsBlock() &&
-      HasClearancePastAdjoiningFloats(container_builder_.AdjoiningObjectTypes(),
-                                      child.Style(), Style());
+      HasClearancePastAdjoiningFloats(
+          container_builder_.GetAdjoiningObjectTypes(), child.Style(), Style());
 
   absl::optional<LayoutUnit> forced_bfc_block_offset;
   bool is_pushed_by_floats = false;
@@ -2227,9 +2227,9 @@
   container_builder_.SetExclusionSpace(layout_result->GetExclusionSpace());
 
   // Only self-collapsing children should have adjoining objects.
-  DCHECK(!layout_result->AdjoiningObjectTypes() || is_self_collapsing);
+  DCHECK(!layout_result->GetAdjoiningObjectTypes() || is_self_collapsing);
   container_builder_.SetAdjoiningObjectTypes(
-      layout_result->AdjoiningObjectTypes());
+      layout_result->GetAdjoiningObjectTypes());
 
   // If we don't know our BFC block-offset yet, and the child stumbled into
   // something that needs it (unable to position floats yet), we need abort
@@ -2247,7 +2247,7 @@
   // has been positioned.
   if (!container_builder_.BfcBlockOffset()) {
     abort_when_bfc_block_offset_updated_ |=
-        layout_result->AdjoiningObjectTypes();
+        layout_result->GetAdjoiningObjectTypes();
     // If our BFC block offset is unknown, and the child got pushed down by
     // floats, so will we.
     if (layout_result->IsPushedByFloats())
@@ -2951,7 +2951,7 @@
     }
   }
   builder.SetClearanceOffset(clearance_offset);
-  builder.SetBaselineAlgorithmType(constraint_space.BaselineAlgorithmType());
+  builder.SetBaselineAlgorithmType(constraint_space.GetBaselineAlgorithmType());
 
   if (child_data.is_pushed_by_floats) {
     // Clearance has been applied, but it won't be automatically detected when
@@ -2966,7 +2966,7 @@
     builder.SetExclusionSpace(GetExclusionSpace());
     if (!has_bfc_block_offset) {
       builder.SetAdjoiningObjectTypes(
-          container_builder_.AdjoiningObjectTypes());
+          container_builder_.GetAdjoiningObjectTypes());
     }
     builder.SetIsLineClampContext(is_line_clamp_context_);
     builder.SetLinesUntilClamp(lines_until_clamp_);
@@ -3045,12 +3045,13 @@
     const BoxStrut& margins,
     LayoutUnit block_offset) {
   DCHECK(child.IsBox());
-  const auto baseline_algorithm = GetConstraintSpace().BaselineAlgorithmType();
+  const auto baseline_algorithm =
+      GetConstraintSpace().GetBaselineAlgorithmType();
 
   // When computing baselines for an inline-block, table's don't contribute any
   // baselines.
   if (child.IsTable() &&
-      baseline_algorithm == NGBaselineAlgorithmType::kInlineBlock) {
+      baseline_algorithm == BaselineAlgorithmType::kInlineBlock) {
     return;
   }
 
@@ -3070,7 +3071,7 @@
   // Counter-intuitively, when computing baselines for an inline-block, some
   // fragments use their first-baseline for the container's last-baseline.
   bool use_last_baseline =
-      baseline_algorithm == NGBaselineAlgorithmType::kDefault ||
+      baseline_algorithm == BaselineAlgorithmType::kDefault ||
       physical_fragment.UseLastBaselineForInlineBaseline();
 
   auto last_baseline =
@@ -3078,7 +3079,7 @@
 
   // When computing baselines for an inline-block, some block-boxes (e.g. with
   // "overflow: hidden") will force the baseline to the block-end margin edge.
-  if (baseline_algorithm == NGBaselineAlgorithmType::kInlineBlock &&
+  if (baseline_algorithm == BaselineAlgorithmType::kInlineBlock &&
       physical_fragment.UseBlockEndMarginEdgeForInlineBaseline() &&
       !child.ShouldApplyLayoutContainment() && fragment.IsWritingModeEqual()) {
     last_baseline = fragment.BlockSize() + margins.block_end;
diff --git a/third_party/blink/renderer/core/layout/ng/ng_block_node.cc b/third_party/blink/renderer/core/layout/ng/ng_block_node.cc
index 872bd2a2..93364ba 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_block_node.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_block_node.cc
@@ -1543,7 +1543,7 @@
     const NGConstraintSpace& parent_constraint_space,
     const ComputedStyle& parent_style,
     bool use_first_line_style,
-    NGBaselineAlgorithmType baseline_algorithm_type) {
+    BaselineAlgorithmType baseline_algorithm_type) {
   NGConstraintSpaceBuilder builder(parent_constraint_space,
                                    Style().GetWritingDirection(),
                                    /* is_new_fc */ true);
diff --git a/third_party/blink/renderer/core/layout/ng/ng_block_node.h b/third_party/blink/renderer/core/layout/ng/ng_block_node.h
index 4da0f13..bd4335ef 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_block_node.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_block_node.h
@@ -24,6 +24,7 @@
 class NGLayoutResult;
 class NGPhysicalBoxFragment;
 class NGPhysicalFragment;
+enum class BaselineAlgorithmType;
 struct LayoutAlgorithmParams;
 
 enum class MathScriptType;
@@ -203,7 +204,7 @@
       const NGConstraintSpace& parent_constraint_space,
       const ComputedStyle& parent_style,
       bool use_first_line_style,
-      NGBaselineAlgorithmType baseline_algorithm_type);
+      BaselineAlgorithmType baseline_algorithm_type);
 
   // Write the inline-size and number of columns in a multicol container to
   // legacy.
diff --git a/third_party/blink/renderer/core/layout/ng/ng_column_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/ng_column_layout_algorithm.cc
index 4bfc923..2c4a736 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_column_layout_algorithm.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_column_layout_algorithm.cc
@@ -1501,7 +1501,7 @@
   space_builder.SetPercentageResolutionSize(ChildAvailableSize());
 
   space_builder.SetBaselineAlgorithmType(
-      GetConstraintSpace().BaselineAlgorithmType());
+      GetConstraintSpace().GetBaselineAlgorithmType());
 
   if (GetConstraintSpace().HasBlockFragmentation()) {
     SetupSpaceBuilderForFragmentation(
diff --git a/third_party/blink/renderer/core/layout/ng/ng_constraint_space.h b/third_party/blink/renderer/core/layout/ng/ng_constraint_space.h
index 97a69876..8280723 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_constraint_space.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_constraint_space.h
@@ -30,7 +30,7 @@
 
 class NGConstraintSpaceBuilder;
 
-enum NGFragmentationType {
+enum FragmentationType {
   kFragmentNone,
   kFragmentPage,
   kFragmentColumn,
@@ -41,19 +41,19 @@
 // used to indicate that a particular node might need a relayout once its BFC
 // block-offset is resolved. E.g. their position depends on the final BFC
 // block-offset being known.
-enum NGAdjoiningObjectTypeValue {
+enum AdjoiningObjectTypeValue {
   kAdjoiningNone = 0b000,
   kAdjoiningFloatLeft = 0b001,
   kAdjoiningFloatRight = 0b010,
   kAdjoiningFloatBoth = 0b011,
   kAdjoiningInlineOutOfFlow = 0b100
 };
-typedef int NGAdjoiningObjectTypes;
+typedef int AdjoiningObjectTypes;
 
 // The last baseline algorithm for an inline-blocks are complex. Depending on
 // the layout algorithm type it'll select the first (table, flex, grid) or last
 // (block-like) as the last baseline.
-enum class NGBaselineAlgorithmType {
+enum class BaselineAlgorithmType {
   // Compute the baselines normally.
   kDefault,
   // Compute the baseline(s) for when we are within an inline-block context.
@@ -95,7 +95,7 @@
  public:
   // Percentages are frequently the same as the available-size, zero, or
   // indefinite (thanks non-quirks mode)! This enum encodes this information.
-  enum NGPercentageStorage {
+  enum PercentageStorage {
     kSameAsAvailable,
     kZero,
     kIndefinite,
@@ -190,8 +190,8 @@
   // The size to use for percentage resolution.
   // See: https://drafts.csswg.org/css-sizing/#percentage-sizing
   LayoutUnit PercentageResolutionInlineSize() const {
-    switch (static_cast<NGPercentageStorage>(
-        bitfields_.percentage_inline_storage)) {
+    switch (
+        static_cast<PercentageStorage>(bitfields_.percentage_inline_storage)) {
       default:
         NOTREACHED();
         [[fallthrough]];
@@ -209,7 +209,7 @@
 
   LayoutUnit PercentageResolutionBlockSize() const {
     switch (
-        static_cast<NGPercentageStorage>(bitfields_.percentage_block_storage)) {
+        static_cast<PercentageStorage>(bitfields_.percentage_block_storage)) {
       default:
         NOTREACHED();
         [[fallthrough]];
@@ -234,7 +234,7 @@
   }
 
   LayoutUnit ReplacedPercentageResolutionBlockSize() const {
-    switch (static_cast<NGPercentageStorage>(
+    switch (static_cast<PercentageStorage>(
         bitfields_.replaced_percentage_block_storage)) {
       case kSameAsAvailable:
         return available_size_.block_size;
@@ -459,9 +459,9 @@
   }
 
   // How the baseline for the fragment should be calculated, see documentation
-  // for |NGBaselineAlgorithmType|.
-  NGBaselineAlgorithmType BaselineAlgorithmType() const {
-    return static_cast<NGBaselineAlgorithmType>(
+  // for |BaselineAlgorithmType|.
+  BaselineAlgorithmType GetBaselineAlgorithmType() const {
+    return static_cast<BaselineAlgorithmType>(
         bitfields_.baseline_algorithm_type);
   }
 
@@ -527,8 +527,8 @@
 
   // If specified a layout should produce a Fragment which fragments at the
   // blockSize if possible.
-  NGFragmentationType BlockFragmentationType() const {
-    return HasRareData() ? static_cast<NGFragmentationType>(
+  FragmentationType BlockFragmentationType() const {
+    return HasRareData() ? static_cast<FragmentationType>(
                                rare_data_->block_direction_fragmentation_type)
                          : kFragmentNone;
   }
@@ -713,7 +713,7 @@
   }
 
   // Returns the types of preceding adjoining objects.
-  // See |NGAdjoiningObjectTypes|.
+  // See |AdjoiningObjectTypes|.
   //
   // Adjoining floats are positioned at their correct position if the
   // |ForcedBfcBlockOffset()| is known.
@@ -723,7 +723,7 @@
   // up front that the block will need clearance, since, if it doesn't, the
   // float will be pulled along with the block, and the block will fail to
   // clear).
-  NGAdjoiningObjectTypes AdjoiningObjectTypes() const {
+  AdjoiningObjectTypes GetAdjoiningObjectTypes() const {
     return bitfields_.adjoining_object_types;
   }
 
@@ -1545,7 +1545,7 @@
           use_first_line_style(false),
           ancestor_has_clearance_past_adjoining_floats(false),
           baseline_algorithm_type(
-              static_cast<unsigned>(NGBaselineAlgorithmType::kDefault)),
+              static_cast<unsigned>(BaselineAlgorithmType::kDefault)),
           cache_slot(static_cast<unsigned>(LayoutResultCacheSlot::kLayout)),
           inline_auto_behavior(
               static_cast<unsigned>(AutoSizeBehavior::kFitContent)),
@@ -1590,7 +1590,7 @@
     }
 
     unsigned has_rare_data : 1;
-    unsigned adjoining_object_types : 3;  // NGAdjoiningObjectTypes
+    unsigned adjoining_object_types : 3;  // AdjoiningObjectTypes
     unsigned writing_mode : 3;
     unsigned direction : 1;
 
@@ -1615,9 +1615,9 @@
     unsigned is_table_cell_child : 1;
     unsigned is_restricted_block_size_table_cell_child : 1;
 
-    unsigned percentage_inline_storage : 2;           // NGPercentageStorage
-    unsigned percentage_block_storage : 2;            // NGPercentageStorage
-    unsigned replaced_percentage_block_storage : 2;   // NGPercentageStorage
+    unsigned percentage_inline_storage : 2;          // PercentageStorage
+    unsigned percentage_block_storage : 2;           // PercentageStorage
+    unsigned replaced_percentage_block_storage : 2;  // PercentageStorage
   };
 
   // To ensure that the bfc_offset_, rare_data_ union doesn't get polluted,
diff --git a/third_party/blink/renderer/core/layout/ng/ng_constraint_space_builder.cc b/third_party/blink/renderer/core/layout/ng/ng_constraint_space_builder.cc
index 77811fe..dda726f 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_constraint_space_builder.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_constraint_space_builder.cc
@@ -10,7 +10,7 @@
 
 namespace {
 
-NGConstraintSpace::NGPercentageStorage GetPercentageStorage(
+NGConstraintSpace::PercentageStorage GetPercentageStorage(
     LayoutUnit percentage_size,
     LayoutUnit available_size) {
   if (percentage_size == available_size)
diff --git a/third_party/blink/renderer/core/layout/ng/ng_constraint_space_builder.h b/third_party/blink/renderer/core/layout/ng/ng_constraint_space_builder.h
index 5aea9d21..10d6853d 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_constraint_space_builder.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_constraint_space_builder.h
@@ -226,12 +226,12 @@
     space_.bitfields_.is_painted_atomically = b;
   }
 
-  void SetFragmentationType(NGFragmentationType fragmentation_type) {
+  void SetFragmentationType(FragmentationType fragmentation_type) {
 #if DCHECK_IS_ON()
     DCHECK(!is_block_direction_fragmentation_type_set_);
     is_block_direction_fragmentation_type_set_ = true;
 #endif
-    if (fragmentation_type != NGFragmentationType::kFragmentNone) {
+    if (fragmentation_type != FragmentationType::kFragmentNone) {
       space_.EnsureRareData()->block_direction_fragmentation_type =
           fragmentation_type;
     }
@@ -300,7 +300,7 @@
     space_.bitfields_.use_first_line_style = b;
   }
 
-  void SetAdjoiningObjectTypes(NGAdjoiningObjectTypes adjoining_object_types) {
+  void SetAdjoiningObjectTypes(AdjoiningObjectTypes adjoining_object_types) {
     if (!is_new_fc_) {
       space_.bitfields_.adjoining_object_types =
           static_cast<unsigned>(adjoining_object_types);
@@ -311,7 +311,7 @@
     space_.bitfields_.ancestor_has_clearance_past_adjoining_floats = true;
   }
 
-  void SetBaselineAlgorithmType(NGBaselineAlgorithmType type) {
+  void SetBaselineAlgorithmType(BaselineAlgorithmType type) {
     space_.bitfields_.baseline_algorithm_type = static_cast<unsigned>(type);
   }
 
diff --git a/third_party/blink/renderer/core/layout/ng/ng_fieldset_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/ng_fieldset_layout_algorithm.cc
index a3b2070..b045f7c 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_fieldset_layout_algorithm.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_fieldset_layout_algorithm.cc
@@ -537,7 +537,7 @@
       GetConstraintSpace().PercentageResolutionSize());
   builder.SetIsFixedBlockSize(padding_box_size.block_size != kIndefiniteSize);
   builder.SetBaselineAlgorithmType(
-      GetConstraintSpace().BaselineAlgorithmType());
+      GetConstraintSpace().GetBaselineAlgorithmType());
 
   if (GetConstraintSpace().HasBlockFragmentation()) {
     SetupSpaceBuilderForFragmentation(
diff --git a/third_party/blink/renderer/core/layout/ng/ng_floats_utils.cc b/third_party/blink/renderer/core/layout/ng/ng_floats_utils.cc
index 46452b7..f5267fd 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_floats_utils.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_floats_utils.cc
@@ -91,7 +91,7 @@
     if (margin_edge_offset <= LayoutUnit())
       builder.SetIsAtFragmentainerStart();
   } else {
-    builder.SetFragmentationType(NGFragmentationType::kFragmentNone);
+    builder.SetFragmentationType(FragmentationType::kFragmentNone);
   }
 
   builder.SetAvailableSize(unpositioned_float.available_size);
diff --git a/third_party/blink/renderer/core/layout/ng/ng_fragment_builder.h b/third_party/blink/renderer/core/layout/ng/ng_fragment_builder.h
index 62ef5a92..1e3cf08 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_fragment_builder.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_fragment_builder.h
@@ -368,17 +368,17 @@
     adjoining_object_types_ = kAdjoiningNone;
     has_adjoining_object_descendants_ = false;
   }
-  void AddAdjoiningObjectTypes(NGAdjoiningObjectTypes adjoining_object_types) {
+  void AddAdjoiningObjectTypes(AdjoiningObjectTypes adjoining_object_types) {
     adjoining_object_types_ |= adjoining_object_types;
     has_adjoining_object_descendants_ |= adjoining_object_types;
   }
-  void SetAdjoiningObjectTypes(NGAdjoiningObjectTypes adjoining_object_types) {
+  void SetAdjoiningObjectTypes(AdjoiningObjectTypes adjoining_object_types) {
     adjoining_object_types_ = adjoining_object_types;
   }
   void SetHasAdjoiningObjectDescendants(bool has_adjoining_object_descendants) {
     has_adjoining_object_descendants_ = has_adjoining_object_descendants;
   }
-  NGAdjoiningObjectTypes AdjoiningObjectTypes() const {
+  AdjoiningObjectTypes GetAdjoiningObjectTypes() const {
     return adjoining_object_types_;
   }
 
@@ -613,7 +613,7 @@
   // if we're performing block fragmentation.
   int line_count_ = 0;
 
-  NGAdjoiningObjectTypes adjoining_object_types_ = kAdjoiningNone;
+  AdjoiningObjectTypes adjoining_object_types_ = kAdjoiningNone;
   bool has_adjoining_object_descendants_ = false;
   bool is_self_collapsing_ = false;
   bool is_pushed_by_floats_ = false;
diff --git a/third_party/blink/renderer/core/layout/ng/ng_fragmentation_utils.cc b/third_party/blink/renderer/core/layout/ng/ng_fragmentation_utils.cc
index 07cb193..c5c673e 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_fragmentation_utils.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_fragmentation_utils.cc
@@ -281,7 +281,7 @@
 }
 
 LogicalOffset GetFragmentainerProgression(const NGBoxFragmentBuilder& builder,
-                                          NGFragmentationType type) {
+                                          FragmentationType type) {
   if (type == kFragmentColumn) {
     LayoutUnit column_inline_progression = ColumnInlineProgression(
         builder.ChildAvailableSize().inline_size, builder.Style());
@@ -1267,7 +1267,7 @@
 
 NGConstraintSpace CreateConstraintSpaceForFragmentainer(
     const NGConstraintSpace& parent_space,
-    NGFragmentationType fragmentation_type,
+    FragmentationType fragmentation_type,
     LogicalSize fragmentainer_size,
     LogicalSize percentage_resolution_size,
     bool balance_columns,
@@ -1289,7 +1289,8 @@
     space_builder.SetIsInsideBalancedColumns();
   }
   space_builder.SetMinBreakAppeal(min_break_appeal);
-  space_builder.SetBaselineAlgorithmType(parent_space.BaselineAlgorithmType());
+  space_builder.SetBaselineAlgorithmType(
+      parent_space.GetBaselineAlgorithmType());
 
   return space_builder.ToConstraintSpace();
 }
diff --git a/third_party/blink/renderer/core/layout/ng/ng_fragmentation_utils.h b/third_party/blink/renderer/core/layout/ng/ng_fragmentation_utils.h
index 1761a93..d4611c0 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_fragmentation_utils.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_fragmentation_utils.h
@@ -216,7 +216,7 @@
 
 // Get the offset from one fragmentainer to the next.
 LogicalOffset GetFragmentainerProgression(const NGBoxFragmentBuilder&,
-                                          NGFragmentationType);
+                                          FragmentationType);
 
 // Set up a child's constraint space builder for block fragmentation. The child
 // participates in the same fragmentation context as parent_space. If the child
@@ -477,7 +477,7 @@
 // when printing; as specified by fragmentation_type.
 NGConstraintSpace CreateConstraintSpaceForFragmentainer(
     const NGConstraintSpace& parent_space,
-    NGFragmentationType fragmentation_type,
+    FragmentationType fragmentation_type,
     LogicalSize fragmentainer_size,
     LogicalSize percentage_resolution_size,
     bool balance_columns,
diff --git a/third_party/blink/renderer/core/layout/ng/ng_layout_result.h b/third_party/blink/renderer/core/layout/ng/ng_layout_result.h
index 78f11bf..e279a08 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_layout_result.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_layout_result.h
@@ -439,14 +439,14 @@
   bool IsPushedByFloats() const { return bitfields_.is_pushed_by_floats; }
 
   // Returns the types of preceding adjoining objects.
-  // See |NGAdjoiningObjectTypes|.
+  // See |AdjoiningObjectTypes|.
   //
   // Adjoining floats should be treated differently when calculating clearance
   // on a block with adjoining block-start margin (in such cases we will know
   // up front that the block will need clearance, since, if it doesn't, the
   // float will be pulled along with the block, and the block will fail to
   // clear).
-  NGAdjoiningObjectTypes AdjoiningObjectTypes() const {
+  AdjoiningObjectTypes GetAdjoiningObjectTypes() const {
     return bitfields_.adjoining_object_types;
   }
 
@@ -959,7 +959,7 @@
               /* subtree_modified_margin_strut */ false) {}
     Bitfields(bool is_self_collapsing,
               bool is_pushed_by_floats,
-              NGAdjoiningObjectTypes adjoining_object_types,
+              AdjoiningObjectTypes adjoining_object_types,
               bool has_descendant_that_depends_on_percentage_block_size,
               bool subtree_modified_margin_strut)
         : has_rare_data_exclusion_space(false),
@@ -997,7 +997,7 @@
 
     unsigned is_self_collapsing : 1;
     unsigned is_pushed_by_floats : 1;
-    unsigned adjoining_object_types : 3;  // NGAdjoiningObjectTypes
+    unsigned adjoining_object_types : 3;  // AdjoiningObjectTypes
 
     unsigned is_initial_block_size_indefinite : 1;
     unsigned has_descendant_that_depends_on_percentage_block_size : 1;
diff --git a/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.h b/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.h
index c79098dc..56611f6 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.h
@@ -261,7 +261,7 @@
   const ContainingBlockInfo GetContainingBlockInfo(
       const LogicalOofPositionedNode&);
 
-  NGFragmentationType GetFragmentainerType() const {
+  FragmentationType GetFragmentainerType() const {
     if (container_builder_->Node().IsPaginatedRoot())
       return kFragmentPage;
     return kFragmentColumn;
diff --git a/third_party/blink/renderer/core/layout/ng/ng_simplified_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/ng_simplified_layout_algorithm.cc
index 1b633b4..2f2618d 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_simplified_layout_algorithm.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_simplified_layout_algorithm.cc
@@ -73,7 +73,8 @@
       container_builder_.SetIsSelfCollapsing();
     if (result.IsPushedByFloats())
       container_builder_.SetIsPushedByFloats();
-    container_builder_.SetAdjoiningObjectTypes(result.AdjoiningObjectTypes());
+    container_builder_.SetAdjoiningObjectTypes(
+        result.GetAdjoiningObjectTypes());
 
     if (GetConstraintSpace().IsTableCell()) {
       container_builder_.SetHasCollapsedBorders(
@@ -102,7 +103,7 @@
 
     DCHECK(!result.IsSelfCollapsing());
     DCHECK(!result.IsPushedByFloats());
-    DCHECK_EQ(result.AdjoiningObjectTypes(), kAdjoiningNone);
+    DCHECK_EQ(result.GetAdjoiningObjectTypes(), kAdjoiningNone);
 
     if (physical_fragment.IsFieldsetContainer())
       container_builder_.SetIsFieldsetContainer();
diff --git a/third_party/blink/renderer/core/page/focus_controller.cc b/third_party/blink/renderer/core/page/focus_controller.cc
index 9753138b..3388cf3 100644
--- a/third_party/blink/renderer/core/page/focus_controller.cc
+++ b/third_party/blink/renderer/core/page/focus_controller.cc
@@ -526,6 +526,9 @@
 }
 
 inline bool ShouldVisit(Element& element) {
+  DCHECK(!element.IsKeyboardFocusable() ||
+         FocusController::AdjustedTabIndex(element) >= 0)
+      << "Keyboard focusable element with negative tabindex" << element;
   return element.IsKeyboardFocusable() || element.DelegatesFocus() ||
          IsNonFocusableFocusScopeOwner(element);
 }
diff --git a/third_party/blink/renderer/modules/crypto/crypto_histograms.cc b/third_party/blink/renderer/modules/crypto/crypto_histograms.cc
index 64e1fbb..1b9ca45 100644
--- a/third_party/blink/renderer/modules/crypto/crypto_histograms.cc
+++ b/third_party/blink/renderer/modules/crypto/crypto_histograms.cc
@@ -139,4 +139,14 @@
   HistogramKey(context, key);
 }
 
+void HistogramDeriveBitsTruncation(ExecutionContext* context,
+                                   unsigned int length_bits,
+                                   WebCryptoWarningType status) {
+  if (length_bits == 0) {
+    UseCounter::Count(context, WebFeature::kSubtleCryptoDeriveBitsZeroLength);
+  } else if (status == blink::kWebCryptoWarningTypeDeriveBitsTruncated) {
+    UseCounter::Count(context, WebFeature::kSubtleCryptoDeriveBitsTruncation);
+  }
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/crypto/crypto_histograms.h b/third_party/blink/renderer/modules/crypto/crypto_histograms.h
index 8c1b1da3..a82f4a9 100644
--- a/third_party/blink/renderer/modules/crypto/crypto_histograms.h
+++ b/third_party/blink/renderer/modules/crypto/crypto_histograms.h
@@ -119,6 +119,10 @@
                               const WebCryptoAlgorithm&,
                               const WebCryptoKey&);
 
+void HistogramDeriveBitsTruncation(ExecutionContext*,
+                                   unsigned int,
+                                   WebCryptoWarningType);
+
 }  // namespace blink
 
 #endif  // THIRD_PARTY_BLINK_RENDERER_MODULES_CRYPTO_CRYPTO_HISTOGRAMS_H_
diff --git a/third_party/blink/renderer/modules/crypto/crypto_result_impl.cc b/third_party/blink/renderer/modules/crypto/crypto_result_impl.cc
index 8bccb29..91f0d7b5 100644
--- a/third_party/blink/renderer/modules/crypto/crypto_result_impl.cc
+++ b/third_party/blink/renderer/modules/crypto/crypto_result_impl.cc
@@ -129,6 +129,16 @@
   resolver_ = nullptr;
 }
 
+ExecutionContext* CryptoResultImpl::GetExecutionContext() {
+  // Duplicate some of the checks done by ScriptPromiseResolver.
+  if (!resolver_ || !resolver_->GetExecutionContext() ||
+      resolver_->GetExecutionContext()->IsContextDestroyed()) {
+    return nullptr;
+  }
+
+  return resolver_->GetExecutionContext();
+}
+
 void CryptoResultImpl::CompleteWithError(WebCryptoErrorType error_type,
                                          const WebString& error_details) {
   if (!resolver_)
diff --git a/third_party/blink/renderer/modules/crypto/crypto_result_impl.h b/third_party/blink/renderer/modules/crypto/crypto_result_impl.h
index 32305191..40b79219 100644
--- a/third_party/blink/renderer/modules/crypto/crypto_result_impl.h
+++ b/third_party/blink/renderer/modules/crypto/crypto_result_impl.h
@@ -65,6 +65,9 @@
   void CompleteWithKey(const WebCryptoKey&) override;
   void CompleteWithKeyPair(const WebCryptoKey& public_key,
                            const WebCryptoKey& private_key) override;
+  ExecutionContext* GetExecutionContext() override;
+  WebCryptoWarningType GetWarning() override { return warning_code_; }
+  void SetWarning(WebCryptoWarningType code) override { warning_code_ = code; }
 
   void CompleteWithError(ExceptionState&);
 
@@ -94,6 +97,8 @@
   // cancellation status object for the purpose, which will outlive the
   // result object and can be safely accessed by multiple threads.
   scoped_refptr<CryptoResultCancel> cancel_;
+
+  WebCryptoWarningType warning_code_;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/crypto/subtle_crypto.cc b/third_party/blink/renderer/modules/crypto/subtle_crypto.cc
index 11e6ad0..cfd156e 100644
--- a/third_party/blink/renderer/modules/crypto/subtle_crypto.cc
+++ b/third_party/blink/renderer/modules/crypto/subtle_crypto.cc
@@ -680,6 +680,9 @@
   Platform::Current()->Crypto()->DeriveBits(
       normalized_algorithm, base_key->Key(), length_bits, result->Result(),
       std::move(task_runner));
+
+  HistogramDeriveBitsTruncation(result->GetExecutionContext(), length_bits,
+                                result->GetWarning());
   return promise;
 }
 
diff --git a/third_party/blink/renderer/modules/ml/webnn/fuzzer/conv2d_fuzzer.cc b/third_party/blink/renderer/modules/ml/webnn/fuzzer/conv2d_fuzzer.cc
index a6e17b85..099b297 100644
--- a/third_party/blink/renderer/modules/ml/webnn/fuzzer/conv2d_fuzzer.cc
+++ b/third_party/blink/renderer/modules/ml/webnn/fuzzer/conv2d_fuzzer.cc
@@ -80,12 +80,12 @@
       exception_state);
   CHECK(builder);
 
-  auto* input =
-      BuildInput(builder, "input", Vector<uint32_t>(conv2d.input_dimensions()),
-                 ToV8MLOperandType(conv2d.input_type()), exception_state);
-  auto* filter =
-      BuildConstant(builder, Vector<uint32_t>(conv2d.filter_dimensions()),
-                    ToV8MLOperandType(conv2d.filter_type()), exception_state);
+  auto* input = BuildInput(
+      builder, "input", Vector<uint32_t>(conv2d.input_dimensions()),
+      ToV8MLOperandDataType(conv2d.input_data_type()), exception_state);
+  auto* filter = BuildConstant(
+      builder, Vector<uint32_t>(conv2d.filter_dimensions()),
+      ToV8MLOperandDataType(conv2d.filter_data_type()), exception_state);
   auto* conv2d_options = blink::MLConv2dOptions::Create();
   if (conv2d.has_conv2d_options()) {
     ProtobufToConv2dOptions(conv2d.conv2d_options(), conv2d_options);
diff --git a/third_party/blink/renderer/modules/ml/webnn/fuzzer/pool2d_fuzzer.cc b/third_party/blink/renderer/modules/ml/webnn/fuzzer/pool2d_fuzzer.cc
index 0dd3936..28ca9e3 100644
--- a/third_party/blink/renderer/modules/ml/webnn/fuzzer/pool2d_fuzzer.cc
+++ b/third_party/blink/renderer/modules/ml/webnn/fuzzer/pool2d_fuzzer.cc
@@ -79,9 +79,9 @@
       exception_state);
   CHECK(builder);
 
-  auto* input =
-      BuildInput(builder, "input", Vector<uint32_t>(pool2d.input_dimensions()),
-                 ToV8MLOperandType(pool2d.input_type()), exception_state);
+  auto* input = BuildInput(
+      builder, "input", Vector<uint32_t>(pool2d.input_dimensions()),
+      ToV8MLOperandDataType(pool2d.input_data_type()), exception_state);
   auto* pool2d_options = blink::MLPool2dOptions::Create();
   if (pool2d.has_pool2d_options()) {
     ProtobufToPool2dOptions(pool2d.pool2d_options(), pool2d_options);
diff --git a/third_party/blink/renderer/modules/ml/webnn/fuzzer/utils.cc b/third_party/blink/renderer/modules/ml/webnn/fuzzer/utils.cc
index c2ae1a80..0bb3b6d 100644
--- a/third_party/blink/renderer/modules/ml/webnn/fuzzer/utils.cc
+++ b/third_party/blink/renderer/modules/ml/webnn/fuzzer/utils.cc
@@ -6,20 +6,21 @@
 
 namespace blink {
 
-V8MLOperandType::Enum ToV8MLOperandType(webnn_proto::MLOperandType type) {
-  switch (type) {
-    case webnn_proto::MLOperandType::FLOAT32:
-      return V8MLOperandType::Enum::kFloat32;
-    case webnn_proto::MLOperandType::FLOAT16:
-      return V8MLOperandType::Enum::kFloat16;
-    case webnn_proto::MLOperandType::INT32:
-      return V8MLOperandType::Enum::kInt32;
-    case webnn_proto::MLOperandType::UINT32:
-      return V8MLOperandType::Enum::kUint32;
-    case webnn_proto::MLOperandType::INT8:
-      return V8MLOperandType::Enum::kInt8;
-    case webnn_proto::MLOperandType::UINT8:
-      return V8MLOperandType::Enum::kUint8;
+V8MLOperandDataType::Enum ToV8MLOperandDataType(
+    webnn_proto::MLOperandDataType data_type) {
+  switch (data_type) {
+    case webnn_proto::MLOperandDataType::FLOAT32:
+      return V8MLOperandDataType::Enum::kFloat32;
+    case webnn_proto::MLOperandDataType::FLOAT16:
+      return V8MLOperandDataType::Enum::kFloat16;
+    case webnn_proto::MLOperandDataType::INT32:
+      return V8MLOperandDataType::Enum::kInt32;
+    case webnn_proto::MLOperandDataType::UINT32:
+      return V8MLOperandDataType::Enum::kUint32;
+    case webnn_proto::MLOperandDataType::INT8:
+      return V8MLOperandDataType::Enum::kInt8;
+    case webnn_proto::MLOperandDataType::UINT8:
+      return V8MLOperandDataType::Enum::kUint8;
   }
 }
 
diff --git a/third_party/blink/renderer/modules/ml/webnn/fuzzer/utils.h b/third_party/blink/renderer/modules/ml/webnn/fuzzer/utils.h
index 2575511..c6cb2d23 100644
--- a/third_party/blink/renderer/modules/ml/webnn/fuzzer/utils.h
+++ b/third_party/blink/renderer/modules/ml/webnn/fuzzer/utils.h
@@ -11,7 +11,8 @@
 
 namespace blink {
 
-V8MLOperandType::Enum ToV8MLOperandType(webnn_proto::MLOperandType type);
+V8MLOperandDataType::Enum ToV8MLOperandDataType(
+    webnn_proto::MLOperandDataType data_type);
 
 V8MLAutoPad::Enum ToV8MLAutoPad(webnn_proto::MLAutoPad auto_pad);
 
diff --git a/third_party/blink/renderer/modules/ml/webnn/fuzzer/webnn.proto b/third_party/blink/renderer/modules/ml/webnn/fuzzer/webnn.proto
index fe8a0ba8..1c87211 100644
--- a/third_party/blink/renderer/modules/ml/webnn/fuzzer/webnn.proto
+++ b/third_party/blink/renderer/modules/ml/webnn/fuzzer/webnn.proto
@@ -6,7 +6,7 @@
 
 package webnn_proto;
 
-enum MLOperandType {
+enum MLOperandDataType {
   FLOAT32 = 0;
   FLOAT16 = 1;
   INT32 = 2;
@@ -66,17 +66,17 @@
 
 message conv2d {
   repeated uint32 input_dimensions = 1;
-  required MLOperandType input_type = 2;
+  required MLOperandDataType input_data_type = 2;
 
   repeated uint32 filter_dimensions = 3;
-  required MLOperandType filter_type = 4;
+  required MLOperandDataType filter_data_type = 4;
 
   optional conv2dOptions conv2d_options = 5;
 }
 
 message pool2d {
   repeated uint32 input_dimensions = 1;
-  required MLOperandType input_type = 2;
+  required MLOperandDataType input_data_type = 2;
 
   required MLPool2dKind pool2d_kind = 3;
 
diff --git a/third_party/blink/renderer/modules/ml/webnn/ml_graph.cc b/third_party/blink/renderer/modules/ml/webnn/ml_graph.cc
index 9cef803..629b389 100644
--- a/third_party/blink/renderer/modules/ml/webnn/ml_graph.cc
+++ b/third_party/blink/renderer/modules/ml/webnn/ml_graph.cc
@@ -49,12 +49,13 @@
       return false;
     }
     const auto& info = resources_info.at(name);
-    if (array_buffer_view->GetType() != GetArrayBufferViewType(info.type)) {
+    if (array_buffer_view->GetType() !=
+        GetArrayBufferViewType(info.data_type)) {
       error_message = String::Format(
           "The type (%s) of the array buffer view with name \"%s\" doesn't "
-          "match the expected operand type (%s).",
+          "match the expected operand data type (%s).",
           array_buffer_view->TypeName(), name.Utf8().c_str(),
-          V8MLOperandType(info.type).AsCStr());
+          V8MLOperandDataType(info.data_type).AsCStr());
       return false;
     }
     if (array_buffer_view->byteLength() != info.byte_length) {
@@ -197,7 +198,7 @@
     }
     // Setup resource info for this output operand.
     output_resources_info_.insert(
-        name, ResourceInfo({.type = operand->Type(),
+        name, ResourceInfo({.data_type = operand->DataType(),
                             .byte_length = operand->ByteLength()}));
     // Mark its dependent operator is visited.
     visited_operators.insert(operand->Operator());
@@ -242,7 +243,7 @@
           // Setup resource info for this input operand.
           input_resources_info_.insert(
               operand->Name(),
-              ResourceInfo({.type = operand->Type(),
+              ResourceInfo({.data_type = operand->DataType(),
                             .byte_length = operand->ByteLength()}));
           break;
         case MLOperand::OperandKind::kConstant:
diff --git a/third_party/blink/renderer/modules/ml/webnn/ml_graph.h b/third_party/blink/renderer/modules/ml/webnn/ml_graph.h
index 1491a20f..8544706 100644
--- a/third_party/blink/renderer/modules/ml/webnn/ml_graph.h
+++ b/third_party/blink/renderer/modules/ml/webnn/ml_graph.h
@@ -44,7 +44,7 @@
   // MLOperandDescriptor because neither byte length calculation from dimensions
   // nor GC support is needed for the implementation.
   struct ResourceInfo {
-    V8MLOperandType::Enum type;
+    V8MLOperandDataType::Enum data_type;
     size_t byte_length;
   };
   const HashMap<String, ResourceInfo>& GetInputResourcesInfo() const;
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 9067fca..df837653 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
@@ -52,46 +52,46 @@
 
 MLGraphBuilder::BackendForTesting* g_backend_for_testing = nullptr;
 
-blink::V8MLOperandType::Enum ComponentOperandTypeToBlink(
-    webnn::Operand::DataType type) {
-  switch (type) {
+blink::V8MLOperandDataType::Enum ComponentOperandTypeToBlink(
+    webnn::Operand::DataType data_type) {
+  switch (data_type) {
     case webnn::Operand::DataType::kFloat32:
-      return blink::V8MLOperandType::Enum::kFloat32;
+      return blink::V8MLOperandDataType::Enum::kFloat32;
     case webnn::Operand::DataType::kFloat16:
-      return blink::V8MLOperandType::Enum::kFloat16;
+      return blink::V8MLOperandDataType::Enum::kFloat16;
     case webnn::Operand::DataType::kInt32:
-      return blink::V8MLOperandType::Enum::kInt32;
+      return blink::V8MLOperandDataType::Enum::kInt32;
     case webnn::Operand::DataType::kUint32:
-      return blink::V8MLOperandType::Enum::kUint32;
+      return blink::V8MLOperandDataType::Enum::kUint32;
     case webnn::Operand::DataType::kInt8:
-      return blink::V8MLOperandType::Enum::kInt8;
+      return blink::V8MLOperandDataType::Enum::kInt8;
     case webnn::Operand::DataType::kUint8:
-      return blink::V8MLOperandType::Enum::kUint8;
+      return blink::V8MLOperandDataType::Enum::kUint8;
   }
   NOTREACHED_NORETURN();
 }
 
 webnn::Operand::DataType BlinkOperandTypeToComponent(
-    blink::V8MLOperandType::Enum type) {
-  switch (type) {
-    case blink::V8MLOperandType::Enum::kFloat32:
+    blink::V8MLOperandDataType::Enum data_type) {
+  switch (data_type) {
+    case blink::V8MLOperandDataType::Enum::kFloat32:
       return webnn::Operand::DataType::kFloat32;
-    case blink::V8MLOperandType::Enum::kFloat16:
+    case blink::V8MLOperandDataType::Enum::kFloat16:
       return webnn::Operand::DataType::kFloat16;
-    case blink::V8MLOperandType::Enum::kInt32:
+    case blink::V8MLOperandDataType::Enum::kInt32:
       return webnn::Operand::DataType::kInt32;
-    case blink::V8MLOperandType::Enum::kUint32:
+    case blink::V8MLOperandDataType::Enum::kUint32:
       return webnn::Operand::DataType::kUint32;
-    case blink::V8MLOperandType::Enum::kInt8:
+    case blink::V8MLOperandDataType::Enum::kInt8:
       return webnn::Operand::DataType::kInt8;
-    case blink::V8MLOperandType::Enum::kUint8:
+    case blink::V8MLOperandDataType::Enum::kUint8:
       return webnn::Operand::DataType::kUint8;
   }
   NOTREACHED_NORETURN();
 }
 
 webnn::Operand ConvertToComponentOperand(const blink::MLOperand* ml_operand) {
-  return webnn::Operand(BlinkOperandTypeToComponent(ml_operand->Type()),
+  return webnn::Operand(BlinkOperandTypeToComponent(ml_operand->DataType()),
                         ml_operand->Dimensions());
 }
 
@@ -386,9 +386,10 @@
                                   const MLOperand* a,
                                   const MLOperand* b,
                                   ExceptionState& exception_state) {
-  if (a->Type() != b->Type()) {
-    exception_state.ThrowDOMException(DOMExceptionCode::kDataError,
-                                      "The input types don't match.");
+  if (a->DataType() != b->DataType()) {
+    exception_state.ThrowDOMException(
+        DOMExceptionCode::kDataError,
+        "The input operand data types don't match.");
     return nullptr;
   }
   absl::optional<Vector<uint32_t>> dims_output =
@@ -400,7 +401,7 @@
     return nullptr;
   }
   auto* binary = MakeGarbageCollected<MLOperator>(builder, kind);
-  auto output = MLOperand::ValidateAndCreateOutput(builder, a->Type(),
+  auto output = MLOperand::ValidateAndCreateOutput(builder, a->DataType(),
                                                    dims_output.value(), binary);
   if (!output.has_value()) {
     exception_state.ThrowDOMException(DOMExceptionCode::kDataError,
@@ -418,19 +419,20 @@
     const webnn::DataTypeConstraintSet& data_type_constraint,
     const MLOperand* input,
     const bindings::DictionaryBase* options = nullptr) {
-  // The output tensor of unary operator has the same type and dimensions as its
-  // input tensor.
-  if (!data_type_constraint.Has(BlinkOperandTypeToComponent(input->Type()))) {
+  // The output tensor of unary operator has the same data type and dimensions
+  // as its input tensor.
+  if (!data_type_constraint.Has(
+          BlinkOperandTypeToComponent(input->DataType()))) {
     exception_state.ThrowDOMException(
         DOMExceptionCode::kDataError,
         String::Format(
-            "The input type must be one of the %s types.",
+            "The input data type must be one of the %s types.",
             webnn::DataTypeConstraintToString(data_type_constraint).c_str()));
     return nullptr;
   }
 
   auto* unary = MakeGarbageCollected<MLOperator>(builder, kind, options);
-  auto output = MLOperand::ValidateAndCreateOutput(builder, input->Type(),
+  auto output = MLOperand::ValidateAndCreateOutput(builder, input->DataType(),
                                                    input->Dimensions(), unary);
   if (!output.has_value()) {
     exception_state.ThrowDOMException(DOMExceptionCode::kDataError,
@@ -461,7 +463,7 @@
   auto* reduce = MakeGarbageCollected<MLOperator>(builder, kind, options);
   // According to WebNN spec
   // https://www.w3.org/TR/webnn/#api-mlgraphbuilder-reduce, the output
-  // tensor of reduce has the same type as its input.
+  // tensor of reduce has the same data type as its input.
   auto output = MLOperand::ValidateAndCreateOutput(
       builder, ComponentOperandTypeToBlink(validated_output->data_type),
       Vector<uint32_t>(validated_output->dimensions), reduce);
@@ -499,8 +501,8 @@
   // to its input and output operands.
   auto* pool2d = MakeGarbageCollected<MLOperator>(builder, kind, options);
   auto output = MLOperand::ValidateAndCreateOutput(
-      builder, input->Type(), Vector<uint32_t>(validated_output->dimensions),
-      pool2d);
+      builder, input->DataType(),
+      Vector<uint32_t>(validated_output->dimensions), pool2d);
   if (!output.has_value()) {
     exception_state.ThrowDOMException(DOMExceptionCode::kDataError,
                                       output.error());
@@ -536,7 +538,7 @@
   // If no dimensions, it represents a scalar. Set dimensions to empty.
   Vector<uint32_t> dimensions = desc->getDimensionsOr({});
   auto input_operand = MLOperand::ValidateAndCreateInput(
-      this, desc->type().AsEnum(), std::move(dimensions), std::move(name));
+      this, desc->dataType().AsEnum(), std::move(dimensions), std::move(name));
   if (!input_operand.has_value()) {
     exception_state.ThrowDOMException(DOMExceptionCode::kDataError,
                                       input_operand.error());
@@ -552,7 +554,8 @@
   // If no dimensions, it represents a scalar. Set dimensions to empty.
   Vector<uint32_t> dimensions = desc->getDimensionsOr({});
   auto constant_operand = MLOperand::ValidateAndCreateConstant(
-      this, desc->type().AsEnum(), std::move(dimensions), buffer_view.Get());
+      this, desc->dataType().AsEnum(), std::move(dimensions),
+      buffer_view.Get());
   if (!constant_operand.has_value()) {
     exception_state.ThrowDOMException(DOMExceptionCode::kDataError,
                                       constant_operand.error());
@@ -644,7 +647,7 @@
   }
   // According to WebNN spec
   // https://www.w3.org/TR/webnn/#api-mlgraphbuilder-clamp, the output tensor of
-  // clamp has the same type and dimensions as its input.
+  // clamp has the same data type and dimensions as its input.
   return BuildUnaryOperator(
       this, exception_state, MLOperator::OperatorKind::kClamp,
       webnn::DataTypeConstraintSet::All(), input, options);
@@ -821,13 +824,13 @@
         "The value of alpha must be greater than 0.");
     return nullptr;
   }
-  // The current spec doesn't specify the operand type constraints of elu. An
-  // issue has been filed to track it:
+  // The current spec doesn't specify the operand data type constraints of elu.
+  // An issue has been filed to track it:
   // https://github.com/webmachinelearning/webnn/issues/283.
   //
   // According to WebNN spec
   // https://www.w3.org/TR/webnn/#api-mlgraphbuilder-elu, the output tensor of
-  // elu has the same type and dimensions as its input.
+  // elu has the same data type and dimensions as its input.
   return BuildUnaryOperator(this, exception_state,
                             MLOperator::OperatorKind::kElu,
                             webnn::DataTypeConstraint::kFloat, input, options);
@@ -864,7 +867,7 @@
   auto* expand =
       MakeGarbageCollected<MLOperator>(this, MLOperator::OperatorKind::kExpand);
   auto output = MLOperand::ValidateAndCreateOutput(
-      this, input->Type(), output_shape.value(), expand);
+      this, input->DataType(), output_shape.value(), expand);
   if (!output.has_value()) {
     exception_state.ThrowDOMException(DOMExceptionCode::kDataError,
                                       output.error());
@@ -907,13 +910,13 @@
 
 MLOperand* MLGraphBuilder::hardSwish(const MLOperand* input,
                                      ExceptionState& exception_state) {
-  // The input type must be one of the floating point types. Although this
+  // The input data type must be one of the floating point types. Although this
   // constraint is not specified in current WebNN spec, there is a feature
   // request for that: https://github.com/webmachinelearning/webnn/issues/283
   //
   // According to WebNN spec
   // https://www.w3.org/TR/webnn/#api-mlgraphbuilder-hard-swish, the output
-  // tensor of hard-swish has the same type and dimensions as its input.
+  // tensor of hard-swish has the same data type and dimensions as its input.
   return BuildUnaryOperator(this, exception_state,
                             MLOperator::OperatorKind::kHardSwish,
                             webnn::DataTypeConstraint::kFloat, input);
@@ -929,13 +932,13 @@
 MLOperand* MLGraphBuilder::leakyRelu(const MLOperand* input,
                                      const MLLeakyReluOptions* options,
                                      ExceptionState& exception_state) {
-  // The current spec doesn't specify the operand type constraints of leakyRelu.
-  // An issue has been filed to track it:
+  // The current spec doesn't specify the operand data type constraints of
+  // leakyRelu. An issue has been filed to track it:
   // https://github.com/webmachinelearning/webnn/issues/283.
   //
   // According to WebNN spec
   // https://www.w3.org/TR/webnn/#api-mlgraphbuilder-relu, the output tensor of
-  // relu has the same type and dimensions as its input.
+  // relu has the same data type and dimensions as its input.
   return BuildUnaryOperator(this, exception_state,
                             MLOperator::OperatorKind::kLeakyRelu,
                             webnn::DataTypeConstraint::kFloat, input, options);
@@ -1002,9 +1005,10 @@
                                                   ending_padding, options);
   // According to WebNN spec
   // https://www.w3.org/TR/webnn/#api-mlgraphbuilder-pad, the output
-  // tensor of pad has the same type as its input.
+  // tensor of pad has the same data type as its input.
   auto output = MLOperand::ValidateAndCreateOutput(
-      this, input->Type(), Vector<uint32_t>(validated_output->dimensions), pad);
+      this, input->DataType(), Vector<uint32_t>(validated_output->dimensions),
+      pad);
   if (!output.has_value()) {
     exception_state.ThrowDOMException(DOMExceptionCode::kDataError,
                                       output.error());
@@ -1058,7 +1062,7 @@
                                 ExceptionState& exception_state) {
   // According to WebNN spec
   // https://www.w3.org/TR/webnn/#api-mlgraphbuilder-relu, the output tensor of
-  // relu has the same type and dimensions as its input.
+  // relu has the same data type and dimensions as its input.
   return BuildUnaryOperator(this, exception_state,
                             MLOperator::OperatorKind::kRelu,
                             webnn::DataTypeConstraintSet::All(), input);
@@ -1152,7 +1156,7 @@
   auto* reshape = MakeGarbageCollected<MLOperator>(
       this, MLOperator::OperatorKind::kReshape);
   auto output = MLOperand::ValidateAndCreateOutput(
-      this, input->Type(), std::move(output_shape), reshape);
+      this, input->DataType(), std::move(output_shape), reshape);
   if (!output.has_value()) {
     exception_state.ThrowDOMException(DOMExceptionCode::kDataError,
                                       output.error());
@@ -1208,8 +1212,8 @@
                                    ExceptionState& exception_state) {
   // According to WebNN spec
   // https://webmachinelearning.github.io/webnn/#api-mlgraphbuilder-sigmoid, the
-  // output tensor of sigmoid has the same type and dimensions as its input.
-  // And the input type must be one of the floating point types.
+  // output tensor of sigmoid has the same data type and dimensions as its
+  // input. And the input data type must be one of the floating point types.
   return BuildUnaryOperator(this, exception_state,
                             MLOperator::OperatorKind::kSigmoid,
                             webnn::DataTypeConstraint::kFloat, input);
@@ -1282,14 +1286,14 @@
 
 MLOperand* MLGraphBuilder::softsign(const MLOperand* input,
                                     ExceptionState& exception_state) {
-  // The input type must be one of the floating point types.
-  // The current spec doesn't specify the operand type constraints of softsign,
-  // an issue has been filed to track it-
+  // The input data type must be one of the floating point types.
+  // The current spec doesn't specify the operand data type constraints of
+  // softsign, an issue has been filed to track it-
   // https://github.com/webmachinelearning/webnn/issues/283.
   //
   // According to WebNN spec
   // https://www.w3.org/TR/webnn/#api-mlgraphbuilder-softsign, the output tensor
-  // of softsign has the same type and dimensions as its input.
+  // of softsign has the same data type and dimensions as its input.
   return BuildUnaryOperator(this, exception_state,
                             MLOperator::OperatorKind::kSoftsign,
                             webnn::DataTypeConstraint::kFloat, input);
@@ -1374,14 +1378,14 @@
 
 MLOperand* MLGraphBuilder::tanh(const MLOperand* input,
                                 ExceptionState& exception_state) {
-  // The input type must be one of the floating point types.
-  // The current spec doesn't specify the operand type constraints of tanh, an
-  // issue has been filed to track it-
+  // The input data type must be one of the floating point types.
+  // The current spec doesn't specify the operand data type constraints of tanh,
+  // an issue has been filed to track it-
   // https://github.com/webmachinelearning/webnn/issues/283.
   //
   // According to WebNN spec
   // https://www.w3.org/TR/webnn/#api-mlgraphbuilder-tanh, the output tensor of
-  // tanh has the same type and dimensions as its input.
+  // tanh has the same data type and dimensions as its input.
   return BuildUnaryOperator(this, exception_state,
                             MLOperator::OperatorKind::kTanh,
                             webnn::DataTypeConstraint::kFloat, input);
@@ -1416,7 +1420,7 @@
       this, MLOperator::OperatorKind::kTranspose, options);
   // According to WebNN spec
   // https://www.w3.org/TR/webnn/#api-mlgraphbuilder-transpose, the output
-  // tensor of transpose has the same type as its input.
+  // tensor of transpose has the same data type as its input.
   auto output = MLOperand::ValidateAndCreateOutput(
       this, ComponentOperandTypeToBlink(validated_output->data_type),
       Vector<uint32_t>(validated_output->dimensions), transpose);
diff --git a/third_party/blink/renderer/modules/ml/webnn/ml_graph_builder_test.cc b/third_party/blink/renderer/modules/ml/webnn/ml_graph_builder_test.cc
index e452ed4..d8fcec8 100644
--- a/third_party/blink/renderer/modules/ml/webnn/ml_graph_builder_test.cc
+++ b/third_party/blink/renderer/modules/ml/webnn/ml_graph_builder_test.cc
@@ -42,46 +42,46 @@
   {
     // Test building a 0-D scalar input without presenting dimensions.
     auto* desc = MLOperandDescriptor::Create();
-    desc->setType(V8MLOperandType::Enum::kFloat32);
+    desc->setDataType(V8MLOperandDataType::Enum::kFloat32);
     auto* input = builder->input("input", desc, scope.GetExceptionState());
     EXPECT_NE(input, nullptr);
     EXPECT_EQ(scope.GetExceptionState().CodeAs<DOMExceptionCode>(),
               DOMExceptionCode::kNoError);
     EXPECT_EQ(input->Kind(), MLOperand::OperandKind::kInput);
-    EXPECT_EQ(input->Type(), V8MLOperandType::Enum::kFloat32);
+    EXPECT_EQ(input->DataType(), V8MLOperandDataType::Enum::kFloat32);
     EXPECT_EQ(input->Dimensions(), Vector<uint32_t>({}));
     EXPECT_EQ(input->Name(), "input");
   }
   {
     // Test building a 0-D scalar input with empty dimensions.
     auto* input =
-        BuildInput(builder, "input", {}, V8MLOperandType::Enum::kFloat32,
+        BuildInput(builder, "input", {}, V8MLOperandDataType::Enum::kFloat32,
                    scope.GetExceptionState());
     EXPECT_NE(input, nullptr);
     EXPECT_EQ(scope.GetExceptionState().CodeAs<DOMExceptionCode>(),
               DOMExceptionCode::kNoError);
     EXPECT_EQ(input->Kind(), MLOperand::OperandKind::kInput);
-    EXPECT_EQ(input->Type(), V8MLOperandType::Enum::kFloat32);
+    EXPECT_EQ(input->DataType(), V8MLOperandDataType::Enum::kFloat32);
     EXPECT_EQ(input->Dimensions(), Vector<uint32_t>({}));
     EXPECT_EQ(input->Name(), "input");
   }
   {
     // Test building a 2-D input without errors.
-    auto* input =
-        BuildInput(builder, "input", {3, 4}, V8MLOperandType::Enum::kFloat32,
-                   scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {3, 4},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     EXPECT_NE(input, nullptr);
     EXPECT_EQ(scope.GetExceptionState().CodeAs<DOMExceptionCode>(),
               DOMExceptionCode::kNoError);
     EXPECT_EQ(input->Kind(), MLOperand::OperandKind::kInput);
-    EXPECT_EQ(input->Type(), V8MLOperandType::Enum::kFloat32);
+    EXPECT_EQ(input->DataType(), V8MLOperandDataType::Enum::kFloat32);
     EXPECT_EQ(input->Dimensions(), Vector<uint32_t>({3, 4}));
     EXPECT_EQ(input->Name(), "input");
   }
   {
     // Test throwing exception if the name is empty.
     auto* input =
-        BuildInput(builder, "", {3, 4}, V8MLOperandType::Enum::kFloat32,
+        BuildInput(builder, "", {3, 4}, V8MLOperandDataType::Enum::kFloat32,
                    scope.GetExceptionState());
     EXPECT_EQ(input, nullptr);
     EXPECT_EQ(scope.GetExceptionState().CodeAs<DOMExceptionCode>(),
@@ -90,9 +90,9 @@
   }
   {
     // Test throwing exception if a dimension size is 0.
-    auto* input =
-        BuildInput(builder, "input", {3, 0}, V8MLOperandType::Enum::kFloat32,
-                   scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {3, 0},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     EXPECT_EQ(input, nullptr);
     EXPECT_EQ(scope.GetExceptionState().CodeAs<DOMExceptionCode>(),
               DOMExceptionCode::kDataError);
@@ -104,7 +104,7 @@
     // Set the dimensions that let the number of elements be 2 * SIZE_MAX.
     auto* input = BuildInput(
         builder, "input", {1, 2, kSquareRootOfSizeMax, kSquareRootOfSizeMax},
-        V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
+        V8MLOperandDataType::Enum::kFloat32, scope.GetExceptionState());
     EXPECT_EQ(input, nullptr);
     EXPECT_EQ(scope.GetExceptionState().CodeAs<DOMExceptionCode>(),
               DOMExceptionCode::kDataError);
@@ -114,10 +114,11 @@
   }
   {
     // Test throwing exception if the byte length is too large.
-    // Set the dimensions and type that let the byte length be 4 * SIZE_MAX.
+    // Set the dimensions and data type that let the byte length be 4 *
+    // SIZE_MAX.
     auto* input = BuildInput(
         builder, "input", {1, 1, kSquareRootOfSizeMax, kSquareRootOfSizeMax},
-        V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
+        V8MLOperandDataType::Enum::kFloat32, scope.GetExceptionState());
     EXPECT_EQ(input, nullptr);
     EXPECT_EQ(scope.GetExceptionState().CodeAs<DOMExceptionCode>(),
               DOMExceptionCode::kDataError);
@@ -134,45 +135,46 @@
   {
     // Test building a 0-D scalar constant without presenting dimensions.
     auto* desc = MLOperandDescriptor::Create();
-    desc->setType(V8MLOperandType::Enum::kFloat32);
+    desc->setDataType(V8MLOperandDataType::Enum::kFloat32);
     NotShared<DOMArrayBufferView> buffer_view =
-        CreateDOMArrayBufferView(1, V8MLOperandType::Enum::kFloat32);
+        CreateDOMArrayBufferView(1, V8MLOperandDataType::Enum::kFloat32);
     auto* constant =
         builder->constant(desc, buffer_view, scope.GetExceptionState());
     EXPECT_NE(constant, nullptr);
     EXPECT_EQ(scope.GetExceptionState().CodeAs<DOMExceptionCode>(),
               DOMExceptionCode::kNoError);
     EXPECT_EQ(constant->Kind(), MLOperand::OperandKind::kConstant);
-    EXPECT_EQ(constant->Type(), V8MLOperandType::Enum::kFloat32);
+    EXPECT_EQ(constant->DataType(), V8MLOperandDataType::Enum::kFloat32);
     EXPECT_EQ(constant->Dimensions(), Vector<uint32_t>({}));
   }
   {
     // Test building a 0-D scalar constant with empty dimensions.
-    auto* constant = BuildConstant(builder, {}, V8MLOperandType::Enum::kFloat32,
-                                   scope.GetExceptionState());
-    EXPECT_NE(constant, nullptr);
-    EXPECT_EQ(scope.GetExceptionState().CodeAs<DOMExceptionCode>(),
-              DOMExceptionCode::kNoError);
-    EXPECT_EQ(constant->Kind(), MLOperand::OperandKind::kConstant);
-    EXPECT_EQ(constant->Type(), V8MLOperandType::Enum::kFloat32);
-    EXPECT_EQ(constant->Dimensions(), Vector<uint32_t>({}));
-  }
-  {
-    // Test building a 2-D constant without errors.
     auto* constant =
-        BuildConstant(builder, {2, 3}, V8MLOperandType::Enum::kFloat32,
+        BuildConstant(builder, {}, V8MLOperandDataType::Enum::kFloat32,
                       scope.GetExceptionState());
     EXPECT_NE(constant, nullptr);
     EXPECT_EQ(scope.GetExceptionState().CodeAs<DOMExceptionCode>(),
               DOMExceptionCode::kNoError);
     EXPECT_EQ(constant->Kind(), MLOperand::OperandKind::kConstant);
-    EXPECT_EQ(constant->Type(), V8MLOperandType::Enum::kFloat32);
+    EXPECT_EQ(constant->DataType(), V8MLOperandDataType::Enum::kFloat32);
+    EXPECT_EQ(constant->Dimensions(), Vector<uint32_t>({}));
+  }
+  {
+    // Test building a 2-D constant without errors.
+    auto* constant =
+        BuildConstant(builder, {2, 3}, V8MLOperandDataType::Enum::kFloat32,
+                      scope.GetExceptionState());
+    EXPECT_NE(constant, nullptr);
+    EXPECT_EQ(scope.GetExceptionState().CodeAs<DOMExceptionCode>(),
+              DOMExceptionCode::kNoError);
+    EXPECT_EQ(constant->Kind(), MLOperand::OperandKind::kConstant);
+    EXPECT_EQ(constant->DataType(), V8MLOperandDataType::Enum::kFloat32);
     EXPECT_EQ(constant->Dimensions(), Vector<uint32_t>({2, 3}));
   }
   {
     // Test throwing exception if a dimension is 0.
     auto* constant =
-        BuildConstant(builder, {2, 0}, V8MLOperandType::Enum::kFloat32,
+        BuildConstant(builder, {2, 0}, V8MLOperandDataType::Enum::kFloat32,
                       scope.GetExceptionState());
     EXPECT_EQ(constant, nullptr);
     EXPECT_EQ(scope.GetExceptionState().CodeAs<DOMExceptionCode>(),
@@ -182,24 +184,24 @@
   }
   {
     // Test throwing exception if buffer view type doesn't match the operand
-    // type.
+    // data type.
     NotShared<DOMArrayBufferView> buffer_view =
-        CreateDOMArrayBufferView(6, V8MLOperandType::Enum::kFloat32);
+        CreateDOMArrayBufferView(6, V8MLOperandDataType::Enum::kFloat32);
     auto* constant =
-        BuildConstant(builder, {2, 3}, V8MLOperandType::Enum::kInt32,
+        BuildConstant(builder, {2, 3}, V8MLOperandDataType::Enum::kInt32,
                       scope.GetExceptionState(), buffer_view);
     EXPECT_EQ(constant, nullptr);
     EXPECT_EQ(scope.GetExceptionState().CodeAs<DOMExceptionCode>(),
               DOMExceptionCode::kDataError);
     EXPECT_EQ(scope.GetExceptionState().Message(),
-              "The buffer view type doesn't match the operand type.");
+              "The buffer view type doesn't match the operand data type.");
   }
   {
     // Test throwing exception if buffer view size is not expected.
     NotShared<DOMArrayBufferView> buffer_view =
-        CreateDOMArrayBufferView(8, V8MLOperandType::Enum::kInt32);
+        CreateDOMArrayBufferView(8, V8MLOperandDataType::Enum::kInt32);
     auto* constant =
-        BuildConstant(builder, {2, 2}, V8MLOperandType::Enum::kInt32,
+        BuildConstant(builder, {2, 2}, V8MLOperandDataType::Enum::kInt32,
                       scope.GetExceptionState(), buffer_view);
     EXPECT_EQ(constant, nullptr);
     EXPECT_EQ(scope.GetExceptionState().CodeAs<DOMExceptionCode>(),
@@ -212,10 +214,10 @@
     // Test throwing exception if the number of elements is too large.
     // Set the dimensions that let the number of elements be 2 * SIZE_MAX.
     NotShared<DOMArrayBufferView> buffer_view =
-        CreateDOMArrayBufferView(1, V8MLOperandType::Enum::kFloat32);
+        CreateDOMArrayBufferView(1, V8MLOperandDataType::Enum::kFloat32);
     auto* constant = BuildConstant(
         builder, {1, 2, kSquareRootOfSizeMax, kSquareRootOfSizeMax},
-        V8MLOperandType::Enum::kFloat32, scope.GetExceptionState(),
+        V8MLOperandDataType::Enum::kFloat32, scope.GetExceptionState(),
         buffer_view);
     EXPECT_EQ(constant, nullptr);
     EXPECT_EQ(scope.GetExceptionState().CodeAs<DOMExceptionCode>(),
@@ -226,12 +228,13 @@
   }
   {
     // Test throwing exception if the byte length is too large.
-    // Set the dimensions and type that let the byte length be 4 * SIZE_MAX.
+    // Set the dimensions and data type that let the byte length be 4 *
+    // SIZE_MAX.
     NotShared<DOMArrayBufferView> buffer_view =
-        CreateDOMArrayBufferView(1, V8MLOperandType::Enum::kFloat32);
+        CreateDOMArrayBufferView(1, V8MLOperandDataType::Enum::kFloat32);
     auto* constant = BuildConstant(
         builder, {1, 1, kSquareRootOfSizeMax, kSquareRootOfSizeMax},
-        V8MLOperandType::Enum::kFloat32, scope.GetExceptionState(),
+        V8MLOperandDataType::Enum::kFloat32, scope.GetExceptionState(),
         buffer_view);
     EXPECT_EQ(constant, nullptr);
     EXPECT_EQ(scope.GetExceptionState().CodeAs<DOMExceptionCode>(),
@@ -251,7 +254,7 @@
                                              scope.GetExceptionState());
   EXPECT_NE(output, nullptr);
   EXPECT_EQ(output->Kind(), MLOperand::OperandKind::kOutput);
-  EXPECT_EQ(output->Type(), input->Type());
+  EXPECT_EQ(output->DataType(), input->DataType());
   auto* batch_normalization = output->Operator();
   EXPECT_NE(batch_normalization, nullptr);
   EXPECT_EQ(batch_normalization->Kind(),
@@ -268,13 +271,14 @@
                            scope.GetExceptionState());
   {
     // Test batchNormalization with default options.
-    auto* input =
-        BuildInput(builder, "input", {1, 2, 5, 5},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* mean = BuildConstant(builder, {2}, V8MLOperandType::Enum::kFloat32,
-                               scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 2, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* mean =
+        BuildConstant(builder, {2}, V8MLOperandDataType::Enum::kFloat32,
+                      scope.GetExceptionState());
     auto* variance =
-        BuildConstant(builder, {2}, V8MLOperandType::Enum::kFloat32,
+        BuildConstant(builder, {2}, V8MLOperandDataType::Enum::kFloat32,
                       scope.GetExceptionState());
     auto* options = MLBatchNormalizationOptions::Create();
     EXPECT_FALSE(options->hasScale());
@@ -290,13 +294,14 @@
   }
   {
     // Test batchNormalization with axis = 2 and epsilon = 0.0001.
-    auto* input =
-        BuildInput(builder, "input", {1, 2, 5, 5},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* mean = BuildConstant(builder, {5}, V8MLOperandType::Enum::kFloat32,
-                               scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 2, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* mean =
+        BuildConstant(builder, {5}, V8MLOperandDataType::Enum::kFloat32,
+                      scope.GetExceptionState());
     auto* variance =
-        BuildConstant(builder, {5}, V8MLOperandType::Enum::kFloat32,
+        BuildConstant(builder, {5}, V8MLOperandDataType::Enum::kFloat32,
                       scope.GetExceptionState());
     auto* options = MLBatchNormalizationOptions::Create();
     options->setAxis(2);
@@ -306,15 +311,16 @@
     EXPECT_EQ(output->Dimensions(), Vector<uint32_t>({1, 2, 5, 5}));
   }
   {
-    // Test throwing exception when the input type is not one of floating point
-    // types.
-    auto* input =
-        BuildInput(builder, "input", {1, 2, 5, 5},
-                   V8MLOperandType::Enum::kInt32, scope.GetExceptionState());
-    auto* mean = BuildConstant(builder, {2}, V8MLOperandType::Enum::kInt32,
+    // Test throwing exception when the input data type is not one of floating
+    // point types.
+    auto* input = BuildInput(builder, "input", {1, 2, 5, 5},
+                             V8MLOperandDataType::Enum::kInt32,
+                             scope.GetExceptionState());
+    auto* mean = BuildConstant(builder, {2}, V8MLOperandDataType::Enum::kInt32,
                                scope.GetExceptionState());
-    auto* variance = BuildConstant(builder, {2}, V8MLOperandType::Enum::kInt32,
-                                   scope.GetExceptionState());
+    auto* variance =
+        BuildConstant(builder, {2}, V8MLOperandDataType::Enum::kInt32,
+                      scope.GetExceptionState());
     auto* options = MLBatchNormalizationOptions::Create();
     auto* output = builder->batchNormalization(input, mean, variance, options,
                                                scope.GetExceptionState());
@@ -325,15 +331,16 @@
               "The input type must be one of the floating point types.");
   }
   {
-    // Test throwing exception when the mean type is not the same as the input
-    // type.
-    auto* input =
-        BuildInput(builder, "input", {1, 2, 5, 5},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* mean = BuildConstant(builder, {2}, V8MLOperandType::Enum::kFloat16,
-                               scope.GetExceptionState());
+    // Test throwing exception when the mean data type is not the same as the
+    // input data type.
+    auto* input = BuildInput(builder, "input", {1, 2, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* mean =
+        BuildConstant(builder, {2}, V8MLOperandDataType::Enum::kFloat16,
+                      scope.GetExceptionState());
     auto* variance =
-        BuildConstant(builder, {2}, V8MLOperandType::Enum::kFloat32,
+        BuildConstant(builder, {2}, V8MLOperandDataType::Enum::kFloat32,
                       scope.GetExceptionState());
     auto* options = MLBatchNormalizationOptions::Create();
     auto* output = builder->batchNormalization(input, mean, variance, options,
@@ -347,13 +354,14 @@
   }
   {
     // Test throwing exception when the mean operand is not a 1-D tensor.
-    auto* input =
-        BuildInput(builder, "input", {1, 2, 5, 5},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* mean = BuildConstant(builder, {1, 2}, V8MLOperandType::Enum::kFloat32,
-                               scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 2, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* mean =
+        BuildConstant(builder, {1, 2}, V8MLOperandDataType::Enum::kFloat32,
+                      scope.GetExceptionState());
     auto* variance =
-        BuildConstant(builder, {2}, V8MLOperandType::Enum::kFloat32,
+        BuildConstant(builder, {2}, V8MLOperandDataType::Enum::kFloat32,
                       scope.GetExceptionState());
     auto* options = MLBatchNormalizationOptions::Create();
     auto* output = builder->batchNormalization(input, mean, variance, options,
@@ -367,13 +375,14 @@
   {
     // Test throwing exception when the size of mean operand is not equal to
     // the size of the input dimension denoted by axis.
-    auto* input =
-        BuildInput(builder, "input", {1, 2, 5, 5},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* mean = BuildConstant(builder, {3}, V8MLOperandType::Enum::kFloat32,
-                               scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 2, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* mean =
+        BuildConstant(builder, {3}, V8MLOperandDataType::Enum::kFloat32,
+                      scope.GetExceptionState());
     auto* variance =
-        BuildConstant(builder, {2}, V8MLOperandType::Enum::kFloat32,
+        BuildConstant(builder, {2}, V8MLOperandDataType::Enum::kFloat32,
                       scope.GetExceptionState());
     auto* options = MLBatchNormalizationOptions::Create();
     auto* output = builder->batchNormalization(input, mean, variance, options,
@@ -386,15 +395,17 @@
               "of the input dimension denoted by axis.");
   }
   {
-    // Test throwing exception when the variance type is not the same as the
-    // input type.
-    auto* input =
-        BuildInput(builder, "input", {1, 2, 5, 5},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* mean = BuildConstant(builder, {2}, V8MLOperandType::Enum::kFloat32,
-                               scope.GetExceptionState());
-    auto* variance = BuildConstant(builder, {2}, V8MLOperandType::Enum::kInt32,
-                                   scope.GetExceptionState());
+    // Test throwing exception when the variance data type is not the same as
+    // the input data type.
+    auto* input = BuildInput(builder, "input", {1, 2, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* mean =
+        BuildConstant(builder, {2}, V8MLOperandDataType::Enum::kFloat32,
+                      scope.GetExceptionState());
+    auto* variance =
+        BuildConstant(builder, {2}, V8MLOperandDataType::Enum::kInt32,
+                      scope.GetExceptionState());
     auto* options = MLBatchNormalizationOptions::Create();
     auto* output = builder->batchNormalization(input, mean, variance, options,
                                                scope.GetExceptionState());
@@ -407,13 +418,14 @@
   }
   {
     // Test throwing exception when the variance operand is not a 1-D tensor.
-    auto* input =
-        BuildInput(builder, "input", {1, 2, 5, 5},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* mean = BuildConstant(builder, {2}, V8MLOperandType::Enum::kFloat32,
-                               scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 2, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* mean =
+        BuildConstant(builder, {2}, V8MLOperandDataType::Enum::kFloat32,
+                      scope.GetExceptionState());
     auto* variance =
-        BuildConstant(builder, {2, 2}, V8MLOperandType::Enum::kFloat32,
+        BuildConstant(builder, {2, 2}, V8MLOperandDataType::Enum::kFloat32,
                       scope.GetExceptionState());
     auto* options = MLBatchNormalizationOptions::Create();
     auto* output = builder->batchNormalization(input, mean, variance, options,
@@ -427,13 +439,14 @@
   {
     // Test throwing exception when the size of variance operand is not
     // equal to the size of the input dimension denoted by axis.
-    auto* input =
-        BuildInput(builder, "input", {1, 2, 5, 5},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* mean = BuildConstant(builder, {5}, V8MLOperandType::Enum::kFloat32,
-                               scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 2, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* mean =
+        BuildConstant(builder, {5}, V8MLOperandDataType::Enum::kFloat32,
+                      scope.GetExceptionState());
     auto* variance =
-        BuildConstant(builder, {2}, V8MLOperandType::Enum::kFloat32,
+        BuildConstant(builder, {2}, V8MLOperandDataType::Enum::kFloat32,
                       scope.GetExceptionState());
     auto* options = MLBatchNormalizationOptions::Create();
     options->setAxis(2);
@@ -447,19 +460,21 @@
               "size of the input dimension denoted by axis.");
   }
   {
-    // Test throwing exception when the scale type is not the same as the input
-    // type.
-    auto* input =
-        BuildInput(builder, "input", {1, 2, 5, 5},
-                   V8MLOperandType::Enum::kFloat16, scope.GetExceptionState());
-    auto* mean = BuildConstant(builder, {2}, V8MLOperandType::Enum::kFloat16,
-                               scope.GetExceptionState());
+    // Test throwing exception when the scale data type is not the same as the
+    // input data type.
+    auto* input = BuildInput(builder, "input", {1, 2, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat16,
+                             scope.GetExceptionState());
+    auto* mean =
+        BuildConstant(builder, {2}, V8MLOperandDataType::Enum::kFloat16,
+                      scope.GetExceptionState());
     auto* variance =
-        BuildConstant(builder, {2}, V8MLOperandType::Enum::kFloat16,
+        BuildConstant(builder, {2}, V8MLOperandDataType::Enum::kFloat16,
                       scope.GetExceptionState());
     auto* options = MLBatchNormalizationOptions::Create();
-    auto* scale = BuildConstant(builder, {2}, V8MLOperandType::Enum::kFloat32,
-                                scope.GetExceptionState());
+    auto* scale =
+        BuildConstant(builder, {2}, V8MLOperandDataType::Enum::kFloat32,
+                      scope.GetExceptionState());
     options->setScale(scale);
     auto* output = builder->batchNormalization(input, mean, variance, options,
                                                scope.GetExceptionState());
@@ -472,17 +487,18 @@
   }
   {
     // Test throwing exception when the scale operand is not a 1-D tensor.
-    auto* input =
-        BuildInput(builder, "input", {1, 2, 5, 5},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* mean = BuildConstant(builder, {2}, V8MLOperandType::Enum::kFloat32,
-                               scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 2, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* mean =
+        BuildConstant(builder, {2}, V8MLOperandDataType::Enum::kFloat32,
+                      scope.GetExceptionState());
     auto* variance =
-        BuildConstant(builder, {2}, V8MLOperandType::Enum::kFloat32,
+        BuildConstant(builder, {2}, V8MLOperandDataType::Enum::kFloat32,
                       scope.GetExceptionState());
     auto* options = MLBatchNormalizationOptions::Create();
     auto* scale =
-        BuildConstant(builder, {2, 1}, V8MLOperandType::Enum::kFloat32,
+        BuildConstant(builder, {2, 1}, V8MLOperandDataType::Enum::kFloat32,
                       scope.GetExceptionState());
     options->setScale(scale);
     auto* output = builder->batchNormalization(input, mean, variance, options,
@@ -496,18 +512,20 @@
   {
     // Test throwing exception when the size of scale operand is not equal
     // to the size of the input dimension denoted by axis.
-    auto* input =
-        BuildInput(builder, "input", {1, 2, 5, 5},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* mean = BuildConstant(builder, {5}, V8MLOperandType::Enum::kFloat32,
-                               scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 2, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* mean =
+        BuildConstant(builder, {5}, V8MLOperandDataType::Enum::kFloat32,
+                      scope.GetExceptionState());
     auto* variance =
-        BuildConstant(builder, {5}, V8MLOperandType::Enum::kFloat32,
+        BuildConstant(builder, {5}, V8MLOperandDataType::Enum::kFloat32,
                       scope.GetExceptionState());
     auto* options = MLBatchNormalizationOptions::Create();
     options->setAxis(2);
-    auto* scale = BuildConstant(builder, {2}, V8MLOperandType::Enum::kFloat32,
-                                scope.GetExceptionState());
+    auto* scale =
+        BuildConstant(builder, {2}, V8MLOperandDataType::Enum::kFloat32,
+                      scope.GetExceptionState());
     options->setScale(scale);
     auto* output = builder->batchNormalization(input, mean, variance, options,
                                                scope.GetExceptionState());
@@ -519,19 +537,21 @@
               "size of the input dimension denoted by axis.");
   }
   {
-    // Test throwing exception when the bias type is not the same as the input
-    // type.
-    auto* input =
-        BuildInput(builder, "input", {1, 2, 5, 5},
-                   V8MLOperandType::Enum::kFloat16, scope.GetExceptionState());
-    auto* mean = BuildConstant(builder, {2}, V8MLOperandType::Enum::kFloat16,
-                               scope.GetExceptionState());
+    // Test throwing exception when the bias data type is not the same as the
+    // input data type.
+    auto* input = BuildInput(builder, "input", {1, 2, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat16,
+                             scope.GetExceptionState());
+    auto* mean =
+        BuildConstant(builder, {2}, V8MLOperandDataType::Enum::kFloat16,
+                      scope.GetExceptionState());
     auto* variance =
-        BuildConstant(builder, {2}, V8MLOperandType::Enum::kFloat16,
+        BuildConstant(builder, {2}, V8MLOperandDataType::Enum::kFloat16,
                       scope.GetExceptionState());
     auto* options = MLBatchNormalizationOptions::Create();
-    auto* bias = BuildConstant(builder, {2}, V8MLOperandType::Enum::kFloat32,
-                               scope.GetExceptionState());
+    auto* bias =
+        BuildConstant(builder, {2}, V8MLOperandDataType::Enum::kFloat32,
+                      scope.GetExceptionState());
     options->setBias(bias);
     auto* output = builder->batchNormalization(input, mean, variance, options,
                                                scope.GetExceptionState());
@@ -544,17 +564,19 @@
   }
   {
     // Test throwing exception when the bias operand is not a 1-D tensor.
-    auto* input =
-        BuildInput(builder, "input", {1, 2, 5, 5},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* mean = BuildConstant(builder, {2}, V8MLOperandType::Enum::kFloat32,
-                               scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 2, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* mean =
+        BuildConstant(builder, {2}, V8MLOperandDataType::Enum::kFloat32,
+                      scope.GetExceptionState());
     auto* variance =
-        BuildConstant(builder, {2}, V8MLOperandType::Enum::kFloat32,
+        BuildConstant(builder, {2}, V8MLOperandDataType::Enum::kFloat32,
                       scope.GetExceptionState());
     auto* options = MLBatchNormalizationOptions::Create();
-    auto* bias = BuildConstant(builder, {2, 1}, V8MLOperandType::Enum::kFloat32,
-                               scope.GetExceptionState());
+    auto* bias =
+        BuildConstant(builder, {2, 1}, V8MLOperandDataType::Enum::kFloat32,
+                      scope.GetExceptionState());
     options->setBias(bias);
     auto* output = builder->batchNormalization(input, mean, variance, options,
                                                scope.GetExceptionState());
@@ -567,18 +589,20 @@
   {
     // Test throwing exception when the size of bias operand is not equal to
     // the size of the input dimension denoted by axis.
-    auto* input =
-        BuildInput(builder, "input", {1, 2, 5, 5},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* mean = BuildConstant(builder, {5}, V8MLOperandType::Enum::kFloat32,
-                               scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 2, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* mean =
+        BuildConstant(builder, {5}, V8MLOperandDataType::Enum::kFloat32,
+                      scope.GetExceptionState());
     auto* variance =
-        BuildConstant(builder, {5}, V8MLOperandType::Enum::kFloat32,
+        BuildConstant(builder, {5}, V8MLOperandDataType::Enum::kFloat32,
                       scope.GetExceptionState());
     auto* options = MLBatchNormalizationOptions::Create();
     options->setAxis(2);
-    auto* bias = BuildConstant(builder, {2}, V8MLOperandType::Enum::kFloat32,
-                               scope.GetExceptionState());
+    auto* bias =
+        BuildConstant(builder, {2}, V8MLOperandDataType::Enum::kFloat32,
+                      scope.GetExceptionState());
     options->setBias(bias);
     auto* output = builder->batchNormalization(input, mean, variance, options,
                                                scope.GetExceptionState());
@@ -592,13 +616,14 @@
   {
     // Test throwing exception when the value of axis is not in the range of [0,
     // N-1].
-    auto* input =
-        BuildInput(builder, "input", {1, 2, 5, 5},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* mean = BuildConstant(builder, {5}, V8MLOperandType::Enum::kFloat32,
-                               scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 2, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* mean =
+        BuildConstant(builder, {5}, V8MLOperandDataType::Enum::kFloat32,
+                      scope.GetExceptionState());
     auto* variance =
-        BuildConstant(builder, {5}, V8MLOperandType::Enum::kFloat32,
+        BuildConstant(builder, {5}, V8MLOperandDataType::Enum::kFloat32,
                       scope.GetExceptionState());
     auto* options = MLBatchNormalizationOptions::Create();
     options->setAxis(4);
@@ -622,14 +647,14 @@
     // Test building Concat with one input.
     Vector<uint32_t> input_a_shape({4, 4, 3});
     Vector<uint32_t> output_shape({4, 4, 3});
-    auto* input_a =
-        BuildInput(builder, "input_a", input_a_shape,
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
+    auto* input_a = BuildInput(builder, "input_a", input_a_shape,
+                               V8MLOperandDataType::Enum::kFloat32,
+                               scope.GetExceptionState());
     uint32_t axis = 2;
     auto* output = builder->concat({input_a}, axis, scope.GetExceptionState());
     EXPECT_NE(output, nullptr);
     EXPECT_EQ(output->Kind(), MLOperand::OperandKind::kOutput);
-    EXPECT_EQ(output->Type(), V8MLOperandType::Enum::kFloat32);
+    EXPECT_EQ(output->DataType(), V8MLOperandDataType::Enum::kFloat32);
     EXPECT_EQ(output->Dimensions(), output_shape);
     const MLOperator* concat = output->Operator();
     EXPECT_NE(concat, nullptr);
@@ -642,18 +667,18 @@
     Vector<uint32_t> input_a_shape({3, 1, 5});
     Vector<uint32_t> input_b_shape({3, 2, 5});
     Vector<uint32_t> output_shape({3, 3, 5});
-    auto* input_a =
-        BuildInput(builder, "input_a", input_a_shape,
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* input_b =
-        BuildInput(builder, "input_b", input_b_shape,
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
+    auto* input_a = BuildInput(builder, "input_a", input_a_shape,
+                               V8MLOperandDataType::Enum::kFloat32,
+                               scope.GetExceptionState());
+    auto* input_b = BuildInput(builder, "input_b", input_b_shape,
+                               V8MLOperandDataType::Enum::kFloat32,
+                               scope.GetExceptionState());
     uint32_t axis = 1;
     auto* output =
         builder->concat({input_a, input_b}, axis, scope.GetExceptionState());
     EXPECT_NE(output, nullptr);
     EXPECT_EQ(output->Kind(), MLOperand::OperandKind::kOutput);
-    EXPECT_EQ(output->Type(), V8MLOperandType::Enum::kFloat32);
+    EXPECT_EQ(output->DataType(), V8MLOperandDataType::Enum::kFloat32);
     EXPECT_EQ(output->Dimensions(), output_shape);
     const MLOperator* concat = output->Operator();
     EXPECT_NE(concat, nullptr);
@@ -667,21 +692,21 @@
     Vector<uint32_t> input_b_shape({3, 5, 2});
     Vector<uint32_t> input_c_shape({3, 5, 3});
     Vector<uint32_t> output_shape({3, 5, 6});
-    auto* input_a =
-        BuildInput(builder, "input_a", input_a_shape,
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* input_b =
-        BuildInput(builder, "input_b", input_b_shape,
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* input_c =
-        BuildInput(builder, "input_c", input_c_shape,
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
+    auto* input_a = BuildInput(builder, "input_a", input_a_shape,
+                               V8MLOperandDataType::Enum::kFloat32,
+                               scope.GetExceptionState());
+    auto* input_b = BuildInput(builder, "input_b", input_b_shape,
+                               V8MLOperandDataType::Enum::kFloat32,
+                               scope.GetExceptionState());
+    auto* input_c = BuildInput(builder, "input_c", input_c_shape,
+                               V8MLOperandDataType::Enum::kFloat32,
+                               scope.GetExceptionState());
     uint32_t axis = 2;
     auto* output = builder->concat({input_a, input_b, input_c}, axis,
                                    scope.GetExceptionState());
     EXPECT_NE(output, nullptr);
     EXPECT_EQ(output->Kind(), MLOperand::OperandKind::kOutput);
-    EXPECT_EQ(output->Type(), V8MLOperandType::Enum::kFloat32);
+    EXPECT_EQ(output->DataType(), V8MLOperandDataType::Enum::kFloat32);
     EXPECT_EQ(output->Dimensions(), output_shape);
     const MLOperator* concat = output->Operator();
     EXPECT_NE(concat, nullptr);
@@ -694,18 +719,18 @@
     Vector<uint32_t> input_a_shape({1});
     Vector<uint32_t> input_b_shape({1});
     Vector<uint32_t> output_shape({2});
-    auto* input_a =
-        BuildInput(builder, "input_a", input_a_shape,
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* input_b =
-        BuildInput(builder, "input_b", input_b_shape,
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
+    auto* input_a = BuildInput(builder, "input_a", input_a_shape,
+                               V8MLOperandDataType::Enum::kFloat32,
+                               scope.GetExceptionState());
+    auto* input_b = BuildInput(builder, "input_b", input_b_shape,
+                               V8MLOperandDataType::Enum::kFloat32,
+                               scope.GetExceptionState());
     uint32_t axis = 0;
     auto* output =
         builder->concat({input_a, input_b}, axis, scope.GetExceptionState());
     EXPECT_NE(output, nullptr);
     EXPECT_EQ(output->Kind(), MLOperand::OperandKind::kOutput);
-    EXPECT_EQ(output->Type(), V8MLOperandType::Enum::kFloat32);
+    EXPECT_EQ(output->DataType(), V8MLOperandDataType::Enum::kFloat32);
     EXPECT_EQ(output->Dimensions(), output_shape);
     const MLOperator* concat = output->Operator();
     EXPECT_NE(concat, nullptr);
@@ -727,12 +752,12 @@
     // Test throwing exception when the argument types are inconsistent.
     Vector<uint32_t> input_a_shape({1, 1});
     Vector<uint32_t> input_b_shape({1, 1});
-    auto* input_a =
-        BuildInput(builder, "input_a", input_a_shape,
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* input_b =
-        BuildInput(builder, "input_b", input_b_shape,
-                   V8MLOperandType::Enum::kInt32, scope.GetExceptionState());
+    auto* input_a = BuildInput(builder, "input_a", input_a_shape,
+                               V8MLOperandDataType::Enum::kFloat32,
+                               scope.GetExceptionState());
+    auto* input_b = BuildInput(builder, "input_b", input_b_shape,
+                               V8MLOperandDataType::Enum::kInt32,
+                               scope.GetExceptionState());
     uint32_t axis = 0;
     auto* output =
         builder->concat({input_a, input_b}, axis, scope.GetExceptionState());
@@ -740,18 +765,18 @@
     EXPECT_EQ(scope.GetExceptionState().CodeAs<DOMExceptionCode>(),
               DOMExceptionCode::kDataError);
     EXPECT_EQ(scope.GetExceptionState().Message(),
-              "The input types don't match.");
+              "The input data types don't match.");
   }
   {
     // Test throwing exception when the inputs have different dimension.
     Vector<uint32_t> input_a_shape({1, 1});
     Vector<uint32_t> input_b_shape({1, 1, 1});
-    auto* input_a =
-        BuildInput(builder, "input_a", input_a_shape,
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* input_b =
-        BuildInput(builder, "input_b", input_b_shape,
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
+    auto* input_a = BuildInput(builder, "input_a", input_a_shape,
+                               V8MLOperandDataType::Enum::kFloat32,
+                               scope.GetExceptionState());
+    auto* input_b = BuildInput(builder, "input_b", input_b_shape,
+                               V8MLOperandDataType::Enum::kFloat32,
+                               scope.GetExceptionState());
     uint32_t axis = 0;
     auto* output =
         builder->concat({input_a, input_b}, axis, scope.GetExceptionState());
@@ -766,12 +791,12 @@
     // size of dimension.
     Vector<uint32_t> input_a_shape({1, 1});
     Vector<uint32_t> input_b_shape({1, 1});
-    auto* input_a =
-        BuildInput(builder, "input_a", input_a_shape,
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* input_b =
-        BuildInput(builder, "input_b", input_b_shape,
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
+    auto* input_a = BuildInput(builder, "input_a", input_a_shape,
+                               V8MLOperandDataType::Enum::kFloat32,
+                               scope.GetExceptionState());
+    auto* input_b = BuildInput(builder, "input_b", input_b_shape,
+                               V8MLOperandDataType::Enum::kFloat32,
+                               scope.GetExceptionState());
     uint32_t axis = 2;
     auto* output =
         builder->concat({input_a, input_b}, axis, scope.GetExceptionState());
@@ -787,12 +812,12 @@
     Vector<uint32_t> input_a_shape({});
     Vector<uint32_t> input_b_shape({});
     Vector<uint32_t> output_shape({2});
-    auto* input_a =
-        BuildInput(builder, "input_a", input_a_shape,
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* input_b =
-        BuildInput(builder, "input_b", input_b_shape,
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
+    auto* input_a = BuildInput(builder, "input_a", input_a_shape,
+                               V8MLOperandDataType::Enum::kFloat32,
+                               scope.GetExceptionState());
+    auto* input_b = BuildInput(builder, "input_b", input_b_shape,
+                               V8MLOperandDataType::Enum::kFloat32,
+                               scope.GetExceptionState());
     uint32_t axis = 0;
     auto* output =
         builder->concat({input_a, input_b}, axis, scope.GetExceptionState());
@@ -808,12 +833,12 @@
     // sizes except on the axis.
     Vector<uint32_t> input_a_shape({1, 1, 1});
     Vector<uint32_t> input_b_shape({1, 2, 3});
-    auto* input_a =
-        BuildInput(builder, "input_a", input_a_shape,
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* input_b =
-        BuildInput(builder, "input_b", input_b_shape,
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
+    auto* input_a = BuildInput(builder, "input_a", input_a_shape,
+                               V8MLOperandDataType::Enum::kFloat32,
+                               scope.GetExceptionState());
+    auto* input_b = BuildInput(builder, "input_b", input_b_shape,
+                               V8MLOperandDataType::Enum::kFloat32,
+                               scope.GetExceptionState());
     uint32_t axis = 1;
     auto* output =
         builder->concat({input_a, input_b}, axis, scope.GetExceptionState());
@@ -835,7 +860,7 @@
       builder->conv2d(input, filter, options, scope.GetExceptionState());
   EXPECT_NE(output, nullptr);
   EXPECT_EQ(output->Kind(), MLOperand::OperandKind::kOutput);
-  EXPECT_EQ(output->Type(), input->Type());
+  EXPECT_EQ(output->DataType(), input->DataType());
   auto* conv2d = output->Operator();
   EXPECT_NE(conv2d, nullptr);
   EXPECT_EQ(conv2d->Kind(), MLOperator::OperatorKind::kConv2d);
@@ -851,12 +876,12 @@
                            scope.GetExceptionState());
   {
     // Test conv2d with default options.
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 5, 5},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {1, 1, 3, 3}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {1, 1, 3, 3},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConv2dOptions::Create();
     EXPECT_TRUE(options->hasAutoPad());
     EXPECT_EQ(options->autoPad(), V8MLAutoPad::Enum::kExplicit);
@@ -877,12 +902,12 @@
   }
   {
     // Test conv2d with padding=1.
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 5, 5},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {1, 1, 3, 3}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {1, 1, 3, 3},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConv2dOptions::Create();
     options->setPadding({1, 1, 1, 1});
     auto* output = BuildConv2d(scope, builder, input, filter, options);
@@ -890,12 +915,12 @@
   }
   {
     // Test conv2d with autopad="same-lower".
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 5, 5},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {1, 1, 3, 3}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {1, 1, 3, 3},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConv2dOptions::Create();
     options->setAutoPad(V8MLAutoPad::Enum::kSameLower);
     auto* output = BuildConv2d(scope, builder, input, filter, options);
@@ -903,12 +928,12 @@
   }
   {
     // Test conv2d with autopad="same-upper".
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 5, 5},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {1, 1, 3, 3}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {1, 1, 3, 3},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConv2dOptions::Create();
     options->setAutoPad(V8MLAutoPad::Enum::kSameUpper);
     auto* output = BuildConv2d(scope, builder, input, filter, options);
@@ -916,12 +941,12 @@
   }
   {
     // Test conv2d with strides=2 and padding=1.
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 5, 5},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {1, 1, 3, 3}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {1, 1, 3, 3},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConv2dOptions::Create();
     options->setPadding({1, 1, 1, 1});
     options->setStrides({2, 2});
@@ -930,12 +955,12 @@
   }
   {
     // Test conv2d with strides=2 and asymmetric padding.
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 5, 5},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {1, 1, 4, 2}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {1, 1, 4, 2},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConv2dOptions::Create();
     options->setPadding({1, 2, 0, 1});
     options->setStrides({2, 2});
@@ -944,12 +969,12 @@
   }
   {
     // Test depthwise conv2d by setting groups to input channels.
-    auto* input =
-        BuildInput(builder, "input", {1, 4, 2, 2},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {4, 1, 2, 2}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 4, 2, 2},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {4, 1, 2, 2},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConv2dOptions::Create();
     options->setGroups(4);
     auto* output = BuildConv2d(scope, builder, input, filter, options);
@@ -958,12 +983,12 @@
   {
     // Test depthwise conv2d with groups=4, inputLayout="nhwc" and
     // filterLayout="ihwo".
-    auto* input =
-        BuildInput(builder, "input", {1, 2, 2, 4},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {1, 2, 2, 4}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 2, 2, 4},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {1, 2, 2, 4},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConv2dOptions::Create();
     options->setGroups(4);
     options->setInputLayout(V8MLInputOperandLayout::Enum::kNhwc);
@@ -974,12 +999,12 @@
   {
     // Test conv2d with dilations=4, inputLayout="nhwc" and
     // filterLayout="ihwo".
-    auto* input =
-        BuildInput(builder, "input", {1, 65, 65, 1},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {1, 3, 3, 1}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 65, 65, 1},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {1, 3, 3, 1},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConv2dOptions::Create();
     options->setInputLayout(V8MLInputOperandLayout::Enum::kNhwc);
     options->setFilterLayout(V8MLConv2dFilterOperandLayout::Enum::kIhwo);
@@ -989,12 +1014,12 @@
   }
   {
     // Test conv2d with inputLayout="nchw" and filterLayout="oihw".
-    auto* input =
-        BuildInput(builder, "input", {1, 2, 5, 5},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {1, 2, 3, 3}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 2, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {1, 2, 3, 3},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConv2dOptions::Create();
     options->setInputLayout(V8MLInputOperandLayout::Enum::kNchw);
     options->setFilterLayout(V8MLConv2dFilterOperandLayout::Enum::kOihw);
@@ -1003,12 +1028,12 @@
   }
   {
     // Test conv2d with inputLayout="nchw" and filterLayout="hwio".
-    auto* input =
-        BuildInput(builder, "input", {1, 2, 5, 5},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {3, 3, 2, 1}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 2, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {3, 3, 2, 1},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConv2dOptions::Create();
     options->setInputLayout(V8MLInputOperandLayout::Enum::kNchw);
     options->setFilterLayout(V8MLConv2dFilterOperandLayout::Enum::kHwio);
@@ -1017,12 +1042,12 @@
   }
   {
     // Test conv2d with inputLayout="nchw" and filterLayout="ohwi".
-    auto* input =
-        BuildInput(builder, "input", {1, 2, 5, 5},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {1, 3, 3, 2}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 2, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {1, 3, 3, 2},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConv2dOptions::Create();
     options->setInputLayout(V8MLInputOperandLayout::Enum::kNchw);
     options->setFilterLayout(V8MLConv2dFilterOperandLayout::Enum::kOhwi);
@@ -1031,12 +1056,12 @@
   }
   {
     // Test conv2d with inputLayout="nchw" and filterLayout="ihwo".
-    auto* input =
-        BuildInput(builder, "input", {1, 2, 5, 5},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {2, 3, 3, 1}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 2, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {2, 3, 3, 1},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConv2dOptions::Create();
     options->setInputLayout(V8MLInputOperandLayout::Enum::kNchw);
     options->setFilterLayout(V8MLConv2dFilterOperandLayout::Enum::kIhwo);
@@ -1045,12 +1070,12 @@
   }
   {
     // Test conv2d with inputLayout="nhwc" and filterLayout="oihw".
-    auto* input =
-        BuildInput(builder, "input", {1, 5, 5, 2},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {1, 2, 3, 3}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 5, 5, 2},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {1, 2, 3, 3},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConv2dOptions::Create();
     options->setInputLayout(V8MLInputOperandLayout::Enum::kNhwc);
     options->setFilterLayout(V8MLConv2dFilterOperandLayout::Enum::kOihw);
@@ -1059,12 +1084,12 @@
   }
   {
     // Test conv2d with inputLayout="nhwc" and filterLayout="hwio".
-    auto* input =
-        BuildInput(builder, "input", {1, 5, 5, 2},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {3, 3, 2, 1}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 5, 5, 2},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {3, 3, 2, 1},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConv2dOptions::Create();
     options->setInputLayout(V8MLInputOperandLayout::Enum::kNhwc);
     options->setFilterLayout(V8MLConv2dFilterOperandLayout::Enum::kHwio);
@@ -1073,12 +1098,12 @@
   }
   {
     // Test conv2d with inputLayout="nhwc" and filterLayout="ohwi".
-    auto* input =
-        BuildInput(builder, "input", {1, 5, 5, 2},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {1, 3, 3, 2}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 5, 5, 2},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {1, 3, 3, 2},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConv2dOptions::Create();
     options->setInputLayout(V8MLInputOperandLayout::Enum::kNhwc);
     options->setFilterLayout(V8MLConv2dFilterOperandLayout::Enum::kOhwi);
@@ -1087,12 +1112,12 @@
   }
   {
     // Test conv2d with inputLayout="nhwc" and filterLayout="ihwo".
-    auto* input =
-        BuildInput(builder, "input", {1, 5, 5, 2},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {2, 3, 3, 1}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 5, 5, 2},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {2, 3, 3, 1},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConv2dOptions::Create();
     options->setInputLayout(V8MLInputOperandLayout::Enum::kNhwc);
     options->setFilterLayout(V8MLConv2dFilterOperandLayout::Enum::kIhwo);
@@ -1104,13 +1129,13 @@
     // large.
     // Set the input and filter dimensions that let the output's number of
     // lements be 2 * SIZE_MAX.
-    auto* input =
-        BuildInput(builder, "input",
-                   {1, 1, kSquareRootOfSizeMax / 2, kSquareRootOfSizeMax / 2},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {8, 1, 1, 1}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(
+        builder, "input",
+        {1, 1, kSquareRootOfSizeMax / 2, kSquareRootOfSizeMax / 2},
+        V8MLOperandDataType::Enum::kFloat32, scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {8, 1, 1, 1},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* output = builder->conv2d(input, filter, MLConv2dOptions::Create(),
                                    scope.GetExceptionState());
     EXPECT_EQ(output, nullptr);
@@ -1122,15 +1147,15 @@
   }
   {
     // Test throwing exception if the output operand's byte length is too large.
-    // Set the dimensions and type of input and filter that let the output's
-    // byte length be 4 * SIZE_MAX.
-    auto* input =
-        BuildInput(builder, "input",
-                   {1, 1, kSquareRootOfSizeMax / 2, kSquareRootOfSizeMax / 2},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {4, 1, 1, 1}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    // Set the dimensions and data type of input and filter that let the
+    // output's byte length be 4 * SIZE_MAX.
+    auto* input = BuildInput(
+        builder, "input",
+        {1, 1, kSquareRootOfSizeMax / 2, kSquareRootOfSizeMax / 2},
+        V8MLOperandDataType::Enum::kFloat32, scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {4, 1, 1, 1},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* output = builder->conv2d(input, filter, MLConv2dOptions::Create(),
                                    scope.GetExceptionState());
     EXPECT_EQ(output, nullptr);
@@ -1141,12 +1166,12 @@
   }
   {
     // Test throwing exception when the input is not a 4-D tensor.
-    auto* input =
-        BuildInput(builder, "input", {1, 5, 5}, V8MLOperandType::Enum::kFloat32,
-                   scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {1, 2, 2, 1}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {1, 2, 2, 1},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConv2dOptions::Create();
     auto* output =
         builder->conv2d(input, filter, options, scope.GetExceptionState());
@@ -1158,11 +1183,11 @@
   }
   {
     // Test throwing exception when the filter is not a 4-D tensor.
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 5, 5},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     auto* filter =
-        BuildConstant(builder, {2, 2}, V8MLOperandType::Enum::kFloat32,
+        BuildConstant(builder, {2, 2}, V8MLOperandDataType::Enum::kFloat32,
                       scope.GetExceptionState());
     auto* options = MLConv2dOptions::Create();
     auto* output =
@@ -1174,13 +1199,13 @@
               "The filter should be a 4-D tensor.");
   }
   {
-    // Test throwing exception when the filter type doesn't match the input
-    // type.
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 5, 5},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
+    // Test throwing exception when the filter data type doesn't match the input
+    // data type.
+    auto* input = BuildInput(builder, "input", {1, 1, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     auto* filter =
-        BuildConstant(builder, {1, 1, 2, 2}, V8MLOperandType::Enum::kInt32,
+        BuildConstant(builder, {1, 1, 2, 2}, V8MLOperandDataType::Enum::kInt32,
                       scope.GetExceptionState());
     auto* options = MLConv2dOptions::Create();
     auto* output =
@@ -1189,16 +1214,16 @@
     EXPECT_EQ(scope.GetExceptionState().CodeAs<DOMExceptionCode>(),
               DOMExceptionCode::kDataError);
     EXPECT_EQ(scope.GetExceptionState().Message(),
-              "The filter type doesn't match the input type.");
+              "The filter data type doesn't match the input data type.");
   }
   {
     // Test throwing exception when the length of padding is not 4.
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 5, 5},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {1, 1, 2, 2}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {1, 1, 2, 2},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConv2dOptions::Create();
     options->setPadding({2, 2});
     auto* output =
@@ -1211,12 +1236,12 @@
   }
   {
     // Test throwing exception when the length of strides is not 2.
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 5, 5},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {1, 1, 2, 2}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {1, 1, 2, 2},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConv2dOptions::Create();
     options->setStrides({2});
     auto* output =
@@ -1229,12 +1254,12 @@
   }
   {
     // Test throwing exception when one stride value is smaller than 1.
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 5, 5},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {1, 1, 2, 2}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {1, 1, 2, 2},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConv2dOptions::Create();
     options->setStrides({1, 0});
     auto* output =
@@ -1247,12 +1272,12 @@
   }
   {
     // Test throwing exception when the length of dilations is not 2.
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 5, 5},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {1, 1, 2, 2}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {1, 1, 2, 2},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConv2dOptions::Create();
     options->setDilations({1});
     auto* output =
@@ -1265,12 +1290,12 @@
   }
   {
     // Test throwing exception when the one dilation value is smaller than 1.
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 5, 5},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {1, 1, 2, 2}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {1, 1, 2, 2},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConv2dOptions::Create();
     options->setDilations({1, 0});
     auto* output =
@@ -1283,12 +1308,12 @@
   }
   {
     // Test throwing exception when input_channels % groups() != 0.
-    auto* input =
-        BuildInput(builder, "input", {1, 4, 5, 5},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {1, 1, 2, 2}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 4, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {1, 1, 2, 2},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConv2dOptions::Create();
     options->setGroups(3);
     auto* output =
@@ -1303,12 +1328,12 @@
   {
     // Test throwing exception when filter_input_channels != input_channels /
     // groups().
-    auto* input =
-        BuildInput(builder, "input", {1, 4, 5, 5},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {1, 1, 2, 2}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 4, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {1, 1, 2, 2},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConv2dOptions::Create();
     options->setGroups(2);
     auto* output =
@@ -1322,12 +1347,12 @@
   }
   {
     // Test throwing exception when the groups is smaller than 1.
-    auto* input =
-        BuildInput(builder, "input", {1, 4, 5, 5},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {1, 1, 2, 2}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 4, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {1, 1, 2, 2},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConv2dOptions::Create();
     options->setGroups(0);
     auto* output =
@@ -1341,11 +1366,11 @@
   {
     // Test throwing exception due to overflow when calculating the padding
     // along the height dimension.
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 5, 5},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     auto* filter = BuildConstant(builder, {1, 1, 23567, 2},
-                                 V8MLOperandType::Enum::kFloat32,
+                                 V8MLOperandDataType::Enum::kFloat32,
                                  scope.GetExceptionState());
     auto* options = MLConv2dOptions::Create();
     options->setStrides({193232, 3});
@@ -1363,11 +1388,11 @@
   {
     // Test throwing exception due to overflow when calculating the padding
     // along the width dimension.
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 5, 5},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     auto* filter = BuildConstant(builder, {1, 1, 2, 28476},
-                                 V8MLOperandType::Enum::kFloat32,
+                                 V8MLOperandDataType::Enum::kFloat32,
                                  scope.GetExceptionState());
     auto* options = MLConv2dOptions::Create();
     options->setStrides({1, 284234});
@@ -1385,11 +1410,11 @@
   {
     // Test throwing exception due to overflow when calculating the effective
     // filter height.
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 5, 5},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     auto* filter = BuildConstant(builder, {1, 1, 434983, 2},
-                                 V8MLOperandType::Enum::kFloat32,
+                                 V8MLOperandDataType::Enum::kFloat32,
                                  scope.GetExceptionState());
     auto* options = MLConv2dOptions::Create();
     options->setDilations({328442, 1});
@@ -1406,11 +1431,11 @@
   {
     // Test throwing exception due to overflow when calculating the effective
     // filter width.
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 5, 5},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     auto* filter = BuildConstant(builder, {1, 1, 2, 234545},
-                                 V8MLOperandType::Enum::kFloat32,
+                                 V8MLOperandDataType::Enum::kFloat32,
                                  scope.GetExceptionState());
     auto* options = MLConv2dOptions::Create();
     options->setDilations({2, 843452});
@@ -1427,12 +1452,12 @@
   {
     // Test throwing exception due to underflow when calculating the output
     // height.
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 5, 5},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {1, 1, 4, 2}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {1, 1, 4, 2},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConv2dOptions::Create();
     options->setDilations({4, 1});
     options->setPadding({1, 1, 1, 1});
@@ -1449,12 +1474,12 @@
   {
     // Test throwing exception due to underflow when calculating the output
     // width.
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 5, 5},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {1, 1, 2, 8}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {1, 1, 2, 8},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConv2dOptions::Create();
     options->setDilations({1, 4});
     options->setPadding({1, 1, 1, 1});
@@ -1470,15 +1495,16 @@
   }
   {
     // Test throwing exception when the bias is not a 1-D tensor.
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 5, 5},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {1, 1, 2, 2}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {1, 1, 2, 2},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConv2dOptions::Create();
-    auto* bias = BuildConstant(builder, {1, 2}, V8MLOperandType::Enum::kFloat32,
-                               scope.GetExceptionState());
+    auto* bias =
+        BuildConstant(builder, {1, 2}, V8MLOperandDataType::Enum::kFloat32,
+                      scope.GetExceptionState());
     options->setBias(bias);
     auto* output =
         builder->conv2d(input, filter, options, scope.GetExceptionState());
@@ -1491,15 +1517,16 @@
   {
     // Test throwing exception when the bias shape is not equal to
     // [output_channels].
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 5, 5},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {1, 1, 2, 2}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {1, 1, 2, 2},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConv2dOptions::Create();
-    auto* bias = BuildConstant(builder, {2}, V8MLOperandType::Enum::kFloat32,
-                               scope.GetExceptionState());
+    auto* bias =
+        BuildConstant(builder, {2}, V8MLOperandDataType::Enum::kFloat32,
+                      scope.GetExceptionState());
     options->setBias(bias);
     auto* output =
         builder->conv2d(input, filter, options, scope.GetExceptionState());
@@ -1510,15 +1537,16 @@
               "The bias shape should be [1].");
   }
   {
-    // Test throwing exception when the bias type doesn't match input type.
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 5, 5},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {1, 1, 2, 2}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    // Test throwing exception when the bias data type doesn't match input data
+    // type.
+    auto* input = BuildInput(builder, "input", {1, 1, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {1, 1, 2, 2},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConv2dOptions::Create();
-    auto* bias = BuildConstant(builder, {1}, V8MLOperandType::Enum::kInt32,
+    auto* bias = BuildConstant(builder, {1}, V8MLOperandDataType::Enum::kInt32,
                                scope.GetExceptionState());
     options->setBias(bias);
     auto* output =
@@ -1527,7 +1555,7 @@
     EXPECT_EQ(scope.GetExceptionState().CodeAs<DOMExceptionCode>(),
               DOMExceptionCode::kDataError);
     EXPECT_EQ(scope.GetExceptionState().Message(),
-              "The bias type doesn't match input type.");
+              "The bias data type doesn't match input data type.");
   }
 }
 
@@ -1540,7 +1568,7 @@
                                           scope.GetExceptionState());
   EXPECT_NE(output, nullptr);
   EXPECT_EQ(output->Kind(), MLOperand::OperandKind::kOutput);
-  EXPECT_EQ(output->Type(), input->Type());
+  EXPECT_EQ(output->DataType(), input->DataType());
   auto* convTranspose2d = output->Operator();
   EXPECT_NE(convTranspose2d, nullptr);
   EXPECT_EQ(convTranspose2d->Kind(),
@@ -1557,12 +1585,12 @@
                            scope.GetExceptionState());
   {
     // Test convTranspose2d with default options.
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 3, 3},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {1, 1, 3, 3}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 3, 3},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {1, 1, 3, 3},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConvTranspose2dOptions::Create();
     EXPECT_TRUE(options->hasAutoPad());
     EXPECT_EQ(options->autoPad(), V8MLAutoPad::Enum::kExplicit);
@@ -1583,12 +1611,12 @@
   }
   {
     // Test convTranspose2d with inputLayout="nchw" and filterLayout="hwoi".
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 3, 3},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {3, 3, 2, 1}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 3, 3},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {3, 3, 2, 1},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConvTranspose2dOptions::Create();
     options->setInputLayout(V8MLInputOperandLayout::Enum::kNchw);
     options->setFilterLayout(
@@ -1598,12 +1626,12 @@
   }
   {
     // Test convTranspose2d with inputLayout="nchw" and filterLayout="ohwi".
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 3, 3},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {2, 3, 3, 1}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 3, 3},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {2, 3, 3, 1},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConvTranspose2dOptions::Create();
     options->setInputLayout(V8MLInputOperandLayout::Enum::kNchw);
     options->setFilterLayout(
@@ -1613,12 +1641,12 @@
   }
   {
     // Test convTranspose2d with inputLayout="nhwc" and filterLayout="iohw".
-    auto* input =
-        BuildInput(builder, "input", {1, 3, 3, 1},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {1, 2, 3, 3}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 3, 3, 1},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {1, 2, 3, 3},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConvTranspose2dOptions::Create();
     options->setInputLayout(V8MLInputOperandLayout::Enum::kNhwc);
     options->setFilterLayout(
@@ -1628,12 +1656,12 @@
   }
   {
     // Test convTranspose2d with inputLayout="nhwc" and filterLayout="hwoi".
-    auto* input =
-        BuildInput(builder, "input", {1, 3, 3, 1},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {3, 3, 2, 1}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 3, 3, 1},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {3, 3, 2, 1},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConvTranspose2dOptions::Create();
     options->setInputLayout(V8MLInputOperandLayout::Enum::kNhwc);
     options->setFilterLayout(
@@ -1643,12 +1671,12 @@
   }
   {
     // Test convTranspose2d with inputLayout="nhwc" and filterLayout="ohwi".
-    auto* input =
-        BuildInput(builder, "input", {1, 3, 3, 1},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {2, 3, 3, 1}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 3, 3, 1},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {2, 3, 3, 1},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConvTranspose2dOptions::Create();
     options->setInputLayout(V8MLInputOperandLayout::Enum::kNhwc);
     options->setFilterLayout(
@@ -1658,12 +1686,12 @@
   }
   {
     // Test convTranspose2d with strides=[3, 2], outputSizes=[10, 8].
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 3, 3},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {1, 2, 3, 3}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 3, 3},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {1, 2, 3, 3},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConvTranspose2dOptions::Create();
     options->setStrides({3, 2});
     options->setOutputSizes({10, 8});
@@ -1672,12 +1700,12 @@
   }
   {
     // Test convTranspose2d with strides=[3, 2], outputPadding=[1, 1].
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 3, 3},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {1, 2, 3, 3}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 3, 3},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {1, 2, 3, 3},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConvTranspose2dOptions::Create();
     options->setStrides({3, 2});
     options->setOutputPadding({1, 1});
@@ -1686,12 +1714,12 @@
   }
   {
     // Test convTranspose2d with padding=1.
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 5, 5},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {1, 1, 3, 3}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {1, 1, 3, 3},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConvTranspose2dOptions::Create();
     options->setPadding({1, 1, 1, 1});
     auto* output = BuildConvTranspose2d(scope, builder, input, filter, options);
@@ -1699,12 +1727,12 @@
   }
   {
     // Test convTranspose2d with padding=1, groups=3.
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 5, 5},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {1, 1, 3, 3}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {1, 1, 3, 3},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConvTranspose2dOptions::Create();
     options->setPadding({1, 1, 1, 1});
     options->setGroups(3);
@@ -1713,12 +1741,12 @@
   }
   {
     // Test convTranspose2d with autopad="explicit", strides=2.
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 3, 3},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {1, 2, 3, 3}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 3, 3},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {1, 2, 3, 3},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConvTranspose2dOptions::Create();
     options->setAutoPad(V8MLAutoPad::Enum::kExplicit);
     options->setStrides({2, 2});
@@ -1727,12 +1755,12 @@
   }
   {
     // Test convTranspose2d with autopad="same-upper".
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 5, 5},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {1, 1, 3, 3}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {1, 1, 3, 3},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConvTranspose2dOptions::Create();
     options->setAutoPad(V8MLAutoPad::Enum::kSameUpper);
     auto* output = BuildConvTranspose2d(scope, builder, input, filter, options);
@@ -1740,12 +1768,12 @@
   }
   {
     // Test convTranspose2d with autopad="same-upper", strides=2.
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 3, 3},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {1, 2, 3, 3}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 3, 3},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {1, 2, 3, 3},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConvTranspose2dOptions::Create();
     options->setAutoPad(V8MLAutoPad::Enum::kSameUpper);
     options->setStrides({2, 2});
@@ -1754,12 +1782,12 @@
   }
   {
     // Test convTranspose2d with autopad="same-lower".
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 5, 5},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {1, 1, 3, 3}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {1, 1, 3, 3},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConvTranspose2dOptions::Create();
     options->setAutoPad(V8MLAutoPad::Enum::kSameLower);
     auto* output = BuildConvTranspose2d(scope, builder, input, filter, options);
@@ -1768,12 +1796,12 @@
   {
     // Test convTranspose2d with autopad="same-lower", strides=2, padding=[0, 1,
     // 0, 1].
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 3, 3},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {1, 2, 3, 3}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 3, 3},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {1, 2, 3, 3},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConvTranspose2dOptions::Create();
     options->setAutoPad(V8MLAutoPad::Enum::kSameLower);
     options->setPadding({0, 1, 0, 1});
@@ -1783,12 +1811,12 @@
   }
   {
     // Test convTranspose2d with strides=2 and padding=1.
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 3, 3},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {1, 1, 3, 3}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 3, 3},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {1, 1, 3, 3},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConvTranspose2dOptions::Create();
     options->setPadding({1, 1, 1, 1});
     options->setStrides({2, 2});
@@ -1798,12 +1826,12 @@
   {
     // Test convTranspose2d with outputSizes and outputPadding. When the output
     // sizes are explicitly specified, the output padding values are ignored.
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 3, 3},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {1, 2, 3, 3}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 3, 3},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {1, 2, 3, 3},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConvTranspose2dOptions::Create();
     options->setStrides({3, 2});
     options->setOutputPadding({1, 1});
@@ -1816,13 +1844,13 @@
     // large.
     // Set the input and filter dimensions that let the output's number of
     // lements be 2 * SIZE_MAX.
-    auto* input =
-        BuildInput(builder, "input",
-                   {1, 1, kSquareRootOfSizeMax / 2, kSquareRootOfSizeMax / 2},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {1, 8, 1, 1}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(
+        builder, "input",
+        {1, 1, kSquareRootOfSizeMax / 2, kSquareRootOfSizeMax / 2},
+        V8MLOperandDataType::Enum::kFloat32, scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {1, 8, 1, 1},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConvTranspose2dOptions::Create();
     auto* output = builder->convTranspose2d(input, filter, options,
                                             scope.GetExceptionState());
@@ -1835,15 +1863,15 @@
   }
   {
     // Test throwing exception if the output operand's byte length is too large.
-    // Set the dimensions and type of input and filter that let the output's
-    // byte length be 4 * SIZE_MAX.
-    auto* input =
-        BuildInput(builder, "input",
-                   {1, 1, kSquareRootOfSizeMax / 2, kSquareRootOfSizeMax / 2},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {1, 4, 1, 1}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    // Set the dimensions and data type of input and filter that let the
+    // output's byte length be 4 * SIZE_MAX.
+    auto* input = BuildInput(
+        builder, "input",
+        {1, 1, kSquareRootOfSizeMax / 2, kSquareRootOfSizeMax / 2},
+        V8MLOperandDataType::Enum::kFloat32, scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {1, 4, 1, 1},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConvTranspose2dOptions::Create();
     auto* output = builder->convTranspose2d(input, filter, options,
                                             scope.GetExceptionState());
@@ -1855,12 +1883,12 @@
   }
   {
     // Test throwing exception when the input is not a 4-D tensor.
-    auto* input =
-        BuildInput(builder, "input", {1, 5, 5}, V8MLOperandType::Enum::kFloat32,
-                   scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {1, 1, 2, 2}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {1, 1, 2, 2},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConvTranspose2dOptions::Create();
     auto* output = builder->convTranspose2d(input, filter, options,
                                             scope.GetExceptionState());
@@ -1872,11 +1900,11 @@
   }
   {
     // Test throwing exception when the filter is not a 4-D tensor.
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 5, 5},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     auto* filter =
-        BuildConstant(builder, {2, 2}, V8MLOperandType::Enum::kFloat32,
+        BuildConstant(builder, {2, 2}, V8MLOperandDataType::Enum::kFloat32,
                       scope.GetExceptionState());
     auto* options = MLConvTranspose2dOptions::Create();
     auto* output = builder->convTranspose2d(input, filter, options,
@@ -1888,13 +1916,13 @@
               "The filter should be a 4-D tensor.");
   }
   {
-    // Test throwing exception when the filter type doesn't match the input
-    // type.
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 5, 5},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
+    // Test throwing exception when the filter data type doesn't match the input
+    // data type.
+    auto* input = BuildInput(builder, "input", {1, 1, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     auto* filter =
-        BuildConstant(builder, {1, 1, 2, 2}, V8MLOperandType::Enum::kInt32,
+        BuildConstant(builder, {1, 1, 2, 2}, V8MLOperandDataType::Enum::kInt32,
                       scope.GetExceptionState());
     auto* options = MLConvTranspose2dOptions::Create();
     auto* output = builder->convTranspose2d(input, filter, options,
@@ -1903,16 +1931,16 @@
     EXPECT_EQ(scope.GetExceptionState().CodeAs<DOMExceptionCode>(),
               DOMExceptionCode::kDataError);
     EXPECT_EQ(scope.GetExceptionState().Message(),
-              "The filter type doesn't match the input type.");
+              "The filter data type doesn't match the input data type.");
   }
   {
     // Test throwing exception when the length of padding is not 4.
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 5, 5},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {1, 1, 2, 2}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {1, 1, 2, 2},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConvTranspose2dOptions::Create();
     options->setPadding({2, 2});
     auto* output = builder->convTranspose2d(input, filter, options,
@@ -1925,12 +1953,12 @@
   }
   {
     // Test throwing exception when the length of strides is not 2.
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 5, 5},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {1, 1, 2, 2}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {1, 1, 2, 2},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConvTranspose2dOptions::Create();
     options->setStrides({2});
     auto* output = builder->convTranspose2d(input, filter, options,
@@ -1943,12 +1971,12 @@
   }
   {
     // Test throwing exception when one stride value is smaller than 1.
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 5, 5},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {1, 1, 2, 2}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {1, 1, 2, 2},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConvTranspose2dOptions::Create();
     options->setStrides({1, 0});
     auto* output = builder->convTranspose2d(input, filter, options,
@@ -1961,12 +1989,12 @@
   }
   {
     // Test throwing exception when the length of dilations is not 2.
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 5, 5},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {1, 1, 2, 2}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {1, 1, 2, 2},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConvTranspose2dOptions::Create();
     options->setDilations({1});
     auto* output = builder->convTranspose2d(input, filter, options,
@@ -1979,12 +2007,12 @@
   }
   {
     // Test throwing exception when the one dilation value is smaller than 1.
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 5, 5},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {1, 1, 2, 2}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {1, 1, 2, 2},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConvTranspose2dOptions::Create();
     options->setDilations({1, 0});
     auto* output = builder->convTranspose2d(input, filter, options,
@@ -1998,12 +2026,12 @@
   {
     // Test throwing exception when the input channels is not equal to the
     // filter input channels.
-    auto* input =
-        BuildInput(builder, "input", {1, 4, 5, 5},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {1, 1, 2, 2}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 4, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {1, 1, 2, 2},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConvTranspose2dOptions::Create();
     options->setGroups(3);
     auto* output = builder->convTranspose2d(input, filter, options,
@@ -2016,12 +2044,12 @@
   }
   {
     // Test throwing exception when output channels is too large.
-    auto* input =
-        BuildInput(builder, "input", {1, 4, 5, 5},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {4, 2, 2, 2}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 4, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {4, 2, 2, 2},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConvTranspose2dOptions::Create();
     options->setGroups(std::numeric_limits<uint32_t>::max());
     auto* output = builder->convTranspose2d(input, filter, options,
@@ -2034,12 +2062,12 @@
   }
   {
     // Test throwing exception when the groups is smaller than 1.
-    auto* input =
-        BuildInput(builder, "input", {1, 4, 5, 5},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {1, 1, 2, 2}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 4, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {1, 1, 2, 2},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConvTranspose2dOptions::Create();
     options->setGroups(0);
     auto* output = builder->convTranspose2d(input, filter, options,
@@ -2053,11 +2081,11 @@
   {
     // Test throwing exception due to overflow when calculating the padding
     // along the height dimension.
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 5, 5},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     auto* filter = BuildConstant(builder, {1, 1, 23567, 2},
-                                 V8MLOperandType::Enum::kFloat32,
+                                 V8MLOperandDataType::Enum::kFloat32,
                                  scope.GetExceptionState());
     auto* options = MLConvTranspose2dOptions::Create();
     options->setStrides({193232, 3});
@@ -2075,11 +2103,11 @@
   {
     // Test throwing exception due to overflow when calculating the padding
     // along the width dimension.
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 5, 5},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     auto* filter = BuildConstant(builder, {1, 1, 2, 28476},
-                                 V8MLOperandType::Enum::kFloat32,
+                                 V8MLOperandDataType::Enum::kFloat32,
                                  scope.GetExceptionState());
     auto* options = MLConvTranspose2dOptions::Create();
     options->setStrides({1, 284234});
@@ -2097,11 +2125,11 @@
   {
     // Test throwing exception due to overflow when calculating the effective
     // filter height.
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 5, 5},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     auto* filter = BuildConstant(builder, {1, 1, 434983, 2},
-                                 V8MLOperandType::Enum::kFloat32,
+                                 V8MLOperandDataType::Enum::kFloat32,
                                  scope.GetExceptionState());
     auto* options = MLConvTranspose2dOptions::Create();
     options->setDilations({328442, 1});
@@ -2118,11 +2146,11 @@
   {
     // Test throwing exception due to overflow when calculating the effective
     // filter width.
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 5, 5},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     auto* filter = BuildConstant(builder, {1, 1, 2, 234545},
-                                 V8MLOperandType::Enum::kFloat32,
+                                 V8MLOperandDataType::Enum::kFloat32,
                                  scope.GetExceptionState());
     auto* options = MLConvTranspose2dOptions::Create();
     options->setDilations({2, 843452});
@@ -2138,15 +2166,16 @@
   }
   {
     // Test throwing exception when the bias is not a 1-D tensor.
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 5, 5},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {1, 1, 2, 2}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {1, 1, 2, 2},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConvTranspose2dOptions::Create();
-    auto* bias = BuildConstant(builder, {1, 2}, V8MLOperandType::Enum::kFloat32,
-                               scope.GetExceptionState());
+    auto* bias =
+        BuildConstant(builder, {1, 2}, V8MLOperandDataType::Enum::kFloat32,
+                      scope.GetExceptionState());
     options->setBias(bias);
     auto* output = builder->convTranspose2d(input, filter, options,
                                             scope.GetExceptionState());
@@ -2159,15 +2188,16 @@
   {
     // Test throwing exception when the bias shape is not equal to
     // [output_channels].
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 5, 5},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {1, 1, 2, 2}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {1, 1, 2, 2},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConvTranspose2dOptions::Create();
-    auto* bias = BuildConstant(builder, {2}, V8MLOperandType::Enum::kFloat32,
-                               scope.GetExceptionState());
+    auto* bias =
+        BuildConstant(builder, {2}, V8MLOperandDataType::Enum::kFloat32,
+                      scope.GetExceptionState());
     options->setBias(bias);
     auto* output = builder->convTranspose2d(input, filter, options,
                                             scope.GetExceptionState());
@@ -2178,15 +2208,16 @@
               "The bias shape should be [1].");
   }
   {
-    // Test throwing exception when the bias type doesn't match input type.
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 5, 5},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {1, 1, 2, 2}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    // Test throwing exception when the bias data type doesn't match input data
+    // type.
+    auto* input = BuildInput(builder, "input", {1, 1, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {1, 1, 2, 2},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConvTranspose2dOptions::Create();
-    auto* bias = BuildConstant(builder, {1}, V8MLOperandType::Enum::kInt32,
+    auto* bias = BuildConstant(builder, {1}, V8MLOperandDataType::Enum::kInt32,
                                scope.GetExceptionState());
     options->setBias(bias);
     auto* output = builder->convTranspose2d(input, filter, options,
@@ -2195,17 +2226,17 @@
     EXPECT_EQ(scope.GetExceptionState().CodeAs<DOMExceptionCode>(),
               DOMExceptionCode::kDataError);
     EXPECT_EQ(scope.GetExceptionState().Message(),
-              "The bias type doesn't match input type.");
+              "The bias data type doesn't match input data type.");
   }
   {
     // Test throwing exception when the outputPadding is not a sequence of
     // length 2.
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 3, 3},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {1, 2, 3, 3}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 3, 3},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {1, 2, 3, 3},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConvTranspose2dOptions::Create();
     options->setStrides({3, 2});
     options->setOutputPadding({1, 1, 1, 1});
@@ -2220,12 +2251,12 @@
   {
     // Test throwing exception when the outputPadding is greater than stride
     // along the same dimension.
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 2, 2},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {1, 1, 3, 3}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 2, 2},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {1, 1, 3, 3},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConvTranspose2dOptions::Create();
     options->setPadding({0, 0, 3, 3});
     options->setStrides({2, 2});
@@ -2242,12 +2273,12 @@
   {
     // Test throwing exception when the outputSizes is not a sequence of
     // length 2.
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 3, 3},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {1, 2, 3, 3}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 3, 3},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {1, 2, 3, 3},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConvTranspose2dOptions::Create();
     options->setStrides({3, 2});
     options->setOutputSizes({1, 2, 10, 8});
@@ -2262,12 +2293,12 @@
   {
     // Test throwing exception due to underflow when calculating the output
     // height.
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 2, 2},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {1, 1, 3, 3}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 2, 2},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {1, 1, 3, 3},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConvTranspose2dOptions::Create();
     options->setPadding({4, 4, 0, 0});
     options->setStrides({2, 2});
@@ -2284,12 +2315,12 @@
   {
     // Test throwing exception due to outputSizes values are smaller than the
     // output sizes calculated by not using outputPadding.
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 3, 3},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {1, 1, 3, 3}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 3, 3},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {1, 1, 3, 3},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConvTranspose2dOptions::Create();
     options->setPadding({1, 1, 1, 1});
     options->setStrides({2, 2});
@@ -2306,12 +2337,12 @@
   {
     // Test throwing exception due to outputSizes values are greater than the
     // output sizes calculated by not using outputPadding.
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 3, 3},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {1, 1, 3, 3}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 3, 3},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {1, 1, 3, 3},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConvTranspose2dOptions::Create();
     options->setPadding({1, 1, 1, 1});
     options->setStrides({2, 2});
@@ -2350,7 +2381,7 @@
                        Pool2dKind kind) {
   EXPECT_NE(output, nullptr);
   EXPECT_EQ(output->Kind(), MLOperand::OperandKind::kOutput);
-  EXPECT_EQ(output->Type(), input->Type());
+  EXPECT_EQ(output->DataType(), input->DataType());
   auto* pool2d = output->Operator();
   EXPECT_NE(pool2d, nullptr);
   switch (kind) {
@@ -2375,7 +2406,7 @@
     {
       // Test pool2d with default options.
       auto* input = BuildInput(builder, "input", {1, 3, 4, 4},
-                               V8MLOperandType::Enum::kFloat32,
+                               V8MLOperandDataType::Enum::kFloat32,
                                scope.GetExceptionState());
       auto* options = MLPool2dOptions::Create();
       EXPECT_TRUE(options->hasAutoPad());
@@ -2396,7 +2427,7 @@
     {
       // Test pool2d without padding.
       auto* input = BuildInput(builder, "input", {1, 3, 4, 4},
-                               V8MLOperandType::Enum::kFloat32,
+                               V8MLOperandDataType::Enum::kFloat32,
                                scope.GetExceptionState());
       auto* options = MLPool2dOptions::Create();
       options->setWindowDimensions({3, 3});
@@ -2407,7 +2438,7 @@
     {
       // Test pool2d with padding=2.
       auto* input = BuildInput(builder, "input", {1, 3, 5, 5},
-                               V8MLOperandType::Enum::kFloat32,
+                               V8MLOperandDataType::Enum::kFloat32,
                                scope.GetExceptionState());
       auto* options = MLPool2dOptions::Create();
       options->setWindowDimensions({5, 5});
@@ -2419,7 +2450,7 @@
     {
       // Test pool2d with autoPad="same-upper".
       auto* input = BuildInput(builder, "input", {1, 3, 5, 5},
-                               V8MLOperandType::Enum::kFloat32,
+                               V8MLOperandDataType::Enum::kFloat32,
                                scope.GetExceptionState());
       auto* options = MLPool2dOptions::Create();
       options->setWindowDimensions({5, 5});
@@ -2431,7 +2462,7 @@
     {
       // Test pool2d with autoPad="same-lower".
       auto* input = BuildInput(builder, "input", {1, 3, 5, 5},
-                               V8MLOperandType::Enum::kFloat32,
+                               V8MLOperandDataType::Enum::kFloat32,
                                scope.GetExceptionState());
       auto* options = MLPool2dOptions::Create();
       options->setWindowDimensions({5, 5});
@@ -2443,7 +2474,7 @@
     {
       // Test pool2d with strides=2.
       auto* input = BuildInput(builder, "input", {1, 3, 5, 5},
-                               V8MLOperandType::Enum::kFloat32,
+                               V8MLOperandDataType::Enum::kFloat32,
                                scope.GetExceptionState());
       auto* options = MLPool2dOptions::Create();
       options->setWindowDimensions({2, 2});
@@ -2455,7 +2486,7 @@
     {
       // Test pool2d with strides=2 and padding=1.
       auto* input = BuildInput(builder, "input", {1, 3, 5, 5},
-                               V8MLOperandType::Enum::kFloat32,
+                               V8MLOperandDataType::Enum::kFloat32,
                                scope.GetExceptionState());
       auto* options = MLPool2dOptions::Create();
       options->setWindowDimensions({3, 3});
@@ -2468,7 +2499,7 @@
     {
       // Test pool2d with strides=2 and asymmetric padding.
       auto* input = BuildInput(builder, "input", {1, 3, 7, 7},
-                               V8MLOperandType::Enum::kFloat32,
+                               V8MLOperandDataType::Enum::kFloat32,
                                scope.GetExceptionState());
       auto* options = MLPool2dOptions::Create();
       options->setWindowDimensions({4, 4});
@@ -2481,7 +2512,7 @@
     {
       // Test pool2d with strides=2, padding=1 and roundingType="floor".
       auto* input = BuildInput(builder, "input", {1, 3, 7, 7},
-                               V8MLOperandType::Enum::kFloat32,
+                               V8MLOperandDataType::Enum::kFloat32,
                                scope.GetExceptionState());
       auto* options = MLPool2dOptions::Create();
       options->setWindowDimensions({4, 4});
@@ -2495,7 +2526,7 @@
     {
       // Test pool2d with strides=2, padding=1 and roundingType="ceil".
       auto* input = BuildInput(builder, "input", {1, 3, 7, 7},
-                               V8MLOperandType::Enum::kFloat32,
+                               V8MLOperandDataType::Enum::kFloat32,
                                scope.GetExceptionState());
       auto* options = MLPool2dOptions::Create();
       options->setWindowDimensions({4, 4});
@@ -2511,7 +2542,7 @@
       // When the output sizes are explicitly specified, the
       // options.roundingType is ignored.
       auto* input = BuildInput(builder, "input", {1, 3, 7, 7},
-                               V8MLOperandType::Enum::kFloat32,
+                               V8MLOperandDataType::Enum::kFloat32,
                                scope.GetExceptionState());
       auto* options = MLPool2dOptions::Create();
       options->setWindowDimensions({4, 4});
@@ -2526,7 +2557,7 @@
     {
       // Test pool2d with strides=2, padding=1 and outputSizes=[3, 3].
       auto* input = BuildInput(builder, "input", {1, 3, 7, 7},
-                               V8MLOperandType::Enum::kFloat32,
+                               V8MLOperandDataType::Enum::kFloat32,
                                scope.GetExceptionState());
       auto* options = MLPool2dOptions::Create();
       options->setWindowDimensions({4, 4});
@@ -2540,7 +2571,7 @@
     {
       // Test pool2d with strides=2, padding=1 and outputSizes=[4, 4].
       auto* input = BuildInput(builder, "input", {1, 3, 7, 7},
-                               V8MLOperandType::Enum::kFloat32,
+                               V8MLOperandDataType::Enum::kFloat32,
                                scope.GetExceptionState());
       auto* options = MLPool2dOptions::Create();
       options->setWindowDimensions({4, 4});
@@ -2554,7 +2585,7 @@
     {
       // Test pool2d with layout="nchw".
       auto* input = BuildInput(builder, "input", {1, 2, 5, 5},
-                               V8MLOperandType::Enum::kFloat32,
+                               V8MLOperandDataType::Enum::kFloat32,
                                scope.GetExceptionState());
       auto* options = MLPool2dOptions::Create();
       options->setWindowDimensions({3, 3});
@@ -2566,7 +2597,7 @@
     {
       // Test pool2d with layout="nhwc".
       auto* input = BuildInput(builder, "input", {1, 5, 5, 2},
-                               V8MLOperandType::Enum::kFloat32,
+                               V8MLOperandDataType::Enum::kFloat32,
                                scope.GetExceptionState());
       auto* options = MLPool2dOptions::Create();
       options->setWindowDimensions({3, 3});
@@ -2578,12 +2609,12 @@
     {
       // Test throwing exception if the output operand's byte length is too
       // large.
-      // Set the type and sizes of input, padding and window that let the output
-      // operands' byte length be greater than SIZE_MAX.
+      // Set the data type and sizes of input, padding and window that let the
+      // output operands' byte length be greater than SIZE_MAX.
       auto* input = BuildInput(
           builder, "input",
           {1, 1, kSquareRootOfSizeMax / 2, kSquareRootOfSizeMax / 2},
-          V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
+          V8MLOperandDataType::Enum::kFloat32, scope.GetExceptionState());
       auto* options = MLPool2dOptions::Create();
       options->setWindowDimensions({1, 1});
       options->setPadding({2, 2, 2, 2});
@@ -2597,7 +2628,7 @@
     {
       // Test throwing exception when the input is not a 4-D tensor.
       auto* input = BuildInput(builder, "input", {1, 5, 5},
-                               V8MLOperandType::Enum::kFloat32,
+                               V8MLOperandDataType::Enum::kFloat32,
                                scope.GetExceptionState());
       auto* output = BuildPool2d(scope, builder, pool2d_kind, input);
       EXPECT_EQ(output, nullptr);
@@ -2609,7 +2640,7 @@
     {
       // Test throwing exception when the output size is incorrect.
       auto* input = BuildInput(builder, "input", {1, 2, 5, 5},
-                               V8MLOperandType::Enum::kFloat32,
+                               V8MLOperandDataType::Enum::kFloat32,
                                scope.GetExceptionState());
       auto* options = MLPool2dOptions::Create();
       options->setWindowDimensions({2, 2});
@@ -2626,7 +2657,7 @@
     {
       // Test throwing exception when the length of output size is not 2.
       auto* input = BuildInput(builder, "input", {1, 2, 5, 5},
-                               V8MLOperandType::Enum::kFloat32,
+                               V8MLOperandDataType::Enum::kFloat32,
                                scope.GetExceptionState());
       auto* options = MLPool2dOptions::Create();
       options->setWindowDimensions({2, 2});
@@ -2643,7 +2674,7 @@
     {
       // Test throwing exception when the length of window dimensions is not 2.
       auto* input = BuildInput(builder, "input", {1, 2, 5, 5},
-                               V8MLOperandType::Enum::kFloat32,
+                               V8MLOperandDataType::Enum::kFloat32,
                                scope.GetExceptionState());
       auto* options = MLPool2dOptions::Create();
       options->setWindowDimensions({1, 1, 1, 1});
@@ -2658,7 +2689,7 @@
       // Test throwing exception when not all window dimensions is greater than
       // or equal to 1.
       auto* input = BuildInput(builder, "input", {1, 2, 5, 5},
-                               V8MLOperandType::Enum::kFloat32,
+                               V8MLOperandDataType::Enum::kFloat32,
                                scope.GetExceptionState());
       auto* options = MLPool2dOptions::Create();
       options->setWindowDimensions({0, 2});
@@ -2673,7 +2704,7 @@
       // Test throwing exception when the input height is too small to fill the
       // pool window height.
       auto* input = BuildInput(builder, "input", {1, 2, 5, 5},
-                               V8MLOperandType::Enum::kFloat32,
+                               V8MLOperandDataType::Enum::kFloat32,
                                scope.GetExceptionState());
       auto* options = MLPool2dOptions::Create();
       options->setWindowDimensions({8, 2});
@@ -2689,7 +2720,7 @@
       // Test throwing exception when the input width is too small to fill the
       // pool window width.
       auto* input = BuildInput(builder, "input", {1, 2, 5, 5},
-                               V8MLOperandType::Enum::kFloat32,
+                               V8MLOperandDataType::Enum::kFloat32,
                                scope.GetExceptionState());
       auto* options = MLPool2dOptions::Create();
       options->setWindowDimensions({2, 8});
@@ -2705,7 +2736,7 @@
       // Test throwing exception when the calculated output height is equal to
       // 0.
       auto* input = BuildInput(builder, "input", {1, 2, 5, 5},
-                               V8MLOperandType::Enum::kFloat32,
+                               V8MLOperandDataType::Enum::kFloat32,
                                scope.GetExceptionState());
       auto* options = MLPool2dOptions::Create();
       options->setWindowDimensions({6, 3});
@@ -2719,7 +2750,7 @@
     {
       // Test throwing exception when the length of padding is not 4.
       auto* input = BuildInput(builder, "input", {1, 2, 5, 5},
-                               V8MLOperandType::Enum::kFloat32,
+                               V8MLOperandDataType::Enum::kFloat32,
                                scope.GetExceptionState());
       auto* options = MLPool2dOptions::Create();
       options->setPadding({2, 2});
@@ -2733,7 +2764,7 @@
     {
       // Test throwing exception when the length of strides is not 2.
       auto* input = BuildInput(builder, "input", {1, 2, 5, 5},
-                               V8MLOperandType::Enum::kFloat32,
+                               V8MLOperandDataType::Enum::kFloat32,
                                scope.GetExceptionState());
       auto* options = MLPool2dOptions::Create();
       options->setStrides({2});
@@ -2747,7 +2778,7 @@
     {
       // Test throwing exception when one stride value is smaller than 1.
       auto* input = BuildInput(builder, "input", {1, 2, 5, 5},
-                               V8MLOperandType::Enum::kFloat32,
+                               V8MLOperandDataType::Enum::kFloat32,
                                scope.GetExceptionState());
       auto* options = MLPool2dOptions::Create();
       options->setStrides({0, 2});
@@ -2761,7 +2792,7 @@
     {
       // Test throwing exception when the length of dilations is not 2.
       auto* input = BuildInput(builder, "input", {1, 2, 5, 5},
-                               V8MLOperandType::Enum::kFloat32,
+                               V8MLOperandDataType::Enum::kFloat32,
                                scope.GetExceptionState());
       auto* options = MLPool2dOptions::Create();
       options->setDilations({1, 1, 2});
@@ -2775,7 +2806,7 @@
     {
       // Test throwing exception when one dilation value is smaller than 1.
       auto* input = BuildInput(builder, "input", {1, 2, 5, 5},
-                               V8MLOperandType::Enum::kFloat32,
+                               V8MLOperandDataType::Enum::kFloat32,
                                scope.GetExceptionState());
       auto* options = MLPool2dOptions::Create();
       options->setDilations({1, 0});
@@ -2797,16 +2828,16 @@
   {
     // Test building prelu when slope_shape is the same as the input_shape.
     Vector<uint32_t> input_shape({3, 2, 5});
-    auto* input =
-        BuildInput(builder, "input", input_shape,
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", input_shape,
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     auto* slope =
-        BuildConstant(builder, {3, 2, 5}, V8MLOperandType::Enum::kFloat32,
+        BuildConstant(builder, {3, 2, 5}, V8MLOperandDataType::Enum::kFloat32,
                       scope.GetExceptionState());
     auto* output = builder->prelu(input, slope, scope.GetExceptionState());
     EXPECT_NE(output, nullptr);
     EXPECT_EQ(output->Kind(), MLOperand::OperandKind::kOutput);
-    EXPECT_EQ(output->Type(), V8MLOperandType::Enum::kFloat32);
+    EXPECT_EQ(output->DataType(), V8MLOperandDataType::Enum::kFloat32);
     EXPECT_EQ(output->Dimensions(), input_shape);
     const MLOperator* p_relu = output->Operator();
     EXPECT_NE(p_relu, nullptr);
@@ -2817,15 +2848,16 @@
   {
     // Test building prelu with input_shape = {3, 2, 5} and slope_shape = {5}.
     Vector<uint32_t> input_shape({3, 2, 5});
-    auto* input =
-        BuildInput(builder, "input", input_shape,
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* slope = BuildConstant(builder, {5}, V8MLOperandType::Enum::kFloat32,
-                                scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", input_shape,
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* slope =
+        BuildConstant(builder, {5}, V8MLOperandDataType::Enum::kFloat32,
+                      scope.GetExceptionState());
     auto* output = builder->prelu(input, slope, scope.GetExceptionState());
     EXPECT_NE(output, nullptr);
     EXPECT_EQ(output->Kind(), MLOperand::OperandKind::kOutput);
-    EXPECT_EQ(output->Type(), V8MLOperandType::Enum::kFloat32);
+    EXPECT_EQ(output->DataType(), V8MLOperandDataType::Enum::kFloat32);
     EXPECT_EQ(output->Dimensions(), input_shape);
     const MLOperator* p_relu = output->Operator();
     EXPECT_NE(p_relu, nullptr);
@@ -2836,15 +2868,16 @@
   {
     // Test building prelu with input_shape = {3, 2, 5} and slope_shape = {}.
     Vector<uint32_t> input_shape({3, 2, 5});
-    auto* input =
-        BuildInput(builder, "input", input_shape,
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* slope = BuildConstant(builder, {}, V8MLOperandType::Enum::kFloat32,
-                                scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", input_shape,
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* slope =
+        BuildConstant(builder, {}, V8MLOperandDataType::Enum::kFloat32,
+                      scope.GetExceptionState());
     auto* output = builder->prelu(input, slope, scope.GetExceptionState());
     EXPECT_NE(output, nullptr);
     EXPECT_EQ(output->Kind(), MLOperand::OperandKind::kOutput);
-    EXPECT_EQ(output->Type(), V8MLOperandType::Enum::kFloat32);
+    EXPECT_EQ(output->DataType(), V8MLOperandDataType::Enum::kFloat32);
     EXPECT_EQ(output->Dimensions(), input_shape);
     const MLOperator* p_relu = output->Operator();
     EXPECT_NE(p_relu, nullptr);
@@ -2856,16 +2889,16 @@
     // Test building prelu with input_shape = {3, 2, 5} and slope_shape = {2,
     // 5}.
     Vector<uint32_t> input_shape({3, 2, 5});
-    auto* input =
-        BuildInput(builder, "input", input_shape,
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", input_shape,
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     auto* slope =
-        BuildConstant(builder, {2, 5}, V8MLOperandType::Enum::kFloat32,
+        BuildConstant(builder, {2, 5}, V8MLOperandDataType::Enum::kFloat32,
                       scope.GetExceptionState());
     auto* output = builder->prelu(input, slope, scope.GetExceptionState());
     EXPECT_NE(output, nullptr);
     EXPECT_EQ(output->Kind(), MLOperand::OperandKind::kOutput);
-    EXPECT_EQ(output->Type(), V8MLOperandType::Enum::kFloat32);
+    EXPECT_EQ(output->DataType(), V8MLOperandDataType::Enum::kFloat32);
     EXPECT_EQ(output->Dimensions(), input_shape);
     const MLOperator* p_relu = output->Operator();
     EXPECT_NE(p_relu, nullptr);
@@ -2876,11 +2909,12 @@
   {
     // Test building prelu with input_shape = {3, 2, 5} and slope_shape = {2}.
     Vector<uint32_t> input_shape({3, 2, 5});
-    auto* input =
-        BuildInput(builder, "input", input_shape,
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* slope = BuildConstant(builder, {2}, V8MLOperandType::Enum::kFloat32,
-                                scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", input_shape,
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* slope =
+        BuildConstant(builder, {2}, V8MLOperandDataType::Enum::kFloat32,
+                      scope.GetExceptionState());
     auto* output = builder->prelu(input, slope, scope.GetExceptionState());
     EXPECT_EQ(output, nullptr);
     EXPECT_EQ(scope.GetExceptionState().CodeAs<DOMExceptionCode>(),
@@ -2892,11 +2926,11 @@
     // Test building prelu with input_shape = {5, 1, 2} and slope_shape = {2,
     // 2}.
     Vector<uint32_t> input_shape({5, 1, 2});
-    auto* input =
-        BuildInput(builder, "input", input_shape,
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", input_shape,
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     auto* slope =
-        BuildConstant(builder, {2, 2}, V8MLOperandType::Enum::kFloat32,
+        BuildConstant(builder, {2, 2}, V8MLOperandDataType::Enum::kFloat32,
                       scope.GetExceptionState());
     auto* output = builder->prelu(input, slope, scope.GetExceptionState());
     EXPECT_EQ(output, nullptr);
@@ -2908,32 +2942,33 @@
   {
     // Test building prelu with input_type = float and slope_type = int32.
     Vector<uint32_t> input_shape({3, 2, 5});
-    auto* input =
-        BuildInput(builder, "input", input_shape,
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* slope = BuildConstant(builder, {5}, V8MLOperandType::Enum::kInt32,
+    auto* input = BuildInput(builder, "input", input_shape,
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* slope = BuildConstant(builder, {5}, V8MLOperandDataType::Enum::kInt32,
                                 scope.GetExceptionState());
     auto* output = builder->prelu(input, slope, scope.GetExceptionState());
     EXPECT_EQ(output, nullptr);
     EXPECT_EQ(scope.GetExceptionState().CodeAs<DOMExceptionCode>(),
               DOMExceptionCode::kDataError);
-    EXPECT_EQ("The type of slope doesn't match the type of input.",
+    EXPECT_EQ("The data type of slope doesn't match the data type of input.",
               scope.GetExceptionState().Message());
   }
   {
     // Test building prelu with input_type = int32.
     Vector<uint32_t> input_shape({3, 2, 5});
-    auto* input =
-        BuildInput(builder, "input", input_shape, V8MLOperandType::Enum::kInt32,
-                   scope.GetExceptionState());
-    auto* slope = BuildConstant(builder, {5}, V8MLOperandType::Enum::kInt32,
+    auto* input = BuildInput(builder, "input", input_shape,
+                             V8MLOperandDataType::Enum::kInt32,
+                             scope.GetExceptionState());
+    auto* slope = BuildConstant(builder, {5}, V8MLOperandDataType::Enum::kInt32,
                                 scope.GetExceptionState());
     auto* output = builder->prelu(input, slope, scope.GetExceptionState());
     EXPECT_EQ(output, nullptr);
     EXPECT_EQ(scope.GetExceptionState().CodeAs<DOMExceptionCode>(),
               DOMExceptionCode::kDataError);
     EXPECT_EQ(
-        "The type of input and slope must be one of the floating point types.",
+        "The data type of input and slope must be one of the floating point "
+        "types.",
         scope.GetExceptionState().Message());
   }
 }
@@ -2946,13 +2981,13 @@
   {
     // Test building relu with float32 input.
     Vector<uint32_t> input_shape({3, 4, 5});
-    auto* input =
-        BuildInput(builder, "input", input_shape,
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", input_shape,
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     auto* output = builder->relu(input, scope.GetExceptionState());
     EXPECT_NE(output, nullptr);
     EXPECT_EQ(output->Kind(), MLOperand::OperandKind::kOutput);
-    EXPECT_EQ(output->Type(), V8MLOperandType::Enum::kFloat32);
+    EXPECT_EQ(output->DataType(), V8MLOperandDataType::Enum::kFloat32);
     EXPECT_EQ(output->Dimensions(), input_shape);
     const MLOperator* relu = output->Operator();
     EXPECT_NE(relu, nullptr);
@@ -2963,13 +2998,13 @@
   {
     // Test building relu with int32 input.
     Vector<uint32_t> input_shape({3, 4, 5});
-    auto* input =
-        BuildInput(builder, "input", input_shape, V8MLOperandType::Enum::kInt32,
-                   scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", input_shape,
+                             V8MLOperandDataType::Enum::kInt32,
+                             scope.GetExceptionState());
     auto* output = builder->relu(input, scope.GetExceptionState());
     EXPECT_NE(output, nullptr);
     EXPECT_EQ(output->Kind(), MLOperand::OperandKind::kOutput);
-    EXPECT_EQ(output->Type(), V8MLOperandType::Enum::kInt32);
+    EXPECT_EQ(output->DataType(), V8MLOperandDataType::Enum::kInt32);
     EXPECT_EQ(output->Dimensions(), input_shape);
     const MLOperator* relu = output->Operator();
     EXPECT_NE(relu, nullptr);
@@ -2996,13 +3031,13 @@
   ASSERT_NE(nullptr, builder);
   {
     // Test building hard-swish with float32 input.
-    auto* input =
-        BuildInput(builder, "input", {3, 4, 5}, V8MLOperandType::Enum::kFloat32,
-                   scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {3, 4, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     auto* output = builder->hardSwish(input, scope.GetExceptionState());
     EXPECT_NE(output, nullptr);
     EXPECT_EQ(output->Kind(), MLOperand::OperandKind::kOutput);
-    EXPECT_EQ(output->Type(), V8MLOperandType::Enum::kFloat32);
+    EXPECT_EQ(output->DataType(), V8MLOperandDataType::Enum::kFloat32);
     EXPECT_EQ(output->Dimensions(), Vector<uint32_t>({3, 4, 5}));
     auto* hard_swish = output->Operator();
     EXPECT_NE(hard_swish, nullptr);
@@ -3012,14 +3047,14 @@
   }
   {
     // Test throwing exception when building hard-swish with int32 input.
-    auto* input =
-        BuildInput(builder, "input", {3, 4, 5}, V8MLOperandType::Enum::kInt32,
-                   scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {3, 4, 5},
+                             V8MLOperandDataType::Enum::kInt32,
+                             scope.GetExceptionState());
     auto* output = builder->hardSwish(input, scope.GetExceptionState());
     EXPECT_EQ(output, nullptr);
     EXPECT_EQ(scope.GetExceptionState().CodeAs<DOMExceptionCode>(),
               DOMExceptionCode::kDataError);
-    EXPECT_EQ("The input type must be one of the float32,float16 types.",
+    EXPECT_EQ("The input data type must be one of the float32,float16 types.",
               scope.GetExceptionState().Message());
   }
   {
@@ -3042,7 +3077,7 @@
   auto* output = builder->gemm(a, b, options, scope.GetExceptionState());
   EXPECT_NE(output, nullptr);
   EXPECT_EQ(output->Kind(), MLOperand::OperandKind::kOutput);
-  EXPECT_EQ(output->Type(), a->Type());
+  EXPECT_EQ(output->DataType(), a->DataType());
   auto* gemm = output->Operator();
   EXPECT_NE(gemm, nullptr);
   EXPECT_EQ(gemm->Kind(), MLOperator::OperatorKind::kGemm);
@@ -3059,10 +3094,12 @@
   ASSERT_NE(nullptr, builder);
   {
     // Test building gemm with default option.
-    auto* a = BuildInput(builder, "a", {2, 3}, V8MLOperandType::Enum::kFloat32,
-                         scope.GetExceptionState());
-    auto* b = BuildInput(builder, "b", {3, 4}, V8MLOperandType::Enum::kFloat32,
-                         scope.GetExceptionState());
+    auto* a =
+        BuildInput(builder, "a", {2, 3}, V8MLOperandDataType::Enum::kFloat32,
+                   scope.GetExceptionState());
+    auto* b =
+        BuildInput(builder, "b", {3, 4}, V8MLOperandDataType::Enum::kFloat32,
+                   scope.GetExceptionState());
     auto* options = MLGemmOptions::Create();
     EXPECT_FALSE(options->hasC());
     EXPECT_TRUE(options->hasAlpha());
@@ -3079,10 +3116,12 @@
   {
     // Test building gemm with two matrices - {2, 3} and {2, 4} that can't be
     // multiplied together due to incompatible dimensions.
-    auto* a = BuildInput(builder, "a", {2, 3}, V8MLOperandType::Enum::kFloat32,
-                         scope.GetExceptionState());
-    auto* b = BuildInput(builder, "b", {2, 4}, V8MLOperandType::Enum::kFloat32,
-                         scope.GetExceptionState());
+    auto* a =
+        BuildInput(builder, "a", {2, 3}, V8MLOperandDataType::Enum::kFloat32,
+                   scope.GetExceptionState());
+    auto* b =
+        BuildInput(builder, "b", {2, 4}, V8MLOperandDataType::Enum::kFloat32,
+                   scope.GetExceptionState());
     auto* options = MLGemmOptions::Create();
     auto* output = builder->gemm(a, b, options, scope.GetExceptionState());
     EXPECT_EQ(output, nullptr);
@@ -3097,10 +3136,12 @@
     // Test building gemm with aTranspose = true.
     // Transposed a_dimensions would be {3, 2} and it's compatible with
     // b_dimensions {2, 4}.
-    auto* a = BuildInput(builder, "a", {2, 3}, V8MLOperandType::Enum::kFloat32,
-                         scope.GetExceptionState());
-    auto* b = BuildInput(builder, "b", {2, 4}, V8MLOperandType::Enum::kFloat32,
-                         scope.GetExceptionState());
+    auto* a =
+        BuildInput(builder, "a", {2, 3}, V8MLOperandDataType::Enum::kFloat32,
+                   scope.GetExceptionState());
+    auto* b =
+        BuildInput(builder, "b", {2, 4}, V8MLOperandDataType::Enum::kFloat32,
+                   scope.GetExceptionState());
     auto* options = MLGemmOptions::Create();
     options->setATranspose(true);
     auto* output = BuildGemm(scope, builder, a, b, options);
@@ -3110,10 +3151,12 @@
     // Test building gemm with aTranspose = true.
     // Transposed a_dimensions would be {3, 2} and it can't be multiplied with
     // b_dimensions {3, 4}.
-    auto* a = BuildInput(builder, "a", {2, 3}, V8MLOperandType::Enum::kFloat32,
-                         scope.GetExceptionState());
-    auto* b = BuildInput(builder, "b", {3, 4}, V8MLOperandType::Enum::kFloat32,
-                         scope.GetExceptionState());
+    auto* a =
+        BuildInput(builder, "a", {2, 3}, V8MLOperandDataType::Enum::kFloat32,
+                   scope.GetExceptionState());
+    auto* b =
+        BuildInput(builder, "b", {3, 4}, V8MLOperandDataType::Enum::kFloat32,
+                   scope.GetExceptionState());
     auto* options = MLGemmOptions::Create();
     options->setATranspose(true);
     auto* output = builder->gemm(a, b, options, scope.GetExceptionState());
@@ -3129,10 +3172,12 @@
     // Test building gemm with bTranspose = true.
     // Transposed b_dimensions would be {3, 4} and it's compatible with
     // a_dimensions {2, 3}.
-    auto* a = BuildInput(builder, "a", {2, 3}, V8MLOperandType::Enum::kFloat32,
-                         scope.GetExceptionState());
-    auto* b = BuildInput(builder, "b", {4, 3}, V8MLOperandType::Enum::kFloat32,
-                         scope.GetExceptionState());
+    auto* a =
+        BuildInput(builder, "a", {2, 3}, V8MLOperandDataType::Enum::kFloat32,
+                   scope.GetExceptionState());
+    auto* b =
+        BuildInput(builder, "b", {4, 3}, V8MLOperandDataType::Enum::kFloat32,
+                   scope.GetExceptionState());
     auto* options = MLGemmOptions::Create();
     options->setBTranspose(true);
     auto* output = BuildGemm(scope, builder, a, b, options);
@@ -3142,10 +3187,12 @@
     // Test building gemm with bTranspose = true.
     // Transposed b_dimensions would be {4, 3} and it's incompatible with
     // a_dimensions {2, 3}.
-    auto* a = BuildInput(builder, "a", {2, 3}, V8MLOperandType::Enum::kFloat32,
-                         scope.GetExceptionState());
-    auto* b = BuildInput(builder, "b", {3, 4}, V8MLOperandType::Enum::kFloat32,
-                         scope.GetExceptionState());
+    auto* a =
+        BuildInput(builder, "a", {2, 3}, V8MLOperandDataType::Enum::kFloat32,
+                   scope.GetExceptionState());
+    auto* b =
+        BuildInput(builder, "b", {3, 4}, V8MLOperandDataType::Enum::kFloat32,
+                   scope.GetExceptionState());
     auto* options = MLGemmOptions::Create();
     options->setBTranspose(true);
     auto* output = builder->gemm(a, b, options, scope.GetExceptionState());
@@ -3161,10 +3208,11 @@
     // Test building gemm with a_dimensions = {2, 3, 1}.
     // Test throwing an error due to input_a is not a 2-D tensor.
     auto* a =
-        BuildInput(builder, "a", {2, 3, 1}, V8MLOperandType::Enum::kFloat32,
+        BuildInput(builder, "a", {2, 3, 1}, V8MLOperandDataType::Enum::kFloat32,
                    scope.GetExceptionState());
-    auto* b = BuildInput(builder, "b", {2, 4}, V8MLOperandType::Enum::kFloat32,
-                         scope.GetExceptionState());
+    auto* b =
+        BuildInput(builder, "b", {2, 4}, V8MLOperandDataType::Enum::kFloat32,
+                   scope.GetExceptionState());
     auto* options = MLGemmOptions::Create();
     auto* output = builder->gemm(a, b, options, scope.GetExceptionState());
     EXPECT_EQ(output, nullptr);
@@ -3175,28 +3223,32 @@
   }
   {
     // Test building gemm with two mismatching input types.
-    auto* a = BuildInput(builder, "a", {2, 3}, V8MLOperandType::Enum::kFloat32,
-                         scope.GetExceptionState());
-    auto* b = BuildInput(builder, "b", {3, 4}, V8MLOperandType::Enum::kInt32,
-                         scope.GetExceptionState());
+    auto* a =
+        BuildInput(builder, "a", {2, 3}, V8MLOperandDataType::Enum::kFloat32,
+                   scope.GetExceptionState());
+    auto* b =
+        BuildInput(builder, "b", {3, 4}, V8MLOperandDataType::Enum::kInt32,
+                   scope.GetExceptionState());
     auto* options = MLGemmOptions::Create();
     auto* output = builder->gemm(a, b, options, scope.GetExceptionState());
     EXPECT_EQ(output, nullptr);
     EXPECT_EQ(scope.GetExceptionState().CodeAs<DOMExceptionCode>(),
               DOMExceptionCode::kDataError);
     EXPECT_EQ(scope.GetExceptionState().Message(),
-              "The types of first two inputs don't match.");
+              "The data types of first two inputs don't match.");
   }
   {
     // Test building gemm with setting optional input C.
     // The output dimensions of a * b would be {2, 4} and
     // c_dimensions {4} is able to broadcast to {2, 4}.
-    auto* a = BuildInput(builder, "a", {2, 3}, V8MLOperandType::Enum::kFloat32,
-                         scope.GetExceptionState());
-    auto* b = BuildInput(builder, "b", {3, 4}, V8MLOperandType::Enum::kFloat32,
-                         scope.GetExceptionState());
+    auto* a =
+        BuildInput(builder, "a", {2, 3}, V8MLOperandDataType::Enum::kFloat32,
+                   scope.GetExceptionState());
+    auto* b =
+        BuildInput(builder, "b", {3, 4}, V8MLOperandDataType::Enum::kFloat32,
+                   scope.GetExceptionState());
     auto* options = MLGemmOptions::Create();
-    auto* c = BuildInput(builder, "c", {4}, V8MLOperandType::Enum::kFloat32,
+    auto* c = BuildInput(builder, "c", {4}, V8MLOperandDataType::Enum::kFloat32,
                          scope.GetExceptionState());
     options->setC(c);
     auto* output = BuildGemm(scope, builder, a, b, options);
@@ -3206,12 +3258,14 @@
     // Test building gemm with setting optional input C.
     // The output dimensions of a * b would be {2, 4} and
     // c_dimensions is a scalar.
-    auto* a = BuildInput(builder, "a", {2, 3}, V8MLOperandType::Enum::kFloat32,
-                         scope.GetExceptionState());
-    auto* b = BuildInput(builder, "b", {3, 4}, V8MLOperandType::Enum::kFloat32,
-                         scope.GetExceptionState());
+    auto* a =
+        BuildInput(builder, "a", {2, 3}, V8MLOperandDataType::Enum::kFloat32,
+                   scope.GetExceptionState());
+    auto* b =
+        BuildInput(builder, "b", {3, 4}, V8MLOperandDataType::Enum::kFloat32,
+                   scope.GetExceptionState());
     auto* options = MLGemmOptions::Create();
-    auto* c = BuildInput(builder, "c", {}, V8MLOperandType::Enum::kFloat32,
+    auto* c = BuildInput(builder, "c", {}, V8MLOperandDataType::Enum::kFloat32,
                          scope.GetExceptionState());
     options->setC(c);
     auto* output = BuildGemm(scope, builder, a, b, options);
@@ -3221,13 +3275,16 @@
     // Test building gemm with aTranspose = true, bTranspose = true.
     // The output dimensions of a * b would be {2, 4} and
     // c_dimension {2, 3} is incompatible with {2, 4}.
-    auto* a = BuildInput(builder, "a", {2, 3}, V8MLOperandType::Enum::kFloat32,
-                         scope.GetExceptionState());
-    auto* b = BuildInput(builder, "b", {3, 4}, V8MLOperandType::Enum::kFloat32,
-                         scope.GetExceptionState());
+    auto* a =
+        BuildInput(builder, "a", {2, 3}, V8MLOperandDataType::Enum::kFloat32,
+                   scope.GetExceptionState());
+    auto* b =
+        BuildInput(builder, "b", {3, 4}, V8MLOperandDataType::Enum::kFloat32,
+                   scope.GetExceptionState());
     auto* options = MLGemmOptions::Create();
-    auto* c = BuildInput(builder, "a", {2, 3}, V8MLOperandType::Enum::kFloat32,
-                         scope.GetExceptionState());
+    auto* c =
+        BuildInput(builder, "a", {2, 3}, V8MLOperandDataType::Enum::kFloat32,
+                   scope.GetExceptionState());
     options->setC(c);
     auto* output = builder->gemm(a, b, options, scope.GetExceptionState());
     EXPECT_EQ(output, nullptr);
@@ -3239,15 +3296,18 @@
   }
   {
     // Test building gemm with aTranspose = true, bTranspose = true.
-    // Set optional input C with type = int32 and it mismatches with input
-    // type float32.
-    auto* a = BuildInput(builder, "a", {3, 2}, V8MLOperandType::Enum::kFloat32,
-                         scope.GetExceptionState());
-    auto* b = BuildInput(builder, "b", {4, 3}, V8MLOperandType::Enum::kFloat32,
-                         scope.GetExceptionState());
+    // Set optional input C with data type = int32 and it mismatches with input
+    // data type float32.
+    auto* a =
+        BuildInput(builder, "a", {3, 2}, V8MLOperandDataType::Enum::kFloat32,
+                   scope.GetExceptionState());
+    auto* b =
+        BuildInput(builder, "b", {4, 3}, V8MLOperandDataType::Enum::kFloat32,
+                   scope.GetExceptionState());
     auto* options = MLGemmOptions::Create();
-    auto* c = BuildInput(builder, "c", {2, 4}, V8MLOperandType::Enum::kInt32,
-                         scope.GetExceptionState());
+    auto* c =
+        BuildInput(builder, "c", {2, 4}, V8MLOperandDataType::Enum::kInt32,
+                   scope.GetExceptionState());
     options->setC(c);
     options->setATranspose(true);
     options->setBTranspose(true);
@@ -3255,20 +3315,23 @@
     EXPECT_EQ(output, nullptr);
     EXPECT_EQ(scope.GetExceptionState().CodeAs<DOMExceptionCode>(),
               DOMExceptionCode::kDataError);
-    EXPECT_EQ(scope.GetExceptionState().Message(),
-              "The third input type doesn't match other inputs' type.");
+    EXPECT_EQ(
+        scope.GetExceptionState().Message(),
+        "The third input data type doesn't match other inputs' data type.");
   }
   {
     // Test building gemm with aTranspose = true, bTranspose = true.
     // Set optional input C with dimensions = {2, 3, 4} and an error should be
     // thrown since c_dimensions is not a 2-D tensor.
-    auto* a = BuildInput(builder, "a", {3, 2}, V8MLOperandType::Enum::kFloat32,
-                         scope.GetExceptionState());
-    auto* b = BuildInput(builder, "b", {4, 3}, V8MLOperandType::Enum::kFloat32,
-                         scope.GetExceptionState());
+    auto* a =
+        BuildInput(builder, "a", {3, 2}, V8MLOperandDataType::Enum::kFloat32,
+                   scope.GetExceptionState());
+    auto* b =
+        BuildInput(builder, "b", {4, 3}, V8MLOperandDataType::Enum::kFloat32,
+                   scope.GetExceptionState());
     auto* options = MLGemmOptions::Create();
     auto* c =
-        BuildInput(builder, "c", {2, 3, 4}, V8MLOperandType::Enum::kFloat32,
+        BuildInput(builder, "c", {2, 3, 4}, V8MLOperandDataType::Enum::kFloat32,
                    scope.GetExceptionState());
     options->setC(c);
     options->setATranspose(true);
@@ -3285,12 +3348,12 @@
     // Test throwing exception if the output operand's byte length is too large.
     // Set the type and dimensions of inputs that let the output operand's byte
     // length be 4 * SIZE_MAX.
-    auto* a =
-        BuildInput(builder, "a", {kSquareRootOfSizeMax, 2},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* b =
-        BuildInput(builder, "b", {2, kSquareRootOfSizeMax},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
+    auto* a = BuildInput(builder, "a", {kSquareRootOfSizeMax, 2},
+                         V8MLOperandDataType::Enum::kFloat32,
+                         scope.GetExceptionState());
+    auto* b = BuildInput(builder, "b", {2, kSquareRootOfSizeMax},
+                         V8MLOperandDataType::Enum::kFloat32,
+                         scope.GetExceptionState());
     auto* output =
         builder->gemm(a, b, MLGemmOptions::Create(), scope.GetExceptionState());
     EXPECT_EQ(output, nullptr);
@@ -3332,7 +3395,7 @@
   }
   EXPECT_NE(output, nullptr);
   EXPECT_EQ(output->Kind(), MLOperand::OperandKind::kOutput);
-  EXPECT_EQ(output->Type(), a->Type());
+  EXPECT_EQ(output->DataType(), a->DataType());
   auto* op = output->Operator();
   EXPECT_NE(op, nullptr);
   switch (kind) {
@@ -3374,11 +3437,11 @@
     // a_dimensions     (4d) 8 * 1 * 6 * 1
     // b_dimensions     (3d)     7 * 1 * 5
     // output_dimenions (4d) 8 * 7 * 6 * 5
-    auto* a =
-        BuildInput(builder, "a", {8, 1, 6, 1}, V8MLOperandType::Enum::kFloat32,
-                   scope.GetExceptionState());
+    auto* a = BuildInput(builder, "a", {8, 1, 6, 1},
+                         V8MLOperandDataType::Enum::kFloat32,
+                         scope.GetExceptionState());
     auto* b =
-        BuildInput(builder, "b", {7, 1, 5}, V8MLOperandType::Enum::kFloat32,
+        BuildInput(builder, "b", {7, 1, 5}, V8MLOperandDataType::Enum::kFloat32,
                    scope.GetExceptionState());
     auto* output = BuildElementWiseBinary(scope, builder,
                                           ElementWiseBinaryKind::kAdd, a, b);
@@ -3390,9 +3453,9 @@
     // b_dimensions     (1d)         4
     // output_dimenions (3d) 4 * 2 * 4
     auto* a =
-        BuildInput(builder, "a", {4, 2, 1}, V8MLOperandType::Enum::kFloat32,
+        BuildInput(builder, "a", {4, 2, 1}, V8MLOperandDataType::Enum::kFloat32,
                    scope.GetExceptionState());
-    auto* b = BuildInput(builder, "b", {4}, V8MLOperandType::Enum::kFloat32,
+    auto* b = BuildInput(builder, "b", {4}, V8MLOperandDataType::Enum::kFloat32,
                          scope.GetExceptionState());
     auto* output = BuildElementWiseBinary(scope, builder,
                                           ElementWiseBinaryKind::kAdd, a, b);
@@ -3401,9 +3464,9 @@
   {
     // Testing building add with two input dimensions - {4, 2, 4} and {}.
     auto* a =
-        BuildInput(builder, "a", {4, 2, 4}, V8MLOperandType::Enum::kFloat32,
+        BuildInput(builder, "a", {4, 2, 4}, V8MLOperandDataType::Enum::kFloat32,
                    scope.GetExceptionState());
-    auto* b = BuildInput(builder, "b", {}, V8MLOperandType::Enum::kFloat32,
+    auto* b = BuildInput(builder, "b", {}, V8MLOperandDataType::Enum::kFloat32,
                          scope.GetExceptionState());
     auto* output = BuildElementWiseBinary(scope, builder,
                                           ElementWiseBinaryKind::kAdd, a, b);
@@ -3411,9 +3474,10 @@
   }
   {
     // Test throwing exception when the input shapes are not broadcastable.
-    auto* a = BuildInput(builder, "a", {4, 2}, V8MLOperandType::Enum::kFloat32,
-                         scope.GetExceptionState());
-    auto* b = BuildInput(builder, "b", {4}, V8MLOperandType::Enum::kFloat32,
+    auto* a =
+        BuildInput(builder, "a", {4, 2}, V8MLOperandDataType::Enum::kFloat32,
+                   scope.GetExceptionState());
+    auto* b = BuildInput(builder, "b", {4}, V8MLOperandDataType::Enum::kFloat32,
                          scope.GetExceptionState());
     auto* output = builder->sub(a, b, scope.GetExceptionState());
     EXPECT_EQ(output, nullptr);
@@ -3423,17 +3487,18 @@
               "The input shapes are not broadcastable.");
   }
   {
-    // Test throwing exception when the input types don't match.
-    auto* a = BuildInput(builder, "a", {4, 2}, V8MLOperandType::Enum::kFloat32,
-                         scope.GetExceptionState());
-    auto* b = BuildInput(builder, "b", {1}, V8MLOperandType::Enum::kInt32,
+    // Test throwing exception when the input data types don't match.
+    auto* a =
+        BuildInput(builder, "a", {4, 2}, V8MLOperandDataType::Enum::kFloat32,
+                   scope.GetExceptionState());
+    auto* b = BuildInput(builder, "b", {1}, V8MLOperandDataType::Enum::kInt32,
                          scope.GetExceptionState());
     auto* output = builder->max(a, b, scope.GetExceptionState());
     EXPECT_EQ(output, nullptr);
     EXPECT_EQ(ToExceptionCode(DOMExceptionCode::kDataError),
               scope.GetExceptionState().Code());
     EXPECT_EQ(scope.GetExceptionState().Message(),
-              "The input types don't match.");
+              "The input operand data types don't match.");
   }
 }
 
@@ -3447,7 +3512,7 @@
         CreateMLGraphBuilder(scope.GetExecutionContext(),
                              scope.GetScriptState(), scope.GetExceptionState());
     auto* input = BuildInput(builder, "input", input_info.dimensions,
-                             input_info.type, scope.GetExceptionState());
+                             input_info.data_type, scope.GetExceptionState());
     MLOperand* output = nullptr;
     switch (kind) {
       case ElementWiseUnaryKind::kAbs:
@@ -3500,7 +3565,7 @@
   void Test(V8TestingScope& scope) {
     MLOperand* output = BuildElementWiseUnary(scope);
     EXPECT_EQ(output->Kind(), MLOperand::OperandKind::kOutput);
-    EXPECT_EQ(output->Type(), input_info.type);
+    EXPECT_EQ(output->DataType(), input_info.data_type);
     EXPECT_EQ(output->Dimensions(), input_info.dimensions);
     auto* op = output->Operator();
     EXPECT_NE(op, nullptr);
@@ -3559,7 +3624,7 @@
     // Test building element-wise exp for scalar input.
     ElementWiseUnaryTester<float>{
         .kind = ElementWiseUnaryKind::kExp,
-        .input_info = {.type = V8MLOperandType::Enum::kFloat32,
+        .input_info = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                        .dimensions = {}}}
         .Test(scope);
   }
@@ -3567,7 +3632,7 @@
     // Test building element-wise abs.
     ElementWiseUnaryTester<float>{
         .kind = ElementWiseUnaryKind::kAbs,
-        .input_info = {.type = V8MLOperandType::Enum::kFloat32,
+        .input_info = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                        .dimensions = {2}}}
         .Test(scope);
   }
@@ -3575,7 +3640,7 @@
     // Test building element-wise ceil.
     ElementWiseUnaryTester<float>{
         .kind = ElementWiseUnaryKind::kCeil,
-        .input_info = {.type = V8MLOperandType::Enum::kFloat32,
+        .input_info = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                        .dimensions = {1, 2}}}
         .Test(scope);
   }
@@ -3583,7 +3648,7 @@
     // Test building element-wise cos.
     ElementWiseUnaryTester<float>{
         .kind = ElementWiseUnaryKind::kCos,
-        .input_info = {.type = V8MLOperandType::Enum::kFloat32,
+        .input_info = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                        .dimensions = {5, 6}}}
         .Test(scope);
   }
@@ -3591,7 +3656,7 @@
     // Test building element-wise exp.
     ElementWiseUnaryTester<float>{
         .kind = ElementWiseUnaryKind::kExp,
-        .input_info = {.type = V8MLOperandType::Enum::kFloat32,
+        .input_info = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                        .dimensions = {8, 5, 6}}}
         .Test(scope);
   }
@@ -3599,7 +3664,7 @@
     // Test building element-wise floor.
     ElementWiseUnaryTester<float>{
         .kind = ElementWiseUnaryKind::kFloor,
-        .input_info = {.type = V8MLOperandType::Enum::kFloat32,
+        .input_info = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                        .dimensions = {1, 2, 3}}}
         .Test(scope);
   }
@@ -3607,7 +3672,7 @@
     // Test building element-wise log.
     ElementWiseUnaryTester<float>{
         .kind = ElementWiseUnaryKind::kLog,
-        .input_info = {.type = V8MLOperandType::Enum::kFloat32,
+        .input_info = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                        .dimensions = {8, 6}}}
         .Test(scope);
   }
@@ -3615,7 +3680,7 @@
     // Test building element-wise neg.
     ElementWiseUnaryTester<float>{
         .kind = ElementWiseUnaryKind::kNeg,
-        .input_info = {.type = V8MLOperandType::Enum::kFloat32,
+        .input_info = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                        .dimensions = {1, 2, 3, 4}}}
         .Test(scope);
   }
@@ -3623,7 +3688,7 @@
     // Test building element-wise sin.
     ElementWiseUnaryTester<float>{
         .kind = ElementWiseUnaryKind::kSin,
-        .input_info = {.type = V8MLOperandType::Enum::kFloat32,
+        .input_info = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                        .dimensions = {6}}}
         .Test(scope);
   }
@@ -3631,7 +3696,7 @@
     // Test building element-wise tan.
     ElementWiseUnaryTester<float>{
         .kind = ElementWiseUnaryKind::kTan,
-        .input_info = {.type = V8MLOperandType::Enum::kFloat32,
+        .input_info = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                        .dimensions = {8, 6, 2}}}
         .Test(scope);
   }
@@ -3640,86 +3705,86 @@
     const MLOperand* output = ElementWiseUnaryTester<int32_t>{
         .kind = ElementWiseUnaryKind::kCeil,
         .input_info = {
-            .type = V8MLOperandType::Enum::kInt32,
+            .data_type = V8MLOperandDataType::Enum::kInt32,
             .dimensions = {3, 4}}}.BuildElementWiseUnary(scope);
     EXPECT_EQ(output, nullptr);
     EXPECT_EQ(scope.GetExceptionState().CodeAs<DOMExceptionCode>(),
               DOMExceptionCode::kDataError);
     EXPECT_EQ(scope.GetExceptionState().Message(),
-              "The input type must be one of the float32,float16 types.");
+              "The input data type must be one of the float32,float16 types.");
   }
   {
     // Test throwing exception when building exp with int32 input.
     const MLOperand* output = ElementWiseUnaryTester<uint32_t>{
         .kind = ElementWiseUnaryKind::kExp,
         .input_info = {
-            .type = V8MLOperandType::Enum::kUint32,
+            .data_type = V8MLOperandDataType::Enum::kUint32,
             .dimensions = {3, 4}}}.BuildElementWiseUnary(scope);
     EXPECT_EQ(output, nullptr);
     EXPECT_EQ(scope.GetExceptionState().CodeAs<DOMExceptionCode>(),
               DOMExceptionCode::kDataError);
     EXPECT_EQ(scope.GetExceptionState().Message(),
-              "The input type must be one of the float32,float16 types.");
+              "The input data type must be one of the float32,float16 types.");
   }
   {
     // Test throwing exception when building floor with int32 input.
     const MLOperand* output = ElementWiseUnaryTester<int32_t>{
         .kind = ElementWiseUnaryKind::kFloor,
         .input_info = {
-            .type = V8MLOperandType::Enum::kInt32,
+            .data_type = V8MLOperandDataType::Enum::kInt32,
             .dimensions = {3, 4}}}.BuildElementWiseUnary(scope);
     EXPECT_EQ(output, nullptr);
     EXPECT_EQ(scope.GetExceptionState().CodeAs<DOMExceptionCode>(),
               DOMExceptionCode::kDataError);
     EXPECT_EQ(scope.GetExceptionState().Message(),
-              "The input type must be one of the float32,float16 types.");
+              "The input data type must be one of the float32,float16 types.");
   }
   {
     // Test throwing exception when building sin with int32 input.
     const MLOperand* output = ElementWiseUnaryTester<uint32_t>{
         .kind = ElementWiseUnaryKind::kSin,
         .input_info = {
-            .type = V8MLOperandType::Enum::kUint32,
+            .data_type = V8MLOperandDataType::Enum::kUint32,
             .dimensions = {3, 4}}}.BuildElementWiseUnary(scope);
     EXPECT_EQ(output, nullptr);
     EXPECT_EQ(scope.GetExceptionState().CodeAs<DOMExceptionCode>(),
               DOMExceptionCode::kDataError);
     EXPECT_EQ(scope.GetExceptionState().Message(),
-              "The input type must be one of the float32,float16 types.");
+              "The input data type must be one of the float32,float16 types.");
   }
   {
     // Test throwing exception when building neg with uint32 input.
     const MLOperand* output = ElementWiseUnaryTester<uint32_t>{
         .kind = ElementWiseUnaryKind::kNeg,
         .input_info = {
-            .type = V8MLOperandType::Enum::kUint32,
+            .data_type = V8MLOperandDataType::Enum::kUint32,
             .dimensions = {3, 4}}}.BuildElementWiseUnary(scope);
     EXPECT_EQ(output, nullptr);
     EXPECT_EQ(scope.GetExceptionState().CodeAs<DOMExceptionCode>(),
               DOMExceptionCode::kDataError);
-    EXPECT_EQ(
-        scope.GetExceptionState().Message(),
-        "The input type must be one of the float32,float16,int32,int8 types.");
+    EXPECT_EQ(scope.GetExceptionState().Message(),
+              "The input data type must be one of the "
+              "float32,float16,int32,int8 types.");
   }
   {
     // Test throwing exception when building abs with uint8 input.
     const MLOperand* output = ElementWiseUnaryTester<uint8_t>{
         .kind = ElementWiseUnaryKind::kAbs,
         .input_info = {
-            .type = V8MLOperandType::Enum::kUint8,
+            .data_type = V8MLOperandDataType::Enum::kUint8,
             .dimensions = {3, 4}}}.BuildElementWiseUnary(scope);
     EXPECT_EQ(output, nullptr);
     EXPECT_EQ(scope.GetExceptionState().CodeAs<DOMExceptionCode>(),
               DOMExceptionCode::kDataError);
-    EXPECT_EQ(
-        scope.GetExceptionState().Message(),
-        "The input type must be one of the float32,float16,int32,int8 types.");
+    EXPECT_EQ(scope.GetExceptionState().Message(),
+              "The input data type must be one of the "
+              "float32,float16,int32,int8 types.");
   }
   {
     // Test building element-wise Erf.
     ElementWiseUnaryTester<float>{
         .kind = ElementWiseUnaryKind::kErf,
-        .input_info = {.type = V8MLOperandType::Enum::kFloat32,
+        .input_info = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                        .dimensions = {8, 6, 2}}}
         .Test(scope);
   }
@@ -3727,7 +3792,7 @@
     // Test building element-wise reciprocal.
     ElementWiseUnaryTester<float>{
         .kind = ElementWiseUnaryKind::kReciprocal,
-        .input_info = {.type = V8MLOperandType::Enum::kFloat32,
+        .input_info = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                        .dimensions = {8, 6, 2}}}
         .Test(scope);
   }
@@ -3735,7 +3800,7 @@
     // Test building element-wise sqrt.
     ElementWiseUnaryTester<float>{
         .kind = ElementWiseUnaryKind::kSqrt,
-        .input_info = {.type = V8MLOperandType::Enum::kFloat32,
+        .input_info = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                        .dimensions = {8, 6, 2}}}
         .Test(scope);
   }
@@ -3743,7 +3808,7 @@
     // Test building element-wise logical not.
     ElementWiseUnaryTester<uint8_t>{
         .kind = ElementWiseUnaryKind::kLogicalNot,
-        .input_info = {.type = V8MLOperandType::Enum::kUint8,
+        .input_info = {.data_type = V8MLOperandDataType::Enum::kUint8,
                        .dimensions = {8, 6, 2}}}
         .Test(scope);
   }
@@ -3752,19 +3817,19 @@
     const MLOperand* output = ElementWiseUnaryTester<uint32_t>{
         .kind = ElementWiseUnaryKind::kLogicalNot,
         .input_info = {
-            .type = V8MLOperandType::Enum::kUint32,
+            .data_type = V8MLOperandDataType::Enum::kUint32,
             .dimensions = {3, 4}}}.BuildElementWiseUnary(scope);
     EXPECT_EQ(output, nullptr);
     EXPECT_EQ(scope.GetExceptionState().CodeAs<DOMExceptionCode>(),
               DOMExceptionCode::kDataError);
     EXPECT_EQ(scope.GetExceptionState().Message(),
-              "The input type must be one of the uint8 types.");
+              "The input data type must be one of the uint8 types.");
   }
   {
     // Test building element-wise identity.
     ElementWiseUnaryTester<float>{
         .kind = ElementWiseUnaryKind::kIdentity,
-        .input_info = {.type = V8MLOperandType::Enum::kFloat32,
+        .input_info = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                        .dimensions = {8, 6, 2}}}
         .Test(scope);
   }
@@ -3772,7 +3837,7 @@
     // Test building element-wise identity.
     ElementWiseUnaryTester<uint8_t>{
         .kind = ElementWiseUnaryKind::kIdentity,
-        .input_info = {.type = V8MLOperandType::Enum::kUint8,
+        .input_info = {.data_type = V8MLOperandDataType::Enum::kUint8,
                        .dimensions = {8, 6, 2}}}
         .Test(scope);
   }
@@ -3827,7 +3892,7 @@
                        ReduceKind kind) {
   EXPECT_NE(output, nullptr);
   EXPECT_EQ(output->Kind(), MLOperand::OperandKind::kOutput);
-  EXPECT_EQ(output->Type(), input->Type());
+  EXPECT_EQ(output->DataType(), input->DataType());
   auto* reduce = output->Operator();
   EXPECT_NE(reduce, nullptr);
   switch (kind) {
@@ -3880,7 +3945,7 @@
     {
       // Test reduce with default options.
       auto* input = BuildInput(builder, "input", {1, 3, 4, 4},
-                               V8MLOperandType::Enum::kFloat32,
+                               V8MLOperandDataType::Enum::kFloat32,
                                scope.GetExceptionState());
       auto* options = MLReduceOptions::Create();
       EXPECT_FALSE(options->hasAxes());
@@ -3893,7 +3958,7 @@
     {
       // Test reduce with keepDimensions = true.
       auto* input = BuildInput(builder, "input", {1, 3, 4, 4},
-                               V8MLOperandType::Enum::kFloat32,
+                               V8MLOperandDataType::Enum::kFloat32,
                                scope.GetExceptionState());
       auto* options = MLReduceOptions::Create();
       options->setKeepDimensions(true);
@@ -3904,7 +3969,7 @@
     {
       // Test reduce with axes = {0, 1} and keep_dimensions = false.
       auto* input = BuildInput(builder, "input", {1, 3, 5, 5},
-                               V8MLOperandType::Enum::kFloat32,
+                               V8MLOperandDataType::Enum::kFloat32,
                                scope.GetExceptionState());
       auto* options = MLReduceOptions::Create();
       options->setAxes({0, 1});
@@ -3916,7 +3981,7 @@
       // Test throwing exception when a value in axes is out of range of [0,
       // N-1].
       auto* input = BuildInput(builder, "input", {1, 2, 5, 5},
-                               V8MLOperandType::Enum::kFloat32,
+                               V8MLOperandDataType::Enum::kFloat32,
                                scope.GetExceptionState());
       auto* options = MLReduceOptions::Create();
       options->setAxes({4});
@@ -3931,7 +3996,7 @@
     {
       // Test throwing exception when the two values are same in axes sequence.
       auto* input = BuildInput(builder, "input", {1, 2, 5, 5},
-                               V8MLOperandType::Enum::kFloat32,
+                               V8MLOperandDataType::Enum::kFloat32,
                                scope.GetExceptionState());
       auto* options = MLReduceOptions::Create();
       options->setAxes({0, 1, 1});
@@ -3943,16 +4008,16 @@
                 "Two or more values are same in the axes sequence.");
     }
   }
-  // Test throw error when the input type is not one of the floating point types
-  // for these four reduce kind.
+  // Test throw error when the input data type is not one of the floating point
+  // types for these four reduce kind.
   const auto kFloatRestrictReduceKinds = {ReduceKind::kL2, ReduceKind::kLogSum,
                                           ReduceKind::kLogSumExp,
                                           ReduceKind::kMean};
   for (const auto reduce_kind : kFloatRestrictReduceKinds) {
     // Test throwing exception when the two values are same in axes sequence.
-    auto* input =
-        BuildInput(builder, "input", {1, 2, 5, 5},
-                   V8MLOperandType::Enum::kInt32, scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 2, 5, 5},
+                             V8MLOperandDataType::Enum::kInt32,
+                             scope.GetExceptionState());
     auto* options = MLReduceOptions::Create();
     options->setAxes({0, 1});
     auto* output = BuildReduce(scope, builder, reduce_kind, input, options);
@@ -3960,7 +4025,7 @@
     EXPECT_EQ(scope.GetExceptionState().CodeAs<DOMExceptionCode>(),
               DOMExceptionCode::kDataError);
     EXPECT_EQ(scope.GetExceptionState().Message(),
-              "The input type must be one of the floating point types.");
+              "The input data type must be one of the floating point types.");
   }
 }
 
@@ -3971,14 +4036,14 @@
                            scope.GetExceptionState());
   {
     // Test building reshape with new shape = {3, null}.
-    auto* input =
-        BuildInput(builder, "input", {2, 3, 4}, V8MLOperandType::Enum::kFloat32,
-                   scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {2, 3, 4},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     auto* output =
         builder->reshape(input, {3, absl::nullopt}, scope.GetExceptionState());
     EXPECT_NE(output, nullptr);
     EXPECT_EQ(output->Kind(), MLOperand::OperandKind::kOutput);
-    EXPECT_EQ(output->Type(), V8MLOperandType::Enum::kFloat32);
+    EXPECT_EQ(output->DataType(), V8MLOperandDataType::Enum::kFloat32);
     EXPECT_EQ(output->Dimensions(), Vector<uint32_t>({3, 8}));
     auto* reshape = output->Operator();
     EXPECT_NE(reshape, nullptr);
@@ -3987,14 +4052,14 @@
   }
   {
     // Test building reshape with new shape = {null}, src shape = {2, 3, 4}.
-    auto* input =
-        BuildInput(builder, "input", {2, 3, 4}, V8MLOperandType::Enum::kFloat32,
-                   scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {2, 3, 4},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     auto* output =
         builder->reshape(input, {absl::nullopt}, scope.GetExceptionState());
     EXPECT_NE(output, nullptr);
     EXPECT_EQ(output->Kind(), MLOperand::OperandKind::kOutput);
-    EXPECT_EQ(output->Type(), V8MLOperandType::Enum::kFloat32);
+    EXPECT_EQ(output->DataType(), V8MLOperandDataType::Enum::kFloat32);
     EXPECT_EQ(output->Dimensions(), Vector<uint32_t>({24}));
     auto* reshape = output->Operator();
     EXPECT_NE(reshape, nullptr);
@@ -4004,13 +4069,13 @@
   {
     // Test building reshape with new shape = {null}, src shape = {1}.
     auto* input =
-        BuildInput(builder, "input", {1}, V8MLOperandType::Enum::kFloat32,
+        BuildInput(builder, "input", {1}, V8MLOperandDataType::Enum::kFloat32,
                    scope.GetExceptionState());
     auto* output =
         builder->reshape(input, {absl::nullopt}, scope.GetExceptionState());
     EXPECT_NE(output, nullptr);
     EXPECT_EQ(output->Kind(), MLOperand::OperandKind::kOutput);
-    EXPECT_EQ(output->Type(), V8MLOperandType::Enum::kFloat32);
+    EXPECT_EQ(output->DataType(), V8MLOperandDataType::Enum::kFloat32);
     EXPECT_EQ(output->Dimensions(), Vector<uint32_t>({1}));
     auto* reshape = output->Operator();
     EXPECT_NE(reshape, nullptr);
@@ -4020,12 +4085,12 @@
   {
     // Test reshaping a 1-D 1-element tensor to scalar.
     auto* input =
-        BuildInput(builder, "input", {1}, V8MLOperandType::Enum::kFloat32,
+        BuildInput(builder, "input", {1}, V8MLOperandDataType::Enum::kFloat32,
                    scope.GetExceptionState());
     auto* output = builder->reshape(input, {}, scope.GetExceptionState());
     EXPECT_NE(output, nullptr);
     EXPECT_EQ(output->Kind(), MLOperand::OperandKind::kOutput);
-    EXPECT_EQ(output->Type(), V8MLOperandType::Enum::kFloat32);
+    EXPECT_EQ(output->DataType(), V8MLOperandDataType::Enum::kFloat32);
     EXPECT_EQ(output->Dimensions(), Vector<uint32_t>({}));
     auto* reshape = output->Operator();
     EXPECT_NE(reshape, nullptr);
@@ -4035,12 +4100,12 @@
   {
     // Test reshaping a scalar to 1-D 1-element tensor.
     auto* input =
-        BuildInput(builder, "input", {}, V8MLOperandType::Enum::kFloat32,
+        BuildInput(builder, "input", {}, V8MLOperandDataType::Enum::kFloat32,
                    scope.GetExceptionState());
     auto* output = builder->reshape(input, {1}, scope.GetExceptionState());
     EXPECT_NE(output, nullptr);
     EXPECT_EQ(output->Kind(), MLOperand::OperandKind::kOutput);
-    EXPECT_EQ(output->Type(), V8MLOperandType::Enum::kFloat32);
+    EXPECT_EQ(output->DataType(), V8MLOperandDataType::Enum::kFloat32);
     EXPECT_EQ(output->Dimensions(), Vector<uint32_t>({1}));
     auto* reshape = output->Operator();
     EXPECT_NE(reshape, nullptr);
@@ -4049,9 +4114,9 @@
   }
   {
     // Test throwing error when one value of new shape is 0.
-    auto* input =
-        BuildInput(builder, "input", {2, 4}, V8MLOperandType::Enum::kFloat32,
-                   scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {2, 4},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     auto* output = builder->reshape(input, {2, absl::nullopt, 0},
                                     scope.GetExceptionState());
     EXPECT_EQ(output, nullptr);
@@ -4064,9 +4129,9 @@
     // Setting new shape = {}.
     // Test throwing error since the number of elements implied by new shape is
     // not equal to the number of elements in the input tensor.
-    auto* input =
-        BuildInput(builder, "input", {2, 3, 4}, V8MLOperandType::Enum::kFloat32,
-                   scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {2, 3, 4},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     auto* output = builder->reshape(input, {}, scope.GetExceptionState());
     EXPECT_EQ(output, nullptr);
     EXPECT_EQ(ToExceptionCode(DOMExceptionCode::kDataError),
@@ -4077,9 +4142,9 @@
   }
   {
     // Test throwing error when more than one components of new_shape are null.
-    auto* input =
-        BuildInput(builder, "input", {2, 3, 1}, V8MLOperandType::Enum::kFloat32,
-                   scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {2, 3, 1},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     auto* output = builder->reshape(input, {6, absl::nullopt, absl::nullopt},
                                     scope.GetExceptionState());
     EXPECT_EQ(output, nullptr);
@@ -4092,9 +4157,9 @@
     // Test throwing error since the number of elements (9) of the input tensor
     // can't be divided evenly by the number of elements (2) implied by the new
     // shape.
-    auto* input =
-        BuildInput(builder, "input", {3, 3}, V8MLOperandType::Enum::kFloat32,
-                   scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {3, 3},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     auto* output =
         builder->reshape(input, {2, absl::nullopt}, scope.GetExceptionState());
     EXPECT_EQ(output, nullptr);
@@ -4114,7 +4179,7 @@
   auto* output = builder->resample2d(input, options, scope.GetExceptionState());
   EXPECT_NE(output, nullptr);
   EXPECT_EQ(output->Kind(), MLOperand::OperandKind::kOutput);
-  EXPECT_EQ(output->Type(), input->Type());
+  EXPECT_EQ(output->DataType(), input->DataType());
   auto* resample2d = output->Operator();
   EXPECT_NE(resample2d, nullptr);
   EXPECT_EQ(resample2d->Kind(), MLOperator::OperatorKind::kResample2d);
@@ -4130,9 +4195,9 @@
                            scope.GetExceptionState());
   {
     // Test building resample2d with default options.
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 2, 4},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 2, 4},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     auto* options = MLResample2dOptions::Create();
     EXPECT_TRUE(options->hasMode());
     EXPECT_EQ(options->mode(), V8MLInterpolationMode::Enum::kNearestNeighbor);
@@ -4144,9 +4209,9 @@
   }
   {
     // Test building resample2d with scales = {2.0, 2.0}.
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 2, 4},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 2, 4},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     auto* options = MLResample2dOptions::Create();
     options->setScales({2.0, 2.0});
     auto* output = BuildResample2d(scope, builder, input, options);
@@ -4154,9 +4219,9 @@
   }
   {
     // Test building resample2d with scales = {0.5, 0.5}.
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 5, 5},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     auto* options = MLResample2dOptions::Create();
     options->setScales({0.5, 0.5});
     auto* output = BuildResample2d(scope, builder, input, options);
@@ -4166,9 +4231,9 @@
     // Test building resample2d with sizes = {3, 6}.
     // When the target sizes are specified, scales argument is
     // ignored.
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 2, 4},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 2, 4},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     auto* options = MLResample2dOptions::Create();
     options->setScales({2.0, 2.0});
     options->setSizes({3, 6});
@@ -4177,9 +4242,9 @@
   }
   {
     // Test building resample2d with scales = {1.0, 2.0} and axes = {0, 1}.
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 2, 4},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 2, 4},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     auto* options = MLResample2dOptions::Create();
     options->setScales({1.0, 2.0});
     options->setAxes({0, 1});
@@ -4188,9 +4253,9 @@
   }
   {
     // Test building resample2d with scales = {2.0, 2.0} and axes = {1, 2}.
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 2, 4},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 2, 4},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     auto* options = MLResample2dOptions::Create();
     options->setScales({2.0, 2.0});
     options->setAxes({1, 2});
@@ -4199,9 +4264,9 @@
   }
   {
     // Test throwing error when the input is not a 4-D tensor.
-    auto* input =
-        BuildInput(builder, "input", {2, 4}, V8MLOperandType::Enum::kFloat32,
-                   scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {2, 4},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     auto* options = MLResample2dOptions::Create();
     auto* output =
         builder->resample2d(input, options, scope.GetExceptionState());
@@ -4213,9 +4278,9 @@
   }
   {
     // Test throwing error when the length of scales is not 2.
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 2, 4},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 2, 4},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     auto* options = MLResample2dOptions::Create();
     options->setScales({1.0, 1.0, 2.0, 2.0});
     auto* output =
@@ -4228,9 +4293,9 @@
   }
   {
     // Test throwing error when the scale is negative.
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 2, 4},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 2, 4},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     auto* options = MLResample2dOptions::Create();
     options->setScales({1.0, -2.0});
     auto* output =
@@ -4243,9 +4308,9 @@
   }
   {
     // Test throwing error when the length of sizes is not 2.
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 2, 4},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 2, 4},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     auto* options = MLResample2dOptions::Create();
     options->setSizes({1, 1, 4, 6});
     auto* output =
@@ -4258,9 +4323,9 @@
   }
   {
     // Test throwing error when the scale height is too large.
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 34902, 23243},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 34902, 23243},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     auto* options = MLResample2dOptions::Create();
     options->setScales({232433, 4});
     auto* output =
@@ -4273,9 +4338,9 @@
   }
   {
     // Test throwing error when the scale height is too small.
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 2, 4},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 2, 4},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     auto* options = MLResample2dOptions::Create();
     options->setScales({0.02, 0.8});
     auto* output =
@@ -4288,9 +4353,9 @@
   }
   {
     // Test throwing error when the scale width is too large.
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 34902, 23243},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 34902, 23243},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     auto* options = MLResample2dOptions::Create();
     options->setScales({20, 434324});
     auto* output =
@@ -4303,9 +4368,9 @@
   }
   {
     // Test throwing error when the scale width is too small.
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 2, 4},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 2, 4},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     auto* options = MLResample2dOptions::Create();
     options->setScales({0.7, 0.1});
     auto* output =
@@ -4318,9 +4383,9 @@
   }
   {
     // Test throwing error when the length of axes is not 2.
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 2, 4},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 2, 4},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     auto* options = MLResample2dOptions::Create();
     options->setAxes({0, 1, 2});
     auto* output =
@@ -4333,9 +4398,9 @@
   }
   {
     // Test throwing error when the values of axes are inconsecutive.
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 2, 4},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 2, 4},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     auto* options = MLResample2dOptions::Create();
     options->setAxes({0, 2});
     auto* output =
@@ -4355,7 +4420,7 @@
   auto* output = builder->transpose(input, options, scope.GetExceptionState());
   EXPECT_NE(output, nullptr);
   EXPECT_EQ(output->Kind(), MLOperand::OperandKind::kOutput);
-  EXPECT_EQ(output->Type(), input->Type());
+  EXPECT_EQ(output->DataType(), input->DataType());
   auto* transpose = output->Operator();
   EXPECT_NE(transpose, nullptr);
   EXPECT_EQ(transpose->Kind(), MLOperator::OperatorKind::kTranspose);
@@ -4371,17 +4436,17 @@
                            scope.GetExceptionState());
   {
     // Test building transpose with default options.
-    auto* input =
-        BuildInput(builder, "input", {1, 2, 3, 4},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 2, 3, 4},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     auto* output = BuildTranspose(scope, builder, input);
     EXPECT_EQ(output->Dimensions(), Vector<uint32_t>({4, 3, 2, 1}));
   }
   {
     // Test building transpose with permutation = {0, 2, 3, 1}.
-    auto* input =
-        BuildInput(builder, "input", {1, 2, 3, 4},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 2, 3, 4},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     auto* options = MLTransposeOptions::Create();
     options->setPermutation({0, 2, 3, 1});
     auto* output = BuildTranspose(scope, builder, input, options);
@@ -4390,9 +4455,9 @@
   {
     // Test throwing error when the number of values in permutation is not the
     // same as the rank of the input tensor.
-    auto* input =
-        BuildInput(builder, "input", {1, 2, 4}, V8MLOperandType::Enum::kInt32,
-                   scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 2, 4},
+                             V8MLOperandDataType::Enum::kInt32,
+                             scope.GetExceptionState());
     auto* options = MLTransposeOptions::Create();
     options->setPermutation({0, 2, 3, 1});
     auto* output =
@@ -4407,9 +4472,9 @@
   }
   {
     // Test throwing error when two values in permutation are same.
-    auto* input =
-        BuildInput(builder, "input", {1, 2, 3, 4},
-                   V8MLOperandType::Enum::kInt32, scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 2, 3, 4},
+                             V8MLOperandDataType::Enum::kInt32,
+                             scope.GetExceptionState());
     auto* options = MLTransposeOptions::Create();
     options->setPermutation({0, 2, 3, 2});
     auto* output =
@@ -4423,9 +4488,9 @@
   {
     // Test throwing error when one value in permutation is greater than
     // input_rank-1.
-    auto* input =
-        BuildInput(builder, "input", {1, 2, 3, 4},
-                   V8MLOperandType::Enum::kInt32, scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 2, 3, 4},
+                             V8MLOperandDataType::Enum::kInt32,
+                             scope.GetExceptionState());
     auto* options = MLTransposeOptions::Create();
     options->setPermutation({0, 1, 2, 4});
     auto* output =
@@ -4445,7 +4510,7 @@
   auto* output = builder->clamp(input, options, scope.GetExceptionState());
   EXPECT_NE(output, nullptr);
   EXPECT_EQ(output->Kind(), MLOperand::OperandKind::kOutput);
-  EXPECT_EQ(output->Type(), input->Type());
+  EXPECT_EQ(output->DataType(), input->DataType());
   auto* clamp = output->Operator();
   EXPECT_NE(clamp, nullptr);
   EXPECT_EQ(clamp->Kind(), MLOperator::OperatorKind::kClamp);
@@ -4461,9 +4526,9 @@
                            scope.GetExceptionState());
   {
     // Test building clamp with default options.
-    auto* input =
-        BuildInput(builder, "input", {2, 4}, V8MLOperandType::Enum::kFloat32,
-                   scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {2, 4},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     auto* options = MLClampOptions::Create();
     EXPECT_FALSE(options->hasMaxValue());
     EXPECT_FALSE(options->hasMinValue());
@@ -4472,9 +4537,9 @@
   }
   {
     // Test building clamp with max value = 0 and min value = 0.
-    auto* input =
-        BuildInput(builder, "input", {1, 2, 2, 7},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 2, 2, 7},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     auto* options = MLClampOptions::Create();
     options->setMaxValue(0);
     options->setMinValue(0);
@@ -4484,7 +4549,7 @@
   {
     // Test throwing error when the max value is less than the min value.
     auto* input =
-        BuildInput(builder, "input", {2, 4}, V8MLOperandType::Enum::kInt32,
+        BuildInput(builder, "input", {2, 4}, V8MLOperandDataType::Enum::kInt32,
                    scope.GetExceptionState());
     auto* options = MLClampOptions::Create();
     options->setMaxValue(-3.243432);
@@ -4517,7 +4582,7 @@
   auto* output = builder->elu(input, options, scope.GetExceptionState());
   EXPECT_NE(output, nullptr);
   EXPECT_EQ(output->Kind(), MLOperand::OperandKind::kOutput);
-  EXPECT_EQ(output->Type(), input->Type());
+  EXPECT_EQ(output->DataType(), input->DataType());
   EXPECT_EQ(output->Dimensions(), output_shape);
   auto* elu = output->Operator();
   EXPECT_NE(elu, nullptr);
@@ -4533,9 +4598,9 @@
                            scope.GetExceptionState());
   {
     // Test building elu with float32 input and default options.
-    auto* input =
-        BuildInput(builder, "input", {1, 2, 3}, V8MLOperandType::Enum::kFloat32,
-                   scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 2, 3},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     auto* options = MLEluOptions::Create();
     EXPECT_TRUE(options->hasAlpha());
     EXPECT_EQ(options->alpha(), 1.0f);
@@ -4543,18 +4608,18 @@
   }
   {
     // Test building elu with float32 input and alpha = 0.1.
-    auto* input =
-        BuildInput(builder, "input", {2, 2, 3}, V8MLOperandType::Enum::kFloat32,
-                   scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {2, 2, 3},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     auto* options = MLEluOptions::Create();
     options->setAlpha(0.1);
     TestBuildElu(scope, builder, input, {2, 2, 3}, options);
   }
   {
     // Test throwing error when alpha = 0.
-    auto* input =
-        BuildInput(builder, "input", {2, 2, 3}, V8MLOperandType::Enum::kFloat32,
-                   scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {2, 2, 3},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     auto* options = MLEluOptions::Create();
     options->setAlpha(0);
     auto* output = builder->elu(input, options, scope.GetExceptionState());
@@ -4566,9 +4631,9 @@
   }
   {
     // Test throwing error when alpha = -1.
-    auto* input =
-        BuildInput(builder, "input", {2, 2, 3}, V8MLOperandType::Enum::kFloat32,
-                   scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {2, 2, 3},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     auto* options = MLEluOptions::Create();
     options->setAlpha(-1);
     auto* output = builder->elu(input, options, scope.GetExceptionState());
@@ -4579,17 +4644,17 @@
               "The value of alpha must be greater than 0.");
   }
   {
-    // Test throwing error when input type is int32.
-    auto* input =
-        BuildInput(builder, "input", {2, 2, 3}, V8MLOperandType::Enum::kInt32,
-                   scope.GetExceptionState());
+    // Test throwing error when input data type is int32.
+    auto* input = BuildInput(builder, "input", {2, 2, 3},
+                             V8MLOperandDataType::Enum::kInt32,
+                             scope.GetExceptionState());
     auto* output =
         builder->elu(input, MLEluOptions::Create(), scope.GetExceptionState());
     EXPECT_EQ(output, nullptr);
     EXPECT_EQ(scope.GetExceptionState().CodeAs<DOMExceptionCode>(),
               DOMExceptionCode::kDataError);
     EXPECT_EQ(scope.GetExceptionState().Message(),
-              "The input type must be one of the float32,float16 types.");
+              "The input data type must be one of the float32,float16 types.");
   }
   {
     // Test building elu as a standalone operator.
@@ -4611,8 +4676,9 @@
     auto* builder =
         CreateMLGraphBuilder(scope.GetExecutionContext(),
                              scope.GetScriptState(), scope.GetExceptionState());
-    auto* input_operand = BuildInput(builder, "input", input.dimensions,
-                                     input.type, scope.GetExceptionState());
+    auto* input_operand =
+        BuildInput(builder, "input", input.dimensions, input.data_type,
+                   scope.GetExceptionState());
     return builder->expand(input_operand, new_shape, scope.GetExceptionState());
   }
 
@@ -4620,7 +4686,7 @@
     MLOperand* output = BuildExpandOperator(scope);
     ASSERT_NE(output, nullptr);
     EXPECT_EQ(output->Kind(), MLOperand::OperandKind::kOutput);
-    EXPECT_EQ(output->Type(), input.type);
+    EXPECT_EQ(output->DataType(), input.data_type);
     EXPECT_EQ(output->Dimensions(), new_shape);
     auto* op = output->Operator();
     EXPECT_NE(op, nullptr);
@@ -4635,29 +4701,33 @@
   {
     // Test building expand 0-D scalar to 3-D tensor.
     ExpandTester<float>{
-        .input = {.type = V8MLOperandType::Enum::kFloat32, .dimensions = {}},
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
+                  .dimensions = {}},
         .new_shape = {3, 4, 5}}
         .Test(scope);
   }
   {
     // Test building expand with the new shapes that are the same as input.
     ExpandTester<float>{
-        .input = {.type = V8MLOperandType::Enum::kFloat32, .dimensions = {4}},
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
+                  .dimensions = {4}},
         .new_shape = {4}}
         .Test(scope);
   }
   {
     // Test building expand with the new shapes that are broadcastable.
-    ExpandTester<int32_t>{.input = {.type = V8MLOperandType::Enum::kInt32,
-                                    .dimensions = {3, 1, 5}},
-                          .new_shape = {3, 4, 5}}
+    ExpandTester<int32_t>{
+        .input = {.data_type = V8MLOperandDataType::Enum::kInt32,
+                  .dimensions = {3, 1, 5}},
+        .new_shape = {3, 4, 5}}
         .Test(scope);
   }
   {
     // Test building expand with the new shapes that are broadcastable and the
     // number of new shapes larger than input.
     ExpandTester<int32_t>{
-        .input = {.type = V8MLOperandType::Enum::kInt32, .dimensions = {2, 5}},
+        .input = {.data_type = V8MLOperandDataType::Enum::kInt32,
+                  .dimensions = {2, 5}},
         .new_shape = {3, 2, 5}}
         .Test(scope);
   }
@@ -4665,7 +4735,7 @@
     // Test throwing exception when the input shapes are not the same as new
     // shape and not broadcastable.
     MLOperand* output = ExpandTester<uint32_t>{
-        .input = {.type = V8MLOperandType::Enum::kUint32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kUint32,
                   .dimensions = {3, 6, 2}},
         .new_shape = {4, 3,
                       5}}.BuildExpandOperator(scope);
@@ -4678,7 +4748,8 @@
   {
     // Test throwing exception when the input shapes are not broadcastable.
     MLOperand* output = ExpandTester<uint32_t>{
-        .input = {.type = V8MLOperandType::Enum::kUint32, .dimensions = {5, 4}},
+        .input = {.data_type = V8MLOperandDataType::Enum::kUint32,
+                  .dimensions = {5, 4}},
         .new_shape = {5}}.BuildExpandOperator(scope);
     EXPECT_EQ(output, nullptr);
     EXPECT_EQ(scope.GetExceptionState().CodeAs<DOMExceptionCode>(),
@@ -4691,7 +4762,7 @@
     // Set the dimensions that let the number of elements be 2 * SIZE_MAX.
     MLOperand* output =
         ExpandTester<float>{
-            .input = {.type = V8MLOperandType::Enum::kFloat32,
+            .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                       .dimensions = {1, 2, 1, 1}},
             .new_shape = {1, 2, kSquareRootOfSizeMax, kSquareRootOfSizeMax}}
             .BuildExpandOperator(scope);
@@ -4711,7 +4782,7 @@
   auto* output = builder->leakyRelu(input, options, scope.GetExceptionState());
   EXPECT_NE(output, nullptr);
   EXPECT_EQ(output->Kind(), MLOperand::OperandKind::kOutput);
-  EXPECT_EQ(output->Type(), input->Type());
+  EXPECT_EQ(output->DataType(), input->DataType());
   auto* leaky_relu = output->Operator();
   EXPECT_NE(leaky_relu, nullptr);
   EXPECT_EQ(leaky_relu->Kind(), MLOperator::OperatorKind::kLeakyRelu);
@@ -4727,9 +4798,9 @@
                            scope.GetExceptionState());
   {
     // Test building leaky_relu with float32 input.
-    auto* input =
-        BuildInput(builder, "input", {1, 2, 3}, V8MLOperandType::Enum::kFloat32,
-                   scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 2, 3},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     auto* options = MLLeakyReluOptions::Create();
     auto* output = BuildLeakyRelu(scope, builder, input, options);
     EXPECT_EQ(output->Dimensions(), Vector<uint32_t>({1, 2, 3}));
@@ -4757,7 +4828,7 @@
                               scope.GetExceptionState());
   EXPECT_NE(output, nullptr);
   EXPECT_EQ(output->Kind(), MLOperand::OperandKind::kOutput);
-  EXPECT_EQ(output->Type(), input->Type());
+  EXPECT_EQ(output->DataType(), input->DataType());
   auto* pad = output->Operator();
   EXPECT_NE(pad, nullptr);
   EXPECT_EQ(pad->Kind(), MLOperator::OperatorKind::kPad);
@@ -4774,9 +4845,9 @@
   {
     // Test building pad with default options, beginningPadding = {1, 2} and
     // endingPadding = {1, 2}.
-    auto* input =
-        BuildInput(builder, "input", {2, 3}, V8MLOperandType::Enum::kFloat32,
-                   scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {2, 3},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     auto* options = MLPadOptions::Create();
     EXPECT_TRUE(options->hasMode());
     EXPECT_EQ(options->mode(), V8MLPaddingMode::Enum::kConstant);
@@ -4788,7 +4859,7 @@
   {
     // Test throwing error when building pad for scalar input.
     auto* input =
-        BuildInput(builder, "input", {}, V8MLOperandType::Enum::kFloat32,
+        BuildInput(builder, "input", {}, V8MLOperandDataType::Enum::kFloat32,
                    scope.GetExceptionState());
     auto* options = MLPadOptions::Create();
     auto* output =
@@ -4802,9 +4873,9 @@
   {
     // Test throwing error when the length of beginningPadding is not equal to
     // the input rank.
-    auto* input =
-        BuildInput(builder, "input", {2, 3}, V8MLOperandType::Enum::kFloat32,
-                   scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {2, 3},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     auto* options = MLPadOptions::Create();
     options->setMode(V8MLPaddingMode::Enum::kEdge);
     auto* output =
@@ -4819,9 +4890,9 @@
   {
     // Test throwing error when the length of endingPadding is not equal to the
     // input rank.
-    auto* input =
-        BuildInput(builder, "input", {2, 3}, V8MLOperandType::Enum::kFloat32,
-                   scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {2, 3},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     auto* options = MLPadOptions::Create();
     options->setMode(V8MLPaddingMode::Enum::kReflection);
     auto* output = builder->pad(input, {1, 0}, {1, 2, 0}, options,
@@ -4835,9 +4906,9 @@
   }
   {
     // Test throwing error when the padding of one dimension is too large.
-    auto* input =
-        BuildInput(builder, "input", {2, 3}, V8MLOperandType::Enum::kFloat32,
-                   scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {2, 3},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     auto* options = MLPadOptions::Create();
     options->setMode(V8MLPaddingMode::Enum::kReflection);
     auto* output = builder->pad(input, {2294967295, 0}, {3294967295, 2},
@@ -4857,13 +4928,13 @@
                            scope.GetExceptionState());
   {
     // Test building softmax with float32 input.
-    auto* input =
-        BuildInput(builder, "input", {2, 4}, V8MLOperandType::Enum::kFloat32,
-                   scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {2, 4},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     auto* output = builder->softmax(input, scope.GetExceptionState());
     EXPECT_NE(output, nullptr);
     EXPECT_EQ(output->Kind(), MLOperand::OperandKind::kOutput);
-    EXPECT_EQ(output->Type(), V8MLOperandType::Enum::kFloat32);
+    EXPECT_EQ(output->DataType(), V8MLOperandDataType::Enum::kFloat32);
     EXPECT_EQ(output->Dimensions(), Vector<uint32_t>({2, 4}));
     auto* softmax = output->Operator();
     EXPECT_NE(softmax, nullptr);
@@ -4873,9 +4944,9 @@
   }
   {
     // Test throwing exception when building softmax with 4-D input.
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 2, 4},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 2, 4},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     auto* output = builder->softmax(input, scope.GetExceptionState());
     EXPECT_EQ(output, nullptr);
     EXPECT_EQ(scope.GetExceptionState().CodeAs<DOMExceptionCode>(),
@@ -4886,14 +4957,14 @@
   {
     // Test throwing exception when building softmax with int32 input.
     auto* input =
-        BuildInput(builder, "input", {3, 4}, V8MLOperandType::Enum::kInt32,
+        BuildInput(builder, "input", {3, 4}, V8MLOperandDataType::Enum::kInt32,
                    scope.GetExceptionState());
     auto* output = builder->softmax(input, scope.GetExceptionState());
     EXPECT_EQ(output, nullptr);
     EXPECT_EQ(scope.GetExceptionState().CodeAs<DOMExceptionCode>(),
               DOMExceptionCode::kDataError);
     EXPECT_EQ(scope.GetExceptionState().Message(),
-              "The input type must be one of the floating point types.");
+              "The input data type must be one of the floating point types.");
   }
 }
 
@@ -4905,13 +4976,13 @@
   {
     // Test building softsign with float32 input.
     Vector<uint32_t> input_shape({3, 4});
-    auto* input =
-        BuildInput(builder, "input", input_shape,
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", input_shape,
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     auto* output = builder->softsign(input, scope.GetExceptionState());
     EXPECT_NE(output, nullptr);
     EXPECT_EQ(output->Kind(), MLOperand::OperandKind::kOutput);
-    EXPECT_EQ(output->Type(), V8MLOperandType::Enum::kFloat32);
+    EXPECT_EQ(output->DataType(), V8MLOperandDataType::Enum::kFloat32);
     EXPECT_EQ(output->Dimensions(), input_shape);
     const MLOperator* softsign = output->Operator();
     EXPECT_NE(softsign, nullptr);
@@ -4922,15 +4993,15 @@
   {
     // Test throwing exception when building softsign with int32 input.
     Vector<uint32_t> input_shape({3, 4});
-    auto* input =
-        BuildInput(builder, "input", input_shape, V8MLOperandType::Enum::kInt32,
-                   scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", input_shape,
+                             V8MLOperandDataType::Enum::kInt32,
+                             scope.GetExceptionState());
     auto* output = builder->softsign(input, scope.GetExceptionState());
     EXPECT_EQ(output, nullptr);
     EXPECT_EQ(scope.GetExceptionState().CodeAs<DOMExceptionCode>(),
               DOMExceptionCode::kDataError);
     EXPECT_EQ(scope.GetExceptionState().Message(),
-              "The input type must be one of the float32,float16 types.");
+              "The input data type must be one of the float32,float16 types.");
   }
   {
     // Test building softsign operator.
@@ -4952,13 +5023,13 @@
   {
     // Test building sigmoid with float32 input.
     Vector<uint32_t> input_shape({3, 4, 5});
-    auto* input =
-        BuildInput(builder, "input", input_shape,
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", input_shape,
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     auto* output = builder->sigmoid(input, scope.GetExceptionState());
     EXPECT_NE(output, nullptr);
     EXPECT_EQ(output->Kind(), MLOperand::OperandKind::kOutput);
-    EXPECT_EQ(output->Type(), V8MLOperandType::Enum::kFloat32);
+    EXPECT_EQ(output->DataType(), V8MLOperandDataType::Enum::kFloat32);
     EXPECT_EQ(output->Dimensions(), input_shape);
     const MLOperator* sigmoid = output->Operator();
     EXPECT_NE(sigmoid, nullptr);
@@ -4969,15 +5040,15 @@
   {
     // Test throwing exception when building sigmoid with int32 input.
     Vector<uint32_t> input_shape({3, 4, 5});
-    auto* input =
-        BuildInput(builder, "input", input_shape, V8MLOperandType::Enum::kInt32,
-                   scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", input_shape,
+                             V8MLOperandDataType::Enum::kInt32,
+                             scope.GetExceptionState());
     auto* output = builder->sigmoid(input, scope.GetExceptionState());
     EXPECT_EQ(output, nullptr);
     EXPECT_EQ(scope.GetExceptionState().CodeAs<DOMExceptionCode>(),
               DOMExceptionCode::kDataError);
     EXPECT_EQ(scope.GetExceptionState().Message(),
-              "The input type must be one of the float32,float16 types.");
+              "The input data type must be one of the float32,float16 types.");
   }
   {
     // Test building sigmoid operator.
@@ -4998,14 +5069,14 @@
   {
     // Test building slice with starts = {0, 1, 2} and sizes = {1, 2, 3}.
     Vector<uint32_t> input_shape({3, 4, 5});
-    auto* input =
-        BuildInput(builder, "input", input_shape,
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", input_shape,
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     auto* output =
         builder->slice(input, {0, 1, 2}, {1, 2, 3}, scope.GetExceptionState());
     EXPECT_NE(output, nullptr);
     EXPECT_EQ(output->Kind(), MLOperand::OperandKind::kOutput);
-    EXPECT_EQ(output->Type(), V8MLOperandType::Enum::kFloat32);
+    EXPECT_EQ(output->DataType(), V8MLOperandDataType::Enum::kFloat32);
     EXPECT_EQ(output->Dimensions(), Vector<uint32_t>({1, 2, 3}));
     const MLOperator* slice = output->Operator();
     EXPECT_NE(slice, nullptr);
@@ -5016,9 +5087,9 @@
   {
     // Test building slice a scalar.
     Vector<uint32_t> input_shape({});
-    auto* input =
-        BuildInput(builder, "input", input_shape,
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", input_shape,
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     auto* output = builder->slice(input, {0}, {1}, scope.GetExceptionState());
     EXPECT_EQ(output, nullptr);
     EXPECT_EQ(scope.GetExceptionState().CodeAs<DOMExceptionCode>(),
@@ -5030,9 +5101,9 @@
     // Test throwing error when the length of sizes is not equal to the rank of
     // the input tensor.
     Vector<uint32_t> input_shape({3, 4, 5});
-    auto* input =
-        BuildInput(builder, "input", input_shape,
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", input_shape,
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     const Vector<uint32_t> starts = {1, 2, 3};
     const Vector<uint32_t> sizes = {1, 1};
     auto* output =
@@ -5048,9 +5119,9 @@
     // Test throwing error when the length of starts is not equal to the rank
     // of the input tensor.
     Vector<uint32_t> input_shape({3, 4, 5});
-    auto* input =
-        BuildInput(builder, "input", input_shape,
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", input_shape,
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     const Vector<uint32_t> starts = {1, 2, 1, 3};
     const Vector<uint32_t> sizes = {1, 1, 1};
     auto* output =
@@ -5066,9 +5137,9 @@
     // Test throwing error when the starting index is equal to or greater than
     // input size in the same dimension.
     Vector<uint32_t> input_shape({3, 4, 5});
-    auto* input =
-        BuildInput(builder, "input", input_shape,
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", input_shape,
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     const Vector<uint32_t> starts = {0, 4, 4};
     const Vector<uint32_t> sizes = {1, 1, 1};
     auto* output =
@@ -5083,9 +5154,9 @@
   {
     // Test throwing error when the number of elements to slice is equal to 0.
     Vector<uint32_t> input_shape({3, 4, 5});
-    auto* input =
-        BuildInput(builder, "input", input_shape,
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", input_shape,
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     const Vector<uint32_t> starts = {1, 2, 3};
     const Vector<uint32_t> sizes = {1, 0, 1};
     auto* output =
@@ -5101,9 +5172,9 @@
     // Test throwing error when the ending index to slice is greater than input
     // size in the same dimension.
     Vector<uint32_t> input_shape({3, 4, 5});
-    auto* input =
-        BuildInput(builder, "input", input_shape,
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", input_shape,
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     const Vector<uint32_t> starts = {0, 1, 2};
     const Vector<uint32_t> sizes = {3, 4, 1};
     auto* output =
@@ -5125,9 +5196,9 @@
                            scope.GetExceptionState());
   {
     // Test building split with default option.
-    auto* input =
-        BuildInput(builder, "input", {2, 6}, V8MLOperandType::Enum::kFloat32,
-                   scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {2, 6},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     const uint32_t splits = 2;
     auto* options = MLSplitOptions::Create();
     auto outputs =
@@ -5136,7 +5207,7 @@
     for (auto output : outputs) {
       EXPECT_NE(output, nullptr);
       EXPECT_EQ(output->Kind(), MLOperand::OperandKind::kOutput);
-      EXPECT_EQ(output->Type(), V8MLOperandType::Enum::kFloat32);
+      EXPECT_EQ(output->DataType(), V8MLOperandDataType::Enum::kFloat32);
       EXPECT_EQ(output->Dimensions(), Vector<uint32_t>({1, 6}));
     }
     auto* split = static_cast<const MLSplitOperator*>(outputs[0]->Operator());
@@ -5149,9 +5220,9 @@
   {
     // Test building split with a sequence of unsigned long splits and with
     // options.axis = 1.
-    auto* input =
-        BuildInput(builder, "input", {2, 6}, V8MLOperandType::Enum::kFloat32,
-                   scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {2, 6},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     const Vector<uint32_t> splits = {1, 2, 3};
     auto* options = MLSplitOptions::Create();
     options->setAxis(1);
@@ -5161,7 +5232,7 @@
     for (uint32_t i = 0; i < outputs.size(); ++i) {
       EXPECT_NE(outputs[i], nullptr);
       EXPECT_EQ(outputs[i]->Kind(), MLOperand::OperandKind::kOutput);
-      EXPECT_EQ(outputs[i]->Type(), V8MLOperandType::Enum::kFloat32);
+      EXPECT_EQ(outputs[i]->DataType(), V8MLOperandDataType::Enum::kFloat32);
       EXPECT_EQ(outputs[i]->Dimensions(), Vector<uint32_t>({2, splits[i]}));
     }
     auto* split = static_cast<const MLSplitOperator*>(outputs[0]->Operator());
@@ -5174,7 +5245,7 @@
   {
     // Test throwing exception when splitting a scalar.
     auto* input =
-        BuildInput(builder, "input", {}, V8MLOperandType::Enum::kFloat32,
+        BuildInput(builder, "input", {}, V8MLOperandDataType::Enum::kFloat32,
                    scope.GetExceptionState());
     const uint32_t splits = 2;
     auto* options = MLSplitOptions::Create();
@@ -5190,9 +5261,9 @@
   }
   {
     // Test throwing exception when axis is larger than input rank.
-    auto* input =
-        BuildInput(builder, "input", {2, 6}, V8MLOperandType::Enum::kFloat32,
-                   scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {2, 6},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     const uint32_t splits = 2;
     auto* options = MLSplitOptions::Create();
     options->setAxis(2);
@@ -5209,9 +5280,9 @@
   {
     // Test throwing exception when axis is larger than input rank when splits
     // parameter is a sequence of unsigned long.
-    auto* input =
-        BuildInput(builder, "input", {2, 6}, V8MLOperandType::Enum::kFloat32,
-                   scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {2, 6},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     const Vector<uint32_t> splits = {1, 2, 3};
     auto* options = MLSplitOptions::Create();
     options->setAxis(2);
@@ -5227,9 +5298,9 @@
   }
   {
     // Test throwing exception when splits is equal to 0.
-    auto* input =
-        BuildInput(builder, "input", {2, 6}, V8MLOperandType::Enum::kFloat32,
-                   scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {2, 6},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     const uint32_t splits = 0;
     auto* options = MLSplitOptions::Create();
     auto outputs =
@@ -5243,9 +5314,9 @@
   {
     // Test throwing exception when the splits (unsigned long) can not evenly
     // divide the dimension size of input along options.axis.
-    auto* input =
-        BuildInput(builder, "input", {2, 5}, V8MLOperandType::Enum::kFloat32,
-                   scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {2, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     const uint32_t splits = 2;
     auto* options = MLSplitOptions::Create();
     options->setAxis(1);
@@ -5261,9 +5332,9 @@
   {
     // Test throwing exception when the sum of splits (sequence of unsigned
     // long) sizes not equal to the dimension size of input along options.axis.
-    auto* input =
-        BuildInput(builder, "input", {2, 6}, V8MLOperandType::Enum::kFloat32,
-                   scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {2, 6},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     const Vector<uint32_t> splits = {2, 2, 3};
     auto* options = MLSplitOptions::Create();
     options->setAxis(1);
@@ -5287,13 +5358,13 @@
   {
     // Test building tanh with float32 input.
     Vector<uint32_t> input_shape({3, 4});
-    auto* input =
-        BuildInput(builder, "input", input_shape,
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", input_shape,
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     auto* output = builder->tanh(input, scope.GetExceptionState());
     EXPECT_NE(output, nullptr);
     EXPECT_EQ(output->Kind(), MLOperand::OperandKind::kOutput);
-    EXPECT_EQ(output->Type(), V8MLOperandType::Enum::kFloat32);
+    EXPECT_EQ(output->DataType(), V8MLOperandDataType::Enum::kFloat32);
     EXPECT_EQ(output->Dimensions(), input_shape);
     const MLOperator* tanh = output->Operator();
     EXPECT_NE(tanh, nullptr);
@@ -5304,15 +5375,15 @@
   {
     // Test throwing exception when building tanh with int32 input.
     Vector<uint32_t> input_shape({3, 4});
-    auto* input =
-        BuildInput(builder, "input", input_shape, V8MLOperandType::Enum::kInt32,
-                   scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", input_shape,
+                             V8MLOperandDataType::Enum::kInt32,
+                             scope.GetExceptionState());
     auto* output = builder->tanh(input, scope.GetExceptionState());
     EXPECT_EQ(output, nullptr);
     EXPECT_EQ(scope.GetExceptionState().CodeAs<DOMExceptionCode>(),
               DOMExceptionCode::kDataError);
     EXPECT_EQ(scope.GetExceptionState().Message(),
-              "The input type must be one of the float32,float16 types.");
+              "The input data type must be one of the float32,float16 types.");
   }
   {
     // Test building tanh operator.
@@ -5332,7 +5403,7 @@
   auto* output = builder->matmul(a, b, scope.GetExceptionState());
   EXPECT_NE(output, nullptr);
   EXPECT_EQ(output->Kind(), MLOperand::OperandKind::kOutput);
-  EXPECT_EQ(output->Type(), a->Type());
+  EXPECT_EQ(output->DataType(), a->DataType());
   auto* matmul = output->Operator();
   EXPECT_NE(matmul, nullptr);
   EXPECT_EQ(matmul->Kind(), MLOperator::OperatorKind::kMatmul);
@@ -5348,9 +5419,9 @@
                            scope.GetExceptionState());
   {
     // Test throwing exception when the rank of input is smaller than 2.
-    auto* a = BuildInput(builder, "a", {2}, V8MLOperandType::Enum::kFloat32,
+    auto* a = BuildInput(builder, "a", {2}, V8MLOperandDataType::Enum::kFloat32,
                          scope.GetExceptionState());
-    auto* b = BuildInput(builder, "b", {2}, V8MLOperandType::Enum::kFloat32,
+    auto* b = BuildInput(builder, "b", {2}, V8MLOperandDataType::Enum::kFloat32,
                          scope.GetExceptionState());
     auto* output = builder->matmul(a, b, scope.GetExceptionState());
     EXPECT_EQ(output, nullptr);
@@ -5361,41 +5432,44 @@
   }
   {
     // Test building matmul with 2-D * 4-D inputs.
-    auto* a = BuildInput(builder, "a", {1, 4}, V8MLOperandType::Enum::kFloat32,
-                         scope.GetExceptionState());
-    auto* b =
-        BuildInput(builder, "b", {2, 2, 4, 2}, V8MLOperandType::Enum::kFloat32,
+    auto* a =
+        BuildInput(builder, "a", {1, 4}, V8MLOperandDataType::Enum::kFloat32,
                    scope.GetExceptionState());
+    auto* b = BuildInput(builder, "b", {2, 2, 4, 2},
+                         V8MLOperandDataType::Enum::kFloat32,
+                         scope.GetExceptionState());
     auto* output = BuildMatmul(scope, builder, a, b);
     EXPECT_EQ(output->Dimensions(), Vector<uint32_t>({2, 2, 1, 2}));
   }
   {
     // Test building matmul with 2-D * 2-D inputs.
-    auto* a = BuildInput(builder, "a", {4, 2}, V8MLOperandType::Enum::kFloat32,
-                         scope.GetExceptionState());
-    auto* b = BuildInput(builder, "b", {2, 3}, V8MLOperandType::Enum::kFloat32,
-                         scope.GetExceptionState());
+    auto* a =
+        BuildInput(builder, "a", {4, 2}, V8MLOperandDataType::Enum::kFloat32,
+                   scope.GetExceptionState());
+    auto* b =
+        BuildInput(builder, "b", {2, 3}, V8MLOperandDataType::Enum::kFloat32,
+                   scope.GetExceptionState());
     auto* output = BuildMatmul(scope, builder, a, b);
     EXPECT_EQ(output->Dimensions(), Vector<uint32_t>({4, 3}));
   }
   {
     // Test building matmul with 3-D * 3-D inputs using broadcast.
     auto* a =
-        BuildInput(builder, "a", {2, 3, 4}, V8MLOperandType::Enum::kFloat32,
+        BuildInput(builder, "a", {2, 3, 4}, V8MLOperandDataType::Enum::kFloat32,
                    scope.GetExceptionState());
     auto* b =
-        BuildInput(builder, "b", {1, 4, 1}, V8MLOperandType::Enum::kFloat32,
+        BuildInput(builder, "b", {1, 4, 1}, V8MLOperandDataType::Enum::kFloat32,
                    scope.GetExceptionState());
     auto* output = BuildMatmul(scope, builder, a, b);
     EXPECT_EQ(output->Dimensions(), Vector<uint32_t>({2, 3, 1}));
   }
   {
     // Test building matmul with 4-D * 3-D inputs using broadcast.
-    auto* a =
-        BuildInput(builder, "a", {2, 2, 3, 4}, V8MLOperandType::Enum::kFloat32,
-                   scope.GetExceptionState());
+    auto* a = BuildInput(builder, "a", {2, 2, 3, 4},
+                         V8MLOperandDataType::Enum::kFloat32,
+                         scope.GetExceptionState());
     auto* b =
-        BuildInput(builder, "b", {1, 4, 5}, V8MLOperandType::Enum::kFloat32,
+        BuildInput(builder, "b", {1, 4, 5}, V8MLOperandDataType::Enum::kFloat32,
                    scope.GetExceptionState());
     auto* output = BuildMatmul(scope, builder, a, b);
     EXPECT_EQ(output->Dimensions(), Vector<uint32_t>({2, 2, 3, 5}));
@@ -5403,35 +5477,40 @@
   {
     // Test building matmul with 3-D * 3-D inputs.
     auto* a =
-        BuildInput(builder, "a", {2, 3, 4}, V8MLOperandType::Enum::kFloat32,
+        BuildInput(builder, "a", {2, 3, 4}, V8MLOperandDataType::Enum::kFloat32,
                    scope.GetExceptionState());
     auto* b =
-        BuildInput(builder, "b", {2, 4, 5}, V8MLOperandType::Enum::kFloat32,
+        BuildInput(builder, "b", {2, 4, 5}, V8MLOperandDataType::Enum::kFloat32,
                    scope.GetExceptionState());
     auto* output = BuildMatmul(scope, builder, a, b);
     EXPECT_EQ(output->Dimensions(), Vector<uint32_t>({2, 3, 5}));
   }
   {
-    // Test throwing exception when the types of first two inputs don't match.
-    auto* a = BuildInput(builder, "a", {2, 3}, V8MLOperandType::Enum::kFloat32,
-                         scope.GetExceptionState());
-    auto* b = BuildInput(builder, "b", {3, 4}, V8MLOperandType::Enum::kInt32,
-                         scope.GetExceptionState());
+    // Test throwing exception when the data types of first two inputs don't
+    // match.
+    auto* a =
+        BuildInput(builder, "a", {2, 3}, V8MLOperandDataType::Enum::kFloat32,
+                   scope.GetExceptionState());
+    auto* b =
+        BuildInput(builder, "b", {3, 4}, V8MLOperandDataType::Enum::kInt32,
+                   scope.GetExceptionState());
     auto* output = builder->matmul(a, b, scope.GetExceptionState());
     ;
     EXPECT_EQ(output, nullptr);
     EXPECT_EQ(scope.GetExceptionState().CodeAs<DOMExceptionCode>(),
               DOMExceptionCode::kDataError);
     EXPECT_EQ(scope.GetExceptionState().Message(),
-              "The types of first two inputs don't match.");
+              "The data types of first two inputs don't match.");
   }
   {
     // Test throwing exception when the number of columns in first matrix
     // mismatches with the number of rows in second matrix.
-    auto* a = BuildInput(builder, "a", {2, 3}, V8MLOperandType::Enum::kFloat32,
-                         scope.GetExceptionState());
-    auto* b = BuildInput(builder, "b", {2, 4}, V8MLOperandType::Enum::kFloat32,
-                         scope.GetExceptionState());
+    auto* a =
+        BuildInput(builder, "a", {2, 3}, V8MLOperandDataType::Enum::kFloat32,
+                   scope.GetExceptionState());
+    auto* b =
+        BuildInput(builder, "b", {2, 4}, V8MLOperandDataType::Enum::kFloat32,
+                   scope.GetExceptionState());
     auto* output = builder->matmul(a, b, scope.GetExceptionState());
     ;
     EXPECT_EQ(output, nullptr);
@@ -5444,10 +5523,10 @@
   {
     // Test throwing exception when the input shapes are not broadcastable.
     auto* a =
-        BuildInput(builder, "a", {3, 3, 4}, V8MLOperandType::Enum::kFloat32,
+        BuildInput(builder, "a", {3, 3, 4}, V8MLOperandDataType::Enum::kFloat32,
                    scope.GetExceptionState());
     auto* b =
-        BuildInput(builder, "b", {2, 4, 1}, V8MLOperandType::Enum::kFloat32,
+        BuildInput(builder, "b", {2, 4, 1}, V8MLOperandDataType::Enum::kFloat32,
                    scope.GetExceptionState());
     auto* output = builder->matmul(a, b, scope.GetExceptionState());
     EXPECT_EQ(output, nullptr);
@@ -5578,9 +5657,9 @@
   }
   {
     // Test throwing exception if the named output is an input operand.
-    auto* input =
-        BuildInput(builder, "input", {3, 4, 5}, V8MLOperandType::Enum::kFloat32,
-                   scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {3, 4, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     auto [graph, exception] = BuildGraph(scope, builder, {{"output", input}});
     EXPECT_NE(exception, nullptr);
     EXPECT_EQ(exception->name(),
@@ -5591,7 +5670,7 @@
   {
     // Test throwing exception if the named output is a constant operand.
     auto* constant =
-        BuildConstant(builder, {3, 4, 5}, V8MLOperandType::Enum::kFloat32,
+        BuildConstant(builder, {3, 4, 5}, V8MLOperandDataType::Enum::kFloat32,
                       scope.GetExceptionState());
     auto [graph, exception] =
         BuildGraph(scope, builder, {{"output", constant}});
@@ -5604,11 +5683,11 @@
   {
     // Test throwing exception if the named outputs is a mix of input and
     // constant operands.
-    auto* input =
-        BuildInput(builder, "input", {3, 4, 5}, V8MLOperandType::Enum::kFloat32,
-                   scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {3, 4, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     auto* constant =
-        BuildConstant(builder, {3, 4, 5}, V8MLOperandType::Enum::kFloat32,
+        BuildConstant(builder, {3, 4, 5}, V8MLOperandDataType::Enum::kFloat32,
                       scope.GetExceptionState());
     auto [graph, exception] =
         BuildGraph(scope, builder, {{"output1", input}, {"output2", constant}});
@@ -5621,10 +5700,10 @@
   {
     // Test throwing exception if two inputs have the same name.
     auto* a =
-        BuildInput(builder, "a", {3, 4, 5}, V8MLOperandType::Enum::kFloat32,
+        BuildInput(builder, "a", {3, 4, 5}, V8MLOperandDataType::Enum::kFloat32,
                    scope.GetExceptionState());
     auto* b =
-        BuildInput(builder, "a", {3, 4, 5}, V8MLOperandType::Enum::kFloat32,
+        BuildInput(builder, "a", {3, 4, 5}, V8MLOperandDataType::Enum::kFloat32,
                    scope.GetExceptionState());
     auto* c = builder->add(a, b, scope.GetExceptionState());
     ASSERT_NE(c, nullptr);
@@ -5645,7 +5724,7 @@
     //    |
     //   [b]
     auto* a =
-        BuildInput(builder, "a", {3, 4, 5}, V8MLOperandType::Enum::kFloat32,
+        BuildInput(builder, "a", {3, 4, 5}, V8MLOperandDataType::Enum::kFloat32,
                    scope.GetExceptionState());
     auto* output = builder->add(a, a, scope.GetExceptionState());
     ASSERT_NE(output, nullptr);
@@ -5653,11 +5732,11 @@
     EXPECT_NE(graph, nullptr);
     const auto& inputs = graph->GetInputResourcesInfo();
     EXPECT_EQ(inputs.size(), static_cast<uint32_t>(1));
-    EXPECT_EQ(inputs.at("a").type, a->Type());
+    EXPECT_EQ(inputs.at("a").data_type, a->DataType());
     EXPECT_EQ(inputs.at("a").byte_length, a->ByteLength());
     const auto& outputs = graph->GetOutputResourcesInfo();
     EXPECT_EQ(outputs.size(), static_cast<uint32_t>(1));
-    EXPECT_EQ(outputs.at("b").type, output->Type());
+    EXPECT_EQ(outputs.at("b").data_type, output->DataType());
     EXPECT_EQ(outputs.at("b").byte_length, output->ByteLength());
   }
   {
@@ -5668,7 +5747,7 @@
     //    |      |
     //   [b]    [c]
     auto* a =
-        BuildInput(builder, "a", {3, 4, 5}, V8MLOperandType::Enum::kFloat32,
+        BuildInput(builder, "a", {3, 4, 5}, V8MLOperandDataType::Enum::kFloat32,
                    scope.GetExceptionState());
     auto* b = builder->relu(a, scope.GetExceptionState());
     ASSERT_NE(b, nullptr);
@@ -5678,48 +5757,51 @@
     EXPECT_NE(graph, nullptr);
     const auto& inputs = graph->GetInputResourcesInfo();
     EXPECT_EQ(inputs.size(), static_cast<uint32_t>(1));
-    EXPECT_EQ(inputs.at("a").type, a->Type());
+    EXPECT_EQ(inputs.at("a").data_type, a->DataType());
     EXPECT_EQ(inputs.at("a").byte_length, a->ByteLength());
     const auto& outputs = graph->GetOutputResourcesInfo();
     EXPECT_EQ(outputs.size(), static_cast<uint32_t>(2));
-    EXPECT_EQ(outputs.at("b").type, b->Type());
+    EXPECT_EQ(outputs.at("b").data_type, b->DataType());
     EXPECT_EQ(outputs.at("b").byte_length, b->ByteLength());
-    EXPECT_EQ(outputs.at("c").type, b->Type());
+    EXPECT_EQ(outputs.at("c").data_type, b->DataType());
     EXPECT_EQ(outputs.at("c").byte_length, b->ByteLength());
   }
   {
     // Test building a fake graph with two inputs, one gemm operation and one
     // output.
-    auto* a = BuildInput(builder, "a", {3, 4}, V8MLOperandType::Enum::kFloat32,
-                         scope.GetExceptionState());
-    auto* b = BuildInput(builder, "b", {4, 3}, V8MLOperandType::Enum::kFloat32,
-                         scope.GetExceptionState());
+    auto* a =
+        BuildInput(builder, "a", {3, 4}, V8MLOperandDataType::Enum::kFloat32,
+                   scope.GetExceptionState());
+    auto* b =
+        BuildInput(builder, "b", {4, 3}, V8MLOperandDataType::Enum::kFloat32,
+                   scope.GetExceptionState());
     auto* c = BuildGemm(scope, builder, a, b);
 
     auto [graph, exception] = BuildGraph(scope, builder, {{"c", c}});
     EXPECT_NE(graph, nullptr);
     const auto& inputs = graph->GetInputResourcesInfo();
     EXPECT_EQ(inputs.size(), static_cast<uint32_t>(2));
-    EXPECT_EQ(inputs.at("a").type, a->Type());
+    EXPECT_EQ(inputs.at("a").data_type, a->DataType());
     EXPECT_EQ(inputs.at("a").byte_length, a->ByteLength());
-    EXPECT_EQ(inputs.at("b").type, b->Type());
+    EXPECT_EQ(inputs.at("b").data_type, b->DataType());
     EXPECT_EQ(inputs.at("b").byte_length, b->ByteLength());
     const auto& outputs = graph->GetOutputResourcesInfo();
     EXPECT_EQ(outputs.size(), static_cast<uint32_t>(1));
-    EXPECT_EQ(outputs.at("c").type, c->Type());
+    EXPECT_EQ(outputs.at("c").data_type, c->DataType());
     EXPECT_EQ(outputs.at("c").byte_length, c->ByteLength());
   }
   {
     // Test building a fake graph with conv2d, add and relu operations.
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 5, 5},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {1, 1, 3, 3}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {1, 1, 3, 3},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* conv2d = BuildConv2d(scope, builder, input, filter);
-    auto* bias = BuildConstant(builder, {1}, V8MLOperandType::Enum::kFloat32,
-                               scope.GetExceptionState());
+    auto* bias =
+        BuildConstant(builder, {1}, V8MLOperandDataType::Enum::kFloat32,
+                      scope.GetExceptionState());
     auto* add = builder->add(conv2d, bias, scope.GetExceptionState());
     ASSERT_NE(add, nullptr);
     auto* output = builder->relu(add, scope.GetExceptionState());
@@ -5729,23 +5811,24 @@
     EXPECT_NE(graph, nullptr);
     const auto& inputs = graph->GetInputResourcesInfo();
     EXPECT_EQ(inputs.size(), static_cast<uint32_t>(1));
-    EXPECT_EQ(inputs.at("input").type, input->Type());
+    EXPECT_EQ(inputs.at("input").data_type, input->DataType());
     EXPECT_EQ(inputs.at("input").byte_length, input->ByteLength());
     const auto& outputs = graph->GetOutputResourcesInfo();
     EXPECT_EQ(outputs.size(), static_cast<uint32_t>(1));
-    EXPECT_EQ(outputs.at("output").type, output->Type());
+    EXPECT_EQ(outputs.at("output").data_type, output->DataType());
     EXPECT_EQ(outputs.at("output").byte_length, output->ByteLength());
   }
   {
     // Testing throwing exception if the ArrayBufferView of a constant operand
     // is detached.
-    auto* a = BuildInput(builder, "a", {3, 4}, V8MLOperandType::Enum::kFloat32,
-                         scope.GetExceptionState());
+    auto* a =
+        BuildInput(builder, "a", {3, 4}, V8MLOperandDataType::Enum::kFloat32,
+                   scope.GetExceptionState());
     auto* desc = MLOperandDescriptor::Create();
     desc->setDimensions({4, 3});
-    desc->setType(V8MLOperandType::Enum::kFloat32);
+    desc->setDataType(V8MLOperandDataType::Enum::kFloat32);
     NotShared<DOMArrayBufferView> buffer_view =
-        CreateDOMArrayBufferView(12, V8MLOperandType::Enum::kFloat32);
+        CreateDOMArrayBufferView(12, V8MLOperandDataType::Enum::kFloat32);
     auto* b = builder->constant(desc, buffer_view, scope.GetExceptionState());
     auto* c = BuildGemm(scope, builder, a, b);
 
@@ -5764,17 +5847,18 @@
 // Helper struct to create an ArrayBufferView for MLNamedArrayBufferViews test.
 struct ArrayBufferViewInfo {
   size_t number_of_elements;
-  V8MLOperandType::Enum type;
+  V8MLOperandDataType::Enum data_type;
 
   NotShared<DOMArrayBufferView> ToArrayBufferView() {
-    return CreateDOMArrayBufferView(number_of_elements, type);
+    return CreateDOMArrayBufferView(number_of_elements, data_type);
   }
 };
 
 // Helper function to create an ArrayBufferView given an operand.
 NotShared<DOMArrayBufferView> CreateArrayBufferViewForOperand(
     const MLOperand* operand) {
-  return CreateDOMArrayBufferView(operand->NumberOfElements(), operand->Type());
+  return CreateDOMArrayBufferView(operand->NumberOfElements(),
+                                  operand->DataType());
 }
 
 TEST_P(FakeMLGraphTest, ComputeTest) {
@@ -5783,10 +5867,12 @@
       CreateMLGraphBuilder(scope.GetExecutionContext(), scope.GetScriptState(),
                            scope.GetExceptionState());
   // Build a fake graph represents computation 'c = a * b';
-  auto* a = BuildInput(builder, "a", {3, 4}, V8MLOperandType::Enum::kFloat32,
-                       scope.GetExceptionState());
-  auto* b = BuildInput(builder, "b", {4, 3}, V8MLOperandType::Enum::kFloat32,
-                       scope.GetExceptionState());
+  auto* a =
+      BuildInput(builder, "a", {3, 4}, V8MLOperandDataType::Enum::kFloat32,
+                 scope.GetExceptionState());
+  auto* b =
+      BuildInput(builder, "b", {4, 3}, V8MLOperandDataType::Enum::kFloat32,
+                 scope.GetExceptionState());
   auto* c = BuildGemm(scope, builder, a, b);
   auto [graph, build_exception] = BuildGraph(scope, builder, {{"c", c}});
   DCHECK_NE(graph, nullptr);
@@ -5885,7 +5971,7 @@
     MLNamedArrayBufferViews inputs;
     inputs.emplace_back(
         "a", ArrayBufferViewInfo{.number_of_elements = 12,
-                                 .type = V8MLOperandType::Enum::kInt32}
+                                 .data_type = V8MLOperandDataType::Enum::kInt32}
                  .ToArrayBufferView());
     inputs.emplace_back("b", CreateArrayBufferViewForOperand(b));
     MLNamedArrayBufferViews outputs;
@@ -5894,17 +5980,19 @@
     EXPECT_NE(exception, nullptr);
     EXPECT_EQ(exception->name(),
               DOMException::GetErrorName(DOMExceptionCode::kDataError));
-    EXPECT_EQ(exception->message(),
-              "Invalid inputs: The type (Int32) of the array buffer view with "
-              "name \"a\" doesn't match the expected operand type (float32).");
+    EXPECT_EQ(
+        exception->message(),
+        "Invalid inputs: The type (Int32) of the array buffer view with "
+        "name \"a\" doesn't match the expected operand data type (float32).");
   }
   {
     // Test throwing exception if the input array buffer view size is wrong.
     MLNamedArrayBufferViews inputs;
     inputs.emplace_back(
-        "a", ArrayBufferViewInfo{.number_of_elements = 10,
-                                 .type = V8MLOperandType::Enum::kFloat32}
-                 .ToArrayBufferView());
+        "a",
+        ArrayBufferViewInfo{.number_of_elements = 10,
+                            .data_type = V8MLOperandDataType::Enum::kFloat32}
+            .ToArrayBufferView());
     inputs.emplace_back("b", CreateArrayBufferViewForOperand(b));
     MLNamedArrayBufferViews outputs;
     outputs.emplace_back("c", CreateArrayBufferViewForOperand(c));
@@ -5924,15 +6012,16 @@
     MLNamedArrayBufferViews outputs;
     outputs.emplace_back(
         "c", ArrayBufferViewInfo{.number_of_elements = 9,
-                                 .type = V8MLOperandType::Enum::kInt32}
+                                 .data_type = V8MLOperandDataType::Enum::kInt32}
                  .ToArrayBufferView());
     auto* exception = ComputeGraph(scope, graph, inputs, outputs);
     EXPECT_NE(exception, nullptr);
     EXPECT_EQ(exception->name(),
               DOMException::GetErrorName(DOMExceptionCode::kDataError));
-    EXPECT_EQ(exception->message(),
-              "Invalid outputs: The type (Int32) of the array buffer view with "
-              "name \"c\" doesn't match the expected operand type (float32).");
+    EXPECT_EQ(
+        exception->message(),
+        "Invalid outputs: The type (Int32) of the array buffer view with "
+        "name \"c\" doesn't match the expected operand data type (float32).");
   }
   {
     // Test throwing exception if the output array buffer view size is wrong.
@@ -5941,9 +6030,10 @@
     inputs.emplace_back("b", CreateArrayBufferViewForOperand(b));
     MLNamedArrayBufferViews outputs;
     outputs.emplace_back(
-        "c", ArrayBufferViewInfo{.number_of_elements = 8,
-                                 .type = V8MLOperandType::Enum::kFloat32}
-                 .ToArrayBufferView());
+        "c",
+        ArrayBufferViewInfo{.number_of_elements = 8,
+                            .data_type = V8MLOperandDataType::Enum::kFloat32}
+            .ToArrayBufferView());
     auto* exception = ComputeGraph(scope, graph, inputs, outputs);
     EXPECT_NE(exception, nullptr);
     EXPECT_EQ(exception->name(),
diff --git a/third_party/blink/renderer/modules/ml/webnn/ml_graph_builder_test.h b/third_party/blink/renderer/modules/ml/webnn/ml_graph_builder_test.h
index 2a4a7f0..224c1eb 100644
--- a/third_party/blink/renderer/modules/ml/webnn/ml_graph_builder_test.h
+++ b/third_party/blink/renderer/modules/ml/webnn/ml_graph_builder_test.h
@@ -13,7 +13,7 @@
 #include "third_party/blink/renderer/bindings/modules/v8/v8_ml_elu_options.h"
 #include "third_party/blink/renderer/bindings/modules/v8/v8_ml_gemm_options.h"
 #include "third_party/blink/renderer/bindings/modules/v8/v8_ml_leaky_relu_options.h"
-#include "third_party/blink/renderer/bindings/modules/v8/v8_ml_operand_type.h"
+#include "third_party/blink/renderer/bindings/modules/v8/v8_ml_operand_data_type.h"
 #include "third_party/blink/renderer/bindings/modules/v8/v8_ml_pad_options.h"
 #include "third_party/blink/renderer/bindings/modules/v8/v8_ml_pool_2d_options.h"
 #include "third_party/blink/renderer/bindings/modules/v8/v8_ml_reduce_options.h"
diff --git a/third_party/blink/renderer/modules/ml/webnn/ml_graph_builder_utils.cc b/third_party/blink/renderer/modules/ml/webnn/ml_graph_builder_utils.cc
index 27e55dd..6072497 100644
--- a/third_party/blink/renderer/modules/ml/webnn/ml_graph_builder_utils.cc
+++ b/third_party/blink/renderer/modules/ml/webnn/ml_graph_builder_utils.cc
@@ -29,47 +29,47 @@
 MLOperand* BuildInput(MLGraphBuilder* builder,
                       const String& name,
                       const Vector<uint32_t>& dimensions,
-                      V8MLOperandType::Enum type,
+                      V8MLOperandDataType::Enum data_type,
                       ExceptionState& exception_state) {
   auto* desc = MLOperandDescriptor::Create();
   desc->setDimensions(dimensions);
-  desc->setType(type);
+  desc->setDataType(data_type);
   return builder->input(name, desc, exception_state);
 }
 
 NotShared<DOMArrayBufferView> CreateDOMArrayBufferView(
     size_t size,
-    V8MLOperandType::Enum type) {
+    V8MLOperandDataType::Enum data_type) {
   NotShared<DOMArrayBufferView> buffer_view;
-  switch (type) {
-    case V8MLOperandType::Enum::kFloat32: {
+  switch (data_type) {
+    case V8MLOperandDataType::Enum::kFloat32: {
       buffer_view = NotShared<DOMArrayBufferView>(
           blink::DOMFloat32Array::CreateOrNull(size));
       break;
     }
-    case V8MLOperandType::Enum::kFloat16: {
+    case V8MLOperandDataType::Enum::kFloat16: {
       // Using Uint16Array for float16 is a workaround of WebNN spec issue:
       // https://github.com/webmachinelearning/webnn/issues/127
       buffer_view = NotShared<DOMArrayBufferView>(
           blink::DOMUint16Array::CreateOrNull(size));
       break;
     }
-    case V8MLOperandType::Enum::kInt32: {
+    case V8MLOperandDataType::Enum::kInt32: {
       buffer_view = NotShared<DOMArrayBufferView>(
           blink::DOMInt32Array::CreateOrNull(size));
       break;
     }
-    case V8MLOperandType::Enum::kUint32: {
+    case V8MLOperandDataType::Enum::kUint32: {
       buffer_view = NotShared<DOMArrayBufferView>(
           blink::DOMUint32Array::CreateOrNull(size));
       break;
     }
-    case V8MLOperandType::Enum::kInt8: {
+    case V8MLOperandDataType::Enum::kInt8: {
       buffer_view = NotShared<DOMArrayBufferView>(
           blink::DOMInt8Array::CreateOrNull(size));
       break;
     }
-    case V8MLOperandType::Enum::kUint8: {
+    case V8MLOperandDataType::Enum::kUint8: {
       buffer_view = NotShared<DOMArrayBufferView>(
           blink::DOMUint8Array::CreateOrNull(size));
       break;
@@ -81,18 +81,18 @@
 MLOperand* BuildConstant(
     MLGraphBuilder* builder,
     const Vector<uint32_t>& dimensions,
-    V8MLOperandType::Enum type,
+    V8MLOperandDataType::Enum data_type,
     ExceptionState& exception_state,
     absl::optional<NotShared<DOMArrayBufferView>> user_buffer_view) {
   auto* desc = MLOperandDescriptor::Create();
   desc->setDimensions(dimensions);
-  desc->setType(type);
+  desc->setDataType(data_type);
   size_t size = std::accumulate(dimensions.begin(), dimensions.end(), size_t(1),
                                 std::multiplies<uint32_t>());
 
   NotShared<DOMArrayBufferView> buffer_view =
       user_buffer_view ? std::move(user_buffer_view.value())
-                       : CreateDOMArrayBufferView(size, type);
+                       : CreateDOMArrayBufferView(size, data_type);
   if (buffer_view.Get() == nullptr) {
     return nullptr;
   }
diff --git a/third_party/blink/renderer/modules/ml/webnn/ml_graph_builder_utils.h b/third_party/blink/renderer/modules/ml/webnn/ml_graph_builder_utils.h
index 3872874b..a8b141a 100644
--- a/third_party/blink/renderer/modules/ml/webnn/ml_graph_builder_utils.h
+++ b/third_party/blink/renderer/modules/ml/webnn/ml_graph_builder_utils.h
@@ -24,17 +24,17 @@
 MLOperand* BuildInput(MLGraphBuilder* builder,
                       const String& name,
                       const Vector<uint32_t>& dimensions,
-                      V8MLOperandType::Enum type,
+                      V8MLOperandDataType::Enum data_type,
                       ExceptionState& exception_state);
 
 NotShared<DOMArrayBufferView> CreateDOMArrayBufferView(
     size_t size,
-    V8MLOperandType::Enum type);
+    V8MLOperandDataType::Enum data_type);
 
 MLOperand* BuildConstant(
     MLGraphBuilder* builder,
     const Vector<uint32_t>& dimensions,
-    V8MLOperandType::Enum type,
+    V8MLOperandDataType::Enum data_type,
     ExceptionState& exception_state,
     absl::optional<NotShared<DOMArrayBufferView>> buffer_view = absl::nullopt);
 
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 f163c5b4..a3c793e6 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
@@ -53,10 +53,10 @@
     auto* builder =
         CreateMLGraphBuilder(scope.GetExecutionContext(),
                              scope.GetScriptState(), scope.GetExceptionState());
-    auto* lhs_operand = BuildInput(builder, "lhs", lhs.dimensions, lhs.type,
-                                   scope.GetExceptionState());
-    auto* rhs_operand = BuildInput(builder, "rhs", rhs.dimensions, rhs.type,
-                                   scope.GetExceptionState());
+    auto* lhs_operand = BuildInput(builder, "lhs", lhs.dimensions,
+                                   lhs.data_type, scope.GetExceptionState());
+    auto* rhs_operand = BuildInput(builder, "rhs", rhs.dimensions,
+                                   rhs.data_type, scope.GetExceptionState());
     auto* output_operand =
         BuildElementWiseBinary(scope, builder, kind, lhs_operand, rhs_operand);
     auto [graph, build_exception] =
@@ -85,10 +85,10 @@
     // scalars.
     ElementWiseBinaryTester<float>{
         .kind = ElementWiseBinaryKind::kAdd,
-        .lhs = {.type = V8MLOperandType::Enum::kFloat32,
+        .lhs = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                 .dimensions = {},
                 .values = {2.0}},
-        .rhs = {.type = V8MLOperandType::Enum::kFloat32,
+        .rhs = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                 .dimensions = {},
                 .values = {3.0}},
         .expected = {5.0}}
@@ -100,10 +100,10 @@
     // tensors, element-wise.
     ElementWiseBinaryTester<float>{
         .kind = ElementWiseBinaryKind::kAdd,
-        .lhs = {.type = V8MLOperandType::Enum::kFloat32,
+        .lhs = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                 .dimensions = {2},
                 .values = {1.0, 2.0}},
-        .rhs = {.type = V8MLOperandType::Enum::kFloat32,
+        .rhs = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                 .dimensions = {2},
                 .values = {3.0, 4.0}},
         .expected = {4.0, 6.0}}
@@ -113,10 +113,10 @@
     // Test element-wise add operator for two 2-D tensors.
     ElementWiseBinaryTester<float>{
         .kind = ElementWiseBinaryKind::kAdd,
-        .lhs = {.type = V8MLOperandType::Enum::kFloat32,
+        .lhs = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                 .dimensions = {2, 2},
                 .values = {1.0, 2.0, 3.0, 4.0}},
-        .rhs = {.type = V8MLOperandType::Enum::kFloat32,
+        .rhs = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                 .dimensions = {2, 2},
                 .values = {5.0, 6.0, 7.0, 8.0}},
         .expected = {6.0, 8.0, 10.0, 12.0}}
@@ -127,10 +127,10 @@
     // tensor.
     ElementWiseBinaryTester<float>{
         .kind = ElementWiseBinaryKind::kAdd,
-        .lhs = {.type = V8MLOperandType::Enum::kFloat32,
+        .lhs = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                 .dimensions = {2, 2},
                 .values = {1.0, 2.0, 3.0, 4.0}},
-        .rhs = {.type = V8MLOperandType::Enum::kFloat32,
+        .rhs = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                 .dimensions = {},
                 .values = {5.0}},
         .expected = {6.0, 7.0, 8.0, 9.0}}
@@ -141,10 +141,10 @@
     // tensor.
     ElementWiseBinaryTester<float>{
         .kind = ElementWiseBinaryKind::kAdd,
-        .lhs = {.type = V8MLOperandType::Enum::kFloat32,
+        .lhs = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                 .dimensions = {2, 2},
                 .values = {1.0, 2.0, 3.0, 4.0}},
-        .rhs = {.type = V8MLOperandType::Enum::kFloat32,
+        .rhs = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                 .dimensions = {2},
                 .values = {5.0, 6.0}},
         .expected = {6.0, 8.0, 8.0, 10.0}}
@@ -155,10 +155,10 @@
     // tensor.
     ElementWiseBinaryTester<float>{
         .kind = ElementWiseBinaryKind::kAdd,
-        .lhs = {.type = V8MLOperandType::Enum::kFloat32,
+        .lhs = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                 .dimensions = {1, 2, 2},
                 .values = {1.0, 2.0, 3.0, 4.0}},
-        .rhs = {.type = V8MLOperandType::Enum::kFloat32,
+        .rhs = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                 .dimensions = {2, 1, 2},
                 .values = {5.0, 6.0, 7.0, 8.0}},
         .expected = {6.0, 8.0, 8.0, 10.0, 8.0, 10.0, 10.0, 12.0}}
@@ -168,10 +168,10 @@
     // Test element-wise add operator for two 4-D tensors
     ElementWiseBinaryTester<float>{
         .kind = ElementWiseBinaryKind::kAdd,
-        .lhs = {.type = V8MLOperandType::Enum::kFloat32,
+        .lhs = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                 .dimensions = {1, 2, 2, 1},
                 .values = {1.0, 2.0, 3.0, 4.0}},
-        .rhs = {.type = V8MLOperandType::Enum::kFloat32,
+        .rhs = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                 .dimensions = {1, 2, 2, 1},
                 .values = {5.0, 6.0, 7.0, 8.0}},
         .expected = {6.0, 8.0, 10.0, 12.0}}
@@ -183,10 +183,10 @@
     // input tensors, element-wise.
     ElementWiseBinaryTester<float>{
         .kind = ElementWiseBinaryKind::kSub,
-        .lhs = {.type = V8MLOperandType::Enum::kFloat32,
+        .lhs = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                 .dimensions = {1, 2, 2, 1},
                 .values = {1.0, 2.0, 3.0, 4.0}},
-        .rhs = {.type = V8MLOperandType::Enum::kFloat32,
+        .rhs = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                 .dimensions = {1, 2, 2, 1},
                 .values = {5.0, 6.0, 7.0, 8.0}},
         .expected = {-4.0, -4.0, -4.0, -4.0}}
@@ -198,10 +198,10 @@
     // input tensors, element-wise.
     ElementWiseBinaryTester<float>{
         .kind = ElementWiseBinaryKind::kMul,
-        .lhs = {.type = V8MLOperandType::Enum::kFloat32,
+        .lhs = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                 .dimensions = {1, 2, 2, 1},
                 .values = {1.0, 2.0, 3.0, 4.0}},
-        .rhs = {.type = V8MLOperandType::Enum::kFloat32,
+        .rhs = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                 .dimensions = {1, 2, 2, 1},
                 .values = {5.0, 6.0, 7.0, 8.0}},
         .expected = {5.0, 12.0, 21.0, 32.0}}
@@ -213,10 +213,10 @@
     // input tensors, element-wise.
     ElementWiseBinaryTester<float>{
         .kind = ElementWiseBinaryKind::kDiv,
-        .lhs = {.type = V8MLOperandType::Enum::kFloat32,
+        .lhs = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                 .dimensions = {1, 2, 2, 1},
                 .values = {3.0, 4.0, 6.0, 8.0}},
-        .rhs = {.type = V8MLOperandType::Enum::kFloat32,
+        .rhs = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                 .dimensions = {1, 2, 2, 1},
                 .values = {1.0, 2.0, 2.0, 2.0}},
         .expected = {3.0, 2.0, 3.0, 4.0}}
@@ -228,10 +228,10 @@
     // tensors, element-wise.
     ElementWiseBinaryTester<float>{
         .kind = ElementWiseBinaryKind::kMin,
-        .lhs = {.type = V8MLOperandType::Enum::kFloat32,
+        .lhs = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                 .dimensions = {1, 2, 2, 1},
                 .values = {1.0, 4.0, 5.0, 8.0}},
-        .rhs = {.type = V8MLOperandType::Enum::kFloat32,
+        .rhs = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                 .dimensions = {1, 2, 2, 1},
                 .values = {2.0, 3.0, 6.0, 7.0}},
         .expected = {1.0, 3.0, 5.0, 7.0}}
@@ -243,10 +243,10 @@
     // tensors, element-wise.
     ElementWiseBinaryTester<float>{
         .kind = ElementWiseBinaryKind::kMax,
-        .lhs = {.type = V8MLOperandType::Enum::kFloat32,
+        .lhs = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                 .dimensions = {1, 2, 2, 1},
                 .values = {1.0, 4.0, 5.0, 8.0}},
-        .rhs = {.type = V8MLOperandType::Enum::kFloat32,
+        .rhs = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                 .dimensions = {1, 2, 2, 1},
                 .values = {2.0, 3.0, 6.0, 7.0}},
         .expected = {2.0, 4.0, 6.0, 8.0}}
@@ -265,9 +265,9 @@
     auto* builder =
         CreateMLGraphBuilder(scope.GetExecutionContext(),
                              scope.GetScriptState(), scope.GetExceptionState());
-    auto* lhs_operand = BuildInput(builder, "lhs", lhs.dimensions, lhs.type,
-                                   scope.GetExceptionState());
-    auto* rhs_operand = BuildConstant(builder, rhs.dimensions, rhs.type,
+    auto* lhs_operand = BuildInput(builder, "lhs", lhs.dimensions,
+                                   lhs.data_type, scope.GetExceptionState());
+    auto* rhs_operand = BuildConstant(builder, rhs.dimensions, rhs.data_type,
                                       rhs.values, scope.GetExceptionState());
     auto* output_operand = BuildElementWiseBinary(
         scope, builder, ElementWiseBinaryKind::kPow, lhs_operand, rhs_operand);
@@ -292,10 +292,10 @@
   MLGraphV8TestingScope scope;
   {
     // Test element-wise pow operator with exponent = 2.
-    PowTester<float>{.lhs = {.type = V8MLOperandType::Enum::kFloat32,
+    PowTester<float>{.lhs = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                              .dimensions = {1, 2, 2, 1},
                              .values = {1.0, 2.0, 3.0, 4.0}},
-                     .rhs = {.type = V8MLOperandType::Enum::kFloat32,
+                     .rhs = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                              .dimensions = {},
                              .values = {2.0}},
                      .expected = {1.0, 4.0, 9.0, 16.0}}
@@ -303,10 +303,10 @@
   }
   {
     // Test element-wise pow operator with exponent = 0.5.
-    PowTester<float>{.lhs = {.type = V8MLOperandType::Enum::kFloat32,
+    PowTester<float>{.lhs = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                              .dimensions = {1, 2, 2, 1},
                              .values = {1.0, 4.0, 9.0, 16.0}},
-                     .rhs = {.type = V8MLOperandType::Enum::kFloat32,
+                     .rhs = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                              .dimensions = {},
                              .values = {0.5}},
                      .expected = {1.0, 2.0, 3.0, 4.0}}
@@ -325,8 +325,9 @@
     auto* builder =
         CreateMLGraphBuilder(scope.GetExecutionContext(),
                              scope.GetScriptState(), scope.GetExceptionState());
-    auto* input_operand = BuildInput(builder, "input", input.dimensions,
-                                     input.type, scope.GetExceptionState());
+    auto* input_operand =
+        BuildInput(builder, "input", input.dimensions, input.data_type,
+                   scope.GetExceptionState());
     MLOperand* output_operand = nullptr;
     switch (kind) {
       case ElementWiseUnaryKind::kAbs:
@@ -404,7 +405,7 @@
     // The expected results should be the absolute value of the input scalar.
     ElementWiseUnaryTester<float>{
         .kind = ElementWiseUnaryKind::kAbs,
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {},
                   .values = {-2.0}},
         .expected = {2.0}}
@@ -416,7 +417,7 @@
     // element-wise.
     ElementWiseUnaryTester<float>{
         .kind = ElementWiseUnaryKind::kAbs,
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {2},
                   .values = {-1.0, -2.0}},
         .expected = {1.0, 2.0}}
@@ -428,7 +429,7 @@
     // element-wise.
     ElementWiseUnaryTester<float>{
         .kind = ElementWiseUnaryKind::kCeil,
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {1, 2},
                   .values = {1.1, -2.2}},
         .expected = {2.0, -2.0}}
@@ -440,7 +441,7 @@
     // element-wise.
     ElementWiseUnaryTester<float>{
         .kind = ElementWiseUnaryKind::kFloor,
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {1, 2, 2},
                   .values = {1.1, -2.2, 3.3, -4.4}},
         .expected = {1.0, -3.0, 3.0, -5.0}}
@@ -452,7 +453,7 @@
     // tensor, element-wise.
     ElementWiseUnaryTester<float>{
         .kind = ElementWiseUnaryKind::kNeg,
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {1, 2, 2, 1},
                   .values = {1.0, -2.0, 3.0, -4.0}},
         .expected = {-1.0, 2.0, -3.0, 4.0}}
@@ -471,10 +472,11 @@
     auto* builder =
         CreateMLGraphBuilder(scope.GetExecutionContext(),
                              scope.GetScriptState(), scope.GetExceptionState());
-    auto* input_operand = BuildInput(builder, "input", input.dimensions,
-                                     input.type, scope.GetExceptionState());
+    auto* input_operand =
+        BuildInput(builder, "input", input.dimensions, input.data_type,
+                   scope.GetExceptionState());
     auto* slope_operand =
-        BuildConstant(builder, slope.dimensions, slope.type, slope.values,
+        BuildConstant(builder, slope.dimensions, slope.data_type, slope.values,
                       scope.GetExceptionState());
     auto* output_operand =
         builder->prelu(input_operand, slope_operand, scope.GetExceptionState());
@@ -502,25 +504,26 @@
   {
     // Test prelu operator with input_shape = {3} and slope_shape =
     // {3}.
-    PReluTester<float>{.input = {.type = V8MLOperandType::Enum::kFloat32,
-                                 .dimensions = {3},
-                                 .values = {1.0, -2.0, 3.0}},
-                       .slope = {.type = V8MLOperandType::Enum::kFloat32,
-                                 .dimensions = {3},
-                                 .values = {1.0, 2.0, 3.0}},
-                       .expected = {1.0, -4.0, 3.0}}
+    PReluTester<float>{
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
+                  .dimensions = {3},
+                  .values = {1.0, -2.0, 3.0}},
+        .slope = {.data_type = V8MLOperandDataType::Enum::kFloat32,
+                  .dimensions = {3},
+                  .values = {1.0, 2.0, 3.0}},
+        .expected = {1.0, -4.0, 3.0}}
         .Test(*this, scope);
   }
   {
     // Test prelu operator with input_shape = {1, 2, 3, 3} and slope_shape = {1,
     // 3}.
     PReluTester<float>{
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {1, 2, 3, 3},
                   .values = {-1.0, -2.0, -3.0, -4.0, -5.0, -6.0, -7.0, -8.0,
                              -9.0, -10.0, -11.0, -12.0, -13.0, -14.0, -15.0,
                              -16.0, -17.0, -18.0}},
-        .slope = {.type = V8MLOperandType::Enum::kFloat32,
+        .slope = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {1, 3},
                   .values = {1.0, 2.0, 3.0}},
         .expected = {-1.0, -4.0, -9.0, -4.0, -10.0, -18.0, -7.0, -16.0, -27.0,
@@ -540,8 +543,9 @@
     auto* builder =
         CreateMLGraphBuilder(scope.GetExecutionContext(),
                              scope.GetScriptState(), scope.GetExceptionState());
-    auto* input_operand = BuildInput(builder, "input", input.dimensions,
-                                     input.type, scope.GetExceptionState());
+    auto* input_operand =
+        BuildInput(builder, "input", input.dimensions, input.data_type,
+                   scope.GetExceptionState());
     auto* output_operand =
         builder->relu(input_operand, scope.GetExceptionState());
     auto [graph, build_exception] =
@@ -568,42 +572,47 @@
     // Test relu operator for 1-D tensor.
     // The expected results should be the result of the rectified linear
     // function, y = max(0, x), applied to the input tensor, element-wise.
-    ReluTester<float>{.input = {.type = V8MLOperandType::Enum::kFloat32,
-                                .dimensions = {2},
-                                .values = {-1.0, 1.0}},
-                      .expected = {0.0, 1.0}}
+    ReluTester<float>{
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
+                  .dimensions = {2},
+                  .values = {-1.0, 1.0}},
+        .expected = {0.0, 1.0}}
         .Test(*this, scope);
   }
   {
     // Test relu operator for 0-D scalar.
-    ReluTester<float>{.input = {.type = V8MLOperandType::Enum::kFloat32,
-                                .dimensions = {},
-                                .values = {-1.0}},
-                      .expected = {0.0}}
+    ReluTester<float>{
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
+                  .dimensions = {},
+                  .values = {-1.0}},
+        .expected = {0.0}}
         .Test(*this, scope);
   }
   {
     // Test relu operator for 2-D tensor.
-    ReluTester<float>{.input = {.type = V8MLOperandType::Enum::kFloat32,
-                                .dimensions = {2, 2},
-                                .values = {-10.0, -0.5, 0.5, 10.0}},
-                      .expected = {0.0, 0.0, 0.5, 10.0}}
+    ReluTester<float>{
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
+                  .dimensions = {2, 2},
+                  .values = {-10.0, -0.5, 0.5, 10.0}},
+        .expected = {0.0, 0.0, 0.5, 10.0}}
         .Test(*this, scope);
   }
   {
     // Test relu operator for 3-D tensor.
-    ReluTester<float>{.input = {.type = V8MLOperandType::Enum::kFloat32,
-                                .dimensions = {1, 2, 2},
-                                .values = {-10.0, -0.5, 0.5, 10.0}},
-                      .expected = {0.0, 0.0, 0.5, 10.0}}
+    ReluTester<float>{
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
+                  .dimensions = {1, 2, 2},
+                  .values = {-10.0, -0.5, 0.5, 10.0}},
+        .expected = {0.0, 0.0, 0.5, 10.0}}
         .Test(*this, scope);
   }
   {
     // Test relu operator for 4-D tensor.
-    ReluTester<float>{.input = {.type = V8MLOperandType::Enum::kFloat32,
-                                .dimensions = {1, 2, 2, 1},
-                                .values = {-10.0, -0.5, 0.5, 10.0}},
-                      .expected = {0.0, 0.0, 0.5, 10.0}}
+    ReluTester<float>{
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
+                  .dimensions = {1, 2, 2, 1},
+                  .values = {-10.0, -0.5, 0.5, 10.0}},
+        .expected = {0.0, 0.0, 0.5, 10.0}}
         .Test(*this, scope);
   }
 }
@@ -620,8 +629,9 @@
     auto* builder =
         CreateMLGraphBuilder(scope.GetExecutionContext(),
                              scope.GetScriptState(), scope.GetExceptionState());
-    auto* input_operand = BuildInput(builder, "input", input.dimensions,
-                                     input.type, scope.GetExceptionState());
+    auto* input_operand =
+        BuildInput(builder, "input", input.dimensions, input.data_type,
+                   scope.GetExceptionState());
     auto* output_operand =
         BuildLeakyRelu(scope, builder, input_operand, options);
     auto [graph, build_exception] =
@@ -648,29 +658,32 @@
   {
     // Test leakyRelu operator with default options.
     auto* options = MLLeakyReluOptions::Create();
-    LeakyReluTester<float>{.input = {.type = V8MLOperandType::Enum::kFloat32,
-                                     .dimensions = {1, 2, 2, 1},
-                                     .values = {10, 5, -100, 0}},
-                           .expected = {10, 5, -1, 0}}
+    LeakyReluTester<float>{
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
+                  .dimensions = {1, 2, 2, 1},
+                  .values = {10, 5, -100, 0}},
+        .expected = {10, 5, -1, 0}}
         .Test(*this, scope, options);
   }
   {
     // Test leakyRelu operator with alpha = 0.2.
     auto* options = MLLeakyReluOptions::Create();
     options->setAlpha(0.2);
-    LeakyReluTester<float>{.input = {.type = V8MLOperandType::Enum::kFloat32,
-                                     .dimensions = {1, 2, 2, 1},
-                                     .values = {10, 5, -100, 0}},
-                           .expected = {10, 5, -20, 0}}
+    LeakyReluTester<float>{
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
+                  .dimensions = {1, 2, 2, 1},
+                  .values = {10, 5, -100, 0}},
+        .expected = {10, 5, -20, 0}}
         .Test(*this, scope, options);
   }
   {
     // Test leakyRelu operator for scalar input.
     auto* options = MLLeakyReluOptions::Create();
-    LeakyReluTester<float>{.input = {.type = V8MLOperandType::Enum::kFloat32,
-                                     .dimensions = {},
-                                     .values = {-100}},
-                           .expected = {-1}}
+    LeakyReluTester<float>{
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
+                  .dimensions = {},
+                  .values = {-100}},
+        .expected = {-1}}
         .Test(*this, scope, options);
   }
 }
@@ -687,8 +700,9 @@
     auto* builder =
         CreateMLGraphBuilder(scope.GetExecutionContext(),
                              scope.GetScriptState(), scope.GetExceptionState());
-    auto* input_operand = BuildInput(builder, "input", input.dimensions,
-                                     input.type, scope.GetExceptionState());
+    auto* input_operand =
+        BuildInput(builder, "input", input.dimensions, input.data_type,
+                   scope.GetExceptionState());
     auto* output_operand =
         BuildReduce(scope, builder, kind, input_operand, options);
     auto [graph, build_exception] =
@@ -714,22 +728,24 @@
   {
     // Test reduceMean operator with default options.
     auto* options = MLReduceOptions::Create();
-    ReduceTester<float>{.kind = ReduceKind::kMean,
-                        .input = {.type = V8MLOperandType::Enum::kFloat32,
-                                  .dimensions = {1, 2, 2, 1},
-                                  .values = {1.0, 2.0, 3.0, 4.0}},
-                        .expected = {2.5}}
+    ReduceTester<float>{
+        .kind = ReduceKind::kMean,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
+                  .dimensions = {1, 2, 2, 1},
+                  .values = {1.0, 2.0, 3.0, 4.0}},
+        .expected = {2.5}}
         .Test(*this, scope, options);
   }
   {
     // Test reduceMean operator with axes = {1}.
     auto* options = MLReduceOptions::Create();
     options->setAxes({1});
-    ReduceTester<float>{.kind = ReduceKind::kMean,
-                        .input = {.type = V8MLOperandType::Enum::kFloat32,
-                                  .dimensions = {2, 2},
-                                  .values = {1.0, 2.0, 3.0, 4.0}},
-                        .expected = {1.5, 3.5}}
+    ReduceTester<float>{
+        .kind = ReduceKind::kMean,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
+                  .dimensions = {2, 2},
+                  .values = {1.0, 2.0, 3.0, 4.0}},
+        .expected = {1.5, 3.5}}
         .Test(*this, scope, options);
   }
 }
@@ -746,8 +762,9 @@
     auto* builder =
         CreateMLGraphBuilder(scope.GetExecutionContext(),
                              scope.GetScriptState(), scope.GetExceptionState());
-    auto* input_operand = BuildInput(builder, "input", input.dimensions,
-                                     input.type, scope.GetExceptionState());
+    auto* input_operand =
+        BuildInput(builder, "input", input.dimensions, input.data_type,
+                   scope.GetExceptionState());
     auto* output_operand =
         BuildResample2d(scope, builder, input_operand, options);
     auto [graph, build_exception] =
@@ -778,7 +795,7 @@
     options->setAxes({1, 2});
     options->setMode(V8MLInterpolationMode::Enum::kLinear);
     Resample2dTester<float>{
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {1, 2, 2, 1},
                   .values = {1, 2, 3, 4}},
         .expected = {1., 1.25, 1.75, 2., 1.5, 1.75, 2.25, 2.5, 2.5, 2.75, 3.25,
@@ -792,7 +809,7 @@
     options->setAxes({1, 2});
     options->setMode(V8MLInterpolationMode::Enum::kLinear);
     Resample2dTester<float>{
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {1, 2, 2, 1},
                   .values = {1, 2, 3, 4}},
         .expected = {1., 1.25, 1.75, 2., 1.5, 1.75, 2.25, 2.5, 2.5, 2.75, 3.25,
@@ -813,8 +830,9 @@
     auto* builder =
         CreateMLGraphBuilder(scope.GetExecutionContext(),
                              scope.GetScriptState(), scope.GetExceptionState());
-    auto* input_operand = BuildInput(builder, "input", input.dimensions,
-                                     input.type, scope.GetExceptionState());
+    auto* input_operand =
+        BuildInput(builder, "input", input.dimensions, input.data_type,
+                   scope.GetExceptionState());
     auto* output_operand =
         builder->clamp(input_operand, options, scope.GetExceptionState());
     auto [graph, build_exception] =
@@ -841,30 +859,33 @@
   {
     // Test clamp operator with default options that no minimum and maximum
     // values are defined.
-    ClampTester<float>{.input = {.type = V8MLOperandType::Enum::kFloat32,
-                                 .dimensions = {1, 2, 2, 1},
-                                 .values = {-10.0, -0.5, 0.5, 10.0}},
-                       .expected = {-10.0, -0.5, 0.5, 10.0}}
+    ClampTester<float>{
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
+                  .dimensions = {1, 2, 2, 1},
+                  .values = {-10.0, -0.5, 0.5, 10.0}},
+        .expected = {-10.0, -0.5, 0.5, 10.0}}
         .Test(*this, scope);
   }
   {
     // Test clamp operator with the minimum value defined.
     MLClampOptions* options = MLClampOptions::Create();
     options->setMinValue(0.0);
-    ClampTester<float>{.input = {.type = V8MLOperandType::Enum::kFloat32,
-                                 .dimensions = {1, 2, 2, 1},
-                                 .values = {-10.0, -0.5, 0.5, 10.0}},
-                       .expected = {0.0, 0.0, 0.5, 10.0}}
+    ClampTester<float>{
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
+                  .dimensions = {1, 2, 2, 1},
+                  .values = {-10.0, -0.5, 0.5, 10.0}},
+        .expected = {0.0, 0.0, 0.5, 10.0}}
         .Test(*this, scope, options);
   }
   {
     // Test clamp operator with the maximum value defined.
     MLClampOptions* options = MLClampOptions::Create();
     options->setMaxValue(6.0);
-    ClampTester<float>{.input = {.type = V8MLOperandType::Enum::kFloat32,
-                                 .dimensions = {1, 2, 2, 1},
-                                 .values = {-10.0, -0.5, 0.5, 10.0}},
-                       .expected = {-10.0, -0.5, 0.5, 6.0}}
+    ClampTester<float>{
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
+                  .dimensions = {1, 2, 2, 1},
+                  .values = {-10.0, -0.5, 0.5, 10.0}},
+        .expected = {-10.0, -0.5, 0.5, 6.0}}
         .Test(*this, scope, options);
   }
   {
@@ -872,10 +893,11 @@
     MLClampOptions* options = MLClampOptions::Create();
     options->setMinValue(0.0);
     options->setMaxValue(6.0);
-    ClampTester<float>{.input = {.type = V8MLOperandType::Enum::kFloat32,
-                                 .dimensions = {1, 2, 2, 1},
-                                 .values = {-10.0, -0.5, 0.5, 10.0}},
-                       .expected = {0.0, 0.0, 0.5, 6.0}}
+    ClampTester<float>{
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
+                  .dimensions = {1, 2, 2, 1},
+                  .values = {-10.0, -0.5, 0.5, 10.0}},
+        .expected = {0.0, 0.0, 0.5, 6.0}}
         .Test(*this, scope, options);
   }
   {
@@ -883,10 +905,11 @@
     MLClampOptions* options = MLClampOptions::Create();
     options->setMinValue(0.0);
     options->setMaxValue(6.0);
-    ClampTester<float>{.input = {.type = V8MLOperandType::Enum::kFloat32,
-                                 .dimensions = {},
-                                 .values = {10.0}},
-                       .expected = {6.0}}
+    ClampTester<float>{
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
+                  .dimensions = {},
+                  .values = {10.0}},
+        .expected = {6.0}}
         .Test(*this, scope, options);
   }
 }
@@ -903,15 +926,16 @@
             MLGraphBuilder* builder,
             MLConv2dOptions* options = MLConv2dOptions::Create()) {
     // Build the graph.
-    auto* input_operand = BuildInput(builder, "input", input.dimensions,
-                                     input.type, scope.GetExceptionState());
+    auto* input_operand =
+        BuildInput(builder, "input", input.dimensions, input.data_type,
+                   scope.GetExceptionState());
     auto* filter_operand =
-        BuildConstant(builder, filter.dimensions, filter.type, filter.values,
-                      scope.GetExceptionState());
+        BuildConstant(builder, filter.dimensions, filter.data_type,
+                      filter.values, scope.GetExceptionState());
     if (bias) {
-      options->setBias(BuildConstant(builder, bias.value().dimensions,
-                                     bias.value().type, bias.value().values,
-                                     scope.GetExceptionState()));
+      options->setBias(BuildConstant(
+          builder, bias.value().dimensions, bias.value().data_type,
+          bias.value().values, scope.GetExceptionState()));
     }
     auto* output_operand =
         BuildConv2d(scope, builder, input_operand, filter_operand, options);
@@ -945,11 +969,11 @@
     options->setInputLayout(V8MLInputOperandLayout::Enum::kNhwc);
     options->setFilterLayout(V8MLConv2dFilterOperandLayout::Enum::kOhwi);
     Conv2dTester<float>{
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {1, 2, 3, 3},
                   .values = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0,
                              11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0}},
-        .filter = {.type = V8MLOperandType::Enum::kFloat32,
+        .filter = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                    .dimensions = {3, 1, 1, 3},
                    .values = {1.0, 4.0, 7.0, 2.0, 5.0, 8.0, 3.0, 6.0, 9.0}},
         .expected = {30.0, 36.0, 42.0, 66.0, 81.0, 96.0, 102.0, 126.0, 150.0,
@@ -965,16 +989,17 @@
     options->setFilterLayout(V8MLConv2dFilterOperandLayout::Enum::kOhwi);
     options->setActivation(builder->relu(scope.GetExceptionState()));
     Conv2dTester<float>{
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {1, 2, 3, 3},
                   .values = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0,
                              11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0}},
-        .filter = {.type = V8MLOperandType::Enum::kFloat32,
+        .filter = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                    .dimensions = {3, 1, 1, 3},
                    .values = {1.0, 4.0, 7.0, 2.0, 5.0, 8.0, 3.0, 6.0, 9.0}},
-        .bias = OperandInfo<float>{.type = V8MLOperandType::Enum::kFloat32,
-                                   .dimensions = {3},
-                                   .values = {-6000.0, -7000.0, 8000.0}},
+        .bias =
+            OperandInfo<float>{.data_type = V8MLOperandDataType::Enum::kFloat32,
+                               .dimensions = {3},
+                               .values = {-6000.0, -7000.0, 8000.0}},
         .expected = {0.0, 0.0, 8042.0, 0.0, 0.0, 8096.0, 0.0, 0.0, 8150.0, 0.0,
                      0.0, 8204.0, 0.0, 0.0, 8258.0, 0.0, 0.0, 8312.0}}
         .Test(*this, scope, builder, options);
@@ -987,11 +1012,11 @@
     options->setFilterLayout(V8MLConv2dFilterOperandLayout::Enum::kIhwo);
     options->setGroups(4);
     Conv2dTester<float>{
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {1, 2, 2, 4},
                   .values = {10.0, 21.0, 10.0, 0.0, 10.0, 22.0, 20.0, 0.0, 10.0,
                              23.0, 30.0, 0.0, 10.0, 24.0, 40.0, 0.0}},
-        .filter = {.type = V8MLOperandType::Enum::kFloat32,
+        .filter = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                    .dimensions = {1, 2, 2, 4},
                    .values = {0.25, 0.0, 10.0, 50.0, 0.25, 1.0, 20.0, 50.0,
                               0.25, 0.0, 30.0, 50.0, 0.25, 1.0, 40.0, 50.0}},
@@ -1008,16 +1033,16 @@
     options->setGroups(4);
     options->setActivation(builder->relu(scope.GetExceptionState()));
     Conv2dTester<float>{
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {1, 2, 2, 4},
                   .values = {10.0, 21.0, 10.0, 0.0, 10.0, 22.0, 20.0, 0.0, 10.0,
                              23.0, 30.0, 0.0, 10.0, 24.0, 40.0, 0.0}},
-        .filter = {.type = V8MLOperandType::Enum::kFloat32,
+        .filter = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                    .dimensions = {1, 2, 2, 4},
                    .values = {0.25, 0.0, 10.0, 50.0, 0.25, 1.0, 20.0, 50.0,
                               0.25, 0.0, 30.0, 50.0, 0.25, 1.0, 40.0, 50.0}},
         .bias =
-            OperandInfo<float>{.type = V8MLOperandType::Enum::kFloat32,
+            OperandInfo<float>{.data_type = V8MLOperandDataType::Enum::kFloat32,
                                .dimensions = {4},
                                .values = {-6000.0, -7000.0, 8000.0, 9000.0}},
         .expected = {0.0, 0.0, 11000.0, 9000.0}}
@@ -1037,16 +1062,16 @@
     options->setActivation(
         builder->clamp(clamp_options, scope.GetExceptionState()));
     Conv2dTester<float>{
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {1, 2, 2, 4},
                   .values = {10.0, 21.0, 10.0, 0.0, 10.0, 22.0, 20.0, 0.0, 10.0,
                              23.0, 30.0, 0.0, 10.0, 24.0, 40.0, 0.0}},
-        .filter = {.type = V8MLOperandType::Enum::kFloat32,
+        .filter = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                    .dimensions = {1, 2, 2, 4},
                    .values = {0.25, 0.0, 10.0, 50.0, 0.25, 1.0, 20.0, 50.0,
                               0.25, 0.0, 30.0, 50.0, 0.25, 1.0, 40.0, 50.0}},
         .bias =
-            OperandInfo<float>{.type = V8MLOperandType::Enum::kFloat32,
+            OperandInfo<float>{.data_type = V8MLOperandDataType::Enum::kFloat32,
                                .dimensions = {4},
                                .values = {-6000.0, -7000.0, 8000.0, 9000.0}},
         .expected = {0.0, 0.0, 6.0, 6.0}}
@@ -1067,15 +1092,16 @@
       MLGraphBuilder* builder,
       MLConvTranspose2dOptions* options = MLConvTranspose2dOptions::Create()) {
     // Build the graph.
-    auto* input_operand = BuildInput(builder, "input", input.dimensions,
-                                     input.type, scope.GetExceptionState());
+    auto* input_operand =
+        BuildInput(builder, "input", input.dimensions, input.data_type,
+                   scope.GetExceptionState());
     auto* filter_operand =
-        BuildConstant(builder, filter.dimensions, filter.type, filter.values,
-                      scope.GetExceptionState());
+        BuildConstant(builder, filter.dimensions, filter.data_type,
+                      filter.values, scope.GetExceptionState());
     if (bias) {
-      options->setBias(BuildConstant(builder, bias.value().dimensions,
-                                     bias.value().type, bias.value().values,
-                                     scope.GetExceptionState()));
+      options->setBias(BuildConstant(
+          builder, bias.value().dimensions, bias.value().data_type,
+          bias.value().values, scope.GetExceptionState()));
     }
     auto* output_operand = BuildConvTranspose2d(scope, builder, input_operand,
                                                 filter_operand, options);
@@ -1111,10 +1137,10 @@
     options->setFilterLayout(
         V8MLConvTranspose2dFilterOperandLayout::Enum::kOhwi);
     ConvTranspose2dTester<float>{
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {1, 3, 3, 1},
                   .values = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0}},
-        .filter = {.type = V8MLOperandType::Enum::kFloat32,
+        .filter = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                    .dimensions = {1, 3, 3, 1},
                    .values = {1.0, 3.0, 5.0, 7.0, 9.0, 2.0, 4.0, 6.0, 8.0}},
         .expected = {1.0,  5.0,   14.0,  19.0,  15.0,  11.0,  40.0,
@@ -1132,17 +1158,18 @@
         V8MLConvTranspose2dFilterOperandLayout::Enum::kOhwi);
     options->setActivation(builder->relu(scope.GetExceptionState()));
     ConvTranspose2dTester<float>{
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {1, 3, 3, 1},
                   .values = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0}},
-        .filter = {.type = V8MLOperandType::Enum::kFloat32,
+        .filter = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                    .dimensions = {3, 3, 3, 1},
                    .values = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0,
                               9.0, 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0,
                               1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0}},
-        .bias = OperandInfo<float>{.type = V8MLOperandType::Enum::kFloat32,
-                                   .dimensions = {3},
-                                   .values = {-6000.0, -7000.0, 8000.0}},
+        .bias =
+            OperandInfo<float>{.data_type = V8MLOperandDataType::Enum::kFloat32,
+                               .dimensions = {3},
+                               .values = {-6000.0, -7000.0, 8000.0}},
         .expected = {0.0, 0.0, 8001.0, 0.0, 0.0, 8004.0, 0.0, 0.0, 8010.0,
                      0.0, 0.0, 8012.0, 0.0, 0.0, 8009.0, 0.0, 0.0, 8008.0,
                      0.0, 0.0, 8026.0, 0.0, 0.0, 8056.0, 0.0, 0.0, 8054.0,
@@ -1162,12 +1189,12 @@
         V8MLConvTranspose2dFilterOperandLayout::Enum::kOhwi);
     options->setPadding({1, 1, 1, 1});
     ConvTranspose2dTester<float>{
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {1, 5, 5, 1},
                   .values = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0,
                              1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0,
                              1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0}},
-        .filter = {.type = V8MLOperandType::Enum::kFloat32,
+        .filter = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                    .dimensions = {1, 3, 3, 1},
                    .values = {1.0, 3.0, 5.0, 7.0, 9.0, 2.0, 4.0, 6.0, 8.0}},
         .expected = {48.0,  100.0, 127.0, 145.0, 101.0, 126.0, 186.0,
@@ -1185,10 +1212,10 @@
     options->setStrides({2, 2});
     options->setPadding({1, 1, 1, 1});
     ConvTranspose2dTester<float>{
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {1, 3, 3, 1},
                   .values = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0}},
-        .filter = {.type = V8MLOperandType::Enum::kFloat32,
+        .filter = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                    .dimensions = {1, 3, 3, 1},
                    .values = {1.0, 3.0, 5.0, 7.0, 9.0, 2.0, 4.0, 6.0, 8.0}},
         .expected = {9.0,   16.0, 18.0, 25.0, 27.0, 18.0, 41.0, 27.0, 59.0,
@@ -1205,10 +1232,10 @@
     options->setStrides({2, 2});
     options->setOutputSizes({8, 8});
     ConvTranspose2dTester<float>{
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {1, 3, 3, 1},
                   .values = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0}},
-        .filter = {.type = V8MLOperandType::Enum::kFloat32,
+        .filter = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                    .dimensions = {1, 3, 3, 1},
                    .values = {1.0, 3.0, 5.0, 7.0, 9.0, 2.0, 4.0, 6.0, 8.0}},
         .expected = {1.0,  3.0,  7.0,  6.0,  13.0,  9.0,  15.0, 0.0,
@@ -1235,13 +1262,14 @@
             MLGraphBuilder* builder,
             MLGemmOptions* options = MLGemmOptions::Create()) {
     // Build the graph.
-    auto* a_operand = BuildInput(builder, "input", a.dimensions, a.type,
+    auto* a_operand = BuildInput(builder, "input", a.dimensions, a.data_type,
                                  scope.GetExceptionState());
-    auto* b_operand = BuildConstant(builder, b.dimensions, b.type, b.values,
-                                    scope.GetExceptionState());
+    auto* b_operand = BuildConstant(builder, b.dimensions, b.data_type,
+                                    b.values, scope.GetExceptionState());
     if (c) {
-      options->setC(BuildConstant(builder, c.value().dimensions, c.value().type,
-                                  c.value().values, scope.GetExceptionState()));
+      options->setC(BuildConstant(builder, c.value().dimensions,
+                                  c.value().data_type, c.value().values,
+                                  scope.GetExceptionState()));
     }
     auto* output_operand =
         BuildGemm(scope, builder, a_operand, b_operand, options);
@@ -1269,10 +1297,10 @@
                            scope.GetExceptionState());
   {
     // Test gemm operator without operand c.
-    GemmTester<float>{.a = {.type = V8MLOperandType::Enum::kFloat32,
+    GemmTester<float>{.a = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                             .dimensions = {2, 2},
                             .values = {1.0, 2.0, 2.0, 1.0}},
-                      .b = {.type = V8MLOperandType::Enum::kFloat32,
+                      .b = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                             .dimensions = {2, 1},
                             .values = {2.0, 4.0}},
                       .expected = {10.0, 8.0}}
@@ -1281,15 +1309,16 @@
   {
     // Test gemm operator with operand c.
     GemmTester<float>{
-        .a = {.type = V8MLOperandType::Enum::kFloat32,
+        .a = {.data_type = V8MLOperandDataType::Enum::kFloat32,
               .dimensions = {2, 2},
               .values = {1.0, 2.0, 2.0, 1.0}},
-        .b = {.type = V8MLOperandType::Enum::kFloat32,
+        .b = {.data_type = V8MLOperandDataType::Enum::kFloat32,
               .dimensions = {2, 1},
               .values = {2.0, 4.0}},
-        .c = OperandInfo<float>{.type = V8MLOperandType::Enum::kFloat32,
-                                .dimensions = {1},
-                                .values = {1.0}},
+        .c =
+            OperandInfo<float>{.data_type = V8MLOperandDataType::Enum::kFloat32,
+                               .dimensions = {1},
+                               .values = {1.0}},
         .expected = {11.0, 9.0}}
         .Test(*this, scope, builder);
   }
@@ -1298,15 +1327,16 @@
     auto* options = MLGemmOptions::Create();
     options->setBTranspose(true);
     GemmTester<float>{
-        .a = {.type = V8MLOperandType::Enum::kFloat32,
+        .a = {.data_type = V8MLOperandDataType::Enum::kFloat32,
               .dimensions = {2, 2},
               .values = {1.0, 2.0, 2.0, 1.0}},
-        .b = {.type = V8MLOperandType::Enum::kFloat32,
+        .b = {.data_type = V8MLOperandDataType::Enum::kFloat32,
               .dimensions = {1, 2},
               .values = {2.0, 4.0}},
-        .c = OperandInfo<float>{.type = V8MLOperandType::Enum::kFloat32,
-                                .dimensions = {1},
-                                .values = {1.0}},
+        .c =
+            OperandInfo<float>{.data_type = V8MLOperandDataType::Enum::kFloat32,
+                               .dimensions = {1},
+                               .values = {1.0}},
         .expected = {11.0, 9.0}}
         .Test(*this, scope, builder, options);
   }
@@ -1321,8 +1351,9 @@
     auto* builder =
         CreateMLGraphBuilder(scope.GetExecutionContext(),
                              scope.GetScriptState(), scope.GetExceptionState());
-    auto* input_operand = BuildInput(builder, "input", input.dimensions,
-                                     input.type, scope.GetExceptionState());
+    auto* input_operand =
+        BuildInput(builder, "input", input.dimensions, input.data_type,
+                   scope.GetExceptionState());
     auto* output_operand =
         builder->hardSwish(input_operand, scope.GetExceptionState());
     auto [graph, build_exception] =
@@ -1354,7 +1385,7 @@
     // The expected results should be the result of the nonlinear function, y
     // = x * max(0, min(6, (x + 3))) / 6, applied to the input tensor,
     // element-wise.
-    HardSwishTester{.input = {.type = V8MLOperandType::Enum::kFloat32,
+    HardSwishTester{.input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                               .dimensions = {2},
                               .values = {-0.6, 0.6}},
                     .expected = {-0.24, 0.36}}
@@ -1362,7 +1393,7 @@
   }
   {
     // Test hardSwish operator for 0-D scalar.
-    HardSwishTester{.input = {.type = V8MLOperandType::Enum::kFloat32,
+    HardSwishTester{.input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                               .dimensions = {},
                               .values = {0.6}},
                     .expected = {0.36}}
@@ -1370,7 +1401,7 @@
   }
   {
     // Test hardSwish operator for 2-D tensor.
-    HardSwishTester{.input = {.type = V8MLOperandType::Enum::kFloat32,
+    HardSwishTester{.input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                               .dimensions = {2, 2},
                               .values = {-1.2, -0.6, 0.6, 1.2}},
                     .expected = {-0.36, -0.24, 0.36, 0.84}}
@@ -1378,7 +1409,7 @@
   }
   {
     // Test hardSwish operator for 3-D tensor.
-    HardSwishTester{.input = {.type = V8MLOperandType::Enum::kFloat32,
+    HardSwishTester{.input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                               .dimensions = {1, 2, 2},
                               .values = {-1.2, -0.6, 0.6, 1.2}},
                     .expected = {-0.36, -0.24, 0.36, 0.84}}
@@ -1386,7 +1417,7 @@
   }
   {
     // Test hardSwish operator for 4-D tensor.
-    HardSwishTester{.input = {.type = V8MLOperandType::Enum::kFloat32,
+    HardSwishTester{.input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                               .dimensions = {1, 2, 2, 1},
                               .values = {-1.2, -0.6, 0.6, 1.2}},
                     .expected = {-0.36, -0.24, 0.36, 0.84}}
@@ -1406,8 +1437,9 @@
     auto* builder =
         CreateMLGraphBuilder(scope.GetExecutionContext(),
                              scope.GetScriptState(), scope.GetExceptionState());
-    auto* input_operand = BuildInput(builder, "input", input.dimensions,
-                                     input.type, scope.GetExceptionState());
+    auto* input_operand =
+        BuildInput(builder, "input", input.dimensions, input.data_type,
+                   scope.GetExceptionState());
     auto* output_operand =
         BuildPool2d(scope, builder, kind, input_operand, options);
     auto [graph, build_exception] =
@@ -1437,7 +1469,7 @@
     options->setWindowDimensions({3, 3});
     Pool2dTester<float>{
         .kind = Pool2dKind::kAverage,
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {1, 4, 4, 1},
                   .values = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0,
                              11.0, 12.0, 13.0, 14.0, 15.0, 16.0}},
@@ -1450,7 +1482,7 @@
     options->setLayout(V8MLInputOperandLayout::Enum::kNhwc);
     Pool2dTester<float>{
         .kind = Pool2dKind::kAverage,
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {1, 4, 4, 1},
                   .values = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0,
                              11.0, 12.0, 13.0, 14.0, 15.0, 16.0}},
@@ -1464,7 +1496,7 @@
     options->setWindowDimensions({3, 3});
     Pool2dTester<float>{
         .kind = Pool2dKind::kMax,
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {1, 4, 4, 1},
                   .values = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0,
                              11.0, 12.0, 13.0, 14.0, 15.0, 16.0}},
@@ -1486,8 +1518,9 @@
     auto* builder =
         CreateMLGraphBuilder(scope.GetExecutionContext(),
                              scope.GetScriptState(), scope.GetExceptionState());
-    auto* input_operand = BuildInput(builder, "input", input.dimensions,
-                                     input.type, scope.GetExceptionState());
+    auto* input_operand =
+        BuildInput(builder, "input", input.dimensions, input.data_type,
+                   scope.GetExceptionState());
     auto* output_operand =
         builder->reshape(input_operand, new_shape, scope.GetExceptionState());
     EXPECT_EQ(output_operand->Dimensions(), expected_output_shape);
@@ -1513,56 +1546,62 @@
   MLGraphV8TestingScope scope;
   {
     // Test reshaping 1-D 1-element tensor to 0-D scalar.
-    ReshapeTester<float>{.input = {.type = V8MLOperandType::Enum::kFloat32,
-                                   .dimensions = {1},
-                                   .values = {1.0}},
-                         .new_shape = {},
-                         .expected_output_shape = {}}
+    ReshapeTester<float>{
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
+                  .dimensions = {1},
+                  .values = {1.0}},
+        .new_shape = {},
+        .expected_output_shape = {}}
         .Test(*this, scope);
   }
   {
     // Test reshaping 0-D scalar to 1-D 1-element tensor.
-    ReshapeTester<float>{.input = {.type = V8MLOperandType::Enum::kFloat32,
-                                   .dimensions = {},
-                                   .values = {1.0}},
-                         .new_shape = {1},
-                         .expected_output_shape = {1}}
+    ReshapeTester<float>{
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
+                  .dimensions = {},
+                  .values = {1.0}},
+        .new_shape = {1},
+        .expected_output_shape = {1}}
         .Test(*this, scope);
   }
   {
     // Test reshaping 2-D tensor to 1-D tensor.
-    ReshapeTester<float>{.input = {.type = V8MLOperandType::Enum::kFloat32,
-                                   .dimensions = {2, 2},
-                                   .values = {-10.0, -0.5, 0.5, 10.0}},
-                         .new_shape = {4},
-                         .expected_output_shape = {4}}
+    ReshapeTester<float>{
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
+                  .dimensions = {2, 2},
+                  .values = {-10.0, -0.5, 0.5, 10.0}},
+        .new_shape = {4},
+        .expected_output_shape = {4}}
         .Test(*this, scope);
   }
   {
     // Test reshaping from 2-D tensor to 1-D tensor with calculated dimension.
-    ReshapeTester<float>{.input = {.type = V8MLOperandType::Enum::kFloat32,
-                                   .dimensions = {2, 2},
-                                   .values = {-10.0, -0.5, 0.5, 10.0}},
-                         .new_shape = {absl::nullopt},
-                         .expected_output_shape = {4}}
+    ReshapeTester<float>{
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
+                  .dimensions = {2, 2},
+                  .values = {-10.0, -0.5, 0.5, 10.0}},
+        .new_shape = {absl::nullopt},
+        .expected_output_shape = {4}}
         .Test(*this, scope);
   }
   {
     // Test reshaping from 4-D tensor to 2-D tensor.
-    ReshapeTester<float>{.input = {.type = V8MLOperandType::Enum::kFloat32,
-                                   .dimensions = {1, 2, 2, 1},
-                                   .values = {-10.0, -0.5, 0.5, 10.0}},
-                         .new_shape = {1, 4},
-                         .expected_output_shape = {1, 4}}
+    ReshapeTester<float>{
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
+                  .dimensions = {1, 2, 2, 1},
+                  .values = {-10.0, -0.5, 0.5, 10.0}},
+        .new_shape = {1, 4},
+        .expected_output_shape = {1, 4}}
         .Test(*this, scope);
   }
   {
     // Test reshaping from 4-D tensor to 2-D tensor with calculated dimension.
-    ReshapeTester<float>{.input = {.type = V8MLOperandType::Enum::kFloat32,
-                                   .dimensions = {1, 2, 2, 1},
-                                   .values = {-10.0, -0.5, 0.5, 10.0}},
-                         .new_shape = {1, absl::nullopt},
-                         .expected_output_shape = {1, 4}}
+    ReshapeTester<float>{
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
+                  .dimensions = {1, 2, 2, 1},
+                  .values = {-10.0, -0.5, 0.5, 10.0}},
+        .new_shape = {1, absl::nullopt},
+        .expected_output_shape = {1, 4}}
         .Test(*this, scope);
   }
 }
@@ -1577,8 +1616,9 @@
             V8TestingScope& scope,
             MLGraphBuilder* builder,
             MLSplitOptions* options = MLSplitOptions::Create()) {
-    auto* input_operand = BuildInput(builder, "input", input.dimensions,
-                                     input.type, scope.GetExceptionState());
+    auto* input_operand =
+        BuildInput(builder, "input", input.dimensions, input.data_type,
+                   scope.GetExceptionState());
     auto output_operands = builder->split(input_operand, splits, options,
                                           scope.GetExceptionState());
     MLNamedOperands named_operands;
@@ -1621,7 +1661,7 @@
     // Test split operator with default options.
     auto* options = MLSplitOptions::Create();
     SplitTester<float, uint32_t>{
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {2, 2},
                   .values = {0.0, 1.0, 2.0, 3.0}},
         .splits = 2u,
@@ -1633,7 +1673,7 @@
     auto* options = MLSplitOptions::Create();
     options->setAxis(1);
     SplitTester<float, uint32_t>{
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {2, 4},
                   .values = {0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0}},
         .splits = 2u,
@@ -1645,7 +1685,7 @@
     // unsigned long.
     auto* options = MLSplitOptions::Create();
     SplitTester<float, Vector<uint32_t>>{
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {2, 2},
                   .values = {0.0, 1.0, 2.0, 3.0}},
         .splits = {1, 1},
@@ -1658,7 +1698,7 @@
     auto* options = MLSplitOptions::Create();
     options->setAxis(1);
     SplitTester<float, Vector<uint32_t>>{
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {2, 4},
                   .values = {0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0}},
         .splits = {1, 2, 1},
@@ -1676,8 +1716,9 @@
             V8TestingScope& scope,
             MLGraphBuilder* builder,
             MLTransposeOptions* options = MLTransposeOptions::Create()) {
-    auto* input_operand = BuildInput(builder, "input", input.dimensions,
-                                     input.type, scope.GetExceptionState());
+    auto* input_operand =
+        BuildInput(builder, "input", input.dimensions, input.data_type,
+                   scope.GetExceptionState());
     auto* output_operand =
         BuildTranspose(scope, builder, input_operand, options);
     auto [graph, build_exception] =
@@ -1707,7 +1748,7 @@
     // Test transpose operator with default options.
     auto* options = MLTransposeOptions::Create();
     TransposeTester<float>{
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {2, 3, 4},
                   .values =
                       {
@@ -1726,7 +1767,7 @@
     auto* options = MLTransposeOptions::Create();
     options->setPermutation({{0, 2, 1}});
     TransposeTester<float>{
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {2, 3, 4},
                   .values =
                       {
@@ -1759,7 +1800,7 @@
     for (uint32_t i = 0; i < inputs.size(); ++i) {
       input_operands.push_back(BuildInput(
           builder, input_str + String::Number(i), inputs[i].dimensions,
-          inputs[i].type, scope.GetExceptionState()));
+          inputs[i].data_type, scope.GetExceptionState()));
     }
     auto* output_operand =
         builder->concat(input_operands, axis, scope.GetExceptionState());
@@ -1791,21 +1832,22 @@
   V8TestingScope scope;
   {
     // Test concat operator with one input and axis = 0.
-    ConcatTester<float>{.inputs = {{.type = V8MLOperandType::Enum::kFloat32,
-                                    .dimensions = {2, 2},
-                                    .values = {1., 2., 3., 4.}}},
-                        .axis = 0,
-                        .expected_output_shape = {2, 2},
-                        .expected_output_data = {1., 2., 3., 4.}}
+    ConcatTester<float>{
+        .inputs = {{.data_type = V8MLOperandDataType::Enum::kFloat32,
+                    .dimensions = {2, 2},
+                    .values = {1., 2., 3., 4.}}},
+        .axis = 0,
+        .expected_output_shape = {2, 2},
+        .expected_output_data = {1., 2., 3., 4.}}
         .Test(*this, scope);
   }
   {
     // Test concat operator with two inputs and axis = 0.
     ConcatTester<float>{
-        .inputs = {{.type = V8MLOperandType::Enum::kFloat32,
+        .inputs = {{.data_type = V8MLOperandDataType::Enum::kFloat32,
                     .dimensions = {2, 2},
                     .values = {1., 2., 3., 4.}},
-                   {.type = V8MLOperandType::Enum::kFloat32,
+                   {.data_type = V8MLOperandDataType::Enum::kFloat32,
                     .dimensions = {2, 2},
                     .values = {1., 2., 3., 4.}}},
         .axis = 0,
@@ -1816,10 +1858,10 @@
   {
     // Test concat operator with two inputs and axis = 1;
     ConcatTester<float>{
-        .inputs = {{.type = V8MLOperandType::Enum::kFloat32,
+        .inputs = {{.data_type = V8MLOperandDataType::Enum::kFloat32,
                     .dimensions = {2, 2},
                     .values = {1., 2., 3., 4.}},
-                   {.type = V8MLOperandType::Enum::kFloat32,
+                   {.data_type = V8MLOperandDataType::Enum::kFloat32,
                     .dimensions = {2, 2},
                     .values = {1., 2., 3., 4.}}},
         .axis = 1,
@@ -1829,34 +1871,35 @@
   }
   {
     // Test concat operator with three inputs and axis = 0.
-    ConcatTester<float>{.inputs = {{.type = V8MLOperandType::Enum::kFloat32,
-                                    .dimensions = {1, 2},
-                                    .values = {1., 2.}},
-                                   {.type = V8MLOperandType::Enum::kFloat32,
-                                    .dimensions = {2, 2},
-                                    .values = {1., 2., 3., 4.}},
-                                   {.type = V8MLOperandType::Enum::kFloat32,
-                                    .dimensions = {3, 2},
-                                    .values = {1., 2., 3., 4., 5., 6.}}},
-                        .axis = 0,
-                        .expected_output_shape = {6, 2},
-                        .expected_output_data = {1., 2., 1., 2., 3., 4., 1., 2.,
-                                                 3., 4., 5., 6.}}
+    ConcatTester<float>{
+        .inputs = {{.data_type = V8MLOperandDataType::Enum::kFloat32,
+                    .dimensions = {1, 2},
+                    .values = {1., 2.}},
+                   {.data_type = V8MLOperandDataType::Enum::kFloat32,
+                    .dimensions = {2, 2},
+                    .values = {1., 2., 3., 4.}},
+                   {.data_type = V8MLOperandDataType::Enum::kFloat32,
+                    .dimensions = {3, 2},
+                    .values = {1., 2., 3., 4., 5., 6.}}},
+        .axis = 0,
+        .expected_output_shape = {6, 2},
+        .expected_output_data = {1., 2., 1., 2., 3., 4., 1., 2., 3., 4., 5.,
+                                 6.}}
         .Test(*this, scope);
   }
   {
     // Test concat operator with four inputs and axis = 2.
     ConcatTester<float>{
-        .inputs = {{.type = V8MLOperandType::Enum::kFloat32,
+        .inputs = {{.data_type = V8MLOperandDataType::Enum::kFloat32,
                     .dimensions = {1, 2, 1},
                     .values = {1., 2.}},
-                   {.type = V8MLOperandType::Enum::kFloat32,
+                   {.data_type = V8MLOperandDataType::Enum::kFloat32,
                     .dimensions = {1, 2, 2},
                     .values = {1., 2., 3., 4.}},
-                   {.type = V8MLOperandType::Enum::kFloat32,
+                   {.data_type = V8MLOperandDataType::Enum::kFloat32,
                     .dimensions = {1, 2, 3},
                     .values = {1., 2., 3., 4., 5., 6.}},
-                   {.type = V8MLOperandType::Enum::kFloat32,
+                   {.data_type = V8MLOperandDataType::Enum::kFloat32,
                     .dimensions = {1, 2, 4},
                     .values = {1., 2., 3., 4., 5., 6., 7., 8.}}},
         .axis = 2,
@@ -1879,8 +1922,9 @@
             V8TestingScope& scope,
             MLGraphBuilder* builder,
             MLPadOptions* options = MLPadOptions::Create()) {
-    auto* input_operand = BuildInput(builder, "input", input.dimensions,
-                                     input.type, scope.GetExceptionState());
+    auto* input_operand =
+        BuildInput(builder, "input", input.dimensions, input.data_type,
+                   scope.GetExceptionState());
     auto* output_operand = BuildPad(scope, builder, input_operand,
                                     beginning_padding, ending_padding, options);
     auto [graph, build_exception] =
@@ -1910,7 +1954,7 @@
     // Test pad operator with default options.
     auto* options = MLPadOptions::Create();
     PadTester<float>{
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {2, 3},
                   .values = {1, 2, 3, 4, 5, 6}},
         .beginning_padding = {1, 2},
@@ -1924,7 +1968,7 @@
     auto* options = MLPadOptions::Create();
     options->setValue(8);
     PadTester<float>{
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {2, 3},
                   .values = {1, 2, 3, 4, 5, 6}},
         .beginning_padding = {1, 2},
@@ -1945,8 +1989,9 @@
   void Test(MLGraphTest& helper,
             V8TestingScope& scope,
             MLGraphBuilder* builder) {
-    auto* input_operand = BuildInput(builder, "input", input.dimensions,
-                                     input.type, scope.GetExceptionState());
+    auto* input_operand =
+        BuildInput(builder, "input", input.dimensions, input.data_type,
+                   scope.GetExceptionState());
     auto* output_operand =
         builder->slice(input_operand, starts, sizes, scope.GetExceptionState());
     auto [graph, build_exception] =
@@ -1976,7 +2021,7 @@
     // Test slice with input_shape = {3, 4, 5}, starts = {0, 0, 1} and sizes =
     // {2, 3, 4}.
     SliceTester<float>{
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {3, 4, 5},
                   .values = {1,  4,  4,  -6, -3, -1, 7,  3,  1,  -8, 1,  -1,
                              -2, -3, 6,  7,  6,  1,  -5, -7, 1,  1,  5,  3,
diff --git a/third_party/blink/renderer/modules/ml/webnn/ml_graph_test_base.h b/third_party/blink/renderer/modules/ml/webnn/ml_graph_test_base.h
index eddd748..91a803c 100644
--- a/third_party/blink/renderer/modules/ml/webnn/ml_graph_test_base.h
+++ b/third_party/blink/renderer/modules/ml/webnn/ml_graph_test_base.h
@@ -106,7 +106,7 @@
 
 template <typename T>
 struct OperandInfo {
-  V8MLOperandType::Enum type;
+  V8MLOperandDataType::Enum data_type;
   Vector<uint32_t> dimensions;
   Vector<T> values;
 };
@@ -145,15 +145,15 @@
 template <typename T>
 MLOperand* BuildConstant(MLGraphBuilder* builder,
                          const Vector<uint32_t>& dimensions,
-                         V8MLOperandType::Enum type,
+                         V8MLOperandDataType::Enum data_type,
                          const Vector<T>& values,
                          ExceptionState& exception_state) {
   size_t buffer_size = std::accumulate(dimensions.begin(), dimensions.end(),
                                        size_t(1), std::multiplies<uint32_t>());
-  auto buffer = CreateDOMArrayBufferView(buffer_size, type);
+  auto buffer = CreateDOMArrayBufferView(buffer_size, data_type);
   DCHECK_EQ(buffer->byteLength(), values.size() * sizeof(T));
   memcpy(buffer->BaseAddress(), values.data(), buffer->byteLength());
-  return BuildConstant(builder, dimensions, type, exception_state, buffer);
+  return BuildConstant(builder, dimensions, data_type, exception_state, buffer);
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/ml/webnn/ml_graph_test_cros.cc b/third_party/blink/renderer/modules/ml/webnn/ml_graph_test_cros.cc
index dfa4b96..d2d0f4eb 100644
--- a/third_party/blink/renderer/modules/ml/webnn/ml_graph_test_cros.cc
+++ b/third_party/blink/renderer/modules/ml/webnn/ml_graph_test_cros.cc
@@ -244,13 +244,13 @@
     auto* builder =
         CreateMLGraphBuilder(scope.GetExecutionContext(),
                              scope.GetScriptState(), scope.GetExceptionState());
-    auto* input = BuildInput(builder, "input", lhs.dimensions, lhs.type,
+    auto* input = BuildInput(builder, "input", lhs.dimensions, lhs.data_type,
                              scope.GetExceptionState());
-    auto* constant = BuildConstant(builder, rhs.dimensions, rhs.type,
+    auto* constant = BuildConstant(builder, rhs.dimensions, rhs.data_type,
                                    rhs.values, scope.GetExceptionState());
     auto* output = BuildElementWiseBinary(
         scope, builder, ElementWiseBinaryKind::kAdd, input, constant);
-    EXPECT_EQ(output->Type(), expected.type);
+    EXPECT_EQ(output->DataType(), expected.data_type);
     auto [graph, exception] =
         helper.BuildGraph(scope, builder, {{"output", output}});
     EXPECT_NE(graph, nullptr);
@@ -297,14 +297,14 @@
     // A list of all tflite |Tensor| used in this model.
     Vector<flatbuffers::Offset<tflite::Tensor>> tensors;
     // Create tflite |Tensor| for constant tensor.
-    CHECK(lhs.type == V8MLOperandType::Enum::kFloat32);
+    CHECK(lhs.data_type == V8MLOperandDataType::Enum::kFloat32);
     uint32_t lhs_buffer_index = 0;
     tensors.emplace_back(tflite::CreateTensor(
         builder,
         builder.CreateVector<int32_t>(ConvertDimensions(lhs.dimensions)), type,
         lhs_buffer_index, builder.CreateString("input")));
     // Create tflite |Tensor| for input tensor.
-    CHECK(rhs.type == V8MLOperandType::Enum::kFloat32);
+    CHECK(rhs.data_type == V8MLOperandDataType::Enum::kFloat32);
     uint32_t rhs_buffer_index = 1;
     tensors.emplace_back(tflite::CreateTensor(
         builder,
@@ -358,13 +358,13 @@
   {
     // Test element-wise add operator for two 1-D tensors.
     ElementWiseAddTester<float>{
-        .lhs = {.type = V8MLOperandType::Enum::kFloat32,
+        .lhs = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                 .dimensions = {2},
                 .values = {1.0, 2.0}},
-        .rhs = {.type = V8MLOperandType::Enum::kFloat32,
+        .rhs = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                 .dimensions = {2},
                 .values = {3.0, 4.0}},
-        .expected = {.type = V8MLOperandType::Enum::kFloat32,
+        .expected = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                      .dimensions = {2},
                      .values = {4.0, 6.0}}}
         .Test(*this, scope);
@@ -373,13 +373,13 @@
     // Test element-wise add operator for 1-D tensor broadcasting to 2-D
     // tensor.
     ElementWiseAddTester<float>{
-        .lhs = {.type = V8MLOperandType::Enum::kFloat32,
+        .lhs = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                 .dimensions = {2, 2},
                 .values = {1.0, 2.0, 3.0, 4.0}},
-        .rhs = {.type = V8MLOperandType::Enum::kFloat32,
+        .rhs = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                 .dimensions = {2},
                 .values = {5.0, 6.0}},
-        .expected = {.type = V8MLOperandType::Enum::kFloat32,
+        .expected = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                      .dimensions = {2, 2},
                      .values = {6.0, 8.0, 8.0, 10.0}}}
         .Test(*this, scope);
diff --git a/third_party/blink/renderer/modules/ml/webnn/ml_graph_test_mojo.cc b/third_party/blink/renderer/modules/ml/webnn/ml_graph_test_mojo.cc
index ccea9fc..1e196854 100644
--- a/third_party/blink/renderer/modules/ml/webnn/ml_graph_test_mojo.cc
+++ b/third_party/blink/renderer/modules/ml/webnn/ml_graph_test_mojo.cc
@@ -201,10 +201,10 @@
   }
 
   auto* lhs_operand =
-      BuildInput(builder, "lhs", {3, 4, 5}, V8MLOperandType::Enum::kFloat32,
+      BuildInput(builder, "lhs", {3, 4, 5}, V8MLOperandDataType::Enum::kFloat32,
                  scope.GetExceptionState());
   auto* rhs_operand =
-      BuildInput(builder, "rhs", {3, 4, 5}, V8MLOperandType::Enum::kFloat32,
+      BuildInput(builder, "rhs", {3, 4, 5}, V8MLOperandDataType::Enum::kFloat32,
                  scope.GetExceptionState());
   auto* output =
       builder->add(lhs_operand, rhs_operand, scope.GetExceptionState());
@@ -214,7 +214,7 @@
 }
 
 struct OperandInfoMojo {
-  blink_mojom::Operand::DataType type;
+  blink_mojom::Operand::DataType data_type;
   Vector<uint32_t> dimensions;
 };
 
@@ -275,8 +275,9 @@
             V8TestingScope& scope,
             MLGraphBuilder* builder) {
     // Build the graph.
-    auto* input_operand = BuildInput(builder, "input", input.dimensions,
-                                     input.type, scope.GetExceptionState());
+    auto* input_operand =
+        BuildInput(builder, "input", input.dimensions, input.data_type,
+                   scope.GetExceptionState());
     MLClampOptions* ml_clamp_options = MLClampOptions::Create();
     if (options.min_value) {
       ml_clamp_options->setMinValue(options.min_value.value());
@@ -303,7 +304,8 @@
     auto output_operand_iter =
         graph_info->id_to_operand_map.find(output_operand_id);
     ASSERT_TRUE(output_operand_iter != graph_info->id_to_operand_map.end());
-    EXPECT_EQ(output_operand_iter->value->data_type, expected_operand.type);
+    EXPECT_EQ(output_operand_iter->value->data_type,
+              expected_operand.data_type);
     EXPECT_EQ(output_operand_iter->value->dimensions,
               expected_operand.dimensions);
   }
@@ -325,9 +327,10 @@
     // Test clamp operator with default options that no minimum and maximum
     // values are defined.
     ClampTester{
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {1, 2, 2, 1}},
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kFloat32,
+        .expected_operand = {.data_type =
+                                 blink_mojom::Operand::DataType::kFloat32,
                              .dimensions = {1, 2, 2, 1}},
         .expected_attributes = {.min_value =
                                     -std::numeric_limits<float>::infinity(),
@@ -338,10 +341,11 @@
   {
     // Test clamp operator with the minimum value defined.
     ClampTester{
-        .input = {.type = V8MLOperandType::Enum::kFloat16,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat16,
                   .dimensions = {2, 4}},
         .options = {0.0, absl::nullopt},
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kFloat16,
+        .expected_operand = {.data_type =
+                                 blink_mojom::Operand::DataType::kFloat16,
                              .dimensions = {2, 4}},
         .expected_attributes = {.min_value = 0.0,
                                 .max_value =
@@ -351,10 +355,11 @@
   {
     // Test clamp operator with the maximum value defined.
     ClampTester{
-        .input = {.type = V8MLOperandType::Enum::kInt32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kInt32,
                   .dimensions = {3, 1, 6}},
         .options = {absl::nullopt, 6.0},
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kInt32,
+        .expected_operand = {.data_type =
+                                 blink_mojom::Operand::DataType::kInt32,
                              .dimensions = {3, 1, 6}},
         .expected_attributes = {.min_value =
                                     -std::numeric_limits<float>::infinity(),
@@ -363,22 +368,24 @@
   }
   {
     // Test clamp operator with both the minimum and maximum values defined.
-    ClampTester{
-        .input = {.type = V8MLOperandType::Enum::kUint8, .dimensions = {7}},
-        .options = {0.0, 6.0},
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kUint8,
-                             .dimensions = {7}},
-        .expected_attributes = {.min_value = 0.0, .max_value = 6.0}}
+    ClampTester{.input = {.data_type = V8MLOperandDataType::Enum::kUint8,
+                          .dimensions = {7}},
+                .options = {0.0, 6.0},
+                .expected_operand = {.data_type =
+                                         blink_mojom::Operand::DataType::kUint8,
+                                     .dimensions = {7}},
+                .expected_attributes = {.min_value = 0.0, .max_value = 6.0}}
         .Test(*this, scope, builder);
   }
   {
     // Test clamp operator with scalar.
-    ClampTester{
-        .input = {.type = V8MLOperandType::Enum::kUint8, .dimensions = {}},
-        .options = {0.0, 6.0},
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kUint8,
-                             .dimensions = {}},
-        .expected_attributes = {.min_value = 0.0, .max_value = 6.0}}
+    ClampTester{.input = {.data_type = V8MLOperandDataType::Enum::kUint8,
+                          .dimensions = {}},
+                .options = {0.0, 6.0},
+                .expected_operand = {.data_type =
+                                         blink_mojom::Operand::DataType::kUint8,
+                                     .dimensions = {}},
+                .expected_attributes = {.min_value = 0.0, .max_value = 6.0}}
         .Test(*this, scope, builder);
   }
 }
@@ -395,9 +402,9 @@
     HeapVector<Member<MLOperand>> input_operands;
     input_operands.reserve(inputs.size());
     for (wtf_size_t i = 0; i < inputs.size(); ++i) {
-      input_operands.push_back(BuildInput(builder, String::Format("input%u", i),
-                                          inputs[i].dimensions, inputs[i].type,
-                                          scope.GetExceptionState()));
+      input_operands.push_back(BuildInput(
+          builder, String::Format("input%u", i), inputs[i].dimensions,
+          inputs[i].data_type, scope.GetExceptionState()));
     }
     auto* output_operand =
         builder->concat(input_operands, axis, scope.GetExceptionState());
@@ -421,7 +428,8 @@
       auto input_operand_iter =
           graph_info->id_to_operand_map.find(input_operand_id);
       ASSERT_TRUE(input_operand_iter != graph_info->id_to_operand_map.end());
-      EXPECT_EQ(input_operand_iter->value->data_type, expected_operand.type);
+      EXPECT_EQ(input_operand_iter->value->data_type,
+                expected_operand.data_type);
       EXPECT_EQ(input_operand_iter->value->dimensions, inputs[i].dimensions);
     }
 
@@ -431,7 +439,8 @@
     auto output_operand_iter =
         graph_info->id_to_operand_map.find(output_operand_id);
     ASSERT_TRUE(output_operand_iter != graph_info->id_to_operand_map.end());
-    EXPECT_EQ(output_operand_iter->value->data_type, expected_operand.type);
+    EXPECT_EQ(output_operand_iter->value->data_type,
+              expected_operand.data_type);
     EXPECT_EQ(output_operand_iter->value->dimensions,
               expected_operand.dimensions);
   }
@@ -451,46 +460,51 @@
   {
     // Test concat operator with one input.
     ConcatTester{
-        .inputs = {{.type = V8MLOperandType::Enum::kFloat32,
+        .inputs = {{.data_type = V8MLOperandDataType::Enum::kFloat32,
                     .dimensions = {3, 1, 5, 6}}},
         .axis = 2,
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kFloat32,
+        .expected_operand = {.data_type =
+                                 blink_mojom::Operand::DataType::kFloat32,
                              .dimensions = {3, 1, 5, 6}}}
         .Test(*this, scope, builder);
   }
   {
     // Test concat operator with two inputs.
     ConcatTester{
-        .inputs = {{.type = V8MLOperandType::Enum::kFloat16,
+        .inputs = {{.data_type = V8MLOperandDataType::Enum::kFloat16,
                     .dimensions = {3, 1, 5, 6}},
-                   {.type = V8MLOperandType::Enum::kFloat16,
+                   {.data_type = V8MLOperandDataType::Enum::kFloat16,
                     .dimensions = {3, 2, 5, 6}}},
         .axis = 1,
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kFloat16,
+        .expected_operand = {.data_type =
+                                 blink_mojom::Operand::DataType::kFloat16,
                              .dimensions = {3, 3, 5, 6}}}
         .Test(*this, scope, builder);
   }
   {
     // Test concat operator with three inputs.
     ConcatTester{
-        .inputs = {{.type = V8MLOperandType::Enum::kInt32,
+        .inputs = {{.data_type = V8MLOperandDataType::Enum::kInt32,
                     .dimensions = {3, 4, 1, 5}},
-                   {.type = V8MLOperandType::Enum::kInt32,
+                   {.data_type = V8MLOperandDataType::Enum::kInt32,
                     .dimensions = {3, 4, 2, 5}},
-                   {.type = V8MLOperandType::Enum::kInt32,
+                   {.data_type = V8MLOperandDataType::Enum::kInt32,
                     .dimensions = {3, 4, 3, 5}}},
         .axis = 2,
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kInt32,
+        .expected_operand = {.data_type =
+                                 blink_mojom::Operand::DataType::kInt32,
                              .dimensions = {3, 4, 6, 5}}}
         .Test(*this, scope, builder);
   }
   {
     // Test concat operator with two 1-D inputs.
     ConcatTester{
-        .inputs = {{.type = V8MLOperandType::Enum::kInt8, .dimensions = {1}},
-                   {.type = V8MLOperandType::Enum::kInt8, .dimensions = {1}}},
+        .inputs = {{.data_type = V8MLOperandDataType::Enum::kInt8,
+                    .dimensions = {1}},
+                   {.data_type = V8MLOperandDataType::Enum::kInt8,
+                    .dimensions = {1}}},
         .axis = 0,
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kInt8,
+        .expected_operand = {.data_type = blink_mojom::Operand::DataType::kInt8,
                              .dimensions = {2}}}
         .Test(*this, scope, builder);
   }
@@ -536,10 +550,12 @@
             V8TestingScope& scope,
             MLGraphBuilder* builder) {
     // Build the graph.
-    auto* input_operand = BuildInput(builder, "input", input.dimensions,
-                                     input.type, scope.GetExceptionState());
-    auto* filter_operand = BuildInput(builder, "filter", filter.dimensions,
-                                      filter.type, scope.GetExceptionState());
+    auto* input_operand =
+        BuildInput(builder, "input", input.dimensions, input.data_type,
+                   scope.GetExceptionState());
+    auto* filter_operand =
+        BuildInput(builder, "filter", filter.dimensions, filter.data_type,
+                   scope.GetExceptionState());
     MLConv2dOptions* ml_conv2d_options = MLConv2dOptions::Create();
     if (options.padding) {
       ml_conv2d_options->setPadding(options.padding.value());
@@ -565,7 +581,7 @@
     if (options.bias) {
       ml_conv2d_options->setBias(
           BuildInput(builder, "bias", options.bias->dimensions,
-                     options.bias->type, scope.GetExceptionState()));
+                     options.bias->data_type, scope.GetExceptionState()));
     }
     if (options.activation) {
       switch (options.activation->kind) {
@@ -650,7 +666,7 @@
           graph_info->id_to_operand_map.find(conv2d->bias_operand_id.value());
       ASSERT_TRUE(bias_operand_iter != graph_info->id_to_operand_map.end());
       EXPECT_EQ(bias_operand_iter->value->data_type,
-                expected_attributes.bias->type);
+                expected_attributes.bias->data_type);
       EXPECT_EQ(bias_operand_iter->value->dimensions,
                 expected_attributes.bias->dimensions);
     }
@@ -704,7 +720,8 @@
     auto output_operand_iter =
         graph_info->id_to_operand_map.find(output_operand_id);
     ASSERT_TRUE(output_operand_iter != graph_info->id_to_operand_map.end());
-    EXPECT_EQ(output_operand_iter->value->data_type, expected_operand.type);
+    EXPECT_EQ(output_operand_iter->value->data_type,
+              expected_operand.data_type);
     EXPECT_EQ(output_operand_iter->value->dimensions,
               expected_operand.dimensions);
   }
@@ -725,11 +742,12 @@
   {
     // Test conv2d with default options.
     Conv2dTester{
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {1, 1, 5, 5}},
-        .filter = {.type = V8MLOperandType::Enum::kFloat32,
+        .filter = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                    .dimensions = {1, 1, 3, 3}},
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kFloat32,
+        .expected_operand = {.data_type =
+                                 blink_mojom::Operand::DataType::kFloat32,
                              .dimensions = {1, 1, 3, 3}},
         .expected_attributes = {.padding = {0, 0, 0, 0},
                                 .strides = {1, 1},
@@ -740,12 +758,13 @@
   {
     // Test conv2d with autoPad="same-upper".
     Conv2dTester{
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {1, 1, 5, 5}},
-        .filter = {.type = V8MLOperandType::Enum::kFloat32,
+        .filter = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                    .dimensions = {1, 1, 3, 3}},
         .options = {.auto_pad = V8MLAutoPad::Enum::kSameUpper},
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kFloat32,
+        .expected_operand = {.data_type =
+                                 blink_mojom::Operand::DataType::kFloat32,
                              .dimensions = {1, 1, 5, 5}},
         .expected_attributes = {.padding = {1, 1, 1, 1},
                                 .strides = {1, 1},
@@ -756,12 +775,13 @@
   {
     // Test conv2d with autoPad="same-lower".
     Conv2dTester{
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {1, 1, 5, 5}},
-        .filter = {.type = V8MLOperandType::Enum::kFloat32,
+        .filter = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                    .dimensions = {1, 1, 3, 3}},
         .options = {.auto_pad = V8MLAutoPad::Enum::kSameLower},
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kFloat32,
+        .expected_operand = {.data_type =
+                                 blink_mojom::Operand::DataType::kFloat32,
                              .dimensions = {1, 1, 5, 5}},
         .expected_attributes = {.padding = {1, 1, 1, 1},
                                 .strides = {1, 1},
@@ -772,13 +792,14 @@
   {
     // Test conv2d with strides=2 and padding=1.
     Conv2dTester{
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {1, 1, 5, 5}},
-        .filter = {.type = V8MLOperandType::Enum::kFloat32,
+        .filter = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                    .dimensions = {1, 1, 3, 3}},
         .options = {.padding = Vector<uint32_t>({1, 1, 1, 1}),
                     .strides = Vector<uint32_t>({2, 2})},
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kFloat32,
+        .expected_operand = {.data_type =
+                                 blink_mojom::Operand::DataType::kFloat32,
                              .dimensions = {1, 1, 3, 3}},
         .expected_attributes = {.padding = {1, 1, 1, 1},
                                 .strides = {2, 2},
@@ -789,12 +810,13 @@
   {
     // Test depthwise conv2d by setting groups to input channels.
     Conv2dTester{
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {1, 4, 2, 2}},
-        .filter = {.type = V8MLOperandType::Enum::kFloat32,
+        .filter = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                    .dimensions = {4, 1, 2, 2}},
         .options = {.groups = 4},
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kFloat32,
+        .expected_operand = {.data_type =
+                                 blink_mojom::Operand::DataType::kFloat32,
                              .dimensions = {1, 4, 1, 1}},
         .expected_attributes = {.padding = {0, 0, 0, 0},
                                 .strides = {1, 1},
@@ -805,9 +827,9 @@
   {
     // Test conv2d with clamp activation.
     Conv2dTester{
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {1, 1, 5, 5}},
-        .filter = {.type = V8MLOperandType::Enum::kFloat32,
+        .filter = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                    .dimensions = {1, 1, 3, 3}},
         .options = {.activation =
                         Activation{
@@ -815,7 +837,8 @@
                             .clamp_options =
                                 ClampTester::ClampOptions{.min_value = 1.0,
                                                           .max_value = 6.0}}},
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kFloat32,
+        .expected_operand = {.data_type =
+                                 blink_mojom::Operand::DataType::kFloat32,
                              .dimensions = {1, 1, 3, 3}},
         .expected_attributes = {.padding = Vector<uint32_t>({0, 0, 0, 0}),
                                 .strides = Vector<uint32_t>({1, 1}),
@@ -826,13 +849,14 @@
   {
     // Test conv2d with elu activation with default options.
     Conv2dTester{
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {1, 1, 5, 5}},
-        .filter = {.type = V8MLOperandType::Enum::kFloat32,
+        .filter = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                    .dimensions = {1, 1, 3, 3}},
         .options = {.activation =
                         Activation{.kind = MLOperator::OperatorKind::kElu}},
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kFloat32,
+        .expected_operand = {.data_type =
+                                 blink_mojom::Operand::DataType::kFloat32,
                              .dimensions = {1, 1, 3, 3}},
         .expected_attributes = {.padding = Vector<uint32_t>({0, 0, 0, 0}),
                                 .strides = Vector<uint32_t>({1, 1}),
@@ -844,14 +868,15 @@
   {
     // Test conv2d with elu activation with given alpha.
     Conv2dTester{
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {1, 1, 5, 5}},
-        .filter = {.type = V8MLOperandType::Enum::kFloat32,
+        .filter = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                    .dimensions = {1, 1, 3, 3}},
         .options = {.activation =
                         Activation{.kind = MLOperator::OperatorKind::kElu,
                                    .elu_alpha = 0.5}},
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kFloat32,
+        .expected_operand = {.data_type =
+                                 blink_mojom::Operand::DataType::kFloat32,
                              .dimensions = {1, 1, 3, 3}},
         .expected_attributes = {.padding = Vector<uint32_t>({0, 0, 0, 0}),
                                 .strides = Vector<uint32_t>({1, 1}),
@@ -863,14 +888,15 @@
   {
     // Test conv2d with leaky relu activation with default options.
     Conv2dTester{
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {1, 1, 5, 5}},
-        .filter = {.type = V8MLOperandType::Enum::kFloat32,
+        .filter = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                    .dimensions = {1, 1, 3, 3}},
         .options = {.activation =
                         Activation{.kind =
                                        MLOperator::OperatorKind::kLeakyRelu}},
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kFloat32,
+        .expected_operand = {.data_type =
+                                 blink_mojom::Operand::DataType::kFloat32,
                              .dimensions = {1, 1, 3, 3}},
         .expected_attributes = {.padding = Vector<uint32_t>({0, 0, 0, 0}),
                                 .strides = Vector<uint32_t>({1, 1}),
@@ -882,14 +908,15 @@
   {
     // Test conv2d with leaky relu activation with given alpha.
     Conv2dTester{
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {1, 1, 5, 5}},
-        .filter = {.type = V8MLOperandType::Enum::kFloat32,
+        .filter = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                    .dimensions = {1, 1, 3, 3}},
         .options = {.activation =
                         Activation{.kind = MLOperator::OperatorKind::kLeakyRelu,
                                    .leaky_relu_alpha = 0.02}},
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kFloat32,
+        .expected_operand = {.data_type =
+                                 blink_mojom::Operand::DataType::kFloat32,
                              .dimensions = {1, 1, 3, 3}},
         .expected_attributes = {.padding = Vector<uint32_t>({0, 0, 0, 0}),
                                 .strides = Vector<uint32_t>({1, 1}),
@@ -901,13 +928,14 @@
   {
     // Test conv2d with relu activation.
     Conv2dTester{
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {1, 1, 5, 5}},
-        .filter = {.type = V8MLOperandType::Enum::kFloat32,
+        .filter = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                    .dimensions = {1, 1, 3, 3}},
         .options = {.activation =
                         Activation{.kind = MLOperator::OperatorKind::kRelu}},
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kFloat32,
+        .expected_operand = {.data_type =
+                                 blink_mojom::Operand::DataType::kFloat32,
                              .dimensions = {1, 1, 3, 3}},
         .expected_attributes = {.padding = Vector<uint32_t>({0, 0, 0, 0}),
                                 .strides = Vector<uint32_t>({1, 1}),
@@ -918,13 +946,14 @@
   {
     // Test conv2d with sigmoid activation.
     Conv2dTester{
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {1, 1, 5, 5}},
-        .filter = {.type = V8MLOperandType::Enum::kFloat32,
+        .filter = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                    .dimensions = {1, 1, 3, 3}},
         .options = {.activation =
                         Activation{.kind = MLOperator::OperatorKind::kSigmoid}},
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kFloat32,
+        .expected_operand = {.data_type =
+                                 blink_mojom::Operand::DataType::kFloat32,
                              .dimensions = {1, 1, 3, 3}},
         .expected_attributes = {.padding = Vector<uint32_t>({0, 0, 0, 0}),
                                 .strides = Vector<uint32_t>({1, 1}),
@@ -935,13 +964,14 @@
   {
     // Test conv2d with softmax activation.
     Conv2dTester{
-        .input = {.type = V8MLOperandType::Enum::kFloat16,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat16,
                   .dimensions = {1, 1, 5, 5}},
-        .filter = {.type = V8MLOperandType::Enum::kFloat16,
+        .filter = {.data_type = V8MLOperandDataType::Enum::kFloat16,
                    .dimensions = {1, 1, 3, 3}},
         .options = {.activation =
                         Activation{.kind = MLOperator::OperatorKind::kSoftmax}},
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kFloat16,
+        .expected_operand = {.data_type =
+                                 blink_mojom::Operand::DataType::kFloat16,
                              .dimensions = {1, 1, 3, 3}},
         .expected_attributes = {.padding = Vector<uint32_t>({0, 0, 0, 0}),
                                 .strides = Vector<uint32_t>({1, 1}),
@@ -952,13 +982,14 @@
   {
     // Test conv2d with tanh activation.
     Conv2dTester{
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {1, 1, 5, 5}},
-        .filter = {.type = V8MLOperandType::Enum::kFloat32,
+        .filter = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                    .dimensions = {1, 1, 3, 3}},
         .options = {.activation =
                         Activation{.kind = MLOperator::OperatorKind::kTanh}},
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kFloat32,
+        .expected_operand = {.data_type =
+                                 blink_mojom::Operand::DataType::kFloat32,
                              .dimensions = {1, 1, 3, 3}},
         .expected_attributes = {.padding = Vector<uint32_t>({0, 0, 0, 0}),
                                 .strides = Vector<uint32_t>({1, 1}),
@@ -990,10 +1021,10 @@
             MLGraphBuilder* builder,
             ElementWiseBinaryKind kind) {
     // Build the graph.
-    auto* lhs_operand = BuildInput(builder, "lhs", lhs.dimensions, lhs.type,
-                                   scope.GetExceptionState());
-    auto* rhs_operand = BuildInput(builder, "rhs", rhs.dimensions, rhs.type,
-                                   scope.GetExceptionState());
+    auto* lhs_operand = BuildInput(builder, "lhs", lhs.dimensions,
+                                   lhs.data_type, scope.GetExceptionState());
+    auto* rhs_operand = BuildInput(builder, "rhs", rhs.dimensions,
+                                   rhs.data_type, scope.GetExceptionState());
     auto* output_operand =
         BuildElementWiseBinary(scope, builder, kind, lhs_operand, rhs_operand);
     auto [graph, build_exception] =
@@ -1010,7 +1041,7 @@
     ASSERT_TRUE(lhs_operand_iter != graph_info->id_to_operand_map.end());
     EXPECT_EQ(lhs_operand_iter->value->kind,
               blink_mojom::Operand::Kind::kInput);
-    EXPECT_EQ(lhs_operand_iter->value->data_type, expected.type);
+    EXPECT_EQ(lhs_operand_iter->value->data_type, expected.data_type);
     EXPECT_EQ(lhs_operand_iter->value->dimensions, lhs.dimensions);
     EXPECT_EQ(lhs_operand_iter->value->name, "lhs");
     // Verify the right `mojo::Operand`.
@@ -1019,7 +1050,7 @@
     ASSERT_TRUE(rhs_operand_iter != graph_info->id_to_operand_map.end());
     EXPECT_EQ(rhs_operand_iter->value->kind,
               blink_mojom::Operand::Kind::kInput);
-    EXPECT_EQ(rhs_operand_iter->value->data_type, expected.type);
+    EXPECT_EQ(rhs_operand_iter->value->data_type, expected.data_type);
     EXPECT_EQ(rhs_operand_iter->value->dimensions, rhs.dimensions);
     EXPECT_EQ(rhs_operand_iter->value->name, "rhs");
     // Verify the output `mojo::Operand`.
@@ -1029,7 +1060,7 @@
     ASSERT_TRUE(output_operand_iter != graph_info->id_to_operand_map.end());
     EXPECT_EQ(output_operand_iter->value->kind,
               blink_mojom::Operand::Kind::kOutput);
-    EXPECT_EQ(output_operand_iter->value->data_type, expected.type);
+    EXPECT_EQ(output_operand_iter->value->data_type, expected.data_type);
     EXPECT_EQ(output_operand_iter->value->dimensions, expected.dimensions);
     EXPECT_EQ(output_operand_iter->value->name, "output");
     // Verify the `mojo::Operator`.
@@ -1084,55 +1115,66 @@
   {
     // Test element-wise add operator for two 0-D scalars.
     ElementWiseBinaryTester{
-        .lhs = {.type = V8MLOperandType::Enum::kFloat32, .dimensions = {}},
-        .rhs = {.type = V8MLOperandType::Enum::kFloat32, .dimensions = {}},
-        .expected = {.type = blink_mojom::Operand::DataType::kFloat32,
+        .lhs = {.data_type = V8MLOperandDataType::Enum::kFloat32,
+                .dimensions = {}},
+        .rhs = {.data_type = V8MLOperandDataType::Enum::kFloat32,
+                .dimensions = {}},
+        .expected = {.data_type = blink_mojom::Operand::DataType::kFloat32,
                      .dimensions = {}}}
         .Test(*this, scope, builder);
   }
   {
     // Test element-wise add operator for two 1-D tensors.
     ElementWiseBinaryTester{
-        .lhs = {.type = V8MLOperandType::Enum::kFloat32, .dimensions = {2}},
-        .rhs = {.type = V8MLOperandType::Enum::kFloat32, .dimensions = {2}},
-        .expected = {.type = blink_mojom::Operand::DataType::kFloat32,
+        .lhs = {.data_type = V8MLOperandDataType::Enum::kFloat32,
+                .dimensions = {2}},
+        .rhs = {.data_type = V8MLOperandDataType::Enum::kFloat32,
+                .dimensions = {2}},
+        .expected = {.data_type = blink_mojom::Operand::DataType::kFloat32,
                      .dimensions = {2}}}
         .Test(*this, scope, builder);
   }
   {
     // Test element-wise add operator for two 2-D tensors.
     ElementWiseBinaryTester{
-        .lhs = {.type = V8MLOperandType::Enum::kFloat16, .dimensions = {3, 7}},
-        .rhs = {.type = V8MLOperandType::Enum::kFloat16, .dimensions = {3, 7}},
-        .expected = {.type = blink_mojom::Operand::DataType::kFloat16,
+        .lhs = {.data_type = V8MLOperandDataType::Enum::kFloat16,
+                .dimensions = {3, 7}},
+        .rhs = {.data_type = V8MLOperandDataType::Enum::kFloat16,
+                .dimensions = {3, 7}},
+        .expected = {.data_type = blink_mojom::Operand::DataType::kFloat16,
                      .dimensions = {3, 7}}}
         .Test(*this, scope, builder);
   }
   {
     // Test element-wise add operator for broadcasting to 2-D tensor.
     ElementWiseBinaryTester{
-        .lhs = {.type = V8MLOperandType::Enum::kInt32, .dimensions = {5, 3}},
-        .rhs = {.type = V8MLOperandType::Enum::kInt32, .dimensions = {5, 1}},
-        .expected = {.type = blink_mojom::Operand::DataType::kInt32,
+        .lhs = {.data_type = V8MLOperandDataType::Enum::kInt32,
+                .dimensions = {5, 3}},
+        .rhs = {.data_type = V8MLOperandDataType::Enum::kInt32,
+                .dimensions = {5, 1}},
+        .expected = {.data_type = blink_mojom::Operand::DataType::kInt32,
                      .dimensions = {5, 3}}}
         .Test(*this, scope, builder);
   }
   {
     // Test element-wise add operator for broadcasting to 3-D tensor.
     ElementWiseBinaryTester{
-        .lhs = {.type = V8MLOperandType::Enum::kInt8, .dimensions = {4, 2, 1}},
-        .rhs = {.type = V8MLOperandType::Enum::kInt8, .dimensions = {4}},
-        .expected = {.type = blink_mojom::Operand::DataType::kInt8,
+        .lhs = {.data_type = V8MLOperandDataType::Enum::kInt8,
+                .dimensions = {4, 2, 1}},
+        .rhs = {.data_type = V8MLOperandDataType::Enum::kInt8,
+                .dimensions = {4}},
+        .expected = {.data_type = blink_mojom::Operand::DataType::kInt8,
                      .dimensions = {4, 2, 4}}}
         .Test(*this, scope, builder);
   }
   {
     // Test element-wise add operator for broadcasting to 4-D tensors.
     ElementWiseBinaryTester{
-        .lhs = {.type = V8MLOperandType::Enum::kUint8,
+        .lhs = {.data_type = V8MLOperandDataType::Enum::kUint8,
                 .dimensions = {8, 1, 6, 1}},
-        .rhs = {.type = V8MLOperandType::Enum::kUint8, .dimensions = {7, 1, 5}},
-        .expected = {.type = blink_mojom::Operand::DataType::kUint8,
+        .rhs = {.data_type = V8MLOperandDataType::Enum::kUint8,
+                .dimensions = {7, 1, 5}},
+        .expected = {.data_type = blink_mojom::Operand::DataType::kUint8,
                      .dimensions = {8, 7, 6, 5}}}
         .Test(*this, scope, builder);
   }
@@ -1148,8 +1190,9 @@
             V8TestingScope& scope,
             MLGraphBuilder* builder) {
     // Build the graph.
-    auto* input_operand = BuildInput(builder, "input", input.dimensions,
-                                     input.type, scope.GetExceptionState());
+    auto* input_operand =
+        BuildInput(builder, "input", input.dimensions, input.data_type,
+                   scope.GetExceptionState());
     MLEluOptions* ml_elu_options = MLEluOptions::Create();
     if (alpha) {
       ml_elu_options->setAlpha(alpha.value());
@@ -1172,7 +1215,7 @@
     ASSERT_TRUE(input_operand_iter != graph_info->id_to_operand_map.end());
     EXPECT_EQ(input_operand_iter->value->kind,
               blink_mojom::Operand::Kind::kInput);
-    EXPECT_EQ(input_operand_iter->value->data_type, expected_operand.type);
+    EXPECT_EQ(input_operand_iter->value->data_type, expected_operand.data_type);
     EXPECT_EQ(input_operand_iter->value->dimensions, input.dimensions);
     EXPECT_EQ(input_operand_iter->value->name, "input");
 
@@ -1184,7 +1227,8 @@
     ASSERT_TRUE(output_operand_iter != graph_info->id_to_operand_map.end());
     EXPECT_EQ(output_operand_iter->value->kind,
               blink_mojom::Operand::Kind::kOutput);
-    EXPECT_EQ(output_operand_iter->value->data_type, expected_operand.type);
+    EXPECT_EQ(output_operand_iter->value->data_type,
+              expected_operand.data_type);
     EXPECT_EQ(output_operand_iter->value->dimensions,
               expected_operand.dimensions);
     EXPECT_EQ(output_operand_iter->value->name, "output");
@@ -1214,52 +1258,54 @@
   ASSERT_NE(builder, nullptr);
   {
     // Test elu operator for 0-D tensor with default options.
-    EluTester{
-        .input = {.type = V8MLOperandType::Enum::kFloat32, .dimensions = {}},
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kFloat32,
-                             .dimensions = {}},
-        .expected_alpha = 1}
+    EluTester{.input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
+                        .dimensions = {}},
+              .expected_operand = {.data_type =
+                                       blink_mojom::Operand::DataType::kFloat32,
+                                   .dimensions = {}},
+              .expected_alpha = 1}
         .Test(*this, scope, builder);
   }
   {
     // Test elu operator for 1-D tensor with default options.
-    EluTester{
-        .input = {.type = V8MLOperandType::Enum::kFloat32, .dimensions = {2}},
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kFloat32,
-                             .dimensions = {2}},
-        .expected_alpha = 1}
+    EluTester{.input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
+                        .dimensions = {2}},
+              .expected_operand = {.data_type =
+                                       blink_mojom::Operand::DataType::kFloat32,
+                                   .dimensions = {2}},
+              .expected_alpha = 1}
         .Test(*this, scope, builder);
   }
   {
     // Test elu operator for 2-D tensor with default options.
-    EluTester{
-        .input = {.type = V8MLOperandType::Enum::kFloat16,
-                  .dimensions = {3, 7}},
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kFloat16,
-                             .dimensions = {3, 7}},
-        .expected_alpha = 1}
+    EluTester{.input = {.data_type = V8MLOperandDataType::Enum::kFloat16,
+                        .dimensions = {3, 7}},
+              .expected_operand = {.data_type =
+                                       blink_mojom::Operand::DataType::kFloat16,
+                                   .dimensions = {3, 7}},
+              .expected_alpha = 1}
         .Test(*this, scope, builder);
   }
   {
     // Test elu operator for 3-D tensor with given alpha.
-    EluTester{
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
-                  .dimensions = {1, 5, 3}},
-        .alpha = 0.5,
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kFloat32,
-                             .dimensions = {1, 5, 3}},
-        .expected_alpha = 0.5}
+    EluTester{.input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
+                        .dimensions = {1, 5, 3}},
+              .alpha = 0.5,
+              .expected_operand = {.data_type =
+                                       blink_mojom::Operand::DataType::kFloat32,
+                                   .dimensions = {1, 5, 3}},
+              .expected_alpha = 0.5}
         .Test(*this, scope, builder);
   }
   {
     // Test elu operator for 4-D tensor with given alpha.
-    EluTester{
-        .input = {.type = V8MLOperandType::Enum::kFloat16,
-                  .dimensions = {1, 2, 2, 1}},
-        .alpha = 0.7,
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kFloat16,
-                             .dimensions = {1, 2, 2, 1}},
-        .expected_alpha = 0.7}
+    EluTester{.input = {.data_type = V8MLOperandDataType::Enum::kFloat16,
+                        .dimensions = {1, 2, 2, 1}},
+              .alpha = 0.7,
+              .expected_operand = {.data_type =
+                                       blink_mojom::Operand::DataType::kFloat16,
+                                   .dimensions = {1, 2, 2, 1}},
+              .expected_alpha = 0.7}
         .Test(*this, scope, builder);
   }
 }
@@ -1273,8 +1319,9 @@
             V8TestingScope& scope,
             MLGraphBuilder* builder) {
     // Build the graph.
-    auto* input_operand = BuildInput(builder, "input", input.dimensions,
-                                     input.type, scope.GetExceptionState());
+    auto* input_operand =
+        BuildInput(builder, "input", input.dimensions, input.data_type,
+                   scope.GetExceptionState());
     auto* output_operand =
         builder->expand(input_operand, new_shape, scope.GetExceptionState());
     auto [graph, build_exception] =
@@ -1291,7 +1338,7 @@
     auto output_operand_iter =
         graph_info->id_to_operand_map.find(output_operand_id);
     ASSERT_TRUE(output_operand_iter != graph_info->id_to_operand_map.end());
-    EXPECT_EQ(output_operand_iter->value->data_type, expected.type);
+    EXPECT_EQ(output_operand_iter->value->data_type, expected.data_type);
     EXPECT_EQ(output_operand_iter->value->dimensions, expected.dimensions);
   }
 };
@@ -1311,37 +1358,41 @@
   {
     // Test building expand 0-D scalar to 3-D tensor.
     ExpandTester{
-        .input = {.type = V8MLOperandType::Enum::kFloat32, .dimensions = {}},
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
+                  .dimensions = {}},
         .new_shape = {3, 4, 5},
-        .expected = {.type = blink_mojom::Operand::DataType::kFloat32,
+        .expected = {.data_type = blink_mojom::Operand::DataType::kFloat32,
                      .dimensions = {3, 4, 5}}}
         .Test(*this, scope, builder);
   }
   {
     // Test expanding the new shape that is the same as input.
-    ExpandTester{.input = {.type = V8MLOperandType::Enum::kFloat32,
-                           .dimensions = {3, 2}},
-                 .new_shape = {3, 2},
-                 .expected = {.type = blink_mojom::Operand::DataType::kFloat32,
-                              .dimensions = {3, 2}}}
+    ExpandTester{
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
+                  .dimensions = {3, 2}},
+        .new_shape = {3, 2},
+        .expected = {.data_type = blink_mojom::Operand::DataType::kFloat32,
+                     .dimensions = {3, 2}}}
         .Test(*this, scope, builder);
   }
   {
     // Test expanding the new shape that are broadcastable.
-    ExpandTester{.input = {.type = V8MLOperandType::Enum::kFloat16,
-                           .dimensions = {3, 1, 5}},
-                 .new_shape = {3, 4, 5},
-                 .expected = {.type = blink_mojom::Operand::DataType::kFloat16,
-                              .dimensions = {3, 4, 5}}}
+    ExpandTester{
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat16,
+                  .dimensions = {3, 1, 5}},
+        .new_shape = {3, 4, 5},
+        .expected = {.data_type = blink_mojom::Operand::DataType::kFloat16,
+                     .dimensions = {3, 4, 5}}}
         .Test(*this, scope, builder);
   }
   {
     // Test expanding the new shape that are broadcastable and the number of new
     // shapes larger than input.
     ExpandTester{
-        .input = {.type = V8MLOperandType::Enum::kInt32, .dimensions = {2, 5}},
+        .input = {.data_type = V8MLOperandDataType::Enum::kInt32,
+                  .dimensions = {2, 5}},
         .new_shape = {3, 2, 5},
-        .expected = {.type = blink_mojom::Operand::DataType::kInt32,
+        .expected = {.data_type = blink_mojom::Operand::DataType::kInt32,
                      .dimensions = {3, 2, 5}}}
         .Test(*this, scope, builder);
   }
@@ -1372,14 +1423,14 @@
             V8TestingScope& scope,
             MLGraphBuilder* builder) {
     // Build the graph.
-    auto* a_operand = BuildInput(builder, "a", a.dimensions, a.type,
+    auto* a_operand = BuildInput(builder, "a", a.dimensions, a.data_type,
                                  scope.GetExceptionState());
-    auto* b_operand = BuildInput(builder, "b", b.dimensions, b.type,
+    auto* b_operand = BuildInput(builder, "b", b.dimensions, b.data_type,
                                  scope.GetExceptionState());
     MLGemmOptions* ml_gemm_options = MLGemmOptions::Create();
     if (options.c) {
       ml_gemm_options->setC(BuildInput(builder, "c", options.c->dimensions,
-                                       options.c->type,
+                                       options.c->data_type,
                                        scope.GetExceptionState()));
     }
     if (options.alpha) {
@@ -1410,7 +1461,8 @@
       auto c_operand_iter =
           graph_info->id_to_operand_map.find(gemm_mojo->c_operand_id.value());
       ASSERT_TRUE(c_operand_iter != graph_info->id_to_operand_map.end());
-      EXPECT_EQ(c_operand_iter->value->data_type, expected_attributes.c->type);
+      EXPECT_EQ(c_operand_iter->value->data_type,
+                expected_attributes.c->data_type);
       EXPECT_EQ(c_operand_iter->value->dimensions,
                 expected_attributes.c->dimensions);
     } else {
@@ -1425,7 +1477,8 @@
     auto output_operand_iter =
         graph_info->id_to_operand_map.find(output_operand_id);
     ASSERT_TRUE(output_operand_iter != graph_info->id_to_operand_map.end());
-    EXPECT_EQ(output_operand_iter->value->data_type, expected_operand.type);
+    EXPECT_EQ(output_operand_iter->value->data_type,
+              expected_operand.data_type);
     EXPECT_EQ(output_operand_iter->value->dimensions,
               expected_operand.dimensions);
   }
@@ -1446,9 +1499,12 @@
   {
     // Test building gemm with default option.
     GemmTester{
-        .a = {.type = V8MLOperandType::Enum::kFloat32, .dimensions = {2, 3}},
-        .b = {.type = V8MLOperandType::Enum::kFloat32, .dimensions = {3, 4}},
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kFloat32,
+        .a = {.data_type = V8MLOperandDataType::Enum::kFloat32,
+              .dimensions = {2, 3}},
+        .b = {.data_type = V8MLOperandDataType::Enum::kFloat32,
+              .dimensions = {3, 4}},
+        .expected_operand = {.data_type =
+                                 blink_mojom::Operand::DataType::kFloat32,
                              .dimensions = {2, 4}},
         .expected_attributes = {.c = absl::nullopt,
                                 .alpha = 1.0,
@@ -1462,10 +1518,13 @@
     // Transposed a_dimensions would be {3, 2} and it's compatible with
     // b_dimensions {2, 4}.
     GemmTester{
-        .a = {.type = V8MLOperandType::Enum::kFloat32, .dimensions = {2, 3}},
-        .b = {.type = V8MLOperandType::Enum::kFloat32, .dimensions = {2, 4}},
+        .a = {.data_type = V8MLOperandDataType::Enum::kFloat32,
+              .dimensions = {2, 3}},
+        .b = {.data_type = V8MLOperandDataType::Enum::kFloat32,
+              .dimensions = {2, 4}},
         .options = {.a_transpose = true},
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kFloat32,
+        .expected_operand = {.data_type =
+                                 blink_mojom::Operand::DataType::kFloat32,
                              .dimensions = {3, 4}},
         .expected_attributes = {.c = absl::nullopt,
                                 .alpha = 1.0,
@@ -1479,10 +1538,13 @@
     // Transposed b_dimensions would be {3, 4} and it's compatible with
     // a_dimensions {2, 3}.
     GemmTester{
-        .a = {.type = V8MLOperandType::Enum::kFloat32, .dimensions = {2, 3}},
-        .b = {.type = V8MLOperandType::Enum::kFloat32, .dimensions = {4, 3}},
+        .a = {.data_type = V8MLOperandDataType::Enum::kFloat32,
+              .dimensions = {2, 3}},
+        .b = {.data_type = V8MLOperandDataType::Enum::kFloat32,
+              .dimensions = {4, 3}},
         .options = {.b_transpose = true},
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kFloat32,
+        .expected_operand = {.data_type =
+                                 blink_mojom::Operand::DataType::kFloat32,
                              .dimensions = {2, 4}},
         .expected_attributes = {.c = absl::nullopt,
                                 .alpha = 1.0,
@@ -1496,19 +1558,23 @@
     // The output dimensions of a * b would be {2, 4} and c_dimensions {4} is
     // able to broadcast to {2, 4}.
     GemmTester{
-        .a = {.type = V8MLOperandType::Enum::kFloat32, .dimensions = {2, 3}},
-        .b = {.type = V8MLOperandType::Enum::kFloat32, .dimensions = {3, 4}},
+        .a = {.data_type = V8MLOperandDataType::Enum::kFloat32,
+              .dimensions = {2, 3}},
+        .b = {.data_type = V8MLOperandDataType::Enum::kFloat32,
+              .dimensions = {3, 4}},
         .options =
             {
-                .c = OperandInfoBlink{.type = V8MLOperandType::Enum::kFloat32,
+                .c = OperandInfoBlink{.data_type =
+                                          V8MLOperandDataType::Enum::kFloat32,
                                       .dimensions = {4}},
                 .alpha = 2.0,
                 .beta = 3.0,
             },
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kFloat32,
+        .expected_operand = {.data_type =
+                                 blink_mojom::Operand::DataType::kFloat32,
                              .dimensions = {2, 4}},
         .expected_attributes =
-            {.c = OperandInfoMojo{.type =
+            {.c = OperandInfoMojo{.data_type =
                                       blink_mojom::Operand::DataType::kFloat32,
                                   .dimensions = {4}},
              .alpha = 2.0,
@@ -1520,19 +1586,23 @@
   {
     // Test building gemm with setting scalar C.
     GemmTester{
-        .a = {.type = V8MLOperandType::Enum::kFloat32, .dimensions = {2, 3}},
-        .b = {.type = V8MLOperandType::Enum::kFloat32, .dimensions = {3, 4}},
+        .a = {.data_type = V8MLOperandDataType::Enum::kFloat32,
+              .dimensions = {2, 3}},
+        .b = {.data_type = V8MLOperandDataType::Enum::kFloat32,
+              .dimensions = {3, 4}},
         .options =
             {
-                .c = OperandInfoBlink{.type = V8MLOperandType::Enum::kFloat32,
+                .c = OperandInfoBlink{.data_type =
+                                          V8MLOperandDataType::Enum::kFloat32,
                                       .dimensions = {}},
                 .alpha = 2.0,
                 .beta = 3.0,
             },
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kFloat32,
+        .expected_operand = {.data_type =
+                                 blink_mojom::Operand::DataType::kFloat32,
                              .dimensions = {2, 4}},
         .expected_attributes =
-            {.c = OperandInfoMojo{.type =
+            {.c = OperandInfoMojo{.data_type =
                                       blink_mojom::Operand::DataType::kFloat32,
                                   .dimensions = {}},
              .alpha = 2.0,
@@ -1553,8 +1623,9 @@
             V8TestingScope& scope,
             MLGraphBuilder* builder) {
     // Build the graph.
-    auto* input_operand = BuildInput(builder, "input", input.dimensions,
-                                     input.type, scope.GetExceptionState());
+    auto* input_operand =
+        BuildInput(builder, "input", input.dimensions, input.data_type,
+                   scope.GetExceptionState());
     MLLeakyReluOptions* ml_leaky_relu_options = MLLeakyReluOptions::Create();
     if (alpha) {
       ml_leaky_relu_options->setAlpha(alpha.value());
@@ -1577,7 +1648,7 @@
     ASSERT_TRUE(input_operand_iter != graph_info->id_to_operand_map.end());
     EXPECT_EQ(input_operand_iter->value->kind,
               blink_mojom::Operand::Kind::kInput);
-    EXPECT_EQ(input_operand_iter->value->data_type, expected_operand.type);
+    EXPECT_EQ(input_operand_iter->value->data_type, expected_operand.data_type);
     EXPECT_EQ(input_operand_iter->value->dimensions, input.dimensions);
     EXPECT_EQ(input_operand_iter->value->name, "input");
 
@@ -1589,7 +1660,8 @@
     ASSERT_TRUE(output_operand_iter != graph_info->id_to_operand_map.end());
     EXPECT_EQ(output_operand_iter->value->kind,
               blink_mojom::Operand::Kind::kOutput);
-    EXPECT_EQ(output_operand_iter->value->data_type, expected_operand.type);
+    EXPECT_EQ(output_operand_iter->value->data_type,
+              expected_operand.data_type);
     EXPECT_EQ(output_operand_iter->value->dimensions,
               expected_operand.dimensions);
     EXPECT_EQ(output_operand_iter->value->name, "output");
@@ -1620,8 +1692,10 @@
   {
     // Test leaky relu operator for 0-D scalar with default options.
     LeakyReluTester{
-        .input = {.type = V8MLOperandType::Enum::kFloat32, .dimensions = {}},
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
+                  .dimensions = {}},
+        .expected_operand = {.data_type =
+                                 blink_mojom::Operand::DataType::kFloat32,
                              .dimensions = {}},
         .expected_alpha = 0.01}
         .Test(*this, scope, builder);
@@ -1629,8 +1703,10 @@
   {
     // Test leaky relu operator for 1-D tensor with default options.
     LeakyReluTester{
-        .input = {.type = V8MLOperandType::Enum::kFloat32, .dimensions = {2}},
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
+                  .dimensions = {2}},
+        .expected_operand = {.data_type =
+                                 blink_mojom::Operand::DataType::kFloat32,
                              .dimensions = {2}},
         .expected_alpha = 0.01}
         .Test(*this, scope, builder);
@@ -1638,9 +1714,10 @@
   {
     // Test leaky relu operator for 2-D tensor with default options.
     LeakyReluTester{
-        .input = {.type = V8MLOperandType::Enum::kFloat16,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat16,
                   .dimensions = {3, 7}},
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kFloat16,
+        .expected_operand = {.data_type =
+                                 blink_mojom::Operand::DataType::kFloat16,
                              .dimensions = {3, 7}},
         .expected_alpha = 0.01}
         .Test(*this, scope, builder);
@@ -1648,10 +1725,11 @@
   {
     // Test leaky relu operator for 3-D tensor with given alpha.
     LeakyReluTester{
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {1, 5, 3}},
         .alpha = 0.05,
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kFloat32,
+        .expected_operand = {.data_type =
+                                 blink_mojom::Operand::DataType::kFloat32,
                              .dimensions = {1, 5, 3}},
         .expected_alpha = 0.05}
         .Test(*this, scope, builder);
@@ -1659,10 +1737,11 @@
   {
     // Test leaky relu operator for 4-D tensor with given alpha.
     LeakyReluTester{
-        .input = {.type = V8MLOperandType::Enum::kFloat16,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat16,
                   .dimensions = {1, 2, 2, 1}},
         .alpha = 0.07,
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kFloat16,
+        .expected_operand = {.data_type =
+                                 blink_mojom::Operand::DataType::kFloat16,
                              .dimensions = {1, 2, 2, 1}},
         .expected_alpha = 0.07}
         .Test(*this, scope, builder);
@@ -1678,9 +1757,9 @@
             V8TestingScope& scope,
             MLGraphBuilder* builder) {
     // Build the graph.
-    auto* a_operand = BuildInput(builder, "a", a.dimensions, a.type,
+    auto* a_operand = BuildInput(builder, "a", a.dimensions, a.data_type,
                                  scope.GetExceptionState());
-    auto* b_operand = BuildInput(builder, "b", b.dimensions, b.type,
+    auto* b_operand = BuildInput(builder, "b", b.dimensions, b.data_type,
                                  scope.GetExceptionState());
     auto* output_operand =
         builder->matmul(a_operand, b_operand, scope.GetExceptionState());
@@ -1697,7 +1776,7 @@
     auto a_operand_iter = graph_info->id_to_operand_map.find(a_operand_id);
     ASSERT_TRUE(a_operand_iter != graph_info->id_to_operand_map.end());
     EXPECT_EQ(a_operand_iter->value->kind, blink_mojom::Operand::Kind::kInput);
-    EXPECT_EQ(a_operand_iter->value->data_type, expected_operand.type);
+    EXPECT_EQ(a_operand_iter->value->data_type, expected_operand.data_type);
     EXPECT_EQ(a_operand_iter->value->dimensions, a.dimensions);
     EXPECT_EQ(a_operand_iter->value->name, "a");
     // Verify the b `mojo::Operand`.
@@ -1705,7 +1784,7 @@
     auto b_operand_iter = graph_info->id_to_operand_map.find(b_operand_id);
     ASSERT_TRUE(b_operand_iter != graph_info->id_to_operand_map.end());
     EXPECT_EQ(b_operand_iter->value->kind, blink_mojom::Operand::Kind::kInput);
-    EXPECT_EQ(b_operand_iter->value->data_type, expected_operand.type);
+    EXPECT_EQ(b_operand_iter->value->data_type, expected_operand.data_type);
     EXPECT_EQ(b_operand_iter->value->dimensions, b.dimensions);
     EXPECT_EQ(b_operand_iter->value->name, "b");
     // Verify the output `mojo::Operand`.
@@ -1714,10 +1793,12 @@
     auto output_operand_iter =
         graph_info->id_to_operand_map.find(output_operand_id);
     ASSERT_TRUE(output_operand_iter != graph_info->id_to_operand_map.end());
-    EXPECT_EQ(output_operand_iter->value->data_type, expected_operand.type);
+    EXPECT_EQ(output_operand_iter->value->data_type,
+              expected_operand.data_type);
     EXPECT_EQ(output_operand_iter->value->dimensions,
               expected_operand.dimensions);
-    EXPECT_EQ(output_operand_iter->value->data_type, expected_operand.type);
+    EXPECT_EQ(output_operand_iter->value->data_type,
+              expected_operand.data_type);
     EXPECT_EQ(output_operand_iter->value->name, "output");
     // Verify the `mojo::Operator`.
     ASSERT_EQ(graph_info->operations.size(), 1u);
@@ -1741,19 +1822,24 @@
   {
     // Test building matmul with 2-D * 2-D.
     MatmulTester{
-        .a = {.type = V8MLOperandType::Enum::kFloat32, .dimensions = {2, 3}},
-        .b = {.type = V8MLOperandType::Enum::kFloat32, .dimensions = {3, 4}},
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kFloat32,
+        .a = {.data_type = V8MLOperandDataType::Enum::kFloat32,
+              .dimensions = {2, 3}},
+        .b = {.data_type = V8MLOperandDataType::Enum::kFloat32,
+              .dimensions = {3, 4}},
+        .expected_operand = {.data_type =
+                                 blink_mojom::Operand::DataType::kFloat32,
                              .dimensions = {2, 4}}}
         .Test(*this, scope, builder);
   }
   {
     // Test building matmul with 3-D * 4-D using broadcasting.
     MatmulTester{
-        .a = {.type = V8MLOperandType::Enum::kFloat16, .dimensions = {2, 2, 3}},
-        .b = {.type = V8MLOperandType::Enum::kFloat16,
+        .a = {.data_type = V8MLOperandDataType::Enum::kFloat16,
+              .dimensions = {2, 2, 3}},
+        .b = {.data_type = V8MLOperandDataType::Enum::kFloat16,
               .dimensions = {3, 1, 3, 4}},
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kFloat16,
+        .expected_operand = {.data_type =
+                                 blink_mojom::Operand::DataType::kFloat16,
                              .dimensions = {3, 2, 2, 4}}}
         .Test(*this, scope, builder);
   }
@@ -1778,8 +1864,9 @@
             V8TestingScope& scope,
             MLGraphBuilder* builder) {
     // Build the graph.
-    auto* input_operand = BuildInput(builder, "input", input.dimensions,
-                                     input.type, scope.GetExceptionState());
+    auto* input_operand =
+        BuildInput(builder, "input", input.dimensions, input.data_type,
+                   scope.GetExceptionState());
     MLPadOptions* ml_pad_options = MLPadOptions::Create();
     if (options.mode) {
       ml_pad_options->setMode(options.mode.value());
@@ -1818,7 +1905,8 @@
     auto output_operand_iter =
         graph_info->id_to_operand_map.find(output_operand_id);
     ASSERT_TRUE(output_operand_iter != graph_info->id_to_operand_map.end());
-    EXPECT_EQ(output_operand_iter->value->data_type, expected_operand.type);
+    EXPECT_EQ(output_operand_iter->value->data_type,
+              expected_operand.data_type);
     EXPECT_EQ(output_operand_iter->value->dimensions,
               expected_operand.dimensions);
   }
@@ -1839,70 +1927,70 @@
   {
     // Test pad with default options, beginningPadding = {1, 2} and
     // endingPadding = {1, 2}.
-    PadTester{
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
-                  .dimensions = {2, 3}},
-        .beginning_padding = {1, 2},
-        .ending_padding = {1, 2},
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kFloat32,
-                             .dimensions = {4, 7}}}
+    PadTester{.input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
+                        .dimensions = {2, 3}},
+              .beginning_padding = {1, 2},
+              .ending_padding = {1, 2},
+              .expected_operand = {.data_type =
+                                       blink_mojom::Operand::DataType::kFloat32,
+                                   .dimensions = {4, 7}}}
         .Test(*this, scope, builder);
   }
   {
     // Test pad with mode = "constant", value = 1, beginningPadding = {1, 2} and
     // endingPadding = {1, 2}.
-    PadTester{
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
-                  .dimensions = {2, 3}},
-        .beginning_padding = {1, 2},
-        .ending_padding = {1, 2},
-        .options = {.mode = V8MLPaddingMode::Enum::kConstant, .value = 1},
-        .expected_mode = blink_mojom::PaddingMode::Tag::kConstant,
-        .expected_value = 1,
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kFloat32,
-                             .dimensions = {4, 7}}}
+    PadTester{.input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
+                        .dimensions = {2, 3}},
+              .beginning_padding = {1, 2},
+              .ending_padding = {1, 2},
+              .options = {.mode = V8MLPaddingMode::Enum::kConstant, .value = 1},
+              .expected_mode = blink_mojom::PaddingMode::Tag::kConstant,
+              .expected_value = 1,
+              .expected_operand = {.data_type =
+                                       blink_mojom::Operand::DataType::kFloat32,
+                                   .dimensions = {4, 7}}}
         .Test(*this, scope, builder);
   }
   {
     // Test pad with mode = "edge", beginningPadding = {1, 2} and
     // endingPadding = {1, 2}.
-    PadTester{
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
-                  .dimensions = {2, 3}},
-        .beginning_padding = {1, 2},
-        .ending_padding = {1, 2},
-        .options = {.mode = V8MLPaddingMode::Enum::kEdge},
-        .expected_mode = blink_mojom::PaddingMode::Tag::kEdge,
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kFloat32,
-                             .dimensions = {4, 7}}}
+    PadTester{.input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
+                        .dimensions = {2, 3}},
+              .beginning_padding = {1, 2},
+              .ending_padding = {1, 2},
+              .options = {.mode = V8MLPaddingMode::Enum::kEdge},
+              .expected_mode = blink_mojom::PaddingMode::Tag::kEdge,
+              .expected_operand = {.data_type =
+                                       blink_mojom::Operand::DataType::kFloat32,
+                                   .dimensions = {4, 7}}}
         .Test(*this, scope, builder);
   }
   {
     // Test pad with mode = "reflection", beginningPadding = {1, 2} and
     // endingPadding = {1, 2}.
-    PadTester{
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
-                  .dimensions = {2, 3}},
-        .beginning_padding = {1, 2},
-        .ending_padding = {1, 2},
-        .options = {.mode = V8MLPaddingMode::Enum::kReflection},
-        .expected_mode = blink_mojom::PaddingMode::Tag::kReflection,
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kFloat32,
-                             .dimensions = {4, 7}}}
+    PadTester{.input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
+                        .dimensions = {2, 3}},
+              .beginning_padding = {1, 2},
+              .ending_padding = {1, 2},
+              .options = {.mode = V8MLPaddingMode::Enum::kReflection},
+              .expected_mode = blink_mojom::PaddingMode::Tag::kReflection,
+              .expected_operand = {.data_type =
+                                       blink_mojom::Operand::DataType::kFloat32,
+                                   .dimensions = {4, 7}}}
         .Test(*this, scope, builder);
   }
   {
     // Test pad with mode = "symmetric", beginningPadding = {1, 2} and
     // endingPadding = {1, 2}.
-    PadTester{
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
-                  .dimensions = {2, 3}},
-        .beginning_padding = {1, 2},
-        .ending_padding = {1, 2},
-        .options = {.mode = V8MLPaddingMode::Enum::kSymmetric},
-        .expected_mode = blink_mojom::PaddingMode::Tag::kSymmetric,
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kFloat32,
-                             .dimensions = {4, 7}}}
+    PadTester{.input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
+                        .dimensions = {2, 3}},
+              .beginning_padding = {1, 2},
+              .ending_padding = {1, 2},
+              .options = {.mode = V8MLPaddingMode::Enum::kSymmetric},
+              .expected_mode = blink_mojom::PaddingMode::Tag::kSymmetric,
+              .expected_operand = {.data_type =
+                                       blink_mojom::Operand::DataType::kFloat32,
+                                   .dimensions = {4, 7}}}
         .Test(*this, scope, builder);
   }
 }
@@ -1943,8 +2031,9 @@
             MLGraphBuilder* builder,
             Pool2dKind kind) {
     // Build the graph.
-    auto* input_operand = BuildInput(builder, "input", input.dimensions,
-                                     input.type, scope.GetExceptionState());
+    auto* input_operand =
+        BuildInput(builder, "input", input.dimensions, input.data_type,
+                   scope.GetExceptionState());
     MLPool2dOptions* ml_pool2d_options = MLPool2dOptions::Create();
     if (options.window_dimensions) {
       ml_pool2d_options->setWindowDimensions(options.window_dimensions.value());
@@ -2015,7 +2104,8 @@
     auto output_operand_iter =
         graph_info->id_to_operand_map.find(output_operand_id);
     ASSERT_TRUE(output_operand_iter != graph_info->id_to_operand_map.end());
-    EXPECT_EQ(output_operand_iter->value->data_type, expected_operand.type);
+    EXPECT_EQ(output_operand_iter->value->data_type,
+              expected_operand.data_type);
     EXPECT_EQ(output_operand_iter->value->dimensions,
               expected_operand.dimensions);
   }
@@ -2036,9 +2126,10 @@
   {
     // Test pool2d with default options.
     Pool2dTester{
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {1, 3, 4, 4}},
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kFloat32,
+        .expected_operand = {.data_type =
+                                 blink_mojom::Operand::DataType::kFloat32,
                              .dimensions = {1, 3, 1, 1}},
         .expected_attributes = {.window_dimensions = {4, 4},
                                 .strides = {1, 1},
@@ -2048,10 +2139,11 @@
   {
     // Test pool2d without padding.
     Pool2dTester{
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {1, 3, 4, 4}},
         .options = {.window_dimensions = Vector<uint32_t>({3, 3})},
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kFloat32,
+        .expected_operand = {.data_type =
+                                 blink_mojom::Operand::DataType::kFloat32,
                              .dimensions = {1, 3, 2, 2}},
         .expected_attributes = {.window_dimensions = {3, 3},
                                 .padding = {0, 0, 0, 0},
@@ -2062,11 +2154,12 @@
   {
     // Test pool2d with autoPad="same-upper".
     Pool2dTester{
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {1, 3, 5, 5}},
         .options = {.window_dimensions = Vector<uint32_t>({5, 5}),
                     .auto_pad = V8MLAutoPad::Enum::kSameUpper},
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kFloat32,
+        .expected_operand = {.data_type =
+                                 blink_mojom::Operand::DataType::kFloat32,
                              .dimensions = {1, 3, 5, 5}},
         .expected_attributes = {.window_dimensions = {5, 5},
                                 .padding = {2, 2, 2, 2},
@@ -2077,11 +2170,12 @@
   {
     // Test pool2d with autoPad="same-lower".
     Pool2dTester{
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {1, 3, 5, 5}},
         .options = {.window_dimensions = Vector<uint32_t>({5, 5}),
                     .auto_pad = V8MLAutoPad::Enum::kSameLower},
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kFloat32,
+        .expected_operand = {.data_type =
+                                 blink_mojom::Operand::DataType::kFloat32,
                              .dimensions = {1, 3, 5, 5}},
         .expected_attributes = {.window_dimensions = {5, 5},
                                 .padding = {2, 2, 2, 2},
@@ -2092,13 +2186,14 @@
   {
     // Test pool2d with strides=2, padding=1 and roundingType="floor".
     Pool2dTester{
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {1, 3, 7, 7}},
         .options = {.window_dimensions = Vector<uint32_t>({4, 4}),
                     .padding = Vector<uint32_t>({1, 1, 1, 1}),
                     .strides = Vector<uint32_t>({2, 2}),
                     .rounding_type = V8MLRoundingType::Enum::kFloor},
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kFloat32,
+        .expected_operand = {.data_type =
+                                 blink_mojom::Operand::DataType::kFloat32,
                              .dimensions = {1, 3, 3, 3}},
         .expected_attributes = {.window_dimensions = {4, 4},
                                 .padding = {1, 1, 1, 1},
@@ -2109,13 +2204,14 @@
   {
     // Test pool2d with strides=2, padding=1 and roundingType="ceil".
     Pool2dTester{
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {1, 3, 7, 7}},
         .options = {.window_dimensions = Vector<uint32_t>({4, 4}),
                     .padding = Vector<uint32_t>({1, 1, 1, 1}),
                     .strides = Vector<uint32_t>({2, 2}),
                     .rounding_type = V8MLRoundingType::Enum::kCeil},
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kFloat32,
+        .expected_operand = {.data_type =
+                                 blink_mojom::Operand::DataType::kFloat32,
                              .dimensions = {1, 3, 4, 4}},
         .expected_attributes = {.window_dimensions = {4, 4},
                                 .padding = {1, 1, 1, 1},
@@ -2128,14 +2224,15 @@
     // When the output sizes are explicitly specified, the
     // options.roundingType is ignored.
     Pool2dTester{
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {1, 3, 7, 7}},
         .options = {.window_dimensions = Vector<uint32_t>({4, 4}),
                     .padding = Vector<uint32_t>({1, 1, 1, 1}),
                     .strides = Vector<uint32_t>({2, 2}),
                     .rounding_type = V8MLRoundingType::Enum::kCeil,
                     .output_sizes = Vector<uint32_t>({3, 3})},
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kFloat32,
+        .expected_operand = {.data_type =
+                                 blink_mojom::Operand::DataType::kFloat32,
                              .dimensions = {1, 3, 3, 3}},
         .expected_attributes = {.window_dimensions = {4, 4},
                                 .padding = {1, 1, 1, 1},
@@ -2146,7 +2243,7 @@
   {
     // Test pool2d with layout="nhwc".
     Pool2dTester{
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {1, 7, 7, 3}},
         .options = {.window_dimensions = Vector<uint32_t>({4, 4}),
                     .padding = Vector<uint32_t>({1, 1, 1, 1}),
@@ -2154,7 +2251,8 @@
                     .layout = V8MLInputOperandLayout::Enum::kNhwc,
                     .rounding_type = V8MLRoundingType::Enum::kCeil,
                     .output_sizes = Vector<uint32_t>({3, 3})},
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kFloat32,
+        .expected_operand = {.data_type =
+                                 blink_mojom::Operand::DataType::kFloat32,
                              .dimensions = {1, 3, 3, 3}},
         .expected_attributes =
             {.window_dimensions = {4, 4},
@@ -2175,10 +2273,12 @@
             V8TestingScope& scope,
             MLGraphBuilder* builder) {
     // Build the graph.
-    auto* input_operand = BuildInput(builder, "input", input.dimensions,
-                                     input.type, scope.GetExceptionState());
-    auto* slope_operand = BuildInput(builder, "slope", slope.dimensions,
-                                     slope.type, scope.GetExceptionState());
+    auto* input_operand =
+        BuildInput(builder, "input", input.dimensions, input.data_type,
+                   scope.GetExceptionState());
+    auto* slope_operand =
+        BuildInput(builder, "slope", slope.dimensions, slope.data_type,
+                   scope.GetExceptionState());
     auto* output_operand =
         builder->prelu(input_operand, slope_operand, scope.GetExceptionState());
     auto [graph, build_exception] =
@@ -2200,7 +2300,7 @@
     ASSERT_TRUE(input_operand_iter != graph_info->id_to_operand_map.end());
     EXPECT_EQ(input_operand_iter->value->kind,
               blink_mojom::Operand::Kind::kInput);
-    EXPECT_EQ(input_operand_iter->value->data_type, expected.type);
+    EXPECT_EQ(input_operand_iter->value->data_type, expected.data_type);
     EXPECT_EQ(input_operand_iter->value->dimensions, input.dimensions);
     EXPECT_EQ(input_operand_iter->value->name, "input");
     EXPECT_EQ(prelu->input_operand_id, input_operand_id);
@@ -2212,7 +2312,7 @@
     ASSERT_TRUE(slope_operand_iter != graph_info->id_to_operand_map.end());
     EXPECT_EQ(slope_operand_iter->value->kind,
               blink_mojom::Operand::Kind::kInput);
-    EXPECT_EQ(slope_operand_iter->value->data_type, expected.type);
+    EXPECT_EQ(slope_operand_iter->value->data_type, expected.data_type);
     EXPECT_EQ(slope_operand_iter->value->dimensions, slope.dimensions);
     EXPECT_EQ(slope_operand_iter->value->name, "slope");
     EXPECT_EQ(prelu->slope_operand_id, slope_operand_id);
@@ -2225,7 +2325,7 @@
     ASSERT_TRUE(output_operand_iter != graph_info->id_to_operand_map.end());
     EXPECT_EQ(output_operand_iter->value->kind,
               blink_mojom::Operand::Kind::kOutput);
-    EXPECT_EQ(output_operand_iter->value->data_type, expected.type);
+    EXPECT_EQ(output_operand_iter->value->data_type, expected.data_type);
     EXPECT_EQ(output_operand_iter->value->dimensions, expected.dimensions);
     EXPECT_EQ(output_operand_iter->value->name, "output");
     EXPECT_EQ(prelu->output_operand_id, output_operand_id);
@@ -2246,32 +2346,35 @@
   ASSERT_NE(builder, nullptr);
   {
     // Test prelu operator when input shape is the same as slope shape.
-    PreluTester{.input = {.type = V8MLOperandType::Enum::kFloat32,
-                          .dimensions = {2, 3, 5}},
-                .slope = {.type = V8MLOperandType::Enum::kFloat32,
-                          .dimensions = {2, 3, 5}},
-                .expected = {.type = blink_mojom::Operand::DataType::kFloat32,
-                             .dimensions = {2, 3, 5}}}
+    PreluTester{
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
+                  .dimensions = {2, 3, 5}},
+        .slope = {.data_type = V8MLOperandDataType::Enum::kFloat32,
+                  .dimensions = {2, 3, 5}},
+        .expected = {.data_type = blink_mojom::Operand::DataType::kFloat32,
+                     .dimensions = {2, 3, 5}}}
         .Test(*this, scope, builder);
   }
   {
     // Test prelu operator with input shape as {2, 3, 5} and slope shape as {3,
     // 5}.
-    PreluTester{.input = {.type = V8MLOperandType::Enum::kFloat16,
-                          .dimensions = {2, 3, 5}},
-                .slope = {.type = V8MLOperandType::Enum::kFloat16,
-                          .dimensions = {3, 5}},
-                .expected = {.type = blink_mojom::Operand::DataType::kFloat16,
-                             .dimensions = {2, 3, 5}}}
+    PreluTester{
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat16,
+                  .dimensions = {2, 3, 5}},
+        .slope = {.data_type = V8MLOperandDataType::Enum::kFloat16,
+                  .dimensions = {3, 5}},
+        .expected = {.data_type = blink_mojom::Operand::DataType::kFloat16,
+                     .dimensions = {2, 3, 5}}}
         .Test(*this, scope, builder);
   }
   {
     // Test prelu operator with input shape as {2, 3, 5} and slope shape as {5}.
     PreluTester{
-        .input = {.type = V8MLOperandType::Enum::kFloat16,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat16,
                   .dimensions = {2, 3, 5}},
-        .slope = {.type = V8MLOperandType::Enum::kFloat16, .dimensions = {5}},
-        .expected = {.type = blink_mojom::Operand::DataType::kFloat16,
+        .slope = {.data_type = V8MLOperandDataType::Enum::kFloat16,
+                  .dimensions = {5}},
+        .expected = {.data_type = blink_mojom::Operand::DataType::kFloat16,
                      .dimensions = {2, 3, 5}}}
         .Test(*this, scope, builder);
   }
@@ -2285,8 +2388,9 @@
             V8TestingScope& scope,
             MLGraphBuilder* builder) {
     // Build the graph.
-    auto* input_operand = BuildInput(builder, "input", input.dimensions,
-                                     input.type, scope.GetExceptionState());
+    auto* input_operand =
+        BuildInput(builder, "input", input.dimensions, input.data_type,
+                   scope.GetExceptionState());
     auto* output_operand =
         builder->relu(input_operand, scope.GetExceptionState());
     auto [graph, build_exception] =
@@ -2304,7 +2408,7 @@
     ASSERT_TRUE(input_operand_iter != graph_info->id_to_operand_map.end());
     EXPECT_EQ(input_operand_iter->value->kind,
               blink_mojom::Operand::Kind::kInput);
-    EXPECT_EQ(input_operand_iter->value->data_type, expected.type);
+    EXPECT_EQ(input_operand_iter->value->data_type, expected.data_type);
     EXPECT_EQ(input_operand_iter->value->dimensions, input.dimensions);
     EXPECT_EQ(input_operand_iter->value->name, "input");
     // Verify the output `mojo::Operand`.
@@ -2314,7 +2418,7 @@
     ASSERT_TRUE(output_operand_iter != graph_info->id_to_operand_map.end());
     EXPECT_EQ(output_operand_iter->value->kind,
               blink_mojom::Operand::Kind::kOutput);
-    EXPECT_EQ(output_operand_iter->value->data_type, expected.type);
+    EXPECT_EQ(output_operand_iter->value->data_type, expected.data_type);
     EXPECT_EQ(output_operand_iter->value->dimensions, expected.dimensions);
     EXPECT_EQ(output_operand_iter->value->name, "output");
     // Verify the `mojo::Operator`.
@@ -2342,40 +2446,43 @@
   {
     // Test relu operator for 0-D scalar.
     ReluTester{
-        .input = {.type = V8MLOperandType::Enum::kFloat32, .dimensions = {}},
-        .expected = {.type = blink_mojom::Operand::DataType::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
+                  .dimensions = {}},
+        .expected = {.data_type = blink_mojom::Operand::DataType::kFloat32,
                      .dimensions = {}}}
         .Test(*this, scope, builder);
   }
   {
     // Test relu operator for 1-D tensor.
     ReluTester{
-        .input = {.type = V8MLOperandType::Enum::kFloat32, .dimensions = {2}},
-        .expected = {.type = blink_mojom::Operand::DataType::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
+                  .dimensions = {2}},
+        .expected = {.data_type = blink_mojom::Operand::DataType::kFloat32,
                      .dimensions = {2}}}
         .Test(*this, scope, builder);
   }
   {
     // Test relu operator for 2-D tensor.
-    ReluTester{.input = {.type = V8MLOperandType::Enum::kFloat16,
-                         .dimensions = {3, 7}},
-               .expected = {.type = blink_mojom::Operand::DataType::kFloat16,
-                            .dimensions = {3, 7}}}
+    ReluTester{
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat16,
+                  .dimensions = {3, 7}},
+        .expected = {.data_type = blink_mojom::Operand::DataType::kFloat16,
+                     .dimensions = {3, 7}}}
         .Test(*this, scope, builder);
   }
   {
     // Test relu operator for 3-D tensor.
-    ReluTester{.input = {.type = V8MLOperandType::Enum::kInt32,
+    ReluTester{.input = {.data_type = V8MLOperandDataType::Enum::kInt32,
                          .dimensions = {1, 5, 3}},
-               .expected = {.type = blink_mojom::Operand::DataType::kInt32,
+               .expected = {.data_type = blink_mojom::Operand::DataType::kInt32,
                             .dimensions = {1, 5, 3}}}
         .Test(*this, scope, builder);
   }
   {
     // Test relu operator for 4-D tensor.
-    ReluTester{.input = {.type = V8MLOperandType::Enum::kUint8,
+    ReluTester{.input = {.data_type = V8MLOperandDataType::Enum::kUint8,
                          .dimensions = {1, 2, 2, 1}},
-               .expected = {.type = blink_mojom::Operand::DataType::kUint8,
+               .expected = {.data_type = blink_mojom::Operand::DataType::kUint8,
                             .dimensions = {1, 2, 2, 1}}}
         .Test(*this, scope, builder);
   }
@@ -2398,8 +2505,9 @@
             V8TestingScope& scope,
             MLGraphBuilder* builder) {
     // Build the graph.
-    auto* input_operand = BuildInput(builder, "input", input.dimensions,
-                                     input.type, scope.GetExceptionState());
+    auto* input_operand =
+        BuildInput(builder, "input", input.dimensions, input.data_type,
+                   scope.GetExceptionState());
     MLResample2dOptions* ml_resample2d_options = MLResample2dOptions::Create();
     if (options.mode) {
       ml_resample2d_options->setMode(options.mode.value());
@@ -2436,7 +2544,8 @@
     auto output_operand_iter =
         graph_info->id_to_operand_map.find(output_operand_id);
     ASSERT_TRUE(output_operand_iter != graph_info->id_to_operand_map.end());
-    EXPECT_EQ(output_operand_iter->value->data_type, expected_operand.type);
+    EXPECT_EQ(output_operand_iter->value->data_type,
+              expected_operand.data_type);
     EXPECT_EQ(output_operand_iter->value->dimensions,
               expected_operand.dimensions);
   }
@@ -2455,19 +2564,21 @@
   auto* builder = CreateGraphBuilder(scope, options);
   {
     Resample2dTester{
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {1, 3, 4, 4}},
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kFloat32,
+        .expected_operand = {.data_type =
+                                 blink_mojom::Operand::DataType::kFloat32,
                              .dimensions = {1, 3, 4, 4}}}
         .Test(*this, scope, builder);
   }
   {  // Test resample2d with mode =
      // "blink::V8MLInterpolationMode::Enum::kLinear".
     Resample2dTester{
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {1, 1, 2, 4}},
         .options = {.mode = blink::V8MLInterpolationMode::Enum::kLinear},
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kFloat32,
+        .expected_operand = {.data_type =
+                                 blink_mojom::Operand::DataType::kFloat32,
                              .dimensions = {1, 1, 2, 4}},
         .expected_mode = blink_mojom::Resample2d::InterpolationMode::kLinear}
         .Test(*this, scope, builder);
@@ -2475,30 +2586,33 @@
   {
     // Test resample2d with scales = {2.0, 2.0}.
     Resample2dTester{
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {1, 1, 2, 4}},
         .options = {.scales = Vector<float>{2.0, 2.0}},
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kFloat32,
+        .expected_operand = {.data_type =
+                                 blink_mojom::Operand::DataType::kFloat32,
                              .dimensions = {1, 1, 4, 8}}}
         .Test(*this, scope, builder);
   }
   {
     // Test resample2d with scales = {0.5, 0.5}.
     Resample2dTester{
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {1, 1, 2, 4}},
         .options = {.scales = Vector<float>{0.5, 0.5}},
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kFloat32,
+        .expected_operand = {.data_type =
+                                 blink_mojom::Operand::DataType::kFloat32,
                              .dimensions = {1, 1, 1, 2}}}
         .Test(*this, scope, builder);
   }
   {
     // Test resample2d with sizes = {3, 6}.
     Resample2dTester{
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {1, 1, 2, 4}},
         .options = {.sizes = Vector<uint32_t>{3, 6}},
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kFloat32,
+        .expected_operand = {.data_type =
+                                 blink_mojom::Operand::DataType::kFloat32,
                              .dimensions = {1, 1, 3, 6}}}
         .Test(*this, scope, builder);
   }
@@ -2506,44 +2620,48 @@
     // Test resample2d with sizes = {3, 6} and scales = {0.5, 0.5} which should
     // be ignored.
     Resample2dTester{
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {1, 1, 2, 4}},
         .options = {.scales = Vector<float>{0.5, 0.5},
                     .sizes = Vector<uint32_t>{3, 6}},
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kFloat32,
+        .expected_operand = {.data_type =
+                                 blink_mojom::Operand::DataType::kFloat32,
                              .dimensions = {1, 1, 3, 6}}}
         .Test(*this, scope, builder);
   }
   {
     // Test resample2d with scales = {1.0, 2.0} and axes = {0, 1}.
     Resample2dTester{
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {1, 1, 2, 4}},
         .options = {.scales = Vector<float>{1.0, 2.0},
                     .axes = Vector<uint32_t>{0, 1}},
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kFloat32,
+        .expected_operand = {.data_type =
+                                 blink_mojom::Operand::DataType::kFloat32,
                              .dimensions = {1, 2, 2, 4}}}
         .Test(*this, scope, builder);
   }
   {
     // Test resample2d with scales = {1.0, 2.0} and axes = {1, 2}.
     Resample2dTester{
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {1, 1, 2, 4}},
         .options = {.scales = Vector<float>{1.0, 2.0},
                     .axes = Vector<uint32_t>{1, 2}},
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kFloat32,
+        .expected_operand = {.data_type =
+                                 blink_mojom::Operand::DataType::kFloat32,
                              .dimensions = {1, 1, 4, 4}}}
         .Test(*this, scope, builder);
   }
   {
     // Test resample2d with scales = {1.0, 2.0} and axes = {2, 3}.
     Resample2dTester{
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {1, 1, 2, 4}},
         .options = {.scales = Vector<float>{1.0, 2.0},
                     .axes = Vector<uint32_t>{2, 3}},
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kFloat32,
+        .expected_operand = {.data_type =
+                                 blink_mojom::Operand::DataType::kFloat32,
                              .dimensions = {1, 1, 2, 8}}}
         .Test(*this, scope, builder);
   }
@@ -2558,8 +2676,9 @@
             V8TestingScope& scope,
             MLGraphBuilder* builder) {
     // Build the graph.
-    auto* input_operand = BuildInput(builder, "input", input.dimensions,
-                                     input.type, scope.GetExceptionState());
+    auto* input_operand =
+        BuildInput(builder, "input", input.dimensions, input.data_type,
+                   scope.GetExceptionState());
     auto* output_operand =
         builder->reshape(input_operand, new_shape, scope.GetExceptionState());
     auto [graph, build_exception] =
@@ -2576,7 +2695,7 @@
     auto output_operand_iter =
         graph_info->id_to_operand_map.find(output_operand_id);
     ASSERT_TRUE(output_operand_iter != graph_info->id_to_operand_map.end());
-    EXPECT_EQ(output_operand_iter->value->data_type, expected.type);
+    EXPECT_EQ(output_operand_iter->value->data_type, expected.data_type);
     EXPECT_EQ(output_operand_iter->value->dimensions, expected.dimensions);
   }
 };
@@ -2596,55 +2715,61 @@
   {
     // Test reshaping 1-D tensor to 0-D scalar.
     ReshapeTester{
-        .input = {.type = V8MLOperandType::Enum::kFloat32, .dimensions = {1}},
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
+                  .dimensions = {1}},
         .new_shape = {},
-        .expected = {.type = blink_mojom::Operand::DataType::kFloat32,
+        .expected = {.data_type = blink_mojom::Operand::DataType::kFloat32,
                      .dimensions = {}}}
         .Test(*this, scope, builder);
   }
   {
     // Test reshaping 0-D scalar to 1-D tensor.
     ReshapeTester{
-        .input = {.type = V8MLOperandType::Enum::kFloat32, .dimensions = {}},
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
+                  .dimensions = {}},
         .new_shape = {1},
-        .expected = {.type = blink_mojom::Operand::DataType::kFloat32,
+        .expected = {.data_type = blink_mojom::Operand::DataType::kFloat32,
                      .dimensions = {1}}}
         .Test(*this, scope, builder);
   }
   {
     // Test reshaping 2-D tensor to 1-D tensor.
-    ReshapeTester{.input = {.type = V8MLOperandType::Enum::kFloat32,
-                            .dimensions = {2, 2}},
-                  .new_shape = {4},
-                  .expected = {.type = blink_mojom::Operand::DataType::kFloat32,
-                               .dimensions = {4}}}
+    ReshapeTester{
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
+                  .dimensions = {2, 2}},
+        .new_shape = {4},
+        .expected = {.data_type = blink_mojom::Operand::DataType::kFloat32,
+                     .dimensions = {4}}}
         .Test(*this, scope, builder);
   }
   {
     // Test reshaping from 2-D tensor to 1-D tensor with calculated dimension.
-    ReshapeTester{.input = {.type = V8MLOperandType::Enum::kFloat16,
-                            .dimensions = {2, 2}},
-                  .new_shape = {absl::nullopt},
-                  .expected = {.type = blink_mojom::Operand::DataType::kFloat16,
-                               .dimensions = {4}}}
+    ReshapeTester{
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat16,
+                  .dimensions = {2, 2}},
+        .new_shape = {absl::nullopt},
+        .expected = {.data_type = blink_mojom::Operand::DataType::kFloat16,
+                     .dimensions = {4}}}
         .Test(*this, scope, builder);
   }
   {
     // Test reshaping from 4-D tensor to 2-D tensor.
-    ReshapeTester{.input = {.type = V8MLOperandType::Enum::kInt32,
-                            .dimensions = {1, 2, 2, 1}},
-                  .new_shape = {1, 4},
-                  .expected = {.type = blink_mojom::Operand::DataType::kInt32,
-                               .dimensions = {1, 4}}}
+    ReshapeTester{
+        .input = {.data_type = V8MLOperandDataType::Enum::kInt32,
+                  .dimensions = {1, 2, 2, 1}},
+        .new_shape = {1, 4},
+        .expected = {.data_type = blink_mojom::Operand::DataType::kInt32,
+                     .dimensions = {1, 4}}}
         .Test(*this, scope, builder);
   }
   {
     // Test reshaping from 4-D tensor to 2-D tensor with calculated dimension.
-    ReshapeTester{.input = {.type = V8MLOperandType::Enum::kUint8,
-                            .dimensions = {1, 2, 2, 1}},
-                  .new_shape = {1, absl::nullopt},
-                  .expected = {.type = blink_mojom::Operand::DataType::kUint8,
-                               .dimensions = {1, 4}}}
+    ReshapeTester{
+        .input = {.data_type = V8MLOperandDataType::Enum::kUint8,
+                  .dimensions = {1, 2, 2, 1}},
+        .new_shape = {1, absl::nullopt},
+        .expected = {.data_type = blink_mojom::Operand::DataType::kUint8,
+                     .dimensions = {1, 4}}}
         .Test(*this, scope, builder);
   }
 }
@@ -2667,8 +2792,9 @@
             MLGraphBuilder* builder,
             FloatingPointUnaryKind kind) {
     // Build the graph.
-    auto* input_operand = BuildInput(builder, "input", input.dimensions,
-                                     input.type, scope.GetExceptionState());
+    auto* input_operand =
+        BuildInput(builder, "input", input.dimensions, input.data_type,
+                   scope.GetExceptionState());
     MLOperand* output_operand = nullptr;
     switch (kind) {
       case FloatingPointUnaryKind::kSigmoid:
@@ -2699,7 +2825,7 @@
     ASSERT_TRUE(input_operand_iter != graph_info->id_to_operand_map.end());
     EXPECT_EQ(input_operand_iter->value->kind,
               blink_mojom::Operand::Kind::kInput);
-    EXPECT_EQ(input_operand_iter->value->data_type, expected.type);
+    EXPECT_EQ(input_operand_iter->value->data_type, expected.data_type);
     EXPECT_EQ(input_operand_iter->value->dimensions, input.dimensions);
     EXPECT_EQ(input_operand_iter->value->name, "input");
 
@@ -2710,7 +2836,7 @@
     ASSERT_TRUE(output_operand_iter != graph_info->id_to_operand_map.end());
     EXPECT_EQ(output_operand_iter->value->kind,
               blink_mojom::Operand::Kind::kOutput);
-    EXPECT_EQ(output_operand_iter->value->data_type, expected.type);
+    EXPECT_EQ(output_operand_iter->value->data_type, expected.data_type);
     EXPECT_EQ(output_operand_iter->value->dimensions, expected.dimensions);
     EXPECT_EQ(output_operand_iter->value->name, "output");
 
@@ -2750,43 +2876,45 @@
   {
     // Test unary operator for 0-D scalar.
     FloatingPointUnaryTester{
-        .input = {.type = V8MLOperandType::Enum::kFloat32, .dimensions = {}},
-        .expected = {.type = blink_mojom::Operand::DataType::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
+                  .dimensions = {}},
+        .expected = {.data_type = blink_mojom::Operand::DataType::kFloat32,
                      .dimensions = {}}}
         .Test(*this, scope, builder);
   }
   {
     // Test unary operator for 1-D tensor.
     FloatingPointUnaryTester{
-        .input = {.type = V8MLOperandType::Enum::kFloat32, .dimensions = {2}},
-        .expected = {.type = blink_mojom::Operand::DataType::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
+                  .dimensions = {2}},
+        .expected = {.data_type = blink_mojom::Operand::DataType::kFloat32,
                      .dimensions = {2}}}
         .Test(*this, scope, builder);
   }
   {
     // Test unary operator for 2-D tensor.
     FloatingPointUnaryTester{
-        .input = {.type = V8MLOperandType::Enum::kFloat16,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat16,
                   .dimensions = {3, 7}},
-        .expected = {.type = blink_mojom::Operand::DataType::kFloat16,
+        .expected = {.data_type = blink_mojom::Operand::DataType::kFloat16,
                      .dimensions = {3, 7}}}
         .Test(*this, scope, builder);
   }
   {
     // Test unary operator for 3-D tensor.
     FloatingPointUnaryTester{
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {1, 5, 3}},
-        .expected = {.type = blink_mojom::Operand::DataType::kFloat32,
+        .expected = {.data_type = blink_mojom::Operand::DataType::kFloat32,
                      .dimensions = {1, 5, 3}}}
         .Test(*this, scope, builder);
   }
   {
     // Test unary operator for 4-D tensor.
     FloatingPointUnaryTester{
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {1, 2, 2, 1}},
-        .expected = {.type = blink_mojom::Operand::DataType::kFloat32,
+        .expected = {.data_type = blink_mojom::Operand::DataType::kFloat32,
                      .dimensions = {1, 2, 2, 1}}}
         .Test(*this, scope, builder);
   }
@@ -2805,8 +2933,9 @@
   void Test(MLGraphTestMojo& helper,
             V8TestingScope& scope,
             MLGraphBuilder* builder) {
-    auto* input_operand = BuildInput(builder, "input", input.dimensions,
-                                     input.type, scope.GetExceptionState());
+    auto* input_operand =
+        BuildInput(builder, "input", input.dimensions, input.data_type,
+                   scope.GetExceptionState());
     auto* output_operand =
         builder->slice(input_operand, options.starts, options.sizes,
                        scope.GetExceptionState());
@@ -2833,7 +2962,8 @@
     auto output_operand_iter =
         graph_info->id_to_operand_map.find(output_operand_id);
     ASSERT_TRUE(output_operand_iter != graph_info->id_to_operand_map.end());
-    EXPECT_EQ(output_operand_iter->value->data_type, expected_operand.type);
+    EXPECT_EQ(output_operand_iter->value->data_type,
+              expected_operand.data_type);
     EXPECT_EQ(output_operand_iter->value->dimensions,
               expected_operand.dimensions);
   }
@@ -2852,20 +2982,22 @@
   auto* builder = CreateGraphBuilder(scope, options);
   {
     SliceTester{
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {4, 4}},
         .options = {.starts = Vector<uint32_t>({0, 0}),
                     .sizes = Vector<uint32_t>({4, 4})},
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kFloat32,
+        .expected_operand = {.data_type =
+                                 blink_mojom::Operand::DataType::kFloat32,
                              .dimensions = {4, 4}},
         .expected_attributes = {.starts = {0, 0}, .sizes = {4, 4}}}
         .Test(*this, scope, builder);
     SliceTester{
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {1, 2, 3, 4, 5}},
         .options = {.starts = Vector<uint32_t>({0, 1, 2, 3, 4}),
                     .sizes = Vector<uint32_t>({1, 1, 1, 1, 1})},
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kFloat32,
+        .expected_operand = {.data_type =
+                                 blink_mojom::Operand::DataType::kFloat32,
                              .dimensions = {1, 1, 1, 1, 1}},
         .expected_attributes = {.starts = {0, 1, 2, 3, 4},
                                 .sizes = {1, 1, 1, 1, 1}}}
@@ -2881,8 +3013,9 @@
             V8TestingScope& scope,
             MLGraphBuilder* builder) {
     // Build the graph.
-    auto* input_operand = BuildInput(builder, "input", input.dimensions,
-                                     input.type, scope.GetExceptionState());
+    auto* input_operand =
+        BuildInput(builder, "input", input.dimensions, input.data_type,
+                   scope.GetExceptionState());
     auto* output_operand =
         builder->softmax(input_operand, scope.GetExceptionState());
     auto [graph, build_exception] =
@@ -2899,7 +3032,7 @@
     auto output_operand_iter =
         graph_info->id_to_operand_map.find(output_operand_id);
     ASSERT_TRUE(output_operand_iter != graph_info->id_to_operand_map.end());
-    EXPECT_EQ(output_operand_iter->value->data_type, expected.type);
+    EXPECT_EQ(output_operand_iter->value->data_type, expected.data_type);
     EXPECT_EQ(output_operand_iter->value->dimensions, expected.dimensions);
   }
 };
@@ -2918,18 +3051,20 @@
   ASSERT_NE(builder, nullptr);
   {
     // Test building softmax with float32 input.
-    SoftmaxTester{.input = {.type = V8MLOperandType::Enum::kFloat32,
-                            .dimensions = {2, 4}},
-                  .expected = {.type = blink_mojom::Operand::DataType::kFloat32,
-                               .dimensions = {2, 4}}}
+    SoftmaxTester{
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
+                  .dimensions = {2, 4}},
+        .expected = {.data_type = blink_mojom::Operand::DataType::kFloat32,
+                     .dimensions = {2, 4}}}
         .Test(*this, scope, builder);
   }
   {
     // Test building softmax with float16 input.
-    SoftmaxTester{.input = {.type = V8MLOperandType::Enum::kFloat16,
-                            .dimensions = {1, 5}},
-                  .expected = {.type = blink_mojom::Operand::DataType::kFloat16,
-                               .dimensions = {1, 5}}}
+    SoftmaxTester{
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat16,
+                  .dimensions = {1, 5}},
+        .expected = {.data_type = blink_mojom::Operand::DataType::kFloat16,
+                     .dimensions = {1, 5}}}
         .Test(*this, scope, builder);
   }
 }
@@ -2944,8 +3079,9 @@
             V8TestingScope& scope,
             MLGraphBuilder* builder) {
     // Build the graph.
-    auto* input_operand = BuildInput(builder, "input", input.dimensions,
-                                     input.type, scope.GetExceptionState());
+    auto* input_operand =
+        BuildInput(builder, "input", input.dimensions, input.data_type,
+                   scope.GetExceptionState());
     MLTransposeOptions* options = MLTransposeOptions::Create();
     if (permutation.has_value()) {
       options->setPermutation(permutation.value());
@@ -2973,7 +3109,7 @@
     auto input_operand_iter =
         graph_info->id_to_operand_map.find(input_operand_id);
     ASSERT_TRUE(input_operand_iter != graph_info->id_to_operand_map.end());
-    EXPECT_EQ(input_operand_iter->value->data_type, expected_operand.type);
+    EXPECT_EQ(input_operand_iter->value->data_type, expected_operand.data_type);
     EXPECT_EQ(input_operand_iter->value->dimensions, input.dimensions);
 
     // Validate the output operand.
@@ -2983,7 +3119,8 @@
     auto output_operand_iter =
         graph_info->id_to_operand_map.find(output_operand_id);
     ASSERT_TRUE(output_operand_iter != graph_info->id_to_operand_map.end());
-    EXPECT_EQ(output_operand_iter->value->data_type, expected_operand.type);
+    EXPECT_EQ(output_operand_iter->value->data_type,
+              expected_operand.data_type);
     EXPECT_EQ(output_operand_iter->value->dimensions,
               expected_operand.dimensions);
   }
@@ -3003,9 +3140,10 @@
   {
     // Test transpose operator with default options.
     TransposeTester{
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {1, 2, 3, 4}},
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kFloat32,
+        .expected_operand = {.data_type =
+                                 blink_mojom::Operand::DataType::kFloat32,
                              .dimensions = {4, 3, 2, 1}},
         .expected_permutation = {3, 2, 1, 0}}
         .Test(*this, scope, builder);
@@ -3013,10 +3151,11 @@
   {
     // Test transpose operator with a given permutation.
     TransposeTester{
-        .input = {.type = V8MLOperandType::Enum::kFloat16,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat16,
                   .dimensions = {1, 2, 3, 4}},
         .permutation = Vector<uint32_t>{3, 0, 2, 1},
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kFloat16,
+        .expected_operand = {.data_type =
+                                 blink_mojom::Operand::DataType::kFloat16,
                              .dimensions = {4, 1, 3, 2}},
         .expected_permutation = {3, 0, 2, 1}}
         .Test(*this, scope, builder);
@@ -3051,8 +3190,9 @@
             MLGraphBuilder* builder,
             ReduceKind kind) {
     // Build the graph.
-    auto* input_operand = BuildInput(builder, "input", input.dimensions,
-                                     input.type, scope.GetExceptionState());
+    auto* input_operand =
+        BuildInput(builder, "input", input.dimensions, input.data_type,
+                   scope.GetExceptionState());
     MLReduceOptions* options = MLReduceOptions::Create();
     if (axes.has_value()) {
       options->setAxes(axes.value());
@@ -3119,7 +3259,7 @@
     auto input_operand_iter =
         graph_info->id_to_operand_map.find(input_operand_id);
     ASSERT_TRUE(input_operand_iter != graph_info->id_to_operand_map.end());
-    EXPECT_EQ(input_operand_iter->value->data_type, expected_operand.type);
+    EXPECT_EQ(input_operand_iter->value->data_type, expected_operand.data_type);
     EXPECT_EQ(input_operand_iter->value->dimensions, input.dimensions);
 
     // Validate the output operand.
@@ -3129,7 +3269,8 @@
     auto output_operand_iter =
         graph_info->id_to_operand_map.find(output_operand_id);
     ASSERT_TRUE(output_operand_iter != graph_info->id_to_operand_map.end());
-    EXPECT_EQ(output_operand_iter->value->data_type, expected_operand.type);
+    EXPECT_EQ(output_operand_iter->value->data_type,
+              expected_operand.data_type);
     EXPECT_EQ(output_operand_iter->value->dimensions,
               expected_operand.dimensions);
   }
@@ -3150,9 +3291,10 @@
   {
     // Test reduce operator with default options.
     ReduceTester{
-        .input = {.type = V8MLOperandType::Enum::kFloat32,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                   .dimensions = {1, 2, 3, 4}},
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kFloat32,
+        .expected_operand = {.data_type =
+                                 blink_mojom::Operand::DataType::kFloat32,
                              .dimensions = {}},
         .expected_axes = {0, 1, 2, 3},
         .expected_keep_dimensions = false}
@@ -3161,11 +3303,12 @@
   {
     // Test reduce operator with a given axes and keep_dimensions.
     ReduceTester{
-        .input = {.type = V8MLOperandType::Enum::kFloat16,
+        .input = {.data_type = V8MLOperandDataType::Enum::kFloat16,
                   .dimensions = {1, 2, 3, 4}},
         .axes = Vector<uint32_t>{1},
         .keep_dimensions = true,
-        .expected_operand = {.type = blink_mojom::Operand::DataType::kFloat16,
+        .expected_operand = {.data_type =
+                                 blink_mojom::Operand::DataType::kFloat16,
                              .dimensions = {1, 1, 3, 4}},
         .expected_axes = {1},
         .expected_keep_dimensions = true}
@@ -3183,7 +3326,7 @@
             MLGraphBuilder* builder) {
     // Build the graph.
     auto* constant_operand =
-        BuildConstant(builder, constant.dimensions, constant.type,
+        BuildConstant(builder, constant.dimensions, constant.data_type,
                       constant.values, scope.GetExceptionState());
     auto* output_operand =
         builder->relu(constant_operand, scope.GetExceptionState());
@@ -3203,7 +3346,7 @@
       ASSERT_TRUE(constant_operand_iter != graph_info->id_to_operand_map.end());
       EXPECT_EQ(constant_operand_iter->value->kind,
                 blink_mojom::Operand::Kind::kConstant);
-      EXPECT_EQ(constant_operand_iter->value->data_type, expected.type);
+      EXPECT_EQ(constant_operand_iter->value->data_type, expected.data_type);
       EXPECT_EQ(constant_operand_iter->value->dimensions, expected.dimensions);
       EXPECT_EQ(constant_operand_iter->value->name.empty(), true);
       // Verify the constant data in the mojo.
@@ -3232,10 +3375,10 @@
   {
     // Test scalar constant operand.
     ConstantTester<float>{
-        .constant = {.type = V8MLOperandType::Enum::kFloat32,
+        .constant = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                      .dimensions = {},
                      .values = {1.0}},
-        .expected = {.type = blink_mojom::Operand::DataType::kFloat32,
+        .expected = {.data_type = blink_mojom::Operand::DataType::kFloat32,
                      .dimensions = {}},
         .expected_constant_data = {1.0}}
         .Test(*this, scope, builder);
@@ -3243,10 +3386,10 @@
   {
     // Test Constant operand for Float32 data type.
     ConstantTester<float>{
-        .constant = {.type = V8MLOperandType::Enum::kFloat32,
+        .constant = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                      .dimensions = {2, 3},
                      .values = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0}},
-        .expected = {.type = blink_mojom::Operand::DataType::kFloat32,
+        .expected = {.data_type = blink_mojom::Operand::DataType::kFloat32,
                      .dimensions = {2, 3}},
         .expected_constant_data = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0}}
         .Test(*this, scope, builder);
@@ -3254,10 +3397,10 @@
   {
     // Test Constant operand for Float16 data type.
     ConstantTester<uint16_t>{
-        .constant = {.type = V8MLOperandType::Enum::kFloat16,
+        .constant = {.data_type = V8MLOperandDataType::Enum::kFloat16,
                      .dimensions = {2, 3},
                      .values = {1, 2, 3, 4, 5, 6}},
-        .expected = {.type = blink_mojom::Operand::DataType::kFloat16,
+        .expected = {.data_type = blink_mojom::Operand::DataType::kFloat16,
                      .dimensions = {2, 3}},
         .expected_constant_data = {1, 2, 3, 4, 5, 6}}
         .Test(*this, scope, builder);
@@ -3265,10 +3408,10 @@
   {
     // Test Constant operand for Int32 data type.
     ConstantTester<int32_t>{
-        .constant = {.type = V8MLOperandType::Enum::kInt32,
+        .constant = {.data_type = V8MLOperandDataType::Enum::kInt32,
                      .dimensions = {2, 3},
                      .values = {1, 2, 3, 4, 5, 6}},
-        .expected = {.type = blink_mojom::Operand::DataType::kInt32,
+        .expected = {.data_type = blink_mojom::Operand::DataType::kInt32,
                      .dimensions = {2, 3}},
         .expected_constant_data = {1, 2, 3, 4, 5, 6}}
         .Test(*this, scope, builder);
@@ -3276,10 +3419,10 @@
   {
     // Test Constant operand for UInt32 data type.
     ConstantTester<uint32_t>{
-        .constant = {.type = V8MLOperandType::Enum::kUint32,
+        .constant = {.data_type = V8MLOperandDataType::Enum::kUint32,
                      .dimensions = {2, 3},
                      .values = {1, 2, 3, 4, 5, 6}},
-        .expected = {.type = blink_mojom::Operand::DataType::kUint32,
+        .expected = {.data_type = blink_mojom::Operand::DataType::kUint32,
                      .dimensions = {2, 3}},
         .expected_constant_data = {1, 2, 3, 4, 5, 6}}
         .Test(*this, scope, builder);
@@ -3287,10 +3430,10 @@
   {
     // Test Constant operand for Int8 data type.
     ConstantTester<int8_t>{
-        .constant = {.type = V8MLOperandType::Enum::kInt8,
+        .constant = {.data_type = V8MLOperandDataType::Enum::kInt8,
                      .dimensions = {2, 3},
                      .values = {1, 2, 3, 4, 5, 6}},
-        .expected = {.type = blink_mojom::Operand::DataType::kInt8,
+        .expected = {.data_type = blink_mojom::Operand::DataType::kInt8,
                      .dimensions = {2, 3}},
         .expected_constant_data = {1, 2, 3, 4, 5, 6}}
         .Test(*this, scope, builder);
@@ -3298,10 +3441,10 @@
   {
     // Test Constant operand for UInt8 data type.
     ConstantTester<uint8_t>{
-        .constant = {.type = V8MLOperandType::Enum::kUint8,
+        .constant = {.data_type = V8MLOperandDataType::Enum::kUint8,
                      .dimensions = {2, 3},
                      .values = {1, 2, 3, 4, 5, 6}},
-        .expected = {.type = blink_mojom::Operand::DataType::kUint8,
+        .expected = {.data_type = blink_mojom::Operand::DataType::kUint8,
                      .dimensions = {2, 3}},
         .expected_constant_data = {1, 2, 3, 4, 5, 6}}
         .Test(*this, scope, builder);
@@ -3317,8 +3460,9 @@
   void Test(MLGraphTestMojo& helper,
             V8TestingScope& scope,
             MLGraphBuilder* builder) {
-    auto* input_operand = BuildInput(builder, "input", input.dimensions,
-                                     input.type, scope.GetExceptionState());
+    auto* input_operand =
+        BuildInput(builder, "input", input.dimensions, input.data_type,
+                   scope.GetExceptionState());
     auto* attributes = MLSplitOptions::Create();
     if (axis.has_value()) {
       attributes->setAxis(axis.value());
@@ -3353,7 +3497,7 @@
       auto output_operand_iter =
           graph_info->id_to_operand_map.find(output_operand_id);
       ASSERT_TRUE(output_operand_iter != graph_info->id_to_operand_map.end());
-      EXPECT_EQ(output_operand_iter->value->data_type, expected[i].type);
+      EXPECT_EQ(output_operand_iter->value->data_type, expected[i].data_type);
       EXPECT_EQ(output_operand_iter->value->dimensions, expected[i].dimensions);
     }
   }
@@ -3370,29 +3514,32 @@
   // Create WebNN Context with GPU device type.
   options->setDeviceType(V8MLDeviceType::Enum::kGpu);
   auto* builder = CreateGraphBuilder(scope, options);
-  using v8 = V8MLOperandType::Enum;
+  using v8 = V8MLOperandDataType::Enum;
   using blink = blink_mojom::Operand::DataType;
   {
-    SplitTester{.input = {.type = v8::kFloat32, .dimensions = {2, 2}},
-                .splits = 2u,
-                .expected = {{.type = blink::kFloat32, .dimensions = {1, 2}},
-                             {.type = blink::kFloat32, .dimensions = {1, 2}}}}
+    SplitTester{
+        .input = {.data_type = v8::kFloat32, .dimensions = {2, 2}},
+        .splits = 2u,
+        .expected = {{.data_type = blink::kFloat32, .dimensions = {1, 2}},
+                     {.data_type = blink::kFloat32, .dimensions = {1, 2}}}}
         .Test(*this, scope, builder);
   }
   {
-    SplitTester{.input = {.type = v8::kFloat32, .dimensions = {2, 2}},
-                .splits = 2u,
-                .axis = 1,
-                .expected = {{.type = blink::kFloat32, .dimensions = {2, 1}},
-                             {.type = blink::kFloat32, .dimensions = {2, 1}}}}
+    SplitTester{
+        .input = {.data_type = v8::kFloat32, .dimensions = {2, 2}},
+        .splits = 2u,
+        .axis = 1,
+        .expected = {{.data_type = blink::kFloat32, .dimensions = {2, 1}},
+                     {.data_type = blink::kFloat32, .dimensions = {2, 1}}}}
         .Test(*this, scope, builder);
   }
   {
-    SplitTester{.input = {.type = v8::kFloat32, .dimensions = {6, 2}},
-                .splits = Vector<uint32_t>{1, 2, 3},
-                .expected = {{.type = blink::kFloat32, .dimensions = {1, 2}},
-                             {.type = blink::kFloat32, .dimensions = {2, 2}},
-                             {.type = blink::kFloat32, .dimensions = {3, 2}}}}
+    SplitTester{
+        .input = {.data_type = v8::kFloat32, .dimensions = {6, 2}},
+        .splits = Vector<uint32_t>{1, 2, 3},
+        .expected = {{.data_type = blink::kFloat32, .dimensions = {1, 2}},
+                     {.data_type = blink::kFloat32, .dimensions = {2, 2}},
+                     {.data_type = blink::kFloat32, .dimensions = {3, 2}}}}
         .Test(*this, scope, builder);
   }
 }
@@ -3415,10 +3562,10 @@
 
   // Build the graph.
   auto* lhs_operand =
-      BuildInput(builder, "lhs", dimensions, V8MLOperandType::Enum::kUint8,
+      BuildInput(builder, "lhs", dimensions, V8MLOperandDataType::Enum::kUint8,
                  scope.GetExceptionState());
   auto* rhs_operand =
-      BuildInput(builder, "rhs", dimensions, V8MLOperandType::Enum::kUint8,
+      BuildInput(builder, "rhs", dimensions, V8MLOperandDataType::Enum::kUint8,
                  scope.GetExceptionState());
   auto* output_operand = BuildElementWiseBinary(
       scope, builder, ElementWiseBinaryKind::kAdd, lhs_operand, rhs_operand);
diff --git a/third_party/blink/renderer/modules/ml/webnn/ml_graph_tflite_converter.cc b/third_party/blink/renderer/modules/ml/webnn/ml_graph_tflite_converter.cc
index b448ee41..d1c9df3 100644
--- a/third_party/blink/renderer/modules/ml/webnn/ml_graph_tflite_converter.cc
+++ b/third_party/blink/renderer/modules/ml/webnn/ml_graph_tflite_converter.cc
@@ -52,19 +52,20 @@
   return output_dimensions;
 }
 
-tflite::TensorType BlinkOperandTypeToTFLite(V8MLOperandType::Enum type) {
-  switch (type) {
-    case V8MLOperandType::Enum::kFloat32:
+tflite::TensorType BlinkOperandTypeToTFLite(
+    V8MLOperandDataType::Enum data_type) {
+  switch (data_type) {
+    case V8MLOperandDataType::Enum::kFloat32:
       return tflite::TensorType_FLOAT32;
-    case V8MLOperandType::Enum::kFloat16:
+    case V8MLOperandDataType::Enum::kFloat16:
       return tflite::TensorType_FLOAT16;
-    case V8MLOperandType::Enum::kInt32:
+    case V8MLOperandDataType::Enum::kInt32:
       return tflite::TensorType_INT32;
-    case V8MLOperandType::Enum::kUint32:
+    case V8MLOperandDataType::Enum::kUint32:
       return tflite::TensorType_UINT32;
-    case V8MLOperandType::Enum::kInt8:
+    case V8MLOperandDataType::Enum::kInt8:
       return tflite::TensorType_INT8;
-    case V8MLOperandType::Enum::kUint8:
+    case V8MLOperandDataType::Enum::kUint8:
       return tflite::TensorType_UINT8;
   }
   NOTREACHED_NORETURN();
@@ -272,7 +273,7 @@
   // Create `Tensor` with operand shape, the index of buffer and the name.
   const auto dimensions =
       builder_.CreateVector<int32_t>(ConvertDimensions(operand->Dimensions()));
-  const auto operand_type = BlinkOperandTypeToTFLite(operand->Type());
+  const auto operand_type = BlinkOperandTypeToTFLite(operand->DataType());
   const auto operand_name =
       name.has_value() ? builder_.CreateString(name->Utf8()) : 0;
   tensors_.emplace_back(tflite::CreateTensor(builder_, std::move(dimensions),
diff --git a/third_party/blink/renderer/modules/ml/webnn/ml_graph_type_converter.cc b/third_party/blink/renderer/modules/ml/webnn/ml_graph_type_converter.cc
index 122e574..69b58b1 100644
--- a/third_party/blink/renderer/modules/ml/webnn/ml_graph_type_converter.cc
+++ b/third_party/blink/renderer/modules/ml/webnn/ml_graph_type_converter.cc
@@ -27,19 +27,19 @@
 namespace mojo {
 
 blink_mojom::Operand::DataType BlinkOperandTypeToMojo(
-    blink::V8MLOperandType::Enum type) {
-  switch (type) {
-    case blink::V8MLOperandType::Enum::kFloat32:
+    blink::V8MLOperandDataType::Enum data_type) {
+  switch (data_type) {
+    case blink::V8MLOperandDataType::Enum::kFloat32:
       return blink_mojom::Operand::DataType::kFloat32;
-    case blink::V8MLOperandType::Enum::kFloat16:
+    case blink::V8MLOperandDataType::Enum::kFloat16:
       return blink_mojom::Operand::DataType::kFloat16;
-    case blink::V8MLOperandType::Enum::kInt32:
+    case blink::V8MLOperandDataType::Enum::kInt32:
       return blink_mojom::Operand::DataType::kInt32;
-    case blink::V8MLOperandType::Enum::kUint32:
+    case blink::V8MLOperandDataType::Enum::kUint32:
       return blink_mojom::Operand::DataType::kUint32;
-    case blink::V8MLOperandType::Enum::kInt8:
+    case blink::V8MLOperandDataType::Enum::kInt8:
       return blink_mojom::Operand::DataType::kInt8;
-    case blink::V8MLOperandType::Enum::kUint8:
+    case blink::V8MLOperandDataType::Enum::kUint8:
       return blink_mojom::Operand::DataType::kUint8;
   }
   NOTREACHED_NORETURN();
@@ -65,7 +65,7 @@
       mojo_operand->kind = blink_mojom::Operand::Kind::kOutput;
       break;
   }
-  mojo_operand->data_type = BlinkOperandTypeToMojo(ml_operand->Type());
+  mojo_operand->data_type = BlinkOperandTypeToMojo(ml_operand->DataType());
   mojo_operand->dimensions = ml_operand->Dimensions();
   return mojo_operand;
 }
diff --git a/third_party/blink/renderer/modules/ml/webnn/ml_graph_utils.cc b/third_party/blink/renderer/modules/ml/webnn/ml_graph_utils.cc
index 91a5b779..ae42d19 100644
--- a/third_party/blink/renderer/modules/ml/webnn/ml_graph_utils.cc
+++ b/third_party/blink/renderer/modules/ml/webnn/ml_graph_utils.cc
@@ -122,12 +122,12 @@
 DOMArrayBufferView* CreateArrayBufferView(ArrayBufferViewInfo view_info) {
   auto* target_buffer = DOMArrayBuffer::Create(std::move(view_info.contents));
 
-  // Align with the ArrayBufferView types supported by WebNN MLOperandType:
-  // https://www.w3.org/TR/webnn/#appendices-mloperandtype-arraybufferview-compatibility
+  // Align with the ArrayBufferView types supported by WebNN MLOperandDataType:
+  // https://www.w3.org/TR/webnn/#appendices-MLOperandDataType-arraybufferview-compatibility
   DOMArrayBufferView* target_view = nullptr;
   switch (view_info.type) {
     case DOMArrayBufferView::kTypeFloat32:
-      // Float32Array is used for MLOperandType::float32.
+      // Float32Array is used for MLOperandDataType::float32.
       target_view = DOMFloat32Array::Create(target_buffer, view_info.offset,
                                             view_info.length);
       break;
@@ -138,22 +138,22 @@
                                            view_info.length);
       break;
     case DOMArrayBufferView::kTypeInt32:
-      // Int32Array is used for MLOperandType::int32.
+      // Int32Array is used for MLOperandDataType::int32.
       target_view = DOMInt32Array::Create(target_buffer, view_info.offset,
                                           view_info.length);
       break;
     case DOMArrayBufferView::kTypeUint32:
-      // Uint32Array is used for MLOperandType::uint32.
+      // Uint32Array is used for MLOperandDataType::uint32.
       target_view = DOMUint32Array::Create(target_buffer, view_info.offset,
                                            view_info.length);
       break;
     case DOMArrayBufferView::kTypeInt8:
-      // Int8Array is used for MLOperandType::int8.
+      // Int8Array is used for MLOperandDataType::int8.
       target_view = DOMInt8Array::Create(target_buffer, view_info.offset,
                                          view_info.length);
       break;
     case DOMArrayBufferView::kTypeUint8:
-      // Uint8Array is used for MLOperandType::uint8.
+      // Uint8Array is used for MLOperandDataType::uint8.
       target_view = DOMUint8Array::Create(target_buffer, view_info.offset,
                                           view_info.length);
       break;
diff --git a/third_party/blink/renderer/modules/ml/webnn/ml_graph_xnnpack.cc b/third_party/blink/renderer/modules/ml/webnn/ml_graph_xnnpack.cc
index a22e0932..abf9eb5 100644
--- a/third_party/blink/renderer/modules/ml/webnn/ml_graph_xnnpack.cc
+++ b/third_party/blink/renderer/modules/ml/webnn/ml_graph_xnnpack.cc
@@ -377,16 +377,16 @@
   SEQUENCE_CHECKER(sequence_checker_);
 };
 
-xnn_datatype GetXnnDataType(V8MLOperandType::Enum operand_type) {
+xnn_datatype GetXnnDataType(V8MLOperandDataType::Enum operand_type) {
   switch (operand_type) {
-    case V8MLOperandType::Enum::kFloat32:
+    case V8MLOperandDataType::Enum::kFloat32:
       return xnn_datatype_fp32;
-    case V8MLOperandType::Enum::kFloat16:
+    case V8MLOperandDataType::Enum::kFloat16:
       return xnn_datatype_fp16;
-    case V8MLOperandType::Enum::kInt32:
-    case V8MLOperandType::Enum::kUint32:
-    case V8MLOperandType::Enum::kInt8:
-    case V8MLOperandType::Enum::kUint8:
+    case V8MLOperandDataType::Enum::kInt32:
+    case V8MLOperandDataType::Enum::kUint32:
+    case V8MLOperandDataType::Enum::kInt8:
+    case V8MLOperandDataType::Enum::kUint8:
       // TODO(crbug.com/1273291): Support the quantized integer types that is a
       // WebNN v2 feature tracked by:
       // https://github.com/webmachinelearning/webnn/issues/128.
@@ -420,10 +420,10 @@
                           uint32_t& value_id,
                           String& error_message) {
   DCHECK(operand);
-  xnn_datatype datatype = GetXnnDataType(operand->Type());
+  xnn_datatype datatype = GetXnnDataType(operand->DataType());
   if (datatype == xnn_datatype_invalid) {
-    error_message = "The operand type (" +
-                    V8MLOperandType(operand->Type()).AsString() +
+    error_message = "The operand data type (" +
+                    V8MLOperandDataType(operand->DataType()).AsString() +
                     ") is not supported.";
     return xnn_status_unsupported_parameter;
   }
@@ -976,13 +976,13 @@
         return xnn_status_unsupported_parameter;
       }
 
-      // Currently, XNNPACK only supports fp32 input type for square and
+      // Currently, XNNPACK only supports fp32 input data type for square and
       // square_root operators.
-      if (operand_a->Type() != V8MLOperandType::Enum::kFloat32) {
+      if (operand_a->DataType() != V8MLOperandDataType::Enum::kFloat32) {
         error_message = "Pow only supports float32 operands.";
         return xnn_status_unsupported_parameter;
       }
-      CHECK_EQ(operand_b->Type(), V8MLOperandType::Enum::kFloat32);
+      CHECK_EQ(operand_b->DataType(), V8MLOperandDataType::Enum::kFloat32);
 
       const auto* array_buffer_view = operand_b->ArrayBufferView();
       CHECK(array_buffer_view);
diff --git a/third_party/blink/renderer/modules/ml/webnn/ml_graph_xnnpack_test.cc b/third_party/blink/renderer/modules/ml/webnn/ml_graph_xnnpack_test.cc
index c2d36f0..3fb14639 100644
--- a/third_party/blink/renderer/modules/ml/webnn/ml_graph_xnnpack_test.cc
+++ b/third_party/blink/renderer/modules/ml/webnn/ml_graph_xnnpack_test.cc
@@ -37,9 +37,9 @@
     auto* builder =
         CreateMLGraphBuilder(scope.GetExecutionContext(),
                              scope.GetScriptState(), scope.GetExceptionState());
-    auto* input =
-        BuildInput(builder, "input", {3, 4, 5}, V8MLOperandType::Enum::kFloat32,
-                   scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {3, 4, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     auto* output = builder->relu(input, scope.GetExceptionState());
     EXPECT_NE(output, nullptr);
     auto [graph, exception] = BuildGraph(scope, builder, {{"output", output}});
@@ -54,9 +54,9 @@
     auto* builder = CreateMLGraphBuilder(
         scope.GetExecutionContext(), scope.GetScriptState(),
         scope.GetExceptionState(), context_options);
-    auto* input =
-        BuildInput(builder, "input", {3, 4, 5}, V8MLOperandType::Enum::kFloat32,
-                   scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {3, 4, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
     auto* output = builder->relu(input, scope.GetExceptionState());
     EXPECT_NE(output, nullptr);
     auto [graph, exception] = BuildGraph(scope, builder, {{"output", output}});
@@ -76,15 +76,16 @@
     //    add
     //     |
     //   relu
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 5, 5},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {1, 1, 3, 3}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {1, 1, 3, 3},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* conv2d = BuildConv2d(scope, builder, input, filter);
-    auto* bias = BuildConstant(builder, {1}, V8MLOperandType::Enum::kFloat32,
-                               scope.GetExceptionState());
+    auto* bias =
+        BuildConstant(builder, {1}, V8MLOperandDataType::Enum::kFloat32,
+                      scope.GetExceptionState());
     auto* add = builder->add(conv2d, bias, scope.GetExceptionState());
     ASSERT_NE(add, nullptr);
     auto* relu = builder->relu(add, scope.GetExceptionState());
@@ -104,12 +105,12 @@
     //  conv2d   conv2d
     //      \   /   \
     //       add    output
-    auto* input =
-        BuildInput(builder, "input", {1, 1, 5, 5},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-    auto* filter =
-        BuildConstant(builder, {1, 1, 3, 3}, V8MLOperandType::Enum::kFloat32,
-                      scope.GetExceptionState());
+    auto* input = BuildInput(builder, "input", {1, 1, 5, 5},
+                             V8MLOperandDataType::Enum::kFloat32,
+                             scope.GetExceptionState());
+    auto* filter = BuildConstant(builder, {1, 1, 3, 3},
+                                 V8MLOperandDataType::Enum::kFloat32,
+                                 scope.GetExceptionState());
     auto* options = MLConv2dOptions::Create();
     options->setAutoPad(V8MLAutoPad::Enum::kSameLower);
     auto* conv2d_0 = BuildConv2d(scope, builder, input, filter, options);
@@ -143,12 +144,12 @@
     //            add
     //             |
     //          [output]
-    auto* input0 =
-        BuildInput(builder, "input0", shape, V8MLOperandType::Enum::kFloat32,
-                   scope.GetExceptionState());
-    auto* input1 =
-        BuildInput(builder, "input1", shape, V8MLOperandType::Enum::kFloat32,
-                   scope.GetExceptionState());
+    auto* input0 = BuildInput(builder, "input0", shape,
+                              V8MLOperandDataType::Enum::kFloat32,
+                              scope.GetExceptionState());
+    auto* input1 = BuildInput(builder, "input1", shape,
+                              V8MLOperandDataType::Enum::kFloat32,
+                              scope.GetExceptionState());
     auto* output = BuildElementWiseBinary(
         scope, builder, ElementWiseBinaryKind::kAdd, input0, input1);
     auto [graph, exception] = BuildGraph(scope, builder, {{"output", output}});
@@ -176,10 +177,10 @@
     //             |
     //          [output]
     auto* input =
-        BuildInput(builder, "input", shape, V8MLOperandType::Enum::kFloat32,
+        BuildInput(builder, "input", shape, V8MLOperandDataType::Enum::kFloat32,
                    scope.GetExceptionState());
     auto* constant =
-        BuildConstant(builder, shape, V8MLOperandType::Enum::kFloat32,
+        BuildConstant(builder, shape, V8MLOperandDataType::Enum::kFloat32,
                       scope.GetExceptionState());
     auto* output = BuildElementWiseBinary(
         scope, builder, ElementWiseBinaryKind::kAdd, input, constant);
@@ -210,15 +211,15 @@
     //                    |
     //                 [output]
     auto* input =
-        BuildInput(builder, "input", shape, V8MLOperandType::Enum::kFloat32,
+        BuildInput(builder, "input", shape, V8MLOperandDataType::Enum::kFloat32,
                    scope.GetExceptionState());
     auto* constant0 =
-        BuildConstant(builder, shape, V8MLOperandType::Enum::kFloat32,
+        BuildConstant(builder, shape, V8MLOperandDataType::Enum::kFloat32,
                       scope.GetExceptionState());
     auto* intermediate = BuildElementWiseBinary(
         scope, builder, ElementWiseBinaryKind::kAdd, input, constant0);
     auto* constant1 =
-        BuildConstant(builder, shape, V8MLOperandType::Enum::kFloat32,
+        BuildConstant(builder, shape, V8MLOperandDataType::Enum::kFloat32,
                       scope.GetExceptionState());
     auto* output = BuildElementWiseBinary(
         scope, builder, ElementWiseBinaryKind::kAdd, intermediate, constant1);
@@ -249,18 +250,18 @@
     //            relu    add
     //             |       |
     //       [output0]   [output1]
-    auto* input0 =
-        BuildInput(builder, "input0", shape, V8MLOperandType::Enum::kFloat32,
-                   scope.GetExceptionState());
-    auto* input1 =
-        BuildInput(builder, "input1", shape, V8MLOperandType::Enum::kFloat32,
-                   scope.GetExceptionState());
+    auto* input0 = BuildInput(builder, "input0", shape,
+                              V8MLOperandDataType::Enum::kFloat32,
+                              scope.GetExceptionState());
+    auto* input1 = BuildInput(builder, "input1", shape,
+                              V8MLOperandDataType::Enum::kFloat32,
+                              scope.GetExceptionState());
     auto* intermediate = BuildElementWiseBinary(
         scope, builder, ElementWiseBinaryKind::kAdd, input0, input1);
     auto* output0 = builder->relu(intermediate, scope.GetExceptionState());
-    auto* input2 =
-        BuildInput(builder, "input2", shape, V8MLOperandType::Enum::kFloat32,
-                   scope.GetExceptionState());
+    auto* input2 = BuildInput(builder, "input2", shape,
+                              V8MLOperandDataType::Enum::kFloat32,
+                              scope.GetExceptionState());
     auto* output1 = BuildElementWiseBinary(
         scope, builder, ElementWiseBinaryKind::kAdd, intermediate, input2);
     auto [graph, exception] = BuildGraph(
@@ -329,10 +330,10 @@
   auto* builder =
       CreateMLGraphBuilder(scope.GetExecutionContext(), scope.GetScriptState(),
                            scope.GetExceptionState());
-  auto* input0 =
-      BuildInput(builder, "input0", {1, 2, 2, 1},
-                 V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
-  auto* input1 = BuildConstant(builder, {}, V8MLOperandType::Enum::kFloat32,
+  auto* input0 = BuildInput(builder, "input0", {1, 2, 2, 1},
+                            V8MLOperandDataType::Enum::kFloat32,
+                            scope.GetExceptionState());
+  auto* input1 = BuildConstant(builder, {}, V8MLOperandDataType::Enum::kFloat32,
                                Vector<float>({3.0}), scope.GetExceptionState());
   auto* output = BuildElementWiseBinary(
       scope, builder, ElementWiseBinaryKind::kPow, input0, input1);
@@ -355,10 +356,10 @@
   //             |
   //          [output]
   auto* input0 =
-      BuildInput(builder, "input0", shape, V8MLOperandType::Enum::kFloat32,
+      BuildInput(builder, "input0", shape, V8MLOperandDataType::Enum::kFloat32,
                  scope.GetExceptionState());
   auto* input1 =
-      BuildInput(builder, "input1", shape, V8MLOperandType::Enum::kFloat32,
+      BuildInput(builder, "input1", shape, V8MLOperandDataType::Enum::kFloat32,
                  scope.GetExceptionState());
   auto* output = BuildElementWiseBinary(
       scope, builder, ElementWiseBinaryKind::kAdd, input0, input1);
@@ -477,7 +478,7 @@
     //             |
     //            [x]
     auto* input =
-        BuildInput(builder, "x", shape, V8MLOperandType::Enum::kFloat32,
+        BuildInput(builder, "x", shape, V8MLOperandDataType::Enum::kFloat32,
                    scope.GetExceptionState());
     auto* output = builder->relu(input, scope.GetExceptionState());
     auto [graph, exception] = BuildGraph(scope, builder, {{"x", output}});
@@ -502,10 +503,10 @@
     //             |
     //            [y]
     auto* input0 =
-        BuildInput(builder, "x", shape, V8MLOperandType::Enum::kFloat32,
+        BuildInput(builder, "x", shape, V8MLOperandDataType::Enum::kFloat32,
                    scope.GetExceptionState());
     auto* input1 =
-        BuildInput(builder, "y", shape, V8MLOperandType::Enum::kFloat32,
+        BuildInput(builder, "y", shape, V8MLOperandDataType::Enum::kFloat32,
                    scope.GetExceptionState());
     auto* output = BuildElementWiseBinary(
         scope, builder, ElementWiseBinaryKind::kAdd, input0, input1);
@@ -539,12 +540,12 @@
   //            add
   //             |
   //          [output]
-  auto* a_operand =
-      BuildInput(builder, "a", {1, 2, 2, 1}, V8MLOperandType::Enum::kFloat32,
-                 scope.GetExceptionState());
-  auto* b_operand =
-      BuildInput(builder, "b", {1, 2, 2, 1}, V8MLOperandType::Enum::kFloat32,
-                 scope.GetExceptionState());
+  auto* a_operand = BuildInput(builder, "a", {1, 2, 2, 1},
+                               V8MLOperandDataType::Enum::kFloat32,
+                               scope.GetExceptionState());
+  auto* b_operand = BuildInput(builder, "b", {1, 2, 2, 1},
+                               V8MLOperandDataType::Enum::kFloat32,
+                               scope.GetExceptionState());
   auto* output_operand =
       builder->add(a_operand, b_operand, scope.GetExceptionState());
   ScriptPromiseTester graph_build_tester(
@@ -777,8 +778,9 @@
     auto* builder =
         CreateMLGraphBuilder(scope.GetExecutionContext(),
                              scope.GetScriptState(), scope.GetExceptionState());
-    auto* input_operand = BuildInput(builder, "input", input.dimensions,
-                                     input.type, scope.GetExceptionState());
+    auto* input_operand =
+        BuildInput(builder, "input", input.dimensions, input.data_type,
+                   scope.GetExceptionState());
     auto* output_operand =
         builder->elu(input_operand, options, scope.GetExceptionState());
     auto [graph, build_exception] =
@@ -809,7 +811,7 @@
     // calculate the expected results by calling XNNPACK elu operator
     // APIs.
     auto* options = MLEluOptions::Create();
-    EluTester{.input = {.type = V8MLOperandType::Enum::kFloat32,
+    EluTester{.input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                         .dimensions = {2, 2},
                         .values = {-1.0, 0.5, 0.5, 1.0}}}
         .Test(*this, scope, options);
@@ -818,7 +820,7 @@
     // Test elu operator with alpha = 2.0.
     auto* options = MLEluOptions::Create();
     options->setAlpha(2.0);
-    EluTester{.input = {.type = V8MLOperandType::Enum::kFloat32,
+    EluTester{.input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                         .dimensions = {2, 2},
                         .values = {-1.0, -0.5, 0.5, 1.0}}}
         .Test(*this, scope, options);
@@ -877,8 +879,9 @@
     auto* builder =
         CreateMLGraphBuilder(scope.GetExecutionContext(),
                              scope.GetScriptState(), scope.GetExceptionState());
-    auto* input_operand = BuildInput(builder, "input", input.dimensions,
-                                     input.type, scope.GetExceptionState());
+    auto* input_operand =
+        BuildInput(builder, "input", input.dimensions, input.data_type,
+                   scope.GetExceptionState());
     auto* output_operand =
         builder->softmax(input_operand, scope.GetExceptionState());
     auto [graph, build_exception] =
@@ -908,14 +911,14 @@
     // There is no need to set expected results, because SoftmaxTester will
     // calculate the expected results by calling XNNPACK softmax operator
     // APIs.
-    SoftmaxTester{.input = {.type = V8MLOperandType::Enum::kFloat32,
+    SoftmaxTester{.input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                             .dimensions = {2, 2},
                             .values = {-1.0, -0.5, 0.5, 1.0}}}
         .Test(*this, scope);
   }
   {
     // Test softmax operator for input operand with [1, 4] dimensions.
-    SoftmaxTester{.input = {.type = V8MLOperandType::Enum::kFloat32,
+    SoftmaxTester{.input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                             .dimensions = {1, 4},
                             .values = {-1.0, -0.5, 0.5, 1.0}}}
         .Test(*this, scope);
@@ -977,8 +980,9 @@
     auto* builder =
         CreateMLGraphBuilder(scope.GetExecutionContext(),
                              scope.GetScriptState(), scope.GetExceptionState());
-    auto* input_operand = BuildInput(builder, "input", input.dimensions,
-                                     input.type, scope.GetExceptionState());
+    auto* input_operand =
+        BuildInput(builder, "input", input.dimensions, input.data_type,
+                   scope.GetExceptionState());
     auto* output_operand =
         builder->sigmoid(input_operand, scope.GetExceptionState());
     auto [graph, build_exception] =
@@ -1008,28 +1012,28 @@
     // There is no need to set expected results, because SigmoidTester will
     // calculate the expected results by calling XNNPACK sigmoid operator
     // APIs.
-    SigmoidTester{.input = {.type = V8MLOperandType::Enum::kFloat32,
+    SigmoidTester{.input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                             .dimensions = {2},
                             .values = {-1.0, 1.0}}}
         .Test(*this, scope);
   }
   {
     // Test sigmoid operator for 2-D tensor.
-    SigmoidTester{.input = {.type = V8MLOperandType::Enum::kFloat32,
+    SigmoidTester{.input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                             .dimensions = {2, 2},
                             .values = {-10.0, -0.5, 0.5, 10.0}}}
         .Test(*this, scope);
   }
   {
     // Test sigmoid operator for 3-D tensor.
-    SigmoidTester{.input = {.type = V8MLOperandType::Enum::kFloat32,
+    SigmoidTester{.input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                             .dimensions = {1, 2, 2},
                             .values = {-10.0, -0.5, 0.5, 10.0}}}
         .Test(*this, scope);
   }
   {
     // Test sigmoid operator for 4-D tensor.
-    SigmoidTester{.input = {.type = V8MLOperandType::Enum::kFloat32,
+    SigmoidTester{.input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                             .dimensions = {1, 2, 2, 1},
                             .values = {-10.0, -0.5, 0.5, 10.0}}}
         .Test(*this, scope);
@@ -1091,8 +1095,9 @@
     auto* builder =
         CreateMLGraphBuilder(scope.GetExecutionContext(),
                              scope.GetScriptState(), scope.GetExceptionState());
-    auto* input_operand = BuildInput(builder, "input", input.dimensions,
-                                     input.type, scope.GetExceptionState());
+    auto* input_operand =
+        BuildInput(builder, "input", input.dimensions, input.data_type,
+                   scope.GetExceptionState());
     auto* output_operand =
         builder->tanh(input_operand, scope.GetExceptionState());
     auto [graph, build_exception] =
@@ -1122,14 +1127,14 @@
     // There is no need to set expected results, because TanhTester will
     // calculate the expected results by calling XNNPACK tanh operator
     // APIs.
-    TanhTester{.input = {.type = V8MLOperandType::Enum::kFloat32,
+    TanhTester{.input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                          .dimensions = {2},
                          .values = {-1.0, 1.0}}}
         .Test(*this, scope);
   }
   {
     // Test tanh operator for 2-D tensor.
-    TanhTester{.input = {.type = V8MLOperandType::Enum::kFloat32,
+    TanhTester{.input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
                          .dimensions = {2, 2},
                          .values = {-2.0, 2.0, -3.0, 3.0}}}
         .Test(*this, scope);
@@ -1143,11 +1148,11 @@
     auto* builder =
         CreateMLGraphBuilder(scope.GetExecutionContext(),
                              scope.GetScriptState(), scope.GetExceptionState());
-    auto* input_operand =
-        BuildInput(builder, "input", {2, 2}, V8MLOperandType::Enum::kFloat32,
-                   scope.GetExceptionState());
+    auto* input_operand = BuildInput(builder, "input", {2, 2},
+                                     V8MLOperandDataType::Enum::kFloat32,
+                                     scope.GetExceptionState());
     auto* slope_operand =
-        BuildInput(builder, "slope", {2}, V8MLOperandType::Enum::kFloat32,
+        BuildInput(builder, "slope", {2}, V8MLOperandDataType::Enum::kFloat32,
                    scope.GetExceptionState());
     auto* output_operand =
         builder->prelu(input_operand, slope_operand, scope.GetExceptionState());
@@ -1162,11 +1167,11 @@
     auto* builder =
         CreateMLGraphBuilder(scope.GetExecutionContext(),
                              scope.GetScriptState(), scope.GetExceptionState());
-    auto* input_operand =
-        BuildInput(builder, "input", {2, 2}, V8MLOperandType::Enum::kFloat32,
-                   scope.GetExceptionState());
+    auto* input_operand = BuildInput(builder, "input", {2, 2},
+                                     V8MLOperandDataType::Enum::kFloat32,
+                                     scope.GetExceptionState());
     auto* slope_operand =
-        BuildConstant(builder, {}, V8MLOperandType::Enum::kFloat32,
+        BuildConstant(builder, {}, V8MLOperandDataType::Enum::kFloat32,
                       Vector<float>({0.1}), scope.GetExceptionState());
     auto* output_operand =
         builder->prelu(input_operand, slope_operand, scope.GetExceptionState());
@@ -1193,9 +1198,9 @@
     auto* builder = CreateMLGraphBuilder(
         scope.GetExecutionContext(), scope.GetScriptState(),
         scope.GetExceptionState(), context_options);
-    auto* input_operand =
-        BuildInput(builder, "input", {1, 2, 2, 1},
-                   V8MLOperandType::Enum::kFloat32, scope.GetExceptionState());
+    auto* input_operand = BuildInput(builder, "input", {1, 2, 2, 1},
+                                     V8MLOperandDataType::Enum::kFloat32,
+                                     scope.GetExceptionState());
     auto* output_operand =
         builder->relu(input_operand, scope.GetExceptionState());
     auto [graph, build_exception] =
diff --git a/third_party/blink/renderer/modules/ml/webnn/ml_operand.cc b/third_party/blink/renderer/modules/ml/webnn/ml_operand.cc
index 9dfed0e..a68a5c5e 100644
--- a/third_party/blink/renderer/modules/ml/webnn/ml_operand.cc
+++ b/third_party/blink/renderer/modules/ml/webnn/ml_operand.cc
@@ -12,21 +12,21 @@
 
 namespace {
 
-size_t GetBytesPerElement(V8MLOperandType::Enum operand_type) {
+size_t GetBytesPerElement(V8MLOperandDataType::Enum operand_type) {
   switch (operand_type) {
-    case V8MLOperandType::Enum::kFloat32:
+    case V8MLOperandDataType::Enum::kFloat32:
       return sizeof(float);
-    case V8MLOperandType::Enum::kFloat16:
+    case V8MLOperandDataType::Enum::kFloat16:
       // Using Uint16Array for float16 is a workaround of WebNN spec issue:
       // https://github.com/webmachinelearning/webnn/issues/127
       return sizeof(uint16_t);
-    case V8MLOperandType::Enum::kInt32:
+    case V8MLOperandDataType::Enum::kInt32:
       return sizeof(int32_t);
-    case V8MLOperandType::Enum::kUint32:
+    case V8MLOperandDataType::Enum::kUint32:
       return sizeof(uint32_t);
-    case V8MLOperandType::Enum::kInt8:
+    case V8MLOperandDataType::Enum::kInt8:
       return sizeof(int8_t);
-    case V8MLOperandType::Enum::kUint8:
+    case V8MLOperandDataType::Enum::kUint8:
       return sizeof(uint8_t);
   }
 }
@@ -42,10 +42,10 @@
 }
 
 base::expected<size_t, String> ValidateAndCalculateByteLength(
-    V8MLOperandType::Enum type,
+    V8MLOperandDataType::Enum data_type,
     const Vector<uint32_t>& dimensions) {
   auto byte_length = webnn::ValidateAndCalculateByteLength(
-      GetBytesPerElement(type), base::make_span(dimensions));
+      GetBytesPerElement(data_type), base::make_span(dimensions));
   if (!byte_length.has_value()) {
     return base::unexpected(WTF::String::FromUTF8(byte_length.error()));
   }
@@ -55,21 +55,21 @@
 }  // namespace
 
 DOMArrayBufferView::ViewType GetArrayBufferViewType(
-    V8MLOperandType::Enum operand_type) {
+    V8MLOperandDataType::Enum operand_type) {
   switch (operand_type) {
-    case V8MLOperandType::Enum::kFloat32:
+    case V8MLOperandDataType::Enum::kFloat32:
       return DOMArrayBufferView::ViewType::kTypeFloat32;
-    case V8MLOperandType::Enum::kFloat16:
+    case V8MLOperandDataType::Enum::kFloat16:
       // Using Uint16Array for float16 is a workaround of WebNN spec issue:
       // https://github.com/webmachinelearning/webnn/issues/127
       return DOMArrayBufferView::ViewType::kTypeUint16;
-    case V8MLOperandType::Enum::kInt32:
+    case V8MLOperandDataType::Enum::kInt32:
       return DOMArrayBufferView::ViewType::kTypeInt32;
-    case V8MLOperandType::Enum::kUint32:
+    case V8MLOperandDataType::Enum::kUint32:
       return DOMArrayBufferView::ViewType::kTypeUint32;
-    case V8MLOperandType::Enum::kInt8:
+    case V8MLOperandDataType::Enum::kInt8:
       return DOMArrayBufferView::ViewType::kTypeInt8;
-    case V8MLOperandType::Enum::kUint8:
+    case V8MLOperandDataType::Enum::kUint8:
       return DOMArrayBufferView::ViewType::kTypeUint8;
   }
 }
@@ -77,18 +77,18 @@
 // static
 base::expected<MLOperand*, String> MLOperand::ValidateAndCreateInput(
     MLGraphBuilder* builder,
-    const V8MLOperandType::Enum type,
+    const V8MLOperandDataType::Enum data_type,
     Vector<uint32_t> dimensions,
     String name) {
   if (name.empty()) {
     return base::unexpected("The name is empty.");
   }
-  auto result = ValidateAndCalculateByteLength(type, dimensions);
+  auto result = ValidateAndCalculateByteLength(data_type, dimensions);
   if (!result.has_value()) {
     return base::unexpected("Invalid operand descriptor: " + result.error());
   }
-  auto* input = MakeGarbageCollected<MLOperand>(builder, OperandKind::kInput,
-                                                type, std::move(dimensions));
+  auto* input = MakeGarbageCollected<MLOperand>(
+      builder, OperandKind::kInput, data_type, std::move(dimensions));
   input->name_ = std::move(name);
   return input;
 }
@@ -96,15 +96,16 @@
 // static
 base::expected<MLOperand*, String> MLOperand::ValidateAndCreateConstant(
     MLGraphBuilder* builder,
-    const V8MLOperandType::Enum type,
+    const V8MLOperandDataType::Enum data_type,
     Vector<uint32_t> dimensions,
     const DOMArrayBufferView* array_buffer_view) {
   DCHECK(array_buffer_view);
-  if (GetArrayBufferViewType(type) != array_buffer_view->GetType()) {
+  if (GetArrayBufferViewType(data_type) != array_buffer_view->GetType()) {
     return base::unexpected(
-        "The buffer view type doesn't match the operand type.");
+        "The buffer view type doesn't match the operand data type.");
   }
-  auto expected_byte_length = ValidateAndCalculateByteLength(type, dimensions);
+  auto expected_byte_length =
+      ValidateAndCalculateByteLength(data_type, dimensions);
   if (!expected_byte_length.has_value()) {
     return base::unexpected("Invalid operand descriptor: " +
                             expected_byte_length.error());
@@ -116,7 +117,7 @@
         array_buffer_view->byteLength(), expected_byte_length.value()));
   }
   auto* constant = MakeGarbageCollected<MLOperand>(
-      builder, OperandKind::kConstant, type, std::move(dimensions));
+      builder, OperandKind::kConstant, data_type, std::move(dimensions));
   constant->array_buffer_view_ = array_buffer_view;
   return constant;
 }
@@ -124,27 +125,27 @@
 // static
 base::expected<MLOperand*, String> MLOperand::ValidateAndCreateOutput(
     MLGraphBuilder* builder,
-    const V8MLOperandType::Enum type,
+    const V8MLOperandDataType::Enum data_type,
     Vector<uint32_t> dimensions,
     const MLOperator* ml_operator) {
   DCHECK(ml_operator);
-  auto result = ValidateAndCalculateByteLength(type, dimensions);
+  auto result = ValidateAndCalculateByteLength(data_type, dimensions);
   if (!result.has_value()) {
     return base::unexpected("Invalid output operand: " + result.error());
   }
-  auto* output = MakeGarbageCollected<MLOperand>(builder, OperandKind::kOutput,
-                                                 type, std::move(dimensions));
+  auto* output = MakeGarbageCollected<MLOperand>(
+      builder, OperandKind::kOutput, data_type, std::move(dimensions));
   output->operator_ = ml_operator;
   return output;
 }
 
 MLOperand::MLOperand(MLGraphBuilder* builder,
                      OperandKind kind,
-                     const V8MLOperandType::Enum type,
+                     const V8MLOperandDataType::Enum data_type,
                      Vector<uint32_t> dimensions)
     : builder_(builder),
       kind_(kind),
-      type_(type),
+      data_type_(data_type),
       dimensions_(std::move(dimensions)) {}
 
 MLOperand::~MLOperand() = default;
@@ -157,8 +158,8 @@
   return kind_;
 }
 
-V8MLOperandType::Enum MLOperand::Type() const {
-  return type_;
+V8MLOperandDataType::Enum MLOperand::DataType() const {
+  return data_type_;
 }
 
 const Vector<uint32_t>& MLOperand::Dimensions() const {
@@ -187,7 +188,7 @@
 }
 
 size_t MLOperand::ByteLength() const {
-  auto byte_length = ValidateAndCalculateByteLength(type_, dimensions_);
+  auto byte_length = ValidateAndCalculateByteLength(data_type_, dimensions_);
   DCHECK(byte_length.has_value());
   return byte_length.value();
 }
diff --git a/third_party/blink/renderer/modules/ml/webnn/ml_operand.h b/third_party/blink/renderer/modules/ml/webnn/ml_operand.h
index 041e516c..41a424c 100644
--- a/third_party/blink/renderer/modules/ml/webnn/ml_operand.h
+++ b/third_party/blink/renderer/modules/ml/webnn/ml_operand.h
@@ -21,7 +21,7 @@
 class MLOperator;
 
 DOMArrayBufferView::ViewType GetArrayBufferViewType(
-    V8MLOperandType::Enum operand_type);
+    V8MLOperandDataType::Enum operand_type);
 
 class MODULES_EXPORT MLOperand final : public ScriptWrappable {
   DEFINE_WRAPPERTYPEINFO();
@@ -33,17 +33,17 @@
   // Otherwise return nullptr and set the corresponding error message.
   static base::expected<MLOperand*, String> ValidateAndCreateInput(
       MLGraphBuilder* builder,
-      const V8MLOperandType::Enum type,
+      const V8MLOperandDataType::Enum data_type,
       Vector<uint32_t> dimensions,
       String name);
   static base::expected<MLOperand*, String> ValidateAndCreateConstant(
       MLGraphBuilder* builder,
-      const V8MLOperandType::Enum type,
+      const V8MLOperandDataType::Enum data_type,
       Vector<uint32_t> dimensions,
       const DOMArrayBufferView* array_buffer_view);
   static base::expected<MLOperand*, String> ValidateAndCreateOutput(
       MLGraphBuilder* builder,
-      const V8MLOperandType::Enum type,
+      const V8MLOperandDataType::Enum data_type,
       Vector<uint32_t> dimensions,
       const MLOperator* ml_operator);
 
@@ -51,7 +51,7 @@
   // Create* methods instead.
   MLOperand(MLGraphBuilder* builder,
             OperandKind kind,
-            const V8MLOperandType::Enum type,
+            const V8MLOperandDataType::Enum data_type,
             Vector<uint32_t> dimensions);
 
   MLOperand(const MLOperand&) = delete;
@@ -63,7 +63,7 @@
 
   MLGraphBuilder* Builder() const;
   OperandKind Kind() const;
-  V8MLOperandType::Enum Type() const;
+  V8MLOperandDataType::Enum DataType() const;
   const Vector<uint32_t>& Dimensions() const;
   const String& Name() const;
   const DOMArrayBufferView* ArrayBufferView() const;
@@ -84,7 +84,7 @@
  private:
   Member<MLGraphBuilder> builder_;
   OperandKind kind_;
-  V8MLOperandType::Enum type_;
+  V8MLOperandDataType::Enum data_type_;
   // The dimensions of the operand. For scalar value, set {1}.
   Vector<uint32_t> dimensions_;
   // The name of input operand. According to
diff --git a/third_party/blink/renderer/modules/ml/webnn/ml_operand_descriptor.idl b/third_party/blink/renderer/modules/ml/webnn/ml_operand_descriptor.idl
index 1243048..4132bb5 100644
--- a/third_party/blink/renderer/modules/ml/webnn/ml_operand_descriptor.idl
+++ b/third_party/blink/renderer/modules/ml/webnn/ml_operand_descriptor.idl
@@ -4,7 +4,7 @@
 
 // https://www.w3.org/TR/webnn/
 
-enum MLOperandType {
+enum MLOperandDataType {
   "float32",
   "float16",
   "int32",
@@ -14,6 +14,6 @@
 };
 
 dictionary MLOperandDescriptor {
-  required MLOperandType type;
+  required MLOperandDataType dataType;
   sequence<[EnforceRange] unsigned long> dimensions;
 };
diff --git a/third_party/blink/renderer/platform/bindings/dom_wrapper_world.cc b/third_party/blink/renderer/platform/bindings/dom_wrapper_world.cc
index 0080450..1f8e99a8 100644
--- a/third_party/blink/renderer/platform/bindings/dom_wrapper_world.cc
+++ b/third_party/blink/renderer/platform/bindings/dom_wrapper_world.cc
@@ -288,20 +288,6 @@
   return kInvalidWorldId;
 }
 
-bool DOMWrapperWorld::HasWrapperInAnyWorldInMainThread(
-    ScriptWrappable* script_wrappable) {
-  DCHECK(IsMainThread());
-
-  Vector<scoped_refptr<DOMWrapperWorld>> worlds;
-  DOMWrapperWorld::AllWorldsInCurrentThread(worlds);
-  for (const auto& world : worlds) {
-    DOMDataStore& dom_data_store = world->DomDataStore();
-    if (dom_data_store.ContainsWrapper(script_wrappable))
-      return true;
-  }
-  return false;
-}
-
 // static
 bool DOMWrapperWorld::UnsetNonMainWorldWrapperIfSet(
     ScriptWrappable* object,
diff --git a/third_party/blink/renderer/platform/bindings/dom_wrapper_world.h b/third_party/blink/renderer/platform/bindings/dom_wrapper_world.h
index c17d1fbc..6c4b6e4 100644
--- a/third_party/blink/renderer/platform/bindings/dom_wrapper_world.h
+++ b/third_party/blink/renderer/platform/bindings/dom_wrapper_world.h
@@ -153,8 +153,6 @@
   scoped_refptr<const SecurityOrigin> IsolatedWorldSecurityOrigin(
       const base::UnguessableToken& cluster_id) const;
 
-  static bool HasWrapperInAnyWorldInMainThread(ScriptWrappable*);
-
   bool IsMainWorld() const { return world_type_ == WorldType::kMain; }
   bool IsWorkerWorld() const { return world_type_ == WorldType::kWorker; }
   bool IsShadowRealmWorld() const {
diff --git a/third_party/blink/renderer/platform/crypto_result.h b/third_party/blink/renderer/platform/crypto_result.h
index b2622b6..50e5fba6 100644
--- a/third_party/blink/renderer/platform/crypto_result.h
+++ b/third_party/blink/renderer/platform/crypto_result.h
@@ -39,6 +39,8 @@
 
 namespace blink {
 
+class ExecutionContext;
+
 // Allows non-Blink webcrypto threads to query for cancellation status.
 class CryptoResultCancel : public ThreadSafeRefCounted<CryptoResultCancel> {
  public:
@@ -62,6 +64,10 @@
   virtual void CompleteWithKeyPair(const WebCryptoKey& public_key,
                                    const WebCryptoKey& private_key) = 0;
 
+  virtual ExecutionContext* GetExecutionContext() = 0;
+  virtual WebCryptoWarningType GetWarning() = 0;
+  virtual void SetWarning(WebCryptoWarningType code) = 0;
+
   virtual void Trace(Visitor* visitor) const {}
 };
 
diff --git a/third_party/blink/renderer/platform/exported/web_crypto_result.cc b/third_party/blink/renderer/platform/exported/web_crypto_result.cc
index 2197ef11..c5146d2 100644
--- a/third_party/blink/renderer/platform/exported/web_crypto_result.cc
+++ b/third_party/blink/renderer/platform/exported/web_crypto_result.cc
@@ -80,6 +80,10 @@
   return cancel_->Cancelled();
 }
 
+void WebCryptoResult::SetWarning(WebCryptoWarningType code) {
+  impl_->SetWarning(code);
+}
+
 WebCryptoResult::WebCryptoResult(CryptoResult* impl,
                                  scoped_refptr<CryptoResultCancel> cancel)
     : impl_(impl), cancel_(std::move(cancel)) {
diff --git a/third_party/blink/web_tests/NeverFixTests b/third_party/blink/web_tests/NeverFixTests
index 5c8a6089..2003d245 100644
--- a/third_party/blink/web_tests/NeverFixTests
+++ b/third_party/blink/web_tests/NeverFixTests
@@ -267,9 +267,6 @@
 # these tests can still be run manually with --skipped=ignore.
 webaudio/codec-tests/aac/* [ Skip ]
 
-# PPAPI is disabled on everything but ChromeOS will run via --test-list flag
-ppapi/* [ Skip ]
-
 # WPT for CSS cascade
 crbug.com/763610 external/wpt/css/CSS2/cascade/* [ Skip ]
 
@@ -2104,3 +2101,11 @@
 
 # WebNN GPU backend is supported on Win11 by default.
 crbug.com/1500120 [ Win10.20h2 ] virtual/webnn-service-enabled/external/wpt/webnn/gpu/* [ Skip ]
+
+######## Unload Deprecation
+# This is for tests in the "deprecate-unload" virtual suite that
+# cannot be fixed, e.g. because they are explicitly testing unload.
+
+crbug.com/1488371 virtual/deprecate-unload/http/tests/devtools/sources/debugger/skip-pause-during-navigation.js [ Skip ]
+
+######## End Unload Deprecation
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index aa1ceb20..d512d24 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -1530,7 +1530,6 @@
 # https://crbug.com/1488371.
 # See https://docs.google.com/document/d/1FH0iG8G8mEebjMpVA_zvSfHBWUhWqC92jRFctaGcxrc/edit#heading=h.pacsgp238vkn
 
-crbug.com/1488371 virtual/deprecate-unload/http/tests/devtools/sources/debugger/skip-pause-during-navigation.js [ Failure Skip Timeout ]
 crbug.com/1488371 virtual/deprecate-unload/http/tests/history/history-replace-updates-current-item.html [ Failure Skip Timeout ]
 crbug.com/1488371 virtual/deprecate-unload/http/tests/navigation/image-load-in-subframe-unload-handler.html [ Failure Skip Timeout ]
 crbug.com/1488371 virtual/deprecate-unload/http/tests/navigation/image-load-in-unload-handler.html [ Failure Skip Timeout ]
@@ -1539,7 +1538,6 @@
 crbug.com/1488371 virtual/deprecate-unload/http/tests/notifications/close-on-document-unload.html [ Failure Skip Timeout ]
 crbug.com/1488371 virtual/deprecate-unload/http/tests/notifications/notification-creation-detached-context.html [ Failure Skip Timeout ]
 crbug.com/1488371 virtual/deprecate-unload/http/tests/notifications/request-permission-detached-context.html [ Failure Skip Timeout ]
-crbug.com/1488371 virtual/deprecate-unload/http/tests/security/isolatedWorld/context-destroy.html [ Failure Skip Timeout ]
 crbug.com/1488371 virtual/deprecate-unload/http/tests/security/window-events-clear-domain.html [ Failure Skip Timeout ]
 crbug.com/1488371 virtual/deprecate-unload/http/tests/security/window-events-clear-port.html [ Failure Skip Timeout ]
 crbug.com/1488371 virtual/deprecate-unload/http/tests/xmlhttprequest/frame-load-cancelled-abort.html [ Failure Skip Timeout ]
@@ -1596,6 +1594,7 @@
 crbug.com/1488371 virtual/deprecate-unload/external/wpt/fetch/api/redirect/redirect-keepalive.any.html [ Timeout ]
 crbug.com/1488371 virtual/deprecate-unload/external/wpt/fetch/metadata/unload.https.sub.html [ Timeout ]
 crbug.com/1488371 virtual/deprecate-unload/http/tests/navigation/targeted-navigation-in-unload-handler.html [ Timeout ]
+crbug.com/1488371 virtual/deprecate-unload/http/tests/devtools/sources/debugger/skip-pause-during-navigation.js [ Timeout Skip ]
 
 ######## End Unload Deprecation
 
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-focusability.html b/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-focusability.html
index afd02c7d..1e000866 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-focusability.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-focusability.html
@@ -10,10 +10,29 @@
 <script src="/resources/testdriver-actions.js"></script>
 
 <button id="before">before</button>
-<dialog id="dialog" open>
-  <button id="within">button</button>
+<dialog id="dialog1" open>
+  <button id="within1">button</button>
 </dialog>
-<button id="after">after</button>
+<button id="after1">after 1</button>
+<dialog tabindex=0 id="dialog2" open>
+  <button id="within2">button</button>
+</dialog>
+<button id="after2">after 2</button>
+<dialog tabindex="-1" id="dialog3" open>
+  <button id="within3">button</button>
+</dialog>
+<button id="after3">after 3</button>
+<dialog contenteditable="true" id="dialog4" open>
+  <button id="within4">button</button>
+</dialog>
+<button id="after4">after 4</button>
+
+<style>
+  #dialog1 { top: 25px; }
+  #dialog2 { top: 100px; }
+  #dialog3 { top: 175px; }
+  #dialog4 { top: 250px; }
+</style>
 
 <script>
   function navigateForward() {
@@ -31,7 +50,8 @@
 
   async_test((t) => {
     window.onload = async () => {
-      await assert_focus_order([before,within,after]);
+      await assert_focus_order([before,within1,after1,dialog2,within2,after2,
+        within3,after3,dialog4,within4,after4]);
       t.done();
     };
   }, "The dialog element itself should not be keyboard focusable.");
diff --git a/third_party/blink/web_tests/external/wpt/webnn/idlharness.https.any-expected.txt b/third_party/blink/web_tests/external/wpt/webnn/idlharness.https.any-expected.txt
index 16cac1c..7716ab8 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/idlharness.https.any-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/webnn/idlharness.https.any-expected.txt
@@ -1,7 +1,7 @@
 This is a testharness.js-based test.
-Found 67 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 59 FAIL, 0 TIMEOUT, 0 NOTRUN.
 [FAIL] idl_test setup
-  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'input' on 'MLGraphBuilder': Failed to read the 'type' property from 'MLOperandDescriptor': Required member is undefined."
+  promise_test: Unhandled rejection with value: object "NotSupportedError: The input layout nchw is not supported."
 [FAIL] NavigatorML must be primary interface of navigator
   assert_own_property: self does not have own property "NavigatorML" expected property "NavigatorML" missing
 [FAIL] Stringification of navigator
@@ -10,22 +10,6 @@
   assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: graph is not defined"
 [FAIL] Stringification of graph
   assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: graph is not defined"
-[FAIL] MLOperand must be primary interface of input
-  assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: input is not defined"
-[FAIL] Stringification of input
-  assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: input is not defined"
-[FAIL] MLOperand must be primary interface of filter
-  assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: filter is not defined"
-[FAIL] Stringification of filter
-  assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: filter is not defined"
-[FAIL] MLOperand must be primary interface of output
-  assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: output is not defined"
-[FAIL] Stringification of output
-  assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: output is not defined"
-[FAIL] MLActivation must be primary interface of relu
-  assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: relu is not defined"
-[FAIL] Stringification of relu
-  assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: relu is not defined"
 [FAIL] MLContext interface: operation createCommandEncoder()
   assert_own_property: interface prototype object missing non-static operation expected property "createCommandEncoder" missing
 [FAIL] MLContext interface: context must inherit property "createCommandEncoder()" with the proper type
diff --git a/third_party/blink/web_tests/external/wpt/webnn/idlharness.https.any.worker-expected.txt b/third_party/blink/web_tests/external/wpt/webnn/idlharness.https.any.worker-expected.txt
index bf6000b..8390c30 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/idlharness.https.any.worker-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/webnn/idlharness.https.any.worker-expected.txt
@@ -1,7 +1,7 @@
 This is a testharness.js-based test.
-Found 74 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 66 FAIL, 0 TIMEOUT, 0 NOTRUN.
 [FAIL] idl_test setup
-  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'input' on 'MLGraphBuilder': Failed to read the 'type' property from 'MLOperandDescriptor': Required member is undefined."
+  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'buildSync' on 'MLGraphBuilder': The input layout nchw is not supported."
 [FAIL] NavigatorML must be primary interface of navigator
   assert_own_property: self does not have own property "NavigatorML" expected property "NavigatorML" missing
 [FAIL] Stringification of navigator
@@ -12,22 +12,6 @@
   assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: graph is not defined"
 [FAIL] Stringification of graph
   assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: graph is not defined"
-[FAIL] MLOperand must be primary interface of input
-  assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: input is not defined"
-[FAIL] Stringification of input
-  assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: input is not defined"
-[FAIL] MLOperand must be primary interface of filter
-  assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: filter is not defined"
-[FAIL] Stringification of filter
-  assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: filter is not defined"
-[FAIL] MLOperand must be primary interface of output
-  assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: output is not defined"
-[FAIL] Stringification of output
-  assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: output is not defined"
-[FAIL] MLActivation must be primary interface of relu
-  assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: relu is not defined"
-[FAIL] Stringification of relu
-  assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: relu is not defined"
 [FAIL] MLContext interface: operation compute(MLGraph, MLNamedArrayBufferViews, MLNamedArrayBufferViews)
   assert_own_property: interface prototype object missing non-static operation expected property "compute" missing
 [FAIL] MLContext interface: operation createCommandEncoder()
diff --git a/third_party/blink/web_tests/http/tests/devtools/sources/debugger/resources/page-with-pagehide.html b/third_party/blink/web_tests/http/tests/devtools/sources/debugger/resources/page-with-pagehide.html
new file mode 100644
index 0000000..7684042e
--- /dev/null
+++ b/third_party/blink/web_tests/http/tests/devtools/sources/debugger/resources/page-with-pagehide.html
@@ -0,0 +1,3 @@
+<!DOCTYPE html>
+<script>console.log('ready')</script>
+<body onpagehide="debugger"></body>
diff --git a/third_party/blink/web_tests/http/tests/devtools/sources/debugger/resources/page-with-unload.html b/third_party/blink/web_tests/http/tests/devtools/sources/debugger/resources/page-with-unload.html
deleted file mode 100644
index 859daa6..0000000
--- a/third_party/blink/web_tests/http/tests/devtools/sources/debugger/resources/page-with-unload.html
+++ /dev/null
@@ -1,2 +0,0 @@
-<script>console.log('ready')</script>
-<body onunload="debugger"></body>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/http/tests/devtools/sources/debugger/skip-pause-during-navigation.js b/third_party/blink/web_tests/http/tests/devtools/sources/debugger/skip-pause-during-navigation.js
index 7bf997f..8887d4c2 100644
--- a/third_party/blink/web_tests/http/tests/devtools/sources/debugger/skip-pause-during-navigation.js
+++ b/third_party/blink/web_tests/http/tests/devtools/sources/debugger/skip-pause-during-navigation.js
@@ -11,7 +11,7 @@
       `Tests that we skip all pauses during navigation`);
   await TestRunner.showPanel('sources');
   await SourcesTestRunner.startDebuggerTestPromise();
-  await TestRunner.navigatePromise('resources/page-with-unload.html');
+  await TestRunner.navigatePromise('resources/page-with-pagehide.html');
   TestRunner.addResult('Navigate page..');
   TestRunner.evaluateInPagePromise('window.location.href = window.location.href');
   TestRunner.addResult('Wait for ready message..');
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/accessibility/accessibility-ignoredNodesModal-expected.txt b/third_party/blink/web_tests/http/tests/inspector-protocol/accessibility/accessibility-ignoredNodesModal-expected.txt
index f9e7277..1385ce6 100644
--- a/third_party/blink/web_tests/http/tests/inspector-protocol/accessibility/accessibility-ignoredNodesModal-expected.txt
+++ b/third_party/blink/web_tests/http/tests/inspector-protocol/accessibility/accessibility-ignoredNodesModal-expected.txt
@@ -57,13 +57,20 @@
     parentId : <string>
     properties : [
         [0] : {
-            name : focused
+            name : focusable
             value : {
                 type : booleanOrUndefined
                 value : true
             }
         }
         [1] : {
+            name : focused
+            value : {
+                type : booleanOrUndefined
+                value : true
+            }
+        }
+        [2] : {
             name : modal
             value : {
                 type : boolean
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/accessibility/accessibility-modal-expected.txt b/third_party/blink/web_tests/http/tests/inspector-protocol/accessibility/accessibility-modal-expected.txt
index 7d124779..508d187 100644
--- a/third_party/blink/web_tests/http/tests/inspector-protocol/accessibility/accessibility-modal-expected.txt
+++ b/third_party/blink/web_tests/http/tests/inspector-protocol/accessibility/accessibility-modal-expected.txt
@@ -266,13 +266,20 @@
     parentId : <string>
     properties : [
         [0] : {
-            name : focused
+            name : focusable
             value : {
                 type : booleanOrUndefined
                 value : true
             }
         }
         [1] : {
+            name : focused
+            value : {
+                type : booleanOrUndefined
+                value : true
+            }
+        }
+        [2] : {
             name : modal
             value : {
                 type : boolean
diff --git a/third_party/blink/web_tests/http/tests/security/isolatedWorld/context-destroy.html b/third_party/blink/web_tests/http/tests/security/isolatedWorld/context-destroy.html
index 6a6e698..1541fe07 100644
--- a/third_party/blink/web_tests/http/tests/security/isolatedWorld/context-destroy.html
+++ b/third_party/blink/web_tests/http/tests/security/isolatedWorld/context-destroy.html
@@ -3,7 +3,7 @@
 <iframe src="data:text/html,FAIL"></iframe>
 <script type="text/x-isolate" id="s1">
 
-window.onunload = function() {
+window.onpagehide = function() {
     Window;
 };
 
diff --git a/third_party/blink/web_tests/platform/linux-chrome/external/wpt/webnn/idlharness.https.any-expected.txt b/third_party/blink/web_tests/platform/linux-chrome/external/wpt/webnn/idlharness.https.any-expected.txt
deleted file mode 100644
index 457aab3..0000000
--- a/third_party/blink/web_tests/platform/linux-chrome/external/wpt/webnn/idlharness.https.any-expected.txt
+++ /dev/null
@@ -1,144 +0,0 @@
-This is a testharness.js-based test.
-Found 70 FAIL, 0 TIMEOUT, 0 NOTRUN.
-[FAIL] idl_test setup
-  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'input' on 'MLGraphBuilder': Failed to read the 'type' property from 'MLOperandDescriptor': Required member is undefined."
-[FAIL] NavigatorML must be primary interface of navigator
-  assert_own_property: self does not have own property "NavigatorML" expected property "NavigatorML" missing
-[FAIL] Stringification of navigator
-  assert_class_string: class string of navigator expected "[object NavigatorML]" but got "[object Navigator]"
-[FAIL] MLGraph must be primary interface of graph
-  assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: graph is not defined"
-[FAIL] Stringification of graph
-  assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: graph is not defined"
-[FAIL] MLOperand must be primary interface of input
-  assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: input is not defined"
-[FAIL] Stringification of input
-  assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: input is not defined"
-[FAIL] MLOperand must be primary interface of filter
-  assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: filter is not defined"
-[FAIL] Stringification of filter
-  assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: filter is not defined"
-[FAIL] MLOperand must be primary interface of output
-  assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: output is not defined"
-[FAIL] Stringification of output
-  assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: output is not defined"
-[FAIL] MLActivation must be primary interface of relu
-  assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: relu is not defined"
-[FAIL] Stringification of relu
-  assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: relu is not defined"
-[FAIL] MLContext interface: operation createCommandEncoder()
-  assert_own_property: interface prototype object missing non-static operation expected property "createCommandEncoder" missing
-[FAIL] MLContext interface: context must inherit property "createCommandEncoder()" with the proper type
-  assert_inherits: property "createCommandEncoder" not found in prototype chain
-[FAIL] MLCommandEncoder interface: existence and properties of interface object
-  assert_own_property: self does not have own property "MLCommandEncoder" expected property "MLCommandEncoder" missing
-[FAIL] MLCommandEncoder interface object length
-  assert_own_property: self does not have own property "MLCommandEncoder" expected property "MLCommandEncoder" missing
-[FAIL] MLCommandEncoder interface object name
-  assert_own_property: self does not have own property "MLCommandEncoder" expected property "MLCommandEncoder" missing
-[FAIL] MLCommandEncoder interface: existence and properties of interface prototype object
-  assert_own_property: self does not have own property "MLCommandEncoder" expected property "MLCommandEncoder" missing
-[FAIL] MLCommandEncoder interface: existence and properties of interface prototype object's "constructor" property
-  assert_own_property: self does not have own property "MLCommandEncoder" expected property "MLCommandEncoder" missing
-[FAIL] MLCommandEncoder interface: existence and properties of interface prototype object's @@unscopables property
-  assert_own_property: self does not have own property "MLCommandEncoder" expected property "MLCommandEncoder" missing
-[FAIL] MLCommandEncoder interface: operation initializeGraph(MLGraph)
-  assert_own_property: self does not have own property "MLCommandEncoder" expected property "MLCommandEncoder" missing
-[FAIL] MLCommandEncoder interface: operation dispatch(MLGraph, MLNamedGPUResources, MLNamedGPUResources)
-  assert_own_property: self does not have own property "MLCommandEncoder" expected property "MLCommandEncoder" missing
-[FAIL] MLCommandEncoder interface: operation finish(optional GPUCommandBufferDescriptor)
-  assert_own_property: self does not have own property "MLCommandEncoder" expected property "MLCommandEncoder" missing
-[FAIL] MLGraphBuilder interface: operation constant(MLOperandDescriptor, MLBufferView)
-  assert_equals: property has wrong .length expected 1 but got 2
-[FAIL] MLGraphBuilder interface: operation constant(double, optional MLOperandType)
-  assert_equals: property has wrong .length expected 1 but got 2
-[FAIL] MLGraphBuilder interface: operation batchNormalization(MLOperand, MLOperand, MLOperand, optional MLBatchNormalizationOptions)
-  assert_own_property: interface prototype object missing non-static operation expected property "batchNormalization" missing
-[FAIL] MLGraphBuilder interface: operation gru(MLOperand, MLOperand, MLOperand, unsigned long, unsigned long, optional MLGruOptions)
-  assert_own_property: interface prototype object missing non-static operation expected property "gru" missing
-[FAIL] MLGraphBuilder interface: operation gruCell(MLOperand, MLOperand, MLOperand, MLOperand, unsigned long, optional MLGruCellOptions)
-  assert_own_property: interface prototype object missing non-static operation expected property "gruCell" missing
-[FAIL] MLGraphBuilder interface: operation hardSigmoid(MLOperand, optional MLHardSigmoidOptions)
-  assert_own_property: interface prototype object missing non-static operation expected property "hardSigmoid" missing
-[FAIL] MLGraphBuilder interface: operation hardSigmoid(optional MLHardSigmoidOptions)
-  assert_own_property: interface prototype object missing non-static operation expected property "hardSigmoid" missing
-[FAIL] MLGraphBuilder interface: operation instanceNormalization(MLOperand, optional MLInstanceNormalizationOptions)
-  assert_own_property: interface prototype object missing non-static operation expected property "instanceNormalization" missing
-[FAIL] MLGraphBuilder interface: operation linear(MLOperand, optional MLLinearOptions)
-  assert_own_property: interface prototype object missing non-static operation expected property "linear" missing
-[FAIL] MLGraphBuilder interface: operation linear(optional MLLinearOptions)
-  assert_own_property: interface prototype object missing non-static operation expected property "linear" missing
-[FAIL] MLGraphBuilder interface: operation lstm(MLOperand, MLOperand, MLOperand, unsigned long, unsigned long, optional MLLstmOptions)
-  assert_own_property: interface prototype object missing non-static operation expected property "lstm" missing
-[FAIL] MLGraphBuilder interface: operation lstmCell(MLOperand, MLOperand, MLOperand, MLOperand, MLOperand, unsigned long, optional MLLstmCellOptions)
-  assert_own_property: interface prototype object missing non-static operation expected property "lstmCell" missing
-[FAIL] MLGraphBuilder interface: operation l2Pool2d(MLOperand, optional MLPool2dOptions)
-  assert_own_property: interface prototype object missing non-static operation expected property "l2Pool2d" missing
-[FAIL] MLGraphBuilder interface: operation softmax(MLOperand)
-  assert_equals: property has wrong .length expected 0 but got 1
-[FAIL] MLGraphBuilder interface: operation softmax()
-  assert_equals: property has wrong .length expected 0 but got 1
-[FAIL] MLGraphBuilder interface: operation softplus(MLOperand, optional MLSoftplusOptions)
-  assert_own_property: interface prototype object missing non-static operation expected property "softplus" missing
-[FAIL] MLGraphBuilder interface: operation softplus(optional MLSoftplusOptions)
-  assert_own_property: interface prototype object missing non-static operation expected property "softplus" missing
-[FAIL] MLGraphBuilder interface: operation squeeze(MLOperand, optional MLSqueezeOptions)
-  assert_own_property: interface prototype object missing non-static operation expected property "squeeze" missing
-[FAIL] MLGraphBuilder interface: builder must inherit property "batchNormalization(MLOperand, MLOperand, MLOperand, optional MLBatchNormalizationOptions)" with the proper type
-  assert_inherits: property "batchNormalization" not found in prototype chain
-[FAIL] MLGraphBuilder interface: calling batchNormalization(MLOperand, MLOperand, MLOperand, optional MLBatchNormalizationOptions) on builder with too few arguments must throw TypeError
-  assert_inherits: property "batchNormalization" not found in prototype chain
-[FAIL] MLGraphBuilder interface: builder must inherit property "gru(MLOperand, MLOperand, MLOperand, unsigned long, unsigned long, optional MLGruOptions)" with the proper type
-  assert_inherits: property "gru" not found in prototype chain
-[FAIL] MLGraphBuilder interface: calling gru(MLOperand, MLOperand, MLOperand, unsigned long, unsigned long, optional MLGruOptions) on builder with too few arguments must throw TypeError
-  assert_inherits: property "gru" not found in prototype chain
-[FAIL] MLGraphBuilder interface: builder must inherit property "gruCell(MLOperand, MLOperand, MLOperand, MLOperand, unsigned long, optional MLGruCellOptions)" with the proper type
-  assert_inherits: property "gruCell" not found in prototype chain
-[FAIL] MLGraphBuilder interface: calling gruCell(MLOperand, MLOperand, MLOperand, MLOperand, unsigned long, optional MLGruCellOptions) on builder with too few arguments must throw TypeError
-  assert_inherits: property "gruCell" not found in prototype chain
-[FAIL] MLGraphBuilder interface: builder must inherit property "hardSigmoid(MLOperand, optional MLHardSigmoidOptions)" with the proper type
-  assert_inherits: property "hardSigmoid" not found in prototype chain
-[FAIL] MLGraphBuilder interface: calling hardSigmoid(MLOperand, optional MLHardSigmoidOptions) on builder with too few arguments must throw TypeError
-  assert_inherits: property "hardSigmoid" not found in prototype chain
-[FAIL] MLGraphBuilder interface: builder must inherit property "hardSigmoid(optional MLHardSigmoidOptions)" with the proper type
-  assert_inherits: property "hardSigmoid" not found in prototype chain
-[FAIL] MLGraphBuilder interface: calling hardSigmoid(optional MLHardSigmoidOptions) on builder with too few arguments must throw TypeError
-  assert_inherits: property "hardSigmoid" not found in prototype chain
-[FAIL] MLGraphBuilder interface: builder must inherit property "instanceNormalization(MLOperand, optional MLInstanceNormalizationOptions)" with the proper type
-  assert_inherits: property "instanceNormalization" not found in prototype chain
-[FAIL] MLGraphBuilder interface: calling instanceNormalization(MLOperand, optional MLInstanceNormalizationOptions) on builder with too few arguments must throw TypeError
-  assert_inherits: property "instanceNormalization" not found in prototype chain
-[FAIL] MLGraphBuilder interface: builder must inherit property "linear(MLOperand, optional MLLinearOptions)" with the proper type
-  assert_inherits: property "linear" not found in prototype chain
-[FAIL] MLGraphBuilder interface: calling linear(MLOperand, optional MLLinearOptions) on builder with too few arguments must throw TypeError
-  assert_inherits: property "linear" not found in prototype chain
-[FAIL] MLGraphBuilder interface: builder must inherit property "linear(optional MLLinearOptions)" with the proper type
-  assert_inherits: property "linear" not found in prototype chain
-[FAIL] MLGraphBuilder interface: calling linear(optional MLLinearOptions) on builder with too few arguments must throw TypeError
-  assert_inherits: property "linear" not found in prototype chain
-[FAIL] MLGraphBuilder interface: builder must inherit property "lstm(MLOperand, MLOperand, MLOperand, unsigned long, unsigned long, optional MLLstmOptions)" with the proper type
-  assert_inherits: property "lstm" not found in prototype chain
-[FAIL] MLGraphBuilder interface: calling lstm(MLOperand, MLOperand, MLOperand, unsigned long, unsigned long, optional MLLstmOptions) on builder with too few arguments must throw TypeError
-  assert_inherits: property "lstm" not found in prototype chain
-[FAIL] MLGraphBuilder interface: builder must inherit property "lstmCell(MLOperand, MLOperand, MLOperand, MLOperand, MLOperand, unsigned long, optional MLLstmCellOptions)" with the proper type
-  assert_inherits: property "lstmCell" not found in prototype chain
-[FAIL] MLGraphBuilder interface: calling lstmCell(MLOperand, MLOperand, MLOperand, MLOperand, MLOperand, unsigned long, optional MLLstmCellOptions) on builder with too few arguments must throw TypeError
-  assert_inherits: property "lstmCell" not found in prototype chain
-[FAIL] MLGraphBuilder interface: builder must inherit property "l2Pool2d(MLOperand, optional MLPool2dOptions)" with the proper type
-  assert_inherits: property "l2Pool2d" not found in prototype chain
-[FAIL] MLGraphBuilder interface: calling l2Pool2d(MLOperand, optional MLPool2dOptions) on builder with too few arguments must throw TypeError
-  assert_inherits: property "l2Pool2d" not found in prototype chain
-[FAIL] MLGraphBuilder interface: builder must inherit property "softplus(MLOperand, optional MLSoftplusOptions)" with the proper type
-  assert_inherits: property "softplus" not found in prototype chain
-[FAIL] MLGraphBuilder interface: calling softplus(MLOperand, optional MLSoftplusOptions) on builder with too few arguments must throw TypeError
-  assert_inherits: property "softplus" not found in prototype chain
-[FAIL] MLGraphBuilder interface: builder must inherit property "softplus(optional MLSoftplusOptions)" with the proper type
-  assert_inherits: property "softplus" not found in prototype chain
-[FAIL] MLGraphBuilder interface: calling softplus(optional MLSoftplusOptions) on builder with too few arguments must throw TypeError
-  assert_inherits: property "softplus" not found in prototype chain
-[FAIL] MLGraphBuilder interface: builder must inherit property "squeeze(MLOperand, optional MLSqueezeOptions)" with the proper type
-  assert_inherits: property "squeeze" not found in prototype chain
-[FAIL] MLGraphBuilder interface: calling squeeze(MLOperand, optional MLSqueezeOptions) on builder with too few arguments must throw TypeError
-  assert_inherits: property "squeeze" not found in prototype chain
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/platform/linux-chrome/external/wpt/webnn/idlharness.https.any.worker-expected.txt b/third_party/blink/web_tests/platform/linux-chrome/external/wpt/webnn/idlharness.https.any.worker-expected.txt
deleted file mode 100644
index 99846566..0000000
--- a/third_party/blink/web_tests/platform/linux-chrome/external/wpt/webnn/idlharness.https.any.worker-expected.txt
+++ /dev/null
@@ -1,158 +0,0 @@
-This is a testharness.js-based test.
-Found 77 FAIL, 0 TIMEOUT, 0 NOTRUN.
-[FAIL] idl_test setup
-  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'input' on 'MLGraphBuilder': Failed to read the 'type' property from 'MLOperandDescriptor': Required member is undefined."
-[FAIL] NavigatorML must be primary interface of navigator
-  assert_own_property: self does not have own property "NavigatorML" expected property "NavigatorML" missing
-[FAIL] Stringification of navigator
-  assert_class_string: class string of navigator expected "[object NavigatorML]" but got "[object WorkerNavigator]"
-[FAIL] NavigatorML interface: navigator must not have property "ml"
-  assert_false: expected false got true
-[FAIL] MLGraph must be primary interface of graph
-  assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: graph is not defined"
-[FAIL] Stringification of graph
-  assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: graph is not defined"
-[FAIL] MLOperand must be primary interface of input
-  assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: input is not defined"
-[FAIL] Stringification of input
-  assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: input is not defined"
-[FAIL] MLOperand must be primary interface of filter
-  assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: filter is not defined"
-[FAIL] Stringification of filter
-  assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: filter is not defined"
-[FAIL] MLOperand must be primary interface of output
-  assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: output is not defined"
-[FAIL] Stringification of output
-  assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: output is not defined"
-[FAIL] MLActivation must be primary interface of relu
-  assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: relu is not defined"
-[FAIL] Stringification of relu
-  assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: relu is not defined"
-[FAIL] MLContext interface: operation compute(MLGraph, MLNamedArrayBufferViews, MLNamedArrayBufferViews)
-  assert_own_property: interface prototype object missing non-static operation expected property "compute" missing
-[FAIL] MLContext interface: operation createCommandEncoder()
-  assert_own_property: interface prototype object missing non-static operation expected property "createCommandEncoder" missing
-[FAIL] MLContext interface: context must inherit property "compute(MLGraph, MLNamedArrayBufferViews, MLNamedArrayBufferViews)" with the proper type
-  assert_inherits: property "compute" not found in prototype chain
-[FAIL] MLContext interface: calling compute(MLGraph, MLNamedArrayBufferViews, MLNamedArrayBufferViews) on context with too few arguments must throw TypeError
-  assert_inherits: property "compute" not found in prototype chain
-[FAIL] MLContext interface: context must inherit property "createCommandEncoder()" with the proper type
-  assert_inherits: property "createCommandEncoder" not found in prototype chain
-[FAIL] MLCommandEncoder interface: existence and properties of interface object
-  assert_own_property: self does not have own property "MLCommandEncoder" expected property "MLCommandEncoder" missing
-[FAIL] MLCommandEncoder interface object length
-  assert_own_property: self does not have own property "MLCommandEncoder" expected property "MLCommandEncoder" missing
-[FAIL] MLCommandEncoder interface object name
-  assert_own_property: self does not have own property "MLCommandEncoder" expected property "MLCommandEncoder" missing
-[FAIL] MLCommandEncoder interface: existence and properties of interface prototype object
-  assert_own_property: self does not have own property "MLCommandEncoder" expected property "MLCommandEncoder" missing
-[FAIL] MLCommandEncoder interface: existence and properties of interface prototype object's "constructor" property
-  assert_own_property: self does not have own property "MLCommandEncoder" expected property "MLCommandEncoder" missing
-[FAIL] MLCommandEncoder interface: existence and properties of interface prototype object's @@unscopables property
-  assert_own_property: self does not have own property "MLCommandEncoder" expected property "MLCommandEncoder" missing
-[FAIL] MLCommandEncoder interface: operation initializeGraph(MLGraph)
-  assert_own_property: self does not have own property "MLCommandEncoder" expected property "MLCommandEncoder" missing
-[FAIL] MLCommandEncoder interface: operation dispatch(MLGraph, MLNamedGPUResources, MLNamedGPUResources)
-  assert_own_property: self does not have own property "MLCommandEncoder" expected property "MLCommandEncoder" missing
-[FAIL] MLCommandEncoder interface: operation finish(optional GPUCommandBufferDescriptor)
-  assert_own_property: self does not have own property "MLCommandEncoder" expected property "MLCommandEncoder" missing
-[FAIL] MLGraphBuilder interface: operation constant(MLOperandDescriptor, MLBufferView)
-  assert_equals: property has wrong .length expected 1 but got 2
-[FAIL] MLGraphBuilder interface: operation constant(double, optional MLOperandType)
-  assert_equals: property has wrong .length expected 1 but got 2
-[FAIL] MLGraphBuilder interface: operation build(MLNamedOperands)
-  assert_own_property: interface prototype object missing non-static operation expected property "build" missing
-[FAIL] MLGraphBuilder interface: operation batchNormalization(MLOperand, MLOperand, MLOperand, optional MLBatchNormalizationOptions)
-  assert_own_property: interface prototype object missing non-static operation expected property "batchNormalization" missing
-[FAIL] MLGraphBuilder interface: operation gru(MLOperand, MLOperand, MLOperand, unsigned long, unsigned long, optional MLGruOptions)
-  assert_own_property: interface prototype object missing non-static operation expected property "gru" missing
-[FAIL] MLGraphBuilder interface: operation gruCell(MLOperand, MLOperand, MLOperand, MLOperand, unsigned long, optional MLGruCellOptions)
-  assert_own_property: interface prototype object missing non-static operation expected property "gruCell" missing
-[FAIL] MLGraphBuilder interface: operation hardSigmoid(MLOperand, optional MLHardSigmoidOptions)
-  assert_own_property: interface prototype object missing non-static operation expected property "hardSigmoid" missing
-[FAIL] MLGraphBuilder interface: operation hardSigmoid(optional MLHardSigmoidOptions)
-  assert_own_property: interface prototype object missing non-static operation expected property "hardSigmoid" missing
-[FAIL] MLGraphBuilder interface: operation instanceNormalization(MLOperand, optional MLInstanceNormalizationOptions)
-  assert_own_property: interface prototype object missing non-static operation expected property "instanceNormalization" missing
-[FAIL] MLGraphBuilder interface: operation linear(MLOperand, optional MLLinearOptions)
-  assert_own_property: interface prototype object missing non-static operation expected property "linear" missing
-[FAIL] MLGraphBuilder interface: operation linear(optional MLLinearOptions)
-  assert_own_property: interface prototype object missing non-static operation expected property "linear" missing
-[FAIL] MLGraphBuilder interface: operation lstm(MLOperand, MLOperand, MLOperand, unsigned long, unsigned long, optional MLLstmOptions)
-  assert_own_property: interface prototype object missing non-static operation expected property "lstm" missing
-[FAIL] MLGraphBuilder interface: operation lstmCell(MLOperand, MLOperand, MLOperand, MLOperand, MLOperand, unsigned long, optional MLLstmCellOptions)
-  assert_own_property: interface prototype object missing non-static operation expected property "lstmCell" missing
-[FAIL] MLGraphBuilder interface: operation l2Pool2d(MLOperand, optional MLPool2dOptions)
-  assert_own_property: interface prototype object missing non-static operation expected property "l2Pool2d" missing
-[FAIL] MLGraphBuilder interface: operation softmax(MLOperand)
-  assert_equals: property has wrong .length expected 0 but got 1
-[FAIL] MLGraphBuilder interface: operation softmax()
-  assert_equals: property has wrong .length expected 0 but got 1
-[FAIL] MLGraphBuilder interface: operation softplus(MLOperand, optional MLSoftplusOptions)
-  assert_own_property: interface prototype object missing non-static operation expected property "softplus" missing
-[FAIL] MLGraphBuilder interface: operation softplus(optional MLSoftplusOptions)
-  assert_own_property: interface prototype object missing non-static operation expected property "softplus" missing
-[FAIL] MLGraphBuilder interface: operation squeeze(MLOperand, optional MLSqueezeOptions)
-  assert_own_property: interface prototype object missing non-static operation expected property "squeeze" missing
-[FAIL] MLGraphBuilder interface: builder must inherit property "build(MLNamedOperands)" with the proper type
-  assert_inherits: property "build" not found in prototype chain
-[FAIL] MLGraphBuilder interface: calling build(MLNamedOperands) on builder with too few arguments must throw TypeError
-  assert_inherits: property "build" not found in prototype chain
-[FAIL] MLGraphBuilder interface: builder must inherit property "batchNormalization(MLOperand, MLOperand, MLOperand, optional MLBatchNormalizationOptions)" with the proper type
-  assert_inherits: property "batchNormalization" not found in prototype chain
-[FAIL] MLGraphBuilder interface: calling batchNormalization(MLOperand, MLOperand, MLOperand, optional MLBatchNormalizationOptions) on builder with too few arguments must throw TypeError
-  assert_inherits: property "batchNormalization" not found in prototype chain
-[FAIL] MLGraphBuilder interface: builder must inherit property "gru(MLOperand, MLOperand, MLOperand, unsigned long, unsigned long, optional MLGruOptions)" with the proper type
-  assert_inherits: property "gru" not found in prototype chain
-[FAIL] MLGraphBuilder interface: calling gru(MLOperand, MLOperand, MLOperand, unsigned long, unsigned long, optional MLGruOptions) on builder with too few arguments must throw TypeError
-  assert_inherits: property "gru" not found in prototype chain
-[FAIL] MLGraphBuilder interface: builder must inherit property "gruCell(MLOperand, MLOperand, MLOperand, MLOperand, unsigned long, optional MLGruCellOptions)" with the proper type
-  assert_inherits: property "gruCell" not found in prototype chain
-[FAIL] MLGraphBuilder interface: calling gruCell(MLOperand, MLOperand, MLOperand, MLOperand, unsigned long, optional MLGruCellOptions) on builder with too few arguments must throw TypeError
-  assert_inherits: property "gruCell" not found in prototype chain
-[FAIL] MLGraphBuilder interface: builder must inherit property "hardSigmoid(MLOperand, optional MLHardSigmoidOptions)" with the proper type
-  assert_inherits: property "hardSigmoid" not found in prototype chain
-[FAIL] MLGraphBuilder interface: calling hardSigmoid(MLOperand, optional MLHardSigmoidOptions) on builder with too few arguments must throw TypeError
-  assert_inherits: property "hardSigmoid" not found in prototype chain
-[FAIL] MLGraphBuilder interface: builder must inherit property "hardSigmoid(optional MLHardSigmoidOptions)" with the proper type
-  assert_inherits: property "hardSigmoid" not found in prototype chain
-[FAIL] MLGraphBuilder interface: calling hardSigmoid(optional MLHardSigmoidOptions) on builder with too few arguments must throw TypeError
-  assert_inherits: property "hardSigmoid" not found in prototype chain
-[FAIL] MLGraphBuilder interface: builder must inherit property "instanceNormalization(MLOperand, optional MLInstanceNormalizationOptions)" with the proper type
-  assert_inherits: property "instanceNormalization" not found in prototype chain
-[FAIL] MLGraphBuilder interface: calling instanceNormalization(MLOperand, optional MLInstanceNormalizationOptions) on builder with too few arguments must throw TypeError
-  assert_inherits: property "instanceNormalization" not found in prototype chain
-[FAIL] MLGraphBuilder interface: builder must inherit property "linear(MLOperand, optional MLLinearOptions)" with the proper type
-  assert_inherits: property "linear" not found in prototype chain
-[FAIL] MLGraphBuilder interface: calling linear(MLOperand, optional MLLinearOptions) on builder with too few arguments must throw TypeError
-  assert_inherits: property "linear" not found in prototype chain
-[FAIL] MLGraphBuilder interface: builder must inherit property "linear(optional MLLinearOptions)" with the proper type
-  assert_inherits: property "linear" not found in prototype chain
-[FAIL] MLGraphBuilder interface: calling linear(optional MLLinearOptions) on builder with too few arguments must throw TypeError
-  assert_inherits: property "linear" not found in prototype chain
-[FAIL] MLGraphBuilder interface: builder must inherit property "lstm(MLOperand, MLOperand, MLOperand, unsigned long, unsigned long, optional MLLstmOptions)" with the proper type
-  assert_inherits: property "lstm" not found in prototype chain
-[FAIL] MLGraphBuilder interface: calling lstm(MLOperand, MLOperand, MLOperand, unsigned long, unsigned long, optional MLLstmOptions) on builder with too few arguments must throw TypeError
-  assert_inherits: property "lstm" not found in prototype chain
-[FAIL] MLGraphBuilder interface: builder must inherit property "lstmCell(MLOperand, MLOperand, MLOperand, MLOperand, MLOperand, unsigned long, optional MLLstmCellOptions)" with the proper type
-  assert_inherits: property "lstmCell" not found in prototype chain
-[FAIL] MLGraphBuilder interface: calling lstmCell(MLOperand, MLOperand, MLOperand, MLOperand, MLOperand, unsigned long, optional MLLstmCellOptions) on builder with too few arguments must throw TypeError
-  assert_inherits: property "lstmCell" not found in prototype chain
-[FAIL] MLGraphBuilder interface: builder must inherit property "l2Pool2d(MLOperand, optional MLPool2dOptions)" with the proper type
-  assert_inherits: property "l2Pool2d" not found in prototype chain
-[FAIL] MLGraphBuilder interface: calling l2Pool2d(MLOperand, optional MLPool2dOptions) on builder with too few arguments must throw TypeError
-  assert_inherits: property "l2Pool2d" not found in prototype chain
-[FAIL] MLGraphBuilder interface: builder must inherit property "softplus(MLOperand, optional MLSoftplusOptions)" with the proper type
-  assert_inherits: property "softplus" not found in prototype chain
-[FAIL] MLGraphBuilder interface: calling softplus(MLOperand, optional MLSoftplusOptions) on builder with too few arguments must throw TypeError
-  assert_inherits: property "softplus" not found in prototype chain
-[FAIL] MLGraphBuilder interface: builder must inherit property "softplus(optional MLSoftplusOptions)" with the proper type
-  assert_inherits: property "softplus" not found in prototype chain
-[FAIL] MLGraphBuilder interface: calling softplus(optional MLSoftplusOptions) on builder with too few arguments must throw TypeError
-  assert_inherits: property "softplus" not found in prototype chain
-[FAIL] MLGraphBuilder interface: builder must inherit property "squeeze(MLOperand, optional MLSqueezeOptions)" with the proper type
-  assert_inherits: property "squeeze" not found in prototype chain
-[FAIL] MLGraphBuilder interface: calling squeeze(MLOperand, optional MLSqueezeOptions) on builder with too few arguments must throw TypeError
-  assert_inherits: property "squeeze" not found in prototype chain
-Harness: the test ran to completion.
-
diff --git a/third_party/catapult b/third_party/catapult
index 5c1525f..b80aa26 160000
--- a/third_party/catapult
+++ b/third_party/catapult
@@ -1 +1 @@
-Subproject commit 5c1525f035b3ffeadd8a6e7750de77344e68112d
+Subproject commit b80aa2639fb10ad27cde55d4ff91add5541b693e
diff --git a/third_party/cros-components/src b/third_party/cros-components/src
index a6eda34..a767012 160000
--- a/third_party/cros-components/src
+++ b/third_party/cros-components/src
@@ -1 +1 @@
-Subproject commit a6eda34d484dbe2c7b53b18e9b0178471786d31e
+Subproject commit a767012d5dd290a3f05c13dc409dcaa55a36143d
diff --git a/third_party/dawn b/third_party/dawn
index 2b4d11e..ba111c4 160000
--- a/third_party/dawn
+++ b/third_party/dawn
@@ -1 +1 @@
-Subproject commit 2b4d11e8baa591349d1d4ebc0232b7551e8dd30e
+Subproject commit ba111c412386625576ee05406f185380e16b7173
diff --git a/third_party/devtools-frontend-internal b/third_party/devtools-frontend-internal
index c897148..85d0133 160000
--- a/third_party/devtools-frontend-internal
+++ b/third_party/devtools-frontend-internal
@@ -1 +1 @@
-Subproject commit c897148700ae41473202b3e91a1c78d15147ecf0
+Subproject commit 85d0133dea66c39f934d01aa64319b03f14abbcb
diff --git a/third_party/devtools-frontend/src b/third_party/devtools-frontend/src
index 3a4c1e3..9d796a3 160000
--- a/third_party/devtools-frontend/src
+++ b/third_party/devtools-frontend/src
@@ -1 +1 @@
-Subproject commit 3a4c1e3b3397b5aa0a0d20c14748a4223b62b28b
+Subproject commit 9d796a30b712bfc1011f2d74c63ffd7ecc30fe69
diff --git a/third_party/freetype/README.chromium b/third_party/freetype/README.chromium
index 7963975..9e48a4a 100644
--- a/third_party/freetype/README.chromium
+++ b/third_party/freetype/README.chromium
@@ -1,7 +1,7 @@
 Name: FreeType
 URL: http://www.freetype.org/
-Version: VER-2-13-2-79-gd77dd24b4
-Revision: d77dd24b412951fea1c649c0514670f9eec8888c
+Version: VER-2-13-2-81-gdf39b017d
+Revision: df39b017d9b25eb34b396484fc235544cedd0565
 CPEPrefix: cpe:/a:freetype:freetype:2.13.2
 License: Custom license "inspired by the BSD, Artistic, and IJG (Independent
          JPEG Group) licenses"
diff --git a/third_party/freetype/src b/third_party/freetype/src
index d77dd24b..df39b01 160000
--- a/third_party/freetype/src
+++ b/third_party/freetype/src
@@ -1 +1 @@
-Subproject commit d77dd24b412951fea1c649c0514670f9eec8888c
+Subproject commit df39b017d9b25eb34b396484fc235544cedd0565
diff --git a/third_party/skia b/third_party/skia
index c6d971f8..cebd444 160000
--- a/third_party/skia
+++ b/third_party/skia
@@ -1 +1 @@
-Subproject commit c6d971f87d12cdf14c691768bfbc84b1708cc389
+Subproject commit cebd44423589a04572589d7afe747d2403e8376e
diff --git a/third_party/vulkan-deps b/third_party/vulkan-deps
index 8517c30..fbb48769 160000
--- a/third_party/vulkan-deps
+++ b/third_party/vulkan-deps
@@ -1 +1 @@
-Subproject commit 8517c30c0d2eea0253a67590bf457249f4fa317f
+Subproject commit fbb4876974053a41d987e06204d0bb8a73d5c90c
diff --git a/third_party/webrtc b/third_party/webrtc
index 15b12dc..a392060 160000
--- a/third_party/webrtc
+++ b/third_party/webrtc
@@ -1 +1 @@
-Subproject commit 15b12dc96c4f9b9321cd24cc0f35668c28bc540c
+Subproject commit a39206020cec8b6735195be66b203ef6fe0684fc
diff --git a/tools/ipc_fuzzer/message_tools/message_list.cc b/tools/ipc_fuzzer/message_tools/message_list.cc
index ee0c2ae..b996656 100644
--- a/tools/ipc_fuzzer/message_tools/message_list.cc
+++ b/tools/ipc_fuzzer/message_tools/message_list.cc
@@ -34,13 +34,7 @@
 #include "tools/ipc_fuzzer/message_lib/all_messages.h"
 };
 #define MSGTABLE_SIZE (sizeof(msgtable)/sizeof(msgtable[0]))
-
-#if !BUILDFLAG(ENABLE_NACL) && !BUILDFLAG(ENABLE_PPAPI) && \
-    !BUILDFLAG(ENABLE_EXTENSIONS_LEGACY_IPC)
-static_assert(MSGTABLE_SIZE == 0, "There should be no messages");
-#else
 static_assert(MSGTABLE_SIZE, "check your headers for an extra semicolon");
-#endif
 
 static bool check_msgtable() {
   bool result = true;
@@ -57,17 +51,8 @@
 
 #if !BUILDFLAG(ENABLE_NACL)
   exemptions.push_back(NaClMsgStart);
-  exemptions.push_back(NaClHostMsgStart);
 #endif  // !BUILDFLAG(ENABLE_NACL)
 
-#if !BUILDFLAG(ENABLE_EXTENSIONS_LEGACY_IPC)
-  exemptions.push_back(ExtensionMsgStart);
-#endif  // !BUILDFLAG(ENABLE_EXTENSIONS_LEGACY_IPC)
-
-#if !BUILDFLAG(ENABLE_PPAPI)
-  exemptions.push_back(PpapiMsgStart);
-#endif  // !BUILDFLAG(ENABLE_PPAPI)
-
 #if !BUILDFLAG(IS_ANDROID)
   exemptions.push_back(GinJavaBridgeMsgStart);
   exemptions.push_back(ExtensionWorkerMsgStart);
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 52480f7..7423688 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -25253,6 +25253,8 @@
   <int value="4742" label="LinkRelOpenerTargetingSameFrame"/>
   <int value="4743" label="CSSSelectorPseudoHas"/>
   <int value="4744" label="WakeLockAcquireScreenLockWithoutStickyActivation"/>
+  <int value="4745" label="SubtleCryptoDeriveBitsZeroLength"/>
+  <int value="4746" label="SubtleCryptoDeriveBitsTruncation"/>
 </enum>
 
 <enum name="FeaturePolicyFeature">
@@ -40943,6 +40945,7 @@
   <int value="1626824478" label="ExperimentalAppBanners:disabled"/>
   <int value="1627416551" label="ImeInputLogicMozc:disabled"/>
   <int value="1627666567" label="ChromeOSAmbientMode:disabled"/>
+  <int value="1627854370" label="NearbyPresence:disabled"/>
   <int value="1628259213" label="DuetTabStripIntegrationAndroid:enabled"/>
   <int value="1628831121" label="SafeBrowsingUseLocalBlacklistsV2:enabled"/>
   <int value="1629047185" label="IPH_ExtensionsMenu:disabled"/>
@@ -41918,6 +41921,7 @@
   <int value="2071229145" label="BloatedRendererDetection:enabled"/>
   <int value="2071340353" label="progress-bar-completion"/>
   <int value="2071461362" label="disable-credit-card-scan"/>
+  <int value="2071970646" label="NearbyPresence:enabled"/>
   <int value="2072050792" label="JourneysIncludeSyncedVisits:enabled"/>
   <int value="2072057275" label="UpdateHoverAtBeginFrame:disabled"/>
   <int value="2072231406" label="SingleProcessMash:disabled"/>
diff --git a/tools/metrics/histograms/metadata/accessibility/histograms.xml b/tools/metrics/histograms/metadata/accessibility/histograms.xml
index bb65752..b325906 100644
--- a/tools/metrics/histograms/metadata/accessibility/histograms.xml
+++ b/tools/metrics/histograms/metadata/accessibility/histograms.xml
@@ -2264,21 +2264,21 @@
 </histogram>
 
 <histogram name="Accessibility.ScreenAI.LibraryAccessResultOnVerify"
-    enum="WinGetLastError" expires_after="2024-02-01">
+    enum="WinGetLastError" expires_after="2024-05-01">
   <owner>rhalavati@chromium.org</owner>
   <owner>chrome-a11y-core@google.com</owner>
   <summary>
     Records the error result of trying to load chrome_screen_ai.dll after the
-    component is verified.
+    component is verified. This is only recorded on Windows.
   </summary>
 </histogram>
 
 <histogram name="Accessibility.ScreenAI.LibraryAvailableOnVerify"
-    enum="BooleanSuccess" expires_after="2024-02-01">
+    enum="BooleanSuccess" expires_after="2024-05-01">
   <owner>rhalavati@chromium.org</owner>
   <owner>chrome-a11y-core@google.com</owner>
   <summary>
-    Records library load result for chrome_screen_ai.dll after the component is
+    Records library load result for Chrome Screen AI after the component is
     verified.
   </summary>
 </histogram>
@@ -2294,10 +2294,11 @@
 </histogram>
 
 <histogram name="Accessibility.ScreenAI.LibraryPathVerified"
-    enum="BooleanSuccess" expires_after="2024-02-01">
+    enum="BooleanSuccess" expires_after="2023-11-21">
   <owner>rhalavati@chromium.org</owner>
   <owner>chrome-a11y-core@google.com</owner>
   <summary>
+    Deprecated in 2023-11 as it was added only to collect data to debug a crash.
     Records if the library path matched the heuristics for chrome_screen_ai.dll
     when the component is verified.
   </summary>
diff --git a/tools/metrics/histograms/metadata/browser/histograms.xml b/tools/metrics/histograms/metadata/browser/histograms.xml
index aba984c..f2a0205 100644
--- a/tools/metrics/histograms/metadata/browser/histograms.xml
+++ b/tools/metrics/histograms/metadata/browser/histograms.xml
@@ -989,7 +989,7 @@
 </histogram>
 
 <histogram name="BrowserServices.VerificationTime.Offline" units="ms"
-    expires_after="2024-01-01">
+    expires_after="2024-05-05">
   <owner>peconn@chromium.org</owner>
   <owner>peter@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/chromeos/histograms.xml b/tools/metrics/histograms/metadata/chromeos/histograms.xml
index 89cf0ec..23a71ac4 100644
--- a/tools/metrics/histograms/metadata/chromeos/histograms.xml
+++ b/tools/metrics/histograms/metadata/chromeos/histograms.xml
@@ -750,7 +750,7 @@
 </histogram>
 
 <histogram name="ChromeOS.Camera.PortraitMode.Error" enum="PortraitModeError"
-    expires_after="2023-12-31">
+    expires_after="2024-03-17">
   <owner>julianachang@google.com</owner>
   <owner>chromeos-camera-eng@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/file/histograms.xml b/tools/metrics/histograms/metadata/file/histograms.xml
index 25521f4..992b0db 100644
--- a/tools/metrics/histograms/metadata/file/histograms.xml
+++ b/tools/metrics/histograms/metadata/file/histograms.xml
@@ -797,7 +797,7 @@
 </histogram>
 
 <histogram name="FileBrowser.Notification.UserAction"
-    enum="FileManagerNotificationUserAction" expires_after="2023-12-25">
+    enum="FileManagerNotificationUserAction" expires_after="2024-11-15">
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/histogram_suffixes_list.xml b/tools/metrics/histograms/metadata/histogram_suffixes_list.xml
index 6494bda..fa64754 100644
--- a/tools/metrics/histograms/metadata/histogram_suffixes_list.xml
+++ b/tools/metrics/histograms/metadata/histogram_suffixes_list.xml
@@ -2248,34 +2248,6 @@
   <affected-histogram name="Navigation.TimeToReadyToCommit2"/>
 </histogram_suffixes>
 
-<histogram_suffixes name="NavigationItemSerializedSize" separator=".">
-  <suffix name="SerializedDisplayStateSize"
-      label="Estimated size of DisplayState in serialized session item used
-             to persist single NavigationItem DisplayState in session
-             history."/>
-  <suffix name="SerializedReferrerURLSize"
-      label="Estimated size of referrer's URL in serialized session item used
-             to persist single NavigationItem referrer's URL in session
-             history."/>
-  <suffix name="SerializedRequestHeadersSize"
-      label="Estimated size of HTTP request headers in serialized session
-             item used to persist single NavigationItem headers in session
-             history."/>
-  <suffix name="SerializedSize"
-      label="Estimated size of serialized session item used to persist single
-             NavigationItem in session history."/>
-  <suffix name="SerializedTitleSize"
-      label="Estimated size of title in serialized session item used to
-             persist single NavigationItem title in session history."/>
-  <suffix name="SerializedURLSize"
-      label="Estimated size of URL in serialized session item used to persist
-             single NavigationItem URL in session history."/>
-  <suffix name="SerializedVirtualURLSize"
-      label="Estimated size of virtual URL in serialized session item used to
-             persist single NavigationItem virtual URL in session history."/>
-  <affected-histogram name="Session.WebStates.NavigationItem"/>
-</histogram_suffixes>
-
 <histogram_suffixes name="NavigationProcessType" separator=".">
   <suffix name="CrossProcess" label="Cross process navigation."/>
   <suffix name="SameProcess" label="Same process navigation."/>
diff --git a/tools/metrics/histograms/metadata/net/histograms.xml b/tools/metrics/histograms/metadata/net/histograms.xml
index ced3f344f..ff297bc 100644
--- a/tools/metrics/histograms/metadata/net/histograms.xml
+++ b/tools/metrics/histograms/metadata/net/histograms.xml
@@ -1848,14 +1848,6 @@
   </summary>
 </histogram>
 
-<histogram name="net.HttpIdentSrcURL" units="requests" expires_after="M85">
-  <owner>tsepez@chromium.org</owner>
-  <summary>
-    Count of requests which contained a basic auth username and password
-    embedded in the URL itself.
-  </summary>
-</histogram>
-
 <histogram name="Net.HttpJob.CanIncludeCookies" enum="Boolean"
     expires_after="2024-06-18">
   <owner>cfredric@chromium.org</owner>
@@ -2256,16 +2248,6 @@
   </summary>
 </histogram>
 
-<histogram name="Net.PublicKeyPinSuccess" enum="BooleanSuccess"
-    expires_after="M77">
-  <owner>agl@chromium.org</owner>
-  <summary>
-    A validated certificate chain may be subject to additional
-    &quot;pinning&quot; requirements on a per-domain basis. This records the
-    fraction of successful matches between a certificate chain and a pin list.
-  </summary>
-</histogram>
-
 <histogram name="Net.QuicActiveSessions" units="units"
     expires_after="2024-03-22">
   <owner>dschinazi@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/network/enums.xml b/tools/metrics/histograms/metadata/network/enums.xml
index d0b494b..2c471231 100644
--- a/tools/metrics/histograms/metadata/network/enums.xml
+++ b/tools/metrics/histograms/metadata/network/enums.xml
@@ -571,6 +571,11 @@
   <int value="1" label="kWifiWithCellularNotConnected"/>
 </enum>
 
+<enum name="IpProtectionProxyLayer">
+  <int value="0" label="Proxy A"/>
+  <int value="1" label="Proxy B"/>
+</enum>
+
 <enum name="IpProtectionTokenBatchRequestResult">
   <int value="0" label="Success"/>
   <int value="1" label="Failed - No Account"/>
diff --git a/tools/metrics/histograms/metadata/network/histograms.xml b/tools/metrics/histograms/metadata/network/histograms.xml
index 0ec22c0..67b3e22 100644
--- a/tools/metrics/histograms/metadata/network/histograms.xml
+++ b/tools/metrics/histograms/metadata/network/histograms.xml
@@ -1647,7 +1647,7 @@
 </histogram>
 
 <histogram name="Network.DnsProxy.DnsOverHttpsMode"
-    enum="DnsProxy.DnsOverHttpsMode" expires_after="2024-05-19">
+    enum="DnsProxy.DnsOverHttpsMode" expires_after="2024-12-31">
   <owner>garrick@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -1657,7 +1657,7 @@
 </histogram>
 
 <histogram name="Network.DnsProxy.DnsOverHttpsQuery.HttpErrors"
-    enum="DnsProxy.HttpError" expires_after="2023-12-31">
+    enum="DnsProxy.HttpError" expires_after="2024-12-31">
   <owner>garrick@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -1667,7 +1667,7 @@
 </histogram>
 
 <histogram name="Network.DnsProxy.NameserverTypes"
-    enum="DnsProxy.NameserverType" expires_after="2024-05-19">
+    enum="DnsProxy.NameserverType" expires_after="2024-12-31">
   <owner>garrick@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -1677,7 +1677,7 @@
 </histogram>
 
 <histogram name="Network.DnsProxy.PlainTextProbe.{Family}.Errors"
-    enum="DnsProxy.QueryResult" expires_after="2024-03-03">
+    enum="DnsProxy.QueryResult" expires_after="2024-12-31">
   <owner>jasongustaman@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -1692,7 +1692,7 @@
 </histogram>
 
 <histogram name="Network.DnsProxy.PlainTextProbe.{Family}.FailedRetries"
-    units="count" expires_after="2024-03-03">
+    units="count" expires_after="2024-12-31">
   <owner>jasongustaman@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -1707,7 +1707,7 @@
 </histogram>
 
 <histogram name="Network.DnsProxy.PlainTextProbe.{Family}.Results"
-    enum="DnsProxy.QueryResult" expires_after="2024-05-05">
+    enum="DnsProxy.QueryResult" expires_after="2024-12-31">
   <owner>jasongustaman@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -1722,7 +1722,7 @@
 </histogram>
 
 <histogram name="Network.DnsProxy.PlainTextProbe.{Family}.ResultsWithRetries"
-    enum="DnsProxy.QueryResult" expires_after="2024-03-03">
+    enum="DnsProxy.QueryResult" expires_after="2024-12-31">
   <owner>jasongustaman@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -1738,7 +1738,7 @@
 </histogram>
 
 <histogram name="Network.DnsProxy.PlainTextProbe.{Family}.RetriesUntilSuccess"
-    units="count" expires_after="2024-05-05">
+    units="count" expires_after="2024-12-31">
   <owner>jasongustaman@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -1753,7 +1753,7 @@
 </histogram>
 
 <histogram name="Network.DnsProxy.Query.Failed{Stage}Duration" units="ms"
-    expires_after="2024-03-03">
+    expires_after="2024-12-31">
   <owner>garrick@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -1789,7 +1789,7 @@
 </histogram>
 
 <histogram name="Network.DnsProxy.Query.{Stage}Duration" units="ms"
-    expires_after="2024-03-03">
+    expires_after="2024-12-31">
   <owner>garrick@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -1825,7 +1825,7 @@
 </histogram>
 
 <histogram name="Network.DnsProxy.{Family}Nameservers" units="units"
-    expires_after="2024-05-05">
+    expires_after="2024-12-31">
   <owner>garrick@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -1840,7 +1840,7 @@
 </histogram>
 
 <histogram name="Network.DnsProxy.{ProcessType}.Event"
-    enum="DnsProxy.ProcessEvent" expires_after="2024-05-05">
+    enum="DnsProxy.ProcessEvent" expires_after="2024-12-31">
   <owner>garrick@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -1858,7 +1858,7 @@
 </histogram>
 
 <histogram name="Network.DnsProxy.{Type}Query.Errors"
-    enum="DnsProxy.QueryError" expires_after="2024-05-05">
+    enum="DnsProxy.QueryError" expires_after="2024-12-31">
   <owner>garrick@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -1873,7 +1873,7 @@
 </histogram>
 
 <histogram name="Network.DnsProxy.{Type}Query.FailedResolveDuration" units="ms"
-    expires_after="2024-05-05">
+    expires_after="2024-12-31">
   <owner>garrick@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -1894,7 +1894,7 @@
 </histogram>
 
 <histogram name="Network.DnsProxy.{Type}Query.ResolveDuration" units="ms"
-    expires_after="2024-05-05">
+    expires_after="2024-12-31">
   <owner>garrick@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -1915,7 +1915,7 @@
 </histogram>
 
 <histogram name="Network.DnsProxy.{Type}Query.Results"
-    enum="DnsProxy.QueryResult" expires_after="2024-05-05">
+    enum="DnsProxy.QueryResult" expires_after="2024-12-31">
   <owner>garrick@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -1930,7 +1930,7 @@
 </histogram>
 
 <histogram name="Network.DnsProxy.{Type}Query.ResultsWithRetries"
-    enum="DnsProxy.QueryResult" expires_after="2024-03-03">
+    enum="DnsProxy.QueryResult" expires_after="2024-12-31">
   <owner>garrick@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -1974,7 +1974,7 @@
 </histogram>
 
 <histogram name="Network.Multicast.ARC.ActiveTime" units="%"
-    expires_after="2024-05-05">
+    expires_after="2024-12-31">
   <owner>chuweih@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -1986,7 +1986,7 @@
 </histogram>
 
 <histogram name="Network.Multicast.ARC.WiFi.{Protocol}.ActiveCount"
-    units="packets" expires_after="2024-05-05">
+    units="packets" expires_after="2024-12-31">
   <owner>jasongustaman@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2002,7 +2002,7 @@
 </histogram>
 
 <histogram name="Network.Multicast.ARC.WiFi.{Protocol}.InactiveCount"
-    units="packets" expires_after="2023-12-31">
+    units="packets" expires_after="2024-12-31">
   <owner>jasongustaman@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2018,7 +2018,7 @@
 </histogram>
 
 <histogram name="Network.Multicast.TotalCount" units="packets"
-    expires_after="2024-05-05">
+    expires_after="2024-12-31">
   <owner>jasongustaman@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2029,7 +2029,7 @@
 </histogram>
 
 <histogram name="Network.Multicast.{Technology}.ConnectedCount" units="packets"
-    expires_after="2024-05-05">
+    expires_after="2024-12-31">
   <owner>jasongustaman@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2046,7 +2046,7 @@
 </histogram>
 
 <histogram name="Network.Multicast.{Technology}.{Protocol}.ConnectedCount"
-    units="packets" expires_after="2024-05-05">
+    units="packets" expires_after="2024-12-31">
   <owner>jasongustaman@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2142,7 +2142,7 @@
 </histogram>
 
 <histogram name="Network.Patchpanel.ArcService"
-    enum="NetworkPatchpanelArcEvent" expires_after="2024-03-03">
+    enum="NetworkPatchpanelArcEvent" expires_after="2024-12-31">
   <owner>hugobenichi@google.com</owner>
   <owner>cros-connectivity@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
@@ -2157,7 +2157,7 @@
 </histogram>
 
 <histogram name="Network.Patchpanel.Dbus" enum="NetworkPatchpanelDbusEvent"
-    expires_after="2023-12-31">
+    expires_after="2024-12-31">
   <owner>hugobenichi@google.com</owner>
   <owner>cros-connectivity@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
@@ -2171,7 +2171,7 @@
 </histogram>
 
 <histogram name="Network.Patchpanel.Tethering.CreateTetheredNetwork"
-    enum="NetworkPatchpanelDownstreamNetworkResult" expires_after="2024-04-28">
+    enum="NetworkPatchpanelDownstreamNetworkResult" expires_after="2024-12-31">
   <owner>hugobenichi@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2181,7 +2181,7 @@
 </histogram>
 
 <histogram name="Network.Patchpanel.Tethering.DHCPServer"
-    enum="NetworkPatchpanelDHCPServerEvent" expires_after="2024-04-28">
+    enum="NetworkPatchpanelDHCPServerEvent" expires_after="2024-12-31">
   <owner>hugobenichi@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2453,7 +2453,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Cellular.TimeToRedirectFound" units="ms"
-    expires_after="2024-04-28">
+    expires_after="2024-12-31">
   <owner>matthewmwang@chromium.org</owner>
   <owner>hugobenichi@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
@@ -2477,7 +2477,7 @@
 </histogram>
 
 <histogram name="Network.Shill.ConnectionDiagnosticsIssue"
-    enum="ConnectionDiagnosticsIssue" expires_after="2024-05-19">
+    enum="ConnectionDiagnosticsIssue" expires_after="2024-12-31">
   <owner>hugobenichi@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2490,7 +2490,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Ethernet.DevicePresenceStatus"
-    enum="BooleanPresent" expires_after="2024-05-19">
+    enum="BooleanPresent" expires_after="2024-12-31">
   <owner>hugobenichi@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2500,7 +2500,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Ethernet.Driver" enum="EthernetDriver"
-    expires_after="2024-05-05">
+    expires_after="2024-12-31">
   <owner>chuweih@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2510,7 +2510,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Ethernet.ExpiredLeaseLengthSeconds2"
-    units="seconds" expires_after="2024-02-25">
+    units="seconds" expires_after="2024-12-31">
   <owner>hugobenichi@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2523,7 +2523,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Ethernet.PortalResult"
-    enum="NetworkPortalResult" expires_after="2024-01-14">
+    enum="NetworkPortalResult" expires_after="2024-12-31">
   <owner>hugobenichi@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2535,7 +2535,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Ethernet.ServiceErrors"
-    enum="NetworkServiceError" expires_after="2024-02-04">
+    enum="NetworkServiceError" expires_after="2024-12-31">
   <owner>hugobenichi@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2545,7 +2545,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Ethernet.TimeOnline" units="seconds"
-    expires_after="2024-01-21">
+    expires_after="2024-12-31">
   <owner>hugobenichi@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2558,7 +2558,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Ethernet.TimeToConfig" units="ms"
-    expires_after="2024-04-28">
+    expires_after="2024-12-31">
   <owner>hugobenichi@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2571,7 +2571,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Ethernet.TimeToInitialize" units="ms"
-    expires_after="2024-01-14">
+    expires_after="2024-12-31">
   <owner>hugobenichi@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2583,7 +2583,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Ethernet.TimeToOnline" units="ms"
-    expires_after="2024-04-28">
+    expires_after="2024-12-31">
   <owner>hugobenichi@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2595,7 +2595,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Ethernet.TimeToPortal" units="ms"
-    expires_after="2024-01-14">
+    expires_after="2024-12-31">
   <owner>hugobenichi@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2607,7 +2607,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Ethernet.TimeToRedirectFound" units="ms"
-    expires_after="2024-02-04">
+    expires_after="2024-12-31">
   <owner>matthewmwang@chromium.org</owner>
   <owner>hugobenichi@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
@@ -2621,7 +2621,7 @@
 </histogram>
 
 <histogram name="Network.Shill.PortalDetector.AggregateResult.{Technology}"
-    enum="PortalDetectorAggregateResult" expires_after="2024-04-28">
+    enum="PortalDetectorAggregateResult" expires_after="2024-12-31">
   <owner>hugobenichi@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2787,7 +2787,7 @@
 
 <histogram
     name="Network.Shill.PortalDetector.{AttemptResult}Duration.{Technology}"
-    units="ms" expires_after="2024-05-19">
+    units="ms" expires_after="2024-12-31">
   <owner>hugobenichi@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2803,7 +2803,7 @@
 </histogram>
 
 <histogram name="Network.Shill.PortalDetector.{ProbeType}Duration.{Technology}"
-    units="ms" expires_after="2024-05-19">
+    units="ms" expires_after="2024-12-31">
   <owner>hugobenichi@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2818,7 +2818,7 @@
 </histogram>
 
 <histogram name="Network.Shill.PortalDetector.{Transition}.{Technology}"
-    units="ms" expires_after="2024-04-28">
+    units="ms" expires_after="2024-12-31">
   <owner>hugobenichi@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2837,7 +2837,7 @@
 </histogram>
 
 <histogram name="Network.Shill.PPPMTUValue" units="bytes"
-    expires_after="2023-12-31">
+    expires_after="2024-12-31">
   <owner>jiejiang@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2871,7 +2871,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Vpn.Driver" enum="VPNDriver"
-    expires_after="2024-05-19">
+    expires_after="2024-12-31">
   <owner>jiejiang@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2881,7 +2881,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Vpn.Ikev2.AuthenticationType"
-    enum="VPNIPsecAuthenticationType" expires_after="2023-12-31">
+    enum="VPNIPsecAuthenticationType" expires_after="2024-12-31">
   <owner>jiejiang@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2891,7 +2891,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Vpn.Ikev2.EndReason" enum="NetworkServiceError"
-    expires_after="2024-05-12">
+    expires_after="2024-12-31">
   <owner>jiejiang@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2903,7 +2903,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Vpn.L2tpIpsec.SwanctlEndReason"
-    enum="NetworkServiceError" expires_after="2024-05-19">
+    enum="NetworkServiceError" expires_after="2024-12-31">
   <owner>jiejiang@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2916,7 +2916,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Vpn.L2tpIpsecTunnelGroupUsage"
-    enum="VPNL2TPIPsecTunnelGroupUsage" expires_after="2023-12-31">
+    enum="VPNL2TPIPsecTunnelGroupUsage" expires_after="2024-12-31">
   <owner>jiejiang@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2927,7 +2927,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Vpn.OpenVPNCipher" enum="VPNOpenVPNCipher"
-    expires_after="2024-05-05">
+    expires_after="2024-12-31">
   <owner>taoyl@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2937,7 +2937,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Vpn.RemoteAuthenticationType"
-    enum="VPNRemoteAuthenticationType" expires_after="2024-02-20">
+    enum="VPNRemoteAuthenticationType" expires_after="2024-12-31">
   <owner>jiejiang@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2947,7 +2947,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Vpn.TimeOnline" units="seconds"
-    expires_after="2024-02-20">
+    expires_after="2024-12-31">
   <owner>jiejiang@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2961,7 +2961,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Vpn.TimeToConfig" units="ms"
-    expires_after="2024-02-20">
+    expires_after="2024-12-31">
   <owner>jiejiang@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2971,7 +2971,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Vpn.TimeToOnline" units="ms"
-    expires_after="2024-01-14">
+    expires_after="2024-12-31">
   <owner>jiejiang@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2981,7 +2981,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Vpn.UserAuthenticationType"
-    enum="VPNUserAuthenticationType" expires_after="2024-02-20">
+    enum="VPNUserAuthenticationType" expires_after="2024-12-31">
   <owner>jiejiang@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2991,7 +2991,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Vpn.WireGuardAllowedIPsType"
-    enum="VPNWireGuardAllowedIPsType" expires_after="2024-04-28">
+    enum="VPNWireGuardAllowedIPsType" expires_after="2024-12-31">
   <owner>jiejiang@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -3001,7 +3001,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Vpn.WireGuardKeyPairSource"
-    enum="VPNWireGuardKeyPairSource" expires_after="2023-12-31">
+    enum="VPNWireGuardKeyPairSource" expires_after="2024-12-31">
   <owner>jiejiang@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -3011,7 +3011,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Vpn.WireGuardPeersNum" units="WireGuard peers"
-    expires_after="2024-04-28">
+    expires_after="2024-12-31">
   <owner>jiejiang@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -3021,7 +3021,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Vpn.{VPNType}.EspEncryptionAlgorithm"
-    enum="VPNIPsecEncryptionAlgorithm" expires_after="2024-05-12">
+    enum="VPNIPsecEncryptionAlgorithm" expires_after="2024-12-31">
   <owner>jiejiang@chromium.org</owner>
   <owner>cros-connectivity@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
@@ -3034,7 +3034,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Vpn.{VPNType}.EspIntegrityAlgorithm"
-    enum="VPNIPsecIntegrirtyAlgorithm" expires_after="2024-05-12">
+    enum="VPNIPsecIntegrirtyAlgorithm" expires_after="2024-12-31">
   <owner>jiejiang@chromium.org</owner>
   <owner>cros-connectivity@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
@@ -3047,7 +3047,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Vpn.{VPNType}.IkeDHGroup" enum="VPNIPsecDHGroup"
-    expires_after="2024-05-12">
+    expires_after="2024-12-31">
   <owner>jiejiang@chromium.org</owner>
   <owner>cros-connectivity@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
@@ -3060,7 +3060,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Vpn.{VPNType}.IkeEncryptionAlgorithm"
-    enum="VPNIPsecEncryptionAlgorithm" expires_after="2024-05-12">
+    enum="VPNIPsecEncryptionAlgorithm" expires_after="2024-12-31">
   <owner>jiejiang@chromium.org</owner>
   <owner>cros-connectivity@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
@@ -3073,7 +3073,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Vpn.{VPNType}.IkeIntegrityAlgorithm"
-    enum="VPNIPsecIntegrirtyAlgorithm" expires_after="2024-05-12">
+    enum="VPNIPsecIntegrirtyAlgorithm" expires_after="2024-12-31">
   <owner>jiejiang@chromium.org</owner>
   <owner>cros-connectivity@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
@@ -3086,7 +3086,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Vpn.{VPNType}.IPType" enum="NetworkIPType"
-    expires_after="2024-05-05">
+    expires_after="2024-12-31">
   <owner>jiejiang@chromium.org</owner>
   <owner>cros-connectivity@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
@@ -3474,7 +3474,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Wifi.NeighborLinkMonitorFailure"
-    enum="NeighborLinkMonitorFailureType" expires_after="2024-05-19">
+    enum="NeighborLinkMonitorFailureType" expires_after="2024-12-31">
   <owner>jiejiang@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -3592,7 +3592,7 @@
 </histogram>
 
 <histogram name="Network.Shill.WiFi.Passpoint.ProvisioningResult"
-    enum="PasspointProvisioningResult" expires_after="2024-05-19">
+    enum="PasspointProvisioningResult" expires_after="2024-12-31">
   <owner>hugobenichi@google.com</owner>
   <owner>cros-networking@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
@@ -4021,7 +4021,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Wifi.TimeToPortal" units="ms"
-    expires_after="2024-05-12">
+    expires_after="2024-12-31">
   <owner>matthewmwang@chromium.org</owner>
   <owner>hugobenichi@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
@@ -4033,7 +4033,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Wifi.TimeToRedirectFound" units="ms"
-    expires_after="2024-03-24">
+    expires_after="2024-12-31">
   <owner>matthewmwang@chromium.org</owner>
   <owner>hugobenichi@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
@@ -4111,7 +4111,7 @@
 </histogram>
 
 <histogram name="Network.Shill.{Technology}.DHCPv4ProvisionDurationMillis"
-    units="ms" expires_after="2024-05-12">
+    units="ms" expires_after="2024-12-31">
   <owner>jiejiang@chromium.org</owner>
   <owner>cros-connectivity@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
@@ -4125,7 +4125,7 @@
 </histogram>
 
 <histogram name="Network.Shill.{Technology}.IPType" enum="NetworkIPType"
-    expires_after="2024-05-05">
+    expires_after="2024-12-31">
   <owner>jiejiang@chromium.org</owner>
   <owner>cros-connectivity@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
@@ -4140,7 +4140,7 @@
 </histogram>
 
 <histogram name="Network.Shill.{Technology}.SLAACProvisionDurationMillis"
-    units="ms" expires_after="2024-05-12">
+    units="ms" expires_after="2024-12-31">
   <owner>jiejiang@chromium.org</owner>
   <owner>cros-connectivity@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
@@ -4376,14 +4376,38 @@
   </summary>
 </histogram>
 
+<histogram name="NetworkService.IpProtection.AreAuthTokensAvailable"
+    enum="BooleanSuccess" expires_after="2024-05-12">
+  <owner>djmitche@chromium.org</owner>
+  <owner>src/chrome/browser/ip_protection/OWNERS</owner>
+  <summary>
+    The result of a call to `IpProtectionConfigCache::AreAuthTokensAvailable()`
+    when `NetworkServiceProxyDelegate::OnResolveProxy()` is determining if the
+    request is eligible for IP Protection. If this fails, tokens were not
+    available in all token caches and the request will bypass the IP Protection
+    proxy.
+  </summary>
+</histogram>
+
+<histogram name="NetworkService.IpProtection.EmptyTokenCache"
+    enum="IpProtectionProxyLayer" expires_after="2024-05-12">
+  <owner>djmitche@chromium.org</owner>
+  <owner>src/chrome/browser/ip_protection/OWNERS</owner>
+  <summary>
+    Records which token cache (if any) was empty when calling
+    `IpProtectionConfigCache::AreAuthTokensAvailable()`.
+  </summary>
+</histogram>
+
 <histogram name="NetworkService.IpProtection.GetAuthTokenResult"
     enum="BooleanSuccess" expires_after="2024-05-12">
   <owner>djmitche@chromium.org</owner>
   <owner>src/chrome/browser/ip_protection/OWNERS</owner>
   <summary>
-    The result of a call to `IpProtectionConfigCache::GetAuthToken()`. If this
-    fails, it is because the cache was empty when a new connection to a proxy
-    was initiated.
+    The result of a call to `IpProtectionConfigCache::GetAuthToken()`, which
+    will not happen unless `IpProtectionConfigCache::AreAuthTokensAvailable()`
+    is true. If this fails, it is because the cache was empty when a new
+    connection to a proxy was initiated.
   </summary>
 </histogram>
 
diff --git a/tools/metrics/histograms/metadata/others/histograms.xml b/tools/metrics/histograms/metadata/others/histograms.xml
index 5edd4b4..c9ce714 100644
--- a/tools/metrics/histograms/metadata/others/histograms.xml
+++ b/tools/metrics/histograms/metadata/others/histograms.xml
@@ -5880,15 +5880,6 @@
   </summary>
 </histogram>
 
-<histogram name="IncompatibleApplicationsPage.NumApplications"
-    units="applications" expires_after="M85">
-  <owner>pmonette@chromium.org</owner>
-  <summary>
-    The number of incompatible applications detected by Chrome at the time the
-    chrome://settings/incompatibleApplications page was opened.
-  </summary>
-</histogram>
-
 <histogram name="InertialSensor.AccelerometerAndroidAvailable"
     enum="BooleanAvailable" expires_after="M95">
   <owner>timvolodine@chromium.org</owner>
@@ -8560,14 +8551,6 @@
   </summary>
 </histogram>
 
-<histogram name="Rlz.SetRlzPingSent" enum="BooleanSuccess" expires_after="M85">
-  <owner>wzang@chromium.org</owner>
-  <summary>
-    Record if updating |should_send_rlz_ping| in RW_VPD is successful within the
-    maximum retry counts.
-  </summary>
-</histogram>
-
 <histogram name="Rollback.OobeRestoreResult" enum="Rollback_OobeRestoreResult"
     expires_after="2023-11-30">
   <owner>mpolzer@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/session/histograms.xml b/tools/metrics/histograms/metadata/session/histograms.xml
index e266ec2..f12be4f 100644
--- a/tools/metrics/histograms/metadata/session/histograms.xml
+++ b/tools/metrics/histograms/metadata/session/histograms.xml
@@ -941,17 +941,6 @@
   </summary>
 </histogram>
 
-<histogram base="true" name="Session.WebStates.NavigationItem" units="KB"
-    expires_after="2022-07-03">
-  <owner>djean@chromium.org</owner>
-  <owner>sdefresne@chromium.org</owner>
-  <summary>
-    Recorded when CRWNavigationItemStorage encodes the data, which happens on
-    page loads, tab changes and app backgrounding. Estimated size, the actual
-    size can be larger than recorded number.
-  </summary>
-</histogram>
-
 <histogram name="Session.WebStates.ReadFromFileTime" units="ms"
     expires_after="2024-09-15">
   <owner>justincohen@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/tab/enums.xml b/tools/metrics/histograms/metadata/tab/enums.xml
index de235dd5..07dab96 100644
--- a/tools/metrics/histograms/metadata/tab/enums.xml
+++ b/tools/metrics/histograms/metadata/tab/enums.xml
@@ -118,6 +118,14 @@
   </int>
 </enum>
 
+<enum name="TabOrganizationTriggerOutcome">
+  <int value="0" label="Accepted">User clicked through the nudge UI.</int>
+  <int value="1" label="Dismissed">User explicitly dismissed the nudge UI.</int>
+  <int value="2" label="Timed out">
+    The timeout elapsed without user interaction.
+  </int>
+</enum>
+
 <enum name="TabRestoreMethod">
   <int value="0" label="TabState"/>
   <int value="1" label="CriticalPersistedTabData"/>
diff --git a/tools/metrics/histograms/metadata/tab/histograms.xml b/tools/metrics/histograms/metadata/tab/histograms.xml
index 76d2c41..2bb78613 100644
--- a/tools/metrics/histograms/metadata/tab/histograms.xml
+++ b/tools/metrics/histograms/metadata/tab/histograms.xml
@@ -513,6 +513,29 @@
   </summary>
 </histogram>
 
+<histogram name="TabGroups.TabOrganization.DidTriggerInPeriod" enum="Boolean"
+    expires_after="2024-11-20">
+  <owner>tbergquist@chromium.org</owner>
+  <owner>dpenning@chromium.org</owner>
+  <owner>chrome-desktop-ui-sea@google.com</owner>
+  <summary>
+    Records whether or not the Tab Organization nudge UI was triggered when each
+    trigger period ends. The nudge UI is limited to trigger at most once per
+    period, but may not trigger at all if it doesn't find a good moment.
+  </summary>
+</histogram>
+
+<histogram name="TabGroups.TabOrganization.TriggerOutcome"
+    enum="TabOrganizationTriggerOutcome" expires_after="2024-11-20">
+  <owner>tbergquist@chromium.org</owner>
+  <owner>dpenning@chromium.org</owner>
+  <owner>chrome-desktop-ui-sea@google.com</owner>
+  <summary>
+    Records user actions (or lack thereof) taken on the proactive nudge UI each
+    time it is triggered to suggest the user organize their tabs.
+  </summary>
+</histogram>
+
 <histogram name="TabGroups.TimeSpentCollapsed2" units="seconds"
     expires_after="2021-09-12">
   <owner>dpenning@chromium.org</owner>
diff --git a/tools/typescript/definitions/feedback_private.d.ts b/tools/typescript/definitions/feedback_private.d.ts
index 0936af8..39793be0 100644
--- a/tools/typescript/definitions/feedback_private.d.ts
+++ b/tools/typescript/definitions/feedback_private.d.ts
@@ -51,6 +51,7 @@
       fromAutofill?: boolean;
       autofillMetadata?: string;
       isOffensiveOrUnsafe?: boolean;
+      aiMetadata?: string;
     }
 
     enum Status {
diff --git a/ui/accessibility/accessibility_features.cc b/ui/accessibility/accessibility_features.cc
index 195a13f38..c80bfa2a 100644
--- a/ui/accessibility/accessibility_features.cc
+++ b/ui/accessibility/accessibility_features.cc
@@ -281,6 +281,13 @@
   return base::FeatureList::IsEnabled(::features::kReadAnything);
 }
 
+BASE_FEATURE(kReadAnythingLocalSidePanel,
+             "ReadAnythingLocalSidePanel",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+bool IsReadAnythingLocalSidePanelEnabled() {
+  return base::FeatureList::IsEnabled(::features::kReadAnythingLocalSidePanel);
+}
+
 BASE_FEATURE(kReadAnythingOmniboxIcon,
              "ReadAnythingOmniboxIcon",
              base::FEATURE_DISABLED_BY_DEFAULT);
diff --git a/ui/accessibility/accessibility_features.h b/ui/accessibility/accessibility_features.h
index 31b9911..f3d64fa0 100644
--- a/ui/accessibility/accessibility_features.h
+++ b/ui/accessibility/accessibility_features.h
@@ -216,6 +216,11 @@
 AX_BASE_EXPORT BASE_DECLARE_FEATURE(kReadAnything);
 AX_BASE_EXPORT bool IsReadAnythingEnabled();
 
+// Make the Read Anything Side Panel local (don't persist when opening a new
+// tab)
+AX_BASE_EXPORT BASE_DECLARE_FEATURE(kReadAnythingLocalSidePanel);
+AX_BASE_EXPORT bool IsReadAnythingLocalSidePanelEnabled();
+
 // Show a reading mode icon in the omnibox.
 AX_BASE_EXPORT BASE_DECLARE_FEATURE(kReadAnythingOmniboxIcon);
 AX_BASE_EXPORT bool IsReadAnythingOmniboxIconEnabled();
diff --git a/ui/base/ime/win/imm32_manager.cc b/ui/base/ime/win/imm32_manager.cc
index a7fd0f8..af0e4318 100644
--- a/ui/base/ime/win/imm32_manager.cc
+++ b/ui/base/ime/win/imm32_manager.cc
@@ -484,8 +484,4 @@
   *new_conversion_mode = initial_conversion_mode;
 }
 
-bool IMM32Manager::IsImm32ImeActive() {
-  return ::ImmGetIMEFileName(::GetKeyboardLayout(0), nullptr, 0) > 0;
-}
-
 }  // namespace ui
diff --git a/ui/base/ime/win/imm32_manager.h b/ui/base/ime/win/imm32_manager.h
index 7275ef8..e8271a9 100644
--- a/ui/base/ime/win/imm32_manager.h
+++ b/ui/base/ime/win/imm32_manager.h
@@ -246,9 +246,6 @@
                                          BOOL* open,
                                          DWORD* new_conversion_mode);
 
-  // Return true if current active IME is IMM32-bassed.
-  bool IsImm32ImeActive();
-
  protected:
   // Retrieves the composition information.
   void GetCompositionInfo(HIMC imm_context, LPARAM lparam,
diff --git a/ui/display/test/display_manager_test_api.cc b/ui/display/test/display_manager_test_api.cc
index ec7387a..63e85ff 100644
--- a/ui/display/test/display_manager_test_api.cc
+++ b/ui/display/test/display_manager_test_api.cc
@@ -15,6 +15,7 @@
 #include "ui/display/manager/display_manager.h"
 #include "ui/display/manager/managed_display_info.h"
 #include "ui/display/manager/util/display_manager_test_util.h"
+#include "ui/display/manager/util/display_manager_util.h"
 #include "ui/display/screen.h"
 #include "ui/display/util/display_util.h"
 
@@ -25,9 +26,9 @@
 // Indicates the default maximum of displays that chrome device can support.
 constexpr size_t kDefaultMaxSupportDisplayTest = 10;
 
-DisplayInfoList CreateDisplayInfoListFromString(const std::string specs,
-                                                DisplayManager* display_manager,
-                                                bool generate_new_ids) {
+DisplayInfoList CreateDisplayInfoListFromString(
+    const std::string specs,
+    DisplayManager* display_manager) {
   DisplayInfoList display_info_list;
   std::vector<std::string> parts = base::SplitString(
       specs, ",", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
@@ -39,9 +40,7 @@
 
   for (std::vector<std::string>::const_iterator iter = parts.begin();
        iter != parts.end(); ++iter, ++index) {
-    const int64_t id = (index < list.size() && !generate_new_ids)
-                           ? list[index].id()
-                           : kInvalidDisplayId;
+    int64_t id = (index < list.size()) ? list[index].id() : kInvalidDisplayId;
     display_info_list.push_back(
         ManagedDisplayInfo::CreateFromSpecWithID(*iter, id));
   }
@@ -86,10 +85,9 @@
 }
 
 void DisplayManagerTestApi::UpdateDisplay(const std::string& display_specs,
-                                          bool from_native_platform,
-                                          bool generate_new_ids) {
-  DisplayInfoList display_info_list = CreateDisplayInfoListFromString(
-      display_specs, display_manager_, generate_new_ids);
+                                          bool from_native_platform) {
+  DisplayInfoList display_info_list =
+      CreateDisplayInfoListFromString(display_specs, display_manager_);
   UpdateDisplayWithDisplayInfoList(display_info_list, from_native_platform);
 }
 
diff --git a/ui/display/test/display_manager_test_api.h b/ui/display/test/display_manager_test_api.h
index f6d402b..eeeea6824 100644
--- a/ui/display/test/display_manager_test_api.h
+++ b/ui/display/test/display_manager_test_api.h
@@ -15,7 +15,6 @@
 #include "ui/display/display.h"
 #include "ui/display/display_export.h"
 #include "ui/display/display_layout.h"
-#include "ui/display/manager/util/display_manager_util.h"
 #include "ui/display/types/display_constants.h"
 
 namespace gfx {
@@ -49,11 +48,9 @@
   // native information, such as display zoom, will be ignored and instead
   // copied from the current configuration.  Note: To add rounded-corners
   // properly upon startup, set it via specifying the command line switch
-  // `ash-host-window-bounds`. If `generate_new_ids` is true displays in
-  // `display_spec` will be created with new display ids.
+  // `ash-host-window-bounds`.
   void UpdateDisplay(const std::string& display_specs,
-                     bool from_native_platform = false,
-                     bool generate_new_ids = false);
+                     bool from_native_platform = false);
 
   void UpdateDisplayWithDisplayInfoList(
       const std::vector<ManagedDisplayInfo>& display_info_list,
diff --git a/ui/file_manager/file_manager/common/js/storage.js b/ui/file_manager/file_manager/common/js/storage.js
deleted file mode 100644
index a9fd87c..0000000
--- a/ui/file_manager/file_manager/common/js/storage.js
+++ /dev/null
@@ -1,296 +0,0 @@
-// Copyright 2020 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// namespace
-export const storage = {};
-
-/**
- * Class used to emit window.localStorage change events to event listeners.
- * This class does 3 things:
- *
- * 1. Holds the onChanged event listeners for the current window.
- * 2. Sends broadcast event to all windows.
- * 3. Listens to broadcast events and propagates to the listeners in
- *    the current window.
- *
- * NOTE: This doesn't support the `oldValue` because it's simpler and the
- * current clients of `onChanged` don't need it.
- */
-class StorageChangeTracker {
-  // @ts-ignore: error TS7006: Parameter 'storageNamespace' implicitly has an
-  // 'any' type.
-  constructor(storageNamespace) {
-    /**
-     * Storage onChanged event listeners for the current window.
-     * @private @type {!Array<OnChangedListener>}
-     * */
-    // @ts-ignore: error TS7008: Member 'listeners_' implicitly has an 'any[]'
-    // type.
-    this.listeners_ = [];
-
-    /**
-     * Storage namespace argument added when calling listeners.
-     * @private @type {string}
-     */
-    this.storageNamespace_ = storageNamespace;
-
-    /**
-     * Event to send local storage changes to all window listeners.
-     */
-    window.addEventListener('storage', this.onStorageEvent_.bind(this));
-  }
-
-  /**
-   * Resets for testing: removes all listeners.
-   */
-  resetForTesting() {
-    this.listeners_ = [];
-  }
-
-  /**
-   * Adds an onChanged event listener for the current window.
-   * @param {function(!Object<string, !ValueChanged>, string):void} callback
-   */
-  addListener(callback) {
-    this.listeners_.push(callback);
-  }
-
-  /**
-   * Notifies listeners_ of key value changes.
-   * @param {!Object<string, *>} changedValues changed.
-   */
-  keysChanged(changedValues) {
-    /** @type {!Object<string, !ValueChanged>} */
-    const changedKeys = {};
-
-    for (const [k, v] of Object.entries(changedValues)) {
-      // `oldValue` isn't necessary for the current use case.
-      const key = /** @type {string} */ (k);
-      changedKeys[key] = {newValue: v};
-    }
-
-    this.notifyLocally_(changedKeys);
-  }
-
-  /**
-   * Process localStorage `storage` event and notify listeners_.
-   * @private
-   */
-  // @ts-ignore: error TS7006: Parameter 'event' implicitly has an 'any' type.
-  onStorageEvent_(event) {
-    if (!event.key) {
-      return;
-    }
-
-    const key = /** @type {string} */ (event.key);
-    const newValue = /** @type {string} */ (event.newValue);
-    const changedKeys = {};
-
-    try {
-      // @ts-ignore: error TS7053: Element implicitly has an 'any' type because
-      // expression of type 'string' can't be used to index type '{}'.
-      changedKeys[key] = {newValue: JSON.parse(newValue)};
-    } catch (error) {
-      console.warn(
-          `Failed to JSON parse localStorage value from key: "${key}" ` +
-              `returning the raw value.`,
-          error);
-      // @ts-ignore: error TS7053: Element implicitly has an 'any' type because
-      // expression of type 'string' can't be used to index type '{}'.
-      changedKeys[key] = {newValue};
-    }
-
-    // @ts-ignore: error TS2345: Argument of type '{}' is not assignable to
-    // parameter of type '{ [x: string]: ValueChanged; }'.
-    this.notifyLocally_(changedKeys);
-  }
-
-  /**
-   * Notifies local (current window) listeners_ of key value changes.
-   * @param {!Object<string, ValueChanged>} keys
-   * @private
-   */
-  notifyLocally_(keys) {
-    for (const listener of this.listeners_) {
-      try {
-        listener(keys, this.storageNamespace_);
-      } catch (error) {
-        console.error(`Error calling storage.onChanged listener: ${error}`);
-      }
-    }
-  }
-}
-
-/**
- * StorageAreaImpl using window.localStorage as the storage area.
- */
-class StorageAreaImpl {
-  /**
-   * @param {string} type
-   */
-  constructor(type) {
-    /** @private @type {!StorageChangeTracker} */
-    this.storageChangeTracker_ = new StorageChangeTracker(type);
-  }
-
-  /**
-   * Gets values of |keys| and return them in the callback.
-   * @param {string|!Array<string>} keys
-   * @param {!function(!Object):void} callback
-   */
-  get(keys, callback) {
-    const keyList = Array.isArray(keys) ? keys : [keys];
-    const result = {};
-    for (const key of keyList) {
-      // @ts-ignore: error TS7053: Element implicitly has an 'any' type because
-      // expression of type 'string' can't be used to index type '{}'.
-      result[key] = this.getValue_(key);
-    }
-    callback(result);
-  }
-
-  /**
-   * Gets the value of |key| from local storage.
-   * @param {string} key
-   * @private
-   */
-  getValue_(key) {
-    const value = /** @type {string} */ (window.localStorage.getItem(key));
-    try {
-      return JSON.parse(value);
-    } catch (error) {
-      console.warn(
-          `Failed to JSON parse localStorage value from key: "${key}" ` +
-              `returning the raw value.`,
-          error);
-      return value;
-    }
-  }
-
-  /**
-   * Async version of this.get() storage method.
-   * @param {string|!Array<string>} keys
-   * @returns {!Promise<!Object<string, *>>}
-   */
-  async getAsync(keys) {
-    // @ts-ignore: error TS6133: 'reject' is declared but its value is never
-    // read.
-    return new Promise((resolve, reject) => {
-      this.get(keys, (values) => {
-        resolve(values);
-      });
-    });
-  }
-
-  /**
-   * Stores items in local storage.
-   * @param {!Object<string, *>} items The items to store.
-   * @param {?function()=} opt_callback Optional callback to be called when
-   *   the items have been stored.
-   */
-  set(items, opt_callback) {
-    for (const key in items) {
-      const value = JSON.stringify(items[key]);
-      window.localStorage.setItem(key, value);
-    }
-    this.notifyChange_(Object.keys(items));
-    if (opt_callback) {
-      opt_callback();
-    }
-  }
-
-  /**
-   * Async version of this.set() storage method.
-   * @param {!Object<string, *>} items The items to store.
-   * @returns {!Promise<void>}
-   */
-  async setAsync(items) {
-    // @ts-ignore: error TS6133: 'reject' is declared but its value is never
-    // read.
-    return new Promise((resolve, reject) => {
-      this.set(items, () => {
-        resolve();
-      });
-    });
-  }
-
-  /**
-   * Removes the given |keys| from local storage.
-   * @param {string|!Array<string>} keys
-   */
-  remove(keys) {
-    const keyList = Array.isArray(keys) ? keys : [keys];
-    for (const key of keyList) {
-      window.localStorage.removeItem(key);
-    }
-    this.notifyChange_(keyList);
-  }
-
-  /**
-   * Clears local storage.
-   */
-  clear() {
-    window.localStorage.clear();
-    this.notifyChange_([]);
-  }
-
-  /**
-   * Notifies key changes to storage change tracker listeners.
-   * @param {!Array<string>} keys
-   * @private
-   */
-  notifyChange_(keys) {
-    const values = {};
-    for (const k of keys) {
-      // @ts-ignore: error TS7053: Element implicitly has an 'any' type because
-      // expression of type 'string' can't be used to index type '{}'.
-      values[k] = this.getValue_(k);
-    }
-
-    this.getStorageChangeTracker_().keysChanged(values);
-  }
-
-  /**
-   * Gets storage change tracker.
-   * @returns {!StorageChangeTracker}
-   * @private
-   */
-  getStorageChangeTracker_() {
-    return this.storageChangeTracker_;
-  }
-}
-
-/**
- * @type {!StorageAreaImpl}
- */
-storage.local = new StorageAreaImpl('local');
-
-/**
- * @typedef {function(!Object<string, !ValueChanged>, string):void}
- */
-// @ts-ignore: error TS7005: Variable 'OnChangedListener' implicitly has an
-// 'any' type.
-export let OnChangedListener;
-
-/**
- * @typedef {{
- *    newValue: *,
- * }}
- */
-// @ts-ignore: error TS7005: Variable 'ValueChanged' implicitly has an 'any'
-// type.
-export let ValueChanged;
-
-/**
- * NOTE: Here we only expose StorageChangeTracker APIs addListener() and
- * resetForTesting().
- *
- * @type {{
- *   addListener: function(OnChangedListener):void,
- *   resetForTesting: function():void,
- * }}
- */
-// @ts-ignore: error TS2341: Property 'getStorageChangeTracker_' is private and
-// only accessible within class 'StorageAreaImpl'.
-storage.onChanged = storage.local.getStorageChangeTracker_();
diff --git a/ui/file_manager/file_manager/common/js/storage.ts b/ui/file_manager/file_manager/common/js/storage.ts
new file mode 100644
index 0000000..65ef2f9
--- /dev/null
+++ b/ui/file_manager/file_manager/common/js/storage.ts
@@ -0,0 +1,185 @@
+// Copyright 2020 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+export interface ChangedValue {
+  newValue: any;
+}
+
+export type ChangedValues = Record<string, ChangedValue>;
+
+export type OnChangedListener =
+    (changedValues: ChangedValues, storageNamespace: string) => void;
+
+/**
+ * Class used to emit window.localStorage change events to event listeners.
+ * This class does 3 things:
+ *
+ * 1. Holds the onChanged event listeners for the current window.
+ * 2. Sends broadcast event to all windows.
+ * 3. Listens to broadcast events and propagates to the listeners in
+ *    the current window.
+ *
+ * NOTE: This doesn't support the `oldValue` because it's simpler and the
+ * current clients of `onChanged` don't need it.
+ */
+class StorageChangeTracker {
+  /** Storage onChanged event listeners for the current window. */
+  private listeners_: OnChangedListener[] = [];
+
+  /**
+   * @param storageNamespace_ Storage namespace argument added when calling
+   *     listeners.
+   */
+  constructor(private storageNamespace_: string) {
+    /** Event to send local storage changes to all window listeners. */
+    window.addEventListener('storage', this.onStorageEvent_.bind(this));
+  }
+
+  /** Resets for testing: removes all listeners. */
+  resetForTesting() {
+    this.listeners_ = [];
+  }
+
+  /** Adds an onChanged event listener for the current window. */
+  addListener(callback: OnChangedListener) {
+    this.listeners_.push(callback);
+  }
+
+  /** Notifies listeners of key value changes. */
+  keysChanged(changedValues: Record<string, any>) {
+    const changedKeys: ChangedValues = {};
+
+    for (const [k, v] of Object.entries(changedValues)) {
+      // `oldValue` isn't necessary for the current use case.
+      changedKeys[k] = {newValue: v};
+    }
+
+    this.notifyLocally_(changedKeys);
+  }
+
+  /** Processes storage event and notifies listeners. */
+  private onStorageEvent_(event: StorageEvent) {
+    const {key, newValue} = event;
+    if (key == null || newValue == null) {
+      return;
+    }
+
+    const changedKeys: ChangedValues = {};
+
+    try {
+      changedKeys[key] = {newValue: JSON.parse(newValue)};
+    } catch (error) {
+      console.warn(
+          `Cannot parse local storage value from key '${key}' as JSON`, error);
+      changedKeys[key] = {newValue};
+    }
+
+    this.notifyLocally_(changedKeys);
+  }
+
+  /** Notifies local (current window) listeners of key value changes. */
+  private notifyLocally_(keys: ChangedValues) {
+    for (const listener of this.listeners_) {
+      try {
+        listener(keys, this.storageNamespace_);
+      } catch (error) {
+        console.error('Error calling storage.onChanged listener', error);
+      }
+    }
+  }
+}
+
+/**
+ * StorageAreaImpl using window.localStorage as the storage area.
+ */
+class StorageAreaImpl {
+  readonly storageChangeTracker: StorageChangeTracker;
+
+  constructor(type: string) {
+    this.storageChangeTracker = new StorageChangeTracker(type);
+  }
+
+  /** Gets values of `keys` and returns them in the callback. */
+  get(keys: string|string[], callback: (arg0: Record<string, any>) => void) {
+    const keyList = Array.isArray(keys) ? keys : [keys];
+    const result: Record<string, any> = {};
+    for (const key of keyList) {
+      result[key as string] = this.getValue_(key);
+    }
+    callback(result);
+  }
+
+  /** Gets the value of `key` from local storage. */
+  private getValue_(key: string): any {
+    const value = window.localStorage.getItem(key) as string;
+    try {
+      return JSON.parse(value);
+    } catch (error) {
+      console.warn(
+          `Failed to JSON parse localStorage value from key: "${key}" ` +
+              `returning the raw value.`,
+          error);
+      return value;
+    }
+  }
+
+  /** Async version of `this.get()`. */
+  async getAsync(keys: string|string[]): Promise<Record<string, any>> {
+    return new Promise(resolve => this.get(keys, resolve));
+  }
+
+  /**
+   * Stores items in local storage.
+   * @param items The items to store.
+   * @param callback Callback to be called when the items have been stored.
+   */
+  set(items: Record<string, any>, callback?: () => void) {
+    for (const key in items) {
+      const value = JSON.stringify(items[key]);
+      window.localStorage.setItem(key, value);
+    }
+    this.notifyChange_(Object.keys(items));
+    callback?.();
+  }
+
+  /**
+   * Async version of `this.set()`.
+   * @param items The items to store.
+   */
+  async setAsync(items: Record<string, any>): Promise<void> {
+    return new Promise(resolve => this.set(items, resolve));
+  }
+
+  /** Removes the given `keys` from local storage. */
+  remove(keys: string|string[]) {
+    const keyList = Array.isArray(keys) ? keys : [keys];
+    for (const key of keyList) {
+      window.localStorage.removeItem(key);
+    }
+    this.notifyChange_(keyList);
+  }
+
+  /** Clears local storage. */
+  clear() {
+    window.localStorage.clear();
+    this.notifyChange_([]);
+  }
+
+  /** Notifies key changes to storage change tracker listeners. */
+  private notifyChange_(keys: string[]) {
+    const values: Record<string, any> = {};
+    for (const k of keys) {
+      values[k] = this.getValue_(k);
+    }
+
+    this.storageChangeTracker.keysChanged(values);
+  }
+}
+
+
+
+export namespace storage {
+  export const local = new StorageAreaImpl('local');
+  export const onChanged: StorageChangeTracker = local.storageChangeTracker;
+}
diff --git a/ui/file_manager/file_manager/common/js/storage_unittest.js b/ui/file_manager/file_manager/common/js/storage_unittest.js
deleted file mode 100644
index 3ffa3af..0000000
--- a/ui/file_manager/file_manager/common/js/storage_unittest.js
+++ /dev/null
@@ -1,75 +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.
-
-import {assertDeepEquals} from 'chrome://webui-test/chromeos/chai_assert.js';
-
-import {storage} from './storage.js';
-import {waitUntil} from './test_error_reporting.js';
-
-/**
- * Used to store the test listener calls.
- */
-let nsCalled = {};
-let valuesChanged = {};
-
-// @ts-ignore: error TS7006: Parameter 'namespace' implicitly has an 'any' type.
-function listener(changedValues, namespace) {
-  // @ts-ignore: error TS7053: Element implicitly has an 'any' type because
-  // expression of type 'any' can't be used to index type '{}'.
-  nsCalled[namespace] = true;
-  // @ts-ignore: error TS7053: Element implicitly has an 'any' type because
-  // expression of type 'any' can't be used to index type '{}'.
-  valuesChanged[namespace] = changedValues;
-}
-
-export function setUp() {
-  storage.onChanged.resetForTesting();
-
-  // Add the test listeners to default onChanged which is a
-  // StorageChangeTracker instance.
-  storage.onChanged.addListener(listener);
-
-  nsCalled = {};
-  valuesChanged = {};
-}
-
-/**
- * Tests that changing the storage.local values is propagated to the
- * listeners of onChanged.
- */
-// @ts-ignore: error TS7006: Parameter 'done' implicitly has an 'any' type.
-export async function testPropagateLocally(done) {
-  // Check: That the listener receives the update.
-  await storage.local.setAsync({'local key': 'local value'});
-  // @ts-ignore: error TS7053: Element implicitly has an 'any' type because
-  // expression of type '"local"' can't be used to index type '{}'.
-  await waitUntil(() => nsCalled['local']);
-  assertDeepEquals(
-      // @ts-ignore: error TS7053: Element implicitly has an 'any' type because
-      // expression of type '"local"' can't be used to index type '{}'.
-      valuesChanged['local'], {'local key': {newValue: 'local value'}});
-
-  done();
-}
-
-/**
- * Tests the value propagates in its original type, window.localStorage always
- * returns in string, we use JSON.parse() to convert back to original type.
- */
-// @ts-ignore: error TS7006: Parameter 'done' implicitly has an 'any' type.
-export async function testNumberBool(done) {
-  // Check: That the listener from `tracker` receives the update.
-  await storage.local.setAsync({'number': 33, 'boolean': true});
-  // @ts-ignore: error TS7053: Element implicitly has an 'any' type because
-  // expression of type '"local"' can't be used to index type '{}'.
-  await waitUntil(() => nsCalled['local']);
-  // @ts-ignore: error TS7053: Element implicitly has an 'any' type because
-  // expression of type '"local"' can't be used to index type '{}'.
-  assertDeepEquals(valuesChanged['local'], {
-    'number': {newValue: 33},
-    'boolean': {newValue: true},
-  });
-
-  done();
-}
diff --git a/ui/file_manager/file_manager/common/js/storage_unittest.ts b/ui/file_manager/file_manager/common/js/storage_unittest.ts
new file mode 100644
index 0000000..f491f70
--- /dev/null
+++ b/ui/file_manager/file_manager/common/js/storage_unittest.ts
@@ -0,0 +1,54 @@
+// 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.
+
+import {assertDeepEquals} from 'chrome://webui-test/chromeos/chai_assert.js';
+
+import {ChangedValues, storage} from './storage.js';
+import {waitUntil} from './test_error_reporting.js';
+
+/** Used to store the test listener calls. */
+let nsCalled: Record<string, boolean> = {};
+let valuesChanged: Record<string, ChangedValues> = {};
+
+function listener(changedValues: ChangedValues, storageNamespace: string) {
+  nsCalled[storageNamespace] = true;
+  valuesChanged[storageNamespace] = changedValues;
+}
+
+export function setUp() {
+  storage.onChanged.resetForTesting();
+
+  // Add the test listeners to default onChanged which is a StorageChangeTracker
+  // instance.
+  storage.onChanged.addListener(listener);
+
+  nsCalled = {};
+  valuesChanged = {};
+}
+
+/**
+ * Tests that changing the storage.local values is propagated to the listeners
+ * of onChanged.
+ */
+export async function testPropagateLocally() {
+  // Check: That the listener receives the update.
+  await storage.local.setAsync({'local key': 'local value'});
+  await waitUntil(() => !!nsCalled['local']);
+  assertDeepEquals(
+      valuesChanged['local'], {'local key': {newValue: 'local value'}});
+}
+
+/**
+ * Tests the value propagates in its original type, window.localStorage always
+ * returns in string, we use JSON.parse() to convert back to original type.
+ */
+export async function testNumberBool() {
+  // Check: That the listener from `tracker` receives the update.
+  await storage.local.setAsync({'number': 33, 'boolean': true});
+  await waitUntil(() => !!nsCalled['local']);
+  assertDeepEquals(valuesChanged['local'], {
+    'number': {newValue: 33},
+    'boolean': {newValue: true},
+  });
+}
diff --git a/ui/file_manager/file_manager/foreground/js/file_manager.js b/ui/file_manager/file_manager/foreground/js/file_manager.js
index 2821b5a..ffaa64e9 100644
--- a/ui/file_manager/file_manager/foreground/js/file_manager.js
+++ b/ui/file_manager/file_manager/foreground/js/file_manager.js
@@ -900,11 +900,6 @@
         new CommandHandler(this, assert(this.selectionHandler_));
 
     // TODO(hirono): Move the following block to the UI part.
-    // @ts-ignore: error TS2488: Type 'NodeListOf<Element>' must have a
-    // '[Symbol.iterator]()' method that returns an iterator.
-    for (const button of this.dialogDom_.querySelectorAll('button[command]')) {
-      CommandButton.decorate(button);
-    }
     // Hook up the cr-button commands.
     // @ts-ignore: error TS2488: Type 'NodeListOf<Element>' must have a
     // '[Symbol.iterator]()' method that returns an iterator.
diff --git a/ui/file_manager/file_manager/foreground/js/file_manager_commands_unittest.js b/ui/file_manager/file_manager/foreground/js/file_manager_commands_unittest.js
index bb6072b..3a126600 100644
--- a/ui/file_manager/file_manager/foreground/js/file_manager_commands_unittest.js
+++ b/ui/file_manager/file_manager/foreground/js/file_manager_commands_unittest.js
@@ -605,6 +605,7 @@
     const event = {
       canExecute: true,
       target: {
+        classList: {contains: () => false},
         parentElement: {
           contextElement: null,
         },
diff --git a/ui/file_manager/file_manager/foreground/js/task_history.js b/ui/file_manager/file_manager/foreground/js/task_history.js
index 9907db9..3f0c563 100644
--- a/ui/file_manager/file_manager/foreground/js/task_history.js
+++ b/ui/file_manager/file_manager/foreground/js/task_history.js
@@ -5,7 +5,7 @@
 import {dispatchSimpleEvent} from 'chrome://resources/ash/common/cr_deprecated.js';
 import {NativeEventTarget as EventTarget} from 'chrome://resources/ash/common/event_target.js';
 
-import {storage, ValueChanged} from '../../common/js/storage.js';
+import {storage} from '../../common/js/storage.js';
 import {makeTaskID} from '../../common/js/util.js';
 
 /**
@@ -80,7 +80,8 @@
 
   /**
    * Handles local storage change event to update the current history.
-   * @param {!Object<string, !ValueChanged>} changes
+   * @param {!Object<string,
+   *     !import("../../common/js/storage.js").ChangedValue>} changes
    * @param {string} areaName
    * @private
    */
diff --git a/ui/file_manager/file_manager/foreground/js/ui/commandbutton.js b/ui/file_manager/file_manager/foreground/js/ui/commandbutton.js
index 3989d2e4..f0d7031 100644
--- a/ui/file_manager/file_manager/foreground/js/ui/commandbutton.js
+++ b/ui/file_manager/file_manager/foreground/js/ui/commandbutton.js
@@ -7,54 +7,35 @@
  */
 
 import {assert} from 'chrome://resources/ash/common/assert.js';
-// @ts-ignore: error TS6192: All imports in import declaration are unused.
-import {getPropertyDescriptor, PropertyKind} from 'chrome://resources/ash/common/cr_deprecated.js';
-import {decorate} from '../../../common/js/ui.js';
+import {CrButtonElement} from 'chrome://resources/cr_elements/cr_button/cr_button.js';
+
+import {decorate} from '../../../common/js/cr_ui.js';
+import {decorate as deprecatedDecorate} from '../../../common/js/ui.js';
+
 import {Command} from './command.js';
 
 /**
  * Creates a new button element.
- * @extends {HTMLButtonElement}
  */
-export class CommandButton {
+export class CommandButton extends CrButtonElement {
   constructor() {
+    super();
+
     /**
      * Associated command.
-     * @private @type {Command}
+     * @private @type {?Command}
      */
-    // @ts-ignore: error TS2322: Type 'null' is not assignable to type
-    // 'Command'.
     this.command_ = null;
   }
 
   /**
    * Decorates the given element.
-   * @param {!Element} element Item to be decorated.
+   * @param {!HTMLElement} element Item to be decorated.
    * @return {!CommandButton} Decorated item.
    */
   static decorate(element) {
-    // Add the CommandButton methods to the element we're
-    // decorating, leaving it's prototype chain intact.
-    Object.getOwnPropertyNames(CommandButton.prototype).forEach(name => {
-      if (name !== 'constructor') {
-        // @ts-ignore: error TS7053: Element implicitly has an 'any' type
-        // because expression of type 'string' can't be used to index type
-        // 'CommandButton'.
-        element[name] = CommandButton.prototype[name];
-      }
-    });
-    // @ts-ignore: error TS2352: Conversion of type 'Element' to type
-    // 'CommandButton' may be a mistake because neither type sufficiently
-    // overlaps with the other. If this was intentional, convert the expression
-    // to 'unknown' first.
-    element = /** @type {!CommandButton} */ (element);
-    // @ts-ignore: error TS2339: Property 'decorate' does not exist on type
-    // 'Element'.
-    element.decorate();
-    // @ts-ignore: error TS2740: Type 'Element' is missing the following
-    // properties from type 'CommandButton': command_, decorate, getCommand,
-    // setCommand, and 7 more.
-    return element;
+    decorate(element, CommandButton);
+    return /** @type {!CommandButton} */ (element);
   }
 
   /**
@@ -62,24 +43,18 @@
    */
   decorate() {
     let commandId;
-    // @ts-ignore: error TS2339: Property 'getAttribute' does not exist on type
-    // 'CommandButton'.
     if ((commandId = this.getAttribute('command'))) {
       this.setCommand(commandId);
     }
 
-    // @ts-ignore: error TS2339: Property 'addEventListener' does not exist on
-    // type 'CommandButton'.
     this.addEventListener('click', this.handleClick_.bind(this));
   }
 
   /**
    * Returns associated command.
-   * @return {Command} associated command.
+   * @return {?Command} associated command.
    */
   getCommand() {
-    // @ts-ignore: error TS2322: Type 'Command | null' is not assignable to type
-    // 'Command'.
     return this.command_;
   }
 
@@ -116,17 +91,13 @@
     if (typeof command == 'string') {
       assert(command[0] == '#');
       command = /** @type {!Command} */
-          // @ts-ignore: error TS2339: Property 'ownerDocument' does not exist
-          // on type 'CommandButton'.
           (this.ownerDocument.body.querySelector(command));
-      decorate(command, Command);
+      deprecatedDecorate(command, Command);
     }
 
     this.command_ = command;
     if (command) {
       if (command.id) {
-        // @ts-ignore: error TS2339: Property 'setAttribute' does not exist on
-        // type 'CommandButton'.
         this.setAttribute('command', '#' + command.id);
       }
 
@@ -179,8 +150,6 @@
     // Updating the label in customized button content should be done
     // automatically by specifying an element which should be synced with the
     // command label using class name or polymer's template binding.
-    // @ts-ignore: error TS2339: Property 'firstElementChild' does not exist on
-    // type 'CommandButton'.
     if (!this.firstElementChild) {
       this.textContent = label;
     }
@@ -188,14 +157,11 @@
 
   /**
    * Handles click event and dispatches associated command.
-   * @param {Event} e The mouseup event object.
+   * @param {Event} _e The mouseup event object.
    * @private
    */
-  // @ts-ignore: error TS6133: 'e' is declared but its value is never read.
-  handleClick_(e) {
+  handleClick_(_e) {
     if (!this.disabled && this.command_) {
-      // @ts-ignore: error TS2345: Argument of type 'this' is not assignable to
-      // parameter of type 'HTMLElement | undefined'.
       this.command_.execute(this);
     }
   }
@@ -221,17 +187,3 @@
     }
   }
 }
-
-/**
- * Whether the button is disabled or not.
- * @type {boolean}
- */
-CommandButton.prototype.disabled;
-
-/**
- * Whether the button is hidden or not.
- * @type {boolean}
- */
-CommandButton.prototype.hidden;
-
-CommandButton.prototype.__proto__ = HTMLButtonElement.prototype;
diff --git a/ui/file_manager/file_manager/foreground/js/ui/files_menu.js b/ui/file_manager/file_manager/foreground/js/ui/files_menu.js
index 8e4ef07..e4f8c35 100644
--- a/ui/file_manager/file_manager/foreground/js/ui/files_menu.js
+++ b/ui/file_manager/file_manager/foreground/js/ui/files_menu.js
@@ -3,6 +3,9 @@
 // found in the LICENSE file.
 
 import {assertInstanceof} from 'chrome://resources/ash/common/assert.js';
+
+import {decorate} from '../../../common/js/cr_ui.js';
+
 import {Menu} from './menu.js';
 import {MenuItem} from './menu_item.js';
 
@@ -42,28 +45,18 @@
 
   /**
    * Decorates the element.
-   * @param {!Element} element Element to be decorated.
+   * @param {!HTMLElement} element Element to be decorated.
    * @return {!FilesMenuItem} Decorated element.
    * @override
    */
   static decorate(element) {
-    // @ts-ignore: error TS2339: Property '__proto__' does not exist on type
-    // 'Element'.
-    element.__proto__ = FilesMenuItem.prototype;
-    element = /** @type {!FilesMenuItem} */ (element);
-    // @ts-ignore: error TS2339: Property 'decorate' does not exist on type
-    // 'Element'.
-    element.decorate();
-    // @ts-ignore: error TS2740: Type 'Element' is missing the following
-    // properties from type 'FilesMenuItem': animating_, hidden_, label_,
-    // iconStart_, and 140 more.
-    return element;
+    decorate(element, FilesMenuItem);
+    return /** @type {!FilesMenuItem} */ (element);
   }
+
   /**
    * @override
    */
-  // @ts-ignore: error TS4122: This member cannot have a JSDoc comment with an
-  // '@override' tag because it is not declared in the base class 'MenuItem'.
   decorate() {
     this.animating_ = false;
 
@@ -163,15 +156,9 @@
    * @private
    */
   setMenuAsAnimating_(menu, value) {
-    // @ts-ignore: error TS2339: Property 'classList' does not exist on type
-    // 'Menu'.
     menu.classList.toggle('animating', value);
 
-    // @ts-ignore: error TS2339: Property 'menuItems' does not exist on type
-    // 'Menu'.
     for (let i = 0; i < menu.menuItems.length; i++) {
-      // @ts-ignore: error TS2339: Property 'menuItems' does not exist on type
-      // 'Menu'.
       const menuItem = menu.menuItems[i];
       if (menuItem instanceof FilesMenuItem) {
         menuItem.setAnimating_(value);
@@ -179,8 +166,6 @@
     }
 
     if (!value) {
-      // @ts-ignore: error TS2339: Property 'classList' does not exist on type
-      // 'Menu'.
       menu.classList.remove('toolbar-menu');
     }
   }
@@ -206,39 +191,32 @@
 
   /**
    * @return {boolean}
+   * @override
    */
-  // @ts-ignore: error TS4119: This member must have a JSDoc comment with an
-  // '@override' tag because it overrides a member in the base class 'MenuItem'.
   get hidden() {
     if (this.hidden_ !== undefined) {
       return this.hidden_;
     }
 
-    // @ts-ignore: error TS2684: The 'this' context of type '(() => any) |
-    // undefined' is not assignable to method's 'this' of type '(this: this) =>
-    // any'.
+
     return Object.getOwnPropertyDescriptor(HTMLElement.prototype, 'hidden')
-        .get.call(this);
+        ?.get?.call(this);
   }
 
   /**
    * Overrides hidden property to block the change of hidden property while
    * menu is animating.
    * @param {boolean} value
+   * @override
    */
-  // @ts-ignore: error TS4119: This member must have a JSDoc comment with an
-  // '@override' tag because it overrides a member in the base class 'MenuItem'.
   set hidden(value) {
     if (this.animating_) {
       this.hidden_ = value;
       return;
     }
 
-    // @ts-ignore: error TS2684: The 'this' context of type '((v: any) => void)
-    // | undefined' is not assignable to method's 'this' of type '(this: this,
-    // args_0: boolean) => void'.
     Object.getOwnPropertyDescriptor(HTMLElement.prototype, 'hidden')
-        .set.call(this, value);
+        ?.set?.call(this, value);
   }
 
   /**
diff --git a/ui/file_manager/file_manager/foreground/js/ui/multi_menu_button.js b/ui/file_manager/file_manager/foreground/js/ui/multi_menu_button.js
index 2d23b0ec..9c9f690 100644
--- a/ui/file_manager/file_manager/foreground/js/ui/multi_menu_button.js
+++ b/ui/file_manager/file_manager/foreground/js/ui/multi_menu_button.js
@@ -3,18 +3,22 @@
 // found in the LICENSE file.
 
 import {assert} from 'chrome://resources/ash/common/assert.js';
-import {decorate} from '../../../common/js/ui.js';
+import {EventTracker} from 'chrome://resources/ash/common/event_tracker.js';
+import {CrButtonElement} from 'chrome://resources/cr_elements/cr_button/cr_button.js';
+
+import {decorate} from '../../../common/js/cr_ui.js';
+import {decorate as deprecatedDecorate} from '../../../common/js/ui.js';
+
 import {Menu} from './menu.js';
 import {HideType} from './menu_button.js';
 import {MenuItem} from './menu_item.js';
-import {AnchorType, positionPopupAroundElement} from './position_util.js';
-import {EventTracker} from 'chrome://resources/ash/common/event_tracker.js';
 import {MultiMenu} from './multi_menu.js';
+import {AnchorType, positionPopupAroundElement} from './position_util.js';
 
 /**
  * A button that displays a MultiMenu (menu with sub-menus).
  */
-export class MultiMenuButton extends HTMLButtonElement {
+export class MultiMenuButton extends CrButtonElement {
   constructor() {
     super();
 
@@ -49,45 +53,12 @@
 
   /**
    * Decorates the element.
-   * @param {!Element} element Element to be decorated.
+   * @param {!HTMLElement} element Element to be decorated.
    * @return {!MultiMenuButton} Decorated element.
    */
   static decorate(element) {
-    // Add the MultiMenuButton methods to the element we're
-    // decorating, leaving it's prototype chain intact.
-    // Don't copy 'constructor' or property get/setters.
-    Object.getOwnPropertyNames(MultiMenuButton.prototype).forEach(name => {
-      if (name !== 'constructor' &&
-          !Object.getOwnPropertyDescriptor(element, name)) {
-        // @ts-ignore: error TS7053: Element implicitly has an 'any' type
-        // because expression of type 'string' can't be used to index type
-        // 'MultiMenuButton'.
-        element[name] = MultiMenuButton.prototype[name];
-      }
-    });
-    // Set up the 'menu' property & setter/getter.
-    Object.defineProperty(element, 'menu', {
-      get() {
-        return this.menu_;
-      },
-      set(menu) {
-        this.setMenu_(menu);
-      },
-      enumerable: true,
-      configurable: true,
-    });
-    // @ts-ignore: error TS2352: Conversion of type 'Element' to type
-    // 'MultiMenuButton' may be a mistake because neither type sufficiently
-    // overlaps with the other. If this was intentional, convert the expression
-    // to 'unknown' first.
-    element = /** @type {!MultiMenuButton} */ (element);
-    // @ts-ignore: error TS2339: Property 'decorate' does not exist on type
-    // 'Element'.
-    element.decorate();
-    // @ts-ignore: error TS2740: Type 'Element' is missing the following
-    // properties from type 'MultiMenuButton': overflow, menuEndGap_,
-    // showingEvents_, menu_, and 18 more.
-    return element;
+    decorate(element, MultiMenuButton);
+    return /** @type {!MultiMenuButton} */ (element);
   }
 
   /**
@@ -143,22 +114,16 @@
   }
 
   /**
-   * TODO(adanilo) Get rid of the getter/setter duplication.
-   * The menu associated with the menu button.
-   * @type {Menu}
+   * @type {?Menu}
    */
   get menu() {
-    // @ts-ignore: error TS2322: Type 'Menu | null' is not assignable to type
-    // 'Menu'.
     return this.menu_;
   }
   // @ts-ignore: error TS7006: Parameter 'menu' implicitly has an 'any' type.
   setMenu_(menu) {
     if (typeof menu == 'string' && menu[0] == '#') {
-      // @ts-ignore: error TS2339: Property 'ownerDocument' does not exist on
-      // type 'MultiMenuButton'.
       menu = assert(this.ownerDocument.body.querySelector(menu));
-      decorate(menu, MultiMenu);
+      deprecatedDecorate(menu, MultiMenu);
     }
 
     this.menu_ = menu;
@@ -595,5 +560,3 @@
     return false;
   }
 }
-
-MultiMenuButton.prototype.__proto__ = HTMLButtonElement.prototype;
diff --git a/ui/file_manager/file_manager/foreground/js/ui/progress_center_panel.js b/ui/file_manager/file_manager/foreground/js/ui/progress_center_panel.js
index 5065a616..de4a956 100644
--- a/ui/file_manager/file_manager/foreground/js/ui/progress_center_panel.js
+++ b/ui/file_manager/file_manager/foreground/js/ui/progress_center_panel.js
@@ -626,8 +626,8 @@
     switch (item.state) {
       case ProgressItemState.ERROR:
         if (previousItem &&
-            (previousItem.state !== ProgressItemState.PROGRESSING ||
-             previousItem.state !== ProgressItemState.PAUSED ||
+            (previousItem.state !== ProgressItemState.PROGRESSING &&
+             previousItem.state !== ProgressItemState.PAUSED &&
              previousItem.state !== ProgressItemState.SCANNING)) {
           return;
         }
@@ -650,8 +650,8 @@
 
       case ProgressItemState.CANCELED:
         if (!previousItem ||
-            (previousItem.state !== ProgressItemState.PROGRESSING ||
-             previousItem.state !== ProgressItemState.PAUSED ||
+            (previousItem.state !== ProgressItemState.PROGRESSING &&
+             previousItem.state !== ProgressItemState.PAUSED &&
              previousItem.state !== ProgressItemState.SCANNING)) {
           return;
         }
diff --git a/ui/file_manager/file_names.gni b/ui/file_manager/file_names.gni
index c76107d..c83c2755 100644
--- a/ui/file_manager/file_names.gni
+++ b/ui/file_manager/file_names.gni
@@ -31,7 +31,6 @@
   "file_manager/common/js/mock_chrome.js",
   "file_manager/common/js/mock_entry.js",
   "file_manager/common/js/progress_center_common.js",
-  "file_manager/common/js/storage.js",
   "file_manager/common/js/ui.js",
   "file_manager/common/js/volume_manager_types.js",
 
@@ -171,6 +170,7 @@
   "file_manager/common/js/lru_cache.ts",
   "file_manager/common/js/recent_date_bucket.ts",
   "file_manager/common/js/script_loader.ts",
+  "file_manager/common/js/storage.ts",
   "file_manager/common/js/translations.ts",
   "file_manager/common/js/trash.ts",
   "file_manager/common/js/trusted_script_url_policy_util.ts",
@@ -428,6 +428,7 @@
   "file_manager/common/js/file_types_base_unittest.ts",
   "file_manager/common/js/lru_cache_unittest.ts",
   "file_manager/common/js/recent_date_bucket_unittest.ts",
+  "file_manager/common/js/storage_unittest.ts",
   "file_manager/common/js/translations_unittest.ts",
   "file_manager/common/js/volume_manager_types_unittest.ts",
   "file_manager/common/js/util_unittest.ts",
@@ -606,7 +607,6 @@
   "file_manager/common/js/async_util_unittest.js",
   "file_manager/common/js/files_app_entry_types_unittest.js",
   "file_manager/common/js/filtered_volume_manager_unittest.js",
-  "file_manager/common/js/storage_unittest.js",
   "file_manager/common/js/test_error_reporting.js",
   "file_manager/common/js/unittest_util.js",
 
diff --git a/v8 b/v8
index 0cbe977..6d2e0eb 160000
--- a/v8
+++ b/v8
@@ -1 +1 @@
-Subproject commit 0cbe9772a2312baa15f6bc2488dd892c7dadeb20
+Subproject commit 6d2e0ebae22c4e1b5bde0e31e969f0282015748e