diff --git a/DEPS b/DEPS
index 55e8e115..78167c04 100644
--- a/DEPS
+++ b/DEPS
@@ -42,6 +42,7 @@
   'checkout_android',
   'checkout_android_prebuilts_build_tools',
   'checkout_clang_coverage_tools',
+  'checkout_copybara',
   'checkout_ios_webkit',
   'checkout_nacl',
   'checkout_openxr',
@@ -233,7 +234,7 @@
   # luci-go CIPD package version.
   # Make sure the revision is uploaded by infra-packagers builder.
   # https://ci.chromium.org/p/infra-internal/g/infra-packagers/console
-  'luci_go': 'git_revision:ff7417442432e6669b74c02c63d61834f865aa77',
+  'luci_go': 'git_revision:7dd39503276dfa4a920102ca77a2f409f2f67655',
 
   # This can be overridden, e.g. with custom_vars, to build clang from HEAD
   # instead of downloading the prebuilt pinned revision.
@@ -285,11 +286,11 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
-  'src_internal_revision': 'fc2956d197ad6bed33be97f5d6a206d44bff4e24',
+  'src_internal_revision': 'eee79ba48e89b7af44dc706f5c0220e43426e6e3',
   # 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': '18ed8969a0b39ec9db4c545a793d14792b53c0ab',
+  'skia_revision': '381de9ead2a2f5bb8f1858a72c50b6cf842b9f10',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
@@ -297,7 +298,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ANGLE
   # and whatever else without interference from each other.
-  'angle_revision': '14b495336c558046a1b5a8a34867ac875c5b3977',
+  'angle_revision': 'a813854729f9a44991197c68c76748e27a49bbbf',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
@@ -361,11 +362,11 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling chromium_variations
   # and whatever else without interference from each other.
-  'chromium_variations_revision': 'fe52d1f4152376771844d4efd7697758bfa520dd',
+  'chromium_variations_revision': 'a62da4cbeb5393533721fa94c70fe751f507b298',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling CrossBench
   # and whatever else without interference from each other.
-  'crossbench_revision': '9f3b07f3e4c95d5aa38c274cdd7b86ea83701e04',
+  'crossbench_revision': '5401449e65e7385e37c6b7597fa33fed8701c3b3',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libFuzzer
   # and whatever else without interference from each other.
@@ -381,7 +382,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': '428aec3ab17de76eab176672f031bd3a99bdb97a',
+  'devtools_frontend_revision': '93f9c55dfb7831cca4d069535477a2c83b8db86a',
   # 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.
@@ -1280,12 +1281,12 @@
 
   'src/clank': {
     'url': Var('chrome_git') + '/clank/internal/apps.git' + '@' +
-    'd47d7011dff3490acd89bd81a313a9dd3c32d567',
+    '4f841d92100ecbb22d8e3c19492dc85a3177d31f',
     'condition': 'checkout_android and checkout_src_internal',
   },
 
   'src/docs/website': {
-    'url': Var('chromium_git') + '/website.git' + '@' + 'f4535018cb6d2aff37c4a414f8928ca055b639df',
+    'url': Var('chromium_git') + '/website.git' + '@' + '37f01b6847b3dc89474feeb57ee9b152b4d17761',
   },
 
   'src/ios/third_party/earl_grey2/src': {
@@ -1759,13 +1760,13 @@
 
 
   'src/third_party/depot_tools':
-    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + 'a31b55235fa0e02cdd11e9e311a3da11fd53d473',
+    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '1e559a28280c84348ccb49da57c8fbcfebe4b977',
 
   'src/third_party/devtools-frontend/src':
     Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'),
 
   'src/third_party/devtools-frontend-internal': {
-      'url': Var('chrome_git') + '/devtools/devtools-internal.git' + '@' + '231b3184749a697b31363c465183562a05f3fee4',
+      'url': Var('chrome_git') + '/devtools/devtools-internal.git' + '@' + '744fbd396e751ce06f0f3b3c1dd9a80f08fc95b3',
     'condition': 'checkout_src_internal',
   },
 
@@ -1773,7 +1774,7 @@
     Var('chromium_git') + '/chromium/dom-distiller/dist.git' + '@' + '199de96b345ada7c6e7e6ba3d2fa7a6911b8767d',
 
   'src/third_party/eigen3/src':
-    Var('chromium_git') + '/external/gitlab.com/libeigen/eigen.git' + '@' + '2d4c9b400cca33d2f5cf316efc7151236244edb1',
+    Var('chromium_git') + '/external/gitlab.com/libeigen/eigen.git' + '@' + '7eea0a9213e801ad9479a6499fd0330ec1db8693',
 
   'src/third_party/emoji-metadata/src': {
     'url': Var('chromium_git') + '/external/github.com/googlefonts/emoji-metadata' + '@' + '045f146fca682a836e01cd265171312bfb300e06',
@@ -2231,7 +2232,7 @@
     Var('chromium_git') + '/external/github.com/cisco/openh264' + '@' + '478e5ab3eca30e600006d5a0a08b176fd34d3bd1',
 
   'src/third_party/openscreen/src':
-    Var('chromium_git') + '/openscreen' + '@' + 'ac12a98ad35af8c74c1ce806cb8b87ea5f91ec7c',
+    Var('chromium_git') + '/openscreen' + '@' + '4f27c4f1698522dfcea36dca948a13e2eaf4c26c',
 
   'src/third_party/openxr/src': {
     'url': Var('chromium_git') + '/external/github.com/KhronosGroup/OpenXR-SDK' + '@' + '288d3a7ebc1ad959f62d51da75baa3d27438c499',
@@ -2257,7 +2258,7 @@
     Var('pdfium_git') + '/pdfium.git' + '@' +  Var('pdfium_revision'),
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' + '84aa7464783d04a2fdbd7ca063cbdae4dfe5a929',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' + 'a5ac928573c3140703d053efd91d30ccbfee4d8d',
 
   'src/base/tracing/test/data': {
     'bucket': 'perfetto',
@@ -2411,7 +2412,7 @@
       'packages': [
           {
               'package': 'chromium/third_party/r8',
-              'version': '6pzT4UkzHpjnobJW8Yujr0Z4dGqQgOvpH9AJh96Bmn8C',
+              'version': 'DgLLUikHZ3cyauaYqRCD_lXrhQpZWqKiTDu7afFS-PEC',
           },
       ],
       'condition': 'checkout_android and non_git_source',
@@ -2532,7 +2533,7 @@
     Var('chromium_git') + '/external/github.com/GoogleChromeLabs/text-fragments-polyfill.git' + '@' + 'c036420683f672d685e27415de0a5f5e85bdc23f',
 
   'src/third_party/tflite/src':
-    Var('chromium_git') + '/external/github.com/tensorflow/tensorflow.git' + '@' + '8ff94d3cf1e5edc5586a98bd0cdab1601ff6924b',
+    Var('chromium_git') + '/external/github.com/tensorflow/tensorflow.git' + '@' + '10cacdd94b313773d29c07f48fbec232be56a478',
 
   'src/third_party/turbine/cipd': {
       'packages': [
@@ -2545,16 +2546,16 @@
       'dep_type': 'cipd',
   },
 
-  'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@e8e61a227e2c242ee71400cdfdfbe9eed7350dc2',
+  'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@73fd75175922012f21557239b7743a152ea7f1fd',
   'src/third_party/glslang/src': '{chromium_git}/external/github.com/KhronosGroup/glslang@2acc4ea0028bc703be2d4e9bc8a4032d015d6516',
   'src/third_party/spirv-cross/src': '{chromium_git}/external/github.com/KhronosGroup/SPIRV-Cross@b8fcf307f1f347089e3c46eb4451d27f32ebc8d3',
-  'src/third_party/spirv-headers/src': '{chromium_git}/external/github.com/KhronosGroup/SPIRV-Headers@a62b032007b2e7a69f24a195cbfbd0cf22d31bb0',
-  'src/third_party/spirv-tools/src': '{chromium_git}/external/github.com/KhronosGroup/SPIRV-Tools@4310fd4edae21d711ab31f5183704ad320329419',
+  'src/third_party/spirv-headers/src': '{chromium_git}/external/github.com/KhronosGroup/SPIRV-Headers@50bc4debdc3eec5045edbeb8ce164090e29b91f3',
+  'src/third_party/spirv-tools/src': '{chromium_git}/external/github.com/KhronosGroup/SPIRV-Tools@42b315c15b1ff941b46bb3949c105e5386be8717',
   'src/third_party/vulkan-headers/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-Headers@14345dab231912ee9601136e96ca67a6e1f632e7',
   'src/third_party/vulkan-loader/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-Loader@bd1c8ea9c6ac51e4c3a6ddb9d602bb204678eb5f',
   'src/third_party/vulkan-tools/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-Tools@c9a5acda16dc2759457dc856b5d7df00ac5bf4a2',
   'src/third_party/vulkan-utility-libraries/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-Utility-Libraries@8c907ea21fe0147f791d79051b18e21bc8c4ede0',
-  'src/third_party/vulkan-validation-layers/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-ValidationLayers@61037741e4d8ccdb8c7b761bc726ab87cc11496d',
+  'src/third_party/vulkan-validation-layers/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-ValidationLayers@cbb4ab171fc7cd0b636a76ee542e238a8734f4be',
 
   'src/third_party/vulkan_memory_allocator':
     Var('chromium_git') + '/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git' + '@' + '56300b29fbfcc693ee6609ddad3fdd5b7a449a21',
@@ -2591,7 +2592,7 @@
     Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + '450cceb587613ac1469c5a131fac15935c99e0e7',
 
   'src/third_party/webgpu-cts/src':
-    Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + 'ab266c93548d2cff1d15ac1fe19ee7ee5f466793',
+    Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '8a2916436238386d6465ec2cab9735e65ad14070',
 
   'src/third_party/webrtc':
     Var('webrtc_git') + '/src.git' + '@' + '7b1b7a0f51593df7a1a802f489d6a2fb14195bcc',
@@ -2625,7 +2626,7 @@
   },
 
   'src/third_party/xnnpack/src':
-    Var('chromium_git') + '/external/github.com/google/XNNPACK.git' + '@' + '14ce5c47ebf2ff79e3dc2f1d319ad7b1793e1b21',
+    Var('chromium_git') + '/external/github.com/google/XNNPACK.git' + '@' + 'd5d572e46ed3929fa3e67f6174192893943cf724',
 
   'src/tools/page_cycler/acid3':
     Var('chromium_git') + '/chromium/deps/acid3.git' + '@' + 'a926d0a32e02c4c03ae95bb798e6c780e0e184ba',
@@ -4291,7 +4292,7 @@
 
   'src/components/optimization_guide/internal': {
       'url': Var('chrome_git') + '/chrome/components/optimization_guide.git' + '@' +
-        '131a9ad09d2b447fa737fdbba2445de686328d9a',
+        '4f82443aa1ee185d26ed402bd0d0dbd969079560',
       'condition': 'checkout_src_internal',
   },
 
@@ -4357,7 +4358,7 @@
 
   'src/ios_internal':  {
       'url': Var('chrome_git') + '/chrome/ios_internal.git' + '@' +
-        '98bfebd811401f750d9692e455de80fe8553d1bd',
+        'f077b0366edef70d7b2dc5d3e9697fab618efeac',
       'condition': 'checkout_ios and checkout_src_internal',
   },
 
diff --git a/ash/components/arc/volume_mounter/arc_volume_mounter_bridge.cc b/ash/components/arc/volume_mounter/arc_volume_mounter_bridge.cc
index d7c6402..143de1c2 100644
--- a/ash/components/arc/volume_mounter/arc_volume_mounter_bridge.cc
+++ b/ash/components/arc/volume_mounter/arc_volume_mounter_bridge.cc
@@ -18,6 +18,7 @@
 #include "base/functional/bind.h"
 #include "base/logging.h"
 #include "base/memory/singleton.h"
+#include "base/metrics/histogram_functions.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/strings/strcat.h"
 #include "base/strings/string_util.h"
@@ -60,6 +61,28 @@
 constexpr uint32_t kAndroidAppUidStart = 10000;
 constexpr uint32_t kAndroidAppUidEnd = 19999;
 
+// Enum representing the result of PrepareForRemovableMediaUnmount(). Used for
+// Arc.VmRemovableMediaUnmount.Result UMA. Should not be renumbered and should
+// be kept in sync with tools/metrics/histograms/metadata/arc/enums.xml.
+enum class ArcVmRemovableMediaUnmountResult {
+  kSuccess = 0,
+  kFailedMojoTimeout = 1,
+  kFailedArcSideError = 2,
+  kFailedInstanceNotFound = 3,
+  kMaxValue = kFailedInstanceNotFound,
+};
+
+void ReportRemovableMediaUnmountResult(
+    ArcVmRemovableMediaUnmountResult result) {
+  base::UmaHistogramEnumeration("Arc.VmRemovableMediaUnmount.Result", result);
+}
+
+void ReportRemovableMediaUnmountDuration(base::TimeDelta duration) {
+  base::UmaHistogramCustomTimes("Arc.VmRemovableMediaUnmount.Duration",
+                                duration, base::Milliseconds(1) /* min */,
+                                base::Seconds(20) /* max */, 50 /* buckets */);
+}
+
 // Singleton factory for ArcVolumeMounterBridge.
 class ArcVolumeMounterBridgeFactory
     : public internal::ArcBrowserContextKeyedServiceFactoryBase<
@@ -340,6 +363,10 @@
                                   PrepareForRemovableMediaUnmount);
   if (!volume_mounter_instance) {
     std::move(unmount_callback_).Run(false);
+    if (IsArcVmEnabled()) {
+      ReportRemovableMediaUnmountResult(
+          ArcVmRemovableMediaUnmountResult::kFailedInstanceNotFound);
+    }
     ProcessPendingRemovableMediaUnmountRequest();
     return;
   }
@@ -353,7 +380,9 @@
       base::SingleThreadTaskRunner::GetCurrentDefault(),
       base::BindOnce(
           &ArcVolumeMounterBridge::OnArcPreparedForRemovableMediaUnmount,
-          weak_ptr_factory_.GetWeakPtr(), mount_path)));
+          weak_ptr_factory_.GetWeakPtr(), mount_path, false /* is_timeout */)));
+
+  unmount_mojo_start_time_ = base::TimeTicks::Now();
 
   volume_mounter_instance->PrepareForRemovableMediaUnmount(
       mount_path, unmount_mojo_callback_.callback());
@@ -362,18 +391,29 @@
       FROM_HERE, unmount_timeout_,
       base::BindOnce(
           &ArcVolumeMounterBridge::OnArcPreparedForRemovableMediaUnmount,
-          weak_ptr_factory_.GetWeakPtr(), mount_path, false /* success */));
+          weak_ptr_factory_.GetWeakPtr(), mount_path, true /* is_timeout */,
+          false /* success */));
 }
 
 void ArcVolumeMounterBridge::OnArcPreparedForRemovableMediaUnmount(
     const base::FilePath& mount_path,
+    bool is_timeout,
     bool success) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  DCHECK(unmount_callback_);
   VLOG(1) << __func__ << " called for " << mount_path;
 
-  if (unmount_callback_.is_null()) {
-    LOG(ERROR) << __func__ << " was unexpectedly called with null callback";
-    return;
+  if (IsArcVmEnabled()) {
+    ReportRemovableMediaUnmountDuration(base::TimeTicks::Now() -
+                                        unmount_mojo_start_time_);
+    if (success) {
+      ReportRemovableMediaUnmountResult(
+          ArcVmRemovableMediaUnmountResult::kSuccess);
+    } else {
+      ReportRemovableMediaUnmountResult(
+          is_timeout ? ArcVmRemovableMediaUnmountResult::kFailedMojoTimeout
+                     : ArcVmRemovableMediaUnmountResult::kFailedArcSideError);
+    }
   }
   std::move(unmount_callback_).Run(success);
 
diff --git a/ash/components/arc/volume_mounter/arc_volume_mounter_bridge.h b/ash/components/arc/volume_mounter/arc_volume_mounter_bridge.h
index d8f7cbf3..bac135c 100644
--- a/ash/components/arc/volume_mounter/arc_volume_mounter_bridge.h
+++ b/ash/components/arc/volume_mounter/arc_volume_mounter_bridge.h
@@ -145,6 +145,7 @@
   // `unmount_timer_`. This method should be called only by one of them for
   // every unmount request.
   void OnArcPreparedForRemovableMediaUnmount(const base::FilePath& mount_path,
+                                             bool is_timeout,
                                              bool success);
 
   using UnmountRequest = std::tuple<
@@ -167,6 +168,8 @@
   // When the callback for PrepareForRemovableMediaUnmount mojo does not run
   // within this timeout, the callback will be called with false.
   base::TimeDelta unmount_timeout_ = base::Seconds(10);
+  // Holds the last time when PrepareForRemovableMediaUnmount mojo was called.
+  base::TimeTicks unmount_mojo_start_time_;
 
   raw_ptr<Delegate, DanglingUntriaged> delegate_ = nullptr;
 
diff --git a/ash/login/ui/login_auth_user_view.cc b/ash/login/ui/login_auth_user_view.cc
index 9a0e15b..f0f4971 100644
--- a/ash/login/ui/login_auth_user_view.cc
+++ b/ash/login/ui/login_auth_user_view.cc
@@ -119,6 +119,7 @@
 constexpr int kDistanceFromTopOfBigUserViewToUserIconDp = 24;
 
 constexpr int kDistanceBetweenPasswordFieldAndAuthFactorsViewDp = 90;
+constexpr int kDistanceBetweenPasswordFieldAndPinStatusMessageViewDp = 20;
 
 constexpr base::TimeDelta kChallengeResponseResetAfterFailureDelay =
     base::Seconds(5);
@@ -1556,6 +1557,10 @@
   if (state.has_pinpad) {
     return SizeFromHeight(kDistanceBetweenPasswordFieldAndPinKeyboardDp);
   }
+  if (state.pin_is_locked) {
+    return SizeFromHeight(
+        kDistanceBetweenPasswordFieldAndPinStatusMessageViewDp);
+  }
   if (state.has_fingerprint ||
       (auth_factors_view_ && auth_factors_view_->GetVisible())) {
     return SizeFromHeight(kDistanceBetweenPasswordFieldAndAuthFactorsViewDp);
diff --git a/ash/login/ui/pin_request_view.cc b/ash/login/ui/pin_request_view.cc
index 8a9d17c..205fdfe9 100644
--- a/ash/login/ui/pin_request_view.cc
+++ b/ash/login/ui/pin_request_view.cc
@@ -19,7 +19,6 @@
 #include "base/functional/bind.h"
 #include "base/strings/strcat.h"
 #include "base/task/single_thread_task_runner.h"
-#include "chromeos/constants/chromeos_features.h"
 #include "ui/accessibility/ax_enums.mojom.h"
 #include "ui/accessibility/ax_node_data.h"
 #include "ui/base/l10n/l10n_util.h"
@@ -227,7 +226,6 @@
   views::ImageView* icon = new views::ImageView();
 
   const ui::ColorId icon_color_id = cros_tokens::kCrosSysOnSurface;
-
   icon->SetImage(ui::ImageModel::FromVectorIcon(
       kPinRequestLockIcon, icon_color_id, kLockIconSizeDp));
   icon_view->AddChildView(icon);
@@ -275,8 +273,7 @@
     label->SetSubpixelRenderingEnabled(false);
     label->SetAutoColorReadabilityEnabled(false);
 
-    const ui::ColorId text_color_id = cros_tokens::kCrosSysOnSurface;
-    label->SetEnabledColorId(text_color_id);
+    label->SetEnabledColorId(cros_tokens::kCrosSysOnSurface);
     label->SetFocusBehavior(FocusBehavior::ACCESSIBLE_ONLY);
   };
 
@@ -369,8 +366,7 @@
   help_button_->SetPaintToLayer();
   help_button_->layer()->SetFillsBoundsOpaquely(false);
   help_button_->SetTextSubpixelRenderingEnabled(false);
-  const ui::ColorId help_button_color_id = cros_tokens::kCrosSysSecondary;
-  help_button_->SetEnabledTextColorIds(help_button_color_id);
+  help_button_->SetEnabledTextColorIds(cros_tokens::kCrosSysSecondary);
   help_button_->SetVisible(request.help_button_enabled);
   footer->AddChildView(help_button_.get());
 
@@ -384,7 +380,6 @@
       IDS_ASH_LOGIN_SUBMIT_BUTTON_ACCESSIBLE_NAME,
       /*togglable=*/true, /*has_border=*/false);
   static_cast<IconButton*>(submit_button_)->SetToggled(true);
-
   submit_button_->SetEnabled(false);
   submit_button_->SetFocusBehavior(FocusBehavior::ALWAYS);
   footer->AddChildView(submit_button_.get());
diff --git a/ash/system/input_device_settings/input_device_settings_metadata.cc b/ash/system/input_device_settings/input_device_settings_metadata.cc
index fd0f8b7..17a4dfe2 100644
--- a/ash/system/input_device_settings/input_device_settings_metadata.cc
+++ b/ash/system/input_device_settings/input_device_settings_metadata.cc
@@ -1045,7 +1045,7 @@
             mojom::GraphicsTabletButtonConfig::kWacomStandardPenOnly,
             "One by Wacom S"}},
           // One by Wacom M
-          {{0x056a, 0x0301},
+          {{0x056a, 0x037b},
            {mojom::CustomizationRestriction::kAllowCustomizations,
             mojom::GraphicsTabletButtonConfig::kWacomStandardPenOnly,
             "One by Wacom M"}},
@@ -1504,11 +1504,23 @@
           // Wacom Intuos S (Bluetooth -> USB)
           {{0x056a, 0x0376}, {0x056a, 0x0374}},
           // Wacom Intuos S (Bluetooth -> USB)
+          {{0x056a, 0x0377}, {0x056a, 0x0374}},
+          // Wacom Intuos S (Bluetooth -> USB)
           {{0x056a, 0x03c5}, {0x056a, 0x0374}},
+          // Wacom Intuos S (Bluetooth -> USB)
+          {{0x056a, 0x03c6}, {0x056a, 0x0374}},
           // Wacom Intuos M (Bluetooth -> USB)
           {{0x056a, 0x0378}, {0x056a, 0x0375}},
           // Wacom Intuos M (Bluetooth -> USB)
+          {{0x056a, 0x0379}, {0x056a, 0x0375}},
+          // Wacom Intuos M (Bluetooth -> USB)
           {{0x056a, 0x03c7}, {0x056a, 0x0375}},
+          // Wacom Intuos M (Bluetooth -> USB)
+          {{0x056a, 0x03c8}, {0x056a, 0x0375}},
+          // Wacom One Pen tablet M (Bluetooth -> USB)
+          {{0x0531, 0x0103}, {0x0531, 0x0102}},
+          // Wacom One Pen tablet S (Bluetooth -> USB)
+          {{0x0531, 0x0101}, {0x0531, 0x0100}},
           // SteelSeries Aerox 9 WL (USB Dongle -> USB)
           {{0x1038, 0x1858}, {0x1038, 0x185a}},
           // SteelSeries Aerox 9 WL (Bluetooth -> USB)
diff --git a/ash/wm/overview/birch/birch_bar_controller.cc b/ash/wm/overview/birch/birch_bar_controller.cc
index e93ef8d5..fd6671cb 100644
--- a/ash/wm/overview/birch/birch_bar_controller.cc
+++ b/ash/wm/overview/birch/birch_bar_controller.cc
@@ -335,6 +335,18 @@
   base::UmaHistogramCustomCounts("Ash.Birch.ChipCount", items.size(),
                                  /*min=*/0, /*exclusive_max=*/10,
                                  /*buckets=*/10);
+
+  // Record the number of coral items shown.
+  auto num_coral_items =
+      std::count_if(items.begin(), items.end(),
+                    [](const std::unique_ptr<ash::BirchItem>& item) {
+                      return item->GetType() == BirchItemType::kCoral;
+                    });
+  base::UmaHistogramCustomCounts("Ash.Birch.Coral.ClusterCount",
+                                 num_coral_items,
+                                 /*min=*/0, /*exclusive_max=*/3,
+                                 /*buckets=*/3);
+
   RecordTimeOfDayRankingHistogram(items);
 
   for (auto& bar_view : bar_views_) {
diff --git a/ash/wm/overview/birch/birch_bar_unittest.cc b/ash/wm/overview/birch/birch_bar_unittest.cc
index 6f2f2d9d..f5b3152 100644
--- a/ash/wm/overview/birch/birch_bar_unittest.cc
+++ b/ash/wm/overview/birch/birch_bar_unittest.cc
@@ -374,6 +374,7 @@
                      base::Time::Now() + base::Minutes(30), GURL(), GURL(),
                      std::string(), /*all_day_event=*/false);
   birch_client_->SetCalendarItems(items);
+  SetCoralItems(/*num=*/2);
 
   // Entering overview shows the birch bar.
   EnterOverview();
@@ -382,14 +383,17 @@
   // One impression was recorded for the birch bar.
   histograms.ExpectBucketCount("Ash.Birch.Bar.Impression", true, 1);
 
-  // Two chips were shown.
-  histograms.ExpectBucketCount("Ash.Birch.ChipCount", 2, 1);
+  // Four chips were shown.
+  histograms.ExpectBucketCount("Ash.Birch.ChipCount", 4, 1);
 
   // One impression was recorded for each chip type.
   histograms.ExpectBucketCount("Ash.Birch.Chip.Impression",
                                BirchItemType::kFile, 1);
   histograms.ExpectBucketCount("Ash.Birch.Chip.Impression",
                                BirchItemType::kCalendar, 1);
+  histograms.ExpectBucketCount("Ash.Birch.Chip.Impression",
+                               BirchItemType::kCoral, 2);
+  histograms.ExpectBucketCount("Ash.Birch.Coral.ClusterCount", 2, 1);
 
   // Two rankings were recorded for the current time slot histogram.
   histograms.ExpectBucketCount("Ash.Birch.Ranking.1200to1700", 1, 1);
diff --git a/base/mac/process_requirement.cc b/base/mac/process_requirement.cc
index f4a245c..d13f1c4 100644
--- a/base/mac/process_requirement.cc
+++ b/base/mac/process_requirement.cc
@@ -628,8 +628,12 @@
   }
 
   bool all_fields_have_expected_values =
-      team_id_has_expected_value && validation_category_has_expected_value &&
+      team_id_has_expected_value &&
       fallback_validation_category_has_expected_value;
+  if (CSOpsProvider()->SupportsValidationCategory()) {
+    all_fields_have_expected_values = all_fields_have_expected_values &&
+                                      validation_category_has_expected_value;
+  }
 
   if (!all_fields_have_expected_values) {
     // Use `DumpWithoutCrashing` to understand unexpected values, except in
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/AutofillSaveCardPromptBase.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/AutofillSaveCardPromptBase.java
index cbef13ce..595a266 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/AutofillSaveCardPromptBase.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/AutofillSaveCardPromptBase.java
@@ -22,7 +22,6 @@
 import androidx.annotation.Nullable;
 
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.components.autofill.payments.LegalMessageLine;
 import org.chromium.ui.modaldialog.DialogDismissalCause;
 import org.chromium.ui.modaldialog.ModalDialogManager;
@@ -77,11 +76,7 @@
         mBaseDelegate = delegate;
         LayoutInflater inflater = LayoutInflater.from(context);
         mDialogView = inflater.inflate(R.layout.autofill_save_card_base_layout, null);
-        boolean useCustomTitleView =
-                ChromeFeatureList.isEnabled(
-                                ChromeFeatureList
-                                        .AUTOFILL_ENABLE_MOVING_GPAY_LOGO_TO_THE_RIGHT_ON_CLANK)
-                        && customTitleLayoutId != Resources.ID_NULL;
+        boolean useCustomTitleView = customTitleLayoutId != Resources.ID_NULL;
 
         if (useCustomTitleView) {
             ViewStub stub = mDialogView.findViewById(R.id.title_with_icon_stub);
@@ -142,9 +137,8 @@
     }
 
     /**
-     * Updates the title and icon view. If AUTOFILL_ENABLE_MOVING_GPAY_LOGO_TO_THE_RIGHT_ON_CLANK
-     * feature is enabled, sets title and icon in the customView otherwise uses
-     * PropertyModel.Builder for title and icon.
+     * Updates the title and icon view. If `useCustomTitleView` is true, sets title and icon in the
+     * customView otherwise uses PropertyModel.Builder for title and icon.
      *
      * @param useCustomTitleView Indicates true/false to use custom title view.
      * @param title Title of the prompt dialog.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/iban/AutofillSaveIbanBottomSheetBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/iban/AutofillSaveIbanBottomSheetBridge.java
index c78b885..9692e33ba 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/iban/AutofillSaveIbanBottomSheetBridge.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/iban/AutofillSaveIbanBottomSheetBridge.java
@@ -72,12 +72,19 @@
         mCoordinator.requestShowContent();
     }
 
+    /** Requests to hide the bottom sheet if showing. */
+    @CalledByNative
+    public void hide() {
+        if (mNativeAutofillSaveIbanBottomSheetBridge == 0) return;
+        mCoordinator.destroy(BottomSheetController.StateChangeReason.INTERACTION_COMPLETE);
+    }
+
     @CalledByNative
     @VisibleForTesting
     /*package*/ void destroy() {
         mNativeAutofillSaveIbanBottomSheetBridge = 0;
         if (mCoordinator == null) return;
-        mCoordinator.destroy();
+        mCoordinator.destroy(BottomSheetController.StateChangeReason.NONE);
         mCoordinator = null;
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/iban/AutofillSaveIbanBottomSheetCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/iban/AutofillSaveIbanBottomSheetCoordinator.java
index 4982609..20f2f79 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/iban/AutofillSaveIbanBottomSheetCoordinator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/iban/AutofillSaveIbanBottomSheetCoordinator.java
@@ -12,6 +12,7 @@
 import org.chromium.chrome.browser.tabmodel.TabModel;
 import org.chromium.components.autofill.payments.AutofillSaveIbanUiInfo;
 import org.chromium.components.browser_ui.bottomsheet.BottomSheetController;
+import org.chromium.components.browser_ui.bottomsheet.BottomSheetController.StateChangeReason;
 import org.chromium.ui.modelutil.PropertyModel;
 import org.chromium.ui.modelutil.PropertyModelChangeProcessor;
 
@@ -123,8 +124,8 @@
     }
 
     /** Destroys this component, hiding the bottom sheet if needed. */
-    public void destroy() {
-        mMediator.hide(BottomSheetController.StateChangeReason.NONE);
+    public void destroy(@StateChangeReason int hideReason) {
+        mMediator.hide(hideReason);
     }
 
     void openLegalMessageLink(String url) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/iban/AutofillSaveIbanBottomSheetMediator.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/iban/AutofillSaveIbanBottomSheetMediator.java
index 6f57b5e..67868f5 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/iban/AutofillSaveIbanBottomSheetMediator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/iban/AutofillSaveIbanBottomSheetMediator.java
@@ -44,6 +44,7 @@
     private final LayoutStateProvider mLayoutStateProvider;
     private final TabModel mTabModel;
     private boolean mIsServerSave;
+    private boolean mFinished;
 
     /**
      * Creates the mediator.
@@ -106,6 +107,11 @@
         logSaveIbanPromptResult(SaveIbanPromptResult.CANCELLED, mIsServerSave);
     }
 
+    public void onIgnored() {
+        hide(StateChangeReason.INTERACTION_COMPLETE);
+        mDelegate.onUiIgnored();
+    }
+
     void hide(@StateChangeReason int hideReason) {
         mBottomSheetController.hideContent(mBottomSheetContent, /* animate= */ true, hideReason);
         mBottomSheetController.removeObserver(this);
@@ -113,6 +119,26 @@
         mTabModel.removeObserver(this);
     }
 
+    // Overrides EmptyBottomSheetObserver onSheetClosed method for BottomSheetController.
+    @Override
+    public void onSheetClosed(@StateChangeReason int reason) {
+        switch (reason) {
+            case StateChangeReason.BACK_PRESS:
+            case StateChangeReason.SWIPE:
+            case StateChangeReason.TAP_SCRIM:
+                finish(this::onCanceled);
+                break;
+            case StateChangeReason.INTERACTION_COMPLETE:
+                // Expecting AutofillSaveIbanBottomSheetCoordinator to set up the appropriate
+                // callbacks to native on button presses in this case.
+                mFinished = true;
+                break;
+            default:
+                finish(this::onIgnored);
+                break;
+        }
+    }
+
     // TabModelObserver.
     @Override
     public void didSelectTab(Tab tab, int type, int lastId) {
@@ -134,6 +160,13 @@
         }
     }
 
+    void finish(Runnable callback) {
+        if (!mFinished) {
+            mFinished = true;
+            callback.run();
+        }
+    }
+
     /**
      * Helper function to log SaveIbanPromptOffer histogram.
      *
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/InputHintCheckerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/InputHintCheckerTest.java
index 53ed23a..f90e25a 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/InputHintCheckerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/InputHintCheckerTest.java
@@ -22,7 +22,6 @@
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.CriteriaHelper;
-import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.DoNotBatch;
 import org.chromium.base.test.util.HistogramWatcher;
 import org.chromium.chrome.browser.flags.ChromeSwitches;
@@ -76,8 +75,13 @@
                         InputHintChecker.hasInputWithThrottlingForTesting();
                     } else {
                         InputHintChecker.hasInputForTesting();
+                        // Only assert on |mCallCount| in non-throttled case. Oftentimes
+                        // the hasInputWithThrottlingForTesting() call above is preceded by another
+                        // input hint poll from MessagePumpAndroid. This would prevent incrementing
+                        // the poll count for a few milliseconds.
+                        // See https://crbug.com/372637659#comment5.
+                        Assert.assertEquals(1, view.mCallCount);
                     }
-                    Assert.assertEquals(1, view.mCallCount);
                 });
     }
 
@@ -137,7 +141,6 @@
 
     @Test
     @MediumTest
-    @DisabledTest(message = "crbug.com/372637659")
     public void testReadHintDoesNotCrashWithThrottling() {
         // Start InputHintChecker asynchronous initialization by calling setView().
         TestTextView view =
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/autofill/iban/AutofillSaveIbanBottomSheetBridgeTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/autofill/iban/AutofillSaveIbanBottomSheetBridgeTest.java
index 4a09394..66d7fab 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/autofill/iban/AutofillSaveIbanBottomSheetBridgeTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/autofill/iban/AutofillSaveIbanBottomSheetBridgeTest.java
@@ -99,6 +99,18 @@
     }
 
     @Test
+    public void testHide() {
+        mAutofillSaveIbanBottomSheetBridge.requestShowContent(TEST_IBAN_UI_INFO);
+        mAutofillSaveIbanBottomSheetBridge.hide();
+
+        verify(mBottomSheetController)
+                .hideContent(
+                        any(AutofillSaveIbanBottomSheetContent.class),
+                        /* animate= */ eq(true),
+                        eq(StateChangeReason.INTERACTION_COMPLETE));
+    }
+
+    @Test
     public void testDestroy() {
         mAutofillSaveIbanBottomSheetBridge.requestShowContent(TEST_IBAN_UI_INFO);
         mAutofillSaveIbanBottomSheetBridge.destroy();
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/autofill/iban/AutofillSaveIbanBottomSheetCoordinatorTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/autofill/iban/AutofillSaveIbanBottomSheetCoordinatorTest.java
index abc5e20..81065d3 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/autofill/iban/AutofillSaveIbanBottomSheetCoordinatorTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/autofill/iban/AutofillSaveIbanBottomSheetCoordinatorTest.java
@@ -88,7 +88,7 @@
     @Test
     public void testDestroy() {
         mCoordinator.requestShowContent();
-        mCoordinator.destroy();
+        mCoordinator.destroy(BottomSheetController.StateChangeReason.NONE);
 
         verify(mBottomSheetController)
                 .hideContent(
diff --git a/chrome/app/settings_strings.grdp b/chrome/app/settings_strings.grdp
index f5e8052..d01f496 100644
--- a/chrome/app/settings_strings.grdp
+++ b/chrome/app/settings_strings.grdp
@@ -4624,6 +4624,9 @@
   <message name="IDS_SETTINGS_AI_PAGE_TITLE" desc="Title of page holding experimental AI settings">
     Experimental AI
   </message>
+  <message name="IDS_SETTINGS_AI_INNOVATIONS_PAGE_TITLE" desc="This label is on the left Navigation sidebar in Chrome’s settings. It tells the user that they can see settings related to AI (artificial intelligence) in this section. It is a noun phrase that refers to our collection of AI settings. These settings include Help me write, Tab organizer, and more. If possible, translate this so that it closely matches the Navigation tab title at the top of this marketing page: https://www.google.com/chrome/ai-innovations.">
+    AI innovations
+  </message>
   <message name="IDS_SETTINGS_AI_PAGE_MAIN_LABEL" desc="Toggle primary description">
     Try out experimental AI features
   </message>
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_AI_INNOVATIONS_PAGE_TITLE.png.sha1 b/chrome/app/settings_strings_grdp/IDS_SETTINGS_AI_INNOVATIONS_PAGE_TITLE.png.sha1
new file mode 100644
index 0000000..5ff62fc9
--- /dev/null
+++ b/chrome/app/settings_strings_grdp/IDS_SETTINGS_AI_INNOVATIONS_PAGE_TITLE.png.sha1
@@ -0,0 +1 @@
+38a1c845e52bfa381c4bc30b83e755628d4d5ef2
\ No newline at end of file
diff --git a/chrome/browser/ai/ai_manager_keyed_service.cc b/chrome/browser/ai/ai_manager_keyed_service.cc
index 21b71894..4608f2f 100644
--- a/chrome/browser/ai/ai_manager_keyed_service.cc
+++ b/chrome/browser/ai/ai_manager_keyed_service.cc
@@ -236,10 +236,12 @@
 
   std::unique_ptr<optimization_guide::OptimizationGuideModelExecutor::Session>
   StartSession() {
-    optimization_guide::SessionConfigParams config_params =
-        optimization_guide::SessionConfigParams{
-            .execution_mode = optimization_guide::SessionConfigParams::
-                ExecutionMode::kOnDeviceOnly};
+    using ::optimization_guide::SessionConfigParams;
+    SessionConfigParams config_params = SessionConfigParams{
+        .execution_mode = SessionConfigParams::ExecutionMode::kOnDeviceOnly,
+        .logging_mode = SessionConfigParams::LoggingMode::kAlwaysDisable,
+    };
+
     UpdateSessionConfigParams(&config_params);
     return service_->StartSession(feature_, config_params);
   }
diff --git a/chrome/browser/ash/crosapi/vpn_service_ash.h b/chrome/browser/ash/crosapi/vpn_service_ash.h
index 6c4aeef0..b3eb4c8 100644
--- a/chrome/browser/ash/crosapi/vpn_service_ash.h
+++ b/chrome/browser/ash/crosapi/vpn_service_ash.h
@@ -39,7 +39,7 @@
 namespace chromeos {
 
 // Fwd for friend declaration in VpnServiceAsh.
-class VpnProviderApiTestAsh;
+class VpnProviderApiTest;
 
 }  // namespace chromeos
 
@@ -152,7 +152,7 @@
 
  private:
   friend class VpnConfigurationImpl;
-  friend class chromeos::VpnProviderApiTestAsh;
+  friend class chromeos::VpnProviderApiTest;
   friend class TestShillControllerAsh;
 
   using StringToOwnedConfigurationMap =
@@ -246,7 +246,7 @@
       base::flat_set<std::string> vpn_extensions) override;
 
  private:
-  friend class chromeos::VpnProviderApiTestAsh;
+  friend class chromeos::VpnProviderApiTest;
   friend class VpnServiceForExtensionAsh;
 
   // Callback for
diff --git a/chrome/browser/ash/login/screens/sync_consent_browsertest.cc b/chrome/browser/ash/login/screens/sync_consent_browsertest.cc
index 88846162..b73e8459 100644
--- a/chrome/browser/ash/login/screens/sync_consent_browsertest.cc
+++ b/chrome/browser/ash/login/screens/sync_consent_browsertest.cc
@@ -80,6 +80,10 @@
   return SyncServiceFactory::GetForProfile(profile)->GetUserSettings();
 }
 
+SyncConsentScreen* GetScreen() {
+  return WizardController::default_controller()->GetScreen<SyncConsentScreen>();
+}
+
 class ConsentRecordedWaiter
     : public SyncConsentScreen::SyncConsentScreenTestDelegate {
  public:
@@ -137,9 +141,7 @@
   return sanitized_string;
 }
 
-class SyncConsentTest
-    : public OobeBaseTest,
-      public SyncConsentScreen::SyncConsentScreenExitTestDelegate {
+class SyncConsentTest : public OobeBaseTest {
  public:
   SyncConsentTest(const SyncConsentTest&) = delete;
   SyncConsentTest& operator=(const SyncConsentTest&) = delete;
@@ -174,16 +176,14 @@
           IDS_LOGIN_SYNC_CONSENT_SCREEN_ACCEPT_AND_CONTINUE);
     }
 
-    SyncConsentScreen::SetSyncConsentScreenExitTestDelegate(this);
+    // Exit result inspection
+    original_callback_ = GetScreen()->get_exit_callback_for_testing();
+    GetScreen()->set_exit_callback_for_testing(base::BindRepeating(
+        &SyncConsentTest::HandleScreenExit, base::Unretained(this)));
+
     SyncConsentScreen::SetProfileSyncDisabledByPolicyForTesting(false);
   }
 
-  void TearDownOnMainThread() override {
-    SyncConsentScreen::SetSyncConsentScreenExitTestDelegate(nullptr);
-
-    OobeBaseTest::TearDownOnMainThread();
-  }
-
   void SwitchLanguage(const std::string& language) {
     WelcomeScreen* welcome_screen =
         WizardController::default_controller()->GetScreen<WelcomeScreen>();
@@ -275,14 +275,11 @@
   }
 
  private:
-  // SyncConsentScreen::SyncConsentScreenExitTestDelegate
-  void OnSyncConsentScreenExit(
-      SyncConsentScreen::Result result,
-      SyncConsentScreen::ScreenExitCallback& original_callback) override {
+  void HandleScreenExit(SyncConsentScreen::Result result) {
     ASSERT_FALSE(screen_exited_);
     screen_exited_ = true;
     screen_result_ = result;
-    original_callback.Run(result);
+    original_callback_.Run(result);
     if (screen_exit_callback_)
       std::move(screen_exit_callback_).Run();
   }
@@ -304,6 +301,8 @@
   LoginManagerMixin login_manager_mixin_{&mixin_host_};
 
   std::unique_ptr<base::AutoReset<bool>> force_branded_build_;
+
+  SyncConsentScreen::ScreenExitCallback original_callback_;
 };
 
 IN_PROC_BROWSER_TEST_F(SyncConsentTest, SkippedNotBrandedBuild) {
diff --git a/chrome/browser/ash/login/screens/sync_consent_screen.cc b/chrome/browser/ash/login/screens/sync_consent_screen.cc
index 0e93812b..5b3e103 100644
--- a/chrome/browser/ash/login/screens/sync_consent_screen.cc
+++ b/chrome/browser/ash/login/screens/sync_consent_screen.cc
@@ -89,9 +89,6 @@
 std::optional<bool> sync_disabled_by_policy_for_test;
 std::optional<bool> sync_engine_initialized_for_test;
 
-SyncConsentScreen::SyncConsentScreenExitTestDelegate* test_exit_delegate_ =
-    nullptr;
-
 syncer::SyncService* GetSyncService(Profile* profile) {
   if (SyncServiceFactory::HasSyncService(profile))
     return SyncServiceFactory::GetForProfile(profile);
@@ -205,12 +202,7 @@
   bool sync_enabled = service && service->IsSyncFeatureEnabled() &&
                       service->GetUserSettings()->IsSyncEverythingEnabled();
   base::UmaHistogramBoolean("OOBE.SyncConsentScreen.SyncEnabled", sync_enabled);
-  if (test_exit_delegate_) {
-    CHECK_IS_TEST();
-    test_exit_delegate_->OnSyncConsentScreenExit(result, exit_callback_);
-  } else {
-    exit_callback_.Run(result);
-  }
+  exit_callback_.Run(result);
 }
 
 bool SyncConsentScreen::MaybeSkip(WizardContext& context) {
@@ -311,12 +303,6 @@
   test_delegate_ = delegate;
 }
 
-// static
-void SyncConsentScreen::SetSyncConsentScreenExitTestDelegate(
-    SyncConsentScreen::SyncConsentScreenExitTestDelegate* test_delegate) {
-  test_exit_delegate_ = test_delegate;
-}
-
 SyncConsentScreen::SyncConsentScreenTestDelegate*
 SyncConsentScreen::GetDelegateForTesting() const {
   return test_delegate_;
@@ -564,13 +550,7 @@
     syncer::UserSelectableOsTypeSet os_empty_set;
     sync_settings->SetSelectedOsTypes(/*sync_all_os_types=*/true, os_empty_set);
 
-    if (test_exit_delegate_) {
-      CHECK_IS_TEST();
-      test_exit_delegate_->OnSyncConsentScreenExit(Result::NEXT,
-                                                   exit_callback_);
-    } else {
-      exit_callback_.Run(Result::NEXT);
-    }
+    exit_callback_.Run(Result::NEXT);
 
     return;
   }
@@ -586,13 +566,7 @@
     sync_settings->SetSelectedOsTypes(/*sync_all_os_types=*/false,
                                       os_empty_set);
 
-    if (test_exit_delegate_) {
-      CHECK_IS_TEST();
-      test_exit_delegate_->OnSyncConsentScreenExit(Result::DECLINE,
-                                                   exit_callback_);
-    } else {
-      exit_callback_.Run(Result::DECLINE);
-    }
+    exit_callback_.Run(Result::DECLINE);
     return;
   }
   if (action_id == kUserActionLacrosCustom) {
@@ -636,14 +610,7 @@
     profile_->GetPrefs()->SetBoolean(settings::prefs::kSyncOsWallpaper,
                                      wallpaper_synced);
 
-    if (test_exit_delegate_) {
-      CHECK_IS_TEST();
-      test_exit_delegate_->OnSyncConsentScreenExit(Result::NEXT,
-                                                   exit_callback_);
-    } else {
-      exit_callback_.Run(Result::NEXT);
-    }
-
+    exit_callback_.Run(Result::NEXT);
     return;
   }
   BaseScreen::OnUserAction(args);
diff --git a/chrome/browser/ash/login/screens/sync_consent_screen.h b/chrome/browser/ash/login/screens/sync_consent_screen.h
index fd9f803..4ac5dcb 100644
--- a/chrome/browser/ash/login/screens/sync_consent_screen.h
+++ b/chrome/browser/ash/login/screens/sync_consent_screen.h
@@ -33,6 +33,7 @@
 class SyncConsentScreen : public BaseScreen,
                           public syncer::SyncServiceObserver {
  public:
+  using TView = SyncConsentScreenView;
   // These values are persisted to logs. Entries should not be renumbered and
   // numeric values should never be reused. Public for testing. See
   // GetSyncScreenBehavior() for documentation on each case.
@@ -79,15 +80,6 @@
         const std::string& consent_confirmation) = 0;
   };
 
-  class SyncConsentScreenExitTestDelegate {
-   public:
-    virtual ~SyncConsentScreenExitTestDelegate() = default;
-
-    virtual void OnSyncConsentScreenExit(
-        Result result,
-        ScreenExitCallback& original_callback) = 0;
-  };
-
   // Launches the sync consent settings dialog if the user requested to review
   // them after completing OOBE.
   static void MaybeLaunchSyncConsentSettings(Profile* profile);
@@ -100,6 +92,14 @@
 
   ~SyncConsentScreen() override;
 
+  void set_exit_callback_for_testing(const ScreenExitCallback& exit_callback) {
+    exit_callback_ = exit_callback;
+  }
+
+  const ScreenExitCallback& get_exit_callback_for_testing() {
+    return exit_callback_;
+  }
+
   // Inits `user_`, its `profile_` and `behavior_` before using the screen.
   void Init(const WizardContext& context);
 
@@ -141,10 +141,6 @@
       SyncConsentScreen::SyncConsentScreenTestDelegate* delegate);
   SyncConsentScreenTestDelegate* GetDelegateForTesting() const;
 
-  // When set, test callback will be called instead of the |exit_callback_|.
-  static void SetSyncConsentScreenExitTestDelegate(
-      SyncConsentScreenExitTestDelegate* test_delegate);
-
   // Test API
   // Returns true if profile sync is disabled by policy for test.
   bool IsProfileSyncDisabledByPolicyForTest() const;
diff --git a/chrome/browser/ash/policy/core/device_local_account_policy_broker.cc b/chrome/browser/ash/policy/core/device_local_account_policy_broker.cc
index 25c7b68f..1dc701b 100644
--- a/chrome/browser/ash/policy/core/device_local_account_policy_broker.cc
+++ b/chrome/browser/ash/policy/core/device_local_account_policy_broker.cc
@@ -101,9 +101,7 @@
 
 base::Value::Dict GetLacrosPrefsFromPolicy(
     const policy::PolicyMap& policy_map) {
-  extensions::ExtensionInstallForceListPolicyHandler policy_handler;
-  return policy_handler.GetLacrosPolicyDict(policy_map)
-      .value_or(base::Value::Dict());
+  return base::Value::Dict();
 }
 
 void SendExtensionsToAsh(
diff --git a/chrome/browser/ash/policy/skyvault/local_files_migration_manager.cc b/chrome/browser/ash/policy/skyvault/local_files_migration_manager.cc
index c60a136..b6f2172 100644
--- a/chrome/browser/ash/policy/skyvault/local_files_migration_manager.cc
+++ b/chrome/browser/ash/policy/skyvault/local_files_migration_manager.cc
@@ -490,7 +490,7 @@
   scheduling_timer_->Stop();
 
   if (coordinator_->IsRunning()) {
-    coordinator_->Stop();
+    coordinator_->Cancel();
   }
 
   notification_manager_->CloseAll();
diff --git a/chrome/browser/ash/policy/skyvault/local_files_migration_manager_browsertest.cc b/chrome/browser/ash/policy/skyvault/local_files_migration_manager_browsertest.cc
index 7007aa8b..c84dc86 100644
--- a/chrome/browser/ash/policy/skyvault/local_files_migration_manager_browsertest.cc
+++ b/chrome/browser/ash/policy/skyvault/local_files_migration_manager_browsertest.cc
@@ -333,7 +333,7 @@
     EXPECT_CALL(*coordinator.get(), Run(CloudProvider::kGoogleDrive, _,
                                         ExpectedDestinationDirName(), _))
         .Times(1);
-    EXPECT_CALL(*coordinator.get(), Stop).Times(1);
+    EXPECT_CALL(*coordinator.get(), Cancel).Times(1);
   }
 
   manager()->SetCoordinatorForTesting(std::move(coordinator));
@@ -370,7 +370,7 @@
     EXPECT_CALL(*coordinator.get(), Run(CloudProvider::kOneDrive, _,
                                         ExpectedDestinationDirName(), _))
         .Times(1);
-    EXPECT_CALL(*coordinator.get(), Stop).Times(1);
+    EXPECT_CALL(*coordinator.get(), Cancel).Times(1);
     EXPECT_CALL(*coordinator.get(), Run(CloudProvider::kGoogleDrive, _,
                                         ExpectedDestinationDirName(), _))
         .WillOnce([](CloudProvider cloud_provider,
@@ -417,7 +417,7 @@
     EXPECT_CALL(*coordinator.get(), Run(CloudProvider::kOneDrive, _,
                                         ExpectedDestinationDirName(), _))
         .Times(1);
-    EXPECT_CALL(*coordinator.get(), Stop).Times(1);
+    EXPECT_CALL(*coordinator.get(), Cancel).Times(1);
   }
 
   manager()->SetCoordinatorForTesting(std::move(coordinator));
diff --git a/chrome/browser/ash/policy/skyvault/local_files_migration_manager_unittest.cc b/chrome/browser/ash/policy/skyvault/local_files_migration_manager_unittest.cc
index 9407b44..0799fbc9 100644
--- a/chrome/browser/ash/policy/skyvault/local_files_migration_manager_unittest.cc
+++ b/chrome/browser/ash/policy/skyvault/local_files_migration_manager_unittest.cc
@@ -243,7 +243,7 @@
   coordinator->SetRunCallback(run_future.GetCallback());
   MockMigrationCoordinator* coordinator_ptr = coordinator.get();
   EXPECT_CALL(*coordinator_ptr, Run).Times(1);
-  EXPECT_CALL(*coordinator_ptr, Stop).Times(1);
+  EXPECT_CALL(*coordinator_ptr, Cancel).Times(1);
 
   SetPrefs(State::kInProgress);
 
diff --git a/chrome/browser/ash/policy/skyvault/migration_coordinator.cc b/chrome/browser/ash/policy/skyvault/migration_coordinator.cc
index 2d4daa1..979321e 100644
--- a/chrome/browser/ash/policy/skyvault/migration_coordinator.cc
+++ b/chrome/browser/ash/policy/skyvault/migration_coordinator.cc
@@ -7,7 +7,7 @@
 #include <memory>
 #include <optional>
 
-#include "base/check_is_test.h"
+#include "base/files/file_path.h"
 #include "base/functional/bind.h"
 #include "base/functional/callback.h"
 #include "base/functional/callback_helpers.h"
@@ -17,8 +17,10 @@
 #include "chrome/browser/ash/file_manager/io_task_controller.h"
 #include "chrome/browser/ash/file_manager/volume_manager.h"
 #include "chrome/browser/ash/policy/skyvault/drive_skyvault_uploader.h"
+#include "chrome/browser/ash/policy/skyvault/odfs_skyvault_uploader.h"
 #include "chrome/browser/ash/policy/skyvault/policy_utils.h"
 #include "chrome/browser/download/download_dir_util.h"
+#include "chrome/browser/profiles/profile.h"
 #include "storage/browser/file_system/file_system_url.h"
 
 namespace policy::local_user_files {
@@ -76,10 +78,10 @@
   uploader_->Run();
 }
 
-void MigrationCoordinator::Stop() {
+void MigrationCoordinator::Cancel() {
   if (uploader_) {
     MigrationCloudUploader* uploader_ptr = uploader_.get();
-    uploader_ptr->Stop(
+    uploader_ptr->Cancel(
         base::BindOnce(&OnMigrationStopped, std::move(uploader_)));
   }
 }
@@ -103,7 +105,7 @@
     : profile_(profile),
       files_(std::move(files)),
       destination_dir_(destination_dir),
-      callback_(std::move(callback)) {}
+      done_callback_(std::move(callback)) {}
 
 MigrationCloudUploader::~MigrationCloudUploader() = default;
 
@@ -121,8 +123,8 @@
 
 void OneDriveMigrationUploader::Run() {
   if (files_.empty()) {
-    if (callback_) {
-      std::move(callback_).Run({});
+    if (done_callback_) {
+      std::move(done_callback_).Run({});
     }
     return;
   }
@@ -140,18 +142,25 @@
         base::BindOnce(&OneDriveMigrationUploader::OnUploadDone,
                        weak_ptr_factory_.GetWeakPtr(), file_path),
         target_path);
-    uploaders_.insert({file_path, uploader});
+    uploaders_.insert({file_path, std::move(uploader)});
   }
 }
 
-void OneDriveMigrationUploader::Stop(base::OnceClosure callback) {
-  // TODO(b/349097807): Stop the uploads.
-  std::move(callback).Run();
-}
+void OneDriveMigrationUploader::Cancel(base::OnceClosure callback) {
+  cancelled_callback_ = std::move(callback);
+  cancelled_ = true;
 
-void OneDriveMigrationUploader::SetEmulateSlowForTesting(bool value) {
-  CHECK_IS_TEST();
-  emulate_slow_for_testing_ = value;
+  // Create a copy of the keys to iterate over. This is necessary because
+  // calling Cancel() on the uploader may trigger OnUploadDone(), which
+  // modifies the |uploaders_| map, potentially invalidating iterators.
+  std::vector<base::FilePath> file_paths;
+  for (const auto& uploader : uploaders_) {
+    file_paths.push_back(uploader.first);
+  }
+
+  for (const auto& path : file_paths) {
+    uploaders_[path]->Cancel();
+  }
 }
 
 void OneDriveMigrationUploader::OnUploadDone(
@@ -170,20 +179,25 @@
   }
 
   uploaders_.erase(file_path);
-  // If all files are done, invoke the callback.
-  if (ShouldFinish() && callback_) {
-    std::move(callback_).Run(std::move(errors_));
-  }
-}
 
-bool OneDriveMigrationUploader::ShouldFinish() {
-  if (emulate_slow_for_testing_) {
-    CHECK_IS_TEST();
-    // Do not run the callback.
-    return false;
+  if (!uploaders_.empty()) {
+    // Some files are still being uploaded.
+    return;
   }
-
-  return uploaders_.empty();
+  // If cancelled, invoke the cancelled callback.
+  if (cancelled_) {
+    if (cancelled_callback_) {
+      std::move(cancelled_callback_).Run();
+    } else {
+      LOG(WARNING) << "Cancelled callback not set.";
+    }
+    return;
+  }
+  if (done_callback_) {
+    std::move(done_callback_).Run(std::move(errors_));
+  } else {
+    LOG(WARNING) << "Done callback not set.";
+  }
 }
 
 GoogleDriveMigrationUploader::GoogleDriveMigrationUploader(
@@ -200,8 +214,8 @@
 
 void GoogleDriveMigrationUploader::Run() {
   if (files_.empty()) {
-    if (callback_) {
-      std::move(callback_).Run({});
+    if (done_callback_) {
+      std::move(done_callback_).Run({});
       return;
     }
   }
@@ -223,7 +237,7 @@
   }
 }
 
-void GoogleDriveMigrationUploader::Stop(base::OnceClosure callback) {
+void GoogleDriveMigrationUploader::Cancel(base::OnceClosure callback) {
   // TODO(b/349097807): Stop IO tasks.
   std::move(callback).Run();
 }
@@ -244,8 +258,8 @@
 
   uploaders_.erase(file_path);
   // If all files are done, invoke the callback.
-  if (uploaders_.empty() && callback_) {
-    std::move(callback_).Run(errors_);
+  if (uploaders_.empty() && done_callback_) {
+    std::move(done_callback_).Run(errors_);
   }
 }
 
diff --git a/chrome/browser/ash/policy/skyvault/migration_coordinator.h b/chrome/browser/ash/policy/skyvault/migration_coordinator.h
index 9f0dc65..04ad7af 100644
--- a/chrome/browser/ash/policy/skyvault/migration_coordinator.h
+++ b/chrome/browser/ash/policy/skyvault/migration_coordinator.h
@@ -45,8 +45,8 @@
                    const std::string& destination_dir,
                    MigrationDoneCallback callback);
 
-  // Stops any ongoing file uploads.
-  virtual void Stop();
+  // Cancels any ongoing file uploads.
+  virtual void Cancel();
 
   // Returns whether any file uploads are currently in progress.
   virtual bool IsRunning() const;
@@ -85,8 +85,8 @@
   // `callback_` upon completion.
   virtual void Run() = 0;
 
-  // Stops any ongoing file uploads.
-  virtual void Stop(base::OnceClosure stopped_callback) = 0;
+  // Cancels any ongoing file uploads.
+  virtual void Cancel(base::OnceClosure cancelled_callback) = 0;
 
  protected:
   // Maps file to their upload errors, if any.
@@ -99,7 +99,11 @@
   // The name of the destination directory.
   const std::string destination_dir_;
   // Callback to run after all uploads finish.
-  MigrationDoneCallback callback_;
+  MigrationDoneCallback done_callback_;
+  // Callback to run after all uploads are cancelled.
+  base::OnceClosure cancelled_callback_;
+  // Indicates that the upload was cancelled, e.g. by a policy change.
+  bool cancelled_ = false;
 };
 
 // Migration file uploader for uploads to Microsoft OneDrive.
@@ -116,10 +120,7 @@
 
   // MigrationCloudUploader overrides:
   void Run() override;
-  void Stop(base::OnceClosure stopped_callback) override;
-
-  // Used in tests to block the MigrationDoneCallback.
-  void SetEmulateSlowForTesting(bool value);
+  void Cancel(base::OnceClosure cancelled_callback) override;
 
  private:
   // Called when one upload operation completes.
@@ -127,9 +128,6 @@
                     storage::FileSystemURL url,
                     std::optional<MigrationUploadError> error);
 
-  // Whether MigrationDoneCallback should be run. Can only be false in tests.
-  bool ShouldFinish();
-
   // Maps source urls of files being uploaded to corresponding
   // OdfsSkyvaultUploader instances. Keeps a weak reference as lifetime of
   // OdfsSkyvaultUploader is managed by its action.
@@ -158,7 +156,7 @@
 
   // MigrationCloudUploader overrides:
   void Run() override;
-  void Stop(base::OnceClosure stopped_callback) override;
+  void Cancel(base::OnceClosure cancelled_callback) override;
 
  private:
   void OnUploadDone(const base::FilePath& file_path,
diff --git a/chrome/browser/ash/policy/skyvault/migration_coordinator_browsertest.cc b/chrome/browser/ash/policy/skyvault/migration_coordinator_browsertest.cc
index 75f22a6..419a532 100644
--- a/chrome/browser/ash/policy/skyvault/migration_coordinator_browsertest.cc
+++ b/chrome/browser/ash/policy/skyvault/migration_coordinator_browsertest.cc
@@ -5,24 +5,131 @@
 #include "chrome/browser/ash/policy/skyvault/migration_coordinator.h"
 
 #include "base/files/file_util.h"
+#include "base/functional/bind.h"
+#include "base/memory/raw_ptr.h"
+#include "base/memory/scoped_refptr.h"
 #include "base/path_service.h"
 #include "base/test/gmock_callback_support.h"
 #include "base/test/mock_callback.h"
 #include "base/test/test_future.h"
 #include "chrome/browser/ash/file_manager/volume_manager.h"
 #include "chrome/browser/ash/policy/skyvault/local_files_migration_constants.h"
+#include "chrome/browser/ash/policy/skyvault/odfs_skyvault_uploader.h"
 #include "chrome/browser/ash/policy/skyvault/policy_utils.h"
 #include "chrome/browser/ash/policy/skyvault/skyvault_test_base.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "content/public/test/browser_test.h"
+#include "storage/browser/file_system/file_system_url.h"
 
 namespace policy::local_user_files {
 
+namespace {
+class MockOdfsUploader : public ash::cloud_upload::OdfsMigrationUploader {
+ public:
+  static scoped_refptr<MockOdfsUploader> Create(
+      Profile* profile,
+      int64_t id,
+      const storage::FileSystemURL& file_system_url,
+      const base::FilePath& path,
+      base::RepeatingClosure run_callback) {
+    return new MockOdfsUploader(profile, id, file_system_url, path,
+                                std::move(run_callback));
+  }
+
+  MOCK_METHOD(void,
+              Run,
+              (base::OnceCallback<void(storage::FileSystemURL,
+                                       std::optional<MigrationUploadError>)>),
+              (override));
+
+  MOCK_METHOD(void, Cancel, (), (override));
+
+ private:
+  MockOdfsUploader(Profile* profile,
+                   int64_t id,
+                   const storage::FileSystemURL& file_system_url,
+                   const base::FilePath& target_path,
+                   base::RepeatingClosure run_callback)
+      : ash::cloud_upload::OdfsMigrationUploader(profile,
+                                                 id,
+                                                 file_system_url,
+                                                 target_path),
+        run_callback_(std::move(run_callback)),
+        file_system_url_(file_system_url) {
+    ON_CALL(*this, Run).WillByDefault([this](UploadDoneCallback callback) {
+      done_callback_ = std::move(callback);
+      if (run_callback_) {
+        run_callback_.Run();
+      }
+    });
+
+    ON_CALL(*this, Cancel).WillByDefault([this]() {
+      std::move(done_callback_)
+          .Run(file_system_url_, MigrationUploadError::kCancelled);
+    });
+  }
+
+  ~MockOdfsUploader() override = default;
+  // Called when Run() is invoked.
+  base::RepeatingClosure run_callback_;
+
+  UploadDoneCallback done_callback_;
+  storage::FileSystemURL file_system_url_;
+};
+
+}  // namespace
+
 using ::base::test::RunOnceCallback;
 
-using OneDriveMigrationCoordinatorTest = SkyvaultOneDriveTest;
+class OneDriveMigrationCoordinatorTest : public SkyvaultOneDriveTest {
+ public:
+  OneDriveMigrationCoordinatorTest() = default;
+
+  OneDriveMigrationCoordinatorTest(const OneDriveMigrationCoordinatorTest&) =
+      delete;
+  OneDriveMigrationCoordinatorTest& operator=(
+      const OneDriveMigrationCoordinatorTest&) = delete;
+
+  ~OneDriveMigrationCoordinatorTest() override = default;
+
+  void TearDown() override {
+    odfs_uploader_ = nullptr;
+    SkyvaultOneDriveTest::TearDown();
+  }
+
+ protected:
+  void SetMockOdfsUploader(base::RepeatingClosure run_callback) {
+    ash::cloud_upload::OdfsMigrationUploader::SetFactoryForTesting(
+        base::BindRepeating(
+            &OneDriveMigrationCoordinatorTest::CreateOdfsUploader,
+            base::Unretained(this), run_callback));
+  }
+
+  // Creates a mock version of OdfsMigrationUploader and stores a pointer to it.
+  // Note that if called multiple times (e.g. when the coordinator is uploading
+  // multiple files), only the last pointer is stored.
+  scoped_refptr<ash::cloud_upload::OdfsMigrationUploader> CreateOdfsUploader(
+      base::RepeatingClosure run_callback,
+      Profile* profile,
+      int64_t id,
+      const storage::FileSystemURL& file_system_url,
+      const base::FilePath& path) {
+    scoped_refptr<MockOdfsUploader> uploader = MockOdfsUploader::Create(
+        profile, id, file_system_url, path, std::move(run_callback));
+    odfs_uploader_ = uploader.get();
+    // Whenever an uploader is created, its Run method is immediately called:
+    EXPECT_CALL(*odfs_uploader_, Run).Times(1);
+    return std::move(uploader);
+  }
+
+  // Local pointer to the instance created by the factory method. Should be used
+  // for single file uploads, as only the last created pointer is stored.
+  // The lifetime is managed by the Upload method after which the instance is
+  // destroyed.
+  raw_ptr<MockOdfsUploader, DanglingUntriaged> odfs_uploader_ = nullptr;
+};
 
 IN_PROC_BROWSER_TEST_F(OneDriveMigrationCoordinatorTest, SuccessfulUpload) {
   SetUpMyFiles();
@@ -100,22 +207,26 @@
   ASSERT_TRUE(future.Get().empty());
 }
 
-IN_PROC_BROWSER_TEST_F(OneDriveMigrationCoordinatorTest, StopUpload) {
+IN_PROC_BROWSER_TEST_F(OneDriveMigrationCoordinatorTest, CancelUpload) {
   SetUpMyFiles();
   SetUpODFS();
+  // Ensure Run() is called before cancelling
+  base::test::TestFuture<void> run_future;
+  SetMockOdfsUploader(run_future.GetRepeatingCallback());
 
   const std::string test_file_name = "video_long.ogv";
   base::FilePath file_path = CopyTestFile(test_file_name, my_files_dir());
 
-  base::test::TestFuture<void> future;
-  // Create directly for more control over Run() and Stop().
-  OneDriveMigrationUploader uploader(profile(), {file_path},
-                                     kDestinationDirName, base::DoNothing());
-  // Ensure Run() doesn't finish before we call Stop().
-  uploader.SetEmulateSlowForTesting(true);
-  uploader.Run();
-  uploader.Stop(future.GetCallback());
-  ASSERT_TRUE(future.Wait());
+  MigrationCoordinator coordinator(profile());
+  coordinator.Run(CloudProvider::kOneDrive, {file_path}, kDestinationDirName,
+                  base::DoNothing());
+
+  // The uploader is only created during the Run call. At this point, its Run
+  // method has also already been called
+  ASSERT_TRUE(run_future.Wait());
+  EXPECT_TRUE(odfs_uploader_);
+  EXPECT_CALL(*odfs_uploader_, Cancel).Times(1);
+  coordinator.Cancel();
 
   // Check that the source file has NOT been moved to OneDrive.
   CheckPathNotFoundOnODFS(base::FilePath("/").AppendASCII(test_file_name));
diff --git a/chrome/browser/ash/policy/skyvault/odfs_skyvault_uploader.cc b/chrome/browser/ash/policy/skyvault/odfs_skyvault_uploader.cc
index 5b278d3..9cbde18 100644
--- a/chrome/browser/ash/policy/skyvault/odfs_skyvault_uploader.cc
+++ b/chrome/browser/ash/policy/skyvault/odfs_skyvault_uploader.cc
@@ -6,6 +6,7 @@
 
 #include <optional>
 
+#include "base/check_is_test.h"
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/functional/callback_helpers.h"
@@ -24,6 +25,9 @@
 
 namespace {
 
+OdfsMigrationUploader::FactoryCallback g_testing_factory_ =
+    OdfsMigrationUploader::FactoryCallback();
+
 // Runs the upload callback provided to `OdfsSkyvaultUploader::Upload`.
 void OnUploadDone(
     scoped_refptr<OdfsSkyvaultUploader> odfs_skyvault_uploader,
@@ -336,9 +340,19 @@
     int64_t id,
     const storage::FileSystemURL& file_system_url,
     const base::FilePath& target_path) {
+  if (g_testing_factory_) {
+    CHECK_IS_TEST();
+    return g_testing_factory_.Run(profile, id, file_system_url, target_path);
+  }
   return new OdfsMigrationUploader(profile, id, file_system_url, target_path);
 }
 
+// static
+void OdfsMigrationUploader::SetFactoryForTesting(FactoryCallback factory) {
+  CHECK_IS_TEST();
+  g_testing_factory_ = factory;
+}
+
 OdfsMigrationUploader::OdfsMigrationUploader(
     Profile* profile,
     int64_t id,
diff --git a/chrome/browser/ash/policy/skyvault/odfs_skyvault_uploader.h b/chrome/browser/ash/policy/skyvault/odfs_skyvault_uploader.h
index 223b8674..89bc7c9 100644
--- a/chrome/browser/ash/policy/skyvault/odfs_skyvault_uploader.h
+++ b/chrome/browser/ash/policy/skyvault/odfs_skyvault_uploader.h
@@ -87,7 +87,7 @@
   base::WeakPtr<OdfsSkyvaultUploader> GetWeakPtr();
 
   // Should cancel the whole upload, if possible.
-  void Cancel();
+  virtual void Cancel();
 
  protected:
   OdfsSkyvaultUploader(Profile* profile,
@@ -106,14 +106,14 @@
   virtual void RequestSignIn(
       base::OnceCallback<void(base::File::Error)> on_sign_in_cb);
 
+  // Starts the upload flow.
+  virtual void Run(UploadDoneCallback upload_callback);
+
   raw_ptr<Profile> profile_;
 
  private:
   friend base::RefCounted<OdfsSkyvaultUploader>;
 
-  // Starts the upload flow.
-  void Run(UploadDoneCallback upload_callback);
-
   void OnEndUpload(storage::FileSystemURL url,
                    std::optional<MigrationUploadError> error = std::nullopt);
 
@@ -173,19 +173,30 @@
 // TODO(aidazolic): Fix the instantiation.
 class OdfsMigrationUploader : public OdfsSkyvaultUploader {
  public:
+  using FactoryCallback =
+      base::RepeatingCallback<scoped_refptr<OdfsMigrationUploader>(
+          Profile* profile,
+          int64_t id,
+          const storage::FileSystemURL& file_system_url,
+          const base::FilePath& target_path)>;
   static scoped_refptr<OdfsMigrationUploader> Create(
       Profile* profile,
       int64_t id,
       const storage::FileSystemURL& file_system_url,
       const base::FilePath& target_path);
 
- private:
+  // Sets a testing factory function, allowing the injection of mock
+  // OdfsMigrationUploader objects into the migration upload process.
+  static void SetFactoryForTesting(FactoryCallback factory);
+
+ protected:
   OdfsMigrationUploader(Profile* profile,
                         int64_t id,
                         const storage::FileSystemURL& file_system_url,
                         const base::FilePath& target_path);
   ~OdfsMigrationUploader() override;
 
+ private:
   // OdfsSkyvaultUploader:
   base::FilePath GetDestinationFolderPath(
       file_system_provider::ProvidedFileSystemInterface* file_system) override;
diff --git a/chrome/browser/ash/policy/skyvault/test/skyvault_test_utils.cc b/chrome/browser/ash/policy/skyvault/test/skyvault_test_utils.cc
index 9516b04..08f4ec8 100644
--- a/chrome/browser/ash/policy/skyvault/test/skyvault_test_utils.cc
+++ b/chrome/browser/ash/policy/skyvault/test/skyvault_test_utils.cc
@@ -42,7 +42,7 @@
                 base::Minutes(5));  // Delay 5 minutes
       });
 
-  ON_CALL(*this, Stop).WillByDefault([this]() { is_running_ = false; });
+  ON_CALL(*this, Cancel).WillByDefault([this]() { is_running_ = false; });
 }
 
 MockMigrationCoordinator::~MockMigrationCoordinator() = default;
diff --git a/chrome/browser/ash/policy/skyvault/test/skyvault_test_utils.h b/chrome/browser/ash/policy/skyvault/test/skyvault_test_utils.h
index 85b2de6..ed5c87e 100644
--- a/chrome/browser/ash/policy/skyvault/test/skyvault_test_utils.h
+++ b/chrome/browser/ash/policy/skyvault/test/skyvault_test_utils.h
@@ -76,7 +76,7 @@
                const std::string& destination_dir,
                MigrationDoneCallback callback),
               (override));
-  MOCK_METHOD(void, Stop, (), (override));
+  MOCK_METHOD(void, Cancel, (), (override));
 
   // Sets a callback to be invoked when Run() is called.
   void SetRunCallback(base::OnceClosure run_cb);
diff --git a/chrome/browser/extensions/BUILD.gn b/chrome/browser/extensions/BUILD.gn
index 3d540e9a..2d8f779 100644
--- a/chrome/browser/extensions/BUILD.gn
+++ b/chrome/browser/extensions/BUILD.gn
@@ -1133,7 +1133,7 @@
     }
   }
 
-  if (is_chromeos_ash) {
+  if (is_chromeos) {
     sources += [
       "api/file_handlers/non_native_file_system_delegate_chromeos.cc",
       "api/file_handlers/non_native_file_system_delegate_chromeos.h",
@@ -1578,9 +1578,7 @@
       "api/document_scan/document_scan_test_utils.cc",
       "api/document_scan/document_scan_test_utils.h",
     ]
-  }
 
-  if (is_chromeos_ash) {
     deps += [ "//components/user_manager:test_support" ]
   }
 }
diff --git a/chrome/browser/extensions/account_extension_tracker_unittest.cc b/chrome/browser/extensions/account_extension_tracker_unittest.cc
index 6801efa..cc808e3 100644
--- a/chrome/browser/extensions/account_extension_tracker_unittest.cc
+++ b/chrome/browser/extensions/account_extension_tracker_unittest.cc
@@ -137,7 +137,7 @@
             GetAccountExtensionType(external_extension->id()));
 }
 
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
 TEST_F(AccountExtensionTrackerUnitTest,
        AccountExtensionTypeResetWhenSignedOut) {
   // Enable extension syncing in transport mode.
@@ -174,6 +174,6 @@
   EXPECT_EQ(AccountExtensionTracker::AccountExtensionType::kLocal,
             GetAccountExtensionType(kGoodCrx));
 }
-#endif  // !BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // !BUILDFLAG(IS_CHROMEOS)
 
 }  // namespace extensions
diff --git a/chrome/browser/extensions/activity_log/counting_policy_unittest.cc b/chrome/browser/extensions/activity_log/counting_policy_unittest.cc
index 498e09f..59730a6 100644
--- a/chrome/browser/extensions/activity_log/counting_policy_unittest.cc
+++ b/chrome/browser/extensions/activity_log/counting_policy_unittest.cc
@@ -39,7 +39,7 @@
 #include "sql/statement.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/ash/login/users/user_manager_delegate_impl.h"
 #include "chrome/browser/ash/settings/scoped_cros_settings_test_helper.h"
 #include "chrome/browser/browser_process.h"
@@ -65,7 +65,7 @@
   }
 
   ~CountingPolicyTest() override {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
     user_manager_.Reset();
 #endif
     base::RunLoop().RunUntilIdle();
@@ -387,7 +387,7 @@
   std::unique_ptr<TestingProfile> profile_;
   content::BrowserTaskEnvironment task_environment_;
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   ash::ScopedCrosSettingsTestHelper cros_settings_test_helper_;
   user_manager::ScopedUserManager user_manager_{
       std::make_unique<user_manager::UserManagerImpl>(
diff --git a/chrome/browser/extensions/activity_log/fullstream_ui_policy_unittest.cc b/chrome/browser/extensions/activity_log/fullstream_ui_policy_unittest.cc
index c556761a..5850018 100644
--- a/chrome/browser/extensions/activity_log/fullstream_ui_policy_unittest.cc
+++ b/chrome/browser/extensions/activity_log/fullstream_ui_policy_unittest.cc
@@ -36,7 +36,7 @@
 #include "extensions/common/extension_builder.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/ash/login/users/user_manager_delegate_impl.h"
 #include "chrome/browser/ash/settings/scoped_cros_settings_test_helper.h"
 #include "chrome/browser/browser_process.h"
@@ -66,7 +66,7 @@
   }
 
   ~FullStreamUIPolicyTest() override {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
     user_manager_.Reset();
 #endif
     base::RunLoop().RunUntilIdle();
@@ -332,7 +332,7 @@
   std::unique_ptr<TestingProfile> profile_;
   content::BrowserTaskEnvironment task_environment_;
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   ash::ScopedCrosSettingsTestHelper cros_settings_test_helper_;
   user_manager::ScopedUserManager user_manager_{
       std::make_unique<user_manager::UserManagerImpl>(
diff --git a/chrome/browser/extensions/api/BUILD.gn b/chrome/browser/extensions/api/BUILD.gn
index d30244c9b..665b3959 100644
--- a/chrome/browser/extensions/api/BUILD.gn
+++ b/chrome/browser/extensions/api/BUILD.gn
@@ -70,21 +70,16 @@
   if (is_chromeos) {
     public_deps += [
       "//chrome/browser/chromeos/extensions/smart_card_provider_private",
+      "//chrome/browser/extensions/api/crash_report_private",
       "//chrome/browser/extensions/api/document_scan",
       "//chrome/browser/extensions/api/enterprise_device_attributes",
       "//chrome/browser/extensions/api/enterprise_kiosk_input",
       "//chrome/browser/extensions/api/enterprise_networking_attributes",
       "//chrome/browser/extensions/api/enterprise_platform_keys",
-      "//chrome/browser/extensions/api/platform_keys",
-      "//chrome/browser/extensions/api/shared_storage",
-    ]
-  }
-
-  if (is_chromeos_ash) {
-    public_deps += [
-      "//chrome/browser/extensions/api/crash_report_private",
       "//chrome/browser/extensions/api/enterprise_platform_keys_private",
       "//chrome/browser/extensions/api/input_ime",
+      "//chrome/browser/extensions/api/platform_keys",
+      "//chrome/browser/extensions/api/shared_storage",
     ]
   }
 }
@@ -129,11 +124,14 @@
     "//ui/accessibility:ax_enums_mojo",
   ]
 
-  # TODO: We should pull these out into a separate build and function generation
-  # step so that //chrome/browser/extensions has fewer dependencies on
-  # //chrome/browser/chromeos.
   if (is_chromeos) {
     deps += [
+      "//chrome/browser/ash/extensions/autotest_private",
+      "//chrome/browser/ash/extensions/file_manager",
+
+      # TODO: We should pull these out into a separate build and function
+      # generation step so that //chrome/browser/extensions has fewer
+      # dependencies on //chrome/browser/chromeos.
       "//chrome/browser/chromeos/extensions:constants",
       "//chrome/browser/chromeos/extensions/accessibility_service_private",
       "//chrome/browser/chromeos/extensions/info_private",
@@ -142,13 +140,6 @@
       "//chrome/browser/chromeos/extensions/wallpaper",
     ]
   }
-
-  if (is_chromeos_ash) {
-    deps += [
-      "//chrome/browser/ash/extensions/autotest_private",
-      "//chrome/browser/ash/extensions/file_manager",
-    ]
-  }
 }
 
 # KeyedService factories initialization.
diff --git a/chrome/browser/extensions/api/api_browser_context_keyed_service_factories.cc b/chrome/browser/extensions/api/api_browser_context_keyed_service_factories.cc
index 3266aa32..2ad115b 100644
--- a/chrome/browser/extensions/api/api_browser_context_keyed_service_factories.cc
+++ b/chrome/browser/extensions/api/api_browser_context_keyed_service_factories.cc
@@ -49,18 +49,11 @@
 #if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/chromeos/extensions/wm/wm_desks_private_events.h"
 #include "chrome/browser/extensions/api/document_scan/document_scan_api_handler.h"
-#endif
-
-#if BUILDFLAG(IS_CHROMEOS_ASH)
 #include "chrome/browser/extensions/api/input_ime/input_ime_api.h"
 #include "chrome/browser/extensions/api/platform_keys/verify_trust_api.h"
 #include "chrome/browser/extensions/api/terminal/terminal_private_api.h"
 #endif
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-#include "chrome/browser/extensions/api/image_writer_private/image_writer_controller_lacros.h"
-#endif
-
 #if BUILDFLAG(ENABLE_SERVICE_DISCOVERY)
 #include "chrome/browser/extensions/api/mdns/mdns_api.h"
 #endif
@@ -88,17 +81,14 @@
   extensions::FontSettingsAPI::GetFactoryInstance();
   extensions::HistoryAPI::GetFactoryInstance();
   extensions::IdentityAPI::GetFactoryInstance();
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  extensions::image_writer::ImageWriterControllerLacros::GetFactoryInstance();
-#endif
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   extensions::InputImeAPI::GetFactoryInstance();
 #endif
   extensions::LanguageSettingsPrivateDelegateFactory::GetInstance();
 #if BUILDFLAG(ENABLE_SERVICE_DISCOVERY)
   extensions::MDnsAPI::GetFactoryInstance();
 #endif
-#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC)
+#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC)
   auto networking_private_ui_delegate_factory =
       std::make_unique<extensions::NetworkingPrivateUIDelegateFactoryImpl>();
   extensions::NetworkingPrivateDelegateFactory::GetInstance()
@@ -124,10 +114,8 @@
   extensions::TabGroupsEventRouterFactory::GetInstance();
   extensions::TabCaptureRegistry::GetFactoryInstance();
   extensions::TabsWindowsAPI::GetFactoryInstance();
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   extensions::TerminalPrivateAPI::GetFactoryInstance();
-#endif
-#if BUILDFLAG(IS_CHROMEOS_ASH)
   extensions::VerifyTrustAPI::GetFactoryInstance();
 #endif
   extensions::WebAuthenticationProxyAPI::GetFactoryInstance();
diff --git a/chrome/browser/extensions/api/automation/automation_apitest.cc b/chrome/browser/extensions/api/automation/automation_apitest.cc
index 94018ce..d4546e8 100644
--- a/chrome/browser/extensions/api/automation/automation_apitest.cc
+++ b/chrome/browser/extensions/api/automation/automation_apitest.cc
@@ -49,7 +49,7 @@
 #include "ui/base/accelerators/accelerator.h"
 #include "ui/display/display_switches.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "ash/public/cpp/accelerators.h"
 #include "ash/public/cpp/test/shell_test_api.h"
 #include "chrome/browser/ui/aura/accessibility/automation_manager_aura.h"
@@ -578,7 +578,7 @@
 }
 #endif  // !defined(USE_AURA)
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 class AutomationApiFencedFrameTest : public AutomationApiTest {
  protected:
   AutomationApiFencedFrameTest() {
@@ -914,18 +914,11 @@
                                         kPermissionsWindows))
       << message_;
 }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 #if BUILDFLAG(IS_CHROMEOS)
-// TODO(crbug.com/40766689) Flaky on lacros
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-#define MAYBE_HitTestMultipleWindows DISABLED_HitTestMultipleWindows
-#else
-#define MAYBE_HitTestMultipleWindows HitTestMultipleWindows
-#endif
-
 IN_PROC_BROWSER_TEST_P(AutomationApiTestWithContextType,
-                       MAYBE_HitTestMultipleWindows) {
+                       HitTestMultipleWindows) {
   StartEmbeddedTestServer();
   ASSERT_TRUE(CreateExtensionAndRunTest("desktop/hit_test_multiple_windows.js",
                                         kPermissionsWindows))
diff --git a/chrome/browser/extensions/api/automation_internal/chrome_automation_internal_api_delegate.cc b/chrome/browser/extensions/api/automation_internal/chrome_automation_internal_api_delegate.cc
index 91cdbbe9..22f1628 100644
--- a/chrome/browser/extensions/api/automation_internal/chrome_automation_internal_api_delegate.cc
+++ b/chrome/browser/extensions/api/automation_internal/chrome_automation_internal_api_delegate.cc
@@ -27,7 +27,7 @@
 #include "chrome/browser/ui/aura/accessibility/automation_manager_aura.h"
 #endif
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/ash/crosapi/automation_ash.h"
 #include "chrome/browser/ash/crosapi/crosapi_ash.h"
 #include "chrome/browser/ash/crosapi/crosapi_manager.h"
@@ -59,7 +59,7 @@
 
 bool ChromeAutomationInternalApiDelegate::EnableTree(
     const ui::AXTreeID& tree_id) {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // CrosapiManager may not be initialized on unit testing.
   // Propagate the EnableTree signal to crosapi clients.
   if (crosapi::CrosapiManager::IsInitialized()) {
@@ -77,7 +77,7 @@
 }
 
 void ChromeAutomationInternalApiDelegate::EnableDesktop() {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // CrosapiManager may not be initialized on unit testing.
   // Propagate the EnableDesktop signal to crosapi clients.
   if (crosapi::CrosapiManager::IsInitialized()) {
diff --git a/chrome/browser/extensions/api/braille_display_private/braille_display_private_api.cc b/chrome/browser/extensions/api/braille_display_private/braille_display_private_api.cc
index 20b2a47..bcc51f8c 100644
--- a/chrome/browser/extensions/api/braille_display_private/braille_display_private_api.cc
+++ b/chrome/browser/extensions/api/braille_display_private/braille_display_private_api.cc
@@ -13,7 +13,7 @@
 #include "chrome/browser/extensions/api/braille_display_private/braille_controller.h"
 #include "chrome/browser/profiles/profile.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/ash/accessibility/accessibility_manager.h"
 #include "chrome/browser/ash/login/lock/screen_locker.h"
 #include "chrome/browser/profiles/profile_manager.h"
@@ -86,12 +86,12 @@
 }
 
 bool BrailleDisplayPrivateAPI::IsProfileActive() {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // Since we are creating one instance per profile / user, we should be fine
   // comparing against the active user. That said - if we ever change that,
   // this code will need to be changed.
   return profile_->IsSameOrParent(ProfileManager::GetActiveUserProfile());
-#else  // !BUILDFLAG(IS_CHROMEOS_ASH)
+#else  // !BUILDFLAG(IS_CHROMEOS)
   return true;
 #endif
 }
@@ -191,7 +191,7 @@
 
 ExtensionFunction::ResponseAction
 BrailleDisplayPrivateUpdateBluetoothBrailleDisplayAddressFunction::Run() {
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
   NOTREACHED_IN_MIGRATION();
   return RespondNow(Error("Unsupported on this platform."));
 #else
diff --git a/chrome/browser/extensions/api/braille_display_private/brlapi_connection.cc b/chrome/browser/extensions/api/braille_display_private/brlapi_connection.cc
index c1525a3..db3614c 100644
--- a/chrome/browser/extensions/api/braille_display_private/brlapi_connection.cc
+++ b/chrome/browser/extensions/api/braille_display_private/brlapi_connection.cc
@@ -32,7 +32,7 @@
 // TODO(plundblad): Find a way to detect the controlling terminal of the
 // X server.
 static const int kDefaultTtyLinux = 7;
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 // The GUI is always running on vt1 in Chrome OS.
 static const int kDefaultTtyChromeOS = 1;
 #endif
@@ -85,7 +85,7 @@
   }
   int path[2] = {0, 0};
   int pathElements = 0;
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   if (base::SysInfo::IsRunningOnChromeOS())
     path[pathElements++] = kDefaultTtyChromeOS;
 #endif
diff --git a/chrome/browser/extensions/api/certificate_provider/certificate_provider_apitest.cc b/chrome/browser/extensions/api/certificate_provider/certificate_provider_apitest.cc
index 2d82c7e2..d1e1ee1 100644
--- a/chrome/browser/extensions/api/certificate_provider/certificate_provider_apitest.cc
+++ b/chrome/browser/extensions/api/certificate_provider/certificate_provider_apitest.cc
@@ -89,10 +89,6 @@
 #include "ui/views/widget/widget.h"
 #include "ui/views/widget/widget_observer.h"
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-#include "chrome/browser/lacros/cert/cert_db_initializer_factory.h"
-#endif
-
 using testing::Return;
 using testing::_;
 
@@ -321,15 +317,6 @@
 class CertificateProviderApiMockedExtensionTest
     : public CertificateProviderApiTest {
  public:
-  void SetUpInProcessBrowserTestFixture() override {
-#if BUILDFLAG(IS_CHROMEOS_LACROS)  // Needed for ClientCertStoreLacros
-    CertDbInitializerFactory::GetInstance()
-        ->SetCreateWithBrowserContextForTesting(
-            /*should_create=*/true);
-#endif
-    CertificateProviderApiTest::SetUpInProcessBrowserTestFixture();
-  }
-
   void SetUpOnMainThread() override {
     CertificateProviderApiTest::SetUpOnMainThread();
 
diff --git a/chrome/browser/extensions/api/chrome_extensions_api_client.cc b/chrome/browser/extensions/api/chrome_extensions_api_client.cc
index d1efdcb1..66ea000f 100644
--- a/chrome/browser/extensions/api/chrome_extensions_api_client.cc
+++ b/chrome/browser/extensions/api/chrome_extensions_api_client.cc
@@ -74,7 +74,7 @@
 #include "ui/base/window_open_disposition.h"
 #include "url/gurl.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/extensions/api/file_handlers/non_native_file_system_delegate_chromeos.h"
 #include "chrome/browser/extensions/api/file_system/chrome_file_system_delegate_ash.h"
 #include "chrome/browser/extensions/api/media_perception_private/media_perception_api_delegate_chromeos.h"
@@ -82,13 +82,6 @@
 #include "chromeos/ash/components/settings/cros_settings.h"
 #endif
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-#include "chrome/browser/extensions/api/file_system/chrome_file_system_delegate_lacros.h"
-#include "chrome/browser/extensions/api/virtual_keyboard_private/lacros_virtual_keyboard_delegate.h"
-#include "chromeos/crosapi/mojom/device_settings_service.mojom.h"
-#include "chromeos/startup/browser_params_proxy.h"
-#endif
-
 #if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/extensions/clipboard_extension_helper_chromeos.h"
 #endif
@@ -361,7 +354,6 @@
 #if BUILDFLAG(IS_CHROMEOS)
 bool ChromeExtensionsAPIClient::ShouldAllowDetachingUsb(int vid,
                                                         int pid) const {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
   const base::Value::List* policy_list;
   if (ash::CrosSettings::Get()->GetList(ash::kUsbDetachableAllowlist,
                                         &policy_list)) {
@@ -374,20 +366,7 @@
       }
     }
   }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  const crosapi::mojom::DeviceSettings* device_settings =
-      chromeos::BrowserParamsProxy::Get()->DeviceSettings().get();
-  if (device_settings && device_settings->usb_detachable_allow_list) {
-    for (const auto& entry :
-         device_settings->usb_detachable_allow_list->usb_device_ids) {
-      if (entry->has_vendor_id && entry->vendor_id == vid &&
-          entry->has_product_id && entry->product_id == pid) {
-        return true;
-      }
-    }
-  }
-#endif
+
   return false;
 }
 #endif  // BUILDFLAG(IS_CHROMEOS)
@@ -395,10 +374,8 @@
 std::unique_ptr<VirtualKeyboardDelegate>
 ChromeExtensionsAPIClient::CreateVirtualKeyboardDelegate(
     content::BrowserContext* browser_context) const {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   return std::make_unique<ChromeVirtualKeyboardDelegate>(browser_context);
-#elif BUILDFLAG(IS_CHROMEOS_LACROS)
-  return std::make_unique<LacrosVirtualKeyboardDelegate>();
 #else
   return nullptr;
 #endif
@@ -429,10 +406,8 @@
 }
 
 FileSystemDelegate* ChromeExtensionsAPIClient::GetFileSystemDelegate() {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   using ChromeFileSystemDelegate_Use = ChromeFileSystemDelegateAsh;
-#elif BUILDFLAG(IS_CHROMEOS_LACROS)
-  using ChromeFileSystemDelegate_Use = ChromeFileSystemDelegateLacros;
 #else
   using ChromeFileSystemDelegate_Use = ChromeFileSystemDelegate;
 #endif
@@ -456,7 +431,7 @@
   return feedback_private_delegate_.get();
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 MediaPerceptionAPIDelegate*
 ChromeExtensionsAPIClient::GetMediaPerceptionAPIDelegate() {
   if (!media_perception_api_delegate_) {
@@ -474,9 +449,7 @@
   }
   return non_native_file_system_delegate_.get();
 }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
-#if BUILDFLAG(IS_CHROMEOS)
 void ChromeExtensionsAPIClient::SaveImageDataToClipboard(
     std::vector<uint8_t> image_data,
     api::clipboard::ImageType type,
diff --git a/chrome/browser/extensions/api/chrome_extensions_api_client.h b/chrome/browser/extensions/api/chrome_extensions_api_client.h
index a231ecd..5d88d15 100644
--- a/chrome/browser/extensions/api/chrome_extensions_api_client.h
+++ b/chrome/browser/extensions/api/chrome_extensions_api_client.h
@@ -90,10 +90,10 @@
   MessagingDelegate* GetMessagingDelegate() override;
   FeedbackPrivateDelegate* GetFeedbackPrivateDelegate() override;
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   MediaPerceptionAPIDelegate* GetMediaPerceptionAPIDelegate() override;
   NonNativeFileSystemDelegate* GetNonNativeFileSystemDelegate() override;
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 #if BUILDFLAG(IS_CHROMEOS)
   void SaveImageDataToClipboard(
@@ -113,7 +113,7 @@
   std::unique_ptr<MessagingDelegate> messaging_delegate_;
   std::unique_ptr<FeedbackPrivateDelegate> feedback_private_delegate_;
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   std::unique_ptr<MediaPerceptionAPIDelegate> media_perception_api_delegate_;
   std::unique_ptr<NonNativeFileSystemDelegate> non_native_file_system_delegate_;
 #endif
diff --git a/chrome/browser/extensions/api/chromeos_api_browser_context_keyed_service_factories.cc b/chrome/browser/extensions/api/chromeos_api_browser_context_keyed_service_factories.cc
index 1531d08..72a2bf58 100644
--- a/chrome/browser/extensions/api/chromeos_api_browser_context_keyed_service_factories.cc
+++ b/chrome/browser/extensions/api/chromeos_api_browser_context_keyed_service_factories.cc
@@ -14,7 +14,7 @@
 #include "chrome/browser/chromeos/platform_keys/extension_platform_keys_service_factory.h"
 #include "printing/buildflags/buildflags.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/ash/crostini/throttle/crostini_throttle.h"
 #include "chrome/browser/ash/extensions/autotest_private/autotest_private_api.h"
 #include "chrome/browser/ash/extensions/install_limiter_factory.h"
@@ -34,14 +34,14 @@
   chromeos::DeskApiExtensionManagerFactory::GetInstance();
   chromeos::ExtensionPlatformKeysServiceFactory::GetInstance();
   chromeos::VpnServiceFactory::GetInstance();
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   extensions::AutotestPrivateAPI::GetFactoryInstance();
   extensions::ExternalLogoutDoneEventHandlerFactory::GetInstance();
 #endif
   extensions::ExternalLogoutRequestEventHandlerFactory::GetInstance();
   extensions::file_system_provider::ServiceWorkerLifetimeManagerFactory::
       GetInstance();
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   extensions::InstallLimiterFactory::GetInstance();
 #endif
 #if BUILDFLAG(USE_CUPS)
@@ -49,7 +49,7 @@
 #endif
   extensions::SessionStateChangedEventDispatcher::GetFactoryInstance();
   extensions::SmartCardProviderPrivateAPI::GetFactoryInstance();
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   extensions::SpeechRecognitionPrivateManagerFactory::GetInstance();
   extensions::UsersPrivateDelegateFactory::GetInstance();
 #endif
diff --git a/chrome/browser/extensions/api/context_menus/extension_context_menu_browsertest.cc b/chrome/browser/extensions/api/context_menus/extension_context_menu_browsertest.cc
index 1e83487..755a4998 100644
--- a/chrome/browser/extensions/api/context_menus/extension_context_menu_browsertest.cc
+++ b/chrome/browser/extensions/api/context_menus/extension_context_menu_browsertest.cc
@@ -48,7 +48,7 @@
 #include "net/dns/mock_host_resolver.h"
 #include "ui/base/models/menu_model.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "ash/wm/window_pin_util.h"
 #endif
 
@@ -656,27 +656,27 @@
   //  normal3
 
   size_t index = 0;
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   ASSERT_EQ(7u, menu.GetItemCount());
 #else
   ASSERT_EQ(11u, menu.GetItemCount());
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
   ExpectLabelAndType("radio1", MenuModel::TYPE_RADIO, menu, index++);
   ExpectLabelAndType("radio2", MenuModel::TYPE_RADIO, menu, index++);
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
   EXPECT_EQ(MenuModel::TYPE_SEPARATOR, menu.GetTypeAt(index++));
 #endif  // !BUILDFLAG(IS_CHROMEOS)
   ExpectLabelAndType("normal1", MenuModel::TYPE_COMMAND, menu, index++);
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
   EXPECT_EQ(MenuModel::TYPE_SEPARATOR, menu.GetTypeAt(index++));
 #endif  // !BUILDFLAG(IS_CHROMEOS)
   ExpectLabelAndType("normal2", MenuModel::TYPE_COMMAND, menu, index++);
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
   EXPECT_EQ(MenuModel::TYPE_SEPARATOR, menu.GetTypeAt(index++));
 #endif  // !BUILDFLAG(IS_CHROMEOS)
   ExpectLabelAndType("radio3", MenuModel::TYPE_RADIO, menu, index++);
   ExpectLabelAndType("radio4", MenuModel::TYPE_RADIO, menu, index++);
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
   EXPECT_EQ(MenuModel::TYPE_SEPARATOR, menu.GetTypeAt(index++));
 #endif  // !BUILDFLAG(IS_CHROMEOS)
   ExpectLabelAndType("normal3", MenuModel::TYPE_COMMAND, menu, index++);
@@ -977,7 +977,7 @@
                                 false);
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 // Extension context menu tests in locked fullscreen when locked and not locked
 // for OnTask. Only relevant for non-web browser scenarios.
 class ExtensionContextMenuLockedFullscreenTest
diff --git a/chrome/browser/extensions/api/debugger/debugger_apitest.cc b/chrome/browser/extensions/api/debugger/debugger_apitest.cc
index 957d714..915ec62 100644
--- a/chrome/browser/extensions/api/debugger/debugger_apitest.cc
+++ b/chrome/browser/extensions/api/debugger/debugger_apitest.cc
@@ -72,9 +72,9 @@
 #include "pdf/pdf_features.h"
 #endif  // BUILDFLAG(ENABLE_PDF)
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/ash/profiles/profile_helper.h"
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 namespace extensions {
 
@@ -651,9 +651,9 @@
 
  private:
   void SetUpOnMainThread() override {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
     ash::ProfileHelper::SetAlwaysReturnPrimaryUserForTesting(true);
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
     DebuggerApiTest::SetUpOnMainThread();
     profile_manager_ = g_browser_process->profile_manager();
 
diff --git a/chrome/browser/extensions/api/declarative_content/declarative_content_apitest.cc b/chrome/browser/extensions/api/declarative_content/declarative_content_apitest.cc
index e8532fc..ba957243 100644
--- a/chrome/browser/extensions/api/declarative_content/declarative_content_apitest.cc
+++ b/chrome/browser/extensions/api/declarative_content/declarative_content_apitest.cc
@@ -721,8 +721,8 @@
 constexpr char kRulesExtensionName[] =
     "Declarative content persistence apitest";
 
-// TODO(crbug.com/41189874): Flaky on Windows release builds and on LACROS.
-#if (BUILDFLAG(IS_WIN) && defined(NDEBUG)) || BUILDFLAG(IS_CHROMEOS_LACROS)
+// TODO(crbug.com/41189874): Flaky on Windows release builds.
+#if BUILDFLAG(IS_WIN) && defined(NDEBUG)
 #define MAYBE_PRE_RulesPersistence DISABLED_PRE_RulesPersistence
 #else
 #define MAYBE_PRE_RulesPersistence PRE_RulesPersistence
@@ -746,8 +746,8 @@
   ASSERT_TRUE(ready_split.WaitUntilSatisfied());
 }
 
-// TODO(crbug.com/41189874): Flaky on Windows release builds and on LACROS.
-#if (BUILDFLAG(IS_WIN) && defined(NDEBUG)) || BUILDFLAG(IS_CHROMEOS_LACROS)
+// TODO(crbug.com/41189874): Flaky on Windows release builds.
+#if BUILDFLAG(IS_WIN) && defined(NDEBUG)
 #define MAYBE_RulesPersistence DISABLED_RulesPersistence
 #else
 #define MAYBE_RulesPersistence RulesPersistence
diff --git a/chrome/browser/extensions/api/declarative_webrequest/webrequest_rules_registry_unittest.cc b/chrome/browser/extensions/api/declarative_webrequest/webrequest_rules_registry_unittest.cc
index 01caefc..7fce0a5 100644
--- a/chrome/browser/extensions/api/declarative_webrequest/webrequest_rules_registry_unittest.cc
+++ b/chrome/browser/extensions/api/declarative_webrequest/webrequest_rules_registry_unittest.cc
@@ -37,10 +37,6 @@
 #include "testing/gtest/include/gtest/gtest-message.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-#include "chromeos/lacros/lacros_test_helper.h"
-#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
-
 namespace helpers = extension_web_request_api_helpers;
 namespace keys = extensions::declarative_webrequest_constants;
 namespace keys2 = url_matcher::url_matcher_constants;
@@ -234,10 +230,6 @@
  protected:
   content::BrowserTaskEnvironment task_environment_;
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  chromeos::ScopedLacrosServiceTestHelper lacros_service_test_helper_;
-#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
-
   TestingProfile profile_;
   // Two extensions with host permissions for all URLs and the DWR permission.
   // Installation times will be so that |extension_| is older than
diff --git a/chrome/browser/extensions/api/desktop_capture/desktop_capture_apitest.cc b/chrome/browser/extensions/api/desktop_capture/desktop_capture_apitest.cc
index 3172bfb..e49015b 100644
--- a/chrome/browser/extensions/api/desktop_capture/desktop_capture_apitest.cc
+++ b/chrome/browser/extensions/api/desktop_capture/desktop_capture_apitest.cc
@@ -75,11 +75,9 @@
 
 }  // namespace
 
-// TODO(crbug.com/40805699): Crashes on Lacros.
 // TODO(crbug.com/40805704): Fails on the linux-wayland-rel bot.
 // TODO(crbug.com/40805725): Fails on Mac.
-#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_OZONE_WAYLAND) || \
-    BUILDFLAG(IS_CHROMEOS_LACROS)
+#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_OZONE_WAYLAND)
 #define MAYBE_ChooseDesktopMedia DISABLED_ChooseDesktopMedia
 #else
 #define MAYBE_ChooseDesktopMedia ChooseDesktopMedia
@@ -166,11 +164,9 @@
   ASSERT_TRUE(RunExtensionTest("desktop_capture")) << message_;
 }
 
-// TODO(crbug.com/40805699): Crashes on Lacros.
 // TODO(crbug.com/40805704): Fails on the linux-wayland-rel bot.
 // TODO(crbug.com/40805725): Fails on Mac.
-#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_OZONE_WAYLAND) || \
-    BUILDFLAG(IS_CHROMEOS_LACROS)
+#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_OZONE_WAYLAND)
 #define MAYBE_Delegation DISABLED_Delegation
 #else
 #define MAYBE_Delegation Delegation
diff --git a/chrome/browser/extensions/api/developer_private/extension_info_generator_unittest.cc b/chrome/browser/extensions/api/developer_private/extension_info_generator_unittest.cc
index 24eb845..354da8b8 100644
--- a/chrome/browser/extensions/api/developer_private/extension_info_generator_unittest.cc
+++ b/chrome/browser/extensions/api/developer_private/extension_info_generator_unittest.cc
@@ -529,7 +529,7 @@
             "behllobkkfkfnphdnhnkndlbkcpglgmj.json"));
   }
 
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
   // Test Extension2
   extension_path = data_dir()
                        .AppendASCII("good")
diff --git a/chrome/browser/extensions/api/document_scan/document_scan_api.cc b/chrome/browser/extensions/api/document_scan/document_scan_api.cc
index 23d79aa..2bb08f7 100644
--- a/chrome/browser/extensions/api/document_scan/document_scan_api.cc
+++ b/chrome/browser/extensions/api/document_scan/document_scan_api.cc
@@ -10,16 +10,11 @@
 #include <vector>
 
 #include "base/functional/bind.h"
-#include "chrome/browser/extensions/api/document_scan/document_scan_api_handler.h"
-#include "chrome/browser/extensions/chrome_extension_function_details.h"
-
-#if BUILDFLAG(IS_CHROMEOS_ASH)
 #include "chrome/browser/ash/crosapi/crosapi_ash.h"
 #include "chrome/browser/ash/crosapi/crosapi_manager.h"
 #include "chrome/browser/ash/crosapi/document_scan_ash.h"
-#elif BUILDFLAG(IS_CHROMEOS_LACROS)
-#include "chromeos/lacros/lacros_service.h"
-#endif
+#include "chrome/browser/extensions/api/document_scan/document_scan_api_handler.h"
+#include "chrome/browser/extensions/chrome_extension_function_details.h"
 
 namespace extensions {
 
diff --git a/chrome/browser/extensions/api/document_scan/document_scan_api_handler.cc b/chrome/browser/extensions/api/document_scan/document_scan_api_handler.cc
index 8273ab2..f924065 100644
--- a/chrome/browser/extensions/api/document_scan/document_scan_api_handler.cc
+++ b/chrome/browser/extensions/api/document_scan/document_scan_api_handler.cc
@@ -16,6 +16,9 @@
 #include "base/numerics/safe_conversions.h"
 #include "base/unguessable_token.h"
 #include "build/chromeos_buildflags.h"
+#include "chrome/browser/ash/crosapi/crosapi_ash.h"
+#include "chrome/browser/ash/crosapi/crosapi_manager.h"
+#include "chrome/browser/ash/crosapi/document_scan_ash.h"
 #include "chrome/browser/extensions/api/document_scan/document_scan_type_converters.h"
 #include "chrome/browser/extensions/api/document_scan/scanner_discovery_runner.h"
 #include "chrome/browser/extensions/api/document_scan/start_scan_runner.h"
@@ -29,15 +32,6 @@
 #include "content/public/browser/browser_thread.h"
 #include "extensions/common/extension.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-#include "chrome/browser/ash/crosapi/crosapi_ash.h"
-#include "chrome/browser/ash/crosapi/crosapi_manager.h"
-#include "chrome/browser/ash/crosapi/document_scan_ash.h"
-#elif BUILDFLAG(IS_CHROMEOS_LACROS)
-#include "chromeos/lacros/lacros_service.h"
-#include "extensions/common/extension_id.h"
-#endif
-
 namespace extensions {
 
 namespace {
@@ -62,7 +56,7 @@
 constexpr char kPngImageDataUrlPrefix[] = "data:image/png;base64,";
 
 crosapi::mojom::DocumentScan* GetDocumentScanInterface() {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // CrosapiManager is not always initialized in tests.
   if (!crosapi::CrosapiManager::IsInitialized()) {
     CHECK_IS_TEST();
diff --git a/chrome/browser/extensions/api/document_scan/document_scan_apitest.cc b/chrome/browser/extensions/api/document_scan/document_scan_apitest.cc
index 311a393..5c8b039f 100644
--- a/chrome/browser/extensions/api/document_scan/document_scan_apitest.cc
+++ b/chrome/browser/extensions/api/document_scan/document_scan_apitest.cc
@@ -110,14 +110,9 @@
   void SetUpOnMainThread() override {
     ExtensionApiTest::SetUpOnMainThread();
 
-    // Replace the production DocumentScanAsh with a mock for testing.
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-    chromeos::LacrosService::Get()->InjectRemoteForTesting(
-        receiver_.BindNewPipeAndPassRemote());
-#else
     DocumentScanAPIHandler::Get(browser()->profile())
         ->SetDocumentScanForTesting(&document_scan_ash_);
-#endif
+
     document_scan()->SetSmallestMaxReadSize(kRealBackendMinimumReadSize);
   }
 
@@ -137,9 +132,6 @@
 
  private:
   FakeDocumentScanAsh document_scan_ash_;
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  mojo::Receiver<crosapi::mojom::DocumentScan> receiver_{&document_scan_ash_};
-#endif
 };
 
 IN_PROC_BROWSER_TEST_P(DocumentScanApiTest, TestLoadPermissions) {
diff --git a/chrome/browser/extensions/api/downloads/downloads_api_browsertest.cc b/chrome/browser/extensions/api/downloads/downloads_api_browsertest.cc
index 0f87aee0..35bcd26 100644
--- a/chrome/browser/extensions/api/downloads/downloads_api_browsertest.cc
+++ b/chrome/browser/extensions/api/downloads/downloads_api_browsertest.cc
@@ -1318,7 +1318,7 @@
       .WaitForEvent();
 }
 
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
 IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
                        DownloadsShowFunction) {
   platform_util::internal::DisableShellOperationsForTesting();
@@ -4605,7 +4605,7 @@
 
 // The DownloadExtensionBubbleEnabledTest relies on the download surface, which
 // ChromeOS_ASH doesn't use (see crbug.com/1323505).
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
 class DownloadExtensionBubbleEnabledTest : public DownloadExtensionTest {
  public:
   DownloadExtensionBubbleEnabledTest() = default;
@@ -4703,7 +4703,7 @@
   items[0]->Cancel(true);
   EXPECT_TRUE(GetDownloadToolbarButton()->IsShowing());
 }
-#endif  // !BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // !BUILDFLAG(IS_CHROMEOS)
 
 class DownloadsApiTest : public ExtensionApiTest {
  public:
diff --git a/chrome/browser/extensions/api/enterprise_device_attributes/BUILD.gn b/chrome/browser/extensions/api/enterprise_device_attributes/BUILD.gn
index a209f22..8385f6e 100644
--- a/chrome/browser/extensions/api/enterprise_device_attributes/BUILD.gn
+++ b/chrome/browser/extensions/api/enterprise_device_attributes/BUILD.gn
@@ -23,12 +23,7 @@
 
   deps = [
     "//base",
+    "//chrome/browser/ash/crosapi",
     "//chrome/browser/profiles:profile",
   ]
-
-  if (is_chromeos_ash) {
-    deps += [ "//chrome/browser/ash/crosapi" ]
-  } else {
-    deps += [ "//chromeos/lacros:lacros" ]
-  }
 }
diff --git a/chrome/browser/extensions/api/enterprise_device_attributes/enterprise_device_attributes_api.cc b/chrome/browser/extensions/api/enterprise_device_attributes/enterprise_device_attributes_api.cc
index 7bd82f705..80c28df 100644
--- a/chrome/browser/extensions/api/enterprise_device_attributes/enterprise_device_attributes_api.cc
+++ b/chrome/browser/extensions/api/enterprise_device_attributes/enterprise_device_attributes_api.cc
@@ -7,56 +7,16 @@
 #include <utility>
 
 #include "base/functional/bind.h"
-
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-#include <optional>
-
-#include "chrome/browser/profiles/profile.h"
-#include "chromeos/lacros/lacros_service.h"
-#else
 #include "chrome/browser/ash/crosapi/crosapi_ash.h"
 #include "chrome/browser/ash/crosapi/crosapi_manager.h"
 #include "chrome/browser/ash/crosapi/device_attributes_ash.h"
-#endif
 
 namespace {
 
 crosapi::mojom::DeviceAttributes* GetDeviceAttributesApi() {
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  return chromeos::LacrosService::Get()
-      ->GetRemote<crosapi::mojom::DeviceAttributes>()
-      .get();
-#else
   return crosapi::CrosapiManager::Get()->crosapi_ash()->device_attributes_ash();
-#endif
 }
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-const char kUnsupportedByAsh[] = "Not supported by ash.";
-const char kUnsupportedProfile[] = "Not available for this profile.";
-
-// Performs common crosapi validation. These errors are not caused by the
-// extension so they are considered recoverable. Returns an error message on
-// error, or nullopt on success. |context| is the browser context in which the
-// extension is hosted.
-std::optional<std::string> ValidateCrosapi(content::BrowserContext* context) {
-  if (!chromeos::LacrosService::Get()
-           ->IsAvailable<crosapi::mojom::DeviceAttributes>()) {
-    return kUnsupportedByAsh;
-  }
-
-  // These APIs are used in security-sensitive contexts. We need to ensure that
-  // the user for ash is the same as the user for lacros. We do this by
-  // restricting the API to the default profile, which is guaranteed to be the
-  // same user.
-  if (!Profile::FromBrowserContext(context)->IsMainProfile()) {
-    return kUnsupportedProfile;
-  }
-
-  return std::nullopt;
-}
-#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
-
 }  // namespace
 
 namespace extensions {
@@ -78,13 +38,6 @@
 
 ExtensionFunction::ResponseAction
 EnterpriseDeviceAttributesGetDirectoryDeviceIdFunction::Run() {
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  std::optional<std::string> error = ValidateCrosapi(browser_context());
-  if (error.has_value()) {
-    return RespondNow(Error(error.value()));
-  }
-#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
-
   // We don't need Unretained() or WeakPtr because ExtensionFunction is
   // ref-counted.
   auto cb = base::BindOnce(
@@ -97,13 +50,6 @@
 
 ExtensionFunction::ResponseAction
 EnterpriseDeviceAttributesGetDeviceSerialNumberFunction::Run() {
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  std::optional<std::string> error = ValidateCrosapi(browser_context());
-  if (error.has_value()) {
-    return RespondNow(Error(error.value()));
-  }
-#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
-
   // We don't need Unretained() or WeakPtr because ExtensionFunction is
   // ref-counted.
   auto cb = base::BindOnce(
@@ -116,13 +62,6 @@
 
 ExtensionFunction::ResponseAction
 EnterpriseDeviceAttributesGetDeviceAssetIdFunction::Run() {
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  std::optional<std::string> error = ValidateCrosapi(browser_context());
-  if (error.has_value()) {
-    return RespondNow(Error(error.value()));
-  }
-#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
-
   // We don't need Unretained() or WeakPtr because ExtensionFunction is
   // ref-counted.
   auto cb = base::BindOnce(
@@ -135,13 +74,6 @@
 
 ExtensionFunction::ResponseAction
 EnterpriseDeviceAttributesGetDeviceAnnotatedLocationFunction::Run() {
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  std::optional<std::string> error = ValidateCrosapi(browser_context());
-  if (error.has_value()) {
-    return RespondNow(Error(error.value()));
-  }
-#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
-
   // We don't need Unretained() or WeakPtr because ExtensionFunction is
   // ref-counted.
   auto cb = base::BindOnce(
@@ -155,13 +87,6 @@
 
 ExtensionFunction::ResponseAction
 EnterpriseDeviceAttributesGetDeviceHostnameFunction::Run() {
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  std::optional<std::string> error = ValidateCrosapi(browser_context());
-  if (error.has_value()) {
-    return RespondNow(Error(error.value()));
-  }
-#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
-
   // We don't need Unretained() or WeakPtr because ExtensionFunction is
   // ref-counted.
   auto cb = base::BindOnce(
diff --git a/chrome/browser/extensions/api/enterprise_kiosk_input/BUILD.gn b/chrome/browser/extensions/api/enterprise_kiosk_input/BUILD.gn
index 6ea51aa0..ab15102 100644
--- a/chrome/browser/extensions/api/enterprise_kiosk_input/BUILD.gn
+++ b/chrome/browser/extensions/api/enterprise_kiosk_input/BUILD.gn
@@ -16,11 +16,10 @@
 
   configs += [ "//build/config/compiler:wexit_time_destructors" ]
 
-  public_deps = [ "//extensions/browser" ]
-
-  if (is_chromeos_ash) {
-    public_deps += [ "//chromeos/crosapi/mojom" ]
-  }
+  public_deps = [
+    "//chromeos/crosapi/mojom",
+    "//extensions/browser",
+  ]
 
   deps = [
     "//base",
diff --git a/chrome/browser/extensions/api/enterprise_kiosk_input/enterprise_kiosk_input_api.cc b/chrome/browser/extensions/api/enterprise_kiosk_input/enterprise_kiosk_input_api.cc
index 1785fd2..d696f90 100644
--- a/chrome/browser/extensions/api/enterprise_kiosk_input/enterprise_kiosk_input_api.cc
+++ b/chrome/browser/extensions/api/enterprise_kiosk_input/enterprise_kiosk_input_api.cc
@@ -15,16 +15,10 @@
 #include "chrome/common/extensions/api/enterprise_kiosk_input.h"
 #include "chromeos/crosapi/mojom/input_methods.mojom.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
 #include "chrome/browser/ash/crosapi/crosapi_ash.h"
 #include "chrome/browser/ash/crosapi/crosapi_manager.h"
 #include "chrome/browser/ash/crosapi/input_methods_ash.h"
 #include "ui/base/ime/ash/input_method_manager.h"
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
-
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-#include "chromeos/lacros/lacros_service.h"
-#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
 
 namespace {
 
@@ -35,13 +29,7 @@
     "Could not change current input method. Invalid input method id: %s.";
 
 crosapi::mojom::InputMethods* GetInputMethodsApi() {
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  return chromeos::LacrosService::Get()
-      ->GetRemote<crosapi::mojom::InputMethods>()
-      .get();
-#else
   return crosapi::CrosapiManager::Get()->crosapi_ash()->input_methods_ash();
-#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
 }
 }  // namespace
 
@@ -58,17 +46,6 @@
   std::optional<SetCurrentInputMethod::Params> params =
       SetCurrentInputMethod::Params::Create(args());
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  if (!chromeos::LacrosService::Get()
-           ->IsAvailable<crosapi::mojom::InputMethods>()) {
-    // Lacros should work with ash-chrome 2 versions below where the
-    // InputMethods crosapi is not available yet.
-    // TODO(b/337793096): Remove this check.
-    LOG(ERROR) << "InputMethods crosapi is not available in ash-chrome";
-    return RespondNow(NoArguments());
-  }
-#endif
-
   GetInputMethodsApi()->ChangeInputMethod(
       params->options.input_method_id,
       base::BindOnce(&EnterpriseKioskInputSetCurrentInputMethodFunction::
diff --git a/chrome/browser/extensions/api/enterprise_networking_attributes/enterprise_networking_attributes_api.cc b/chrome/browser/extensions/api/enterprise_networking_attributes/enterprise_networking_attributes_api.cc
index 50e948d..992a55a2 100644
--- a/chrome/browser/extensions/api/enterprise_networking_attributes/enterprise_networking_attributes_api.cc
+++ b/chrome/browser/extensions/api/enterprise_networking_attributes/enterprise_networking_attributes_api.cc
@@ -12,42 +12,9 @@
 #include "chrome/common/extensions/api/enterprise_networking_attributes.h"
 #include "net/base/ip_address.h"
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-#include "chromeos/lacros/lacros_service.h"
-#else
 #include "chrome/browser/ash/crosapi/crosapi_ash.h"
 #include "chrome/browser/ash/crosapi/crosapi_manager.h"
 #include "chrome/browser/ash/crosapi/networking_attributes_ash.h"
-#endif
-
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-namespace {
-
-const char kUnsupportedByAsh[] = "Not implemented.";
-const char kUnsupportedProfile[] = "Not available for this profile.";
-
-// Performs common crosapi validation. These errors are not caused by the
-// extension so they are considered recoverable. Returns an error message on
-// error, or empty string on success. |context| is the browser context in which
-// the extension is hosted.
-std::string ValidateCrosapi(content::BrowserContext* context) {
-  if (!chromeos::LacrosService::Get()
-           ->IsAvailable<crosapi::mojom::NetworkingAttributes>()) {
-    return kUnsupportedByAsh;
-  }
-
-  // These APIs are used in security-sensitive contexts. We need to ensure that
-  // the user for ash is the same as the user for lacros. We do this by
-  // restricting the API to the default profile, which is guaranteed to be the
-  // same user.
-  if (!Profile::FromBrowserContext(context)->IsMainProfile())
-    return kUnsupportedProfile;
-
-  return "";
-}
-
-}  // namespace
-#endif
 
 namespace extensions {
 
@@ -59,25 +26,14 @@
 
 ExtensionFunction::ResponseAction
 EnterpriseNetworkingAttributesGetNetworkDetailsFunction::Run() {
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  std::string error = ValidateCrosapi(browser_context());
-  if (!error.empty()) {
-    return RespondNow(Error(error));
-  }
-#endif
   auto callback = base::BindOnce(
       &EnterpriseNetworkingAttributesGetNetworkDetailsFunction::OnResult, this);
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  chromeos::LacrosService::Get()
-      ->GetRemote<crosapi::mojom::NetworkingAttributes>()
-      ->GetNetworkDetails(std::move(callback));
-#else
   crosapi::CrosapiManager::Get()
       ->crosapi_ash()
       ->networking_attributes_ash()
       ->GetNetworkDetails(std::move(callback));
-#endif
+
   return RespondLater();
 }
 
diff --git a/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api.cc b/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api.cc
index 0486f3a..23c3d4a 100644
--- a/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api.cc
+++ b/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api.cc
@@ -11,6 +11,8 @@
 #include <vector>
 
 #include "base/values.h"
+#include "chrome/browser/ash/crosapi/keystore_service_ash.h"
+#include "chrome/browser/ash/crosapi/keystore_service_factory_ash.h"
 #include "chrome/browser/chromeos/platform_keys/extension_platform_keys_service.h"
 #include "chrome/browser/chromeos/platform_keys/extension_platform_keys_service_factory.h"
 #include "chrome/browser/chromeos/platform_keys/platform_keys.h"
@@ -23,15 +25,6 @@
 #include "components/pref_registry/pref_registry_syncable.h"
 #include "extensions/browser/extension_function.h"
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-#include "chromeos/lacros/lacros_service.h"
-#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
-
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-#include "chrome/browser/ash/crosapi/keystore_service_ash.h"
-#include "chrome/browser/ash/crosapi/keystore_service_factory_ash.h"
-#endif  // #if BUILDFLAG(IS_CHROMEOS_ASH)
-
 namespace extensions {
 
 namespace {
@@ -40,56 +33,13 @@
 namespace api_epki = api::enterprise_platform_keys_internal;
 using crosapi::mojom::KeystoreService;
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-const char kUnsupportedByAsh[] = "Not implemented.";
-const char kUnsupportedProfile[] = "Not available.";
-#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
 const char kExtensionDoesNotHavePermission[] =
     "The extension does not have permission to call this function.";
-const char kChromeOsEcdsaUnsupported[] =
-    "Installed ChromeOS version does not support ECDSA.";
 
 crosapi::mojom::KeystoreService* GetKeystoreService(
     content::BrowserContext* browser_context) {
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  // TODO(b/191958380): Lift the restriction when *.platformKeys.* APIs are
-  // implemented for secondary profiles in Lacros.
-  CHECK(Profile::FromBrowserContext(browser_context)->IsMainProfile())
-      << "Attempted to use an incorrect profile. Please file a bug at "
-         "https://bugs.chromium.org/ if this happens.";
-  return chromeos::LacrosService::Get()->GetRemote<KeystoreService>().get();
-#endif  // #if BUILDFLAG(IS_CHROMEOS_LACROS)
-
-#if BUILDFLAG(IS_CHROMEOS_ASH)
   return crosapi::KeystoreServiceFactoryAsh::GetForBrowserContext(
       browser_context);
-#endif  // #if BUILDFLAG(IS_CHROMEOS_ASH)
-}
-
-// Performs common crosapi validation. These errors are not caused by the
-// extension so they are considered recoverable. Returns an error message on
-// error, or empty string on success. |min_version| is the minimum version of
-// the ash implementation of KeystoreService necessary to support this
-// extension. |context| is the browser context in which the extension is hosted.
-std::string ValidateCrosapi(int min_version, content::BrowserContext* context) {
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  chromeos::LacrosService* service = chromeos::LacrosService::Get();
-  if (!service || !service->IsAvailable<crosapi::mojom::KeystoreService>())
-    return kUnsupportedByAsh;
-
-  int version = service->GetInterfaceVersion<KeystoreService>();
-  if (version < min_version)
-    return kUnsupportedByAsh;
-
-  // These APIs are used in security-sensitive contexts. We need to ensure that
-  // the user for ash is the same as the user for lacros. We do this by
-  // restricting the API to the default profile, which is guaranteed to be the
-  // same user.
-  if (!Profile::FromBrowserContext(context)->IsMainProfile())
-    return kUnsupportedProfile;
-#endif  // #if BUILDFLAG(IS_CHROMEOS_LACROS)
-
-  return "";
 }
 
 std::optional<crosapi::mojom::KeystoreType> KeystoreTypeFromString(
@@ -135,13 +85,6 @@
   std::optional<api_epki::GenerateKey::Params> params =
       api_epki::GenerateKey::Params::Create(args());
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  // TODO(b/191958380): Lift the restriction when *.platformKeys.* APIs are
-  // implemented for secondary profiles in Lacros.
-  if (!Profile::FromBrowserContext(browser_context())->IsMainProfile())
-    return RespondNow(Error(kUnsupportedProfile));
-#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
-
   EXTENSION_FUNCTION_VALIDATE(params);
   std::optional<chromeos::platform_keys::TokenId> platform_keys_token_id =
       platform_keys::ApiIdToPlatformKeysTokenId(params->token_id);
@@ -199,14 +142,8 @@
       api_epk::GetCertificates::Params::Create(args());
   EXTENSION_FUNCTION_VALIDATE(params);
 
-  std::string error = ValidateCrosapi(
-      KeystoreService::kGetCertificatesMinVersion, browser_context());
-  if (!error.empty()) {
-    return RespondNow(Error(error));
-  }
-
   crosapi::mojom::KeystoreType keystore;
-  error = ValidateInput(params->token_id, &keystore);
+  std::string error = ValidateInput(params->token_id, &keystore);
   if (!error.empty()) {
     return RespondNow(Error(error));
   }
@@ -245,14 +182,8 @@
       api_epk::ImportCertificate::Params::Create(args());
   EXTENSION_FUNCTION_VALIDATE(params);
 
-  std::string error = ValidateCrosapi(
-      KeystoreService::kAddCertificateMinVersion, browser_context());
-  if (!error.empty()) {
-    return RespondNow(Error(error));
-  }
-
   crosapi::mojom::KeystoreType keystore;
-  error = ValidateInput(params->token_id, &keystore);
+  std::string error = ValidateInput(params->token_id, &keystore);
   EXTENSION_FUNCTION_VALIDATE(error.empty());
 
   auto c = base::BindOnce(
@@ -280,14 +211,8 @@
       api_epk::RemoveCertificate::Params::Create(args());
   EXTENSION_FUNCTION_VALIDATE(params);
 
-  std::string error = ValidateCrosapi(
-      KeystoreService::kRemoveCertificateMinVersion, browser_context());
-  if (!error.empty()) {
-    return RespondNow(Error(error));
-  }
-
   crosapi::mojom::KeystoreType keystore;
-  error = ValidateInput(params->token_id, &keystore);
+  std::string error = ValidateInput(params->token_id, &keystore);
   EXTENSION_FUNCTION_VALIDATE(error.empty());
 
   auto c = base::BindOnce(
@@ -314,12 +239,6 @@
 EnterprisePlatformKeysInternalGetTokensFunction::Run() {
   EXTENSION_FUNCTION_VALIDATE(args().empty());
 
-  std::string error = ValidateCrosapi(KeystoreService::kGetKeyStoresMinVersion,
-                                      browser_context());
-  if (!error.empty()) {
-    return RespondNow(Error(error));
-  }
-
   auto c = base::BindOnce(
       &EnterprisePlatformKeysInternalGetTokensFunction::OnGetKeyStores, this);
   GetKeystoreService(browser_context())->GetKeyStores(std::move(c));
@@ -362,12 +281,6 @@
       api_epk::ChallengeMachineKey::Params::Create(args());
   EXTENSION_FUNCTION_VALIDATE(params);
 
-  const std::string error = ValidateCrosapi(
-      KeystoreService::kChallengeAttestationOnlyKeystoreMinVersion,
-      browser_context());
-  if (!error.empty())
-    return RespondNow(Error(error));
-
   if (!platform_keys::IsExtensionAllowed(
           Profile::FromBrowserContext(browser_context()), extension())) {
     return RespondNow(Error(kExtensionDoesNotHavePermission));
@@ -411,12 +324,6 @@
       api_epk::ChallengeUserKey::Params::Create(args());
   EXTENSION_FUNCTION_VALIDATE(params);
 
-  const std::string error = ValidateCrosapi(
-      KeystoreService::kChallengeAttestationOnlyKeystoreMinVersion,
-      browser_context());
-  if (!error.empty())
-    return RespondNow(Error(error));
-
   if (!platform_keys::IsExtensionAllowed(
           Profile::FromBrowserContext(browser_context()), extension())) {
     return RespondNow(Error(kExtensionDoesNotHavePermission));
@@ -453,21 +360,12 @@
 
 //------------------------------------------------------------------------------
 
-const uint64_t kChallengeKeystoreAlgorithmParameterMinVersion = 17;
-
 ExtensionFunction::ResponseAction
 EnterprisePlatformKeysChallengeKeyFunction::Run() {
   std::optional<api_epk::ChallengeKey::Params> params =
       api_epk::ChallengeKey::Params::Create(args());
   EXTENSION_FUNCTION_VALIDATE(params);
 
-  std::string error = ValidateCrosapi(
-      KeystoreService::kChallengeAttestationOnlyKeystoreMinVersion,
-      browser_context());
-  if (!error.empty()) {
-    return RespondNow(Error(std::move(error)));
-  }
-
   if (!platform_keys::IsExtensionAllowed(
           Profile::FromBrowserContext(browser_context()), extension())) {
     return RespondNow(Error(kExtensionDoesNotHavePermission));
@@ -501,13 +399,6 @@
             crosapi::mojom::KeystoreSigningAlgorithmName::kRsassaPkcs115;
         break;
       case api::enterprise_platform_keys::Algorithm::kEcdsa: {
-        // Older versions of Ash default to RSA. If ECDSA is specified but the
-        // Keystore would use RSA instead, return an error.
-        const std::string version_error = ValidateCrosapi(
-            kChallengeKeystoreAlgorithmParameterMinVersion, browser_context());
-        if (!version_error.empty()) {
-          return RespondNow(Error(kChromeOsEcdsaUnsupported));
-        }
         algorithm = crosapi::mojom::KeystoreSigningAlgorithmName::kEcdsa;
         break;
       }
diff --git a/chrome/browser/extensions/api/enterprise_platform_keys_private/BUILD.gn b/chrome/browser/extensions/api/enterprise_platform_keys_private/BUILD.gn
index f4087d8..0ca985e 100644
--- a/chrome/browser/extensions/api/enterprise_platform_keys_private/BUILD.gn
+++ b/chrome/browser/extensions/api/enterprise_platform_keys_private/BUILD.gn
@@ -6,7 +6,7 @@
 import("//extensions/buildflags/buildflags.gni")
 
 assert(enable_extensions)
-assert(is_chromeos_ash)
+assert(is_chromeos)
 
 source_set("enterprise_platform_keys_private") {
   sources = [
diff --git a/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_apitest.cc b/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_apitest.cc
index 3b446e7d..093324d 100644
--- a/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_apitest.cc
+++ b/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_apitest.cc
@@ -52,42 +52,31 @@
 #include "components/device_signals/test/win/scoped_executable_files.h"
 #endif  // BUILDFLAG(IS_WIN)
 
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
 #include "components/enterprise/browser/controller/fake_browser_dm_token_storage.h"
 #include "components/policy/core/common/cloud/cloud_policy_core.h"
 #include "components/policy/core/common/cloud/cloud_policy_store.h"
 #include "components/policy/core/common/cloud/machine_level_user_cloud_policy_manager.h"
 #include "components/policy/core/common/cloud/user_cloud_policy_manager.h"
 #include "components/policy/proto/device_management_backend.pb.h"
-#endif  // !BUILDFLAG(IS_CHROMEOS_ASH)
-
-#if BUILDFLAG(IS_CHROMEOS)
+#else
 #include "base/strings/strcat.h"
-#include "chrome/browser/enterprise/util/affiliation.h"
-#include "chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_api.h"
-#endif
-
-#if BUILDFLAG(IS_CHROMEOS_ASH)
 #include "chrome/browser/ash/login/test/cryptohome_mixin.h"
 #include "chrome/browser/ash/login/test/user_auth_config.h"
 #include "chrome/browser/ash/policy/affiliation/affiliation_mixin.h"
 #include "chrome/browser/ash/policy/affiliation/affiliation_test_helper.h"
 #include "chrome/browser/ash/policy/core/device_policy_cros_browser_test.h"
 #include "chrome/browser/ash/profiles/profile_helper.h"
-#endif
-
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-#include "chrome/browser/browser_process.h"
-#include "chromeos/startup/browser_init_params.h"
-#include "components/policy/core/common/policy_loader_lacros.h"
-#endif
+#include "chrome/browser/enterprise/util/affiliation.h"
+#include "chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_api.h"
+#endif  // !BUILDFLAG(IS_CHROMEOS)
 
 namespace extensions {
 namespace {
 
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
 constexpr char kAffiliationId[] = "affiliation-id";
-#endif  // !BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // !BUILDFLAG(IS_CHROMEOS)
 
 // Manifest key for the Endpoint Verification extension found at
 // chrome.google.com/webstore/detail/callobklhcbilhphinckomhgkigmfocg
@@ -145,17 +134,17 @@
             kApiEnterpriseReportingPrivateReportDataMaskingEvent);
 #endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
 
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
     browser_dm_token_storage_.SetClientId("client_id");
     browser_dm_token_storage_.SetEnrollmentToken("enrollment_token");
     browser_dm_token_storage_.SetDMToken("dm_token");
     policy::BrowserDMTokenStorage::SetForTesting(&browser_dm_token_storage_);
-#endif  // !BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // !BUILDFLAG(IS_CHROMEOS)
   }
 
   ~EnterpriseReportingPrivateApiTest() override = default;
 
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
   // Signs in and returns the account ID of the primary account.
   AccountInfo SignIn(const std::string& email, bool as_managed = true) {
     auto account_info = identity_test_env()->MakePrimaryAccountAvailable(
@@ -181,7 +170,7 @@
 
     return account_info;
   }
-#endif  // !BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // !BUILDFLAG(IS_CHROMEOS)
 
   void RunTest(const std::string& background_js,
                bool authorized_manifest_key = true) {
@@ -272,7 +261,7 @@
 
   base::test::ScopedFeatureList scoped_features_;
 
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
   policy::FakeBrowserDMTokenStorage browser_dm_token_storage_;
 #endif
 };
@@ -470,13 +459,6 @@
 }
 
 IN_PROC_BROWSER_TEST_F(EnterpriseReportingPrivateApiTest, GetContextInfo) {
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  static constexpr char kFakeDeviceID[] = "fake_device_id";
-  auto init_params = crosapi::mojom::BrowserInitParams::New();
-  init_params->device_properties = crosapi::mojom::DeviceProperties::New();
-  init_params->device_properties->serial_number = kFakeDeviceID;
-  chromeos::BrowserInitParams::SetInitParamsForTests(std::move(init_params));
-#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
 #if BUILDFLAG(IS_WIN) && BUILDFLAG(GOOGLE_CHROME_BRANDING)
   constexpr char kThirdPartyBlockingEnabledType[] = "boolean";
   constexpr char kCount[] = "18";
@@ -1025,11 +1007,9 @@
   }
   return serialized_record_data_str;
 }
-#endif  // BUILDFLAG(IS_CHROMEOS)
 
 // Inheriting from DevicePolicyCrosBrowserTest enables use of AffiliationMixin
-// for setting up profile/device affiliation. Only available in Ash.
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+// for setting up profile/device affiliation. Only available in ChromeOS.
 struct Params {
   explicit Params(bool affiliated) : affiliated(affiliated) {}
   // Whether the user is expected to be affiliated.
@@ -1107,79 +1087,7 @@
                          EnterpriseReportingPrivateEnqueueRecordApiTest,
                          ::testing::Values(Params(/*affiliated=*/true),
                                            Params(/*affiliated=*/false)));
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
-
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-
-using EnterpriseReportingPrivateEnqueueRecordApiTest = ExtensionApiTest;
-
-static void SetupAffiliationLacros() {
-  constexpr char kDomain[] = "fake-domain";
-  constexpr char kFakeProfileClientId[] = "fake-profile-client-id";
-  constexpr char kFakeDMToken[] = "fake-dm-token";
-  enterprise_management::PolicyData profile_policy_data;
-  profile_policy_data.add_user_affiliation_ids(kAffiliationId);
-  profile_policy_data.set_managed_by(kDomain);
-  profile_policy_data.set_device_id(kFakeProfileClientId);
-  profile_policy_data.set_request_token(kFakeDMToken);
-  policy::PolicyLoaderLacros::set_main_user_policy_data_for_testing(
-      std::move(profile_policy_data));
-
-  crosapi::mojom::BrowserInitParamsPtr init_params =
-      crosapi::mojom::BrowserInitParams::New();
-  init_params->device_properties = crosapi::mojom::DeviceProperties::New();
-  init_params->device_properties->device_dm_token = kFakeDMToken;
-  init_params->device_properties->device_affiliation_ids = {kAffiliationId};
-  chromeos::BrowserInitParams::SetInitParamsForTests(std::move(init_params));
-}
-
-IN_PROC_BROWSER_TEST_F(EnterpriseReportingPrivateEnqueueRecordApiTest,
-                       EnqueueRecordFailsWithUnaffiliatedProfile) {
-  constexpr char kTest[] = R"(
-
-        const request = {
-          eventType: "USER",
-          priority: 4,
-          recordData: Uint8Array.from(%s),
-        };
-
-        chrome.enterprise.reportingPrivate.enqueueRecord(request, () =>{
-         chrome.test.assertLastError('%s');
-
-          chrome.test.succeed();
-        });
-
-      )";
-  const std::string kErrorMsg =
-      EnterpriseReportingPrivateEnqueueRecordFunction::
-          kErrorProfileNotAffiliated;
-  RunTestUsingProfile(
-      base::StringPrintf(kTest, CreateValidRecord().c_str(), kErrorMsg.c_str()),
-      profile());
-}
-
-IN_PROC_BROWSER_TEST_F(EnterpriseReportingPrivateEnqueueRecordApiTest,
-                       EnqueueRecordSucceedsWithAffiliatedProfile) {
-  SetupAffiliationLacros();
-  constexpr char kTest[] = R"(
-
-        const request = {
-          eventType: "USER",
-          priority: 4,
-          recordData: Uint8Array.from(%s),
-        };
-
-        chrome.enterprise.reportingPrivate.enqueueRecord(request, () =>{
-          chrome.test.assertNoLastError();
-
-          chrome.test.succeed();
-        });
-
-      )";
-  RunTestUsingProfile(base::StringPrintf(kTest, CreateValidRecord().c_str()),
-                      profile());
-}
-#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 class EnterpriseReportDataMaskingEventTest
     : public EnterpriseReportingPrivateApiTest {
diff --git a/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_browsertest.cc b/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_browsertest.cc
index 193fa85..69a0e40 100644
--- a/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_browsertest.cc
+++ b/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_browsertest.cc
@@ -45,7 +45,7 @@
 #include "chrome/browser/policy/dm_token_utils.h"
 #endif
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/ash/policy/core/browser_policy_connector_ash.h"
 #include "chrome/browser/ash/policy/core/user_cloud_policy_manager_ash.h"
 #include "chrome/browser/browser_process_platform_part.h"
@@ -132,7 +132,7 @@
 class EnterpriseReportingPrivateGetContextInfoBaseBrowserTest
     : public InProcessBrowserTest {
  public:
-#if !BUILDFLAG(GOOGLE_CHROME_BRANDING) && !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(GOOGLE_CHROME_BRANDING) && !BUILDFLAG(IS_CHROMEOS)
   void SetUpDefaultCommandLine(base::CommandLine* command_line) override {
     InProcessBrowserTest::SetUpDefaultCommandLine(command_line);
     command_line->AppendSwitch(::switches::kEnableChromeBrowserCloudManagement);
@@ -181,7 +181,7 @@
         SetUpOnMainThread();
 
     if (browser_managed()) {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
       auto* browser_policy_manager = g_browser_process->platform_part()
                                          ->browser_policy_connector_ash()
                                          ->GetDeviceCloudPolicyManager();
@@ -199,7 +199,7 @@
     }
 
     if (profile_managed()) {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
       auto* profile_policy_manager =
           browser()->profile()->GetUserCloudPolicyManagerAsh();
       profile_policy_manager->core()->client()->SetupRegistration(
@@ -275,7 +275,7 @@
   EXPECT_EQ(site_isolation_enabled(), info->site_isolation_enabled);
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 class EnterpriseReportingPrivateGetContextInfoChromeOSFirewallTest
     : public EnterpriseReportingPrivateGetContextInfoBaseBrowserTest,
       public testing::WithParamInterface<bool> {
@@ -355,14 +355,8 @@
     testing::Bool());
 #endif
 
-// crbug.com/1230268 not working on Lacros.
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-#define MAYBE_AffiliationIDs DISABLED_AffiliationIDs
-#else
-#define MAYBE_AffiliationIDs AffiliationIDs
-#endif
 IN_PROC_BROWSER_TEST_P(EnterpriseReportingPrivateGetContextInfoBrowserTest,
-                       MAYBE_AffiliationIDs) {
+                       AffiliationIDs) {
   auto function =
       base::MakeRefCounted<EnterpriseReportingPrivateGetContextInfoFunction>();
   auto context_info_value = api_test_utils::RunFunctionAndReturnSingleResult(
diff --git a/chrome/browser/extensions/api/extension_action/browser_action_interactive_test.cc b/chrome/browser/extensions/api/extension_action/browser_action_interactive_test.cc
index 1ea6e96..6418d9c3 100644
--- a/chrome/browser/extensions/api/extension_action/browser_action_interactive_test.cc
+++ b/chrome/browser/extensions/api/extension_action/browser_action_interactive_test.cc
@@ -268,13 +268,7 @@
 // Tests opening a popup using the chrome.browserAction.openPopup API. This test
 // opens a popup in the starting window, closes the popup, creates a new window
 // and opens a popup in the new window. Both popups should succeed in opening.
-// TODO(crbug.com/40781224): Test flaking frequently on Lacros.
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-#define MAYBE_TestOpenPopup DISABLED_TestOpenPopup
-#else
-#define MAYBE_TestOpenPopup TestOpenPopup
-#endif
-IN_PROC_BROWSER_TEST_F(BrowserActionInteractiveTest, MAYBE_TestOpenPopup) {
+IN_PROC_BROWSER_TEST_F(BrowserActionInteractiveTest, TestOpenPopup) {
   auto browserActionBar = ExtensionActionTestHelper::Create(browser());
   // Setup extension message listener to wait for javascript to finish running.
   ExtensionTestMessageListener listener("ready", ReplyBehavior::kWillReply);
diff --git a/chrome/browser/extensions/api/feedback_private/chrome_feedback_private_delegate.cc b/chrome/browser/extensions/api/feedback_private/chrome_feedback_private_delegate.cc
index db97388..b6819d8 100644
--- a/chrome/browser/extensions/api/feedback_private/chrome_feedback_private_delegate.cc
+++ b/chrome/browser/extensions/api/feedback_private/chrome_feedback_private_delegate.cc
@@ -27,7 +27,7 @@
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/webui/web_ui_util.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "base/strings/string_split.h"
 #include "base/system/sys_info.h"
 #include "chrome/browser/ash/arc/arc_util.h"
@@ -40,14 +40,14 @@
 #include "extensions/browser/extension_system.h"
 #include "extensions/common/constants.h"
 #include "google_apis/gaia/gaia_auth_util.h"
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 namespace extensions {
 
 namespace {
 
 int GetSysInfoCheckboxStringId(content::BrowserContext* browser_context) {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   if (arc::IsArcPlayStoreEnabledForProfile(
           Profile::FromBrowserContext(browser_context))) {
     return IDS_FEEDBACK_INCLUDE_SYSTEM_INFORMATION_AND_METRICS_CHKBOX_ARC;
@@ -122,7 +122,7 @@
   fetcher->Fetch(std::move(callback));
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 std::unique_ptr<system_logs::SystemLogsSource>
 ChromeFeedbackPrivateDelegate::CreateSingleLogSource(
     api::feedback_private::LogSource source_type) const {
@@ -228,7 +228,7 @@
   return board[0] == "eve" ? api::feedback_private::LandingPageType::kTechstop
                            : api::feedback_private::LandingPageType::kNormal;
 }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 std::string ChromeFeedbackPrivateDelegate::GetSignedInUserEmail(
     content::BrowserContext* context) const {
diff --git a/chrome/browser/extensions/api/feedback_private/chrome_feedback_private_delegate.h b/chrome/browser/extensions/api/feedback_private/chrome_feedback_private_delegate.h
index 0639edd9..1041bad0 100644
--- a/chrome/browser/extensions/api/feedback_private/chrome_feedback_private_delegate.h
+++ b/chrome/browser/extensions/api/feedback_private/chrome_feedback_private_delegate.h
@@ -28,14 +28,14 @@
   void FetchSystemInformation(
       content::BrowserContext* context,
       system_logs::SysLogsFetcherCallback callback) const override;
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   std::unique_ptr<system_logs::SystemLogsSource> CreateSingleLogSource(
       api::feedback_private::LogSource source_type) const override;
   void FetchExtraLogs(scoped_refptr<feedback::FeedbackData> feedback_data,
                       FetchExtraLogsCallback callback) const override;
   api::feedback_private::LandingPageType GetLandingPageType(
       const feedback::FeedbackData& feedback_data) const override;
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
   std::string GetSignedInUserEmail(
       content::BrowserContext* context) const override;
   void NotifyFeedbackDelayed() const override;
diff --git a/chrome/browser/extensions/api/feedback_private/feedback_browsertest.cc b/chrome/browser/extensions/api/feedback_private/feedback_browsertest.cc
index 4c56123..9ee24ae 100644
--- a/chrome/browser/extensions/api/feedback_private/feedback_browsertest.cc
+++ b/chrome/browser/extensions/api/feedback_private/feedback_browsertest.cc
@@ -184,7 +184,7 @@
                 "  })());"));
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 // Ensures that when triggered from a Google account and a Bluetooth related
 // string is entered into the description, that we provide the option for
 // uploading Bluetooth logs as well.
@@ -315,7 +315,7 @@
                 "    return !elem.value.includes('please answer');"
                 "  })());"));
 }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 // Disabled due to flake: https://crbug.com/1069870
 IN_PROC_BROWSER_TEST_F(FeedbackTest, DISABLED_GetTargetTabUrl) {
diff --git a/chrome/browser/extensions/api/file_system/consent_provider_impl.cc b/chrome/browser/extensions/api/file_system/consent_provider_impl.cc
index b2c9b62..9b73f33 100644
--- a/chrome/browser/extensions/api/file_system/consent_provider_impl.cc
+++ b/chrome/browser/extensions/api/file_system/consent_provider_impl.cc
@@ -26,9 +26,9 @@
 #include "extensions/common/manifest_handlers/kiosk_mode_info.h"
 #include "ui/base/mojom/dialog_button.mojom.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chromeos/ash/components/file_manager/app_id.h"
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 namespace extensions {
 
@@ -37,9 +37,9 @@
 // List of allowlisted component apps and extensions by their ids for
 // chrome.fileSystem.requestFileSystem.
 const char* const kRequestFileSystemComponentAllowlist[] = {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
     file_manager::kFileManagerAppId, file_manager::kImageLoaderExtensionId,
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
     // TODO(henryhsu,b/110126438): Remove this extension id, and add it only
     // for tests.
     "pkplfbidichfdicaijlchgnapepdginl"  // Testing extensions.
diff --git a/chrome/browser/extensions/api/file_system/request_file_system_notification.cc b/chrome/browser/extensions/api/file_system/request_file_system_notification.cc
index b39ca41..67af7b1 100644
--- a/chrome/browser/extensions/api/file_system/request_file_system_notification.cc
+++ b/chrome/browser/extensions/api/file_system/request_file_system_notification.cc
@@ -127,15 +127,9 @@
       ui::ImageModel(),  // Updated asynchronously later.
       std::u16string(),  // display_source
       GURL(),
-#if BUILDFLAG(IS_CHROMEOS_ASH)
       message_center::NotifierId(
           message_center::NotifierType::SYSTEM_COMPONENT, notification_id,
           ash::NotificationCatalogName::kRequestFileSystem),
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-      message_center::NotifierId(message_center::NotifierType::SYSTEM_COMPONENT,
-                                 notification_id),
-#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
       data, app_notification_launcher));
 
   app_notification_launcher->InitAndShow(profile, extension_id,
diff --git a/chrome/browser/extensions/api/gcm/extension_gcm_app_handler_unittest.cc b/chrome/browser/extensions/api/gcm/extension_gcm_app_handler_unittest.cc
index 6953c60a..bc8128b 100644
--- a/chrome/browser/extensions/api/gcm/extension_gcm_app_handler_unittest.cc
+++ b/chrome/browser/extensions/api/gcm/extension_gcm_app_handler_unittest.cc
@@ -66,7 +66,7 @@
 #include "services/network/test/test_network_connection_tracker.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/ash/login/users/user_manager_delegate_impl.h"
 #include "chrome/browser/ash/settings/scoped_cros_settings_test_helper.h"
 #include "chrome/browser/browser_process.h"
@@ -273,7 +273,7 @@
         std::make_unique<content::InProcessUtilityThreadHelper>();
 
     // This is needed to create extension service under CrOS.
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
     user_manager_.Reset(std::make_unique<user_manager::UserManagerImpl>(
         std::make_unique<ash::UserManagerDelegateImpl>(),
         g_browser_process->local_state(), ash::CrosSettings::Get()));
@@ -304,7 +304,7 @@
   }
 
   void TearDown() override {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
     user_manager_.Reset();
 #endif
 
@@ -314,7 +314,7 @@
     if (partition)
       partition->WaitForDeletionTasksForTesting();
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
     gcm_app_handler_.reset();
     profile_.reset();
     ash::ConciergeClient::Shutdown();
@@ -427,7 +427,7 @@
   base::ScopedTempDir temp_dir_;
 
   // This is needed to create extension service under CrOS.
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   ash::ScopedCrosSettingsTestHelper cros_settings_test_helper_;
   user_manager::ScopedUserManager user_manager_;
 #endif
diff --git a/chrome/browser/extensions/api/identity/gaia_remote_consent_flow.cc b/chrome/browser/extensions/api/identity/gaia_remote_consent_flow.cc
index 41149400..00060e4 100644
--- a/chrome/browser/extensions/api/identity/gaia_remote_consent_flow.cc
+++ b/chrome/browser/extensions/api/identity/gaia_remote_consent_flow.cc
@@ -18,13 +18,9 @@
 #include "services/network/public/mojom/cookie_manager.mojom.h"
 #include "url/url_constants.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/ash/account_manager/account_manager_util.h"
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
-
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-#include "components/signin/core/browser/consistency_cookie_manager.h"
-#endif
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 namespace extensions {
 
diff --git a/chrome/browser/extensions/api/identity/gaia_remote_consent_flow_browsertest.cc b/chrome/browser/extensions/api/identity/gaia_remote_consent_flow_browsertest.cc
index 35949de8..95f7575 100644
--- a/chrome/browser/extensions/api/identity/gaia_remote_consent_flow_browsertest.cc
+++ b/chrome/browser/extensions/api/identity/gaia_remote_consent_flow_browsertest.cc
@@ -25,14 +25,10 @@
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chromeos/ash/components/network/portal_detector/mock_network_portal_detector.h"
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
-// TODO(rsult): Issues with creating a primary account on Lacros on test setup.
-// Should be reworked asap to make it pass as this feature is available on
-// Lacros as well.
-#if !BUILDFLAG(IS_CHROMEOS_LACROS)
 namespace extensions {
 
 namespace {
@@ -60,14 +56,14 @@
  public:
   GaiaRemoteConsentFlowParamBrowserTest()
       : fake_gaia_test_server_(net::EmbeddedTestServer::TYPE_HTTPS) {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
     std::unique_ptr<ash::MockNetworkPortalDetector>
         mock_network_portal_detector_ =
             std::make_unique<ash::MockNetworkPortalDetector>();
 
     ash::network_portal_detector::InitializeForTesting(
         mock_network_portal_detector_.release());
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
     fake_gaia_test_server()->AddDefaultHandlers(GetChromeTestDataDir());
     fake_gaia_test_server_.RegisterRequestHandler(base::BindRepeating(
         &FakeGaia::HandleRequest, base::Unretained(&fake_gaia_)));
@@ -233,4 +229,3 @@
 }
 
 }  // namespace extensions
-#endif  // !BUILDFLAG(IS_CHROMEOS_LACROS)
diff --git a/chrome/browser/extensions/api/identity/identity_api_unittest.cc b/chrome/browser/extensions/api/identity/identity_api_unittest.cc
index 6acea94..fcbf19f 100644
--- a/chrome/browser/extensions/api/identity/identity_api_unittest.cc
+++ b/chrome/browser/extensions/api/identity/identity_api_unittest.cc
@@ -127,7 +127,7 @@
   EXPECT_EQ(api()->GetGaiaIdForExtension(extension_id), std::nullopt);
 }
 
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
 TEST_F(IdentityAPITest, GaiaIdErasedAfterClearPrimaryAccount) {
   std::string extension_id = prefs()->AddExtensionAndReturnId("extension");
   EXPECT_CALL(mock_on_signin_changed_callback(), Run(_)).Times(2);
@@ -139,7 +139,7 @@
   identity_env()->ClearPrimaryAccount();
   EXPECT_EQ(api()->GetGaiaIdForExtension(extension_id), std::nullopt);
 }
-#endif  // !BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // !BUILDFLAG(IS_CHROMEOS)
 
 TEST_F(IdentityAPITest, GaiaIdErasedAfterSignOutTwoAccounts) {
   std::string extension1_id = prefs()->AddExtensionAndReturnId("extension1");
@@ -199,13 +199,13 @@
   identity_env()->RemoveRefreshTokenForAccount(account_3.account_id);
   Mock::VerifyAndClearExpectations(&mock_on_signin_changed_callback());
 
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
   // Clear primary account is expected to remove two accounts and fire two
   // notifications.
   EXPECT_CALL(mock_on_signin_changed_callback(), Run(_)).Times(2);
   identity_env()->ClearPrimaryAccount();
   Mock::VerifyAndClearExpectations(&mock_on_signin_changed_callback());
-#endif  // !BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // !BUILDFLAG(IS_CHROMEOS)
 }
 
 #if BUILDFLAG(ENABLE_DICE_SUPPORT)
diff --git a/chrome/browser/extensions/api/identity/identity_apitest.cc b/chrome/browser/extensions/api/identity/identity_apitest.cc
index 503f14e..8eab44c4 100644
--- a/chrome/browser/extensions/api/identity/identity_apitest.cc
+++ b/chrome/browser/extensions/api/identity/identity_apitest.cc
@@ -106,7 +106,7 @@
 #include "ui/views/window/dialog_delegate.h"
 #include "url/gurl.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/ash/login/users/fake_chrome_user_manager.h"
 #include "chrome/browser/ash/net/network_portal_detector_test_impl.h"
 #include "chromeos/ash/components/install_attributes/stub_install_attributes.h"
@@ -117,12 +117,6 @@
 #include "components/user_manager/scoped_user_manager.h"
 #endif
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-#include "chrome/browser/signin/signin_util.h"
-#include "chromeos/crosapi/mojom/crosapi.mojom.h"
-#include "chromeos/startup/browser_init_params.h"
-#endif
-
 using extensions::ExtensionsAPIClient;
 using testing::_;
 using testing::Return;
@@ -147,7 +141,7 @@
 const char kLaunchWebAuthFlowResultHistogramName[] =
     "Signin.Extensions.LaunchWebAuthFlowResult";
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 void InitNetwork() {
   const ash::NetworkState* default_network =
       ash::NetworkHandler::Get()->network_state_handler()->DefaultNetwork();
@@ -598,7 +592,7 @@
   void SetUpOnMainThread() override {
     AsyncExtensionBrowserTest::SetUpOnMainThread();
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
     // Fake the network online state so that Gaia requests can come through.
     InitNetwork();
 #endif
@@ -1149,7 +1143,7 @@
 }
 
 // The signin flow is simply not used on ChromeOS.
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest,
                        InteractiveNotSignedInShowSigninOnlyOnce) {
   scoped_refptr<FakeGetAuthTokenFunction> func(new FakeGetAuthTokenFunction());
@@ -1165,8 +1159,6 @@
       IdentityGetAuthTokenError::State::kSignInFailed, 1);
 }
 
-// Signin is always allowed on Lacros.
-#if !BUILDFLAG(IS_CHROMEOS_LACROS)
 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest,
                        PRE_InteractiveNotSignedAndSigninNotAllowed) {
   // kSigninAllowed cannot be set after the profile creation. Use
@@ -1191,8 +1183,7 @@
       kGetAuthTokenResultHistogramName,
       IdentityGetAuthTokenError::State::kBrowserSigninNotAllowed, 1);
 }
-#endif  // !BUILDFLAG(IS_CHROMEOS_LACROS)
-#endif  // !BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // !BUILDFLAG(IS_CHROMEOS)
 
 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, NonInteractiveMintFailure) {
   SignIn("primary@example.com");
@@ -1303,7 +1294,7 @@
 }
 
 // The signin flow is simply not used on Ash.
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest,
                        InteractiveMintServiceErrorShowSigninOnlyOnce) {
   scoped_refptr<FakeGetAuthTokenFunction> func(new FakeGetAuthTokenFunction());
@@ -1357,7 +1348,7 @@
   EXPECT_EQ(std::string(errors::kUserNotSignedIn), error);
 // Ash does not support the interactive login flow, so the login UI will never
 // be shown on that platform.
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
   EXPECT_TRUE(func->login_ui_shown());
 #endif
   EXPECT_FALSE(func->scope_ui_shown());
@@ -1388,7 +1379,7 @@
 // The interactive login flow is always short-circuited out with failure on
 // Ash, so the tests of the interactive login flow being successful are not
 // relevant on that platform.
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest,
                        InteractiveLoginSuccessMintFailure) {
   scoped_refptr<FakeGetAuthTokenFunction> func(new FakeGetAuthTokenFunction());
@@ -1618,7 +1609,7 @@
       kGetAuthTokenResultHistogramName,
       IdentityGetAuthTokenError::State::kRemoteConsentFlowRejected, 1);
 }
-#endif  // !BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // !BUILDFLAG(IS_CHROMEOS)
 
 class GetAuthTokenFunctionInteractivityTest
     : public GetAuthTokenFunctionTest,
@@ -1668,7 +1659,7 @@
 // The interactive login flow is always short-circuited out with failure on
 // Ash, so the tests of the interactive login flow being successful are not
 // relevant on that platform.
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
 IN_PROC_BROWSER_TEST_P(GetAuthTokenFunctionInteractivityTest,
                        SigninInteractivityTest) {
   scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES));
@@ -1723,7 +1714,7 @@
   histogram_tester()->ExpectUniqueSample(kGetAuthTokenResultHistogramName,
                                          expected_error_state, 1);
 }
-#endif  // !BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // !BUILDFLAG(IS_CHROMEOS)
 
 IN_PROC_BROWSER_TEST_P(GetAuthTokenFunctionInteractivityTest,
                        ConsentInteractivityTest) {
@@ -1863,7 +1854,7 @@
 }
 
 // The signin flow is simply not used on Ash.
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest,
                        InteractiveApprovalNoGrantShowSigninUIOnlyOnce) {
   scoped_refptr<FakeGetAuthTokenFunction> func(new FakeGetAuthTokenFunction());
@@ -2260,7 +2251,7 @@
 
 // The interactive login UI is never shown on Ash, so tests of the interactive
 // login flow being successful are not relevant on that platform.
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, LoginInvalidatesTokenCache) {
   scoped_refptr<FakeGetAuthTokenFunction> func(new FakeGetAuthTokenFunction());
   scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES));
@@ -2892,7 +2883,7 @@
 }
 
 // The signin flow is simply not used on Ash.
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest,
                        MultiSecondaryInteractiveInvalidToken) {
   // Setup a secondary account with no valid refresh token, and try to get a
@@ -3112,7 +3103,7 @@
 #if BUILDFLAG(IS_CHROMEOS)
 enum class DeviceLocalAccountSessionType { kPublic, kAppKiosk, kWebKiosk };
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 class GetAuthTokenFunctionDeviceLocalAccountTestPlatformHelper {
  public:
   const AccountId kFakeAccountId = AccountId::FromUserEmail("test@test");
@@ -3168,40 +3159,7 @@
 
   std::unique_ptr<user_manager::ScopedUserManager> scoped_user_manager_;
 };
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
-
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-class GetAuthTokenFunctionDeviceLocalAccountTestPlatformHelper {
- public:
-  explicit GetAuthTokenFunctionDeviceLocalAccountTestPlatformHelper(
-      DeviceLocalAccountSessionType session_type) {
-    crosapi::mojom::SessionType init_params_session_type =
-        crosapi::mojom::SessionType::kUnknown;
-    switch (session_type) {
-      case DeviceLocalAccountSessionType::kPublic:
-        init_params_session_type = crosapi::mojom::SessionType::kPublicSession;
-        break;
-      case DeviceLocalAccountSessionType::kAppKiosk:
-        init_params_session_type =
-            crosapi::mojom::SessionType::kAppKioskSession;
-        break;
-      case DeviceLocalAccountSessionType::kWebKiosk:
-        init_params_session_type =
-            crosapi::mojom::SessionType::kWebKioskSession;
-        break;
-    }
-    crosapi::mojom::BrowserInitParamsPtr init_params =
-        crosapi::mojom::BrowserInitParams::New();
-    init_params->session_type = init_params_session_type;
-    init_params->is_device_enterprised_managed = true;
-    init_params->device_settings = crosapi::mojom::DeviceSettings::New();
-    chromeos::BrowserInitParams::SetInitParamsForTests(std::move(init_params));
-  }
-
-  void SetUpOnMainThread() {}
-  void TearDownOnMainThread() {}
-};
-#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 class GetAuthTokenFunctionDeviceLocalAccountTest
     : public GetAuthTokenFunctionTest {
@@ -3510,7 +3468,7 @@
 }
 
 // The signin flow is not used on Ash.
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
 // Tests that Chrome does not have any selected user id value if the account
 // specified by the extension is not available.
 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionSelectedUserIdTest,
@@ -4304,7 +4262,7 @@
   EXPECT_FALSE(HasExpectedEvent());
 }
 
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
 // Test that an event is fired when the primary account signs out. Only
 // applicable in non-DICE mode, as when DICE is enabled clearing the primary
 // account does not result in its refresh token being removed and hence does
@@ -4319,13 +4277,6 @@
 
   SignIn("primary@example.com");
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  // Clear primary account is not allowed in Lacros main profile.
-  // This test overrides |UserSignoutSetting| to test Lacros secondary profile.
-  ChromeSigninClientFactory::GetForProfile(profile())
-      ->set_is_clear_primary_account_allowed_for_testing(
-          SigninClient::SignoutDecision::ALLOW);
-#endif
   AddExpectedEvent(api::identity::OnSignInChanged::Create(account_info, false));
 
   // Sign out and verify that the callback fires.
@@ -4333,7 +4284,7 @@
 
   EXPECT_FALSE(HasExpectedEvent());
 }
-#endif  // !BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // !BUILDFLAG(IS_CHROMEOS)
 
 // Test that an event is fired when the primary account has a refresh token
 // invalidated.
diff --git a/chrome/browser/extensions/api/identity/identity_get_auth_token_function.cc b/chrome/browser/extensions/api/identity/identity_get_auth_token_function.cc
index b57fd80c..da0938c 100644
--- a/chrome/browser/extensions/api/identity/identity_get_auth_token_function.cc
+++ b/chrome/browser/extensions/api/identity/identity_get_auth_token_function.cc
@@ -306,7 +306,7 @@
   // If the signin flow fails, don't display the login prompt again.
   interactivity_status_for_signin_ = InteractivityStatus::kNotRequested;
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // In normal mode (i.e. non-kiosk mode), the user has to log out to
   // re-establish credentials. Let the global error popup handle everything.
   // In kiosk mode, interactive sign-in is not supported.
diff --git a/chrome/browser/extensions/api/identity/identity_get_auth_token_function.h b/chrome/browser/extensions/api/identity/identity_get_auth_token_function.h
index 48fee94..838aeb1 100644
--- a/chrome/browser/extensions/api/identity/identity_get_auth_token_function.h
+++ b/chrome/browser/extensions/api/identity/identity_get_auth_token_function.h
@@ -26,14 +26,10 @@
 #include "google_apis/gaia/google_service_auth_error.h"
 #include "google_apis/gaia/oauth2_mint_token_flow.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/ash/crosapi/device_oauth2_token_service_ash.h"
 #endif
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-#include "chrome/browser/lacros/device_oauth2_token_service_lacros.h"
-#endif
-
 namespace signin {
 class AccessTokenFetcher;
 struct AccessTokenInfo;
@@ -141,14 +137,8 @@
   // Exposed for testing.
   std::string GetSelectedUserId() const;
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-  using DeviceOAuth2TokenFetcher = crosapi::DeviceOAuth2TokenServiceAsh;
-#endif
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  using DeviceOAuth2TokenFetcher = DeviceOAuth2TokenServiceLacros;
-#endif
-
 #if BUILDFLAG(IS_CHROMEOS)
+  using DeviceOAuth2TokenFetcher = crosapi::DeviceOAuth2TokenServiceAsh;
   std::unique_ptr<DeviceOAuth2TokenFetcher> device_oauth2_token_fetcher_;
 #endif
 
diff --git a/chrome/browser/extensions/api/identity/identity_launch_web_auth_flow_function.cc b/chrome/browser/extensions/api/identity/identity_launch_web_auth_flow_function.cc
index e779b6b..bec127b 100644
--- a/chrome/browser/extensions/api/identity/identity_launch_web_auth_flow_function.cc
+++ b/chrome/browser/extensions/api/identity/identity_launch_web_auth_flow_function.cc
@@ -17,7 +17,7 @@
 #include "components/prefs/pref_service.h"
 #include "extensions/browser/pref_names.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/extensions/api/identity/launch_web_auth_flow_delegate_ash.h"
 #endif
 
@@ -89,7 +89,7 @@
              base::FEATURE_ENABLED_BY_DEFAULT);
 
 IdentityLaunchWebAuthFlowFunction::IdentityLaunchWebAuthFlowFunction() {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   delegate_ = std::make_unique<LaunchWebAuthFlowDelegateAsh>();
 #endif
 }
diff --git a/chrome/browser/extensions/api/image_writer_private/destroy_partitions_operation_unittest.cc b/chrome/browser/extensions/api/image_writer_private/destroy_partitions_operation_unittest.cc
index 330922c..10f04da 100644
--- a/chrome/browser/extensions/api/image_writer_private/destroy_partitions_operation_unittest.cc
+++ b/chrome/browser/extensions/api/image_writer_private/destroy_partitions_operation_unittest.cc
@@ -26,7 +26,7 @@
   TestingProfile profile;
   MockOperationManager manager(&profile);
 
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
   auto set_up_utility_client_progress_simulation =
       [](FakeImageWriterClient* client) {
         std::vector<int> progress_list{0, 50, 100};
diff --git a/chrome/browser/extensions/api/image_writer_private/image_writer_private_api.cc b/chrome/browser/extensions/api/image_writer_private/image_writer_private_api.cc
index fe208ca..6c8bb83 100644
--- a/chrome/browser/extensions/api/image_writer_private/image_writer_private_api.cc
+++ b/chrome/browser/extensions/api/image_writer_private/image_writer_private_api.cc
@@ -19,44 +19,18 @@
 #include "chromeos/components/disks/disks_prefs.h"
 #endif
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-#include "chrome/browser/extensions/api/image_writer_private/image_writer_controller_lacros.h"
-#endif
-
 namespace image_writer_api = extensions::api::image_writer_private;
 
 namespace extensions {
 
 namespace {
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-api::image_writer_private::RemovableStorageDevice FromMojo(
-    const crosapi::mojom::RemovableStorageDevicePtr& mojo_device) {
-  api::image_writer_private::RemovableStorageDevice device;
-  device.storage_unit_id = mojo_device->storage_unit_id;
-  device.capacity = mojo_device->capacity;
-  device.vendor = mojo_device->vendor;
-  device.model = mojo_device->model;
-  device.removable = mojo_device->removable;
-  return device;
-}
-#endif  // BUILDFLAG(IS_CHROMOS_LACROS)
-
 }  // namespace
 
 ImageWriterPrivateBaseFunction::ImageWriterPrivateBaseFunction() = default;
 
 ImageWriterPrivateBaseFunction::~ImageWriterPrivateBaseFunction() = default;
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-void ImageWriterPrivateBaseFunction::OnComplete(
-    const std::optional<std::string>& error) {
-  if (error)
-    Respond(Error(error.value()));
-  else
-    Respond(NoArguments());
-}
-#else
 void ImageWriterPrivateBaseFunction::OnComplete(bool success,
                                                 const std::string& error) {
   if (success)
@@ -64,7 +38,6 @@
   else
     Respond(Error(error));
 }
-#endif  // BUILDFLAG(IS_CHROMOS_LACROS)
 
 ImageWriterPrivateWriteFromUrlFunction::
     ImageWriterPrivateWriteFromUrlFunction() = default;
@@ -94,20 +67,12 @@
     hash = *params->options->image_hash;
   }
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  image_writer::ImageWriterControllerLacros::Get(browser_context())
-      ->WriteFromUrl(
-          extension_id(), params->storage_unit_id, url,
-          hash.empty() ? std::nullopt : std::make_optional(hash),
-          base::BindOnce(&ImageWriterPrivateWriteFromUrlFunction::OnComplete,
-                         this));
-#else
   image_writer::OperationManager::Get(browser_context())
       ->StartWriteFromUrl(
           extension_id(), url, hash, params->storage_unit_id,
           base::BindOnce(&ImageWriterPrivateWriteFromUrlFunction::OnComplete,
                          this));
-#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
+
   return RespondLater();
 }
 
@@ -144,19 +109,12 @@
     return RespondNow(Error(std::move(error)));
   }
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  image_writer::ImageWriterControllerLacros::Get(browser_context())
-      ->WriteFromFile(
-          extension_id(), storage_unit_id, path,
-          base::BindOnce(&ImageWriterPrivateWriteFromFileFunction::OnComplete,
-                         this));
-#else
   image_writer::OperationManager::Get(browser_context())
       ->StartWriteFromFile(
           extension_id(), path, storage_unit_id,
           base::BindOnce(&ImageWriterPrivateWriteFromFileFunction::OnComplete,
                          this));
-#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
+
   return RespondLater();
 }
 
@@ -167,19 +125,12 @@
     ~ImageWriterPrivateCancelWriteFunction() = default;
 
 ExtensionFunction::ResponseAction ImageWriterPrivateCancelWriteFunction::Run() {
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  image_writer::ImageWriterControllerLacros::Get(browser_context())
-      ->CancelWrite(
-          extension_id(),
-          base::BindOnce(&ImageWriterPrivateCancelWriteFunction::OnComplete,
-                         this));
-#else
   image_writer::OperationManager::Get(browser_context())
       ->CancelWrite(
           extension_id(),
           base::BindOnce(&ImageWriterPrivateCancelWriteFunction::OnComplete,
                          this));
-#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
+
   return RespondLater();
 }
 
@@ -203,19 +154,12 @@
       image_writer_api::DestroyPartitions::Params::Create(args());
   EXTENSION_FUNCTION_VALIDATE(params);
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  image_writer::ImageWriterControllerLacros::Get(browser_context())
-      ->DestroyPartitions(
-          extension_id(), params->storage_unit_id,
-          base::BindOnce(
-              &ImageWriterPrivateDestroyPartitionsFunction::OnComplete, this));
-#else
   image_writer::OperationManager::Get(browser_context())
       ->DestroyPartitions(
           extension_id(), params->storage_unit_id,
           base::BindOnce(
               &ImageWriterPrivateDestroyPartitionsFunction::OnComplete, this));
-#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
+
   return RespondLater();
 }
 
@@ -236,17 +180,10 @@
   }
 #endif  // BUILDFLAG(IS_CHROMEOS)
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  image_writer::ImageWriterControllerLacros::Get(browser_context())
-      ->ListRemovableStorageDevices(base::BindOnce(
-          &ImageWriterPrivateListRemovableStorageDevicesFunction::
-              OnCrosapiDeviceListReady,
-          this));
-#else
   RemovableStorageProvider::GetAllDevices(base::BindOnce(
       &ImageWriterPrivateListRemovableStorageDevicesFunction::OnDeviceListReady,
       this));
-#endif
+
   return RespondLater();
 }
 
@@ -262,23 +199,4 @@
   }
 }
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-void ImageWriterPrivateListRemovableStorageDevicesFunction::
-    OnCrosapiDeviceListReady(
-        std::optional<std::vector<crosapi::mojom::RemovableStorageDevicePtr>>
-            mojo_devices) {
-  if (!mojo_devices) {
-    Respond(Error(image_writer::error::kDeviceListError));
-    return;
-  }
-
-  std::vector<api::image_writer_private::RemovableStorageDevice> devices;
-  for (const auto& mojo_device : mojo_devices.value())
-    devices.push_back(FromMojo(mojo_device));
-
-  Respond(ArgumentList(
-      image_writer_api::ListRemovableStorageDevices::Results::Create(devices)));
-}
-#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
-
 }  // namespace extensions
diff --git a/chrome/browser/extensions/api/image_writer_private/image_writer_private_api.h b/chrome/browser/extensions/api/image_writer_private/image_writer_private_api.h
index 428a836..c31ce7a 100644
--- a/chrome/browser/extensions/api/image_writer_private/image_writer_private_api.h
+++ b/chrome/browser/extensions/api/image_writer_private/image_writer_private_api.h
@@ -9,10 +9,6 @@
 #include "chrome/common/extensions/api/image_writer_private.h"
 #include "extensions/browser/extension_function.h"
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-#include "chromeos/crosapi/mojom/image_writer.mojom.h"
-#endif
-
 namespace extensions {
 
 class ImageWriterPrivateBaseFunction : public ExtensionFunction {
@@ -24,11 +20,7 @@
   ImageWriterPrivateBaseFunction& operator=(
       const ImageWriterPrivateBaseFunction&) = delete;
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  virtual void OnComplete(const std::optional<std::string>& error);
-#else
   virtual void OnComplete(bool success, const std::string& error);
-#endif
 
  protected:
   ~ImageWriterPrivateBaseFunction() override;
@@ -93,11 +85,6 @@
   ~ImageWriterPrivateListRemovableStorageDevicesFunction() override;
   ResponseAction Run() override;
   void OnDeviceListReady(scoped_refptr<StorageDeviceList> device_list);
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  void OnCrosapiDeviceListReady(
-      std::optional<std::vector<crosapi::mojom::RemovableStorageDevicePtr>>
-          devices);
-#endif
 };
 
 }  // namespace extensions
diff --git a/chrome/browser/extensions/api/image_writer_private/image_writer_private_api_unittest.cc b/chrome/browser/extensions/api/image_writer_private/image_writer_private_api_unittest.cc
index 4681c1a..1704610 100644
--- a/chrome/browser/extensions/api/image_writer_private/image_writer_private_api_unittest.cc
+++ b/chrome/browser/extensions/api/image_writer_private/image_writer_private_api_unittest.cc
@@ -17,7 +17,7 @@
 #include "extensions/browser/api_unittest.h"
 
 namespace extensions {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 using api::image_writer_private::RemovableStorageDevice;
 class ImageWriterPrivateApiUnittest : public ExtensionApiUnittest {
  public:
@@ -65,6 +65,6 @@
                          image_writer::error::kDeviceWriteError));
 }
 
-#endif  // if BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // if BUILDFLAG(IS_CHROMEOS)
 
 }  // namespace extensions
diff --git a/chrome/browser/extensions/api/image_writer_private/image_writer_private_apitest.cc b/chrome/browser/extensions/api/image_writer_private/image_writer_private_apitest.cc
index 2d68787..9d98506 100644
--- a/chrome/browser/extensions/api/image_writer_private/image_writer_private_apitest.cc
+++ b/chrome/browser/extensions/api/image_writer_private/image_writer_private_apitest.cc
@@ -91,7 +91,7 @@
   auto reset_options =
       FileSystemChooseEntryFunction::SetOptionsForTesting(test_options);
 
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
   auto set_up_utility_client_callbacks = [](FakeImageWriterClient* client) {
     std::vector<int> progress_list{0, 50, 100};
     client->SimulateProgressOnWrite(progress_list, true);
diff --git a/chrome/browser/extensions/api/image_writer_private/operation.cc b/chrome/browser/extensions/api/image_writer_private/operation.cc
index bbd9879..a4db69dc 100644
--- a/chrome/browser/extensions/api/image_writer_private/operation.cc
+++ b/chrome/browser/extensions/api/image_writer_private/operation.cc
@@ -111,7 +111,7 @@
 
 void Operation::Start() {
   DCHECK(IsRunningInCorrectSequence());
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   if (download_folder_.empty() ||
       !temp_dir_->CreateUniqueTempDirUnderPath(download_folder_)) {
 #else
@@ -230,7 +230,7 @@
   PostTask(std::move(continuation));
 }
 
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
 void Operation::StartUtilityClient() {
   DCHECK(IsRunningInCorrectSequence());
   if (!image_writer_client_.get()) {
diff --git a/chrome/browser/extensions/api/image_writer_private/operation.h b/chrome/browser/extensions/api/image_writer_private/operation.h
index b7b0bca..a9bd079 100644
--- a/chrome/browser/extensions/api/image_writer_private/operation.h
+++ b/chrome/browser/extensions/api/image_writer_private/operation.h
@@ -22,7 +22,7 @@
 #include "chrome/common/extensions/api/image_writer_private.h"
 #include "extensions/common/extension_id.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chromeos/ash/components/disks/disk_mount_manager.h"
 #endif
 
@@ -39,7 +39,7 @@
 
 class OperationManager;
 
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
 class ImageWriterUtilityClient;
 #endif
 
@@ -169,7 +169,7 @@
   friend class ImageWriterUtilityClientTest;
   friend class WriteFromUrlOperationForTest;
 
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
   // Ensures the client is started.  This may be called many times but will only
   // instantiate one client which should exist for the lifetime of the
   // Operation.
@@ -185,7 +185,7 @@
   scoped_refptr<ImageWriterUtilityClient> image_writer_client_;
 #endif
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // Unmounts all volumes on |device_path_|.
   void UnmountVolumes(base::OnceClosure continuation);
   // Starts the write after unmounting.
diff --git a/chrome/browser/extensions/api/image_writer_private/operation_manager.cc b/chrome/browser/extensions/api/image_writer_private/operation_manager.cc
index ae8b9a3c..5fb77b5 100644
--- a/chrome/browser/extensions/api/image_writer_private/operation_manager.cc
+++ b/chrome/browser/extensions/api/image_writer_private/operation_manager.cc
@@ -27,7 +27,7 @@
 #include "extensions/common/extension_id.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/ash/crosapi/crosapi_ash.h"
 #include "chrome/browser/ash/crosapi/crosapi_manager.h"
 #include "chrome/browser/ash/crosapi/image_writer_ash.h"
@@ -41,7 +41,7 @@
 namespace image_writer {
 
 namespace {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 crosapi::mojom::Stage ToMojo(image_writer_api::Stage stage) {
   switch (stage) {
     case image_writer_api::Stage::kConfirmation:
@@ -115,7 +115,7 @@
                                     percent_complete, error);
   }
 }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 }  // namespace
 
 using content::BrowserThread;
@@ -142,7 +142,7 @@
     const std::string& hash,
     const std::string& device_path,
     Operation::StartWriteCallback callback) {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // Chrome OS can only support a single operation at a time.
   if (operations_.size() > 0) {
 #else
@@ -176,7 +176,7 @@
     const base::FilePath& path,
     const std::string& device_path,
     Operation::StartWriteCallback callback) {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // Chrome OS can only support a single operation at a time.
   if (operations_.size() > 0) {
 #else
@@ -243,7 +243,7 @@
       events::IMAGE_WRITER_PRIVATE_ON_WRITE_PROGRESS,
       image_writer_api::OnWriteProgress::kEventName, std::move(args)));
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // If the the |extension_id| is a remote image writer client token string,
   // dispatch the event to Lacros via crosapi; otherwise, it must be the id of
   // the extension which makes the extension API call, dispatch the event to
@@ -257,7 +257,7 @@
 #else
   EventRouter::Get(browser_context_)
       ->DispatchEventToExtension(extension_id, std::move(event));
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 }
 
 void OperationManager::OnComplete(const ExtensionId& extension_id) {
@@ -268,7 +268,7 @@
       events::IMAGE_WRITER_PRIVATE_ON_WRITE_COMPLETE,
       image_writer_api::OnWriteComplete::kEventName, std::move(args)));
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // If the the |extension_id| is a remote image writer client token string,
   // dispatch the event to Lacros via crosapi; otherwise, it must be the id of
   // the extension which makes the extension API call, dispatch the event to
@@ -282,7 +282,7 @@
 #else
   EventRouter::Get(browser_context_)
       ->DispatchEventToExtension(extension_id, std::move(event));
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
   DeleteOperation(extension_id);
 }
@@ -304,7 +304,7 @@
       new Event(events::IMAGE_WRITER_PRIVATE_ON_WRITE_ERROR,
                 image_writer_api::OnWriteError::kEventName, std::move(args)));
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // If the the |extension_id| is a remote image writer client token string,
   // dispatch the event to Lacros via crosapi; otherwise, it must be the id of
   // the extension which makes the extension API call, dispatch the event to
@@ -319,13 +319,13 @@
 #else
   EventRouter::Get(browser_context_)
       ->DispatchEventToExtension(extension_id, std::move(event));
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
   DeleteOperation(extension_id);
 }
 
 base::FilePath OperationManager::GetAssociatedDownloadFolder() {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   Profile* profile = Profile::FromBrowserContext(browser_context_);
   return file_manager::util::GetDownloadsFolderForProfile(profile);
 #else
diff --git a/chrome/browser/extensions/api/image_writer_private/operation_unittest.cc b/chrome/browser/extensions/api/image_writer_private/operation_unittest.cc
index 8fd8bd73..cc8c3da 100644
--- a/chrome/browser/extensions/api/image_writer_private/operation_unittest.cc
+++ b/chrome/browser/extensions/api/image_writer_private/operation_unittest.cc
@@ -32,7 +32,7 @@
 using testing::Gt;
 using testing::Lt;
 
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
 
 void SetUpUtilityClientProgressOnVerifyWrite(
     const std::vector<int>& progress_list,
@@ -41,7 +41,7 @@
   client->SimulateProgressOnVerifyWrite(progress_list, will_succeed);
 }
 
-#endif  // !BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // !BUILDFLAG(IS_CHROMEOS)
 
 }  // namespace
 
@@ -171,7 +171,7 @@
 
 #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
 TEST_F(ImageWriterOperationTest, WriteImageToDevice) {
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
   auto set_up_utility_client_progress =
       [](const std::vector<int>& progress_list, bool will_succeed,
          FakeImageWriterClient* client) {
@@ -200,7 +200,7 @@
 }
 #endif  // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
 
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
 // Chrome OS doesn't support verification in the ImageBurner, so these two tests
 // are skipped.
 
@@ -256,7 +256,7 @@
   operation_->VerifyWrite(base::DoNothing());
   content::RunAllTasksUntilIdle();
 }
-#endif  // !BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // !BUILDFLAG(IS_CHROMEOS)
 
 // Tests that on creation the operation_ has the expected state.
 TEST_F(ImageWriterOperationTest, Creation) {
diff --git a/chrome/browser/extensions/api/image_writer_private/test_utils.cc b/chrome/browser/extensions/api/image_writer_private/test_utils.cc
index 0490d5c..d00e2a9 100644
--- a/chrome/browser/extensions/api/image_writer_private/test_utils.cc
+++ b/chrome/browser/extensions/api/image_writer_private/test_utils.cc
@@ -19,7 +19,7 @@
 #include "chrome/browser/extensions/api/image_writer_private/error_constants.h"
 #include "chrome/common/chrome_paths.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chromeos/ash/components/dbus/concierge/concierge_client.h"
 #include "chromeos/ash/components/dbus/dbus_thread_manager.h"  // nogncheck
 #include "chromeos/ash/components/dbus/image_burner/fake_image_burner_client.h"
@@ -30,7 +30,7 @@
 namespace extensions {
 namespace image_writer {
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 class ImageWriterFakeImageBurnerClient : public ash::FakeImageBurnerClient {
  public:
   ImageWriterFakeImageBurnerClient() = default;
@@ -70,7 +70,7 @@
     : OperationManager(context) {}
 MockOperationManager::~MockOperationManager() = default;
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 FakeDiskMountManager::FakeDiskMountManager() {}
 FakeDiskMountManager::~FakeDiskMountManager() = default;
 
@@ -186,17 +186,17 @@
     std::move(cancel_callback_).Run();
 }
 
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
 scoped_refptr<ImageWriterUtilityClient> CreateFakeImageWriterUtilityClient(
     ImageWriterTestUtils* utils) {
   auto* client = new FakeImageWriterClient();
   utils->OnUtilityClientCreated(client);
   return base::WrapRefCounted(client);
 }
-#endif  // !BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // !BUILDFLAG(IS_CHROMEOS)
 
 ImageWriterTestUtils::ImageWriterTestUtils()
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
     : utility_client_factory_(
           base::BindRepeating(&CreateFakeImageWriterUtilityClient, this))
 #endif
@@ -205,7 +205,7 @@
 
 ImageWriterTestUtils::~ImageWriterTestUtils() = default;
 
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
 void ImageWriterTestUtils::OnUtilityClientCreated(
     FakeImageWriterClient* client) {
   DCHECK(!client_.get())
@@ -216,7 +216,7 @@
 }
 #endif
 
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
 void ImageWriterTestUtils::RunOnUtilityClientCreation(
     base::OnceCallback<void(FakeImageWriterClient*)> closure) {
   client_creation_callback_ = std::move(closure);
@@ -233,7 +233,7 @@
   ASSERT_TRUE(FillFile(test_image_path_, kImagePattern, kTestFileSize));
   ASSERT_TRUE(FillFile(test_device_path_, kDevicePattern, kTestFileSize));
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // Browser tests might have already initialized ConciergeClient.
   if (!ash::ConciergeClient::Get()) {
     ash::ConciergeClient::InitializeFake(
@@ -258,7 +258,7 @@
 }
 
 void ImageWriterTestUtils::TearDown() {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   ash::ImageBurnerClient::SetInstanceForTest(nullptr);
   image_burner_client_.reset();
 
diff --git a/chrome/browser/extensions/api/image_writer_private/test_utils.h b/chrome/browser/extensions/api/image_writer_private/test_utils.h
index c8cbb48..699cef8f 100644
--- a/chrome/browser/extensions/api/image_writer_private/test_utils.h
+++ b/chrome/browser/extensions/api/image_writer_private/test_utils.h
@@ -23,7 +23,7 @@
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chromeos/ash/components/disks/disk_mount_manager.h"
 #include "chromeos/ash/components/disks/mock_disk_mount_manager.h"
 #endif
@@ -31,7 +31,7 @@
 namespace extensions {
 namespace image_writer {
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 class ImageWriterFakeImageBurnerClient;
 #endif
 
@@ -66,7 +66,7 @@
                              const std::string& error_message));
 };
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 // A fake for the DiskMountManager that will successfully call the unmount
 // callback.
 class FakeDiskMountManager : public ash::disks::MockDiskMountManager {
@@ -150,7 +150,7 @@
   ImageWriterTestUtils();
   virtual ~ImageWriterTestUtils();
 
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
   using UtilityClientCreationCallback =
       base::OnceCallback<void(FakeImageWriterClient*)>;
   void RunOnUtilityClientCreation(UtilityClientCreationCallback callback);
@@ -182,7 +182,7 @@
   base::FilePath test_image_path_;
   base::FilePath test_device_path_;
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   std::unique_ptr<ImageWriterFakeImageBurnerClient> image_burner_client_;
   bool concierge_client_initialized_ = false;
 #else
diff --git a/chrome/browser/extensions/api/image_writer_private/write_from_file_operation_unittest.cc b/chrome/browser/extensions/api/image_writer_private/write_from_file_operation_unittest.cc
index 3b9daeb5..8e7e9e12 100644
--- a/chrome/browser/extensions/api/image_writer_private/write_from_file_operation_unittest.cc
+++ b/chrome/browser/extensions/api/image_writer_private/write_from_file_operation_unittest.cc
@@ -21,7 +21,7 @@
 
 namespace {
 
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
 void SetUpImageWriteClientProgressSimulation(FakeImageWriterClient* client) {
   std::vector<int> progress_list{0, 50, 100};
   bool will_succeed = true;
@@ -61,7 +61,7 @@
 
 // Runs the entire WriteFromFile operation.
 TEST_F(ImageWriterFromFileTest, WriteFromFileEndToEnd) {
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
   // Sets up simulating Operation::Progress() and Operation::Success().
   test_utils_.RunOnUtilityClientCreation(
       base::BindOnce(&SetUpImageWriteClientProgressSimulation));
@@ -81,7 +81,7 @@
                                    image_writer_api::Stage::kWrite, 100))
       .Times(AtLeast(1));
 
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
   // Chrome OS doesn't verify.
   EXPECT_CALL(manager_, OnProgress(kDummyExtensionId,
                                    image_writer_api::Stage::kVerifyWrite, _))
diff --git a/chrome/browser/extensions/api/input_ime/BUILD.gn b/chrome/browser/extensions/api/input_ime/BUILD.gn
index 77b29a6..bf76648 100644
--- a/chrome/browser/extensions/api/input_ime/BUILD.gn
+++ b/chrome/browser/extensions/api/input_ime/BUILD.gn
@@ -6,7 +6,7 @@
 import("//extensions/buildflags/buildflags.gni")
 
 assert(enable_extensions)
-assert(is_chromeos_ash)
+assert(is_chromeos)
 
 source_set("input_ime") {
   sources = [
diff --git a/chrome/browser/extensions/api/language_settings_private/language_settings_private_api.cc b/chrome/browser/extensions/api/language_settings_private/language_settings_private_api.cc
index bdd66ae..053305d 100644
--- a/chrome/browser/extensions/api/language_settings_private/language_settings_private_api.cc
+++ b/chrome/browser/extensions/api/language_settings_private/language_settings_private_api.cc
@@ -47,7 +47,7 @@
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/l10n/l10n_util_collator.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "ash/constants/ash_features.h"
 #include "chrome/grit/generated_resources.h"
 #include "ui/base/ime/ash/component_extension_ime_manager.h"
@@ -63,7 +63,7 @@
 
 namespace {
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 using ::ash::input_method::InputMethodDescriptor;
 using ::ash::input_method::InputMethodDescriptors;
 using ::ash::input_method::InputMethodManager;
@@ -191,7 +191,7 @@
   return tags;
 }
 
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 std::unique_ptr<translate::TranslatePrefs>
 CreateTranslatePrefsForBrowserContext(
@@ -228,10 +228,10 @@
 
   // Build the language list.
   language_list_.clear();
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   const base::flat_set<std::string> allowed_ui_locales(GetAllowedLanguages(
       Profile::FromBrowserContext(browser_context())->GetPrefs()));
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
   for (const auto& entry : languages) {
     language_settings_private::Language language;
 
@@ -250,17 +250,17 @@
     if (l10n_util::IsUserFacingUILocale(entry.code)) {
       language.supports_ui = true;
     }
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
     if (!allowed_ui_locales.empty() &&
         !base::Contains(allowed_ui_locales, language.code)) {
       language.is_prohibited_language = true;
     }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
     language_list_.Append(language.ToValue());
   }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // Send the display name of the fake language for ARC IMEs to the JS side.
   // |native_display_name| does't have to be set because the language selection
   // drop-down menu doesn't list the fake language.
@@ -271,7 +271,7 @@
         l10n_util::GetStringUTF8(IDS_SETTINGS_LANGUAGES_KEYBOARD_APPS);
     language_list_.Append(base::Value(language.ToValue()));
   }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 #if BUILDFLAG(IS_WIN)
   if (spellcheck::UseBrowserSpellChecker()) {
@@ -688,7 +688,7 @@
   return RespondNow(NoArguments());
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 // Populates the vector of input methods using information in the list of
 // descriptors. Used for languageSettingsPrivate.getInputMethodLists().
 void PopulateInputMethodListFromDescriptors(
@@ -747,7 +747,7 @@
 
 ExtensionFunction::ResponseAction
 LanguageSettingsPrivateGetInputMethodListsFunction::Run() {
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
   EXTENSION_FUNCTION_VALIDATE(false);
   return RespondNow(NoArguments());
 #else
@@ -781,7 +781,7 @@
 
 ExtensionFunction::ResponseAction
 LanguageSettingsPrivateAddInputMethodFunction::Run() {
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
   EXTENSION_FUNCTION_VALIDATE(false);
 #else
   const auto params =
@@ -853,7 +853,7 @@
 
 ExtensionFunction::ResponseAction
 LanguageSettingsPrivateRemoveInputMethodFunction::Run() {
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
   EXTENSION_FUNCTION_VALIDATE(false);
 #else
   const auto params =
diff --git a/chrome/browser/extensions/api/language_settings_private/language_settings_private_api_unittest.cc b/chrome/browser/extensions/api/language_settings_private/language_settings_private_api_unittest.cc
index 1961649..b699a724 100644
--- a/chrome/browser/extensions/api/language_settings_private/language_settings_private_api_unittest.cc
+++ b/chrome/browser/extensions/api/language_settings_private/language_settings_private_api_unittest.cc
@@ -34,7 +34,7 @@
 #include "extensions/browser/event_router_factory.h"
 #include "extensions/browser/extension_prefs.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "ash/constants/ash_features.h"
 #include "ui/base/ime/ash/component_extension_ime_manager.h"
 #include "ui/base/ime/ash/extension_ime_util.h"
@@ -245,7 +245,7 @@
   std::vector<std::string> content_languages_before;
   translate_prefs_->GetLanguageList(&content_languages_before);
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   ASSERT_EQ(std::vector<std::string>({"en-US"}), content_languages_before);
 #else
   ASSERT_EQ(std::vector<std::string>({"en-US", "en"}),
@@ -429,7 +429,7 @@
   EXPECT_EQ(languages_to_test.size(), languages_to_test_found_count);
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 namespace {
 
 namespace input_method = ::ash::input_method;
@@ -714,7 +714,7 @@
   TestInputMethodManager::Shutdown();
 }
 
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 #if BUILDFLAG(IS_WIN)
 class LanguageSettingsPrivateApiTestDelayInit
diff --git a/chrome/browser/extensions/api/language_settings_private/language_settings_private_delegate.cc b/chrome/browser/extensions/api/language_settings_private/language_settings_private_delegate.cc
index 2944b37..700f307 100644
--- a/chrome/browser/extensions/api/language_settings_private/language_settings_private_delegate.cc
+++ b/chrome/browser/extensions/api/language_settings_private/language_settings_private_delegate.cc
@@ -53,9 +53,9 @@
       Profile::FromBrowserContext(context_)->GetPrefs());
 
   StartOrStopListeningForSpellcheckChanges();
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   StartOrStopListeningForInputMethodChanges();
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 }
 
 LanguageSettingsPrivateDelegate::~LanguageSettingsPrivateDelegate() {
@@ -102,14 +102,14 @@
     listening_spellcheck_ = false;
   }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   if (listening_input_method_) {
     auto* input_method_manager = ash::input_method::InputMethodManager::Get();
     if (input_method_manager)
       input_method_manager->RemoveObserver(this);
     listening_input_method_ = false;
   }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 }
 
 void LanguageSettingsPrivateDelegate::OnListenerAdded(
@@ -122,7 +122,7 @@
     StartOrStopListeningForSpellcheckChanges();
     return;
   }
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   if (details.event_name ==
           language_settings_private::OnInputMethodAdded::kEventName ||
       details.event_name ==
@@ -130,19 +130,19 @@
     StartOrStopListeningForInputMethodChanges();
     return;
   }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 }
 
 void LanguageSettingsPrivateDelegate::OnListenerRemoved(
     const EventListenerInfo& details) {
   // Stop listening to events if there are no more listeners.
   StartOrStopListeningForSpellcheckChanges();
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   StartOrStopListeningForInputMethodChanges();
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 void LanguageSettingsPrivateDelegate::InputMethodChanged(
     ash::input_method::InputMethodManager* manager,
     Profile* profile,
@@ -171,7 +171,7 @@
       std::move(args)));
   EventRouter::Get(context_)->BroadcastEvent(std::move(extension_event));
 }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 void LanguageSettingsPrivateDelegate::OnHunspellDictionaryInitialized(
     const std::string& language) {
@@ -271,7 +271,7 @@
   listening_spellcheck_ = should_listen;
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 void LanguageSettingsPrivateDelegate::
     StartOrStopListeningForInputMethodChanges() {
   EventRouter* event_router = EventRouter::Get(context_);
@@ -291,7 +291,7 @@
 
   listening_input_method_ = should_listen;
 }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 void LanguageSettingsPrivateDelegate::RetryDownloadHunspellDictionary(
     const std::string& language) {
diff --git a/chrome/browser/extensions/api/language_settings_private/language_settings_private_delegate.h b/chrome/browser/extensions/api/language_settings_private/language_settings_private_delegate.h
index 1b90f17..808ed70 100644
--- a/chrome/browser/extensions/api/language_settings_private/language_settings_private_delegate.h
+++ b/chrome/browser/extensions/api/language_settings_private/language_settings_private_delegate.h
@@ -18,7 +18,7 @@
 #include "components/prefs/pref_change_registrar.h"
 #include "extensions/browser/event_router.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "ui/base/ime/ash/input_method_manager.h"
 #endif
 
@@ -33,9 +33,9 @@
 class LanguageSettingsPrivateDelegate
     : public KeyedService,
       public EventRouter::Observer,
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
       public ash::input_method::InputMethodManager::Observer,
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
       public SpellcheckHunspellDictionary::Observer,
       public SpellcheckCustomDictionary::Observer {
  public:
@@ -66,14 +66,14 @@
   void OnListenerAdded(const EventListenerInfo& details) override;
   void OnListenerRemoved(const EventListenerInfo& details) override;
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // ash::input_method::InputMethodManager::Observer implementation.
   void InputMethodChanged(ash::input_method::InputMethodManager* manager,
                           Profile* profile,
                           bool show_message) override;
   void OnInputMethodExtensionAdded(const std::string& extension_id) override;
   void OnInputMethodExtensionRemoved(const std::string& extension_id) override;
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
   // SpellcheckHunspellDictionary::Observer implementation.
   void OnHunspellDictionaryInitialized(const std::string& language) override;
@@ -103,12 +103,12 @@
   // any observers.
   void StartOrStopListeningForSpellcheckChanges();
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // If there are any JavaScript listeners registered for input method events,
   // ensures we are registered for change notifications. Otherwise, unregisters
   // any observers.
   void StartOrStopListeningForInputMethodChanges();
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
   // Handles the preference for which languages should be used for spellcheck
   // by resetting the dictionaries and broadcasting an event.
diff --git a/chrome/browser/extensions/api/management/chrome_management_api_delegate.cc b/chrome/browser/extensions/api/management/chrome_management_api_delegate.cc
index f7a8886..2e34c96 100644
--- a/chrome/browser/extensions/api/management/chrome_management_api_delegate.cc
+++ b/chrome/browser/extensions/api/management/chrome_management_api_delegate.cc
@@ -215,7 +215,7 @@
       const std::string& title,
       const GURL& launch_url,
       const favicon_base::FaviconImageResult& image_result) {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
     // Avoid accessing the WebAppProvider when web apps are enabled in Lacros
     // (and thus disabled in Ash).
     if (web_app::IsWebAppsCrosapiEnabled()) {
@@ -223,7 +223,7 @@
                                    /*install_success=*/false);
       return;
     }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
     // GenerateAppForLink API doesn't allow a manifest ID to be specified, so
     // just use the launch_url for both manifest ID and start URL. This is a
@@ -525,14 +525,14 @@
     content::BrowserContext* context,
     const GURL& web_app_url,
     InstallOrLaunchWebAppCallback callback) const {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // Avoid accessing the WebAppProvider when web apps are enabled in Lacros (and
   // thus disabled in Ash).
   if (web_app::IsWebAppsCrosapiEnabled()) {
     std::move(callback).Run(InstallOrLaunchWebAppResult::kUnknownError);
     return;
   }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
   Profile* profile = Profile::FromBrowserContext(context);
   auto* provider = web_app::WebAppProvider::GetForWebApps(profile);
diff --git a/chrome/browser/extensions/api/management/management_api_browsertest.cc b/chrome/browser/extensions/api/management/management_api_browsertest.cc
index 9aa00fa0..0c2629e 100644
--- a/chrome/browser/extensions/api/management/management_api_browsertest.cc
+++ b/chrome/browser/extensions/api/management/management_api_browsertest.cc
@@ -39,7 +39,6 @@
 namespace extensions {
 namespace {
 
-#if !BUILDFLAG(IS_CHROMEOS_LACROS)
 bool ExpectChromeAppsDefaultEnabled() {
 #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
   return false;
@@ -47,7 +46,6 @@
   return true;
 #endif
 }
-#endif
 
 }  // namespace
 
@@ -124,10 +122,6 @@
   ASSERT_TRUE(listener2.WaitUntilSatisfied());
 }
 
-#if !BUILDFLAG(IS_CHROMEOS_LACROS)
-// TODO(crbug.com/40211465): Run these tests on Chrome OS with both Ash and
-// Lacros processes active.
-
 IN_PROC_BROWSER_TEST_P(ExtensionManagementApiTestWithBackgroundType,
                        LaunchApp) {
   ExtensionTestMessageListener listener1("app_launched");
@@ -166,8 +160,6 @@
   }
 }
 
-// TODO(crbug.com/40211465): Run these tests on Chrome OS with both Ash and
-// Lacros processes active.
 IN_PROC_BROWSER_TEST_P(ExtensionManagementApiTestWithBackgroundType,
                        LaunchAppFromBackground) {
   ExtensionTestMessageListener listener1("success");
@@ -206,8 +198,6 @@
   }
 }
 
-#endif  // !BUILDFLAG(IS_CHROMEOS_LACROS)
-
 IN_PROC_BROWSER_TEST_P(ExtensionManagementApiTestWithBackgroundType,
                        SelfUninstall) {
   // Wait for the helper script to finish before loading the primary
diff --git a/chrome/browser/extensions/api/management/management_apitest.cc b/chrome/browser/extensions/api/management/management_apitest.cc
index b06fcea..8d8a363 100644
--- a/chrome/browser/extensions/api/management/management_apitest.cc
+++ b/chrome/browser/extensions/api/management/management_apitest.cc
@@ -50,7 +50,6 @@
 
 namespace {
 
-#if !BUILDFLAG(IS_CHROMEOS_LACROS)
 // Find a browser other than |browser|.
 Browser* FindOtherBrowser(Browser* browser) {
   Browser* found = nullptr;
@@ -69,7 +68,6 @@
   return true;
 #endif
 }
-#endif  // !BUILDFLAG(IS_CHROMEOS_LACROS)
 
 }  // namespace
 
@@ -353,20 +351,12 @@
           kBackground, true /* from_webstore */);
 }
 
-#if !BUILDFLAG(IS_CHROMEOS_LACROS)
-// TODO(crbug.com/40211465): Run these tests on Chrome OS with both Ash and
-// Lacros processes active.
 IN_PROC_BROWSER_TEST_P(InstallReplacementWebAppApiTest, InstallableWebApp) {
   static constexpr char kGoodWebAppURL[] =
       "/management/install_replacement_web_app/acceptable_web_app/index.html";
 
   RunInstallableWebAppTest(kManifest, kGoodWebAppURL, kGoodWebAppURL);
 }
-#endif
-
-#if !BUILDFLAG(IS_CHROMEOS_LACROS)
-// TODO(crbug.com/40211465): Run these tests on Chrome OS with both Ash and
-// Lacros processes active.
 
 // Check that web app still installs and launches correctly when start_url does
 // not match replacement_web_app_url.
@@ -391,7 +381,6 @@
 
   RunInstallableWebAppTest(kAppManifest, kGoodWebAppURL, kGoodWebAppURL);
 }
-#endif
 
 // Tests actions on extensions when no management policy is in place.
 IN_PROC_BROWSER_TEST_P(ExtensionManagementApiTest, ManagementPolicyAllowed) {
@@ -436,10 +425,6 @@
                                {.custom_arg = "runProhibitedTests"}));
 }
 
-#if !BUILDFLAG(IS_CHROMEOS_LACROS)
-// TODO(crbug.com/40211465): Run these tests on Chrome OS with both Ash and
-// Lacros processes active.
-
 IN_PROC_BROWSER_TEST_P(ExtensionManagementApiTest, LaunchPanelApp) {
   // Load an extension that calls launchApp() on any app that gets
   // installed.
@@ -600,7 +585,6 @@
     EXPECT_FALSE(launched_app.was_satisfied());
   }
 }
-#endif  // !BUILDFLAG(IS_CHROMEOS_LACROS)
 
 // Flaky on MacOS: crbug.com/915339
 #if BUILDFLAG(IS_MAC)
diff --git a/chrome/browser/extensions/api/messaging/launch_context_posix.cc b/chrome/browser/extensions/api/messaging/launch_context_posix.cc
index dd22e03..ba312dec 100644
--- a/chrome/browser/extensions/api/messaging/launch_context_posix.cc
+++ b/chrome/browser/extensions/api/messaging/launch_context_posix.cc
@@ -84,9 +84,7 @@
 
   options.current_directory = command_line.GetProgram().DirName();
 
-// TODO(crbug.com/40118868): Revisit the macro expression once build flag switch
-// of lacros-chrome is complete.
-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
+#if BUILDFLAG(IS_LINUX)
   // Don't use no_new_privs mode, e.g. in case the host needs to use sudo.
   options.allow_new_privs = true;
 #endif
diff --git a/chrome/browser/extensions/api/networking_private/networking_private_chromeos_apitest.cc b/chrome/browser/extensions/api/networking_private/networking_private_chromeos_apitest.cc
index dcf5892..76696ebc 100644
--- a/chrome/browser/extensions/api/networking_private/networking_private_chromeos_apitest.cc
+++ b/chrome/browser/extensions/api/networking_private/networking_private_chromeos_apitest.cc
@@ -5,6 +5,7 @@
 #include <memory>
 #include <utility>
 
+#include "ash/constants/ash_switches.h"
 #include "base/command_line.h"
 #include "base/functional/bind.h"
 #include "base/functional/callback.h"
@@ -15,6 +16,21 @@
 #include "base/values.h"
 #include "chrome/browser/extensions/extension_apitest.h"
 #include "chrome/browser/profiles/profile.h"
+#include "chromeos/ash/components/cryptohome/cryptohome_parameters.h"
+#include "chromeos/ash/components/dbus/shill/shill_device_client.h"
+#include "chromeos/ash/components/dbus/shill/shill_ipconfig_client.h"
+#include "chromeos/ash/components/dbus/shill/shill_manager_client.h"
+#include "chromeos/ash/components/dbus/shill/shill_profile_client.h"
+#include "chromeos/ash/components/dbus/shill/shill_service_client.h"
+#include "chromeos/ash/components/dbus/userdataauth/cryptohome_misc_client.h"
+#include "chromeos/ash/components/dbus/userdataauth/userdataauth_client.h"
+#include "chromeos/ash/components/network/managed_network_configuration_handler.h"
+#include "chromeos/ash/components/network/network_certificate_handler.h"
+#include "chromeos/ash/components/network/network_handler.h"
+#include "chromeos/ash/components/network/network_handler_test_helper.h"
+#include "chromeos/ash/components/network/network_state.h"
+#include "chromeos/ash/components/network/network_state_handler.h"
+#include "chromeos/ash/components/network/onc/network_onc_utils.h"
 #include "components/onc/onc_constants.h"
 #include "components/policy/core/browser/browser_policy_connector.h"
 #include "components/policy/core/common/mock_configuration_policy_provider.h"
@@ -35,30 +51,6 @@
 #include "extensions/test/extension_test_message_listener.h"
 #include "third_party/cros_system_api/dbus/shill/dbus-constants.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-#include "ash/constants/ash_switches.h"
-#include "chromeos/ash/components/cryptohome/cryptohome_parameters.h"
-#include "chromeos/ash/components/dbus/shill/shill_device_client.h"
-#include "chromeos/ash/components/dbus/shill/shill_ipconfig_client.h"
-#include "chromeos/ash/components/dbus/shill/shill_manager_client.h"
-#include "chromeos/ash/components/dbus/shill/shill_profile_client.h"
-#include "chromeos/ash/components/dbus/shill/shill_service_client.h"
-#include "chromeos/ash/components/dbus/userdataauth/cryptohome_misc_client.h"
-#include "chromeos/ash/components/dbus/userdataauth/userdataauth_client.h"
-#include "chromeos/ash/components/network/managed_network_configuration_handler.h"
-#include "chromeos/ash/components/network/network_certificate_handler.h"
-#include "chromeos/ash/components/network/network_handler.h"
-#include "chromeos/ash/components/network/network_handler_test_helper.h"
-#include "chromeos/ash/components/network/network_state.h"
-#include "chromeos/ash/components/network/network_state_handler.h"
-#include "chromeos/ash/components/network/onc/network_onc_utils.h"
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
-
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-#include "chromeos/crosapi/mojom/test_controller.mojom.h"
-#include "chromeos/lacros/lacros_service.h"
-#endif
-
 // This tests the Chrome OS implementation of the networkingPrivate API
 // (NetworkingPrivateChromeOS). Note: The test expectations for chromeos, and
 // win/mac (NetworkingPrivateServiceClient) are different to reflect the
@@ -67,7 +59,6 @@
 using testing::_;
 using testing::Return;
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
 using ash::ShillDeviceClient;
 using ash::ShillIPConfigClient;
 using ash::ShillManagerClient;
@@ -78,7 +69,6 @@
 using extensions::NetworkingPrivateChromeOS;
 using extensions::NetworkingPrivateDelegate;
 using extensions::NetworkingPrivateDelegateFactory;
-#endif
 
 namespace {
 
@@ -284,7 +274,6 @@
                            base::Value::Dict properties) = 0;
 };
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
 class UIDelegateStub : public NetworkingPrivateDelegate::UIDelegate {
  public:
   static int s_show_account_details_called_;
@@ -299,15 +288,15 @@
 // static
 int UIDelegateStub::s_show_account_details_called_ = 0;
 
-class NetworkingPrivateChromeOSApiTestAsh
+class NetworkingPrivateChromeOSApiTest
     : public NetworkingPrivateChromeOSApiTestBase {
  public:
-  NetworkingPrivateChromeOSApiTestAsh() = default;
+  NetworkingPrivateChromeOSApiTest() = default;
 
-  NetworkingPrivateChromeOSApiTestAsh(
-      const NetworkingPrivateChromeOSApiTestAsh&) = delete;
-  NetworkingPrivateChromeOSApiTestAsh& operator=(
-      const NetworkingPrivateChromeOSApiTestAsh&) = delete;
+  NetworkingPrivateChromeOSApiTest(const NetworkingPrivateChromeOSApiTest&) =
+      delete;
+  NetworkingPrivateChromeOSApiTest& operator=(
+      const NetworkingPrivateChromeOSApiTest&) = delete;
 
   static std::unique_ptr<KeyedService> CreateNetworkingPrivateDelegate(
       content::BrowserContext* context) {
@@ -489,219 +478,42 @@
   sync_preferences::TestingPrefServiceSyncable user_prefs_;
   TestingPrefServiceSimple local_state_;
 };
-#else
-class NetworkingPrivateChromeOSApiTestLacros
-    : public NetworkingPrivateChromeOSApiTestBase {
- public:
-  NetworkingPrivateChromeOSApiTestLacros() {}
-
-  NetworkingPrivateChromeOSApiTestLacros(
-      const NetworkingPrivateChromeOSApiTestLacros&) = delete;
-  NetworkingPrivateChromeOSApiTestLacros& operator=(
-      const NetworkingPrivateChromeOSApiTestLacros&) = delete;
-
-  bool SetUpAsh() {
-    auto* service = chromeos::LacrosService::Get();
-    if (!service->IsAvailable<crosapi::mojom::TestController>() ||
-        service->GetInterfaceVersion<crosapi::mojom::TestController>() <
-            static_cast<int>(crosapi::mojom::TestController::MethodMinVersions::
-                                 kBindShillClientTestInterfaceMinVersion)) {
-      LOG(ERROR) << "Unsupported ash version.";
-      return false;
-    }
-
-    base::test::TestFuture<void> future;
-    service->GetRemote<crosapi::mojom::TestController>()
-        ->BindShillClientTestInterface(shill_test_.BindNewPipeAndPassReceiver(),
-                                       future.GetCallback());
-    EXPECT_TRUE(future.Wait());
-
-    ConfigFakeNetwork();
-
-    return true;
-  }
-
-  // NetworkingPrivateChromeOSApiTestBase overrides
-
-  std::string GetSanitizedActiveUsername() override {
-    auto* service = chromeos::LacrosService::Get();
-    if (!service->IsAvailable<crosapi::mojom::TestController>() ||
-        service->GetInterfaceVersion<crosapi::mojom::TestController>() <
-            static_cast<int>(crosapi::mojom::TestController::MethodMinVersions::
-                                 kGetSanitizedActiveUsernameMinVersion)) {
-      LOG(ERROR) << "Unsupported ash version.";
-      return "";
-    }
-
-    base::test::TestFuture<const std::string&> future;
-    service->GetRemote<crosapi::mojom::TestController>()
-        ->GetSanitizedActiveUsername(future.GetCallback());
-    return future.Take();
-  }
-
-  void AddDevice(const std::string& device_path,
-                 const std::string& type,
-                 const std::string& name) override {
-    base::test::TestFuture<void> future;
-    shill_test_->AddDevice(device_path, type, name, future.GetCallback());
-    ASSERT_TRUE(future.Wait());
-  }
-
-  void SetDeviceProperty(const std::string& device_path,
-                         const std::string& name,
-                         const base::Value& value) override {
-    base::test::TestFuture<void> future;
-    shill_test_->SetDeviceProperty(device_path, name, value.Clone(),
-                                   /*notify_changed=*/true,
-                                   future.GetCallback());
-    ASSERT_TRUE(future.Wait());
-  }
-
-  void SetSimLocked(const std::string& device_path, bool enabled) override {
-    base::test::TestFuture<void> future;
-    shill_test_->SetSimLocked(device_path, enabled, future.GetCallback());
-    ASSERT_TRUE(future.Wait());
-  }
-
-  void ClearDevices() override {
-    base::test::TestFuture<void> future;
-    shill_test_->ClearDevices(future.GetCallback());
-    ASSERT_TRUE(future.Wait());
-  }
-
-  void AddService(const std::string& service_path,
-                  const std::string& name,
-                  const std::string& type,
-                  const std::string& state) override {
-    base::test::TestFuture<void> future;
-    shill_test_->AddService(service_path, service_path + "_guid", name, type,
-                            state, true /* add_to_visible */,
-                            future.GetCallback());
-    ASSERT_TRUE(future.Wait());
-  }
-
-  void ClearServices() override {
-    base::test::TestFuture<void> future;
-    shill_test_->ClearServices(future.GetCallback());
-    ASSERT_TRUE(future.Wait());
-  }
-
-  void SetServiceProperty(const std::string& service_path,
-                          const std::string& property,
-                          const base::Value& value) override {
-    base::test::TestFuture<void> future;
-    shill_test_->SetServiceProperty(service_path, property, value.Clone(),
-                                    future.GetCallback());
-    ASSERT_TRUE(future.Wait());
-  }
-
-  void AddIPConfig(const std::string& ip_config_path,
-                   base::Value::Dict properties) override {
-    base::test::TestFuture<void> future;
-    shill_test_->AddIPConfig(ip_config_path, base::Value(std::move(properties)),
-                             future.GetCallback());
-    ASSERT_TRUE(future.Wait());
-  }
-
-  void AddProfile(const std::string& profile_path,
-                  const std::string& userhash) override {
-    base::test::TestFuture<void> future;
-    shill_test_->AddProfile(profile_path, userhash, future.GetCallback());
-    ASSERT_TRUE(future.Wait());
-  }
-
-  void AddServiceToProfile(const std::string& profile_path,
-                           const std::string& service_path) override {
-    base::test::TestFuture<void> future;
-    shill_test_->AddServiceToProfile(profile_path, service_path,
-                                     future.GetCallback());
-    ASSERT_TRUE(future.Wait());
-  }
-
-  std::string GetSharedProfilePath() override {
-    // TODO(crbug.com/): get this information from Ash
-    const char kSharedProfilePath[] = "/profile/default";
-    return kSharedProfilePath;
-  }
-
- protected:
-  mojo::Remote<crosapi::mojom::ShillClientTestInterface> shill_test_;
-};
-#endif
-
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-using NetworkingPrivateChromeOSApiTest = NetworkingPrivateChromeOSApiTestLacros;
-#else
-using NetworkingPrivateChromeOSApiTest = NetworkingPrivateChromeOSApiTestAsh;
-#endif
 
 // Place each subtest into a separate browser test so that the stub networking
 // library state is reset for each subtest run. This way they won't affect each
 // other.
 
 IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest, StartConnect) {
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  if (!SetUpAsh()) {
-    GTEST_SKIP() << "Unsupported ash version.";
-  }
-#endif
   EXPECT_TRUE(RunNetworkingSubtest("startConnect")) << message_;
 }
 
 IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest, StartDisconnect) {
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  if (!SetUpAsh()) {
-    GTEST_SKIP() << "Unsupported ash version.";
-  }
-#endif
   EXPECT_TRUE(RunNetworkingSubtest("startDisconnect")) << message_;
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
 IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest, StartActivate) {
   SetupCellular();
   EXPECT_TRUE(RunNetworkingSubtest("startActivate")) << message_;
   EXPECT_EQ(1, UIDelegateStub::s_show_account_details_called_);
 }
-#endif
 
 IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest,
                        StartConnectNonexistent) {
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  if (!SetUpAsh()) {
-    GTEST_SKIP() << "Unsupported ash version.";
-  }
-#endif
   EXPECT_TRUE(RunNetworkingSubtest("startConnectNonexistent")) << message_;
 }
 
 IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest,
                        StartDisconnectNonexistent) {
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  if (!SetUpAsh()) {
-    GTEST_SKIP() << "Unsupported ash version.";
-  }
-#endif
   EXPECT_TRUE(RunNetworkingSubtest("startDisconnectNonexistent")) << message_;
 }
 
 IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest,
                        StartGetPropertiesNonexistent) {
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  if (!SetUpAsh()) {
-    GTEST_SKIP() << "Unsupported ash version.";
-  }
-#endif
   EXPECT_TRUE(RunNetworkingSubtest("startGetPropertiesNonexistent"))
       << message_;
 }
 
 IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest, GetNetworks) {
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  if (!SetUpAsh()) {
-    GTEST_SKIP() << "Unsupported ash version.";
-  }
-#endif
   // Hide stub_wifi2.
   SetServiceProperty(kWifi2ServicePath, shill::kVisibleProperty,
                      base::Value(false));
@@ -713,23 +525,15 @@
   EXPECT_TRUE(RunNetworkingSubtest("getNetworks")) << message_;
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
 IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest, GetVisibleNetworks) {
   EXPECT_TRUE(RunNetworkingSubtest("getVisibleNetworks")) << message_;
 }
-#endif
 
 IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest,
                        GetVisibleNetworksWifi) {
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  if (!SetUpAsh()) {
-    GTEST_SKIP() << "Unsupported ash version.";
-  }
-#endif
   EXPECT_TRUE(RunNetworkingSubtest("getVisibleNetworksWifi")) << message_;
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
 IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest, EnabledNetworkTypes) {
   EXPECT_TRUE(RunNetworkingSubtest("enabledNetworkTypesDisable")) << message_;
   EXPECT_TRUE(RunNetworkingSubtest("enabledNetworkTypesEnable")) << message_;
@@ -742,34 +546,13 @@
   manager_test()->SetTechnologyInitializing("cellular", true);
   EXPECT_TRUE(RunNetworkingSubtest("getDeviceStates")) << message_;
 }
-#endif
-
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest,
-                       GetDeviceStatesLacros) {
-  if (!SetUpAsh()) {
-    GTEST_SKIP() << "Unsupported ash version.";
-  }
-  EXPECT_TRUE(RunNetworkingSubtest("getDeviceStatesLacros")) << message_;
-}
-#endif
 
 IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest, RequestNetworkScan) {
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  if (!SetUpAsh()) {
-    GTEST_SKIP() << "Unsupported ash version.";
-  }
-#endif
   EXPECT_TRUE(RunNetworkingSubtest("requestNetworkScan")) << message_;
 }
 
 IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest,
                        RequestNetworkScanCellular) {
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  if (!SetUpAsh()) {
-    GTEST_SKIP() << "Unsupported ash version.";
-  }
-#endif
   SetupCellular();
   EXPECT_TRUE(RunNetworkingSubtest("requestNetworkScanCellular")) << message_;
 }
@@ -777,41 +560,23 @@
 // Properties are filtered and translated through
 // ShillToONCTranslator::TranslateWiFiWithState
 IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest, GetProperties) {
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  if (!SetUpAsh()) {
-    GTEST_SKIP() << "Unsupported ash version.";
-  }
-#endif
   EXPECT_TRUE(RunNetworkingSubtest("getProperties")) << message_;
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
 IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest,
                        GetCellularProperties) {
   SetupCellular();
   EXPECT_TRUE(RunNetworkingSubtest("getPropertiesCellular")) << message_;
 }
-#endif
 
 IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest, GetState) {
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  if (!SetUpAsh()) {
-    GTEST_SKIP() << "Unsupported ash version.";
-  }
-#endif
   EXPECT_TRUE(RunNetworkingSubtest("getState")) << message_;
 }
 
 IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest, GetStateNonExistent) {
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  if (!SetUpAsh()) {
-    GTEST_SKIP() << "Unsupported ash version.";
-  }
-#endif
   EXPECT_TRUE(RunNetworkingSubtest("getStateNonExistent")) << message_;
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
 IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest,
                        SetCellularProperties) {
   SetupCellular();
@@ -860,18 +625,11 @@
 
   EXPECT_TRUE(RunNetworkingSubtest("createNetworkForPolicyControlledNetwork"));
 }
-#endif
 
 IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest, ForgetNetwork) {
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  if (!SetUpAsh()) {
-    GTEST_SKIP() << "Unsupported ash version.";
-  }
-#endif
   EXPECT_TRUE(RunNetworkingSubtest("forgetNetwork")) << message_;
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
 IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest,
                        ForgetPolicyControlledNetwork) {
   constexpr char kUserPolicyBlob[] =
@@ -957,64 +715,37 @@
       kWifi1ServicePath, "TestErrorState");
   EXPECT_TRUE(RunNetworkingSubtest("getErrorState")) << message_;
 }
-#endif
 
 // TODO(crbug.com/41496066): This test is flaky.
 IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest,
                        DISABLED_OnNetworksChangedEventConnect) {
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  if (!SetUpAsh()) {
-    GTEST_SKIP() << "Unsupported ash version.";
-  }
-#endif
   EXPECT_TRUE(RunNetworkingSubtest("onNetworksChangedEventConnect"))
       << message_;
 }
 
 IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest,
                        OnNetworksChangedEventDisconnect) {
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  if (!SetUpAsh()) {
-    GTEST_SKIP() << "Unsupported ash version.";
-  }
-#endif
   EXPECT_TRUE(RunNetworkingSubtest("onNetworksChangedEventDisconnect"))
       << message_;
 }
 
 IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest,
                        OnNetworkListChangedEvent) {
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  if (!SetUpAsh()) {
-    GTEST_SKIP() << "Unsupported ash version.";
-  }
-#endif
   EXPECT_TRUE(RunNetworkingSubtest("onNetworkListChangedEvent")) << message_;
 }
 
 IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest,
                        OnDeviceStateListChangedEvent) {
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  if (!SetUpAsh()) {
-    GTEST_SKIP() << "Unsupported ash version.";
-  }
-#endif
   EXPECT_TRUE(RunNetworkingSubtest("onDeviceStateListChangedEvent"))
       << message_;
 }
 
 IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest,
                        OnDeviceScanningChangedEvent) {
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  if (!SetUpAsh()) {
-    GTEST_SKIP() << "Unsupported ash version.";
-  }
-#endif
   SetupCellular();
   EXPECT_TRUE(RunNetworkingSubtest("onDeviceScanningChangedEvent")) << message_;
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
 IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest,
                        OnCertificateListsChangedEvent) {
   ExtensionTestMessageListener listener("eventListenerReady");
@@ -1057,14 +788,8 @@
 
   EXPECT_TRUE(RunNetworkingSubtest("captivePortalNotification")) << message_;
 }
-#endif
 
 IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest, UnlockCellularSim) {
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  if (!SetUpAsh()) {
-    GTEST_SKIP() << "Unsupported ash version.";
-  }
-#endif
   SetupCellular();
   // Lock the SIM
   SetSimLocked(kCellularDevicePath, true);
@@ -1072,22 +797,12 @@
 }
 
 IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest, SetCellularSimState) {
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  if (!SetUpAsh()) {
-    GTEST_SKIP() << "Unsupported ash version.";
-  }
-#endif
   SetupCellular();
   EXPECT_TRUE(RunNetworkingSubtest("setCellularSimState")) << message_;
 }
 
 IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest,
                        SelectCellularMobileNetwork) {
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  if (!SetUpAsh()) {
-    GTEST_SKIP() << "Unsupported ash version.";
-  }
-#endif
   SetupCellular();
   // Create fake list of found networks.
   base::Value::List found_networks =
@@ -1106,18 +821,12 @@
 }
 
 IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest, CellularSimPuk) {
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  if (!SetUpAsh()) {
-    GTEST_SKIP() << "Unsupported ash version.";
-  }
-#endif
   SetupCellular();
   // Lock the SIM
   SetSimLocked(kCellularDevicePath, true);
   EXPECT_TRUE(RunNetworkingSubtest("cellularSimPuk")) << message_;
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
 IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest, GetGlobalPolicy) {
   base::Value::Dict global_config;
   global_config.Set(
@@ -1177,6 +886,5 @@
                                {.launch_as_platform_app = true}))
       << message_;
 }
-#endif
 
 }  // namespace
diff --git a/chrome/browser/extensions/api/networking_private/networking_private_ui_delegate_factory_impl.cc b/chrome/browser/extensions/api/networking_private/networking_private_ui_delegate_factory_impl.cc
index 13242736..09cb8578 100644
--- a/chrome/browser/extensions/api/networking_private/networking_private_ui_delegate_factory_impl.cc
+++ b/chrome/browser/extensions/api/networking_private/networking_private_ui_delegate_factory_impl.cc
@@ -9,7 +9,7 @@
 #include "build/build_config.h"
 #include "build/chromeos_buildflags.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/extensions/api/networking_private/networking_private_ui_delegate_chromeos.h"
 #endif
 
@@ -17,7 +17,7 @@
 
 std::unique_ptr<NetworkingPrivateDelegate::UIDelegate>
 NetworkingPrivateUIDelegateFactoryImpl::CreateDelegate() {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   return std::make_unique<
       chromeos::extensions::NetworkingPrivateUIDelegateChromeOS>();
 #else
diff --git a/chrome/browser/extensions/api/offscreen/offscreen_apitest.cc b/chrome/browser/extensions/api/offscreen/offscreen_apitest.cc
index 7203599..c2ecfe8 100644
--- a/chrome/browser/extensions/api/offscreen/offscreen_apitest.cc
+++ b/chrome/browser/extensions/api/offscreen/offscreen_apitest.cc
@@ -36,12 +36,12 @@
 #include "net/dns/mock_host_resolver.h"
 #include "testing/gmock/include/gmock/gmock.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "base/test/gtest_tags.h"
 #include "base/test/scoped_feature_list.h"
 #include "chrome/browser/chrome_content_browser_client.h"
 #include "content/public/common/content_client.h"
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 namespace extensions {
 
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_apitest.cc b/chrome/browser/extensions/api/passwords_private/passwords_private_apitest.cc
index 2d89da5..91b6f87 100644
--- a/chrome/browser/extensions/api/passwords_private/passwords_private_apitest.cc
+++ b/chrome/browser/extensions/api/passwords_private/passwords_private_apitest.cc
@@ -410,7 +410,7 @@
   EXPECT_TRUE(get_authenticator_interaction_status());
 }
 
-#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_CHROMEOS)
 IN_PROC_BROWSER_TEST_F(PasswordsPrivateApiTest,
                        SwitchBiometricAuthBeforeFillingState) {
   EXPECT_FALSE(get_authenticator_interaction_status());
@@ -419,7 +419,7 @@
   EXPECT_TRUE(get_authenticator_interaction_status());
 }
 #endif  // BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)  ||
-        // BUILDFLAG(IS_CHROMEOS_ASH)
+        // BUILDFLAG(IS_CHROMEOS)
 
 IN_PROC_BROWSER_TEST_F(PasswordsPrivateApiTest, AddShortcut) {
   EXPECT_FALSE(get_add_shortcut_dialog_shown());
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc
index c56149d..e3ba2a1 100644
--- a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc
+++ b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc
@@ -161,6 +161,17 @@
     case extensions::api::passwords_private::PlaintextReason::kNone:
       NOTREACHED();
   }
+#elif BUILDFLAG(IS_CHROMEOS)
+  switch (reason) {
+    case extensions::api::passwords_private::PlaintextReason::kView:
+      return l10n_util::GetStringUTF16(
+          IDS_PASSWORDS_PAGE_AUTHENTICATION_PROMPT_CHROMEOS);
+    case extensions::api::passwords_private::PlaintextReason::kCopy:
+    case extensions::api::passwords_private::PlaintextReason::kEdit:
+      return std::u16string();
+    case extensions::api::passwords_private::PlaintextReason::kNone:
+      NOTREACHED();
+  }
 #else
   return std::u16string();
 #endif
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_utils_chromeos.cc b/chrome/browser/extensions/api/passwords_private/passwords_private_utils_chromeos.cc
index f4e4b37..255cd82 100644
--- a/chrome/browser/extensions/api/passwords_private/passwords_private_utils_chromeos.cc
+++ b/chrome/browser/extensions/api/passwords_private/passwords_private_utils_chromeos.cc
@@ -4,7 +4,7 @@
 
 #include "chrome/browser/extensions/api/passwords_private/passwords_private_utils_chromeos.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/ash/login/quick_unlock/auth_token.h"
 #include "chrome/browser/ash/login/quick_unlock/quick_unlock_factory.h"
 #include "chrome/browser/ash/login/quick_unlock/quick_unlock_storage.h"
@@ -13,11 +13,11 @@
 #include "chrome/browser/profiles/profile.h"
 #include "chromeos/ash/components/login/auth/password_visibility_utils.h"
 #include "components/user_manager/user.h"
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 namespace extensions {
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 bool IsOsReauthAllowedAsh(Profile* profile,
                           base::TimeDelta auth_token_lifetime) {
   const bool user_cannot_manually_enter_password =
@@ -37,6 +37,6 @@
 
   return auth_token->GetAge() <= auth_token_lifetime;
 }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 }  // namespace extensions
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_utils_chromeos.h b/chrome/browser/extensions/api/passwords_private/passwords_private_utils_chromeos.h
index 0d962a87..a30dd862 100644
--- a/chrome/browser/extensions/api/passwords_private/passwords_private_utils_chromeos.h
+++ b/chrome/browser/extensions/api/passwords_private/passwords_private_utils_chromeos.h
@@ -12,13 +12,13 @@
 
 namespace extensions {
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 // Returns whether |profile| has been authorized for password access, and
 // whether the auth token is no older than |auth_token_lifetime|. Authorization
 // is automatic if no password is needed.
 bool IsOsReauthAllowedAsh(Profile* profile,
                           base::TimeDelta auth_token_lifetime);
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 }  // namespace extensions
 
diff --git a/chrome/browser/extensions/api/platform_keys/platform_keys_api.cc b/chrome/browser/extensions/api/platform_keys/platform_keys_api.cc
index 15b12d5..72546d2 100644
--- a/chrome/browser/extensions/api/platform_keys/platform_keys_api.cc
+++ b/chrome/browser/extensions/api/platform_keys/platform_keys_api.cc
@@ -12,6 +12,8 @@
 #include <utility>
 #include <vector>
 
+#include "chrome/browser/ash/crosapi/keystore_service_ash.h"
+#include "chrome/browser/ash/crosapi/keystore_service_factory_ash.h"
 #include "chrome/browser/chromeos/platform_keys/extension_platform_keys_service.h"
 #include "chrome/browser/chromeos/platform_keys/extension_platform_keys_service_factory.h"
 #include "chrome/browser/chromeos/platform_keys/platform_keys.h"
@@ -27,15 +29,6 @@
 #include "net/cert/cert_status_flags.h"
 #include "net/cert/x509_util.h"
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-#include "chromeos/lacros/lacros_service.h"
-#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
-
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-#include "chrome/browser/ash/crosapi/keystore_service_ash.h"
-#include "chrome/browser/ash/crosapi/keystore_service_factory_ash.h"
-#endif  // #if BUILDFLAG(IS_CHROMEOS_ASH)
-
 using PublicKeyInfo = chromeos::platform_keys::PublicKeyInfo;
 
 namespace extensions {
@@ -49,10 +42,6 @@
 using crosapi::keystore_service_util::kWebCryptoEcdsa;
 using crosapi::keystore_service_util::kWebCryptoRsassaPkcs1v15;
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-const char kUnsupportedByAsh[] = "Not implemented.";
-const char kUnsupportedProfile[] = "Not available.";
-#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
 const char kErrorInvalidSigningAlgorithm[] = "Invalid signing algorithm.";
 const char kErrorInteractiveCallFromBackground[] =
     "Interactive calls must happen in the context of a browser tab or a "
@@ -77,45 +66,8 @@
 
 crosapi::mojom::KeystoreService* GetKeystoreService(
     content::BrowserContext* browser_context) {
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  // TODO(b/191958380): Lift the restriction when *.platformKeys.* APIs are
-  // implemented for secondary profiles in Lacros.
-  CHECK(Profile::FromBrowserContext(browser_context)->IsMainProfile())
-      << "Attempted to use an incorrect profile. Please file a bug at "
-         "https://bugs.chromium.org/ if this happens.";
-  return chromeos::LacrosService::Get()->GetRemote<KeystoreService>().get();
-#endif  // #if BUILDFLAG(IS_CHROMEOS_LACROS)
-
-#if BUILDFLAG(IS_CHROMEOS_ASH)
   return crosapi::KeystoreServiceFactoryAsh::GetForBrowserContext(
       browser_context);
-#endif  // #if BUILDFLAG(IS_CHROMEOS_ASH)
-}
-
-// Performs common crosapi validation. These errors are not caused by the
-// extension so they are considered recoverable. Returns an error message on
-// error, or empty string on success. |min_version| is the minimum version of
-// the ash implementation of KeystoreService necessary to support this
-// extension. |context| is the browser context in which the extension is hosted.
-std::string ValidateCrosapi(int min_version, content::BrowserContext* context) {
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  chromeos::LacrosService* service = chromeos::LacrosService::Get();
-  if (!service || !service->IsAvailable<crosapi::mojom::KeystoreService>())
-    return kUnsupportedByAsh;
-
-  int version = service->GetInterfaceVersion<KeystoreService>();
-  if (version < min_version)
-    return kUnsupportedByAsh;
-
-  // These APIs are used in security-sensitive contexts. We need to ensure that
-  // the user for ash is the same as the user for lacros. We do this by
-  // restricting the API to the default profile, which is guaranteed to be the
-  // same user.
-  if (!Profile::FromBrowserContext(context)->IsMainProfile())
-    return kUnsupportedProfile;
-#endif  // #if BUILDFLAG(IS_CHROMEOS_LACROS)
-
-  return "";
 }
 
 std::optional<SigningAlgorithmName> SigningAlgorithmNameFromString(
@@ -140,13 +92,6 @@
 
 ExtensionFunction::ResponseAction
 PlatformKeysInternalSelectClientCertificatesFunction::Run() {
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  // TODO(b/191958380): Lift the restriction when *.platformKeys.* APIs are
-  // implemented for secondary profiles in Lacros.
-  if (!Profile::FromBrowserContext(browser_context())->IsMainProfile())
-    return RespondNow(Error(kUnsupportedProfile));
-#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
-
   std::optional<api_pki::SelectClientCertificates::Params> params =
       api_pki::SelectClientCertificates::Params::Create(args());
   EXTENSION_FUNCTION_VALIDATE(params);
@@ -275,12 +220,6 @@
       api_pki::GetPublicKey::Params::Create(args());
   EXTENSION_FUNCTION_VALIDATE(params);
 
-  std::string error = ValidateCrosapi(KeystoreService::kGetPublicKeyMinVersion,
-                                      browser_context());
-  if (!error.empty()) {
-    return RespondNow(Error(error));
-  }
-
   std::optional<SigningAlgorithmName> algorithm_name =
       SigningAlgorithmNameFromString(params->algorithm_name);
   if (!algorithm_name) {
@@ -323,13 +262,6 @@
 
 ExtensionFunction::ResponseAction
 PlatformKeysInternalGetPublicKeyBySpkiFunction::Run() {
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  // TODO(b/191958380): Lift the restriction when *.platformKeys.* APIs are
-  // implemented for secondary profiles in Lacros.
-  if (!Profile::FromBrowserContext(browser_context())->IsMainProfile())
-    return RespondNow(Error(kUnsupportedProfile));
-#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
-
   std::optional<api_pki::GetPublicKeyBySpki::Params> params =
       api_pki::GetPublicKeyBySpki::Params::Create(args());
   EXTENSION_FUNCTION_VALIDATE(params);
@@ -370,13 +302,6 @@
 PlatformKeysInternalSignFunction::~PlatformKeysInternalSignFunction() {}
 
 ExtensionFunction::ResponseAction PlatformKeysInternalSignFunction::Run() {
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  // TODO(b/191958380): Lift the restriction when *.platformKeys.* APIs are
-  // implemented for secondary profiles in Lacros.
-  if (!Profile::FromBrowserContext(browser_context())->IsMainProfile())
-    return RespondNow(Error(kUnsupportedProfile));
-#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
-
   std::optional<api_pki::Sign::Params> params =
       api_pki::Sign::Params::Create(args());
   EXTENSION_FUNCTION_VALIDATE(params);
diff --git a/chrome/browser/extensions/api/preference/preference_api.cc b/chrome/browser/extensions/api/preference/preference_api.cc
index a331edc..4ae9b364 100644
--- a/chrome/browser/extensions/api/preference/preference_api.cc
+++ b/chrome/browser/extensions/api/preference/preference_api.cc
@@ -44,7 +44,7 @@
 #include "media/media_buildflags.h"
 #include "third_party/blink/public/mojom/devtools/inspector_issue.mojom.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/chromeos/extensions/controlled_pref_mapping.h"
 #include "chromeos/startup/browser_params_proxy.h"
 #endif
@@ -63,51 +63,12 @@
 constexpr char kPermissionErrorMessage[] =
     "You do not have permission to access the preference '*'. "
     "Be sure to declare in your manifest what permissions you need.";
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-constexpr char kInvalidPrefPathErrorMessage[] =
-    "Invalid PrefPath '*' for getting extension pref with control.";
-constexpr char kPrimaryProfileOnlyErrorMessage[] =
-    "You may only access the preference '*' in the primary profile.";
-constexpr char kAshDoesNotSupportPreference[] =
-    "The browser preference is not supported.";
-#endif
 constexpr char kIncognitoKey[] = "incognito";
 constexpr char kScopeKey[] = "scope";
 constexpr char kIncognitoSpecific[] = "incognitoSpecific";
 constexpr char kLevelOfControl[] = "levelOfControl";
 constexpr char kValue[] = "value";
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-// Returns true if the get, set or clear requests for the preference associated
-// with `pref_path` should only be applied at browser level. Returns false if
-// the requests should be forwarded to Ash.
-// All preferences explicitly added to`crosapi::mojom::PrefPath` should be
-// handled by Ash. The only exception is the `crosapi::mojom::PrefPath::kProxy`
-// pref which, for secondary profiles only, is applied at browser scope.
-bool IsBrowserScopePrefOperation(crosapi::mojom::PrefPath pref_path,
-                                 Profile* profile) {
-  if (pref_path == crosapi::mojom::PrefPath::kUnknown) {
-    return true;
-  }
-  if (pref_path == crosapi::mojom::PrefPath::kProxy) {
-    if (!profile->IsMainProfile()) {
-      return true;
-    }
-    // TODO(acostinas,b/267719988) If the current version of Ash does not
-    // support syncing the proxy pref via the Prefs mojo service, the proxy pref
-    // can be set at browser scope only and it will be synced with Ash via the
-    // NetworkSettingsService mojo API.
-    static constexpr int kMinVersionProxyPref = 4;
-    const int version = chromeos::LacrosService::Get()
-                            ->GetInterfaceVersion<crosapi::mojom::Prefs>();
-    if (version < kMinVersionProxyPref) {
-      return true;
-    }
-  }
-  return false;
-}
-#endif
-
 bool StringToScope(const std::string& s, ChromeSettingScope& scope) {
   scope = extensions::api::types::ParseChromeSettingScope(s);
   return scope != ChromeSettingScope::kNone;
@@ -117,40 +78,8 @@
 
 PreferenceEventRouter::PreferenceEventRouter(Profile* profile)
     : profile_(profile) {
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  // Versions of ash without this capability cannot create observers for prefs
-  // writing to the ash standalone browser prefstore.
-  constexpr char kExtensionControlledPrefObserversCapability[] =
-      "crbug/1334985";
-  bool ash_supports_crosapi_observers =
-      chromeos::BrowserParamsProxy::Get()->AshCapabilities().has_value() &&
-      base::Contains(
-          chromeos::BrowserParamsProxy::Get()->AshCapabilities().value(),
-          kExtensionControlledPrefObserversCapability);
-#endif
-
   registrar_.Init(profile_->GetPrefs());
   for (const auto& pref : PrefMapping::GetMappings()) {
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-    crosapi::mojom::PrefPath pref_path =
-        PrefMapping::GetInstance()->GetPrefPathForPrefName(pref.browser_pref);
-    if (!IsBrowserScopePrefOperation(pref_path, profile) &&
-        ash_supports_crosapi_observers) {
-      // Extension-controlled pref with the real value to watch in ash.
-      // This base::Unretained() is safe because PreferenceEventRouter owns
-      // the corresponding observer.
-      extension_pref_observers_.push_back(std::make_unique<CrosapiPrefObserver>(
-          pref_path,
-          base::BindRepeating(&PreferenceEventRouter::OnAshPrefChanged,
-                              base::Unretained(this), pref_path,
-                              pref.extension_pref, pref.browser_pref)));
-      registrar_.Add(
-          pref.browser_pref,
-          base::BindRepeating(&PreferenceEventRouter::OnControlledPrefChanged,
-                              base::Unretained(this), registrar_.prefs()));
-      continue;
-    }
-#endif
     registrar_.Add(
         pref.browser_pref,
         base::BindRepeating(&PreferenceEventRouter::OnPrefChanged,
@@ -167,107 +96,6 @@
 
 PreferenceEventRouter::~PreferenceEventRouter() = default;
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-void PreferenceEventRouter::OnControlledPrefChanged(
-    PrefService* pref_service,
-    const std::string& browser_pref) {
-  // This pref has a corresponding value in ash. We should send the updated
-  // value of the pref to ash.
-  auto* lacros_service = chromeos::LacrosService::Get();
-  if (!lacros_service ||
-      !lacros_service->IsAvailable<crosapi::mojom::Prefs>()) {
-    // Without the service, we cannot update this pref in ash.
-    LOG(ERROR) << ErrorUtils::FormatErrorMessage(
-        "API unavailable to set pref * in ash.", browser_pref);
-    return;
-  }
-
-  crosapi::mojom::PrefPath pref_path =
-      PrefMapping::GetInstance()->GetPrefPathForPrefName(browser_pref);
-  // Should be a known pref path. Otherwise we would not have created this
-  // observer.
-  DCHECK(pref_path != crosapi::mojom::PrefPath::kUnknown);
-
-  const PrefService::Preference* pref =
-      pref_service->FindPreference(browser_pref);
-  CHECK(pref);
-  if (pref->IsExtensionControlled()) {
-    // The pref has been set in lacros by an extension.
-    // Transmit the value to ash to be stored in the standalone browser
-    // prefstore.
-    lacros_service->GetRemote<crosapi::mojom::Prefs>()->SetPref(
-        pref_path, pref->GetValue()->Clone(), base::OnceClosure());
-  } else {
-    // The pref hasn't been set in lacros.
-    // Remove any value from the standalone browser prefstore in ash.
-    lacros_service->GetRemote<crosapi::mojom::Prefs>()
-        ->ClearExtensionControlledPref(pref_path, base::OnceClosure());
-  }
-}
-
-void PreferenceEventRouter::OnAshPrefChanged(crosapi::mojom::PrefPath pref_path,
-                                             const std::string& extension_pref,
-                                             const std::string& browser_pref,
-                                             base::Value value) {
-  // This pref should be read from ash.
-  // We can only get here via callback from ash. So there should be a
-  // LacrosService.
-  auto* lacros_service = chromeos::LacrosService::Get();
-  DCHECK(lacros_service);
-
-  // It's not sufficient to have the new state of the pref - we also need
-  // information about what just set it. So call Ash again to get information
-  // about the control state.
-  lacros_service->GetRemote<crosapi::mojom::Prefs>()
-      ->GetExtensionPrefWithControl(
-          pref_path, base::BindOnce(&PreferenceEventRouter::OnAshGetSuccess,
-                                    weak_factory_.GetWeakPtr(), browser_pref));
-}
-
-void PreferenceEventRouter::OnAshGetSuccess(
-    const std::string& browser_pref,
-    std::optional<::base::Value> opt_value,
-    crosapi::mojom::PrefControlState control_state) {
-  // Note: crosapi::mojom::prefs::GetExtensionPrefWithControl could be called
-  // with an invalid pref path, and returns empty opt_value.
-  if (!opt_value.has_value()) {
-    LOG(ERROR) << ErrorUtils::FormatErrorMessage(kInvalidPrefPathErrorMessage,
-                                                 browser_pref);
-    return;
-  }
-
-  bool incognito = false;
-
-  std::string event_name;
-  APIPermissionID permission = APIPermissionID::kInvalid;
-  bool found_event = PrefMapping::GetInstance()->FindEventForBrowserPref(
-      browser_pref, &event_name, &permission);
-  DCHECK(found_event);
-
-  base::Value::List args;
-  PrefTransformerInterface* transformer =
-      PrefMapping::GetInstance()->FindTransformerForBrowserPref(browser_pref);
-
-  std::optional<base::Value> transformed_value =
-      transformer->BrowserToExtensionPref(opt_value.value(), incognito);
-  if (!transformed_value) {
-    LOG(ERROR) << ErrorUtils::FormatErrorMessage(kConversionErrorMessage,
-                                                 browser_pref);
-    return;
-  }
-
-  base::Value::Dict dict;
-  dict.Set(kValue, std::move(*transformed_value));
-  args.Append(std::move(dict));
-
-  events::HistogramValue histogram_value =
-      events::TYPES_CHROME_SETTING_ON_CHANGE;
-  extensions::preference_helpers::DispatchEventToExtensionsWithAshControlState(
-      profile_, histogram_value, event_name, std::move(args), permission,
-      incognito, browser_pref, control_state);
-}
-#endif
-
 void PreferenceEventRouter::OnPrefChanged(PrefService* pref_service,
                                           const std::string& browser_pref) {
   bool incognito = (pref_service != profile_->GetPrefs());
@@ -362,13 +190,6 @@
     DCHECK(rv);
     EventRouter::Get(profile_)->RegisterObserver(this, event_name);
   }
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  // On lacros, ensure the PreferenceEventRouter is always created to watch for
-  // and notify of any pref changes, even if there are no extension listeners.
-  // TODO(crbug.com/40228309): Abstract out lacros logic from the
-  // PreferenceEventRouter so we don't needlessly dispatch extension events.
-  EnsurePreferenceEventRouterCreated();
-#endif
   content_settings_store()->AddObserver(this);
 }
 
@@ -484,26 +305,6 @@
 
   Profile* profile = Profile::FromBrowserContext(browser_context());
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  // Check whether this is a lacros extension controlled pref.
-  cached_browser_pref_ = browser_pref;
-  crosapi::mojom::PrefPath pref_path =
-      PrefMapping::GetInstance()->GetPrefPathForPrefName(cached_browser_pref_);
-  if (!IsBrowserScopePrefOperation(pref_path, profile)) {
-    // This pref should be read from ash.
-    auto* lacros_service = chromeos::LacrosService::Get();
-    if (!lacros_service ||
-        !lacros_service->IsAvailable<crosapi::mojom::Prefs>()) {
-      return RespondNow(Error("OS Service is unavailable."));
-    }
-    lacros_service->GetRemote<crosapi::mojom::Prefs>()
-        ->GetExtensionPrefWithControl(
-            pref_path,
-            base::BindOnce(&GetPreferenceFunction::OnLacrosGetSuccess, this));
-    return RespondLater();
-  }
-#endif
-
   PrefService* prefs =
       extensions::preference_helpers::GetProfilePrefService(profile, incognito);
 
@@ -550,47 +351,6 @@
   }
 }
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-void GetPreferenceFunction::OnLacrosGetSuccess(
-    std::optional<::base::Value> opt_value,
-    crosapi::mojom::PrefControlState control_state) {
-  if (!browser_context()) {
-    return;
-  }
-
-  if (!opt_value) {
-    Respond(Error(kAshDoesNotSupportPreference));
-    return;
-  }
-
-  // Get read/write permissions and pref name again.
-  Profile* profile = Profile::FromBrowserContext(browser_context());
-
-  std::string pref_key = args()[0].GetString();
-  const base::Value& details = args()[1];
-
-  bool incognito = false;
-  if (std::optional<bool> result = details.GetDict().FindBool(kIncognitoKey)) {
-    incognito = *result;
-  }
-
-  ::base::Value* pref_value = &opt_value.value();
-
-  std::string level_of_control;
-  level_of_control =
-      extensions::preference_helpers::GetLevelOfControlWithAshControlState(
-          control_state, profile, extension_id(), cached_browser_pref_,
-          incognito);
-
-  base::Value::Dict result;
-
-  ProduceGetResult(&result, pref_value, level_of_control, cached_browser_pref_,
-                   incognito);
-
-  Respond(WithArguments(std::move(result)));
-}
-#endif
-
 SetPreferenceFunction::~SetPreferenceFunction() = default;
 
 ExtensionFunction::ResponseAction SetPreferenceFunction::Run() {
@@ -644,26 +404,6 @@
   if (!extension()->permissions_data()->HasAPIPermission(write_permission))
     return RespondNow(Error(kPermissionErrorMessage, pref_key));
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  // If the pref is ash-controlled, check that the service is present.
-  // If it isn't, don't allow the pref to be set.
-  crosapi::mojom::PrefPath pref_path =
-      PrefMapping::GetInstance()->GetPrefPathForPrefName(browser_pref);
-  chromeos::LacrosService* lacros_service;
-  if (!IsBrowserScopePrefOperation(pref_path, profile)) {
-    if (!profile->IsMainProfile()) {
-      return RespondNow(Error(kPrimaryProfileOnlyErrorMessage, pref_key));
-    }
-    // This pref should be set in ash.
-    // Check that the service exists so we can set it.
-    lacros_service = chromeos::LacrosService::Get();
-    if (!lacros_service ||
-        !lacros_service->IsAvailable<crosapi::mojom::Prefs>()) {
-      return RespondNow(Error("OS Service is unavailable."));
-    }
-  }
-#endif
-
   ExtensionPrefs* prefs = ExtensionPrefs::Get(browser_context());
   const PrefService::Preference* pref =
       prefs->pref_service()->FindPreference(browser_pref);
@@ -717,26 +457,10 @@
 
   prefs_helper->SetExtensionControlledPref(extension_id(), browser_pref, scope,
                                            browser_pref_value->Clone());
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  if (!IsBrowserScopePrefOperation(pref_path, profile) &&
-      prefs_helper->DoesExtensionControlPref(extension_id(), browser_pref,
-                                             nullptr)) {
-    lacros_service->GetRemote<crosapi::mojom::Prefs>()->SetPref(
-        pref_path, std::move(*browser_pref_value),
-        base::BindOnce(&SetPreferenceFunction::OnLacrosSetSuccess, this));
-    return RespondLater();
-  }
-#endif
 
   return RespondNow(NoArguments());
 }
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-void SetPreferenceFunction::OnLacrosSetSuccess() {
-  Respond(NoArguments());
-}
-#endif
-
 ClearPreferenceFunction::~ClearPreferenceFunction() = default;
 
 ExtensionFunction::ResponseAction ClearPreferenceFunction::Run() {
@@ -776,28 +500,6 @@
 
   auto* prefs_helper = ExtensionPrefsHelper::Get(browser_context());
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  // If the pref is ash-controlled, check that the service is present.
-  // If it isn't, don't allow the pref to be cleared.
-  crosapi::mojom::PrefPath pref_path =
-      PrefMapping::GetInstance()->GetPrefPathForPrefName(browser_pref);
-  chromeos::LacrosService* lacros_service;
-  Profile* profile = Profile::FromBrowserContext(browser_context());
-  if (!IsBrowserScopePrefOperation(pref_path, profile)) {
-    if (!profile->IsMainProfile()) {
-      return RespondNow(Error(kPrimaryProfileOnlyErrorMessage, pref_key));
-    }
-    // This pref should be cleared in ash.
-    lacros_service = chromeos::LacrosService::Get();
-    if (!lacros_service ||
-        !lacros_service->IsAvailable<crosapi::mojom::Prefs>()) {
-      return RespondNow(Error("OS Service is unavailable."));
-    }
-  }
-  bool did_just_control_pref = prefs_helper->DoesExtensionControlPref(
-      extension_id(), browser_pref, nullptr);
-#endif
-
   prefs_helper->RemoveExtensionControlledPref(extension_id(), browser_pref,
                                               scope);
 
@@ -811,41 +513,7 @@
     prefs_helper->RemoveExtensionControlledPref(
         extension_id(), prefs::kSafeBrowsingEnhanced, scope);
   }
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  if (!IsBrowserScopePrefOperation(pref_path, profile) &&
-      did_just_control_pref) {
-    // This is an ash pref and we need to update ash because the extension that
-    // just cleared the pref used to control it. Now, either another extension
-    // of lower precedence controls the pref (in which case we update the pref
-    // to that value), or no other extension has set the pref (in which case
-    // we can clear the value set by extensions in ash).
-    PrefService* pref_service =
-        extensions::preference_helpers::GetProfilePrefService(profile,
-                                                              incognito);
-
-    const PrefService::Preference* pref =
-        pref_service->FindPreference(browser_pref);
-    CHECK(pref);
-    if (pref->IsExtensionControlled()) {
-      lacros_service->GetRemote<crosapi::mojom::Prefs>()->SetPref(
-          pref_path, pref->GetValue()->Clone(),
-          base::BindOnce(&ClearPreferenceFunction::OnLacrosClearSuccess, this));
-      return RespondLater();
-    }
-    // No extension in lacros is claiming this pref.
-    lacros_service->GetRemote<crosapi::mojom::Prefs>()
-        ->ClearExtensionControlledPref(
-            pref_path,
-            base::BindOnce(&ClearPreferenceFunction::OnLacrosClearSuccess,
-                           this));
-    return RespondLater();
-  }
-#endif
   return RespondNow(NoArguments());
 }
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-void ClearPreferenceFunction::OnLacrosClearSuccess() {
-  Respond(NoArguments());
-}
-#endif
+
 }  // namespace extensions
diff --git a/chrome/browser/extensions/api/preference/preference_api.h b/chrome/browser/extensions/api/preference/preference_api.h
index c9d609d..1265aec 100644
--- a/chrome/browser/extensions/api/preference/preference_api.h
+++ b/chrome/browser/extensions/api/preference/preference_api.h
@@ -20,17 +20,6 @@
 #include "extensions/browser/extension_function.h"
 #include "extensions/common/api/types.h"
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-#include <optional>
-
-#include "chromeos/crosapi/mojom/prefs.mojom-shared.h"
-#include "chromeos/crosapi/mojom/prefs.mojom.h"
-#include "chromeos/lacros/crosapi_pref_observer.h"
-#include "chromeos/lacros/lacros_service.h"
-#include "components/prefs/pref_service.h"
-#include "extensions/common/extension_id.h"
-#endif
-
 class PrefService;
 
 namespace base {
@@ -61,38 +50,11 @@
   PrefChangeRegistrar registrar_;
   std::unique_ptr<PrefChangeRegistrar> incognito_registrar_;
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  // Callback for extension-controlled prefs where the underlying pref lives
-  // in ash. An event fires when the value of the pref in ash changes.
-  void OnAshPrefChanged(crosapi::mojom::PrefPath pref_path,
-                        const std::string& extension_pref,
-                        const std::string& browser_pref,
-                        base::Value value);
-
-  // Second callback to return additional detail about the extension-controlled
-  // pref.
-  void OnAshGetSuccess(const std::string& browser_pref,
-                       std::optional<::base::Value> opt_value,
-                       crosapi::mojom::PrefControlState control_state);
-
-  // Callback for lacros version of the prefs, to update ash in the event that
-  // they are changed.
-  void OnControlledPrefChanged(PrefService* pref_service,
-                               const std::string& browser_pref);
-
-  std::vector<std::unique_ptr<crosapi::mojom::PrefObserver>>
-      extension_pref_observers_;
-#endif
-
   // Weak, owns us (transitively via ExtensionService).
   raw_ptr<Profile> profile_;
 
   base::ScopedMultiSourceObservation<Profile, ProfileObserver>
       observed_profiles_{this};
-
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  base::WeakPtrFactory<PreferenceEventRouter> weak_factory_{this};
-#endif
 };
 
 class PreferenceAPI : public BrowserContextKeyedAPI,
@@ -163,11 +125,6 @@
  protected:
   ~GetPreferenceFunction() override;
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  void OnLacrosGetSuccess(std::optional<::base::Value> opt_value,
-                          crosapi::mojom::PrefControlState control_state);
-#endif
-
   // ExtensionFunction:
   ResponseAction Run() override;
 
@@ -177,12 +134,6 @@
                         const std::string& level_of_control,
                         const std::string& browser_pref,
                         bool incognito);
-
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  // The name of the Chrome preference being retrieved. Used to avoid a second
-  // lookup from the extension API preference name.
-  std::string cached_browser_pref_;
-#endif
 };
 
 class SetPreferenceFunction : public PreferenceFunction {
@@ -192,10 +143,6 @@
  protected:
   ~SetPreferenceFunction() override;
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  void OnLacrosSetSuccess();
-#endif
-
   // ExtensionFunction:
   ResponseAction Run() override;
 };
@@ -208,10 +155,6 @@
  protected:
   ~ClearPreferenceFunction() override;
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  void OnLacrosClearSuccess();
-#endif
-
   // ExtensionFunction:
   ResponseAction Run() override;
 };
diff --git a/chrome/browser/extensions/api/printing/printing_api_handler.cc b/chrome/browser/extensions/api/printing/printing_api_handler.cc
index d88976f..8cfe4fd1 100644
--- a/chrome/browser/extensions/api/printing/printing_api_handler.cc
+++ b/chrome/browser/extensions/api/printing/printing_api_handler.cc
@@ -175,12 +175,6 @@
   DCHECK(!base::Contains(print_jobs_, cups_id));
   print_jobs_[cups_id] = PrintJobInfo{printer_id, info.job_id, extension_id};
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  NotifyAshJobCreated(info.job_id, *info.document,
-                      crosapi::mojom::PrintJob::Source::kExtension,
-                      extension_id, local_printer_);
-#endif
-
   if (!extension_registry_->enabled_extensions().Contains(extension_id)) {
     return;
   }
diff --git a/chrome/browser/extensions/api/printing/printing_api_handler.h b/chrome/browser/extensions/api/printing/printing_api_handler.h
index 31bc3947..baf7100c 100644
--- a/chrome/browser/extensions/api/printing/printing_api_handler.h
+++ b/chrome/browser/extensions/api/printing/printing_api_handler.h
@@ -22,9 +22,9 @@
 #include "mojo/public/cpp/bindings/receiver.h"
 #include "ui/gfx/native_widget_types.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/ash/printing/cups_print_job_manager_factory.h"
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 class PrefRegistrySimple;
 
@@ -189,9 +189,9 @@
   static void DeclareFactoryDependencies(
       BrowserContextKeyedAPIFactory<PrintingAPIHandler>* factory) {
     factory->DependsOn(EventRouterFactory::GetInstance());
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
     factory->DependsOn(ash::CupsPrintJobManagerFactory::GetInstance());
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
   }
 };
 
diff --git a/chrome/browser/extensions/api/printing/printing_api_handler_unittest.cc b/chrome/browser/extensions/api/printing/printing_api_handler_unittest.cc
index 97b5f381..1c7797f 100644
--- a/chrome/browser/extensions/api/printing/printing_api_handler_unittest.cc
+++ b/chrome/browser/extensions/api/printing/printing_api_handler_unittest.cc
@@ -367,12 +367,8 @@
     EXPECT_TRUE(job_id);
     EXPECT_TRUE(submit_job_status);
     EXPECT_EQ(api::printing::SubmitJobStatus::kOk, submit_job_status);
-    // Only lacros needs to report the print job to ash chrome.
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-    EXPECT_EQ(1u, TakePrintJobs().size());
-#else
     EXPECT_EQ(0u, TakePrintJobs().size());
-#endif
+
     return *job_id;
   }
 
diff --git a/chrome/browser/extensions/api/printing/printing_apitest.cc b/chrome/browser/extensions/api/printing/printing_apitest.cc
index 9cf0836c..23af937 100644
--- a/chrome/browser/extensions/api/printing/printing_apitest.cc
+++ b/chrome/browser/extensions/api/printing/printing_apitest.cc
@@ -13,16 +13,6 @@
 #include "extensions/test/test_extension_dir.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-#include "base/test/gmock_callback_support.h"
-#include "chrome/browser/extensions/api/printing/fake_print_job_controller.h"
-#include "chrome/browser/extensions/api/printing/printing_api_handler.h"
-#include "chrome/test/chromeos/printing/mock_local_printer_chromeos.h"
-#include "chromeos/crosapi/mojom/local_printer.mojom.h"
-#include "chromeos/lacros/lacros_service.h"
-#include "chromeos/printing/printer_configuration.h"
-#endif
-
 namespace extensions {
 
 namespace {
@@ -30,19 +20,6 @@
 constexpr char kId[] = "id";
 constexpr char kName[] = "name";
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-
-using testing::_;
-using testing::DoAll;
-using testing::InSequence;
-using testing::NiceMock;
-using testing::Return;
-using testing::WithArg;
-using testing::WithArgs;
-using testing::WithoutArgs;
-
-#endif
-
 }  // namespace
 
 class PrintingApiTestBase : public ExtensionApiTest,
@@ -66,7 +43,6 @@
   }
 };
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
 class PrintingApiTest : public PrintingApiTestBase {
  public:
   void PreRunTestOnMainThread() override {
@@ -96,74 +72,17 @@
  private:
   std::unique_ptr<PrintingTestHelper> helper_;
 };
-#elif BUILDFLAG(IS_CHROMEOS_LACROS)
-class PrintingApiTest : public PrintingApiTestBase {
- public:
-  void SetUpOnMainThread() override {
-    PrintingApiTestBase::SetUpOnMainThread();
-    printing_infra_helper_ =
-        std::make_unique<PrintingBackendInfrastructureHelper>();
-  }
-
-  void CreatedBrowserMainParts(
-      content::BrowserMainParts* browser_main_parts) override {
-    PrintingApiTestBase::CreatedBrowserMainParts(browser_main_parts);
-    chromeos::LacrosService::Get()->InjectRemoteForTesting(
-        local_printer_receiver_.BindNewPipeAndPassRemote());
-
-    // When PrintingAPIHandler is initiated, it attempts to bind the observer
-    // for print jobs.
-    EXPECT_CALL(local_printer(), AddPrintJobObserver(_, _, _))
-        .WillOnce(WithArgs<0, 2>(
-            [&](mojo::PendingRemote<crosapi::mojom::PrintJobObserver> remote,
-                MockLocalPrinter::AddPrintJobObserverCallback callback) {
-              observer_remote_.Bind(std::move(remote));
-              std::move(callback).Run();
-            }));
-  }
-
- protected:
-  NiceMock<MockLocalPrinter>& local_printer() { return local_printer_; }
-  crosapi::mojom::PrintJobObserver* observer_remote() {
-    return observer_remote_.get();
-  }
-  PrintingBackendInfrastructureHelper& printing_infra_helper() {
-    return *printing_infra_helper_;
-  }
-
- private:
-  NiceMock<MockLocalPrinter> local_printer_;
-  mojo::Receiver<crosapi::mojom::LocalPrinter> local_printer_receiver_{
-      &local_printer_};
-  mojo::Remote<crosapi::mojom::PrintJobObserver> observer_remote_;
-
-  std::unique_ptr<PrintingBackendInfrastructureHelper> printing_infra_helper_;
-};
-#endif
 
 using PrintingPromiseApiTest = PrintingApiTest;
 
 IN_PROC_BROWSER_TEST_P(PrintingApiTest, GetPrinters) {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
   AddPrinterWithSemanticCaps(kId, kName, ConstructPrinterCapabilities());
-#elif BUILDFLAG(IS_CHROMEOS_LACROS)
-  EXPECT_CALL(local_printer(), GetPrinters(_))
-      .WillOnce(base::test::RunOnceCallback<0>(
-          ConstructGetPrintersResponse(kId, kName)));
-#endif
 
   RunTest("get_printers.html");
 }
 
 IN_PROC_BROWSER_TEST_P(PrintingApiTest, GetPrinterInfo) {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
   AddPrinterWithSemanticCaps(kId, kName, ConstructPrinterCapabilities());
-#elif BUILDFLAG(IS_CHROMEOS_LACROS)
-  EXPECT_CALL(local_printer(), GetCapability(kId, _))
-      .WillOnce(base::test::RunOnceCallback<1>(
-          printing::PrinterWithCapabilitiesToMojom(
-              chromeos::Printer(kId), *ConstructPrinterCapabilities())));
-#endif
 
   RunTest("get_printer_info.html");
 }
@@ -178,24 +97,7 @@
 IN_PROC_BROWSER_TEST_P(PrintingApiTest, SubmitJob) {
   ASSERT_TRUE(StartEmbeddedTestServer());
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
   AddPrinterWithSemanticCaps(kId, kName, ConstructPrinterCapabilities());
-#elif BUILDFLAG(IS_CHROMEOS_LACROS)
-  InSequence s;
-
-  EXPECT_CALL(local_printer(), GetCapability(kId, _))
-      .WillOnce(base::test::RunOnceCallback<1>(
-          printing::PrinterWithCapabilitiesToMojom(
-              chromeos::Printer(kId), *ConstructPrinterCapabilities())));
-
-  // Acknowledge print job creation so that the mojo callback doesn't hang.
-  EXPECT_CALL(local_printer(), CreatePrintJob(_, _))
-      .WillOnce(base::test::RunOnceCallback<1>());
-
-  printing_infra_helper()
-      .test_printing_context_factory()
-      .SetPrinterNameForSubsequentContexts(kId);
-#endif
 
   RunTest("submit_job.html");
 }
@@ -204,24 +106,7 @@
 IN_PROC_BROWSER_TEST_P(PrintingPromiseApiTest, SubmitJob) {
   ASSERT_TRUE(StartEmbeddedTestServer());
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
   AddPrinterWithSemanticCaps(kId, kName, ConstructPrinterCapabilities());
-#elif BUILDFLAG(IS_CHROMEOS_LACROS)
-  InSequence s;
-
-  EXPECT_CALL(local_printer(), GetCapability(kId, _))
-      .WillOnce(base::test::RunOnceCallback<1>(
-          printing::PrinterWithCapabilitiesToMojom(
-              chromeos::Printer(kId), *ConstructPrinterCapabilities())));
-
-  // Acknowledge print job creation so that the mojo callback doesn't hang.
-  EXPECT_CALL(local_printer(), CreatePrintJob(_, _))
-      .WillOnce(base::test::RunOnceCallback<1>());
-
-  printing_infra_helper()
-      .test_printing_context_factory()
-      .SetPrinterNameForSubsequentContexts(kId);
-#endif
 
   RunTest("submit_job_promise.html");
 }
@@ -232,56 +117,7 @@
 IN_PROC_BROWSER_TEST_P(PrintingApiTest, CancelJob) {
   ASSERT_TRUE(StartEmbeddedTestServer());
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
   AddPrinterWithSemanticCaps(kId, kName, ConstructPrinterCapabilities());
-#elif BUILDFLAG(IS_CHROMEOS_LACROS)
-  InSequence s;
-
-  EXPECT_CALL(local_printer(), GetCapability(kId, _))
-      .WillOnce(base::test::RunOnceCallback<1>(
-          printing::PrinterWithCapabilitiesToMojom(
-              chromeos::Printer(kId), *ConstructPrinterCapabilities())));
-
-  std::optional<uint32_t> job_id;
-  // Pretends to acknowledge the incoming Lacros print job creation request and
-  // responds with PrintJobStatus::kStarted event.
-  // The callback is ignored by the implementation -- for this reason the
-  // invocation order doesn't really matter here (however, dropping it would
-  // yield a mojo error).
-  EXPECT_CALL(local_printer(), CreatePrintJob(_, _))
-      .WillOnce(DoAll(WithArg<0>([&](const auto& job) {
-                        job_id = job->job_id;
-                        auto update = crosapi::mojom::PrintJobUpdate::New();
-                        update->status =
-                            crosapi::mojom::PrintJobStatus::kStarted;
-                        observer_remote()->OnPrintJobUpdate(kId, *job_id,
-                                                            std::move(update));
-                      }),
-                      base::test::RunOnceCallback<1>()));
-
-  // Pretends to acknowledge the incoming Lacros print job cancelation request
-  // and responds with PrintJobStatus::kCancelled event.
-  // The callback is ignored by the implementation -- for this reason the
-  // invocation order doesn't really matter here (however, dropping it would
-  // yield a mojo error).
-  EXPECT_CALL(local_printer(), CancelPrintJob(_, _, _))
-      .WillOnce(DoAll(WithoutArgs([&] {
-                        // Thanks to InSequence defined in the beginning of the
-                        // test, it's guaranteed that `job_id` will be set
-                        // before we get here.
-                        ASSERT_TRUE(job_id);
-                        auto update = crosapi::mojom::PrintJobUpdate::New();
-                        update->status =
-                            crosapi::mojom::PrintJobStatus::kCancelled;
-                        observer_remote()->OnPrintJobUpdate(kId, *job_id,
-                                                            std::move(update));
-                      }),
-                      base::test::RunOnceCallback<2>(/*canceled=*/true)));
-
-  printing_infra_helper()
-      .test_printing_context_factory()
-      .SetPrinterNameForSubsequentContexts(kId);
-#endif
 
   RunTest("cancel_job.html");
 }
diff --git a/chrome/browser/extensions/api/printing/printing_test_utils.cc b/chrome/browser/extensions/api/printing/printing_test_utils.cc
index 5b7550a9..6a0d1ea 100644
--- a/chrome/browser/extensions/api/printing/printing_test_utils.cc
+++ b/chrome/browser/extensions/api/printing/printing_test_utils.cc
@@ -22,7 +22,7 @@
 #include "printing/backend/cups_ipp_constants.h"
 #include "printing/backend/print_backend.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/browser/ash/printing/cups_print_job_manager.h"
 #include "chrome/browser/ash/printing/cups_print_job_manager_factory.h"
@@ -75,7 +75,7 @@
          {ExtensionType::kExtensionMV2, "manifest_extension.json"},
          {ExtensionType::kExtensionMV3, "manifest_v3_extension.json"}});
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 // This class uses methods from FakeCupsPrintJobManager while connecting it to
 // the rest of the printing pipeline so that it no longer has to be directly
 // invoked by the test code.
@@ -153,7 +153,7 @@
 #endif
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 PrintingTestHelper::PrintingTestHelper() {
   create_services_subscription_ =
       BrowserContextDependencyManager::GetInstance()
diff --git a/chrome/browser/extensions/api/printing/printing_test_utils.h b/chrome/browser/extensions/api/printing/printing_test_utils.h
index 263bb6a..cc18c4a 100644
--- a/chrome/browser/extensions/api/printing/printing_test_utils.h
+++ b/chrome/browser/extensions/api/printing/printing_test_utils.h
@@ -12,9 +12,9 @@
 #include "chrome/browser/printing/browser_printing_context_factory_for_test.h"
 #include "printing/buildflags/buildflags.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "base/callback_list.h"
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 #if BUILDFLAG(ENABLE_OOP_PRINTING)
 #include "chrome/services/printing/public/mojom/print_backend_service.mojom.h"
@@ -23,7 +23,7 @@
 
 class Profile;
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 namespace ash {
 class TestCupsPrintJobManager;
 class FakeCupsPrintersManager;
@@ -77,7 +77,7 @@
   printing::BrowserPrintingContextFactoryForTest test_printing_context_factory_;
 };
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 class PrintingTestHelper {
  public:
   // BrowserContextDependencyManager subscriptions should be established before
diff --git a/chrome/browser/extensions/api/proxy/proxy_apitest.cc b/chrome/browser/extensions/api/proxy/proxy_apitest.cc
index 3b46e9d..bc64805 100644
--- a/chrome/browser/extensions/api/proxy/proxy_apitest.cc
+++ b/chrome/browser/extensions/api/proxy/proxy_apitest.cc
@@ -18,14 +18,6 @@
 #include "extensions/common/extension.h"
 #include "extensions/test/result_catcher.h"
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-#include "chromeos/crosapi/mojom/network_settings_service.mojom.h"
-#include "chromeos/crosapi/mojom/prefs.mojom-shared.h"
-#include "chromeos/crosapi/mojom/prefs.mojom.h"
-#include "chromeos/lacros/crosapi_pref_observer.h"
-#include "chromeos/lacros/lacros_service.h"
-#endif
-
 namespace extensions {
 
 namespace {
@@ -34,15 +26,6 @@
 const char kNoBypass[] = "";
 const char kNoPac[] = "";
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-bool IsLacrosServiceSyncingProxyPref() {
-  static constexpr int kMinVersionProxyPolicy = 4;
-  const int version = chromeos::LacrosService::Get()
-                          ->GetInterfaceVersion<crosapi::mojom::Prefs>();
-  return version >= kMinVersionProxyPolicy;
-}
-#endif
-
 }  // namespace
 
 class ProxySettingsApiTest : public ExtensionApiTest {
@@ -53,33 +36,6 @@
   ProxySettingsApiTest& operator=(const ProxySettingsApiTest&) = delete;
 
  protected:
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  void TearDownOnMainThread() override {
-    // Clear the proxy from the test_ash_chrome since the same instance Ash is
-    // used for all tests in the target. Setting a proxy will prevent other
-    // tests which require a direct connection to complete successfully.
-    auto* lacros_service = chromeos::LacrosService::Get();
-    if (!lacros_service) {
-      ExtensionApiTest::TearDownOnMainThread();
-      return;
-    }
-    if (IsLacrosServiceSyncingProxyPref()) {
-      if (lacros_service->IsAvailable<crosapi::mojom::Prefs>()) {
-        lacros_service->GetRemote<crosapi::mojom::Prefs>()
-            ->ClearExtensionControlledPref(crosapi::mojom::PrefPath::kProxy,
-                                           base::DoNothing());
-      }
-    } else {
-      if (lacros_service
-              ->IsAvailable<crosapi::mojom::NetworkSettingsService>()) {
-        lacros_service->GetRemote<crosapi::mojom::NetworkSettingsService>()
-            ->ClearExtensionProxy();
-      }
-    }
-    ExtensionApiTest::TearDownOnMainThread();
-  }
-#endif
-
   void ValidateSettings(int expected_mode,
                         const std::string& expected_server,
                         const std::string& bypass,
diff --git a/chrome/browser/extensions/api/resources_private/BUILD.gn b/chrome/browser/extensions/api/resources_private/BUILD.gn
index 94f4a8e..1a03750 100644
--- a/chrome/browser/extensions/api/resources_private/BUILD.gn
+++ b/chrome/browser/extensions/api/resources_private/BUILD.gn
@@ -37,7 +37,7 @@
     ]
   }
 
-  if (is_chromeos_ash) {
+  if (is_chromeos) {
     deps += [ "//chromeos/ash/components/browser_context_helper" ]
   }
 }
diff --git a/chrome/browser/extensions/api/resources_private/resources_private_api.cc b/chrome/browser/extensions/api/resources_private/resources_private_api.cc
index f343ae6b..6efc62f 100644
--- a/chrome/browser/extensions/api/resources_private/resources_private_api.cc
+++ b/chrome/browser/extensions/api/resources_private/resources_private_api.cc
@@ -20,12 +20,12 @@
 #if BUILDFLAG(ENABLE_PDF)
 #include "chrome/browser/pdf/pdf_extension_util.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/common/pref_names.h"
 #include "chromeos/ash/components/browser_context_helper/browser_context_types.h"
 #include "components/prefs/pref_service.h"
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 #endif  // BUILDFLAG(ENABLE_PDF)
 
 // To add a new component to this API, simply:
@@ -45,14 +45,14 @@
 
 #if BUILDFLAG(ENABLE_PDF)
 bool IsPdfAnnotationsEnabled(content::BrowserContext* context) {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   PrefService* prefs =
       context ? Profile::FromBrowserContext(context)->GetPrefs() : nullptr;
   if (prefs && prefs->IsManagedPreference(prefs::kPdfAnnotationsEnabled) &&
       !prefs->GetBoolean(prefs::kPdfAnnotationsEnabled)) {
     return false;
   }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
   return true;
 }
 #endif  // BUILDFLAG(ENABLE_PDF)
@@ -81,9 +81,9 @@
       pdf_extension_util::AddStrings(pdf_extension_util::PdfViewerContext::kAll,
                                      &dict);
       bool enable_printing = true;
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
       enable_printing = ash::IsUserBrowserContext(browser_context());
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
       pdf_extension_util::AddAdditionalData(
           enable_printing, IsPdfAnnotationsEnabled(browser_context()), &dict);
diff --git a/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.cc b/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.cc
index ac9f587..ca0b240 100644
--- a/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.cc
+++ b/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.cc
@@ -50,7 +50,7 @@
 #include "services/network/public/cpp/shared_url_loader_factory.h"
 #include "url/gurl.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/ash/policy/core/user_cloud_policy_manager_ash.h"
 #include "chrome/browser/ash/profiles/profile_helper.h"
 #include "chrome/browser/browser_process_platform_part_ash.h"
diff --git a/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router_unittest.cc b/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router_unittest.cc
index 07bbc35..68da9ed 100644
--- a/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router_unittest.cc
+++ b/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router_unittest.cc
@@ -48,7 +48,7 @@
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/ash/login/users/fake_chrome_user_manager.h"
 #include "chrome/browser/ash/login/users/user_manager_delegate_impl.h"
 #include "chrome/browser/ash/profiles/profile_helper.h"
@@ -342,14 +342,14 @@
   raw_ptr<extensions::TestEventRouter> event_router_ = nullptr;
 
  private:
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
   policy::FakeBrowserDMTokenStorage dm_token_storage_;
-#endif  // !BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // !BUILDFLAG(IS_CHROMEOS)
 };
 
 class SafeBrowsingPrivateEventRouterTest
     : public SafeBrowsingPrivateEventRouterTestBase {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
  public:
   SafeBrowsingPrivateEventRouterTest() = default;
 
@@ -360,7 +360,7 @@
           std::make_unique<ash::UserManagerDelegateImpl>(),
           g_browser_process->local_state(),
           ash::CrosSettings::Get())};
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 };
 
 TEST_F(SafeBrowsingPrivateEventRouterTest, TestOnReuseDetected_Warned) {
@@ -1643,7 +1643,7 @@
         is_policy_enabled_(testing::get<1>(GetParam())),
         is_authorized_(testing::get<2>(GetParam())) {
     // In chrome branded desktop builds, the browser is always manageable.
-#if !BUILDFLAG(GOOGLE_CHROME_BRANDING) && !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(GOOGLE_CHROME_BRANDING) && !BUILDFLAG(IS_CHROMEOS)
     if (is_manageable_) {
       base::CommandLine::ForCurrentProcess()->AppendSwitch(
           switches::kEnableChromeBrowserCloudManagement);
@@ -1658,7 +1658,7 @@
                                 *base::JSONReader::Read(kConnectorsPrefValue));
     }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
     user_manager_.Reset(std::make_unique<ash::FakeChromeUserManager>());
     const AccountId account_id(
         AccountId::FromUserEmail(profile_->GetProfileUserName()));
@@ -1681,7 +1681,7 @@
   const bool is_policy_enabled_;
   const bool is_authorized_;
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
  private:
   user_manager::TypedScopedUserManager<ash::FakeChromeUserManager>
       user_manager_;
diff --git a/chrome/browser/extensions/api/sessions/sessions_api.cc b/chrome/browser/extensions/api/sessions/sessions_api.cc
index ac74d19..747d429 100644
--- a/chrome/browser/extensions/api/sessions/sessions_api.cc
+++ b/chrome/browser/extensions/api/sessions/sessions_api.cc
@@ -329,7 +329,7 @@
       type = api::windows::WindowType::kDevtools;
       break;
     case sessions::SessionWindow::TYPE_APP_POPUP:
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
     case sessions::SessionWindow::TYPE_CUSTOM_TAB:
 #endif
       NOTREACHED_IN_MIGRATION();
diff --git a/chrome/browser/extensions/api/sessions/sessions_apitest.cc b/chrome/browser/extensions/api/sessions/sessions_apitest.cc
index 949ae880..c548189 100644
--- a/chrome/browser/extensions/api/sessions/sessions_apitest.cc
+++ b/chrome/browser/extensions/api/sessions/sessions_apitest.cc
@@ -51,7 +51,7 @@
 #include "extensions/browser/api_test_utils.h"
 #include "extensions/common/extension_builder.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "ash/constants/ash_switches.h"
 #endif
 
@@ -180,7 +180,7 @@
 };
 
 void ExtensionSessionsTest::SetUpCommandLine(base::CommandLine* command_line) {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   command_line->AppendSwitch(ash::switches::kIgnoreUserProfileMappingForTests);
 #endif
 }
diff --git a/chrome/browser/extensions/api/settings_private/generated_prefs.cc b/chrome/browser/extensions/api/settings_private/generated_prefs.cc
index 179a144..f81ab5a6 100644
--- a/chrome/browser/extensions/api/settings_private/generated_prefs.cc
+++ b/chrome/browser/extensions/api/settings_private/generated_prefs.cc
@@ -20,7 +20,7 @@
 #include "components/content_settings/core/common/pref_names.h"
 #include "components/permissions/features.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/extensions/api/settings_private/chromeos_resolve_time_zone_by_geolocation_method_short.h"
 #include "chrome/browser/extensions/api/settings_private/chromeos_resolve_time_zone_by_geolocation_on_off.h"
 #endif
@@ -89,7 +89,7 @@
 }
 
 void GeneratedPrefs::CreatePrefs() {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   prefs_[kResolveTimezoneByGeolocationOnOff] =
       CreateGeneratedResolveTimezoneByGeolocationOnOff(profile_);
   prefs_[kResolveTimezoneByGeolocationMethodShort] =
diff --git a/chrome/browser/extensions/api/settings_private/prefs_util.cc b/chrome/browser/extensions/api/settings_private/prefs_util.cc
index 82e5e3bb..5d059ae 100644
--- a/chrome/browser/extensions/api/settings_private/prefs_util.cc
+++ b/chrome/browser/extensions/api/settings_private/prefs_util.cc
@@ -70,7 +70,7 @@
 #include "extensions/browser/management_policy.h"
 #include "extensions/common/extension.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "ash/components/arc/arc_prefs.h"
 #include "ash/constants/ash_pref_names.h"
 #include "ash/constants/ash_pref_names.h"  // nogncheck
@@ -86,6 +86,7 @@
 #include "chrome/browser/ash/profiles/profile_helper.h"
 #include "chrome/browser/ash/settings/supervised_user_cros_settings_provider.h"
 #include "chrome/browser/ash/system/timezone_util.h"
+#include "chrome/browser/chromeos/extensions/controlled_pref_mapping.h"
 #include "chrome/browser/extensions/api/settings_private/chromeos_resolve_time_zone_by_geolocation_method_short.h"
 #include "chrome/browser/extensions/api/settings_private/chromeos_resolve_time_zone_by_geolocation_on_off.h"
 #include "chrome/browser/policy/profile_policy_connector.h"
@@ -100,13 +101,9 @@
 #include "ui/events/ash/pref_names.h"
 #endif
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_CHROMEOS_ASH)
-#include "chrome/browser/chromeos/extensions/controlled_pref_mapping.h"
-#endif
-
 namespace {
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 bool IsPrivilegedCrosSetting(const std::string& pref_name) {
   // Cros settings are considered privileged and are either policy
   // controlled or owner controlled.
@@ -135,8 +132,7 @@
       ->supervised_user_cros_settings_provider()
       ->Get(pref_name);
 }
-
-#endif
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 bool IsSettingReadOnly(const std::string& pref_name) {
   // download.default_directory is used to display the directory location and
@@ -144,7 +140,7 @@
   if (pref_name == prefs::kDownloadDefaultDirectory) {
     return true;
   }
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // System timezone is never directly changeable by the user.
   if (pref_name == ash::kSystemTimezone) {
     return ash::system::PerUserTimezoneEnabled();
@@ -268,7 +264,7 @@
       settings_api::PrefType::kBoolean;
   (*s_allowlist)[drive::prefs::kDisableDrive] =
       settings_api::PrefType::kBoolean;
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   (*s_allowlist)[::prefs::kNetworkFileSharesAllowed] =
       settings_api::PrefType::kBoolean;
   (*s_allowlist)[::prefs::kMostRecentlyUsedNetworkFileShareURL] =
@@ -297,13 +293,13 @@
   (*s_allowlist)
       [password_manager::prefs::kPasswordDismissCompromisedAlertEnabled] =
           settings_api::PrefType::kBoolean;
-#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_CHROMEOS)
   (*s_allowlist)
       [password_manager::prefs::kBiometricAuthenticationBeforeFilling] =
           settings_api::PrefType::kBoolean;
 #endif
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   (*s_allowlist)
       [password_manager::prefs::kBiometricAuthBeforeFillingPromoShownCounter] =
           settings_api::PrefType::kNumber;
@@ -333,7 +329,7 @@
   (*s_allowlist)[::prefs::kDnsOverHttpsMode] = settings_api::PrefType::kString;
   (*s_allowlist)[::prefs::kDnsOverHttpsTemplates] =
       settings_api::PrefType::kString;
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   (*s_allowlist)[::prefs::kDnsOverHttpsSalt] = settings_api::PrefType::kString;
   (*s_allowlist)[::prefs::kDnsOverHttpsTemplatesWithIdentifiers] =
       settings_api::PrefType::kString;
@@ -426,7 +422,7 @@
       settings_api::PrefType::kString;
   (*s_allowlist)[translate::prefs::kPrefAlwaysTranslateList] =
       settings_api::PrefType::kList;
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   (*s_allowlist)[::prefs::kLanguageImeMenuActivated] =
       settings_api::PrefType::kBoolean;
   (*s_allowlist)[ash::prefs::kAssistPersonalInfoEnabled] =
@@ -444,19 +440,15 @@
       settings_api::PrefType::kBoolean;
   (*s_allowlist)[ash::prefs::kNextImeShortcutReminderDismissed] =
       settings_api::PrefType::kBoolean;
-#endif
 
   // Files page.
-#if BUILDFLAG(IS_CHROMEOS_ASH)
   (*s_allowlist)[::prefs::kOfficeFilesAlwaysMoveToDrive] =
       settings_api::PrefType::kBoolean;
   (*s_allowlist)[::prefs::kOfficeFilesAlwaysMoveToOneDrive] =
       settings_api::PrefType::kBoolean;
   (*s_allowlist)[::prefs::kLocalUserFilesAllowed] =
       settings_api::PrefType::kBoolean;
-#endif
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
   // Nearby Share.
   (*s_allowlist)[::prefs::kNearbySharingEnabledPrefName] =
       settings_api::PrefType::kBoolean;
@@ -475,7 +467,7 @@
   // Instant Hotspot
   (*s_allowlist)[::ash::tether::prefs::kNotificationsEnabled] =
       settings_api::PrefType::kBoolean;
-#endif
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
   // Search page.
   (*s_allowlist)[DefaultSearchManager::kDefaultSearchProviderDataPrefName] =
@@ -577,7 +569,7 @@
   (*s_allowlist)[::prefs::kCaretBrowsingEnabled] =
       settings_api::PrefType::kBoolean;
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // Accounts / Users / People.
   (*s_allowlist)[ash::kAccountsPrefAllowGuest] =
       settings_api::PrefType::kBoolean;
@@ -1124,26 +1116,18 @@
       settings_api::PrefType::kBoolean;
   (*s_allowlist)[::prefs::kImportDialogSearchEngine] =
       settings_api::PrefType::kBoolean;
-#endif
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
   // Supervised Users.  This setting is queried in our Tast tests (b/241943380).
   (*s_allowlist)[::prefs::kSupervisedUserExtensionsMayRequestPermissions] =
       settings_api::PrefType::kBoolean;
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  (*s_allowlist)[::prefs::kUseAshProxy] = settings_api::PrefType::kBoolean;
-#endif
-
-#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS)
+#if BUILDFLAG(IS_CHROMEOS)
   (*s_allowlist)[::prefs::kDocumentScanAPITrustedExtensions] =
       settings_api::PrefType::kList;
   (*s_allowlist)[::prefs::kPrintingAPIExtensionsAllowlist] =
       settings_api::PrefType::kList;
-#endif
 
-// Accessibility features in ash that can be set in lacros.
-// The Lacros version of these have their own name.
-#if BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_CHROMEOS_ASH)
   (*s_allowlist)[chromeos::prefs::kAccessibilityFocusHighlightEnabled] =
       settings_api::PrefType::kBoolean;
   (*s_allowlist)[chromeos::prefs::kDockedMagnifierEnabled] =
@@ -1174,14 +1158,13 @@
       settings_api::PrefType::kBoolean;
   (*s_allowlist)[chromeos::prefs::kAccessibilityVirtualKeyboardEnabled] =
       settings_api::PrefType::kBoolean;
-#endif
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
-  // This feature exists in all platforms but is enabled in ash above. In lacros
-  // the value in ash can be controlled by extensions.
+#if !BUILDFLAG(IS_CHROMEOS)
+  // This feature exists in all platforms but is enabled in ash above.
   (*s_allowlist)[prefs::kAccessibilityFocusHighlightEnabled] =
       settings_api::PrefType::kBoolean;
-#endif
+#endif  // !BUILDFLAG(IS_CHROMEOS)
 
   // Proxy settings.
   (*s_allowlist)[proxy_config::prefs::kProxy] =
@@ -1273,7 +1256,7 @@
     const std::string& name) {
   std::optional<settings_api::PrefObject> pref_object(std::in_place);
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   const base::Value* value = ash::CrosSettings::Get()->GetPref(name);
   if (!value) {
     LOG(WARNING) << "Cros settings pref not found: " << name;
@@ -1317,7 +1300,7 @@
     pref_object->value = pref->GetValue()->Clone();
   }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // We first check for enterprise-managed, then for primary-user managed.
   // Otherwise in multiprofile mode enterprise preference for the secondary
   // user will appear primary-user-controlled, which looks strange, because
@@ -1365,7 +1348,7 @@
     return pref_object;
   }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   if (IsPrefOwnerControlled(name)) {
     // Check for owner controlled after managed checks because if there is a
     // device policy there is no "owner". (In the unlikely case that both
@@ -1493,7 +1476,7 @@
 settings_private::SetPrefResult PrefsUtil::SetCrosSettingsPref(
     const std::string& pref_name,
     const base::Value* value) {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   if (pref_name == ash::kSystemTimezone) {
     const std::string* string_value = value->GetIfString();
     if (!string_value) {
@@ -1523,7 +1506,7 @@
 
 bool PrefsUtil::AppendToListCrosSetting(const std::string& pref_name,
                                         const base::Value& value) {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   ash::OwnerSettingsServiceAsh* service =
       ash::OwnerSettingsServiceAshFactory::GetForBrowserContext(profile_);
 
@@ -1537,7 +1520,7 @@
 
 bool PrefsUtil::RemoveFromListCrosSetting(const std::string& pref_name,
                                           const base::Value& value) {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   ash::OwnerSettingsServiceAsh* service =
       ash::OwnerSettingsServiceAshFactory::GetForBrowserContext(profile_);
 
@@ -1553,7 +1536,7 @@
   return GetAllowlistedPrefType(pref_name) == settings_api::PrefType::kUrl;
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 bool PrefsUtil::IsPrefEnterpriseManaged(const std::string& pref_name) {
   policy::BrowserPolicyConnectorAsh* connector =
       g_browser_process->platform_part()->browser_policy_connector_ash();
@@ -1654,14 +1637,14 @@
   // See http://crbug.com/157147
 
   if (pref_name == proxy_config::prefs::kProxy) {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
     return user_prefs;
 #else
     return g_browser_process->local_state();
 #endif
   }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // Secure DNS configurations should apply to the current user session. The
   // secure DNS preferences are mapped to local_state, which is applied to the
   // current user session on all platforms except Chrome OS. On Chrome OS,
@@ -1691,7 +1674,7 @@
 }
 
 bool PrefsUtil::IsCrosSetting(const std::string& pref_name) {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   return ash::CrosSettings::Get()->IsCrosSettings(pref_name);
 #else
   return false;
diff --git a/chrome/browser/extensions/api/settings_private/prefs_util.h b/chrome/browser/extensions/api/settings_private/prefs_util.h
index 9445daa..819adc6 100644
--- a/chrome/browser/extensions/api/settings_private/prefs_util.h
+++ b/chrome/browser/extensions/api/settings_private/prefs_util.h
@@ -70,7 +70,7 @@
   // Returns whether |pref_name| corresponds to a pref whose type is URL.
   bool IsPrefTypeURL(const std::string& pref_name);
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // Returns whether |pref_name| corresponds to a pref that is enterprise
   // managed.
   bool IsPrefEnterpriseManaged(const std::string& pref_name);
diff --git a/chrome/browser/extensions/api/settings_private/settings_private_apitest.cc b/chrome/browser/extensions/api/settings_private/settings_private_apitest.cc
index 8e2901b5..321b5a8 100644
--- a/chrome/browser/extensions/api/settings_private/settings_private_apitest.cc
+++ b/chrome/browser/extensions/api/settings_private/settings_private_apitest.cc
@@ -33,7 +33,7 @@
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/ash/settings/scoped_testing_cros_settings.h"
 #endif
 
@@ -88,7 +88,7 @@
  private:
   testing::NiceMock<policy::MockConfigurationPolicyProvider> provider_;
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   ash::ScopedTestingCrosSettings scoped_testing_cros_settings_;
 #endif
 };
@@ -147,7 +147,7 @@
   EXPECT_TRUE(RunSettingsSubtest("getManagedByParentPref")) << message_;
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 IN_PROC_BROWSER_TEST_P(SettingsPrivateApiTest, GetPref_CrOSSetting) {
   EXPECT_TRUE(RunSettingsSubtest("getPref_CrOSSetting")) << message_;
 }
diff --git a/chrome/browser/extensions/api/settings_private/settings_private_event_router.cc b/chrome/browser/extensions/api/settings_private/settings_private_event_router.cc
index f4dfbcb9..02aaed26d 100644
--- a/chrome/browser/extensions/api/settings_private/settings_private_event_router.cc
+++ b/chrome/browser/extensions/api/settings_private/settings_private_event_router.cc
@@ -48,7 +48,7 @@
   EventRouter::Get(context_)->UnregisterObserver(this);
 
   if (listening_) {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
     cros_settings_subscription_map_.clear();
 #endif
     const PrefsUtil::TypedPrefMap& keys = prefs_util_->GetAllowlistedKeys();
@@ -99,7 +99,7 @@
     for (const auto& it : keys) {
       std::string pref_name = it.first;
       if (prefs_util_->IsCrosSetting(pref_name)) {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
         base::CallbackListSubscription subscription =
             ash::CrosSettings::Get()->AddSettingsObserver(
                 pref_name.c_str(),
@@ -122,7 +122,7 @@
     const PrefsUtil::TypedPrefMap& keys = prefs_util_->GetAllowlistedKeys();
     for (const auto& it : keys) {
       if (prefs_util_->IsCrosSetting(it.first)) {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
         cros_settings_subscription_map_.erase(it.first);
 #endif
       } else if (generated_prefs && generated_prefs->HasPref(it.first)) {
diff --git a/chrome/browser/extensions/api/settings_private/settings_private_event_router.h b/chrome/browser/extensions/api/settings_private/settings_private_event_router.h
index de55f561..5cdcfd6 100644
--- a/chrome/browser/extensions/api/settings_private/settings_private_event_router.h
+++ b/chrome/browser/extensions/api/settings_private/settings_private_event_router.h
@@ -17,7 +17,7 @@
 #include "components/prefs/pref_change_registrar.h"
 #include "extensions/browser/event_router.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chromeos/ash/components/settings/cros_settings.h"
 #endif
 
@@ -78,7 +78,7 @@
 
   PrefChangeRegistrar* FindRegistrarForPref(const std::string& pref_name);
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   using SubscriptionMap = std::map<std::string, base::CallbackListSubscription>;
   SubscriptionMap cros_settings_subscription_map_;
 #endif
diff --git a/chrome/browser/extensions/api/shared_storage/shared_storage_private_api.h b/chrome/browser/extensions/api/shared_storage/shared_storage_private_api.h
index 7bca7bc..19f989d 100644
--- a/chrome/browser/extensions/api/shared_storage/shared_storage_private_api.h
+++ b/chrome/browser/extensions/api/shared_storage/shared_storage_private_api.h
@@ -5,30 +5,19 @@
 #ifndef CHROME_BROWSER_EXTENSIONS_API_SHARED_STORAGE_SHARED_STORAGE_PRIVATE_API_H_
 #define CHROME_BROWSER_EXTENSIONS_API_SHARED_STORAGE_SHARED_STORAGE_PRIVATE_API_H_
 
-#include <string>
-#include <vector>
-
 #include "base/values.h"
 #include "build/buildflag.h"
 #include "build/chromeos_buildflags.h"
 #include "extensions/browser/extension_function.h"
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-#include <optional>
-#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
-
-#if BUILDFLAG(IS_CHROMEOS_ASH)
 class PrefRegistrySimple;
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
 namespace extensions {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
 namespace shared_storage {
 void RegisterProfilePrefs(PrefRegistrySimple* registry);
 }  // namespace shared_storage
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
-// Used by gnubbyd in ash and lacros.  Stores small amounts of data in ash prefs
+// Used by gnubbyd in ChromeOS.  Stores small amounts of data in ash prefs
 // which is shared by ash and lacros versions of the extension.
 // TODO(b/231890240): Once Terminal SWA runs in lacros rather than ash, we can
 // migrate gnubbyd back to using chrome.storage.local and remove this private
@@ -49,9 +38,6 @@
 
   // ExtensionFunction:
   ResponseAction Run() override;
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  void OnGet(std::optional<base::Value> storage);
-#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
 };
 
 class SharedStoragePrivateSetFunction : public ExtensionFunction {
@@ -70,10 +56,6 @@
 
   // ExtensionFunction:
   ResponseAction Run() override;
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  void OnGet(base::Value::Dict to_add, std::optional<base::Value> items);
-  void OnSet();
-#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
 };
 
 class SharedStoragePrivateRemoveFunction : public ExtensionFunction {
@@ -92,10 +74,6 @@
 
   // ExtensionFunction:
   ResponseAction Run() override;
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  void OnGet(std::vector<std::string> keys, std::optional<base::Value> storage);
-  void OnSet();
-#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
 };
 
 }  // namespace extensions
diff --git a/chrome/browser/extensions/api/shared_storage/shared_storage_private_api_ash.cc b/chrome/browser/extensions/api/shared_storage/shared_storage_private_api_ash.cc
index 1debbd88..51aa3c6 100644
--- a/chrome/browser/extensions/api/shared_storage/shared_storage_private_api_ash.cc
+++ b/chrome/browser/extensions/api/shared_storage/shared_storage_private_api_ash.cc
@@ -2,6 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include <optional>
+#include <utility>
+
 #include "chrome/browser/extensions/api/shared_storage/shared_storage_private_api.h"
 
 #include "base/values.h"
diff --git a/chrome/browser/extensions/api/shared_storage/shared_storage_private_apitest.cc b/chrome/browser/extensions/api/shared_storage/shared_storage_private_apitest.cc
index 199c1ac..b77b4a0f 100644
--- a/chrome/browser/extensions/api/shared_storage/shared_storage_private_apitest.cc
+++ b/chrome/browser/extensions/api/shared_storage/shared_storage_private_apitest.cc
@@ -7,24 +7,11 @@
 #include "chrome/browser/extensions/extension_apitest.h"
 #include "content/public/test/browser_test.h"
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-#include "base/containers/contains.h"
-#include "chromeos/startup/browser_params_proxy.h"
-#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
-
 namespace extensions {
 
 using SharedStoragePrivateApiTest = ExtensionApiTest;
 
 IN_PROC_BROWSER_TEST_F(SharedStoragePrivateApiTest, Test) {
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  auto capabilities = chromeos::BrowserParamsProxy::Get()->AshCapabilities();
-  if (!capabilities || !base::Contains(*capabilities, "b/231890240")) {
-    LOG(WARNING) << "Unsupported ash version for shared storage.";
-    return;
-  }
-#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
-
   ASSERT_TRUE(RunExtensionTest("shared_storage_private")) << message_;
 }
 
diff --git a/chrome/browser/extensions/api/storage/managed_value_store_cache.cc b/chrome/browser/extensions/api/storage/managed_value_store_cache.cc
index 5bfff3f1..e08cfe0 100644
--- a/chrome/browser/extensions/api/storage/managed_value_store_cache.cc
+++ b/chrome/browser/extensions/api/storage/managed_value_store_cache.cc
@@ -37,7 +37,7 @@
 #include "extensions/common/manifest.h"
 #include "extensions/common/manifest_constants.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/ash/profiles/profile_helper.h"
 #endif
 
@@ -350,7 +350,7 @@
 // static
 policy::PolicyDomain ManagedValueStoreCache::GetPolicyDomain(
     const Profile& profile) {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   return ash::ProfileHelper::IsSigninProfile(&profile)
              ? policy::POLICY_DOMAIN_SIGNIN_EXTENSIONS
              : policy::POLICY_DOMAIN_EXTENSIONS;
diff --git a/chrome/browser/extensions/api/system_display/system_display_extension_apitest.cc b/chrome/browser/extensions/api/system_display/system_display_extension_apitest.cc
index 2fdd5b2..f8e671d 100644
--- a/chrome/browser/extensions/api/system_display/system_display_extension_apitest.cc
+++ b/chrome/browser/extensions/api/system_display/system_display_extension_apitest.cc
@@ -64,7 +64,7 @@
 
 #endif  // BUILDFLAG(IS_WIN)
 
-#if !(BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS))
+#if !BUILDFLAG(IS_CHROMEOS)
 
 using SystemDisplayExtensionApiFunctionTest = SystemDisplayExtensionApiTest;
 
@@ -86,6 +86,6 @@
   EXPECT_FALSE(set_info);
 }
 
-#endif  // !BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // !BUILDFLAG(IS_CHROMEOS)
 
 }  // namespace extensions
diff --git a/chrome/browser/extensions/api/system_private/system_private_api.cc b/chrome/browser/extensions/api/system_private/system_private_api.cc
index 65b42ea..3c48c4f 100644
--- a/chrome/browser/extensions/api/system_private/system_private_api.cc
+++ b/chrome/browser/extensions/api/system_private/system_private_api.cc
@@ -23,7 +23,7 @@
 #include "components/prefs/pref_service.h"
 #include "google_apis/google_api_keys.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chromeos/ash/components/dbus/update_engine/update_engine_client.h"
 #else
 #include "chrome/browser/upgrade_detector/upgrade_detector.h"
@@ -47,9 +47,9 @@
 const char kNotAvailableState[] = "NotAvailable";
 const char kNeedRestartState[] = "NeedRestart";
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 const char kUpdatingState[] = "Updating";
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 }  // namespace
 
@@ -72,7 +72,7 @@
 ExtensionFunction::ResponseAction SystemPrivateGetUpdateStatusFunction::Run() {
   std::string state;
   double download_progress = 0;
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // With UpdateEngineClient, we can provide more detailed information about
   // system updates on ChromeOS.
   const update_engine::StatusResult status =
diff --git a/chrome/browser/extensions/api/system_private/system_private_apitest.cc b/chrome/browser/extensions/api/system_private/system_private_apitest.cc
index d3aa265..be112bf 100644
--- a/chrome/browser/extensions/api/system_private/system_private_apitest.cc
+++ b/chrome/browser/extensions/api/system_private/system_private_apitest.cc
@@ -12,7 +12,7 @@
 #include "components/prefs/pref_service.h"
 #include "content/public/test/browser_test.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chromeos/ash/components/dbus/update_engine/fake_update_engine_client.h"
 #include "chromeos/ash/components/dbus/update_engine/update_engine_client.h"
 #endif
@@ -28,7 +28,7 @@
       << message_;
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 
 class GetUpdateStatusApiTest : public ExtensionApiTest {
  public:
diff --git a/chrome/browser/extensions/api/tab_capture/tab_capture_performancetest.cc b/chrome/browser/extensions/api/tab_capture/tab_capture_performancetest.cc
index dc86e24..6f61974 100644
--- a/chrome/browser/extensions/api/tab_capture/tab_capture_performancetest.cc
+++ b/chrome/browser/extensions/api/tab_capture/tab_capture_performancetest.cc
@@ -352,7 +352,7 @@
       PrintFailRateResults(analyzer.get(), kEventCapture));
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 
 // On ChromeOS, software compositing is not an option.
 INSTANTIATE_TEST_SUITE_P(All,
@@ -370,4 +370,4 @@
                                          kTestThroughWebRTC,
                                          kTestThroughWebRTC | kUseGpu));
 
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
diff --git a/chrome/browser/extensions/api/tabs/tabs_api.cc b/chrome/browser/extensions/api/tabs/tabs_api.cc
index 14af722..d0ec6330 100644
--- a/chrome/browser/extensions/api/tabs/tabs_api.cc
+++ b/chrome/browser/extensions/api/tabs/tabs_api.cc
@@ -132,12 +132,6 @@
 #include "chrome/browser/ui/browser_command_controller.h"
 #endif  // BUILDFLAG(IS_CHROMEOS)
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-#include "content/public/browser/devtools_agent_host.h"
-#include "ui/base/clipboard/clipboard.h"
-#include "ui/base/clipboard/clipboard_buffer.h"
-#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
-
 using content::BrowserThread;
 using content::NavigationController;
 using content::NavigationEntry;
@@ -421,12 +415,6 @@
 
   // Update the set of available browser commands.
   browser->command_controller()->LockedFullscreenStateChanged();
-
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  // Wipe the clipboard in browser and detach any dev tools.
-  ui::Clipboard::GetForCurrentThread()->Clear(ui::ClipboardBuffer::kCopyPaste);
-  content::DevToolsAgentHost::DetachAllClients();
-#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
 #endif  // BUILDFLAG(IS_CHROMEOS)
 }
 
diff --git a/chrome/browser/extensions/api/tabs/tabs_api_unittest.cc b/chrome/browser/extensions/api/tabs/tabs_api_unittest.cc
index 0986d81..15022571 100644
--- a/chrome/browser/extensions/api/tabs/tabs_api_unittest.cc
+++ b/chrome/browser/extensions/api/tabs/tabs_api_unittest.cc
@@ -48,7 +48,7 @@
 #include "extensions/common/constants.h"
 #include "extensions/common/extension_builder.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "ash/test/ash_test_helper.h"
 #include "ash/test/test_window_builder.h"
 #include "ash/wm/window_pin_util.h"
@@ -132,7 +132,7 @@
 
   void MaybeSaveLocalTabGroup(const tab_groups::LocalTabGroupID& local_id);
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   aura::Window* root_window() { return test_helper_.GetContext(); }
 #endif
 
@@ -149,13 +149,13 @@
   std::unique_ptr<TestBrowserWindow> browser_window_;
   std::unique_ptr<Browser> browser_;
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   ash::AshTestHelper test_helper_;
 #endif
 };
 
 void TabsApiUnitTest::SetUp() {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   ash::AshTestHelper::InitParams ash_params;
   ash_params.start_session = true;
   test_helper_.SetUp(std::move(ash_params));
@@ -184,7 +184,7 @@
   browser_.reset();
   browser_window_.reset();
   ExtensionServiceTestBase::TearDown();
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   test_helper_.TearDown();
 #endif
 }
@@ -1650,7 +1650,7 @@
 }
 #endif  // BUILDFLAG(IS_CHROMEOS)
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 TEST_F(TabsApiUnitTest, DontCreateTabsInLockedFullscreenMode) {
   scoped_refptr<const Extension> extension_with_tabs_permission =
       CreateTabsExtension();
@@ -1703,7 +1703,7 @@
       function.get(), "[{}]", profile(), api_test_utils::FunctionMode::kNone);
   EXPECT_EQ(tabs_constants::kScreenshotsDisabled, error);
 }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 TEST_F(TabsApiUnitTest, CannotDuplicatePictureInPictureWindows) {
   // Create picture-in-picture browser.
diff --git a/chrome/browser/extensions/api/tabs/tabs_apitest.cc b/chrome/browser/extensions/api/tabs/tabs_apitest.cc
index 730a288..ac835f2 100644
--- a/chrome/browser/extensions/api/tabs/tabs_apitest.cc
+++ b/chrome/browser/extensions/api/tabs/tabs_apitest.cc
@@ -183,12 +183,10 @@
 }
 
 // TODO(crbug.com/40254426): Move to tabs_interactive_test.cc
-#if !BUILDFLAG(IS_CHROMEOS_LACROS)
 // TODO(crbug.com/40890826): Re-enable once flakiness is fixed.
 IN_PROC_BROWSER_TEST_P(ExtensionApiTabTestWithContextType, DISABLED_Highlight) {
   ASSERT_TRUE(RunExtensionTest("tabs/basics/highlight")) << message_;
 }
-#endif
 
 IN_PROC_BROWSER_TEST_P(ExtensionApiTabTestWithContextType, LastAccessed) {
   ASSERT_TRUE(RunExtensionTest("tabs/basics/last_accessed")) << message_;
@@ -292,8 +290,8 @@
       << message_;
 }
 
-// TODO(crbug.com/40803947): Fix flakiness on Linux and Lacros then reenable.
-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
+// TODO(crbug.com/40803947): Fix flakiness on Linux then reenable.
+#if BUILDFLAG(IS_LINUX)
 #define MAYBE_CaptureVisibleDisabled DISABLED_CaptureVisibleDisabled
 #else
 #define MAYBE_CaptureVisibleDisabled CaptureVisibleDisabled
diff --git a/chrome/browser/extensions/api/tabs/tabs_interactive_test.cc b/chrome/browser/extensions/api/tabs/tabs_interactive_test.cc
index 5db1e5e..1bf4f4f 100644
--- a/chrome/browser/extensions/api/tabs/tabs_interactive_test.cc
+++ b/chrome/browser/extensions/api/tabs/tabs_interactive_test.cc
@@ -83,13 +83,7 @@
   api_test_utils::GetList(result, ExtensionTabUtil::kTabsKey);
 }
 
-// Flaky on LaCrOS: crbug.com/1179817
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-#define MAYBE_QueryLastFocusedWindowTabs DISABLED_QueryLastFocusedWindowTabs
-#else
-#define MAYBE_QueryLastFocusedWindowTabs QueryLastFocusedWindowTabs
-#endif
-IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, MAYBE_QueryLastFocusedWindowTabs) {
+IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, QueryLastFocusedWindowTabs) {
   const size_t kExtraWindows = 2;
   for (size_t i = 0; i < kExtraWindows; ++i)
     CreateBrowser(browser()->profile());
@@ -149,11 +143,7 @@
       const NonPersistentExtensionTabsTest&) = delete;
 };
 
-// Crashes on Lacros only. http://crbug.com/1150133
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-#define MAYBE_TabCurrentWindow DISABLED_TabCurrentWindow
-// Flakes on Linux Tests. http://crbug.com/1162432
-#elif BUILDFLAG(IS_LINUX)
+#if BUILDFLAG(IS_LINUX)
 #define MAYBE_TabCurrentWindow DISABLED_TabCurrentWindow
 #else
 #define MAYBE_TabCurrentWindow TabCurrentWindow
@@ -166,8 +156,8 @@
   ASSERT_TRUE(RunExtensionTest("tabs/current_window")) << message_;
 }
 
-// Crashes on Lacros and Linux-ozone-rel. http://crbug.com/1196709
-#if BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_OZONE)
+// TODO(crbug.com/40759767): Crashes on Linux-ozone-rel.
+#if BUILDFLAG(IS_OZONE)
 #define MAYBE_TabGetLastFocusedWindow DISABLED_TabGetLastFocusedWindow
 #else
 #define MAYBE_TabGetLastFocusedWindow TabGetLastFocusedWindow
@@ -179,10 +169,10 @@
   ASSERT_TRUE(RunExtensionTest("tabs/last_focused_window")) << message_;
 }
 
-// TODO(http://crbug.com/58229): The Linux and Lacros window managers
-// behave differently, which complicates the test. A separate  test should
-// be written for them to avoid complicating this one.
-#if !BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS_LACROS)
+// TODO(http://crbug.com/41237209): The Linux window manager behaves
+// differently, which complicates the test. A separate  test should
+// be written for it to avoid complicating this one.
+#if !BUILDFLAG(IS_LINUX)
 IN_PROC_BROWSER_TEST_P(NonPersistentExtensionTabsTest, WindowSetFocus) {
   ASSERT_TRUE(RunExtensionTest("window_update/set_focus")) << message_;
 }
diff --git a/chrome/browser/extensions/api/tabs/tabs_test.cc b/chrome/browser/extensions/api/tabs/tabs_test.cc
index 71ecf9a..3c519f8 100644
--- a/chrome/browser/extensions/api/tabs/tabs_test.cc
+++ b/chrome/browser/extensions/api/tabs/tabs_test.cc
@@ -995,10 +995,10 @@
 
 // TODO(crbug.com/40254339): Remove this workaround if this wait is no longer
 // needed.
-// These builds flags are limiting the check for IsMinimized() for Linux
-// and Lacros. For Linux and Lacros we only check X11 window manager and not
-// wayland since our current fix only applies to X11.
-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
+// These builds flags are limiting the check for IsMinimized() for Linux.
+// For Linux, we only check X11 window manager and not Wayland since our
+// current fix only applies to X11.
+#if BUILDFLAG(IS_LINUX)
 // Must be checked inside IS_LINUX to compile on windows/mac.
 #if BUILDFLAG(IS_OZONE_X11)
   // DesktopWindowTreeHostX11::IsMinimized() relies on an asynchronous update
@@ -1014,7 +1014,7 @@
 #endif
 #else
   EXPECT_TRUE(new_controller->window()->IsMinimized());
-#endif  // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
+#endif  // BUILDFLAG(IS_LINUX)
 
   function = base::MakeRefCounted<WindowsCreateFunction>();
   function->set_extension(extension.get());
diff --git a/chrome/browser/extensions/api/tabs/window_open_interactive_apitest.cc b/chrome/browser/extensions/api/tabs/window_open_interactive_apitest.cc
index f1a9ec9..8896509 100644
--- a/chrome/browser/extensions/api/tabs/window_open_interactive_apitest.cc
+++ b/chrome/browser/extensions/api/tabs/window_open_interactive_apitest.cc
@@ -16,8 +16,8 @@
 
 // The test uses the chrome.browserAction.openPopup API, which requires that the
 // window can automatically be activated.
-// Fails flakily on Linux and Lacros. https://crbug.com/477691.
-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
+// TODO(crbug.com/41168657): Fails flakily on Linux.
+#if BUILDFLAG(IS_LINUX)
 #define MAYBE_WindowOpen DISABLED_WindowOpen
 #else
 #define MAYBE_WindowOpen WindowOpen
diff --git a/chrome/browser/extensions/api/vpn_provider/vpn_provider_apitest.cc b/chrome/browser/extensions/api/vpn_provider/vpn_provider_apitest.cc
index 51ff1da..f956071 100644
--- a/chrome/browser/extensions/api/vpn_provider/vpn_provider_apitest.cc
+++ b/chrome/browser/extensions/api/vpn_provider/vpn_provider_apitest.cc
@@ -18,12 +18,20 @@
 #include "base/memory/raw_ptr.h"
 #include "base/test/test_future.h"
 #include "base/types/cxx23_to_underlying.h"
+#include "chrome/browser/ash/crosapi/crosapi_ash.h"
+#include "chrome/browser/ash/crosapi/crosapi_manager.h"
+#include "chrome/browser/ash/crosapi/vpn_service_ash.h"
+#include "chrome/browser/ash/profiles/profile_helper.h"
 #include "chrome/browser/chromeos/extensions/vpn_provider/vpn_provider_api.h"
 #include "chrome/browser/chromeos/extensions/vpn_provider/vpn_service_factory.h"
 #include "chrome/browser/extensions/extension_apitest.h"
 #include "chrome/browser/extensions/extension_service.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/common/extensions/api/vpn_provider.h"
+#include "chromeos/ash/components/dbus/shill/fake_shill_third_party_vpn_driver_client.h"
+#include "chromeos/ash/components/dbus/shill/shill_manager_client.h"
+#include "chromeos/ash/components/dbus/shill/shill_profile_client.h"
+#include "chromeos/ash/components/network/network_configuration_handler.h"
 #include "chromeos/ash/components/network/shill_property_handler.h"
 #include "chromeos/crosapi/mojom/vpn_service.mojom.h"
 #include "content/public/browser/browser_context.h"
@@ -35,23 +43,7 @@
 #include "extensions/common/extension.h"
 #include "extensions/test/result_catcher.h"
 #include "testing/gmock/include/gmock/gmock.h"
-
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-#include "chrome/browser/ash/crosapi/crosapi_ash.h"
-#include "chrome/browser/ash/crosapi/crosapi_manager.h"
-#include "chrome/browser/ash/crosapi/vpn_service_ash.h"
-#include "chrome/browser/ash/profiles/profile_helper.h"
-#include "chromeos/ash/components/dbus/shill/fake_shill_third_party_vpn_driver_client.h"
-#include "chromeos/ash/components/dbus/shill/shill_manager_client.h"
-#include "chromeos/ash/components/dbus/shill/shill_profile_client.h"
-#include "chromeos/ash/components/network/network_configuration_handler.h"
 #include "third_party/cros_system_api/dbus/service_constants.h"
-#endif
-
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-#include "chromeos/crosapi/mojom/test_controller.mojom.h"
-#include "chromeos/lacros/lacros_service.h"
-#endif
 
 namespace chromeos {
 
@@ -62,7 +54,6 @@
 const char kTestConfig[] = "testconfig";
 const char kPacket[] = "feebdaed";
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
 const char kNetworkProfilePath[] = "/network/test";
 const char* kParameterValues[] = {"10.10.10.10",
                                   "24",
@@ -88,11 +79,9 @@
 void DoNothingSuccessCallback(const std::string& service_path,
                               const std::string& guid) {}
 
-#endif
 
 }  // namespace
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
 // Records the number of calls and their parameters. Always replies successfully
 // to calls.
 class TestShillThirdPartyVpnDriverClient
@@ -138,7 +127,6 @@
   int send_packet_counter_ = 0;
   std::vector<char> ip_packet_;
 };
-#endif
 
 class VpnProviderApiTestBase : public extensions::ExtensionApiTest {
  public:
@@ -182,53 +170,7 @@
   std::optional<std::string> extension_id_;
 };
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-class VpnProviderApiTestLacros : public VpnProviderApiTestBase {
- public:
-  // VpnProviderApiTestBase:
-  void TearDownOnMainThread() override {
-    UnloadExtension(extension_id());
-    VpnProviderApiTestBase::TearDownOnMainThread();
-  }
-  crosapi::mojom::VpnService* service_remote() const override {
-    return chromeos::LacrosService::Get()
-        ->GetRemote<crosapi::mojom::VpnService>()
-        .get();
-  }
-  void OnPlatformMessage(const std::string& configuration_name,
-                         api_vpn::PlatformMessage message) override {
-    controller_->OnPlatformMessage(extension_id(), configuration_name,
-                                   base::to_underlying(message));
-  }
-  void OnPacketReceived(const std::string& configuration_name,
-                        const std::vector<char>& data) override {
-    controller_->OnPacketReceived(
-        extension_id(), configuration_name,
-        std::vector<uint8_t>(data.begin(), data.end()));
-  }
-
-  bool InitTestShillController() {
-    auto* service = chromeos::LacrosService::Get();
-    if (!service->IsAvailable<crosapi::mojom::TestController>() ||
-        service->GetInterfaceVersion<crosapi::mojom::TestController>() <
-            static_cast<int>(crosapi::mojom::TestController::MethodMinVersions::
-                                 kBindTestShillControllerMinVersion)) {
-      LOG(ERROR) << "Unsupported ash version.";
-      return false;
-    }
-    base::test::TestFuture<void> future;
-    service->GetRemote<crosapi::mojom::TestController>()
-        ->BindTestShillController(controller_.BindNewPipeAndPassReceiver(),
-                                  future.GetCallback());
-    EXPECT_TRUE(future.Wait());
-    return true;
-  }
-
- protected:
-  mojo::Remote<crosapi::mojom::TestShillController> controller_;
-};
-#else
-class VpnProviderApiTestAsh : public VpnProviderApiTestBase {
+class VpnProviderApiTest : public VpnProviderApiTestBase {
  public:
   // VpnProviderApiTestBase:
   void SetUpInProcessBrowserTestFixture() override {
@@ -361,19 +303,7 @@
   raw_ptr<TestShillThirdPartyVpnDriverClient, DanglingUntriaged> test_client_ =
       nullptr;  // Unowned
 };
-#endif
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-using VpnProviderApiTest = VpnProviderApiTestLacros;
-#else
-using VpnProviderApiTest = VpnProviderApiTestAsh;
-#endif
-
-////////////////////////////
-// Ash-specific tests.
-////////////////////////////
-
-#if BUILDFLAG(IS_CHROMEOS_ASH)
 IN_PROC_BROWSER_TEST_F(VpnProviderApiTest, CreateConfigWithoutNetworkProfile) {
   ClearNetworkProfiles();
   EXPECT_TRUE(RunTest("createConfigWithoutNetworkProfile"));
@@ -501,45 +431,29 @@
   EXPECT_FALSE(DoesConfigExist(kTestConfig));
   EXPECT_FALSE(HasService(service_path));
 }
-#endif
 
 ////////////////////////////
 // Ash/lacros shared tests.
 ////////////////////////////
 
 IN_PROC_BROWSER_TEST_F(VpnProviderApiTest, ComboSuite) {
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  if (!InitTestShillController()) {
-    GTEST_SKIP() << "Unsupported ash version.";
-  }
-#endif
-
   EXPECT_TRUE(RunTest("comboSuite"));
 }
 
 IN_PROC_BROWSER_TEST_F(VpnProviderApiTest, VpnSuccess) {
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  if (!InitTestShillController()) {
-    GTEST_SKIP() << "Unsupported ash version.";
-  }
-#endif
-
   EXPECT_TRUE(RunTest("createConfigConnectAndDisconnect"));
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
   EXPECT_TRUE(DoesConfigExist(kTestConfig));
   EXPECT_TRUE(HasService(GetSingleServicePath()));
   EXPECT_FALSE(IsConfigConnected());
   EXPECT_EQ(0, test_client_->set_parameters_counter_);
   EXPECT_EQ(0, test_client_->update_connection_state_counter_);
   EXPECT_EQ(0, test_client_->send_packet_counter_);
-#endif
 
   extensions::ResultCatcher catcher;
   OnPlatformMessage(kTestConfig, api_vpn::PlatformMessage::kConnected);
   ASSERT_TRUE(catcher.GetNextResult());
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
   EXPECT_TRUE(IsConfigConnected());
   EXPECT_EQ(1, test_client_->set_parameters_counter_);
   EXPECT_EQ(1, test_client_->update_connection_state_counter_);
@@ -555,7 +469,6 @@
   std::vector<char> received_packet(std::begin(kPacket),
                                     std::prev(std::end(kPacket)));
   EXPECT_EQ(received_packet, test_client_->ip_packet_);
-#endif
 
   std::vector<char> packet(++std::rbegin(kPacket), std::rend(kPacket));
   OnPacketReceived(kTestConfig, packet);
@@ -564,9 +477,7 @@
   OnPlatformMessage(kTestConfig, api_vpn::PlatformMessage::kDisconnected);
   ASSERT_TRUE(catcher.GetNextResult());
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
   EXPECT_FALSE(IsConfigConnected());
-#endif
 }
 
 class FakePepperVpnProviderResourceHostProxy
@@ -589,12 +500,6 @@
 };
 
 IN_PROC_BROWSER_TEST_F(VpnProviderApiTest, PepperProxy) {
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  if (!InitTestShillController()) {
-    GTEST_SKIP() << "Unsupported ash version.";
-  }
-#endif
-
   base::test::TestFuture<bool> unbind;
   base::test::TestFuture<std::vector<char>> data;
   // This class will be used as a receiver for mojo::SelfOwnedReceiver.
@@ -648,12 +553,6 @@
 // is initialized by the moment ash decides to send a platform message to the
 // browser.
 IN_PROC_BROWSER_TEST_F(VpnProviderApiTest, PlatformMessage) {
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  if (!InitTestShillController()) {
-    GTEST_SKIP() << "Unsupported ash version.";
-  }
-#endif
-
   auto test_observer = std::make_unique<TestEventObserverForExtension>();
   mojo::Remote<crosapi::mojom::VpnServiceForExtension> remote;
   mojo::Receiver<crosapi::mojom::EventObserverForExtension> receiver{
diff --git a/chrome/browser/extensions/api/web_request/web_request_apitest.cc b/chrome/browser/extensions/api/web_request/web_request_apitest.cc
index ebe643c..d42f9b2 100644
--- a/chrome/browser/extensions/api/web_request/web_request_apitest.cc
+++ b/chrome/browser/extensions/api/web_request/web_request_apitest.cc
@@ -145,9 +145,9 @@
 #include "ui/webui/untrusted_web_ui_browsertest_util.h"
 #include "url/origin.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/ash/profiles/profile_helper.h"
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 using content::WebContents;
 
@@ -1462,9 +1462,9 @@
 
 // Check that reloading an extension that runs in incognito split mode and
 // has two active background pages with registered events does not crash the
-// browser. Regression test for http://crbug.com/224094
-// Flaky on linux-lacros and Linux. See http://crbug.com/1423252
-#if BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX)
+// browser. Regression test for http://crbug.com/40309927
+// TODO(crbug.com/40897394): Flaky on Linux.
+#if BUILDFLAG(IS_LINUX)
 #define MAYBE_IncognitoSplitModeReload DISABLED_IncognitoSplitModeReload
 #else
 #define MAYBE_IncognitoSplitModeReload IncognitoSplitModeReload
@@ -2444,9 +2444,9 @@
 
   // Create a profile that will be destroyed later.
   base::ScopedAllowBlockingForTesting allow_blocking;
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   ash::ProfileHelper::SetAlwaysReturnPrimaryUserForTesting(true);
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
   ProfileManager* profile_manager = g_browser_process->profile_manager();
   std::unique_ptr<Profile> temp_profile = Profile::CreateProfile(
       profile_manager->user_data_dir().AppendASCII("profile"), nullptr,
diff --git a/chrome/browser/extensions/api/webstore_private/webstore_private_api.cc b/chrome/browser/extensions/api/webstore_private/webstore_private_api.cc
index e95166a..5f92e314 100644
--- a/chrome/browser/extensions/api/webstore_private/webstore_private_api.cc
+++ b/chrome/browser/extensions/api/webstore_private/webstore_private_api.cc
@@ -205,12 +205,6 @@
     "Extension installation is blocked by policy";
 const char kIncognitoError[] =
     "Apps cannot be installed in guest/incognito mode";
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-const char kSecondaryProfileError[] =
-    "Apps may only be installed using the main profile";
-const char kLegacyPackagedAppError[] =
-    "Legacy packaged apps are no longer supported";
-#endif
 
 const char kParentBlockedExtensionInstallError[] =
     "Parent has blocked extension/app installation";
@@ -384,7 +378,7 @@
 
 // Returns whether the app launcher has been enabled.
 bool IsAppLauncherEnabled() {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   return true;
 #else
   return false;
@@ -1004,23 +998,6 @@
         Error(kNoPreviousBeginInstallWithManifestError, params->expected_id));
   }
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  // TODO(crbug.com/40239506): Centralize logic for disallowing
-  // installation with other installation paths.
-  if (!profile->IsMainProfile()) {
-    bool allowed = approval_->dummy_extension &&
-                   (approval_->dummy_extension->is_extension() ||
-                    approval_->dummy_extension->is_theme());
-    if (!allowed) {
-      return RespondNow(Error(kSecondaryProfileError));
-    }
-  }
-  if (approval_->dummy_extension &&
-      approval_->dummy_extension->is_legacy_packaged_app()) {
-    return RespondNow(Error(kLegacyPackagedAppError));
-  }
-#endif
-
   content::WebContents* web_contents = GetSenderWebContents();
   if (!web_contents) {
     return RespondNow(
diff --git a/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc b/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc
index 330fd3b..187d439 100644
--- a/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc
+++ b/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc
@@ -377,7 +377,7 @@
     // test by about 19 seconds.
     // TODO (crbug.com/995575): figure out why this switch speeds up the test,
     // and fix the test setup so this is not required.
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
     command_line->AppendSwitch(::switches::kShortMergeSessionTimeoutForTest);
 #endif
   }
diff --git a/chrome/browser/extensions/autoplay_browsertest.cc b/chrome/browser/extensions/autoplay_browsertest.cc
index 4fec29e..09c166f8 100644
--- a/chrome/browser/extensions/autoplay_browsertest.cc
+++ b/chrome/browser/extensions/autoplay_browsertest.cc
@@ -32,13 +32,11 @@
 
 // TODO(crbug.com/40742402): AutoplayAllowedInIframe sporadically (~10%?) times
 // out on Linux.
-// TODO(crbug.com/40118868): Revisit once build flag switch of lacros-chrome is
-// complete.
-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
+#if BUILDFLAG(IS_LINUX)
 #define MAYBE_AutoplayAllowedInIframe DISABLED_AutoplayAllowedInIframe
 #else
 #define MAYBE_AutoplayAllowedInIframe AutoplayAllowedInIframe
-#endif  // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
+#endif  // BUILDFLAG(IS_LINUX)
 IN_PROC_BROWSER_TEST_F(AutoplayExtensionBrowserTest,
                        MAYBE_AutoplayAllowedInIframe) {
   ASSERT_TRUE(StartEmbeddedTestServer());
diff --git a/chrome/browser/extensions/browsertest_util.cc b/chrome/browser/extensions/browsertest_util.cc
index 58842eb..d7358f3 100644
--- a/chrome/browser/extensions/browsertest_util.cc
+++ b/chrome/browser/extensions/browsertest_util.cc
@@ -33,7 +33,7 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #include "url/gurl.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "ash/constants/ash_paths.h"
 #include "chrome/browser/extensions/updater/local_extension_cache.h"
 #endif
@@ -41,7 +41,7 @@
 namespace extensions::browsertest_util {
 
 void CreateAndInitializeLocalCache() {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   base::FilePath extension_cache_dir;
   CHECK(base::PathService::Get(ash::DIR_DEVICE_EXTENSION_LOCAL_CACHE,
                                &extension_cache_dir));
diff --git a/chrome/browser/extensions/chrome_app_icon.cc b/chrome/browser/extensions/chrome_app_icon.cc
index bf74ffae..c629ee5 100644
--- a/chrome/browser/extensions/chrome_app_icon.cc
+++ b/chrome/browser/extensions/chrome_app_icon.cc
@@ -17,7 +17,7 @@
 #include "ui/gfx/image/canvas_image_source.h"
 #include "ui/gfx/image/image_skia_operations.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/ash/extensions/gfx_utils.h"
 #endif
 
@@ -84,7 +84,7 @@
         gfx::ImageSkiaOperations::CreateHSLShiftedImage(*image_skia, shift);
   }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // Badge should be added after graying out the icon to have a crisp look.
   if (badge_type != Badge::kNone) {
     util::ApplyBadge(image_skia, badge_type);
@@ -150,7 +150,7 @@
 
   Badge badge_type = Badge::kNone;
   bool app_launchable = util::IsAppLaunchable(app_id_, browser_context_);
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   has_chrome_badge_ = util::ShouldApplyChromeBadge(browser_context_, app_id_);
   if (!app_launchable) {
     badge_type = Badge::kBlocked;
diff --git a/chrome/browser/extensions/chrome_app_icon.h b/chrome/browser/extensions/chrome_app_icon.h
index d511a732..e45ba62 100644
--- a/chrome/browser/extensions/chrome_app_icon.h
+++ b/chrome/browser/extensions/chrome_app_icon.h
@@ -79,7 +79,7 @@
 
   const gfx::ImageSkia& image_skia() const { return image_skia_; }
   const std::string& app_id() const { return app_id_; }
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // Returns whether the icon is badged because it's an extension app that has
   // its Android analog installed.
   bool has_chrome_badge() const { return has_chrome_badge_; }
@@ -105,7 +105,7 @@
   // it is updated each time when |icon_| is updated.
   gfx::ImageSkia image_skia_;
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // Whether the icon got badged because it's an extension app that has its
   // Android analog installed.
   bool has_chrome_badge_ = false;
diff --git a/chrome/browser/extensions/chrome_app_icon_service.cc b/chrome/browser/extensions/chrome_app_icon_service.cc
index 1d52f777..25792eb 100644
--- a/chrome/browser/extensions/chrome_app_icon_service.cc
+++ b/chrome/browser/extensions/chrome_app_icon_service.cc
@@ -23,7 +23,7 @@
 
 ChromeAppIconService::ChromeAppIconService(content::BrowserContext* context)
     : context_(context) {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   app_updater_ = std::make_unique<ShelfExtensionAppUpdater>(
       this, context, false /* extensions_only */);
 #endif
@@ -34,7 +34,7 @@
 ChromeAppIconService::~ChromeAppIconService() = default;
 
 void ChromeAppIconService::Shutdown() {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   app_updater_.reset();
 #endif
 }
@@ -74,7 +74,7 @@
   OnAppUpdated(extension->id());
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 void ChromeAppIconService::OnAppUpdated(
     content::BrowserContext* browser_context,
     const std::string& app_id,
diff --git a/chrome/browser/extensions/chrome_app_icon_service.h b/chrome/browser/extensions/chrome_app_icon_service.h
index d95379d9..2579f7ad 100644
--- a/chrome/browser/extensions/chrome_app_icon_service.h
+++ b/chrome/browser/extensions/chrome_app_icon_service.h
@@ -18,7 +18,7 @@
 #include "extensions/browser/extension_registry.h"
 #include "extensions/browser/extension_registry_observer.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/ui/ash/shelf/shelf_extension_app_updater.h"
 #endif
 
@@ -42,7 +42,7 @@
 // is bound to content::BrowserContext.
 // Usage: ChromeAppIconService::Get(context)->CreateIcon().
 class ChromeAppIconService : public KeyedService,
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
                              public ShelfAppUpdater::Delegate,
 #endif
                              public ExtensionRegistryObserver {
@@ -100,7 +100,7 @@
                            const Extension* extension,
                            UnloadedExtensionReason reason) override;
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // ShelfAppUpdater::Delegate:
   void OnAppUpdated(content::BrowserContext* browser_context,
                     const std::string& app_id,
@@ -110,7 +110,7 @@
   // Unowned pointer.
   raw_ptr<content::BrowserContext> context_;
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // On Chrome OS this handles Chrome app life-cycle events that may change how
   // extension based app icon looks like.
   std::unique_ptr<ShelfExtensionAppUpdater> app_updater_;
diff --git a/chrome/browser/extensions/chrome_app_icon_unittest.cc b/chrome/browser/extensions/chrome_app_icon_unittest.cc
index c75baee..fc1ac35a 100644
--- a/chrome/browser/extensions/chrome_app_icon_unittest.cc
+++ b/chrome/browser/extensions/chrome_app_icon_unittest.cc
@@ -25,14 +25,14 @@
 #include "ui/gfx/image/image_skia_rep.h"
 #include "ui/gfx/image/image_unittest_util.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "ash/components/arc/test/fake_app_instance.h"
 #include "ash/public/cpp/app_list/app_list_config.h"
 #include "chrome/browser/ash/app_list/arc/arc_app_test.h"
 #include "chrome/browser/ash/arc/arc_util.h"
 #include "chrome/browser/ash/extensions/gfx_utils.h"
 #include "ui/chromeos/resources/grit/ui_chromeos_resources.h"
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 namespace extensions {
 
@@ -168,7 +168,7 @@
   return gfx::test::AreImagesEqual(gfx::Image(image1), gfx::Image(image2));
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 // Returns true if |res| image is the |src| image with badge identified by
 // |badge_type| resource. If |grayscale| is true applies HSL shift for the
 // comparison.
@@ -242,7 +242,7 @@
   const size_t update_count_after_disable = reference_icon.icon_update_count();
   EXPECT_NE(2U, update_count_after_disable);
   EXPECT_FALSE(IsBlankImage(reference_icon.image_skia()));
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   EXPECT_TRUE(IsBadgeApplied(image_before_disable, reference_icon.image_skia(),
                              ChromeAppIcon::Badge::kBlocked,
                              true /* grayscale */));
@@ -273,7 +273,7 @@
   test_icon2.Reset();
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 
 TEST_F(ChromeAppIconTest, ChromeBadging) {
   ArcAppTest arc_test;
@@ -314,6 +314,6 @@
   EXPECT_TRUE(AreEqual(reference_icon.image_skia(), image_before_badging));
 }
 
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 }  // namespace extensions
diff --git a/chrome/browser/extensions/chrome_app_sorting.cc b/chrome/browser/extensions/chrome_app_sorting.cc
index d51e023..d630ce2 100644
--- a/chrome/browser/extensions/chrome_app_sorting.cc
+++ b/chrome/browser/extensions/chrome_app_sorting.cc
@@ -36,7 +36,7 @@
 #include "extensions/common/extension_id.h"
 #include "extensions/common/manifest_handlers/app_display_info.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/ash/extensions/default_app_order.h"
 #endif
 
@@ -690,7 +690,7 @@
   default_ordinals_created_ = true;
 
   // The following defines the default order of apps.
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   std::vector<std::string> app_ids;
   chromeos::default_app_order::Get(&app_ids);
 #else
diff --git a/chrome/browser/extensions/chrome_component_extension_resource_manager.cc b/chrome/browser/extensions/chrome_component_extension_resource_manager.cc
index 83fea62d..389cc9c0 100644
--- a/chrome/browser/extensions/chrome_component_extension_resource_manager.cc
+++ b/chrome/browser/extensions/chrome_component_extension_resource_manager.cc
@@ -30,7 +30,7 @@
 #include "ppapi/buildflags/buildflags.h"
 #include "ui/base/resource/resource_bundle.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "ash/keyboard/ui/resources/keyboard_resource_util.h"
 #include "ash/webui/file_manager/untrusted_resources/grit/file_manager_untrusted_resources_map.h"
 #include "base/command_line.h"
@@ -43,7 +43,7 @@
 #include "chromeos/grit/chromeos_media_app_bundle_resources.h"
 #endif  // BUILDFLAG(ENABLE_INK)
 
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 #if BUILDFLAG(ENABLE_PDF)
 #include <utility>
@@ -85,7 +85,7 @@
 
 ChromeComponentExtensionResourceManager::Data::Data() {
   static const webui::ResourcePath kExtraComponentExtensionResources[] = {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
     {"web_store/webstore_icon_128.png", IDR_WEBSTORE_APP_ICON_128},
     {"web_store/webstore_icon_16.png", IDR_WEBSTORE_APP_ICON_16},
 #else
@@ -93,7 +93,7 @@
     {"web_store/webstore_icon_16.png", IDR_WEBSTORE_ICON_16},
 #endif
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
     // These icons may be replaced with "IDR_DEBUG_CHROME_APP_ICON_{32,192}"
     // in "chrome/browser/apps/app_service/app_icon/app_icon_reader.cc"
     // or "chrome/browser/ui/views/frame/browser_view.cc"
@@ -107,7 +107,7 @@
     {"pdf/ink/ink_lib_binary.js", IDR_MEDIA_APP_EXPORT_CANVAS_BIN_JS},
     {"pdf/ink/ink_loader.js", IDR_MEDIA_APP_INK_JS},
 #endif  // BUILDFLAG(ENABLE_INK)
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
   };
 
   AddComponentResourceEntries(kComponentExtensionResources,
@@ -115,7 +115,7 @@
   AddComponentResourceEntries(kExtraComponentExtensionResources,
                               std::size(kExtraComponentExtensionResources));
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // Add Files app JS modules resources.
   AddComponentResourceEntries(kFileManagerResources, kFileManagerResourcesSize);
   AddComponentResourceEntries(kFileManagerGenResources,
@@ -218,7 +218,7 @@
 
   LazyInitData();
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   if (extension_id == extension_misc::kFilesManagerAppId) {
     base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
     // Disable $i18n{} template JS string replacement during JS code coverage.
diff --git a/chrome/browser/extensions/chrome_component_extension_resource_manager_unittest.cc b/chrome/browser/extensions/chrome_component_extension_resource_manager_unittest.cc
index 40a046c9..a609399 100644
--- a/chrome/browser/extensions/chrome_component_extension_resource_manager_unittest.cc
+++ b/chrome/browser/extensions/chrome_component_extension_resource_manager_unittest.cc
@@ -25,7 +25,7 @@
 #include "extensions/common/manifest_handlers/icons_handler.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "ui/file_manager/grit/file_manager_resources.h"
 #endif
 
@@ -71,7 +71,7 @@
       extension.get(), extension_misc::EXTENSION_ICON_BITTY,
       ExtensionIconSet::Match::kExactly);
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // The resource is a component resource.
   int resource_id = 0;
   ASSERT_TRUE(resource_manager->IsComponentExtensionResource(
diff --git a/chrome/browser/extensions/chrome_content_verifier_delegate.cc b/chrome/browser/extensions/chrome_content_verifier_delegate.cc
index 749f895..a352da30 100644
--- a/chrome/browser/extensions/chrome_content_verifier_delegate.cc
+++ b/chrome/browser/extensions/chrome_content_verifier_delegate.cc
@@ -46,7 +46,7 @@
 #include "extensions/common/switches.h"
 #include "net/base/backoff_entry.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/extensions/extension_assets_manager_chromeos.h"
 #endif
 
@@ -336,7 +336,7 @@
                        management_policy->ShouldRepairIfCorrupted(&extension);
   bool is_from_webstore = IsFromWebstore(extension);
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   if (ExtensionAssetsManagerChromeOS::IsSharedInstall(&extension)) {
     return VerifyInfo(VerifyInfo::Mode::ENFORCE_STRICT, is_from_webstore,
                       should_repair);
diff --git a/chrome/browser/extensions/chrome_extension_function_unittest.cc b/chrome/browser/extensions/chrome_extension_function_unittest.cc
index 913c0709..da1b201 100644
--- a/chrome/browser/extensions/chrome_extension_function_unittest.cc
+++ b/chrome/browser/extensions/chrome_extension_function_unittest.cc
@@ -63,7 +63,7 @@
 
 using ChromeExtensionFunctionUnitTest = ExtensionServiceTestBase;
 
-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_CHROMEOS)
 #define MAYBE_SimpleFunctionTest DISABLED_SimpleFunctionTest
 #else
 #define MAYBE_SimpleFunctionTest SimpleFunctionTest
diff --git a/chrome/browser/extensions/chrome_extensions_browser_interface_binders.cc b/chrome/browser/extensions/chrome_extensions_browser_interface_binders.cc
index fc67f45b..7fadda668 100644
--- a/chrome/browser/extensions/chrome_extensions_browser_interface_binders.cc
+++ b/chrome/browser/extensions/chrome_extensions_browser_interface_binders.cc
@@ -16,16 +16,8 @@
 #include "extensions/common/permissions/permissions_data.h"
 
 #if BUILDFLAG(IS_CHROMEOS)
-#include "build/config/chromebox_for_meetings/buildflags.h"
-#include "chromeos/components/remote_apps/mojom/remote_apps.mojom.h"
-#include "chromeos/services/chromebox_for_meetings/public/cpp/appid_util.h"
-#include "chromeos/services/chromebox_for_meetings/public/cpp/service_connection.h"
-#include "chromeos/services/chromebox_for_meetings/public/mojom/cfm_service_manager.mojom.h"
-#include "chromeos/services/chromebox_for_meetings/public/mojom/xu_camera.mojom.h"
-#endif  // BUILDFLAG(IS_CHROMEOS)
-
-#if BUILDFLAG(IS_CHROMEOS_ASH)
 #include "ash/webui/camera_app_ui/camera_app_ui.h"
+#include "build/config/chromebox_for_meetings/buildflags.h"
 #include "chrome/browser/ash/remote_apps/remote_apps_manager.h"
 #include "chrome/browser/ash/remote_apps/remote_apps_manager_factory.h"
 #include "chrome/browser/profiles/profile.h"
@@ -37,6 +29,10 @@
 #include "chromeos/ash/components/language_packs/language_packs_impl.h"
 #include "chromeos/ash/components/language_packs/public/mojom/language_packs.mojom.h"
 #include "chromeos/components/remote_apps/mojom/remote_apps.mojom.h"
+#include "chromeos/services/chromebox_for_meetings/public/cpp/appid_util.h"
+#include "chromeos/services/chromebox_for_meetings/public/cpp/service_connection.h"
+#include "chromeos/services/chromebox_for_meetings/public/mojom/cfm_service_manager.mojom.h"
+#include "chromeos/services/chromebox_for_meetings/public/mojom/xu_camera.mojom.h"
 #include "chromeos/services/media_perception/public/mojom/media_perception.mojom.h"
 #include "chromeos/services/tts/public/mojom/tts_service.mojom.h"
 #include "extensions/browser/api/extensions_api_client.h"
@@ -56,21 +52,12 @@
 #include "chrome/browser/ash/chromebox_for_meetings/xu_camera/xu_camera_service.h"
 #include "chromeos/ash/components/chromebox_for_meetings/features.h"
 #endif
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
-
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-#include "chrome/browser/lacros/remote_apps/remote_apps_proxy_lacros.h"
-#include "chrome/browser/lacros/remote_apps/remote_apps_proxy_lacros_factory.h"
-#include "chrome/browser/profiles/profile.h"
-#include "extensions/common/features/behavior_feature.h"
-#include "extensions/common/features/feature.h"
-#include "extensions/common/features/feature_provider.h"
-#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 namespace extensions {
 
 namespace {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 
 #if BUILDFLAG(GOOGLE_CHROME_BRANDING)
 // Resolves InputEngineManager receiver in InputMethodManager.
@@ -117,14 +104,10 @@
               ->GetURLLoaderFactory());
 }
 
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
-
-#if BUILDFLAG(IS_CHROMEOS)
 void BindRemoteAppsFactory(
     content::RenderFrameHost* render_frame_host,
     mojo::PendingReceiver<chromeos::remote_apps::mojom::RemoteAppsFactory>
         pending_receiver) {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
   // |remote_apps_manager| will be null for sessions that are not regular user
   // sessions or managed guest sessions. This is checked in
   // |RemoteAppsImpl::IsMojoPrivateApiAllowed()|.
@@ -133,13 +116,6 @@
           Profile::FromBrowserContext(render_frame_host->GetBrowserContext()));
   DCHECK(remote_apps_manager);
   remote_apps_manager->BindFactoryInterface(std::move(pending_receiver));
-#else   // implies BUILDFLAG(IS_CHROMEOS_LACROS)
-  chromeos::RemoteAppsProxyLacros* remote_apps_proxy_lacros =
-      chromeos::RemoteAppsProxyLacrosFactory::GetForBrowserContext(
-          Profile::FromBrowserContext(render_frame_host->GetBrowserContext()));
-  DCHECK(remote_apps_proxy_lacros);
-  remote_apps_proxy_lacros->BindFactoryInterface(std::move(pending_receiver));
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 }
 
 void BindCfmServiceContext(
@@ -160,7 +136,7 @@
     const Extension* extension) {
   DCHECK(extension);
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 
 #if BUILDFLAG(GOOGLE_CHROME_BRANDING)
   // Register InputEngineManager for official Google ChromeOS 1P Input only.
@@ -236,26 +212,13 @@
     binder_map->Add<ash::enhanced_network_tts::mojom::EnhancedNetworkTts>(
         base::BindRepeating(&BindEnhancedNetworkTts));
   }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
   if (ash::RemoteAppsImpl::IsMojoPrivateApiAllowed(render_frame_host,
                                                    extension)) {
     binder_map->Add<chromeos::remote_apps::mojom::RemoteAppsFactory>(
         base::BindRepeating(&BindRemoteAppsFactory));
   }
-#elif BUILDFLAG(IS_CHROMEOS_LACROS)
-  const extensions::Feature* feature =
-      extensions::FeatureProvider::GetBehaviorFeature(
-          extensions::behavior_feature::kImprivataInSessionExtension);
-  if (extension && feature &&
-      feature->IsAvailableToExtension(extension).is_available()) {
-    binder_map->Add<chromeos::remote_apps::mojom::RemoteAppsFactory>(
-        base::BindRepeating(&BindRemoteAppsFactory));
-  }
-#endif
 
-#if BUILDFLAG(IS_CHROMEOS)
   // Only allow specific extensions to bind CfmServiceContext
   if (chromeos::cfm::IsChromeboxForMeetingsHashedAppId(
           extension->hashed_id().value())) {
diff --git a/chrome/browser/extensions/chrome_process_manager_delegate.cc b/chrome/browser/extensions/chrome_process_manager_delegate.cc
index 8c11b58..5f3f79c4 100644
--- a/chrome/browser/extensions/chrome_process_manager_delegate.cc
+++ b/chrome/browser/extensions/chrome_process_manager_delegate.cc
@@ -23,7 +23,7 @@
 #include "extensions/common/extension.h"
 #include "extensions/common/permissions/permissions_data.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "ash/constants/ash_switches.h"
 #include "chrome/browser/ash/profiles/profile_helper.h"
 #include "chrome/browser/extensions/component_extensions_allowlist/allowlist.h"
@@ -67,7 +67,7 @@
 bool ChromeProcessManagerDelegate::IsExtensionBackgroundPageAllowed(
     content::BrowserContext* context,
     const Extension& extension) const {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   Profile* profile = Profile::FromBrowserContext(context);
 
   const bool is_signin_profile = ash::ProfileHelper::IsSigninProfile(profile) &&
diff --git a/chrome/browser/extensions/commands/command_service_browsertest.cc b/chrome/browser/extensions/commands/command_service_browsertest.cc
index 4d06e91..70072509 100644
--- a/chrome/browser/extensions/commands/command_service_browsertest.cc
+++ b/chrome/browser/extensions/commands/command_service_browsertest.cc
@@ -50,9 +50,9 @@
   return extensions::manifest_values::kKeybindingPlatformMac;
 #elif BUILDFLAG(IS_MAC)
   return extensions::manifest_values::kKeybindingPlatformChromeOs;
-#elif BUILDFLAG(IS_CHROMEOS_ASH)
+#elif BUILDFLAG(IS_CHROMEOS)
   return extensions::manifest_values::kKeybindingPlatformLinux;
-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
+#elif BUILDFLAG(IS_LINUX)
   return extensions::manifest_values::kKeybindingPlatformWin;
 #else
   return "";
diff --git a/chrome/browser/extensions/component_extensions_allowlist/allowlist.cc b/chrome/browser/extensions/component_extensions_allowlist/allowlist.cc
index cf1926f0..32119b8 100644
--- a/chrome/browser/extensions/component_extensions_allowlist/allowlist.cc
+++ b/chrome/browser/extensions/component_extensions_allowlist/allowlist.cc
@@ -19,12 +19,9 @@
 #include "printing/buildflags/buildflags.h"
 
 #if BUILDFLAG(IS_CHROMEOS)
-#include "chromeos/constants/chromeos_features.h"
-#endif
-
-#if BUILDFLAG(IS_CHROMEOS_ASH)
 #include "ash/keyboard/ui/grit/keyboard_resources.h"
 #include "chrome/browser/ash/input_method/component_extension_ime_manager_delegate_impl.h"
+#include "chromeos/constants/chromeos_features.h"
 #include "ui/file_manager/grit/file_manager_resources.h"
 #endif
 
@@ -36,8 +33,6 @@
       extension_misc::kPdfExtensionId,
 #if BUILDFLAG(IS_CHROMEOS)
       extension_misc::kAssessmentAssistantExtensionId,
-#endif
-#if BUILDFLAG(IS_CHROMEOS_ASH)
       extension_misc::kAccessibilityCommonExtensionId,
       extension_misc::kChromeVoxExtensionId,
       extension_misc::kEnhancedNetworkTtsExtensionId,
@@ -46,20 +41,13 @@
       extension_misc::kGuestModeTestExtensionId,
       extension_misc::kSelectToSpeakExtensionId,
       extension_misc::kSwitchAccessExtensionId,
-#elif BUILDFLAG(IS_CHROMEOS_LACROS)
-      extension_misc::kEmbeddedA11yHelperExtensionId,
-      extension_misc::kChromeVoxHelperExtensionId,
-#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
-#if BUILDFLAG(IS_CHROMEOS)
       extension_misc::kContactCenterInsightsExtensionId,
       extension_misc::kDeskApiExtensionId,
 #if BUILDFLAG(GOOGLE_CHROME_BRANDING)
       extension_misc::kQuickOfficeComponentExtensionId,
 #endif  // BUILDFLAG(GOOGLE_CHROME_BRANDING)
-#endif
-#if !BUILDFLAG(IS_CHROMEOS_LACROS)
+#endif  // BUILDFLAG(IS_CHROMEOS)
       extension_misc::kReadingModeGDocsHelperExtensionId,
-#endif  // !BUILDFLAG(IS_CHROMEOS_LACROS)
   });
 
   if (kAllowed.contains(extension_id)) {
@@ -71,14 +59,12 @@
       extension_id == extension_misc::kODFSExtensionId) {
     return true;
   }
-#endif
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
   if (ash::input_method::ComponentExtensionIMEManagerDelegateImpl::
           IsIMEExtensionID(extension_id)) {
     return true;
   }
-#endif
+#endif  // BUILDFLAG(IS_CHROMEOS)
   LOG(ERROR) << "Component extension with id " << extension_id << " not in "
              << "allowlist and is not being loaded as a result.";
   NOTREACHED_IN_MIGRATION();
@@ -96,7 +82,7 @@
     case IDR_READING_MODE_GDOCS_HELPER_MANIFEST:
     case IDR_WEBSTORE_MANIFEST:
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
     // Separate ChromeOS list, as it is quite large.
     case IDR_ARC_SUPPORT_MANIFEST:
     case IDR_CHROME_APP_MANIFEST:
@@ -105,9 +91,6 @@
 #if BUILDFLAG(GOOGLE_CHROME_BRANDING)
     case IDR_HELP_MANIFEST:
 #endif  // BUILDFLAG(GOOGLE_CHROME_BRANDING)
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
-
-#if BUILDFLAG(IS_CHROMEOS)
     case IDR_CONTACT_CENTER_INSIGHTS_MANIFEST:
     case IDR_DESK_API_MANIFEST:
     case IDR_ECHO_MANIFEST:
@@ -122,7 +105,7 @@
   return false;
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 bool IsComponentExtensionAllowlistedForSignInProfile(
     const std::string& extension_id) {
   constexpr auto kAllowed = base::MakeFixedFlatSet<std::string_view>({
diff --git a/chrome/browser/extensions/component_extensions_allowlist/allowlist.h b/chrome/browser/extensions/component_extensions_allowlist/allowlist.h
index 9fcb7824..a12137de 100644
--- a/chrome/browser/extensions/component_extensions_allowlist/allowlist.h
+++ b/chrome/browser/extensions/component_extensions_allowlist/allowlist.h
@@ -7,7 +7,7 @@
 
 #include <string>
 
-#include "build/chromeos_buildflags.h"
+#include "build/build_config.h"
 
 namespace extensions {
 
@@ -44,7 +44,7 @@
 // Checks using resource ID of manifest.
 bool IsComponentExtensionAllowlisted(int manifest_resource_id);
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 // Checks using extension id for sign in profile.
 bool IsComponentExtensionAllowlistedForSignInProfile(
     const std::string& extension_id);
diff --git a/chrome/browser/extensions/component_loader.cc b/chrome/browser/extensions/component_loader.cc
index 98c23fe..52e5aee 100644
--- a/chrome/browser/extensions/component_loader.cc
+++ b/chrome/browser/extensions/component_loader.cc
@@ -57,7 +57,7 @@
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/resource/resource_bundle.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "ash/constants/ash_features.h"
 #include "ash/constants/ash_pref_names.h"
 #include "ash/constants/ash_switches.h"
@@ -100,7 +100,7 @@
 
 bool g_enable_background_extensions_during_testing = false;
 
-#if BUILDFLAG(IS_CHROMEOS_ASH) && BUILDFLAG(GOOGLE_CHROME_BRANDING)
+#if BUILDFLAG(IS_CHROMEOS) && BUILDFLAG(GOOGLE_CHROME_BRANDING)
 // Whether HelpApp is enabled.
 bool g_enable_help_app = true;
 #endif
@@ -146,14 +146,14 @@
 }
 #endif  // BUILDFLAG(IS_CHROMEOS)
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 bool IsNormalSession() {
   return !base::CommandLine::ForCurrentProcess()->HasSwitch(
              ash::switches::kGuestSession) &&
          user_manager::UserManager::IsInitialized() &&
          user_manager::UserManager::Get()->IsUserLoggedIn();
 }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 }  // namespace
 
@@ -404,7 +404,7 @@
 }
 
 void ComponentLoader::AddWebStoreApp() {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   if (!IsNormalSession()) {
     return;
   }
@@ -416,7 +416,7 @@
       l10n_util::GetStringUTF8(IDS_WEBSTORE_APP_DESCRIPTION));
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 void ComponentLoader::AddChromeApp() {
   AddWithNameAndDescription(
       IDR_CHROME_APP_MANIFEST, base::FilePath(FILE_PATH_LITERAL("chrome_app")),
@@ -443,7 +443,7 @@
   Add(IDR_KEYBOARD_MANIFEST, base::FilePath(FILE_PATH_LITERAL("keyboard")));
 }
 
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 scoped_refptr<const Extension> ComponentLoader::CreateExtension(
     const ComponentExtensionInfo& info,
@@ -461,7 +461,7 @@
   g_enable_background_extensions_during_testing = true;
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH) && BUILDFLAG(GOOGLE_CHROME_BRANDING)
+#if BUILDFLAG(IS_CHROMEOS) && BUILDFLAG(GOOGLE_CHROME_BRANDING)
 // static
 void ComponentLoader::DisableHelpAppForTesting() {
   g_enable_help_app = false;
@@ -472,7 +472,7 @@
     bool skip_session_components) {
   // Do not add component extensions that have background pages here -- add them
   // to AddDefaultComponentExtensionsWithBackgroundPages.
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 
 #if BUILDFLAG(GOOGLE_CHROME_BRANDING)
   if (g_enable_help_app) {
@@ -482,18 +482,18 @@
 #endif  // BUILDFLAG(GOOGLE_CHROME_BRANDING)
 
   AddKeyboardApp();
-#else   // BUILDFLAG(IS_CHROMEOS_ASH)
+#else   // BUILDFLAG(IS_CHROMEOS)
   DCHECK(!skip_session_components);
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
   if (!skip_session_components) {
     AddWebStoreApp();
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
     if (crosapi::browser_util::IsAshWebBrowserEnabled() ||
         ash::switches::IsAshDebugBrowserEnabled()) {
       AddChromeApp();
     }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 #if BUILDFLAG(ENABLE_PDF)
     Add(pdf_extension_util::GetManifest(),
         base::FilePath(FILE_PATH_LITERAL("pdf")));
@@ -513,10 +513,10 @@
     return;
   }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // Add virtual keyboard.
   AddKeyboardApp();
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
   AddDefaultComponentExtensionsWithBackgroundPagesForKioskMode();
 
@@ -571,7 +571,7 @@
 #endif  // BUILDFLAG(GOOGLE_CHROME_BRANDING)
 #endif  // BUILDFLAG(IS_CHROMEOS)
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
     if (command_line->HasSwitch(switches::kLoadGuestModeTestExtension)) {
       base::FilePath path = base::FilePath(command_line->GetSwitchValueASCII(
           switches::kLoadGuestModeTestExtension));
@@ -589,11 +589,11 @@
 
     Add(IDR_ARC_SUPPORT_MANIFEST,
         base::FilePath(FILE_PATH_LITERAL("chromeos/arc_support")));
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
   }
 
 #if BUILDFLAG(GOOGLE_CHROME_BRANDING)
-#if !BUILDFLAG(IS_CHROMEOS_ASH)  // http://crbug.com/314799
+#if !BUILDFLAG(IS_CHROMEOS)  // http://crbug.com/314799
   AddNetworkSpeechSynthesisExtension();
 #endif
 
@@ -634,7 +634,7 @@
     const base::FilePath::CharType* guest_manifest_file_name,
     base::OnceClosure done_cb) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   const base::FilePath::CharType* manifest_filename =
       IsNormalSession() ? manifest_file_name : guest_manifest_file_name;
 #else
@@ -676,9 +676,9 @@
     std::move(done_cb).Run();
   }
 }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 void ComponentLoader::AddComponentFromDir(const base::FilePath& root_directory,
                                           const ExtensionId& extension_id,
                                           base::OnceClosure done_cb) {
@@ -731,6 +731,6 @@
   extensions::ProcessManager::Get(profile_)->WakeEventPage(extension_id,
                                                            base::DoNothing());
 }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 }  // namespace extensions
diff --git a/chrome/browser/extensions/component_loader.h b/chrome/browser/extensions/component_loader.h
index d24e5b1f..4a012f8 100644
--- a/chrome/browser/extensions/component_loader.h
+++ b/chrome/browser/extensions/component_loader.h
@@ -88,7 +88,7 @@
   // background pages for testing, which could otherwise interfere with tests.
   static void EnableBackgroundExtensionsForTesting();
 
-#if BUILDFLAG(IS_CHROMEOS_ASH) && BUILDFLAG(GOOGLE_CHROME_BRANDING)
+#if BUILDFLAG(IS_CHROMEOS) && BUILDFLAG(GOOGLE_CHROME_BRANDING)
   // Call this during test setup to disabling loading the HelpApp.
   static void DisableHelpAppForTesting();
 #endif
@@ -119,7 +119,7 @@
       base::OnceClosure done_cb);
 #endif  // BUILDFLAG(IS_CHROMEOS)
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // Add a component extension from a specific directory. Assumes that the
   // extension uses a different manifest file when this is a guest session
   // and that the manifest file lives in |root_directory|. Calls |done_cb|
@@ -217,14 +217,14 @@
       std::optional<base::Value::Dict> manifest);
 #endif  // BUILDFLAG(IS_CHROMEOS)
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   void AddChromeApp();
   void AddFileManagerExtension();
   void AddGalleryExtension();
   void AddImageLoaderExtension();
   void AddGuestModeTestExtension(const base::FilePath& path);
   void AddKeyboardApp();
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
   scoped_refptr<const Extension> CreateExtension(
       const ComponentExtensionInfo& info, std::string* utf8_error);
diff --git a/chrome/browser/extensions/context_menu_matcher.cc b/chrome/browser/extensions/context_menu_matcher.cc
index db26f891..4ff80f15 100644
--- a/chrome/browser/extensions/context_menu_matcher.cc
+++ b/chrome/browser/extensions/context_menu_matcher.cc
@@ -83,7 +83,7 @@
 
   bool prepend_separator = false;
 
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
   // If this is the first extension-provided menu item, and there are other
   // items in the menu, and the last item is not a separator add a separator.
   // Also, don't add separators when Smart Text Selection is enabled. Smart
@@ -328,7 +328,7 @@
 
   bool enable_separators = false;
 
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
   enable_separators = true;
 #endif
 
diff --git a/chrome/browser/extensions/crx_installer.cc b/chrome/browser/extensions/crx_installer.cc
index f886cb4..5c5782c 100644
--- a/chrome/browser/extensions/crx_installer.cc
+++ b/chrome/browser/extensions/crx_installer.cc
@@ -73,7 +73,7 @@
 #include "third_party/skia/include/core/SkBitmap.h"
 #include "ui/base/l10n/l10n_util.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "components/user_manager/user_manager.h"
 #endif
 
@@ -753,7 +753,7 @@
 
   if (KioskModeInfo::IsKioskOnly(extension())) {
     bool in_kiosk_mode = false;
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
     user_manager::UserManager* user_manager = user_manager::UserManager::Get();
     in_kiosk_mode = user_manager && user_manager->IsLoggedInAsKioskApp();
 #endif
diff --git a/chrome/browser/extensions/crx_installer_browsertest.cc b/chrome/browser/extensions/crx_installer_browsertest.cc
index c3bb955c..072966e61 100644
--- a/chrome/browser/extensions/crx_installer_browsertest.cc
+++ b/chrome/browser/extensions/crx_installer_browsertest.cc
@@ -80,7 +80,7 @@
 #include "third_party/skia/include/core/SkBitmap.h"
 #include "ui/base/l10n/l10n_util.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "ash/constants/ash_switches.h"
 #include "chrome/browser/ash/login/users/fake_chrome_user_manager.h"
 #include "chrome/browser/extensions/extension_assets_manager_chromeos.h"
@@ -986,7 +986,7 @@
             *installation_failure.install_error_detail);
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 IN_PROC_BROWSER_TEST_F(ExtensionCrxInstallerTest, KioskOnlyTest) {
   base::ScopedAllowBlockingForTesting allow_io;
   // kiosk_only is allowlisted from non-chromeos.
diff --git a/chrome/browser/extensions/extension_action_icon_factory_unittest.cc b/chrome/browser/extensions/extension_action_icon_factory_unittest.cc
index ba9691e..9373079 100644
--- a/chrome/browser/extensions/extension_action_icon_factory_unittest.cc
+++ b/chrome/browser/extensions/extension_action_icon_factory_unittest.cc
@@ -34,7 +34,7 @@
 #include "ui/gfx/image/image_skia_rep.h"
 #include "ui/gfx/skia_util.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/ash/login/users/user_manager_delegate_impl.h"
 #include "chrome/browser/ash/settings/scoped_cros_settings_test_helper.h"
 #include "chrome/browser/browser_process.h"
@@ -176,7 +176,7 @@
   raw_ptr<ExtensionService, DanglingUntriaged> extension_service_;
   base::RunLoop loop_;
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   ash::ScopedCrosSettingsTestHelper cros_settings_test_helper_;
   user_manager::ScopedUserManager user_manager_{
       std::make_unique<user_manager::UserManagerImpl>(
diff --git a/chrome/browser/extensions/extension_assets_manager.cc b/chrome/browser/extensions/extension_assets_manager.cc
index c152950..ebf40e0 100644
--- a/chrome/browser/extensions/extension_assets_manager.cc
+++ b/chrome/browser/extensions/extension_assets_manager.cc
@@ -10,7 +10,7 @@
 #include "extensions/common/extension.h"
 #include "extensions/common/file_util.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/extensions/extension_assets_manager_chromeos.h"
 #endif
 
@@ -60,12 +60,12 @@
 
 // static
 ExtensionAssetsManager* ExtensionAssetsManager::GetInstance() {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   return ExtensionAssetsManagerChromeOS::GetInstance();
 #else
   // If not Chrome OS, use trivial implementation that doesn't share anything.
   return ExtensionAssetsManagerImpl::GetInstance();
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 }
 
 }  // namespace extensions
diff --git a/chrome/browser/extensions/extension_browsertest.cc b/chrome/browser/extensions/extension_browsertest.cc
index 9b8812f..3384395 100644
--- a/chrome/browser/extensions/extension_browsertest.cc
+++ b/chrome/browser/extensions/extension_browsertest.cc
@@ -87,7 +87,7 @@
 #include "extensions/common/manifest_handlers/background_info.h"
 #include "extensions/common/switches.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "ash/constants/ash_switches.h"
 #endif
 
@@ -363,7 +363,7 @@
 
 ExtensionBrowserTest::ExtensionBrowserTest(ContextType context_type)
     :
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
       set_chromeos_user_(true),
 #endif
       context_type_(context_type),
@@ -476,7 +476,7 @@
     mv2_enabler_.emplace();
   }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   if (set_chromeos_user_) {
     // This makes sure that we create the Default profile first, with no
     // ExtensionService and then the real profile with one, as we do when
diff --git a/chrome/browser/extensions/extension_browsertest.h b/chrome/browser/extensions/extension_browsertest.h
index 028ff90..922ef4c 100644
--- a/chrome/browser/extensions/extension_browsertest.h
+++ b/chrome/browser/extensions/extension_browsertest.h
@@ -376,7 +376,7 @@
   static content::ServiceWorkerContext* GetServiceWorkerContext(
       content::BrowserContext* browser_context);
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // True if the command line should be tweaked as if ChromeOS user is
   // already logged in.
   bool set_chromeos_user_;
diff --git a/chrome/browser/extensions/extension_commands_global_registry_apitest.cc b/chrome/browser/extensions/extension_commands_global_registry_apitest.cc
index 2ec4e1a3..695db41 100644
--- a/chrome/browser/extensions/extension_commands_global_registry_apitest.cc
+++ b/chrome/browser/extensions/extension_commands_global_registry_apitest.cc
@@ -26,7 +26,7 @@
 // extension.
 //
 // Doesn't work in CrOS builds, http://crbug.com/619784
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #define MAYBE_GlobalCommand DISABLED_GlobalCommand
 #else
 #define MAYBE_GlobalCommand GlobalCommand
diff --git a/chrome/browser/extensions/extension_fullscreen_apitest.cc b/chrome/browser/extensions/extension_fullscreen_apitest.cc
index d96179ba..d9462ed 100644
--- a/chrome/browser/extensions/extension_fullscreen_apitest.cc
+++ b/chrome/browser/extensions/extension_fullscreen_apitest.cc
@@ -23,7 +23,7 @@
 }
 
 #if BUILDFLAG(IS_MAC)
-// Fails on MAC: http://crbug.com/480370
+// TODO(crbug.com/40415216): Fails on MAC.
 #define MAYBE_ExtensionFullscreenAccessPass \
     DISABLED_ExtensionFullscreenAccessPass
 #else
@@ -63,9 +63,8 @@
   ASSERT_FALSE(browser()->window()->IsFullscreen());
 }
 
-#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_CHROMEOS_LACROS)
+#if BUILDFLAG(IS_MAC)
 // Fails on MAC: http://crbug.com/480370
-// Flaky on Lacros: crbug.com/345576612.
 #define MAYBE_DisplayModeWindowIsInFullscreen \
   DISABLED_DisplayModeWindowIsInFullscreen
 #else
diff --git a/chrome/browser/extensions/extension_garbage_collector_factory.cc b/chrome/browser/extensions/extension_garbage_collector_factory.cc
index 98d9a8a..f6f7d9e 100644
--- a/chrome/browser/extensions/extension_garbage_collector_factory.cc
+++ b/chrome/browser/extensions/extension_garbage_collector_factory.cc
@@ -14,7 +14,7 @@
 #include "chrome/browser/extensions/install_tracker_factory.h"
 #include "extensions/browser/extensions_browser_client.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/extensions/extension_garbage_collector_chromeos.h"
 #endif
 
@@ -57,7 +57,7 @@
 std::unique_ptr<KeyedService>
 ExtensionGarbageCollectorFactory::BuildInstanceFor(
     content::BrowserContext* context) {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   return std::make_unique<ExtensionGarbageCollectorChromeOS>(context);
 #else
   return std::make_unique<ExtensionGarbageCollector>(context);
diff --git a/chrome/browser/extensions/extension_keeplist_chromeos.cc b/chrome/browser/extensions/extension_keeplist_chromeos.cc
index d2eb3b61..ca2d044 100644
--- a/chrome/browser/extensions/extension_keeplist_chromeos.cc
+++ b/chrome/browser/extensions/extension_keeplist_chromeos.cc
@@ -14,34 +14,25 @@
 #include <string_view>
 #include <vector>
 
+#include "ash/components/arc/app/arc_app_constants.h"
+#include "ash/constants/ash_switches.h"
 #include "base/command_line.h"
 #include "base/containers/contains.h"
 #include "base/containers/span.h"
 #include "base/no_destructor.h"
 #include "base/strings/string_split.h"
 #include "build/chromeos_buildflags.h"
-#include "chrome/common/buildflags.h"
-#include "chrome/common/extensions/extension_constants.h"
-#include "extensions/common/constants.h"
-
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-#include "ash/components/arc/app/arc_app_constants.h"
-#include "ash/constants/ash_switches.h"
 #include "chrome/browser/ash/app_list/arc/arc_app_utils.h"
 #include "chrome/browser/ash/input_method/component_extension_ime_manager_delegate_impl.h"
+#include "chrome/common/buildflags.h"
+#include "chrome/common/extensions/extension_constants.h"
 #include "chromeos/ash/components/file_manager/app_id.h"
-#endif
-
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-#include "chromeos/startup/browser_params_proxy.h"
-#endif
+#include "extensions/common/constants.h"
 
 namespace extensions {
 
 namespace {
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-
 #if !BUILDFLAG(IS_CHROMEOS_DEVICE)
 // Additional ids of extensions and extension apps used for testing
 // can be passed by ash commandline switches, but this is ONLY allowed
@@ -169,136 +160,8 @@
   return *block_list;
 }
 
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
-
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-// Some Lacros chrome apps related browser tests and unit tests run without Ash,
-// and won't get the Ash extension keeplist data from Ash via
-// crosapi::mojom:::BrowserInitParams. For these tests, set the following flag
-// to true to return an empty Ash extension keeplist to allow the tests to
-// proceed without CHECK failure due to the absence of the ash keeplist data in
-// crosapi::mojom:::BrowserInitParams.
-bool g_set_empty_ash_keeplist_for_test = false;
-
-const std::vector<std::string_view>&
-ExtensionsRunInOSAndStandaloneBrowserFromBrowserInitParams() {
-  // Cache the ash extension keeplist data (passed from Ash to Lacros) provided
-  // by chromeos::BrowserParamsProxy. chromeos::BrowserParamsProxy::Get()
-  // accesses a static object constructed with base::NoDestructor, which is
-  // guaranteed not to be destroyed when it is accessed.
-  static const base::NoDestructor<std::vector<std::string_view>> keep_list([] {
-    std::vector<std::string_view> ids;
-    auto& ash_keep_list_param =
-        chromeos::BrowserParamsProxy::Get()->ExtensionKeepList();
-    CHECK(!ash_keep_list_param.is_null());
-    for (const auto& id :
-         ash_keep_list_param->extensions_run_in_os_and_standalonebrowser) {
-      ids.push_back(id);
-    }
-    return ids;
-  }());
-  return *keep_list;
-}
-
-const std::vector<std::string_view>&
-ExtensionAppsRunInOSAndStandaloneBrowserFromBrowserInitParams() {
-  // Cache the ash extension keeplist data (passed from Ash to Lacros) provided
-  // by chromeos::BrowserParamsProxy. chromeos::BrowserParamsProxy::Get()
-  // accesses a static object constructed with base::NoDestructor, which is
-  // guaranteed not to be destroyed when it is accessed.
-  static const base::NoDestructor<std::vector<std::string_view>> keep_list([] {
-    std::vector<std::string_view> ids;
-    auto& ash_keep_list_param =
-        chromeos::BrowserParamsProxy::Get()->ExtensionKeepList();
-    CHECK(!ash_keep_list_param.is_null());
-    for (const auto& id :
-         ash_keep_list_param->extension_apps_run_in_os_and_standalonebrowser) {
-      ids.push_back(id);
-    }
-    return ids;
-  }());
-  return *keep_list;
-}
-
-const std::vector<std::string_view>&
-ExtensionsRunInOSOnlyFromBrowserInitParams() {
-  // Cache the ash extension keeplist data (passed from Ash to Lacros) provided
-  // by chromeos::BrowserParamsProxy. chromeos::BrowserParamsProxy::Get()
-  // accesses a static object constructed with base::NoDestructor, which is
-  // guaranteed not to be destroyed when it is accessed.
-  static const base::NoDestructor<std::vector<std::string_view>> keep_list([] {
-    std::vector<std::string_view> ids;
-    auto& ash_keep_list_param =
-        chromeos::BrowserParamsProxy::Get()->ExtensionKeepList();
-    CHECK(!ash_keep_list_param.is_null());
-    for (const auto& id : ash_keep_list_param->extensions_run_in_os_only) {
-      ids.push_back(id);
-    }
-    return ids;
-  }());
-  return *keep_list;
-}
-
-const std::vector<std::string_view>&
-ExtensionAppsRunInOSOnlyFromBrowserInitParams() {
-  // Cache the ash extension keeplist data (passed from Ash to Lacros) provided
-  // by chromeos::BrowserParamsProxy. chromeos::BrowserParamsProxy::Get()
-  // accesses a static object constructed with base::NoDestructor, which is
-  // guaranteed not to be destroyed when it is accessed.
-  static const base::NoDestructor<std::vector<std::string_view>> keep_list([] {
-    std::vector<std::string_view> ids;
-    auto& ash_keep_list_param =
-        chromeos::BrowserParamsProxy::Get()->ExtensionKeepList();
-    CHECK(!ash_keep_list_param.is_null());
-    for (const auto& id : ash_keep_list_param->extension_apps_run_in_os_only) {
-      ids.push_back(id);
-    }
-    return ids;
-  }());
-  return *keep_list;
-}
-
-base::span<const std::string_view>
-GetExtensionsRunInOSAndStandaloneBrowserLacros() {
-  if (g_set_empty_ash_keeplist_for_test) {
-    return base::span<const std::string_view>();
-  }
-
-  return base::make_span(
-      ExtensionsRunInOSAndStandaloneBrowserFromBrowserInitParams().data(),
-      ExtensionsRunInOSAndStandaloneBrowserFromBrowserInitParams().size());
-}
-
-base::span<const std::string_view>
-GetExtensionAppsRunInOSAndStandaloneBrowserLacros() {
-  if (g_set_empty_ash_keeplist_for_test) {
-    return base::span<const std::string_view>();
-  }
-
-  return base::make_span(
-      ExtensionAppsRunInOSAndStandaloneBrowserFromBrowserInitParams().data(),
-      ExtensionAppsRunInOSAndStandaloneBrowserFromBrowserInitParams().size());
-}
-
-base::span<const std::string_view> GetExtensionsRunInOSOnlyLacros() {
-  if (g_set_empty_ash_keeplist_for_test) {
-    return base::span<const std::string_view>();
-  }
-  return ExtensionsRunInOSOnlyFromBrowserInitParams();
-}
-
-base::span<const std::string_view> GetExtensionAppsRunInOSOnlyLacros() {
-  if (g_set_empty_ash_keeplist_for_test) {
-    return base::span<const std::string_view>();
-  }
-  return ExtensionAppsRunInOSOnlyFromBrowserInitParams();
-}
-
-#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
-
 }  // namespace
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
 crosapi::mojom::ExtensionKeepListPtr BuildExtensionKeeplistInitParam() {
   auto keep_list_param = crosapi::mojom::ExtensionKeepList::New();
   for (const auto& id : ExtensionAppsRunInOSAndStandaloneBrowserAllowlist()) {
@@ -359,44 +222,27 @@
 
   return app_service_block_list;
 }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
 base::span<const std::string_view>
 GetExtensionAppsRunInOSAndStandaloneBrowser() {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
   return ExtensionAppsRunInOSAndStandaloneBrowserAllowlist();
-#else  // IS_CHROMEOS_LACROS
-  return GetExtensionAppsRunInOSAndStandaloneBrowserLacros();
-#endif
 }
 
 base::span<const std::string_view> GetExtensionAppsRunInOSOnly() {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
   return ExtensionAppsRunInOSOnlyAllowlist();
-#else  // IS_CHROMEOS_LACROS
-  return GetExtensionAppsRunInOSOnlyLacros();
-#endif
 }
 
 base::span<const std::string_view> GetExtensionsRunInOSAndStandaloneBrowser() {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
   return ExtensionsRunInOSAndStandaloneBrowserAllowlist();
-#else  // IS_CHROMEOS_LACROS
-  return GetExtensionsRunInOSAndStandaloneBrowserLacros();
-#endif
 }
 
 base::span<const std::string_view> GetExtensionsRunInOSOnly() {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
   return ExtensionsRunInOSOnlyAllowlist();
-#else  // IS_CHROMEOS_LACROS
-  return GetExtensionsRunInOSOnlyLacros();
-#endif
 }
 
 bool ExtensionRunsInBothOSAndStandaloneBrowser(
     const std::string& extension_id) {
-#if BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_CHROMEOS_DEVICE)
+#if BUILDFLAG(IS_CHROMEOS_DEVICE)
   return base::Contains(GetExtensionsRunInOSAndStandaloneBrowser(),
                         extension_id);
 #else
@@ -410,7 +256,7 @@
 
 bool ExtensionAppRunsInBothOSAndStandaloneBrowser(
     const std::string& extension_id) {
-#if BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_CHROMEOS_DEVICE)
+#if BUILDFLAG(IS_CHROMEOS_DEVICE)
   return base::Contains(GetExtensionAppsRunInOSAndStandaloneBrowser(),
                         extension_id);
 #else
@@ -423,13 +269,9 @@
 }
 
 bool ExtensionRunsInOS(const std::string& extension_id) {
-  // Note: IME component extensions are available in Ash build only,therefore,
-  // we don't need to pass them to Lacros.
   bool is_ime = false;
-#if BUILDFLAG(IS_CHROMEOS_ASH)
   is_ime = ash::input_method::ComponentExtensionIMEManagerDelegateImpl::
       IsIMEExtensionID(extension_id);
-#endif
 
   return base::Contains(GetExtensionsRunInOSOnly(), extension_id) ||
          ExtensionRunsInBothOSAndStandaloneBrowser(extension_id) || is_ime;
@@ -442,7 +284,7 @@
 }
 
 bool ExtensionAppRunsInOSOnly(std::string_view app_id) {
-#if BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_CHROMEOS_DEVICE)
+#if BUILDFLAG(IS_CHROMEOS_DEVICE)
   return base::Contains(GetExtensionAppsRunInOSOnly(), app_id);
 #else
   return base::Contains(GetExtensionAppsRunInOSOnly(), app_id) ||
@@ -453,7 +295,7 @@
 }
 
 bool ExtensionRunsInOSOnly(std::string_view extension_id) {
-#if BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_CHROMEOS_DEVICE)
+#if BUILDFLAG(IS_CHROMEOS_DEVICE)
   return base::Contains(GetExtensionsRunInOSOnly(), extension_id);
 #else
   return base::Contains(GetExtensionsRunInOSOnly(), extension_id) ||
@@ -463,35 +305,6 @@
 #endif
 }
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-bool IsAppServiceBlocklistCrosapiSupported() {
-  const auto* block_list = chromeos::BrowserParamsProxy::Get()
-                               ->StandaloneBrowserAppServiceBlockList();
-  return block_list != nullptr;
-}
-
-bool ExtensionAppBlockListedForAppServiceInStandaloneBrowser(
-    std::string_view app_id) {
-  const auto* block_list = chromeos::BrowserParamsProxy::Get()
-                               ->StandaloneBrowserAppServiceBlockList();
-  DCHECK(block_list);
-  return base::Contains(block_list->extension_apps, app_id);
-}
-
-bool ExtensionBlockListedForAppServiceInStandaloneBrowser(
-    std::string_view extension_id) {
-  const auto* block_list = chromeos::BrowserParamsProxy::Get()
-                               ->StandaloneBrowserAppServiceBlockList();
-  DCHECK(block_list);
-  return base::Contains(block_list->extensions, extension_id);
-}
-
-void SetEmptyAshKeeplistForTest() {
-  g_set_empty_ash_keeplist_for_test = true;
-}
-#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
-
-#if BUILDFLAG(IS_CHROMEOS_ASH)
 bool ExtensionAppBlockListedForAppServiceInOS(std::string_view app_id) {
 #if BUILDFLAG(IS_CHROMEOS_DEVICE)
   return base::Contains(ExtensionAppsAppServiceBlocklistInOS(), app_id);
@@ -539,6 +352,5 @@
 size_t ExtensionAppsRunInOSOnlyAllowlistSizeForTest() {
   return ExtensionAppsRunInOSOnlyAllowlist().size();
 }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
 }  // namespace extensions
diff --git a/chrome/browser/extensions/extension_keeplist_chromeos.h b/chrome/browser/extensions/extension_keeplist_chromeos.h
index af05d0c..fc31ec1 100644
--- a/chrome/browser/extensions/extension_keeplist_chromeos.h
+++ b/chrome/browser/extensions/extension_keeplist_chromeos.h
@@ -15,11 +15,9 @@
 
 namespace extensions {
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
 crosapi::mojom::ExtensionKeepListPtr BuildExtensionKeeplistInitParam();
 crosapi::mojom::StandaloneBrowserAppServiceBlockListPtr
 BuildStandaloneBrowserAppServiceBlockListInitParam();
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
 // Returns ids of the extensions that are allow to run in both Ash and Lacros.
 base::span<const std::string_view> GetExtensionsRunInOSAndStandaloneBrowser();
@@ -72,29 +70,6 @@
 // not know about OS-specific extensions that are compiled into ash.
 bool ExtensionRunsInOSOnly(std::string_view extension_id);
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-bool IsAppServiceBlocklistCrosapiSupported();
-
-// Returns true if the app is on app service block list in Lacros, i.e.,
-// the app can't be published in app service by Lacros.
-bool ExtensionAppBlockListedForAppServiceInStandaloneBrowser(
-    std::string_view app_id);
-
-// Returns true if the extension is on app service block list in Lacros, i.e.,
-// the extension can't be published in app service by Lacros.
-bool ExtensionBlockListedForAppServiceInStandaloneBrowser(
-    std::string_view extension_id);
-
-// Some Lacros chrome apps related browser tests and unit tests run without Ash,
-// therefore, Lacros won't get the Ash extension keeplist data from Ash via
-// crosapi::mojom:::BrowserInitParams. For these tests, call
-// SetEmptyAshKeeplistForTest() to allow the tests to use an empty ash keeplist
-// for tests and proceed without CHECK failure due to absence of the ash
-// keeplist parameter in crosapi::mojom:::BrowserInitParams.
-void SetEmptyAshKeeplistForTest();
-#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
-
-#if BUILDFLAG(IS_CHROMEOS_ASH)
 // Returns true if the app is on app service block list in Ash, i.e.,
 // the app can't be published in app service by Ash.
 bool ExtensionAppBlockListedForAppServiceInOS(std::string_view app_id);
@@ -112,7 +87,6 @@
 size_t ExtensionAppsRunInOSAndStandaloneBrowserAllowlistSizeForTest();
 size_t ExtensionsRunInOSOnlyAllowlistSizeForTest();
 size_t ExtensionAppsRunInOSOnlyAllowlistSizeForTest();
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
 }  // namespace extensions
 
diff --git a/chrome/browser/extensions/extension_keybinding_apitest.cc b/chrome/browser/extensions/extension_keybinding_apitest.cc
index d8cd807..ea33cc2 100644
--- a/chrome/browser/extensions/extension_keybinding_apitest.cc
+++ b/chrome/browser/extensions/extension_keybinding_apitest.cc
@@ -932,7 +932,7 @@
 }
 
 //
-#if BUILDFLAG(IS_CHROMEOS_ASH) && !defined(NDEBUG)
+#if BUILDFLAG(IS_CHROMEOS) && !defined(NDEBUG)
 // TODO(dtseng): Test times out on Chrome OS debug. See http://crbug.com/412456.
 #define MAYBE_ContinuePropagation DISABLED_ContinuePropagation
 #else
diff --git a/chrome/browser/extensions/extension_keybinding_registry.cc b/chrome/browser/extensions/extension_keybinding_registry.cc
index 5519f5b..322b178 100644
--- a/chrome/browser/extensions/extension_keybinding_registry.cc
+++ b/chrome/browser/extensions/extension_keybinding_registry.cc
@@ -23,7 +23,7 @@
 #include "extensions/common/manifest_constants.h"
 #include "extensions/common/mojom/context_type.mojom.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/ui/ash/media_client/media_client_impl.h"
 #endif
 
@@ -105,7 +105,7 @@
 
       media_keys_listener_manager->EnableInternalMediaKeyHandling();
     } else {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
       MediaClientImpl::Get()->DisableCustomMediaKeyHandler(browser_context_,
                                                            this);
 #endif
@@ -217,7 +217,7 @@
 
       media_keys_listener_manager->DisableInternalMediaKeyHandling();
     } else {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
       MediaClientImpl::Get()->EnableCustomMediaKeyHandler(browser_context_,
                                                           this);
 #endif
diff --git a/chrome/browser/extensions/extension_management.cc b/chrome/browser/extensions/extension_management.cc
index e3713688..a75bfab4 100644
--- a/chrome/browser/extensions/extension_management.cc
+++ b/chrome/browser/extensions/extension_management.cc
@@ -53,7 +53,7 @@
 #include "extensions/common/url_pattern.h"
 #include "url/gurl.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/ash/profiles/profile_helper.h"
 #else
 #include "components/enterprise/browser/reporting/common_pref_names.h"
@@ -76,7 +76,7 @@
     : profile_(profile), pref_service_(profile_->GetPrefs()) {
   TRACE_EVENT0("browser,startup",
                "ExtensionManagement::ExtensionManagement::ctor");
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   is_signin_profile_ = ash::ProfileHelper::IsSigninProfile(profile);
 #endif
   pref_change_registrar_.Init(pref_service_);
@@ -95,7 +95,7 @@
                              pref_change_callback);
   pref_change_registrar_.Add(prefs::kCloudExtensionRequestEnabled,
                              pref_change_callback);
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
   pref_change_registrar_.Add(enterprise_reporting::kCloudReportingEnabled,
                              pref_change_callback);
 #endif
diff --git a/chrome/browser/extensions/extension_override_apitest.cc b/chrome/browser/extensions/extension_override_apitest.cc
index 946a6c9..778f257 100644
--- a/chrome/browser/extensions/extension_override_apitest.cc
+++ b/chrome/browser/extensions/extension_override_apitest.cc
@@ -264,14 +264,14 @@
 // Check that when an overridden new tab page has focus, a subframe navigation
 // on that page does not steal the focus away by focusing the omnibox.
 // See https://crbug.com/700124.
-// Flaky, http://crbug.com/1269169.
-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
+// TODO(crbug.com/40804036): Flaky on Linux.
+#if BUILDFLAG(IS_LINUX)
 #define MAYBE_SubframeNavigationInOverridenNTPDoesNotAffectFocus \
   DISABLED_SubframeNavigationInOverridenNTPDoesNotAffectFocus
 #else
 #define MAYBE_SubframeNavigationInOverridenNTPDoesNotAffectFocus \
   SubframeNavigationInOverridenNTPDoesNotAffectFocus
-#endif  // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
+#endif  // BUILDFLAG(IS_LINUX)
 IN_PROC_BROWSER_TEST_F(
     ExtensionOverrideTest,
     MAYBE_SubframeNavigationInOverridenNTPDoesNotAffectFocus) {
diff --git a/chrome/browser/extensions/extension_service.cc b/chrome/browser/extensions/extension_service.cc
index ca48239..212c6ea 100644
--- a/chrome/browser/extensions/extension_service.cc
+++ b/chrome/browser/extensions/extension_service.cc
@@ -121,7 +121,7 @@
 #include "chromeos/constants/chromeos_features.h"
 #endif
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "base/system/sys_info.h"
 #include "chrome/browser/ash/extensions/install_limiter.h"
 #include "chrome/browser/ash/fileapi/file_system_backend.h"
@@ -423,7 +423,7 @@
       force_installed_tracker_(registry_, profile_),
       force_installed_metrics_(registry_, profile_, &force_installed_tracker_),
       corrupted_extension_reinstaller_(profile_)
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
       ,
       ash_keeplist_manager_(profile, extension_prefs, this)
 #endif
@@ -538,7 +538,7 @@
   component_loader_->LoadAll();
   bool load_saved_extensions = true;
   bool load_command_line_extensions = extensions_enabled_;
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   if (!ash::ProfileHelper::IsUserProfile(profile_)) {
     load_saved_extensions = false;
     load_command_line_extensions = false;
@@ -587,7 +587,7 @@
   // Must be called after extensions are loaded.
   allowlist_.Init();
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   ash_keeplist_manager_.Init();
 #endif
 
@@ -747,7 +747,7 @@
   }
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 void ExtensionService::LoadSigninProfileTestExtension(const std::string& path) {
   base::SysInfo::CrashIfChromeOSNonTestImage();
   std::string extension_id;
@@ -1246,7 +1246,7 @@
   profile_->GetExtensionSpecialStoragePolicy()->RevokeRightsForExtension(
       extension.get(), profile_);
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // Revoke external file access for the extension from its file system context.
   // It is safe to access the extension's storage partition at this point. The
   // storage partition may get destroyed only after the extension gets unloaded.
@@ -1481,9 +1481,9 @@
 void ExtensionService::OnAllExternalProvidersReady() {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   InstallLimiter::Get(profile_)->OnAllExternalProvidersReady();
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
   // Install any pending extensions.
   if (update_once_all_providers_are_ready_ && updater()) {
@@ -2099,7 +2099,7 @@
       info.path, info.crx_location == mojom::ManifestLocation::kExternalPolicy
                      ? GetPolicyVerifierFormat()
                      : GetExternalVerifierFormat());
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   InstallLimiter::Get(profile_)->Add(installer, file_info);
 #else
   installer->InstallCrxFile(file_info);
diff --git a/chrome/browser/extensions/extension_service.h b/chrome/browser/extensions/extension_service.h
index ca6a9c9..9e24f67 100644
--- a/chrome/browser/extensions/extension_service.h
+++ b/chrome/browser/extensions/extension_service.h
@@ -57,7 +57,7 @@
 #error "Extensions must be enabled"
 #endif
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/extensions/ash_extension_keeplist_manager.h"
 #endif
 
@@ -515,7 +515,7 @@
  private:
   // Loads extensions specified via a command line flag/switch.
   void LoadExtensionsFromCommandLineFlag(const char* switch_name);
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   void LoadSigninProfileTestExtension(const std::string& path);
 #endif
 
@@ -800,7 +800,7 @@
                                        raw_ptr<InstallGate, CtnExperimental>>;
   InstallGateRegistry install_delayer_registry_;
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   AshExtensionKeeplistManager ash_keeplist_manager_;
 #endif
 
diff --git a/chrome/browser/extensions/extension_service_test_base.cc b/chrome/browser/extensions/extension_service_test_base.cc
index 13eabbb..2ca87b5 100644
--- a/chrome/browser/extensions/extension_service_test_base.cc
+++ b/chrome/browser/extensions/extension_service_test_base.cc
@@ -54,7 +54,7 @@
 #include "extensions/browser/pref_names.h"
 #include "extensions/common/extensions_client.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/ash/extensions/install_limiter.h"
 #include "chrome/browser/ash/login/users/user_manager_delegate_impl.h"
 #include "chrome/browser/browser_process.h"
@@ -409,7 +409,7 @@
   ExtensionsClient::Get()->InitializeWebStoreUrls(
       base::CommandLine::ForCurrentProcess());
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // TODO(b/308107135) own KioskController instead of KioskAppManager.
   // A test might have initialized a `KioskAppManager` already.
   if (!ash::KioskChromeAppManager::IsInitialized()) {
@@ -433,7 +433,7 @@
     }
   }
   policy_provider_.Shutdown();
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   kiosk_chrome_app_manager_.reset();
 #endif
 }
@@ -452,11 +452,11 @@
 Profile* ExtensionServiceTestBase::profile() {
 // TODO(crbug.com/40891982): Refactor this convenience upstream to test callers.
 // Possibly just BuiltInAppTest.BuildGuestMode.
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   if (profile_->IsGuestSession()) {
     return profile_->GetPrimaryOTRProfile(/*create_if_needed=*/true);
   }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
   return profile_.get();
 }
@@ -493,7 +493,7 @@
   service_->RegisterInstallGate(ExtensionPrefs::DelayReason::kWaitForImports,
                                 service_->shared_module_service());
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   if (!enable_install_limiter) {
     InstallLimiter::Get(profile())->DisableForTest();
   }
diff --git a/chrome/browser/extensions/extension_service_test_base.h b/chrome/browser/extensions/extension_service_test_base.h
index 02ac076..058079e 100644
--- a/chrome/browser/extensions/extension_service_test_base.h
+++ b/chrome/browser/extensions/extension_service_test_base.h
@@ -29,7 +29,7 @@
 #include "extensions/common/extension.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/ash/app_mode/kiosk_chrome_app_manager.h"
 #include "chrome/browser/ash/settings/scoped_cros_settings_test_helper.h"
 #include "components/user_manager/scoped_user_manager.h"
@@ -181,11 +181,11 @@
   }
   policy::PolicyService* policy_service() { return policy_service_.get(); }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   ash::ScopedCrosSettingsTestHelper& cros_settings_test_helper() {
     return cros_settings_test_helper_;
   }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
   // If a test uses a feature list, it should be destroyed after
   // |task_environment_|, to avoid tsan data races between the ScopedFeatureList
@@ -246,7 +246,7 @@
   // The associated ExtensionRegistry, for convenience.
   raw_ptr<extensions::ExtensionRegistry, DanglingUntriaged> registry_;
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   ash::ScopedCrosSettingsTestHelper cros_settings_test_helper_;
   std::unique_ptr<ash::KioskChromeAppManager> kiosk_chrome_app_manager_;
   user_manager::ScopedUserManager user_manager_;
diff --git a/chrome/browser/extensions/extension_service_unittest.cc b/chrome/browser/extensions/extension_service_unittest.cc
index a67d684..7046b3ac 100644
--- a/chrome/browser/extensions/extension_service_unittest.cc
+++ b/chrome/browser/extensions/extension_service_unittest.cc
@@ -2118,7 +2118,7 @@
   EXPECT_FALSE(util::IsIncognitoEnabled(id, profile()));
 }
 
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
 // This tests that the granted permissions preferences are correctly set for
 // pre-installed apps.
 TEST_F(ExtensionServiceTest, PreinstalledAppsGrantedPermissions) {
@@ -4987,7 +4987,7 @@
   EXPECT_EQ(disable_reason::DISABLE_NONE, prefs->GetDisableReasons(good_crx));
 }
 
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
 // This tests if pre-installed apps are installed correctly.
 TEST_F(ExtensionServiceTest, PreinstalledAppsInstall) {
   InitializeEmptyExtensionService();
diff --git a/chrome/browser/extensions/extension_service_user_test_base.cc b/chrome/browser/extensions/extension_service_user_test_base.cc
index 4d931f3..0213f14a 100644
--- a/chrome/browser/extensions/extension_service_user_test_base.cc
+++ b/chrome/browser/extensions/extension_service_user_test_base.cc
@@ -11,12 +11,12 @@
 #include "chrome/test/base/testing_profile.h"
 #include "content/public/test/browser_task_environment.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/ash/login/users/fake_chrome_user_manager.h"
 #include "components/account_id/account_id.h"
 #include "components/user_manager/scoped_user_manager.h"
 #include "components/user_manager/user_names.h"
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 namespace extensions {
 
@@ -26,7 +26,7 @@
     std::unique_ptr<content::BrowserTaskEnvironment> task_environment)
     : ExtensionServiceTestBase(std::move(task_environment)) {}
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 void ExtensionServiceUserTestBase::SetUp() {
   ExtensionServiceTestBase::SetUp();
   scoped_user_manager_ = std::make_unique<user_manager::ScopedUserManager>(
@@ -49,14 +49,14 @@
   ASSERT_TRUE(GetFakeUserManager()->IsUserLoggedIn());
   ASSERT_TRUE(user == GetFakeUserManager()->GetActiveUser());
 }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 void ExtensionServiceUserTestBase::MaybeSetUpTestUser(bool is_guest) {
   testing_profile()->SetGuestSession(is_guest);
 
   ASSERT_EQ(is_guest, testing_profile()->IsGuestSession());
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   user_manager::User* user;
   AccountId account_id = account_id_;
   if (is_guest) {
@@ -66,7 +66,7 @@
     user = GetFakeUserManager()->AddUser(account_id_);
   }
   ASSERT_NO_FATAL_FAILURE(LoginChromeOSAshUser(user, account_id));
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 }
 
 }  // namespace extensions
diff --git a/chrome/browser/extensions/extension_service_user_test_base.h b/chrome/browser/extensions/extension_service_user_test_base.h
index 1c5459a..9632985 100644
--- a/chrome/browser/extensions/extension_service_user_test_base.h
+++ b/chrome/browser/extensions/extension_service_user_test_base.h
@@ -8,7 +8,7 @@
 #include "build/chromeos_buildflags.h"
 #include "chrome/browser/extensions/extension_service_test_base.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/ash/login/users/fake_chrome_user_manager.h"
 #include "components/user_manager/scoped_user_manager.h"
 #endif
@@ -22,7 +22,7 @@
   ExtensionServiceUserTestBase();
   ~ExtensionServiceUserTestBase() override;
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   void SetUp() override;
 
   void TearDown() override;
@@ -34,7 +34,7 @@
     return static_cast<ash::FakeChromeUserManager*>(
         user_manager::UserManager::Get());
   }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
   // If browser/lacros: set the testing profile for the test as a guest if
   // `is_guest` is `true`. If ChromeOS Ash: do the above, but also login a
@@ -47,12 +47,12 @@
   explicit ExtensionServiceUserTestBase(
       std::unique_ptr<content::BrowserTaskEnvironment> task_environment);
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   AccountId account_id_;
 
  private:
   std::unique_ptr<user_manager::ScopedUserManager> scoped_user_manager_;
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 };
 
 }  // namespace extensions
diff --git a/chrome/browser/extensions/extension_special_storage_policy.cc b/chrome/browser/extensions/extension_special_storage_policy.cc
index 6f3ba251..f986f9c 100644
--- a/chrome/browser/extensions/extension_special_storage_policy.cc
+++ b/chrome/browser/extensions/extension_special_storage_policy.cc
@@ -42,7 +42,7 @@
 #include "url/gurl.h"
 #include "url/origin.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/common/webui_url_constants.h"
 #endif
 
@@ -137,7 +137,7 @@
     return true;
   }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // chrome-untrusted://terminal/ runs the SSH extension code which can store
   // SSH known_hosts, config, and Identity keys. Use unlimitedStorage to match
   // extension config.
diff --git a/chrome/browser/extensions/extension_startup_browsertest.cc b/chrome/browser/extensions/extension_startup_browsertest.cc
index c2052b7..9bfa2547 100644
--- a/chrome/browser/extensions/extension_startup_browsertest.cc
+++ b/chrome/browser/extensions/extension_startup_browsertest.cc
@@ -51,7 +51,7 @@
 #include "extensions/test/test_content_script_load_waiter.h"
 #include "net/base/filename_util.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/ash/profiles/profile_helper.h"
 #endif
 
@@ -344,7 +344,7 @@
   TestInjection(true, true);
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 
 IN_PROC_BROWSER_TEST_F(ExtensionsLoadTest,
                        SigninProfileCommandLineExtensionsDontLoad) {
@@ -354,7 +354,7 @@
                    ash::ProfileHelper::GetSigninProfile()));
 }
 
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 // ExtensionsLoadMultipleTest
 // Ensures that we can startup the browser with multiple extensions
diff --git a/chrome/browser/extensions/extension_system_impl.cc b/chrome/browser/extensions/extension_system_impl.cc
index 5702eb9be..2febccc2 100644
--- a/chrome/browser/extensions/extension_system_impl.cc
+++ b/chrome/browser/extensions/extension_system_impl.cc
@@ -60,7 +60,7 @@
 #include "extensions/common/manifest_url_handlers.h"
 #include "ui/message_center/public/cpp/notifier_id.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "ash/constants/ash_switches.h"
 #include "chrome/browser/app_mode/app_mode_utils.h"
 #include "chrome/browser/ash/app_mode/kiosk_app_update_install_gate.h"
@@ -118,7 +118,7 @@
   dynamic_user_scripts_store_ = std::make_unique<StateStore>(
       profile_, store_factory_, StateStore::BackendType::SCRIPTS, false);
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // We can not perform check for Signin Profile here, as it would result in
   // recursive call upon creation of Signin Profile, so we will create
   // SigninScreenPolicyProvider lazily in RegisterManagementPolicyProviders.
@@ -142,7 +142,7 @@
       ExtensionManagementFactory::GetForBrowserContext(profile_)
           ->GetProviders());
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // Lazy creation of SigninScreenPolicyProvider.
   if (!signin_screen_policy_provider_) {
     if (ash::ProfileHelper::IsSigninProfile(profile_)) {
@@ -158,7 +158,7 @@
   if (signin_screen_policy_provider_) {
     management_policy_->RegisterProvider(signin_screen_policy_provider_.get());
   }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
   management_policy_->RegisterProvider(InstallVerifier::Get(profile_));
 }
@@ -170,7 +170,7 @@
   extension_service_->RegisterInstallGate(
       ExtensionPrefs::DelayReason::kWaitForImports,
       extension_service_->shared_module_service());
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   if (IsRunningInForcedAppMode()) {
     kiosk_app_update_install_gate_ =
         std::make_unique<ash::KioskAppUpdateInstallGate>(profile_);
@@ -199,12 +199,12 @@
 
   bool autoupdate_enabled =
       !profile_->IsGuestSession() && !profile_->IsSystemProfile();
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   if (!extensions_enabled ||
       ash::ProfileHelper::IsLockScreenAppProfile(profile_)) {
     autoupdate_enabled = false;
   }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
   extension_service_ = std::make_unique<ExtensionService>(
       profile_, base::CommandLine::ForCurrentProcess(),
       profile_->GetPath().AppendASCII(kInstallDirectoryName),
@@ -222,14 +222,14 @@
     InstallVerifier::Get(profile_)->Init();
     ChromeContentVerifierDelegate::VerifyInfo::Mode mode =
         ChromeContentVerifierDelegate::GetDefaultMode();
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
     mode = std::max(mode,
                     ChromeContentVerifierDelegate::VerifyInfo::Mode::BOOTSTRAP);
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
     if (mode >= ChromeContentVerifierDelegate::VerifyInfo::Mode::BOOTSTRAP) {
       content_verifier_->Start();
     }
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
     // This class is used to check the permissions of the force-installed
     // extensions inside the managed guest session. It updates the local state
     // perf with the result, a boolean value deciding whether the full warning
@@ -251,7 +251,7 @@
   quota_service_ = std::make_unique<QuotaService>();
 
   bool skip_session_extensions = false;
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // Skip loading session extensions if we are not in a user session or if the
   // profile is the sign-in or lock screen app profile, which don't correspond
   // to a user session.
diff --git a/chrome/browser/extensions/extension_system_impl.h b/chrome/browser/extensions/extension_system_impl.h
index 9215592b..54cf26f 100644
--- a/chrome/browser/extensions/extension_system_impl.h
+++ b/chrome/browser/extensions/extension_system_impl.h
@@ -16,12 +16,12 @@
 
 class Profile;
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 namespace chromeos {
 class DeviceLocalAccountManagementPolicyProvider;
 class SigninScreenPolicyProvider;
 }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 namespace value_store {
 class ValueStoreFactory;
@@ -142,7 +142,7 @@
 
     std::unique_ptr<UninstallPingSender> uninstall_ping_sender_;
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
     std::unique_ptr<chromeos::DeviceLocalAccountManagementPolicyProvider>
         device_local_account_management_policy_provider_;
     std::unique_ptr<chromeos::SigninScreenPolicyProvider>
diff --git a/chrome/browser/extensions/extension_util.cc b/chrome/browser/extensions/extension_util.cc
index a79b079d..561a245 100644
--- a/chrome/browser/extensions/extension_util.cc
+++ b/chrome/browser/extensions/extension_util.cc
@@ -43,7 +43,7 @@
 #include "ui/gfx/text_elider.h"
 #include "url/gurl.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/ash/profiles/profile_helper.h"
 #include "chromeos/ash/components/file_manager/app_id.h"
 #endif
@@ -78,7 +78,7 @@
   return ReloadExtension(extension_id, context);
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 // Returns true if the extension ID is found in the InstallForceList policy. Is
 // checked by HasIsolatedStorage() when the extension is not found in the
 // registry.
@@ -99,7 +99,7 @@
   }
   return false;
 }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 // Returns true if the profile is a sign-in profile and the extension is policy
 // installed. `is_policy_installed` can be passed to the method if its value is
@@ -110,7 +110,7 @@
     ExtensionId extension_id,
     content::BrowserContext* context,
     std::optional<bool> is_policy_installed = std::nullopt) {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // Verify the force-installed extension list if no value for
   // `is_policy_installed` was passed.
   if (is_policy_installed == std::nullopt) {
@@ -138,7 +138,7 @@
 
 bool HasIsolatedStorage(const Extension& extension,
                         content::BrowserContext* context) {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   const bool is_policy_extension =
       Manifest::IsPolicyLocation(extension.location());
   if (IsLoginScreenExtension(extension.id(), context, is_policy_extension)) {
@@ -167,7 +167,7 @@
       // by sync, for syncable component extensions.
       // See http://crbug.com/112290 and associated CLs for the sordid history.
       bool syncable = sync_helper::IsSyncableComponentExtension(extension);
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
       // For some users, the file manager app somehow ended up being synced even
       // though it's supposed to be unsyncable; see crbug.com/576964. If the bad
       // data ever gets cleaned up, this hack should be removed.
diff --git a/chrome/browser/extensions/extension_util_unittest.cc b/chrome/browser/extensions/extension_util_unittest.cc
index 44171a6..31373794 100644
--- a/chrome/browser/extensions/extension_util_unittest.cc
+++ b/chrome/browser/extensions/extension_util_unittest.cc
@@ -36,7 +36,7 @@
 
 namespace {
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 constexpr char kExtensionUpdateUrl[] =
     "https://clients2.google.com/service/update2/crx";  // URL of Chrome Web
                                                         // Store backend.
@@ -200,7 +200,7 @@
   EXPECT_EQ(fixup_extension_name, expected_fixup_extension_name);
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 class ExtensionUtilWithSigninProfileUnittest : public ExtensionUtilUnittest {
  public:
   void SetUp() override {
diff --git a/chrome/browser/extensions/extension_web_ui_unittest.cc b/chrome/browser/extensions/extension_web_ui_unittest.cc
index 70809d23..0778741 100644
--- a/chrome/browser/extensions/extension_web_ui_unittest.cc
+++ b/chrome/browser/extensions/extension_web_ui_unittest.cc
@@ -35,7 +35,7 @@
 #include "third_party/skia/include/core/SkBitmap.h"
 #include "ui/gfx/codec/png_codec.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/ash/login/users/user_manager_delegate_impl.h"
 #include "chrome/browser/ash/settings/scoped_cros_settings_test_helper.h"
 #include "chrome/browser/browser_process.h"
@@ -84,7 +84,7 @@
   raw_ptr<ExtensionService, DanglingUntriaged> extension_service_;
   content::BrowserTaskEnvironment task_environment_;
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   ash::ScopedCrosSettingsTestHelper cros_settings_test_helper_;
   user_manager::ScopedUserManager user_manager_{
       std::make_unique<user_manager::UserManagerImpl>(
diff --git a/chrome/browser/extensions/external_component_loader.cc b/chrome/browser/extensions/external_component_loader.cc
index 414f4b2..d8e6400f 100644
--- a/chrome/browser/extensions/external_component_loader.cc
+++ b/chrome/browser/extensions/external_component_loader.cc
@@ -18,16 +18,13 @@
 #include "extensions/common/manifest.h"
 
 #if BUILDFLAG(IS_CHROMEOS)
+#include "chrome/browser/ash/crosapi/browser_util.h"
 #include "chrome/browser/chromeos/upload_office_to_cloud/upload_office_to_cloud.h"
 #include "chrome/browser/policy/profile_policy_connector.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chromeos/constants/chromeos_features.h"
 #endif
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-#include "chrome/browser/ash/crosapi/browser_util.h"
-#endif
-
 namespace extensions {
 
 ExternalComponentLoader::ExternalComponentLoader(Profile* profile)
@@ -51,21 +48,7 @@
 
     if (chromeos::cloud_upload::IsMicrosoftOfficeOneDriveIntegrationAllowed(
             profile_)) {
-      // Do not load in Ash if Lacros is enabled, otherwise all messages will be
-      // routed to the extension in Ash.
-      bool should_load = false;
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-      // In Ash, suppress loading if Lacros is enabled, as the extension is
-      // expected to be loaded in Lacros.
-      should_load = !crosapi::browser_util::IsLacrosEnabled();
-#elif BUILDFLAG(IS_CHROMEOS_LACROS)
-      // In Lacros, only load in the primary profile (fileSystemProvider
-      // extensions in other profiles won't work).
-      should_load = profile_ == ProfileManager::GetPrimaryUserProfile();
-#endif
-      if (should_load) {
-        AddExternalExtension(extension_misc::kODFSExtensionId, prefs);
-      }
+      AddExternalExtension(extension_misc::kODFSExtensionId, prefs);
     }
   }
 #endif
diff --git a/chrome/browser/extensions/external_pref_loader.cc b/chrome/browser/extensions/external_pref_loader.cc
index 728df5c..3ccbc7a 100644
--- a/chrome/browser/extensions/external_pref_loader.cc
+++ b/chrome/browser/extensions/external_pref_loader.cc
@@ -32,7 +32,7 @@
 #include "content/public/browser/browser_thread.h"
 #include "extensions/browser/extension_file_task_runner.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "ash/constants/ash_features.h"
 #include "ash/constants/ash_pref_names.h"
 #include "ash/constants/ash_switches.h"
@@ -57,7 +57,7 @@
 // is a bit complicated.
 // TODO(crbug.com/40658053) This is a temporary measure and should be replaced.
 bool SkipInstallForChromeOSTablet(const base::FilePath& file_path) {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   if (!ash::switches::IsTabletFormFactor())
     return false;
 
@@ -117,7 +117,7 @@
 
 namespace extensions {
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 // Helper class to wait for priority pref sync to be ready.
 class ExternalPrefLoader::PrioritySyncReadyWaiter
     : public sync_preferences::PrefServiceSyncableObserver,
@@ -205,7 +205,7 @@
   base::ScopedObservation<syncer::SyncService, syncer::SyncServiceObserver>
       sync_service_observation_{this};
 };
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 ExternalPrefLoader::ExternalPrefLoader(int base_path_id,
                                        int options,
@@ -229,7 +229,7 @@
 
 void ExternalPrefLoader::StartLoading() {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   if ((options_ & DELAY_LOAD_UNTIL_PRIORITY_SYNC) &&
       (profile_ && SyncServiceFactory::IsSyncAllowed(profile_))) {
     pending_waiter_list_.push_back(
@@ -239,13 +239,13 @@
                                      this, waiter_ptr));
     return;
   }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
   GetExtensionFileTaskRunner()->PostTask(
       FROM_HERE, base::BindOnce(&ExternalPrefLoader::LoadOnFileThread, this));
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 void ExternalPrefLoader::OnPrioritySyncReady(
     ExternalPrefLoader::PrioritySyncReadyWaiter* waiter) {
   // Delete |waiter| from |pending_waiter_list_|.
@@ -256,7 +256,7 @@
   GetExtensionFileTaskRunner()->PostTask(
       FROM_HERE, base::BindOnce(&ExternalPrefLoader::LoadOnFileThread, this));
 }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 // static.
 base::Value::Dict ExternalPrefLoader::ExtractExtensionPrefs(
diff --git a/chrome/browser/extensions/external_pref_loader.h b/chrome/browser/extensions/external_pref_loader.h
index df4c11db..8dca682 100644
--- a/chrome/browser/extensions/external_pref_loader.h
+++ b/chrome/browser/extensions/external_pref_loader.h
@@ -32,7 +32,7 @@
     // owned by root and not writable by any non-root user.
     ENSURE_PATH_CONTROLLED_BY_ADMIN = 1 << 0,
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
     // Delay external preference load. It delays default apps installation
     // to not overload the system on first time user login.
     DELAY_LOAD_UNTIL_PRIORITY_SYNC = 1 << 1,
@@ -73,7 +73,7 @@
   friend class ExternalTestingLoader;
   friend class TestExternalPrefLoader;
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   class PrioritySyncReadyWaiter;
 #endif
 
@@ -110,7 +110,7 @@
   // Must be called from the File thread.
   void ReadStandaloneExtensionPrefFiles(base::Value::Dict& prefs);
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   void OnPrioritySyncReady(PrioritySyncReadyWaiter* waiter);
 #endif
 
@@ -129,7 +129,7 @@
   // Task runner for tasks that touch file.
   scoped_refptr<base::SequencedTaskRunner> file_task_runner_;
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   std::vector<std::unique_ptr<PrioritySyncReadyWaiter>> pending_waiter_list_;
 #endif
 };
diff --git a/chrome/browser/extensions/external_provider_impl.cc b/chrome/browser/extensions/external_provider_impl.cc
index 276921e..8d79e40b 100644
--- a/chrome/browser/extensions/external_provider_impl.cc
+++ b/chrome/browser/extensions/external_provider_impl.cc
@@ -56,12 +56,6 @@
 #include "ui/base/l10n/l10n_util.h"
 
 #if BUILDFLAG(IS_CHROMEOS)
-#include "chrome/browser/chromeos/app_mode/kiosk_app_external_loader.h"
-#include "chromeos/components/kiosk/kiosk_utils.h"
-#include "chromeos/components/mgs/managed_guest_session_utils.h"
-#endif  // BUIDLFLAG(IS_CHROMEOS)
-
-#if BUILDFLAG(IS_CHROMEOS_ASH)
 #include "ash/components/arc/arc_util.h"
 #include "ash/constants/ash_paths.h"
 #include "base/path_service.h"
@@ -70,7 +64,10 @@
 #include "chrome/browser/ash/policy/core/browser_policy_connector_ash.h"
 #include "chrome/browser/ash/policy/core/device_local_account_policy_service.h"
 #include "chrome/browser/ash/profiles/profile_helper.h"
+#include "chrome/browser/chromeos/app_mode/kiosk_app_external_loader.h"
 #include "chrome/browser/chromeos/extensions/external_loader/device_local_account_external_policy_loader.h"
+#include "chromeos/components/kiosk/kiosk_utils.h"
+#include "chromeos/components/mgs/managed_guest_session_utils.h"
 #else
 #include "chrome/browser/extensions/preinstalled_apps.h"
 #include "components/policy/core/common/device_local_account_type.h"
@@ -80,11 +77,6 @@
 #include "chrome/browser/extensions/external_registry_loader_win.h"
 #endif
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-#include "base/check_is_test.h"
-#include "chrome/browser/lacros/app_mode/device_local_account_extension_installer_lacros.h"
-#endif
-
 using content::BrowserThread;
 using extensions::mojom::ManifestLocation;
 
@@ -92,7 +84,7 @@
 
 namespace {
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 
 const char kCameraAppId[] = "hfhhnacclhffhdffklopdkcgdhifgngh";
 
@@ -111,7 +103,7 @@
   return false;
 }
 
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 }  // namespace
 
@@ -257,7 +249,7 @@
   for (auto pref : *prefs_) {
     const std::string& extension_id = pref.first;
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
     if (extension_id == kCameraAppId) {
       unsupported_extensions.insert(extension_id);
       install_stage_tracker->ReportFailure(
@@ -275,7 +267,7 @@
           InstallStageTracker::FailureReason::REPLACED_BY_ARC_APP);
       continue;
     }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
     if (!crx_file::id_util::IdIsValid(extension_id)) {
       LOG(WARNING) << "Malformed extension dictionary: key "
@@ -642,7 +634,7 @@
   scoped_refptr<ExternalLoader> external_recommended_loader;
   ManifestLocation crx_location = ManifestLocation::kInvalidLocation;
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   if (ash::ProfileHelper::IsSigninProfile(profile)) {
     // Download extensions/apps installed by policy in the login profile.
     // Extensions (not apps) installed through this path will have type
@@ -659,9 +651,7 @@
     provider_list->push_back(std::move(signin_profile_provider));
     return;
   }
-#endif
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
   policy::BrowserPolicyConnectorAsh* const connector =
       g_browser_process->platform_part()->browser_policy_connector_ash();
   DCHECK(connector);
@@ -686,16 +676,6 @@
       }
     }
   }
-#elif BUILDFLAG(IS_CHROMEOS_LACROS)
-  if (chromeos::IsKioskSession() || chromeos::IsManagedGuestSession()) {
-    if (DeviceLocalAccountExtensionInstallerLacros::Get()) {
-      external_loader =
-          DeviceLocalAccountExtensionInstallerLacros::Get()->extension_loader();
-      crx_location = ManifestLocation::kExternalPolicy;
-    } else {
-      CHECK_IS_TEST();
-    }
-  }
 #endif
 
   if (!external_loader.get()) {
@@ -721,10 +701,8 @@
     if (profiles::IsChromeAppKioskSession()) {
       ManifestLocation location = ManifestLocation::kExternalPolicy;
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
       if (!connector->IsDeviceEnterpriseManaged())
         location = ManifestLocation::kExternalPref;
-#endif
 
       auto kiosk_app_provider = std::make_unique<ExternalProviderImpl>(
           service,
@@ -750,7 +728,7 @@
       secondary_kiosk_app_provider->set_allow_updates(true);
       provider_list->push_back(std::move(secondary_kiosk_app_provider));
     }
-#endif
+#endif  // BUILDFLAG(IS_CHROMEOS)
     return;
   }
 
@@ -782,7 +760,7 @@
 #endif
   int bundled_extension_creation_flags = Extension::NO_FLAGS;
 #endif
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   bundled_extension_creation_flags = Extension::FROM_WEBSTORE |
       Extension::WAS_INSTALLED_BY_DEFAULT;
 
@@ -812,11 +790,9 @@
         ManifestLocation::kExternalPrefDownload, oem_extension_creation_flags));
   }
 
-#endif
+#endif  // BUILDFLAG(IS_CHROMEOS)
   if (!profile->GetPrefs()->GetBoolean(pref_names::kBlockExternalExtensions)) {
-// TODO(crbug.com/40118868): Revisit the macro expression once build flag switch
-// of lacros-chrome is complete.
-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
+#if BUILDFLAG(IS_LINUX)
     provider_list->push_back(std::make_unique<ExternalProviderImpl>(
         service,
         base::MakeRefCounted<ExternalPrefLoader>(
@@ -857,7 +833,7 @@
 #endif
   }
 
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
   // The pre-installed apps are installed as INTERNAL but use the external
   // extension installer codeflow.
   provider_list->push_back(std::make_unique<preinstalled_apps::Provider>(
diff --git a/chrome/browser/extensions/external_provider_impl_unittest.cc b/chrome/browser/extensions/external_provider_impl_unittest.cc
index 0be5290..c9fe6288 100644
--- a/chrome/browser/extensions/external_provider_impl_unittest.cc
+++ b/chrome/browser/extensions/external_provider_impl_unittest.cc
@@ -42,7 +42,7 @@
 #include "net/test/embedded_test_server/http_response.h"
 #include "testing/gmock/include/gmock/gmock.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/ash/customization/customization_document.h"
 #include "chrome/browser/ash/login/users/fake_chrome_user_manager.h"
 #include "chromeos/ash/components/system/fake_statistics_provider.h"
@@ -101,7 +101,7 @@
   ~ExternalProviderImplTest() override {}
 
   void InitService() {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
     user_manager::ScopedUserManager scoped_user_manager(
         std::make_unique<ash::FakeChromeUserManager>());
 #endif
@@ -237,7 +237,7 @@
   std::unique_ptr<base::ScopedPathOverride> external_externsions_overrides_;
   std::unique_ptr<ExtensionCacheFake> test_extension_cache_;
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // chromeos::ServicesCustomizationExternalLoader is hooked up as an
   // ExternalLoader and depends on a functioning StatisticsProvider.
   ash::system::ScopedFakeStatisticsProvider fake_statistics_provider_;
diff --git a/chrome/browser/extensions/forced_extensions/force_installed_metrics.cc b/chrome/browser/extensions/forced_extensions/force_installed_metrics.cc
index 5919e951..8b323ac 100644
--- a/chrome/browser/extensions/forced_extensions/force_installed_metrics.cc
+++ b/chrome/browser/extensions/forced_extensions/force_installed_metrics.cc
@@ -21,9 +21,9 @@
 #include "extensions/browser/install/sandboxed_unpacker_failure_reason.h"
 #include "extensions/browser/updater/extension_downloader.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/ash/profiles/profile_helper.h"
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 namespace extensions {
 
@@ -34,7 +34,7 @@
 // Timeout to report UMA if not all force-installed extension were loaded.
 constexpr base::TimeDelta kInstallationTimeout = base::Minutes(5);
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 // Converts user_manager::UserType to InstallStageTracker::UserType for
 // histogram purposes.
 ForceInstalledMetrics::UserType ConvertUserType(
@@ -83,7 +83,7 @@
         user_type);
   }
 }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 // Reports time taken for force installed extension during different
 // installation stages.
@@ -504,7 +504,7 @@
           "Extensions.OffStore_ForceInstalledFailureReason3", failure_reason);
     }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
     bool is_stuck_in_initial_creation_stage =
         failure_reason == FailureReason::IN_PROGRESS &&
         installation.install_stage == InstallStageTracker::Stage::CREATED &&
@@ -512,7 +512,7 @@
             InstallStageTracker::InstallCreationStage::
                 NOTIFIED_FROM_MANAGEMENT_INITIAL_CREATION_FORCED;
     ReportUserType(profile_, is_stuck_in_initial_creation_stage);
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
     LOG(WARNING) << "Forced extension " << extension_id
                  << " failed to install with data="
                  << InstallStageTracker::GetFormattedInstallationData(
diff --git a/chrome/browser/extensions/forced_extensions/force_installed_metrics_unittest.cc b/chrome/browser/extensions/forced_extensions/force_installed_metrics_unittest.cc
index 03dccc0..e656785b 100644
--- a/chrome/browser/extensions/forced_extensions/force_installed_metrics_unittest.cc
+++ b/chrome/browser/extensions/forced_extensions/force_installed_metrics_unittest.cc
@@ -37,13 +37,13 @@
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "ash/components/arc/arc_prefs.h"
 #include "chrome/browser/ash/login/users/fake_chrome_user_manager.h"
 #include "chrome/browser/ash/profiles/profile_helper.h"
 #include "components/user_manager/scoped_user_manager.h"
 #include "components/user_manager/user_names.h"
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 namespace {
 
@@ -112,13 +112,13 @@
     "Extensions.ForceInstalledManifestFetchFailedFetchTries";
 constexpr char kSandboxUnpackFailureReason[] =
     "Extensions.ForceInstalledFailureSandboxUnpackFailureReason2";
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 constexpr char kFailureSessionStats[] =
     "Extensions.ForceInstalledFailureSessionType";
 constexpr char kStuckInCreateStageSessionType[] =
     "Extensions.ForceInstalledFailureSessionType."
     "ExtensionStuckInInitialCreationStage";
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 constexpr char kPossibleNonMisconfigurationFailures[] =
     "Extensions.ForceInstalledSessionsWithNonMisconfigurationFailureOccured";
 constexpr char kDisableReason[] =
@@ -716,7 +716,7 @@
       kFailureReasonsCWS,
       InstallStageTracker::FailureReason::REPLACED_BY_SYSTEM_APP, 1);
   bool expected_non_misconfiguration_failure = true;
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   expected_non_misconfiguration_failure = false;
 #endif
   histogram_tester_.ExpectBucketCount(kPossibleNonMisconfigurationFailures,
@@ -895,7 +895,7 @@
       1);
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 TEST_F(ForceInstalledMetricsTest, ReportManagedGuestSessionOnExtensionFailure) {
   auto* fake_user_manager = new ash::FakeChromeUserManager();
   user_manager::ScopedUserManager scoped_user_manager(
@@ -988,7 +988,7 @@
       kStuckInCreateStageSessionType,
       ForceInstalledMetrics::UserType::USER_TYPE_GUEST, 1);
 }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 TEST_F(ForceInstalledMetricsTest, ExtensionsAreDownloading) {
   SetupForceList(ExtensionOrigin::kWebStore);
@@ -1428,7 +1428,7 @@
                                       1);
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 // Session in which either all the extensions installed successfully, or all
 // failures are admin-side misconfigurations. This test verifies that failure
 // REPLACED_BY_ARC_APP is not considered as misconfiguration when ARC++ is
@@ -1469,7 +1469,7 @@
   histogram_tester_.ExpectBucketCount(kPossibleNonMisconfigurationFailures, 1,
                                       1);
 }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 // Session in which either all the extensions installed successfully, or all
 // failures are admin-side misconfigurations. This test verifies that failure
diff --git a/chrome/browser/extensions/forced_extensions/force_installed_tracker.cc b/chrome/browser/extensions/forced_extensions/force_installed_tracker.cc
index 5fe8c35f..ed5347e 100644
--- a/chrome/browser/extensions/forced_extensions/force_installed_tracker.cc
+++ b/chrome/browser/extensions/forced_extensions/force_installed_tracker.cc
@@ -20,9 +20,9 @@
 #include "extensions/browser/pref_names.h"
 #include "extensions/common/extension_urls.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "ash/components/arc/arc_prefs.h"
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 namespace extensions {
 
@@ -252,7 +252,7 @@
     }
   }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // REPLACED_BY_SYSTEM_APP is a misconfiguration because these apps are legacy
   // apps and are replaced by system apps.
   if (installation_data.failure_reason ==
@@ -268,7 +268,7 @@
           InstallStageTracker::FailureReason::REPLACED_BY_ARC_APP) {
     return true;
   }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
   if (installation_data.failure_reason ==
       InstallStageTracker::FailureReason::NOT_PERFORMING_NEW_INSTALL) {
diff --git a/chrome/browser/extensions/forced_extensions/install_stage_tracker.cc b/chrome/browser/extensions/forced_extensions/install_stage_tracker.cc
index cbbac5f..6c3160ce 100644
--- a/chrome/browser/extensions/forced_extensions/install_stage_tracker.cc
+++ b/chrome/browser/extensions/forced_extensions/install_stage_tracker.cc
@@ -12,12 +12,12 @@
 #include "extensions/browser/install/sandboxed_unpacker_failure_reason.h"
 #include "net/base/net_errors.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/ash/profiles/profile_helper.h"
 #include "components/user_manager/user.h"          // nogncheck
 #include "components/user_manager/user_manager.h"  // nogncheck
 #include "components/user_manager/user_type.h"     // nogncheck
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 namespace extensions {
 
@@ -39,7 +39,7 @@
 
 }  // namespace
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 InstallStageTracker::UserInfo::UserInfo() = default;
 InstallStageTracker::UserInfo::UserInfo(const UserInfo&) = default;
 InstallStageTracker::UserInfo::UserInfo(user_manager::UserType user_type,
@@ -48,7 +48,7 @@
     : user_type(user_type),
       is_new_user(is_new_user),
       is_user_present(is_user_present) {}
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 // InstallStageTracker::InstallationData implementation.
 
@@ -134,7 +134,7 @@
   return InstallStageTrackerFactory::GetForBrowserContext(context);
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 InstallStageTracker::UserInfo InstallStageTracker::GetUserInfo(
     Profile* profile) {
   const user_manager::User* user =
@@ -147,7 +147,7 @@
   UserInfo current_user(user->GetType(), is_new_user, /*is_user_present=*/true);
   return current_user;
 }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 void InstallStageTracker::ReportInfoOnNoUpdatesFailure(
     const ExtensionId& id,
diff --git a/chrome/browser/extensions/forced_extensions/install_stage_tracker.h b/chrome/browser/extensions/forced_extensions/install_stage_tracker.h
index d932f95..e001cc57 100644
--- a/chrome/browser/extensions/forced_extensions/install_stage_tracker.h
+++ b/chrome/browser/extensions/forced_extensions/install_stage_tracker.h
@@ -22,9 +22,9 @@
 #include "extensions/common/extension_id.h"
 #include "extensions/common/manifest.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "components/user_manager/user_type.h"  // nogncheck
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 class Profile;
 
@@ -279,7 +279,7 @@
     kMaxValue = kBandwidthLimit,
   };
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // Contains information about the current user.
   struct UserInfo {
     UserInfo();
@@ -292,7 +292,7 @@
     const bool is_new_user = false;
     const bool is_user_present = false;
   };
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
   // Contains information about extension installation: failure reason, if any
   // reported, specific details in case of CRX install error, current
@@ -406,11 +406,11 @@
   // Returns instance of InstallStageTracker for a BrowserContext.
   static InstallStageTracker* Get(content::BrowserContext* context);
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // Returns user type of the user associated with the `profile` and whether the
   // user is new or not if there is an active user.
   static UserInfo GetUserInfo(Profile* profile);
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
   void ReportInfoOnNoUpdatesFailure(const ExtensionId& id,
                                     const std::string& info);
diff --git a/chrome/browser/extensions/installed_loader.cc b/chrome/browser/extensions/installed_loader.cc
index 10fe7f6d..0d1bea734 100644
--- a/chrome/browser/extensions/installed_loader.cc
+++ b/chrome/browser/extensions/installed_loader.cc
@@ -58,10 +58,10 @@
 #include "extensions/common/permissions/api_permission.h"
 #include "extensions/common/permissions/permissions_data.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/ash/profiles/profile_helper.h"
 #include "components/user_manager/user.h"
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 using content::BrowserThread;
 
diff --git a/chrome/browser/extensions/installed_loader_unittest.cc b/chrome/browser/extensions/installed_loader_unittest.cc
index df2901d2..d1807dbc 100644
--- a/chrome/browser/extensions/installed_loader_unittest.cc
+++ b/chrome/browser/extensions/installed_loader_unittest.cc
@@ -15,10 +15,10 @@
 #include "extensions/common/extension_builder.h"
 #include "extensions/common/extension_features.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/ash/login/users/fake_chrome_user_manager.h"
 #include "chrome/browser/ash/profiles/profile_helper.h"
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 namespace extensions {
 
diff --git a/chrome/browser/extensions/launch_util.cc b/chrome/browser/extensions/launch_util.cc
index 8727ec0..a439ffa 100644
--- a/chrome/browser/extensions/launch_util.cc
+++ b/chrome/browser/extensions/launch_util.cc
@@ -95,7 +95,7 @@
       // If the pref is set to launch a window (or no pref is set, and
       // window opening is the default), make the container a window.
       result = apps::LaunchContainer::kLaunchContainerWindow;
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
     } else if (prefs_launch_type == LAUNCH_TYPE_FULLSCREEN) {
       // LAUNCH_TYPE_FULLSCREEN launches in a maximized app window in ash.
       // For desktop chrome AURA on all platforms we should open the
diff --git a/chrome/browser/extensions/manifest_v2_experiment_manager_unittest.cc b/chrome/browser/extensions/manifest_v2_experiment_manager_unittest.cc
index 4f884e2..58dfeee 100644
--- a/chrome/browser/extensions/manifest_v2_experiment_manager_unittest.cc
+++ b/chrome/browser/extensions/manifest_v2_experiment_manager_unittest.cc
@@ -23,10 +23,10 @@
 #include "extensions/common/extension_features.h"
 #include "extensions/common/mojom/manifest.mojom.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "components/account_id/account_id.h"
 #include "components/user_manager/user.h"
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 namespace extensions {
 
@@ -46,7 +46,7 @@
     // testing PrefService.
     InitializeExtensionService(ExtensionServiceInitParams{});
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
     // Log in the user on CrOS. This is necessary for the profile to be
     // considered one that can install extensions, which itself is
     // necessary for metrics testing.
diff --git a/chrome/browser/extensions/policy_handlers.cc b/chrome/browser/extensions/policy_handlers.cc
index 64285c2..b09678e 100644
--- a/chrome/browser/extensions/policy_handlers.cc
+++ b/chrome/browser/extensions/policy_handlers.cc
@@ -39,10 +39,10 @@
 #include "base/enterprise_util.h"
 #endif
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/ash/crosapi/browser_util.h"
 #include "chrome/browser/extensions/extension_keeplist_chromeos.h"
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 namespace extensions {
 namespace {
@@ -72,7 +72,7 @@
   return update_gurl.SchemeIsHTTPOrHTTPS() || update_gurl.SchemeIsFile();
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 // If Ash Chrome is no longer functioning as a browser and the extension is not
 // meant to run in Ash, do not load the extension.
 void FilterOutExtensionsMeantToRunInLacros(base::Value::Dict& extensions) {
@@ -89,7 +89,7 @@
     }
   }
 }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 }  // namespace
 // ExtensionListPolicyHandler implementation -----------------------------------
@@ -135,10 +135,8 @@
 void ExtensionInstallForceListPolicyHandler::ApplyPolicySettings(
     const policy::PolicyMap& policies,
     PrefValueMap* prefs) {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   auto dict = GetAshPolicyDict(policies);
-#elif BUILDFLAG(IS_CHROMEOS_LACROS)
-  auto dict = GetLacrosPolicyDict(policies);
 #else
   auto dict = GetPolicyDict(policies);
 #endif
@@ -217,7 +215,7 @@
   return true;
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 std::optional<base::Value::Dict>
 ExtensionInstallForceListPolicyHandler::GetAshPolicyDict(
     const policy::PolicyMap& policies) {
@@ -229,17 +227,6 @@
 }
 #endif  // BUILDFLAG(IS_CHROMEOS)
 
-#if BUILDFLAG(IS_CHROMEOS)
-std::optional<base::Value::Dict>
-ExtensionInstallForceListPolicyHandler::GetLacrosPolicyDict(
-    const policy::PolicyMap& policies) {
-  // TODO(b/335121961): Currently always returns all extensions on Lacros,
-  // even the ones that run in Ash. This is consistent with the pre-existing
-  // behavior but it should be investigated if this is the correct behavior.
-  return GetPolicyDict(policies);
-}
-#endif  // BUILDFLAG(IS_CHROMEOS)
-
 std::optional<base::Value::Dict>
 ExtensionInstallForceListPolicyHandler::GetPolicyDict(
     const policy::PolicyMap& policies) {
@@ -271,14 +258,14 @@
 void ExtensionInstallBlockListPolicyHandler::ApplyPolicySettings(
     const policy::PolicyMap& policies,
     PrefValueMap* prefs) {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   if (crosapi::browser_util::IsLacrosEnabled()) {
     // When Lacros is enabled extensions are managed by Lacros, not Ash
     // (except for some very specific extensions, see `ExtensionsAppRunsInOS`
     // and `ExtensionsRunsInOS`), so keep the block list empty on the Ash side.
     return;
   }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
   list_handler_.ApplyPolicySettings(policies, prefs);
 }
diff --git a/chrome/browser/extensions/policy_handlers.h b/chrome/browser/extensions/policy_handlers.h
index 178da6a..eed0b70a 100644
--- a/chrome/browser/extensions/policy_handlers.h
+++ b/chrome/browser/extensions/policy_handlers.h
@@ -70,7 +70,7 @@
   void ApplyPolicySettings(const policy::PolicyMap& policies,
                            PrefValueMap* prefs) override;
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // Returns a `base::Value::Dict` with the extensions that must be force
   // installed in Ash. If Lacros is disabled this is the full extensions list,
   // and if Lacros is enabled this only contains the extensions that must run on
@@ -79,7 +79,7 @@
   // Returns nullopt if the policy is unset.
   std::optional<base::Value::Dict> GetAshPolicyDict(
       const policy::PolicyMap& policy_map);
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 #if BUILDFLAG(IS_CHROMEOS)
   // Returns a `base::Value::Dict` with the extensions that must be force
diff --git a/chrome/browser/extensions/policy_handlers_unittest.cc b/chrome/browser/extensions/policy_handlers_unittest.cc
index a12984f..843df8a 100644
--- a/chrome/browser/extensions/policy_handlers_unittest.cc
+++ b/chrome/browser/extensions/policy_handlers_unittest.cc
@@ -41,7 +41,7 @@
 #include "base/win/win_util.h"
 #endif
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "ash/constants/ash_switches.h"
 #include "base/test/scoped_command_line.h"
 #include "chrome/browser/ash/login/users/fake_chrome_user_manager.h"
@@ -622,7 +622,7 @@
   EXPECT_EQ(*sanitized_policy_result, *value);
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 class PolicyHandlerAshTest : public ::testing::Test {
  public:
   PolicyHandlerAshTest() = default;
@@ -825,6 +825,6 @@
 
   ASSERT_EQ(value->GetDict(), expected);
 }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 }  // namespace extensions
diff --git a/chrome/browser/extensions/pref_mapping.cc b/chrome/browser/extensions/pref_mapping.cc
index 8c597cb..717de97 100644
--- a/chrome/browser/extensions/pref_mapping.cc
+++ b/chrome/browser/extensions/pref_mapping.cc
@@ -24,14 +24,10 @@
 #include "components/spellcheck/browser/pref_names.h"
 #include "components/translate/core/browser/translate_pref_names.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/chromeos/extensions/controlled_pref_mapping.h"
 #endif
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-#include "base/containers/fixed_flat_map.h"
-#endif
-
 using extensions::mojom::APIPermissionID;
 
 namespace extensions {
@@ -103,7 +99,7 @@
 // feature being controlled exists in ash. They should be kept in sync/in order.
 // If a new extension-controlled pref of this type is added, it should be added
 // to both lists.
-#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS)
+#if BUILDFLAG(IS_CHROMEOS)
     {"autoclick", chromeos::prefs::kAccessibilityAutoclickEnabled,
      APIPermissionID::kAccessibilityFeaturesRead,
      APIPermissionID::kAccessibilityFeaturesModify},
@@ -213,52 +209,6 @@
   return identity_transformer_.get();
 }
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-// Given a pref name for an extension-controlled pref where the underlying
-// pref is controlled by ash, returns the PrefPath used by the crosapi to set
-// the pref in ash, or nullptr if no pref exists.
-crosapi::mojom::PrefPath PrefMapping::GetPrefPathForPrefName(
-    const std::string& pref_name) const {
-  static constexpr auto name_to_extension_prefpath = base::MakeFixedFlatMap<
-      std::string_view, crosapi::mojom::PrefPath>(
-      {{chromeos::prefs::kDockedMagnifierEnabled,
-        crosapi::mojom::PrefPath::kDockedMagnifierEnabled},
-       {chromeos::prefs::kAccessibilityAutoclickEnabled,
-        crosapi::mojom::PrefPath::kAccessibilityAutoclickEnabled},
-       {chromeos::prefs::kAccessibilityCaretHighlightEnabled,
-        crosapi::mojom::PrefPath::kAccessibilityCaretHighlightEnabled},
-       {chromeos::prefs::kAccessibilityCursorColorEnabled,
-        crosapi::mojom::PrefPath::kAccessibilityCursorColorEnabled},
-       {chromeos::prefs::kAccessibilityCursorHighlightEnabled,
-        crosapi::mojom::PrefPath::kAccessibilityCursorHighlightEnabled},
-       {chromeos::prefs::kAccessibilityDictationEnabled,
-        crosapi::mojom::PrefPath::kAccessibilityDictationEnabled},
-       {chromeos::prefs::kAccessibilityFocusHighlightEnabled,
-        crosapi::mojom::PrefPath::kAccessibilityFocusHighlightEnabled},
-       {chromeos::prefs::kAccessibilityHighContrastEnabled,
-        crosapi::mojom::PrefPath::kAccessibilityHighContrastEnabled},
-       {chromeos::prefs::kAccessibilityLargeCursorEnabled,
-        crosapi::mojom::PrefPath::kAccessibilityLargeCursorEnabled},
-       {chromeos::prefs::kAccessibilityScreenMagnifierEnabled,
-        crosapi::mojom::PrefPath::kAccessibilityScreenMagnifierEnabled},
-       {chromeos::prefs::kAccessibilitySelectToSpeakEnabled,
-        crosapi::mojom::PrefPath::kAccessibilitySelectToSpeakEnabled},
-       {chromeos::prefs::kAccessibilitySpokenFeedbackEnabled,
-        crosapi::mojom::PrefPath::kExtensionAccessibilitySpokenFeedbackEnabled},
-       {chromeos::prefs::kAccessibilityStickyKeysEnabled,
-        crosapi::mojom::PrefPath::kAccessibilityStickyKeysEnabled},
-       {chromeos::prefs::kAccessibilitySwitchAccessEnabled,
-        crosapi::mojom::PrefPath::kAccessibilitySwitchAccessEnabled},
-       {chromeos::prefs::kAccessibilityVirtualKeyboardEnabled,
-        crosapi::mojom::PrefPath::kAccessibilityVirtualKeyboardEnabled},
-       {proxy_config::prefs::kProxy, crosapi::mojom::PrefPath::kProxy}});
-  auto pref_iter = name_to_extension_prefpath.find(pref_name);
-  return pref_iter == name_to_extension_prefpath.end()
-             ? crosapi::mojom::PrefPath::kUnknown
-             : pref_iter->second;
-}
-#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
-
 PrefMapping::PrefMapping() {
   identity_transformer_ = std::make_unique<IdentityPrefTransformer>();
   for (const auto& pref : kMappings) {
diff --git a/chrome/browser/extensions/pref_mapping.h b/chrome/browser/extensions/pref_mapping.h
index f0a469f..6bd9f8db 100644
--- a/chrome/browser/extensions/pref_mapping.h
+++ b/chrome/browser/extensions/pref_mapping.h
@@ -14,10 +14,6 @@
 #include "build/build_config.h"
 #include "extensions/common/permissions/api_permission.h"
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-#include "chromeos/crosapi/mojom/prefs.mojom-shared.h"
-#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
-
 namespace extensions {
 
 class PrefTransformerInterface;
@@ -67,14 +63,6 @@
       const std::string& browser_pref,
       std::unique_ptr<PrefTransformerInterface> transformer);
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  // Given a pref name for an extension-controlled pref where the underlying
-  // pref is controlled by ash, returns the PrefPath used by the crosapi to set
-  // the pref in ash, or nullptr if no pref exists.
-  crosapi::mojom::PrefPath GetPrefPathForPrefName(
-      const std::string& pref_name) const;
-#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
-
  private:
   friend struct base::DefaultSingletonTraits<PrefMapping>;
 
diff --git a/chrome/browser/extensions/preference/preference_helpers.cc b/chrome/browser/extensions/preference/preference_helpers.cc
index 36b2f66..f0826016 100644
--- a/chrome/browser/extensions/preference/preference_helpers.cc
+++ b/chrome/browser/extensions/preference/preference_helpers.cc
@@ -143,43 +143,6 @@
   }
 }
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-void DispatchEventToExtensionsWithAshControlState(
-    Profile* profile,
-    events::HistogramValue histogram_value,
-    const std::string& event_name,
-    base::Value::List args,
-    mojom::APIPermissionID permission,
-    bool incognito,
-    const std::string& browser_pref,
-    crosapi::mojom::PrefControlState control_state) {
-  DispatchEventToExtensionsImpl(
-      profile, histogram_value, event_name, std::move(args), permission,
-      incognito, browser_pref,
-      base::BindRepeating(&GetLevelOfControlWithAshControlState,
-                          control_state));
-}
-
-const char* GetLevelOfControlWithAshControlState(
-    crosapi::mojom::PrefControlState control_state,
-    Profile* profile,
-    const ExtensionId& extension_id,
-    const std::string& browser_pref,
-    bool incognito) {
-  switch (control_state) {
-    case crosapi::mojom::PrefControlState::kNotExtensionControllable:
-      return preference_helpers::kNotControllable;
-    case crosapi::mojom::PrefControlState::kLacrosExtensionControllable:
-      return preference_helpers::kControllableByThisExtension;
-    case crosapi::mojom::PrefControlState::kLacrosExtensionControlled:
-    case crosapi::mojom::PrefControlState::kNotExtensionControlledPrefPath:
-    case crosapi::mojom::PrefControlState::kDefaultUnknown:
-      return extensions::preference_helpers::GetLevelOfControl(
-          profile, extension_id, browser_pref, incognito);
-  }
-}
-#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
-
 void DispatchEventToExtensions(Profile* profile,
                                events::HistogramValue histogram_value,
                                const std::string& event_name,
diff --git a/chrome/browser/extensions/preference/preference_helpers.h b/chrome/browser/extensions/preference/preference_helpers.h
index b28eeb2..6d81f095 100644
--- a/chrome/browser/extensions/preference/preference_helpers.h
+++ b/chrome/browser/extensions/preference/preference_helpers.h
@@ -14,11 +14,6 @@
 #include "extensions/common/mojom/api_permission_id.mojom-shared.h"
 #include "extensions/common/permissions/permission_set.h"
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-#include "chromeos/crosapi/mojom/prefs.mojom-shared.h"
-#include "chromeos/crosapi/mojom/prefs.mojom.h"
-#endif
-
 class PrefService;
 class Profile;
 
@@ -32,30 +27,6 @@
                               const std::string& browser_pref,
                               bool incognito);
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-// As GetLevelOfControl, but additionally considers the ash state of the pref.
-// This is relevant when the underlying preference lives in ash. Note that when
-// the ash state is kDefaultUnknown this is equivalent to GetLevelOfControl.
-const char* GetLevelOfControlWithAshControlState(
-    crosapi::mojom::PrefControlState control_state,
-    Profile* profile,
-    const ExtensionId& extension_id,
-    const std::string& browser_pref,
-    bool incognito);
-
-// As DispatchEventToExtensions, but additionally considers the ash state of the
-// pref.
-void DispatchEventToExtensionsWithAshControlState(
-    Profile* profile,
-    events::HistogramValue histogram_value,
-    const std::string& event_name,
-    base::Value::List args,
-    mojom::APIPermissionID permission,
-    bool incognito,
-    const std::string& browser_pref,
-    crosapi::mojom::PrefControlState control_state);
-#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
-
 // Dispatches |event_name| to extensions listening to the event and holding
 // |permission|. |args| is passed as arguments to the event listener.  A
 // key-value for the level of control the extension has over |browser_pref| is
diff --git a/chrome/browser/extensions/preinstalled_apps_unittest.cc b/chrome/browser/extensions/preinstalled_apps_unittest.cc
index 0460272..0bc6e6a 100644
--- a/chrome/browser/extensions/preinstalled_apps_unittest.cc
+++ b/chrome/browser/extensions/preinstalled_apps_unittest.cc
@@ -42,7 +42,7 @@
   content::BrowserTaskEnvironment task_environment_;
 };
 
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
 // Chrome OS has different way of installing pre-installed apps.
 // Android does not currently support installing apps via Chrome.
 TEST_F(PreinstalledAppsTest, Install) {
diff --git a/chrome/browser/extensions/process_manager_browsertest.cc b/chrome/browser/extensions/process_manager_browsertest.cc
index 9ee8955..3060dbe 100644
--- a/chrome/browser/extensions/process_manager_browsertest.cc
+++ b/chrome/browser/extensions/process_manager_browsertest.cc
@@ -66,7 +66,7 @@
 #include "net/test/embedded_test_server/embedded_test_server.h"
 #include "url/origin.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "ash/constants/ash_switches.h"
 #include "chrome/browser/ash/profiles/profile_helper.h"
 #endif
@@ -315,7 +315,7 @@
 class DefaultProfileExtensionBrowserTest : public ExtensionBrowserTest {
  protected:
   DefaultProfileExtensionBrowserTest() {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
     // We want signin profile on ChromeOS, not logged in user profile.
     set_chromeos_user_ = false;
 #endif
@@ -324,7 +324,7 @@
  private:
   void SetUpCommandLine(base::CommandLine* command_line) override {
     ExtensionBrowserTest::SetUpCommandLine(command_line);
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
     command_line->AppendSwitch(ash::switches::kLoginManager);
     command_line->AppendSwitch(ash::switches::kForceLoginManagerInTests);
 #endif
@@ -344,7 +344,7 @@
   // the signin profile (profile()) is the off-the-record version.
   Profile* original = profile()->GetOriginalProfile();
   Profile* otr = original->GetPrimaryOTRProfile(/*create_if_needed=*/true);
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   EXPECT_EQ(profile(), otr);
   EXPECT_TRUE(ash::ProfileHelper::IsSigninProfile(original));
 #endif
@@ -402,13 +402,7 @@
 // Test that loading an extension with a browser action does not create a
 // background page and that clicking on the action creates the appropriate
 // ExtensionHost.
-// TODO(http://crbug.com/1271329): Times out frequently on Lacros.
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-#define MAYBE_PopupHostCreation DISABLED_PopupHostCreation
-#else
-#define MAYBE_PopupHostCreation PopupHostCreation
-#endif
-IN_PROC_BROWSER_TEST_F(ProcessManagerBrowserTest, MAYBE_PopupHostCreation) {
+IN_PROC_BROWSER_TEST_F(ProcessManagerBrowserTest, PopupHostCreation) {
   ProcessManager* pm = ProcessManager::Get(profile());
 
   // Load an extension with the ability to open a popup but no background
diff --git a/chrome/browser/extensions/profile_util.cc b/chrome/browser/extensions/profile_util.cc
index 3c6f3b0a..20773f22 100644
--- a/chrome/browser/extensions/profile_util.cc
+++ b/chrome/browser/extensions/profile_util.cc
@@ -8,14 +8,14 @@
 #include "chrome/browser/profiles/profile.h"
 #include "components/user_manager/user.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/ash/profiles/profile_helper.h"
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 namespace extensions::profile_util {
 
 bool ProfileCanUseNonComponentExtensions(const Profile* profile) {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   if (!profile || !ash::ProfileHelper::IsUserProfile(profile)) {
     return false;
   }
@@ -49,6 +49,6 @@
   }
   return profile->IsRegularProfile();
 }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 }  // namespace extensions::profile_util
diff --git a/chrome/browser/extensions/profile_util_unittest.cc b/chrome/browser/extensions/profile_util_unittest.cc
index 6752b14..06a1834c 100644
--- a/chrome/browser/extensions/profile_util_unittest.cc
+++ b/chrome/browser/extensions/profile_util_unittest.cc
@@ -9,10 +9,10 @@
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/test/base/testing_profile.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "components/account_id/account_id.h"
 #include "components/user_manager/user.h"
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 using extensions::profile_util::ProfileCanUseNonComponentExtensions;
 
@@ -26,7 +26,7 @@
   }
 };
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 TEST_F(ProfileUtilUnitTest, ProfileCanUseNonComponentExtensions_RegularUser) {
   ASSERT_NO_FATAL_FAILURE(LoginChromeOSAshUser(
       GetFakeUserManager()->AddUser(account_id_), account_id_));
@@ -110,6 +110,6 @@
   ASSERT_TRUE(otr_test_profile);
   EXPECT_FALSE(ProfileCanUseNonComponentExtensions(otr_test_profile));
 }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 }  // namespace extensions
diff --git a/chrome/browser/extensions/system_display/display_info_provider_chromeos.cc b/chrome/browser/extensions/system_display/display_info_provider_chromeos.cc
index 1e6535a..2e1700e 100644
--- a/chrome/browser/extensions/system_display/display_info_provider_chromeos.cc
+++ b/chrome/browser/extensions/system_display/display_info_provider_chromeos.cc
@@ -8,11 +8,7 @@
 #include <stdint.h>
 #include <cmath>
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
 #include "ash/public/ash_interfaces.h"
-#elif BUILDFLAG(IS_CHROMEOS_LACROS)
-#include "chromeos/lacros/lacros_service.h"
-#endif
 
 #include "base/functional/bind.h"
 #include "chrome/browser/extensions/system_display/display_info_provider.h"
@@ -439,8 +435,6 @@
   DispatchOnDisplayChangedEvent();
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-
 std::unique_ptr<DisplayInfoProvider> CreateChromeDisplayInfoProvider() {
   mojo::PendingRemote<crosapi::mojom::CrosDisplayConfigController>
       display_config;
@@ -450,25 +444,4 @@
       std::move(display_config));
 }
 
-#elif BUILDFLAG(IS_CHROMEOS_LACROS)
-
-std::unique_ptr<DisplayInfoProvider> CreateChromeDisplayInfoProvider() {
-  // Assume that LacrosService has already been initialized.
-  auto* lacros_service = chromeos::LacrosService::Get();
-  if (lacros_service &&
-      lacros_service
-          ->IsAvailable<crosapi::mojom::CrosDisplayConfigController>()) {
-    auto& remote =
-        lacros_service
-            ->GetRemote<crosapi::mojom::CrosDisplayConfigController>();
-    return std::make_unique<DisplayInfoProviderChromeOS>(remote.Unbind());
-  }
-
-  LOG(ERROR) << "Cannot create a DisplayInfoProvider instance in Lacros. "
-                "CrosDisplayConfigController interface is not available.";
-  return nullptr;
-}
-
-#endif
-
 }  // namespace extensions
diff --git a/chrome/browser/extensions/test_extension_environment.cc b/chrome/browser/extensions/test_extension_environment.cc
index be6870a5..57200f4 100644
--- a/chrome/browser/extensions/test_extension_environment.cc
+++ b/chrome/browser/extensions/test_extension_environment.cc
@@ -22,7 +22,7 @@
 #include "extensions/common/extension_builder.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/ash/login/users/user_manager_delegate_impl.h"
 #include "chrome/browser/ash/settings/device_settings_service.h"
 #include "chrome/browser/ash/settings/scoped_cros_settings_test_helper.h"
@@ -62,7 +62,7 @@
 
 }  // namespace
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 // Extra environment state required for ChromeOS.
 class TestExtensionEnvironment::ChromeOSEnv {
  public:
@@ -78,7 +78,7 @@
           g_browser_process->local_state(),
           ash::CrosSettings::Get())};
 };
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 // static
 ExtensionService* TestExtensionEnvironment::CreateExtensionServiceForProfile(
@@ -92,7 +92,7 @@
 TestExtensionEnvironment::TestExtensionEnvironment(
     Type type,
     ProfileCreationType profile_creation_mode
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
     ,
     OSSetupType os_setup_mode
 #endif
@@ -101,7 +101,7 @@
           type == Type::kWithTaskEnvironment
               ? std::make_unique<content::BrowserTaskEnvironment>()
               : nullptr),
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
       chromeos_env_(ash::DeviceSettingsService::IsInitialized() &&
                             os_setup_mode != OSSetupType::kSetUp
                         ? nullptr
diff --git a/chrome/browser/extensions/test_extension_environment.h b/chrome/browser/extensions/test_extension_environment.h
index fed468a1..d201bb40 100644
--- a/chrome/browser/extensions/test_extension_environment.h
+++ b/chrome/browser/extensions/test_extension_environment.h
@@ -59,7 +59,7 @@
     kCreate,
   };
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   enum class OSSetupType {
     kNoSetUp,
     kSetUp,
@@ -69,7 +69,7 @@
   explicit TestExtensionEnvironment(
       Type type = Type::kWithTaskEnvironment,
       ProfileCreationType profile_creation_type = ProfileCreationType::kCreate
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
       ,
       OSSetupType os_setup_type = OSSetupType::kSetUp
 #endif
@@ -126,7 +126,7 @@
   // |profile_| and destroyed after |profile_|.
   const std::unique_ptr<content::BrowserTaskEnvironment> task_environment_;
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   const std::unique_ptr<ChromeOSEnv> chromeos_env_;
 #endif
 
diff --git a/chrome/browser/extensions/test_extension_system.cc b/chrome/browser/extensions/test_extension_system.cc
index 77715ed..1127f7b 100644
--- a/chrome/browser/extensions/test_extension_system.cc
+++ b/chrome/browser/extensions/test_extension_system.cc
@@ -35,7 +35,7 @@
 #include "extensions/browser/state_store.h"
 #include "extensions/browser/user_script_manager.h"
 #include "services/data_decoder/data_decoder_service.h"
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "components/user_manager/fake_user_manager.h"
 #include "components/user_manager/scoped_user_manager.h"
 #include "components/user_manager/user_manager.h"
@@ -125,13 +125,13 @@
     bool extensions_enabled) {
   if (CWSInfoService::Get(profile_) == nullptr) {
     Profile* profile = profile_;
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
     // TODO(crbug.com/40891982): Refactor this convenience upstream to test
     // callers. Possibly just BuiltInAppTest.BuildGuestMode.
     if (profile_->IsGuestSession()) {
       profile = profile_->GetOriginalProfile();
     }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
     // Associate a dummy CWSInfoService with this profile if necessary.
     CWSInfoServiceFactory::GetInstance()->SetTestingFactory(
         profile, base::BindRepeating(&BuildFakeCWSService));
diff --git a/chrome/browser/extensions/test_extension_system.h b/chrome/browser/extensions/test_extension_system.h
index fa46973..b05c657 100644
--- a/chrome/browser/extensions/test_extension_system.h
+++ b/chrome/browser/extensions/test_extension_system.h
@@ -14,7 +14,7 @@
 #include "extensions/browser/extension_system.h"
 #include "services/data_decoder/public/cpp/test_support/in_process_data_decoder.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "components/user_manager/scoped_user_manager.h"
 #endif
 
diff --git a/chrome/browser/extensions/update_install_gate_unittest.cc b/chrome/browser/extensions/update_install_gate_unittest.cc
index 37a0beb..cdc3fa46 100644
--- a/chrome/browser/extensions/update_install_gate_unittest.cc
+++ b/chrome/browser/extensions/update_install_gate_unittest.cc
@@ -30,7 +30,7 @@
 #include "extensions/common/manifest_handlers/background_info.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/ash/login/users/fake_chrome_user_manager.h"
 #include "components/user_manager/scoped_user_manager.h"
 #endif
@@ -111,7 +111,7 @@
     ASSERT_TRUE(profile_manager_->SetUp());
 
     const char kUserProfile[] = "profile1@example.com";
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
     const AccountId account_id(AccountId::FromUserEmail(kUserProfile));
     // Needed to allow ChromeProcessManagerDelegate to allow background pages.
     fake_user_manager_ = new ash::FakeChromeUserManager();
@@ -224,7 +224,7 @@
   raw_ptr<ExtensionRegistry, DanglingUntriaged> registry_ = nullptr;
   raw_ptr<EventRouter, DanglingUntriaged> event_router_ = nullptr;
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // Needed for creating ExtensionService.
   raw_ptr<ash::FakeChromeUserManager, DanglingUntriaged> fake_user_manager_ =
       nullptr;
diff --git a/chrome/browser/extensions/updater/extension_updater.cc b/chrome/browser/extensions/updater/extension_updater.cc
index 56f5fbf7..a64b8d8 100644
--- a/chrome/browser/extensions/updater/extension_updater.cc
+++ b/chrome/browser/extensions/updater/extension_updater.cc
@@ -54,11 +54,11 @@
 #include "extensions/common/manifest_constants.h"
 #include "extensions/common/manifest_url_handlers.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chromeos/ash/components/settings/cros_settings.h"
 #include "chromeos/ash/components/settings/cros_settings_names.h"
 #include "components/user_manager/user_manager.h"
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 using base::RandDouble;
 using base::UnguessableToken;
@@ -318,7 +318,7 @@
   // In Kiosk mode extensions are downloaded and updated by the ExternalCache.
   // Therefore we skip updates here to avoid conflicts.
   bool kiosk_crx_manifest_update_url_ignored = false;
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   user_manager::UserManager* user_manager = user_manager::UserManager::Get();
   if (user_manager && user_manager->IsLoggedInAsKioskApp()) {
     ash::CrosSettings::Get()->GetBoolean(
diff --git a/chrome/browser/extensions/updater/extension_updater_unittest.cc b/chrome/browser/extensions/updater/extension_updater_unittest.cc
index 73002c8..743cf77 100644
--- a/chrome/browser/extensions/updater/extension_updater_unittest.cc
+++ b/chrome/browser/extensions/updater/extension_updater_unittest.cc
@@ -98,7 +98,7 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #include "url/third_party/mozilla/url_parse.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "base/files/scoped_temp_dir.h"
 #include "chrome/browser/ash/login/users/user_manager_delegate_impl.h"
 #include "chrome/browser/ash/settings/scoped_cros_settings_test_helper.h"
@@ -1551,7 +1551,7 @@
     EXPECT_TRUE(base::TouchFile(file, timestamp, timestamp));
   }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // This tests the condition when the entry for the crx file is already
   // present in the cache but the crx file is itself corrupted. In this case,
   // after detecting the corruption of the crx file, it's entry should be
@@ -2323,7 +2323,7 @@
 
   ScopedTestingLocalState testing_local_state_;
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   ash::ScopedCrosSettingsTestHelper cros_settings_test_helper_;
   user_manager::ScopedUserManager user_manager_{
       std::make_unique<user_manager::UserManagerImpl>(
@@ -2418,7 +2418,7 @@
   TestSingleExtensionDownloading(true, false, true);
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 TEST_F(ExtensionUpdaterTest, TestCacheCorruptionCrxDownload) {
   TestCacheCorruption();
 }
diff --git a/chrome/browser/extensions/updater/update_service_browsertest.cc b/chrome/browser/extensions/updater/update_service_browsertest.cc
index 0b30e19..b390ba0 100644
--- a/chrome/browser/extensions/updater/update_service_browsertest.cc
+++ b/chrome/browser/extensions/updater/update_service_browsertest.cc
@@ -40,7 +40,7 @@
 #include "extensions/common/extension_urls.h"
 #include "extensions/common/mojom/manifest.mojom-shared.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chromeos/ash/components/install_attributes/stub_install_attributes.h"
 #endif
 
@@ -542,7 +542,7 @@
   std::string id_ = "aohghmighlieiainnegkcijnfilokake";
 
  private:
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // Set up managed environment.
   std::unique_ptr<ash::ScopedStubInstallAttributes> install_attributes_ =
       std::make_unique<ash::ScopedStubInstallAttributes>(
diff --git a/chrome/browser/extensions/user_script_listener_unittest.cc b/chrome/browser/extensions/user_script_listener_unittest.cc
index b6c6ab6..d984cd52 100644
--- a/chrome/browser/extensions/user_script_listener_unittest.cc
+++ b/chrome/browser/extensions/user_script_listener_unittest.cc
@@ -38,7 +38,7 @@
 #include "extensions/common/url_pattern_set.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/ash/login/users/fake_chrome_user_manager.h"
 #include "components/user_manager/scoped_user_manager.h"
 #endif
@@ -98,7 +98,7 @@
   UserScriptListenerTest& operator=(const UserScriptListenerTest&) = delete;
 
   void SetUp() override {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
     user_manager_enabler_ = std::make_unique<user_manager::ScopedUserManager>(
         std::make_unique<ash::FakeChromeUserManager>());
 #endif
@@ -178,7 +178,7 @@
   raw_ptr<ExtensionService> service_ = nullptr;
   bool was_navigation_resumed_ = false;
   std::unique_ptr<content::WebContents> web_contents_;
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   std::unique_ptr<user_manager::ScopedUserManager> user_manager_enabler_;
 #endif
 };
diff --git a/chrome/browser/extensions/window_open_apitest.cc b/chrome/browser/extensions/window_open_apitest.cc
index ae838340..c672c12 100644
--- a/chrome/browser/extensions/window_open_apitest.cc
+++ b/chrome/browser/extensions/window_open_apitest.cc
@@ -39,6 +39,7 @@
 #include "ui/base/base_window.h"
 
 #if BUILDFLAG(IS_CHROMEOS)
+#include "ash/wm/window_pin_util.h"
 #include "chrome/app/chrome_command_ids.h"
 #include "chrome/browser/extensions/window_controller.h"
 #include "chrome/browser/extensions/window_controller_list.h"
@@ -47,12 +48,6 @@
 #include "ui/aura/window.h"
 #endif
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-#include "chrome/browser/ui/lacros/window_properties.h"
-#else
-#include "ash/wm/window_pin_util.h"
-#endif
-
 using content::OpenURLParams;
 using content::Referrer;
 using content::WebContents;
@@ -369,28 +364,17 @@
     }
   }
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  if (!controller || !controller->window())
-    return nullptr;
-#else
   EXPECT_TRUE(controller);
-#endif
+
   return controller->window()->GetNativeWindow();
 }
 
 chromeos::WindowPinType GetCurrentWindowPinType() {
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  chromeos::WindowPinType type =
-      GetCurrentWindow()->GetProperty(lacros::kWindowPinTypeKey);
-#else
   chromeos::WindowPinType type = GetWindowPinType(GetCurrentWindow());
-#endif
+
   return type;
 }
 
-// Disabling this test temporarily - Ash needs to be built to make this test
-// work. Will enable after this landed.
-#if !BUILDFLAG(IS_CHROMEOS_LACROS)
 void SetCurrentWindowPinType(chromeos::WindowPinType type) {
   if (type == chromeos::WindowPinType::kNone) {
     UnpinWindow(GetCurrentWindow());
@@ -398,13 +382,9 @@
     PinWindow(GetCurrentWindow(), /*trusted=*/true);
   }
 }
-#endif
 
 }  // namespace
 
-// Disabling this test temporarily - Ash needs to be built to make this test
-// work. Will enable after this landed.
-#if !BUILDFLAG(IS_CHROMEOS_LACROS)
 IN_PROC_BROWSER_TEST_F(WindowOpenApiTest, OpenLockedFullscreenWindow) {
   ASSERT_TRUE(RunExtensionTest("locked_fullscreen/with_permission",
                                {.custom_arg = "openLockedFullscreenWindow"}))
@@ -414,17 +394,8 @@
   // it's in locked fullscreen mode).
   EXPECT_EQ(chromeos::WindowPinType::kTrustedPinned, GetCurrentWindowPinType());
 }
-#endif  // !BUILDFLAG(IS_CHROMEOS_LACROS)
 
-// Disabled on Lacros due to flaky. crbug.com/1254453
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-#define MAYBE_UpdateWindowToLockedFullscreen \
-  DISABLED_UpdateWindowToLockedFullscreen
-#else
-#define MAYBE_UpdateWindowToLockedFullscreen UpdateWindowToLockedFullscreen
-#endif
-IN_PROC_BROWSER_TEST_F(WindowOpenApiTest,
-                       MAYBE_UpdateWindowToLockedFullscreen) {
+IN_PROC_BROWSER_TEST_F(WindowOpenApiTest, UpdateWindowToLockedFullscreen) {
   ASSERT_TRUE(
       RunExtensionTest("locked_fullscreen/with_permission",
                        {.custom_arg = "updateWindowToLockedFullscreen"}))
@@ -434,9 +405,6 @@
   EXPECT_EQ(chromeos::WindowPinType::kTrustedPinned, GetCurrentWindowPinType());
 }
 
-// Disabling this test temporarily - Ash needs to be built to make this test
-// work. Will enable after this landed.
-#if !BUILDFLAG(IS_CHROMEOS_LACROS)
 IN_PROC_BROWSER_TEST_F(WindowOpenApiTest, RemoveLockedFullscreenFromWindow) {
   // After locking the window, do a LockedFullscreenStateChanged so the
   // command_controller state catches up as well.
@@ -451,7 +419,6 @@
   // Make sure the current window is removed from locked-fullscreen state.
   EXPECT_EQ(chromeos::WindowPinType::kNone, GetCurrentWindowPinType());
 }
-#endif  // !BUILDFLAG(IS_CHROMEOS_LACROS)
 
 // Make sure that commands disabling code works in locked fullscreen mode.
 IN_PROC_BROWSER_TEST_F(WindowOpenApiTest, VerifyCommandsInLockedFullscreen) {
@@ -488,16 +455,8 @@
   EXPECT_EQ(1u, extensions::WindowControllerList::GetInstance()->size());
 }
 
-// Disabled on Lacros due to flaky. crbug.com/1254453
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-#define MAYBE_UpdateWindowToLockedFullscreenWithoutPermission \
-  DISABLED_UpdateWindowToLockedFullscreenWithoutPermission
-#else
-#define MAYBE_UpdateWindowToLockedFullscreenWithoutPermission \
-  UpdateWindowToLockedFullscreenWithoutPermission
-#endif
 IN_PROC_BROWSER_TEST_F(WindowOpenApiTest,
-                       MAYBE_UpdateWindowToLockedFullscreenWithoutPermission) {
+                       UpdateWindowToLockedFullscreenWithoutPermission) {
   ASSERT_TRUE(
       RunExtensionTest("locked_fullscreen/without_permission",
                        {.custom_arg = "updateWindowToLockedFullscreen"}))
@@ -508,9 +467,6 @@
   EXPECT_EQ(chromeos::WindowPinType::kNone, GetCurrentWindowPinType());
 }
 
-// Disabling this test temporarily - Ash needs to be built to make this test
-// work. Will enable after this landed.
-#if !BUILDFLAG(IS_CHROMEOS_LACROS)
 IN_PROC_BROWSER_TEST_F(WindowOpenApiTest,
                        RemoveLockedFullscreenFromWindowWithoutPermission) {
   SetCurrentWindowPinType(chromeos::WindowPinType::kTrustedPinned);
@@ -524,7 +480,6 @@
   // The current window is still locked-fullscreen.
   EXPECT_EQ(chromeos::WindowPinType::kTrustedPinned, GetCurrentWindowPinType());
 }
-#endif  // !BUILDFLAG(IS_CHROMEOS_LACROS)
 #endif  // BUILDFLAG(IS_CHROMEOS)
 
 #if !BUILDFLAG(IS_CHROMEOS)
diff --git a/chrome/browser/extensions/zipfile_installer_unittest.cc b/chrome/browser/extensions/zipfile_installer_unittest.cc
index 1d994b53..36f8137 100644
--- a/chrome/browser/extensions/zipfile_installer_unittest.cc
+++ b/chrome/browser/extensions/zipfile_installer_unittest.cc
@@ -39,7 +39,7 @@
 #include "services/data_decoder/public/cpp/test_support/in_process_data_decoder.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/ash/settings/scoped_cros_settings_test_helper.h"
 #endif
 
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index f2c7324d6..253fc84 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -5465,6 +5465,11 @@
     "expiry_milestone": 140
   },
   {
+    "name": "ios-password-suggestion-bottom-sheet-v2",
+    "owners": [ "vincb@google.com", "tmartino@google.com", "bling-transactions@google.com"],
+    "expiry_milestone": 135
+  },
+  {
     "name": "ios-price-tracking-notification-promo-card",
     "owners": [
       "davidjm@google.com",
diff --git a/chrome/browser/flags/android/chrome_feature_list.cc b/chrome/browser/flags/android/chrome_feature_list.cc
index b912055a..ad5fccf 100644
--- a/chrome/browser/flags/android/chrome_feature_list.cc
+++ b/chrome/browser/flags/android/chrome_feature_list.cc
@@ -100,7 +100,6 @@
     &autofill::features::kAutofillEnableSecurityTouchEventFilteringAndroid,
     &autofill::features::kAutofillEnableVerveCardSupport,
     &autofill::features::kAutofillVirtualViewStructureAndroid,
-    &autofill::features::kAutofillEnableMovingGPayLogoToTheRightOnClank,
     &autofill::features::kAutofillEnableCvcStorageAndFilling,
     &autofill::features::kAutofillEnableSaveCardLoadingAndConfirmation,
     &autofill::features::kAutofillEnableSyncingOfPixBankAccounts,
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
index fad4d511..c93e7c2 100644
--- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
+++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
@@ -193,8 +193,6 @@
             "AutofillEnableCardBenefitsForCapitalOne";
     public static final String AUTOFILL_ENABLE_CARD_PRODUCT_NAME = "AutofillEnableCardProductName";
     public static final String AUTOFILL_ENABLE_LOCAL_IBAN = "AutofillEnableLocalIban";
-    public static final String AUTOFILL_ENABLE_MOVING_GPAY_LOGO_TO_THE_RIGHT_ON_CLANK =
-            "AutofillEnableMovingGPayLogoToTheRightOnClank";
     public static final String AUTOFILL_ENABLE_NEW_CARD_ART_AND_NETWORK_IMAGES =
             "AutofillEnableNewCardArtAndNetworkImages";
     public static final String AUTOFILL_ENABLE_SERVER_IBAN = "AutofillEnableServerIban";
diff --git a/chrome/browser/new_tab_page/modules/v2/most_relevant_tab_resumption/most_relevant_tab_resumption_page_handler.cc b/chrome/browser/new_tab_page/modules/v2/most_relevant_tab_resumption/most_relevant_tab_resumption_page_handler.cc
index 313f179..83a06bfa 100644
--- a/chrome/browser/new_tab_page/modules/v2/most_relevant_tab_resumption/most_relevant_tab_resumption_page_handler.cc
+++ b/chrome/browser/new_tab_page/modules/v2/most_relevant_tab_resumption/most_relevant_tab_resumption_page_handler.cc
@@ -483,10 +483,7 @@
   if (val) {
     base::Time ts = base::Time::FromDeltaSinceWindowsEpoch(
         base::Microseconds(val->GetDouble() + 10000));
-    if (ts.is_null()) {
-      return true;
-    }
-
+    DCHECK(!ts.is_null());
     return timestamp > ts;
   }
 
diff --git a/chrome/browser/optimization_guide/model_validator_keyed_service.cc b/chrome/browser/optimization_guide/model_validator_keyed_service.cc
index 08e50149..b50b6162 100644
--- a/chrome/browser/optimization_guide/model_validator_keyed_service.cc
+++ b/chrome/browser/optimization_guide/model_validator_keyed_service.cc
@@ -180,6 +180,8 @@
   // TODO: b/345495541 - Add support for conducting inference within a loop.
   // For now, we are just using the first request in the ModelValidationInput.
   auto request = input->requests(0);
+  auto request_copy =
+      std::make_unique<optimization_guide::proto::ExecuteRequest>(request);
   auto capability_key = ToModelBasedCapabilityKey(request.feature());
 
   on_device_validation_session_ =
@@ -190,27 +192,29 @@
   base::SequencedTaskRunner::GetCurrentDefault()->PostDelayedTask(
       FROM_HERE,
       base::BindOnce(&ModelValidatorKeyedService::ExecuteModel,
-                     weak_ptr_factory_.GetWeakPtr(), std::move(metadata)),
+                     weak_ptr_factory_.GetWeakPtr(), std::move(request_copy)),
       base::Seconds(30));
 }
 
 void ModelValidatorKeyedService::ExecuteModel(
-    std::unique_ptr<google::protobuf::MessageLite> request_metadata) {
+    std::unique_ptr<optimization_guide::proto::ExecuteRequest> request) {
   DCHECK(on_device_validation_session_);
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DCHECK(request_metadata);
+  DCHECK(request);
+
+  auto metadata = GetProtoFromAny(request->request_metadata());
   on_device_validation_session_->ExecuteModel(
-      *request_metadata,
-      base::RepeatingCallback(base::BindRepeating(
-          &ModelValidatorKeyedService::OnDeviceModelExecuteResponse,
-          weak_ptr_factory_.GetWeakPtr())));
+      *metadata, base::BindRepeating(
+                     &ModelValidatorKeyedService::OnDeviceModelExecuteResponse,
+                     weak_ptr_factory_.GetWeakPtr(), std::move(request)));
 }
 
 void ModelValidatorKeyedService::OnDeviceModelExecuteResponse(
+    const std::unique_ptr<optimization_guide::proto::ExecuteRequest>& request,
     OptimizationGuideModelStreamingExecutionResult result) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
-  if (!result.response.has_value() || !result.response->is_complete) {
+  if (!result.response->is_complete) {
     return;
   }
   // Complete responses with empty log entry indicate errors.
@@ -218,8 +222,17 @@
     LOCAL_HISTOGRAM_BOOLEAN(kModelValidationErrorHistogramString, true);
   }
   proto::ModelValidationOutput output;
-  output.add_log_ai_data_requests()->CopyFrom(
-      *result.log_entry->log_ai_data_request());
+  optimization_guide::proto::ModelCall* model_call = output.add_model_calls();
+  model_call->mutable_request()->CopyFrom(*request);
+  optimization_guide::proto::ModelExecutionInfo* model_execution_info =
+      model_call->mutable_model_execution_info();
+  if (result.response.has_value()) {
+    model_call->mutable_response()->CopyFrom(result.response.value().response);
+  } else {
+    model_execution_info->set_model_execution_error_enum(
+        static_cast<uint32_t>(result.response.error().error()));
+  }
+  // TODO(crbug.com/372535824): store on-device execution log.
 
   auto out_file = switches::GetOnDeviceValidationWriteToFile();
   if (!out_file) {
diff --git a/chrome/browser/optimization_guide/model_validator_keyed_service.h b/chrome/browser/optimization_guide/model_validator_keyed_service.h
index 7d6c7950..415ae21 100644
--- a/chrome/browser/optimization_guide/model_validator_keyed_service.h
+++ b/chrome/browser/optimization_guide/model_validator_keyed_service.h
@@ -10,6 +10,7 @@
 #include "base/sequence_checker.h"
 #include "components/keyed_service/core/keyed_service.h"
 #include "components/optimization_guide/core/optimization_guide_model_executor.h"
+#include "components/optimization_guide/proto/model_execution.pb.h"
 #include "components/optimization_guide/proto/model_validation.pb.h"
 #include "components/signin/public/identity_manager/identity_manager.h"
 
@@ -37,7 +38,7 @@
 
   // Calls ExecuteModel on the on-device validation session.
   void ExecuteModel(
-      std::unique_ptr<google::protobuf::MessageLite> request_metadata);
+      std::unique_ptr<optimization_guide::proto::ExecuteRequest> request);
 
   // Invoked when model execution completes.
   void OnModelExecuteResponse(OptimizationGuideModelExecutionResult result,
@@ -45,6 +46,7 @@
 
   // Invoked when on-device model execution completes.
   void OnDeviceModelExecuteResponse(
+      const std::unique_ptr<optimization_guide::proto::ExecuteRequest>& request,
       OptimizationGuideModelStreamingExecutionResult result);
 
   // signin::IdentityManager::Observer:
diff --git a/chrome/browser/permissions/permission_element_browsertest.cc b/chrome/browser/permissions/permission_element_browsertest.cc
index 7c881f6..2433ea1 100644
--- a/chrome/browser/permissions/permission_element_browsertest.cc
+++ b/chrome/browser/permissions/permission_element_browsertest.cc
@@ -176,7 +176,8 @@
   permissions::PermissionRequestManager::FromWebContents(web_contents())
       ->set_auto_response_for_test(
           permissions::PermissionRequestManager::AutoResponseType::ACCEPT_ALL);
-  std::string permission_ids[] = {"microphone", "camera", "camera-microphone"};
+  std::string permission_ids[] = {"geolocation", "microphone", "camera",
+                                  "camera-microphone"};
   for (const auto& id : permission_ids) {
     permissions::PermissionRequestObserver observer(web_contents());
     ClickElementWithId(web_contents(), id);
@@ -285,7 +286,8 @@
   permissions::PermissionRequestManager::FromWebContents(web_contents())
       ->set_auto_response_for_test(
           permissions::PermissionRequestManager::AutoResponseType::NONE);
-  std::string permission_ids[] = {"microphone", "camera", "camera-microphone"};
+  std::string permission_ids[] = {"geolocation", "microphone", "camera",
+                                  "camera-microphone"};
   for (const auto& id : permission_ids) {
     views::NamedWidgetShownWaiter waiter(
         views::test::AnyWidgetTestPasskey{},
@@ -306,7 +308,8 @@
   permissions::PermissionRequestManager::FromWebContents(web_contents())
       ->set_auto_response_for_test(
           permissions::PermissionRequestManager::AutoResponseType::NONE);
-  std::string permission_ids[] = {"microphone", "camera", "camera-microphone"};
+  std::string permission_ids[] = {"geolocation", "microphone", "camera",
+                                  "camera-microphone"};
   for (const auto& id : permission_ids) {
     views::NamedWidgetShownWaiter waiter(
         views::test::AnyWidgetTestPasskey{},
@@ -488,7 +491,8 @@
   // the upper bound.
   zoom_controller->SetZoomLevel(2);
 
-  for (const auto& id : {"camera", "microphone", "camera-microphone"}) {
+  for (const auto& id :
+       {"geolocation", "camera", "microphone", "camera-microphone"}) {
     // The permission element still works.
     ClickElementWithId(web_contents(), id);
     WaitForResolveEvent(id);
@@ -523,7 +527,8 @@
   SkipInvalidElementMessage();
   for (const auto& property :
        {"marginTop", "marginBottom", "marginLeft", "marginRight"}) {
-    for (const auto& id : {"camera", "microphone", "camera-microphone"}) {
+    for (const auto& id :
+         {"geolocation", "camera", "microphone", "camera-microphone"}) {
       EXPECT_EQ(
           "4px",
           content::EvalJs(
diff --git a/chrome/browser/platform_util.h b/chrome/browser/platform_util.h
index 0c42ace..edafa939 100644
--- a/chrome/browser/platform_util.h
+++ b/chrome/browser/platform_util.h
@@ -9,6 +9,7 @@
 #include "build/build_config.h"
 #include "build/chromeos_buildflags.h"
 #include "chrome/common/buildflags.h"
+#include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/native_widget_types.h"
 
 class Browser;
@@ -107,6 +108,11 @@
 
 // Returns the active window which accepts keyboard inputs.
 NSWindow* GetActiveWindow();
+
+// Returns the screen bounds of a window. Top left screen corner is (0, 0).
+// TODO(crbug.com/365733574): used for debugging the misplaced bubble issue on
+// mac fullscreen.
+gfx::Rect GetWindowScreenBounds(gfx::NativeWindow window);
 #endif
 
 // Returns true if the given browser window is in locked fullscreen mode
diff --git a/chrome/browser/platform_util_mac.mm b/chrome/browser/platform_util_mac.mm
index 89668e2..b1a0cd0b 100644
--- a/chrome/browser/platform_util_mac.mm
+++ b/chrome/browser/platform_util_mac.mm
@@ -19,6 +19,8 @@
 #include "content/public/browser/browser_thread.h"
 #include "content/public/common/content_switches.h"
 #include "net/base/apple/url_conversions.h"
+#include "ui/gfx/geometry/rect.h"
+#include "ui/gfx/mac/coordinate_conversion.h"
 #include "ui/views/widget/widget.h"
 #include "url/gurl.h"
 
@@ -154,4 +156,8 @@
   return [NSApp keyWindow];
 }
 
+gfx::Rect GetWindowScreenBounds(gfx::NativeWindow window) {
+  return gfx::ScreenRectFromNSRect([window.GetNativeNSWindow() frame]);
+}
+
 }  // namespace platform_util
diff --git a/chrome/browser/resources/ash/settings/date_time_page/date_time_page.ts b/chrome/browser/resources/ash/settings/date_time_page/date_time_page.ts
index 865e31e..23632cfb 100644
--- a/chrome/browser/resources/ash/settings/date_time_page/date_time_page.ts
+++ b/chrome/browser/resources/ash/settings/date_time_page/date_time_page.ts
@@ -16,7 +16,7 @@
 import {loadTimeData} from 'chrome://resources/js/load_time_data.js';
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
-import {PrefsState} from '../common/types.js';
+import type {PrefsState} from '../common/types.js';
 import {Section} from '../mojom-webui/routes.mojom-webui.js';
 
 import {getTemplate} from './date_time_page.html.js';
diff --git a/chrome/browser/resources/ash/settings/date_time_page/date_time_settings_card.ts b/chrome/browser/resources/ash/settings/date_time_page/date_time_settings_card.ts
index a4adf78..e596ad84 100644
--- a/chrome/browser/resources/ash/settings/date_time_page/date_time_settings_card.ts
+++ b/chrome/browser/resources/ash/settings/date_time_page/date_time_settings_card.ts
@@ -24,9 +24,9 @@
 import {isChild, isRevampWayfindingEnabled} from '../common/load_time_booleans.js';
 import {RouteOriginMixin} from '../common/route_origin_mixin.js';
 import {Setting} from '../mojom-webui/setting.mojom-webui.js';
-import {Route, Router, routes} from '../router.js';
+import {type Route, Router, routes} from '../router.js';
 
-import {DateTimeBrowserProxy, DateTimePageCallbackRouter, DateTimePageHandlerRemote} from './date_time_browser_proxy.js';
+import {DateTimeBrowserProxy, type DateTimePageCallbackRouter, type DateTimePageHandlerRemote} from './date_time_browser_proxy.js';
 import {getTemplate} from './date_time_settings_card.html.js';
 
 const DateTimeSettingsCardElementBase =
diff --git a/chrome/browser/resources/ash/settings/date_time_page/timezone_selector.ts b/chrome/browser/resources/ash/settings/date_time_page/timezone_selector.ts
index aa3af9d..253f8d38 100644
--- a/chrome/browser/resources/ash/settings/date_time_page/timezone_selector.ts
+++ b/chrome/browser/resources/ash/settings/date_time_page/timezone_selector.ts
@@ -14,9 +14,9 @@
 import {loadTimeData} from 'chrome://resources/js/load_time_data.js';
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
-import {DropdownMenuOptionList} from '../controls/settings_dropdown_menu.js';
+import type {DropdownMenuOptionList} from '../controls/settings_dropdown_menu.js';
 
-import {DateTimeBrowserProxy, DateTimePageHandlerRemote} from './date_time_browser_proxy.js';
+import {DateTimeBrowserProxy, type DateTimePageHandlerRemote} from './date_time_browser_proxy.js';
 import {getTemplate} from './timezone_selector.html.js';
 
 const TimezoneSelectorElementBase = PrefsMixin(PolymerElement);
diff --git a/chrome/browser/resources/ash/settings/date_time_page/timezone_subpage.ts b/chrome/browser/resources/ash/settings/date_time_page/timezone_subpage.ts
index 6bf768b..4495837 100644
--- a/chrome/browser/resources/ash/settings/date_time_page/timezone_subpage.ts
+++ b/chrome/browser/resources/ash/settings/date_time_page/timezone_subpage.ts
@@ -23,14 +23,14 @@
 import {DeepLinkingMixin} from '../common/deep_linking_mixin.js';
 import {isChild} from '../common/load_time_booleans.js';
 import {RouteObserverMixin} from '../common/route_observer_mixin.js';
-import {SettingsDropdownMenuElement} from '../controls/settings_dropdown_menu.js';
+import type {SettingsDropdownMenuElement} from '../controls/settings_dropdown_menu.js';
 import {Setting} from '../mojom-webui/setting.mojom-webui.js';
 import {GeolocationAccessLevel} from '../os_privacy_page/privacy_hub_geolocation_subpage.js';
-import {Route, routes} from '../router.js';
+import {type Route, routes} from '../router.js';
 
-import {DateTimeBrowserProxy, DateTimePageCallbackRouter, DateTimePageHandlerRemote} from './date_time_browser_proxy.js';
+import {DateTimeBrowserProxy, type DateTimePageCallbackRouter, type DateTimePageHandlerRemote} from './date_time_browser_proxy.js';
 import {TimeZoneAutoDetectMethod} from './date_time_types.js';
-import {TimezoneSelectorElement} from './timezone_selector.js';
+import type {TimezoneSelectorElement} from './timezone_selector.js';
 import {getTemplate} from './timezone_subpage.html.js';
 
 export interface TimezoneSubpageElement {
diff --git a/chrome/browser/resources/chromeos/accessibility/accessibility_common/facegaze/bubble_controller.ts b/chrome/browser/resources/chromeos/accessibility/accessibility_common/facegaze/bubble_controller.ts
index 351122a..bca103d 100644
--- a/chrome/browser/resources/chromeos/accessibility/accessibility_common/facegaze/bubble_controller.ts
+++ b/chrome/browser/resources/chromeos/accessibility/accessibility_common/facegaze/bubble_controller.ts
@@ -2,7 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {Macro} from '/common/action_fulfillment/macros/macro.js';
 import {MacroName} from '/common/action_fulfillment/macros/macro_names.js';
 import {TestImportManager} from '/common/testing/test_import_manager.js';
 
@@ -50,95 +49,96 @@
     chrome.accessibilityPrivate.updateFaceGazeBubble(this.baseText_.join(', '));
   }
 
-  static getDisplayText(gesture: FacialGesture, macro: Macro): string {
+  static getDisplayText(gesture: FacialGesture, macroName: MacroName): string {
     // TODO(b:341770655): Localize this string.
-    return `${BubbleController.getDisplayTextForMacro_(macro)} (${
+    return `${BubbleController.getDisplayTextForMacro_(macroName)} (${
         BubbleController.getDisplayTextForGesture_(gesture)})`;
   }
 
-  private static getDisplayTextForMacro_(macro: Macro): string {
-    // TODO(b:341770655): Localize these strings.
-    switch (macro.getName()) {
+  private static getDisplayTextForMacro_(macroName: MacroName): string {
+    switch (macroName) {
       case MacroName.CUSTOM_KEY_COMBINATION:
-        return 'Perform a custom key combination';
+        return chrome.i18n.getMessage('facegaze_macro_text_custom_key_combo');
       case MacroName.KEY_PRESS_DOWN:
-        return 'Press the down arrow key';
+        return chrome.i18n.getMessage('facegaze_macro_text_key_press_down');
       case MacroName.KEY_PRESS_LEFT:
-        return 'Press the left arrow key';
+        return chrome.i18n.getMessage('facegaze_macro_text_key_press_left');
       case MacroName.KEY_PRESS_MEDIA_PLAY_PAUSE:
-        return 'Play or pause media';
+        return chrome.i18n.getMessage('facegaze_macro_text_media_play_pause');
       case MacroName.KEY_PRESS_RIGHT:
-        return 'Press the right arrow key';
+        return chrome.i18n.getMessage('facegaze_macro_text_key_press_right');
       case MacroName.KEY_PRESS_SPACE:
-        return 'Press the space key';
+        return chrome.i18n.getMessage('facegaze_macro_text_key_press_space');
       case MacroName.KEY_PRESS_TOGGLE_OVERVIEW:
-        return 'Open overview of windows';
+        return chrome.i18n.getMessage('facegaze_macro_text_toggle_overview');
       case MacroName.KEY_PRESS_UP:
-        return 'Press the up arrow key';
+        return chrome.i18n.getMessage('facegaze_macro_text_key_press_up');
       case MacroName.MOUSE_CLICK_LEFT:
-        return 'Left-click the mouse';
+        return chrome.i18n.getMessage('facegaze_macro_text_mouse_click_left');
       case MacroName.MOUSE_CLICK_LEFT_DOUBLE:
-        return 'Double click the mouse';
+        return chrome.i18n.getMessage(
+            'facegaze_macro_text_mouse_click_left_double');
       case MacroName.MOUSE_CLICK_RIGHT:
-        return 'Right-click the mouse';
+        return chrome.i18n.getMessage('facegaze_macro_text_mouse_click_right');
       case MacroName.MOUSE_LONG_CLICK_LEFT:
-        return 'Drag and drop';
+        return chrome.i18n.getMessage(
+            'facegaze_macro_text_mouse_long_click_left');
       case MacroName.RESET_CURSOR:
-        return 'Reset cursor to center';
+        return chrome.i18n.getMessage('facegaze_macro_text_reset_cursor');
       case MacroName.TOGGLE_DICTATION:
-        return 'Start or stop dictation';
+        return chrome.i18n.getMessage('facegaze_macro_text_toggle_dictation');
       case MacroName.TOGGLE_FACEGAZE:
-        return 'Pause or resume face control';
+        return chrome.i18n.getMessage('facegaze_macro_text_toggle_facegaze');
       case MacroName.TOGGLE_SCROLL_MODE:
-        return 'Toggle scroll mode';
+        return chrome.i18n.getMessage('facegaze_macro_text_toggle_scroll_mode');
       case MacroName.TOGGLE_VIRTUAL_KEYBOARD:
-        return 'Show or hide the virtual keyboard';
+        return chrome.i18n.getMessage(
+            'facegaze_macro_text_toggle_virtual_keyboard');
       default:
         console.error(
-            'Display text requested for unsupported macro ' + macro.getName());
+            'Display text requested for unsupported macro ' + macroName);
         return '';
     }
   }
 
   private static getDisplayTextForGesture_(gesture: FacialGesture): string {
-    // TODO(b:341770655): Localize these strings.
     switch (gesture) {
       case FacialGesture.BROW_INNER_UP:
-        return 'Raise eyebrows';
+        return chrome.i18n.getMessage('facegaze_gesture_text_brow_inner_up');
       case FacialGesture.BROWS_DOWN:
-        return 'Lower eyebrows';
+        return chrome.i18n.getMessage('facegaze_gesture_text_brows_down');
       case FacialGesture.EYE_SQUINT_LEFT:
-        return 'Squint left eye';
+        return chrome.i18n.getMessage('facegaze_gesture_text_eye_squint_left');
       case FacialGesture.EYE_SQUINT_RIGHT:
-        return 'Squint right eye';
+        return chrome.i18n.getMessage('facegaze_gesture_text_eye_squint_right');
       case FacialGesture.EYES_BLINK:
-        return 'Blink both eyes';
+        return chrome.i18n.getMessage('facegaze_gesture_text_eyes_blink');
       case FacialGesture.EYES_LOOK_DOWN:
-        return 'Look down';
+        return chrome.i18n.getMessage('facegaze_gesture_text_eyes_look_down');
       case FacialGesture.EYES_LOOK_LEFT:
-        return 'Look left';
+        return chrome.i18n.getMessage('facegaze_gesture_text_eyes_look_left');
       case FacialGesture.EYES_LOOK_RIGHT:
-        return 'Look right';
+        return chrome.i18n.getMessage('facegaze_gesture_text_eyes_look_right');
       case FacialGesture.EYES_LOOK_UP:
-        return 'Look up';
+        return chrome.i18n.getMessage('facegaze_gesture_text_eyes_look_up');
       case FacialGesture.JAW_LEFT:
-        return 'Shift jaw left';
+        return chrome.i18n.getMessage('facegaze_gesture_text_jaw_left');
       case FacialGesture.JAW_OPEN:
-        return 'Open your mouth wide';
+        return chrome.i18n.getMessage('facegaze_gesture_text_jaw_open');
       case FacialGesture.JAW_RIGHT:
-        return 'Shift jaw right';
+        return chrome.i18n.getMessage('facegaze_gesture_text_jaw_right');
       case FacialGesture.MOUTH_FUNNEL:
-        return 'Make a circle with your lips';
+        return chrome.i18n.getMessage('facegaze_gesture_text_mouth_funnel');
       case FacialGesture.MOUTH_LEFT:
-        return 'Stretch left corner of your mouth';
+        return chrome.i18n.getMessage('facegaze_gesture_text_mouth_left');
       case FacialGesture.MOUTH_PUCKER:
-        return 'Pucker by squeezing lips together';
+        return chrome.i18n.getMessage('facegaze_gesture_text_mouth_pucker');
       case FacialGesture.MOUTH_RIGHT:
-        return 'Stretch right corner of your mouth';
+        return chrome.i18n.getMessage('facegaze_gesture_text_mouth_right');
       case FacialGesture.MOUTH_SMILE:
-        return 'Smile';
+        return chrome.i18n.getMessage('facegaze_gesture_text_mouth_smile');
       case FacialGesture.MOUTH_UPPER_UP:
-        return 'Wrinkle your nose';
+        return chrome.i18n.getMessage('facegaze_gesture_text_mouth_upper_up');
       default:
         console.error(
             'Display text requested for unsupported FacialGesture ' + gesture);
@@ -148,7 +148,7 @@
 }
 
 export namespace BubbleController {
-  export const RESET_BUBBLE_TIMEOUT_MS = 5000;
+  export const RESET_BUBBLE_TIMEOUT_MS = 2500;
 
   export interface GetStateResult {
     paused: boolean;
diff --git a/chrome/browser/resources/chromeos/accessibility/accessibility_common/facegaze/facegaze_test.js b/chrome/browser/resources/chromeos/accessibility/accessibility_common/facegaze/facegaze_test.js
index 2d30fba2..aaed6d3 100644
--- a/chrome/browser/resources/chromeos/accessibility/accessibility_common/facegaze/facegaze_test.js
+++ b/chrome/browser/resources/chromeos/accessibility/accessibility_common/facegaze/facegaze_test.js
@@ -1719,7 +1719,7 @@
   this.processFaceLandmarkerResult(result);
 
   assertEquals(
-      'Toggle scroll mode (Raise eyebrows), ' +
+      'Enter or exit scroll mode (Raise eyebrows), ' +
           'Pause or resume face control (Open your mouth wide)',
       this.mockAccessibilityPrivate.getFaceGazeBubbleText());
 
@@ -1897,3 +1897,64 @@
   this.assertMouseClickAt(
       {pressEvent, releaseEvent, isLeft: true, x: 350, y: 250});
 });
+
+// Ensures that localization works for all gestures and macros that get
+// displayed in the bubble UI.
+AX_TEST_F('FaceGazeTest', 'BubbleTextLocalization', async function() {
+  const gestures = [
+    FacialGesture.BROW_INNER_UP,
+    FacialGesture.BROWS_DOWN,
+    FacialGesture.EYE_SQUINT_LEFT,
+    FacialGesture.EYE_SQUINT_RIGHT,
+    FacialGesture.EYES_BLINK,
+    FacialGesture.EYES_LOOK_DOWN,
+    FacialGesture.EYES_LOOK_LEFT,
+    FacialGesture.EYES_LOOK_RIGHT,
+    FacialGesture.EYES_LOOK_UP,
+    FacialGesture.JAW_LEFT,
+    FacialGesture.JAW_OPEN,
+    FacialGesture.JAW_RIGHT,
+    FacialGesture.MOUTH_FUNNEL,
+    FacialGesture.MOUTH_LEFT,
+    FacialGesture.MOUTH_PUCKER,
+    FacialGesture.MOUTH_RIGHT,
+    FacialGesture.MOUTH_SMILE,
+    FacialGesture.MOUTH_UPPER_UP,
+  ];
+
+  const macros = [
+    MacroName.CUSTOM_KEY_COMBINATION,
+    MacroName.KEY_PRESS_DOWN,
+    MacroName.KEY_PRESS_LEFT,
+    MacroName.KEY_PRESS_MEDIA_PLAY_PAUSE,
+    MacroName.KEY_PRESS_RIGHT,
+    MacroName.KEY_PRESS_SPACE,
+    MacroName.KEY_PRESS_TOGGLE_OVERVIEW,
+    MacroName.KEY_PRESS_UP,
+    MacroName.MOUSE_CLICK_LEFT,
+    MacroName.MOUSE_CLICK_LEFT_DOUBLE,
+    MacroName.MOUSE_CLICK_RIGHT,
+    MacroName.MOUSE_LONG_CLICK_LEFT,
+    MacroName.RESET_CURSOR,
+    MacroName.TOGGLE_DICTATION,
+    MacroName.TOGGLE_FACEGAZE,
+    MacroName.TOGGLE_SCROLL_MODE,
+    MacroName.TOGGLE_VIRTUAL_KEYBOARD,
+  ];
+
+  let lastText = '';
+  for (const macro of macros) {
+    const currentText = BubbleController.getDisplayTextForMacro_(macro);
+    assertNotEquals(currentText, '');
+    assertNotEquals(currentText, lastText);
+    lastText = currentText;
+  }
+
+  lastText = '';
+  for (const gesture of gestures) {
+    const currentText = BubbleController.getDisplayTextForGesture_(gesture);
+    assertNotEquals(currentText, '');
+    assertNotEquals(currentText, lastText);
+    lastText = currentText;
+  }
+});
diff --git a/chrome/browser/resources/chromeos/accessibility/accessibility_common/facegaze/gesture_handler.ts b/chrome/browser/resources/chromeos/accessibility/accessibility_common/facegaze/gesture_handler.ts
index 5ef4096..163997b 100644
--- a/chrome/browser/resources/chromeos/accessibility/accessibility_common/facegaze/gesture_handler.ts
+++ b/chrome/browser/resources/chromeos/accessibility/accessibility_common/facegaze/gesture_handler.ts
@@ -201,7 +201,8 @@
       const macro = this.macroFromName_(macroName, gesture);
       if (macro) {
         result.push(macro);
-        displayStrings.push(BubbleController.getDisplayText(gesture, macro));
+        displayStrings.push(
+            BubbleController.getDisplayText(gesture, macro.getName()));
         if (macro.triggersAtActionStartAndEnd()) {
           // Cache this macro to be run a second time later,
           // e.g. for key release.
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings.grdp b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings.grdp
index e11f874..e2eae869 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings.grdp
+++ b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings.grdp
@@ -6,4 +6,109 @@
   <message name="IDS_FACEGAZE_CONFIRMATION_DIALOG_DESC" desc="The visible description of a confirmation dialog that is shown when FaceGaze is enabled.">
     Face control gives you cursor control with face pointing and ability to perform actions, such as left clicking with facial gestures like smile
   </message>
+  <message name="IDS_FACEGAZE_MACRO_TEXT_CUSTOM_KEY_COMBO" desc="This text describes an action to perform a custom key combination.">
+    Perform a custom key combination
+  </message>
+  <message name="IDS_FACEGAZE_MACRO_TEXT_KEY_PRESS_DOWN" desc="This text describes an action to press the down arrow key.">
+    Press the down arrow key
+  </message>
+  <message name="IDS_FACEGAZE_MACRO_TEXT_KEY_PRESS_LEFT" desc="This text describes an action to press the left arrow key.">
+    Press the left arrow key
+  </message>
+  <message name="IDS_FACEGAZE_MACRO_TEXT_MEDIA_PLAY_PAUSE" desc="This text describes an action to play or pause media.">
+    Play or pause media
+  </message>
+  <message name="IDS_FACEGAZE_MACRO_TEXT_KEY_PRESS_RIGHT" desc="This text describes an action to press the right arrow key.">
+    Press the right arrow key
+  </message>
+  <message name="IDS_FACEGAZE_MACRO_TEXT_KEY_PRESS_SPACE" desc="This text describes an action to press the space key.">
+    Press the space key
+  </message>
+  <message name="IDS_FACEGAZE_MACRO_TEXT_TOGGLE_OVERVIEW" desc="This text describes an action to show or hide the overview of current windows.">
+    Show or hide overview of windows
+  </message>
+  <message name="IDS_FACEGAZE_MACRO_TEXT_KEY_PRESS_UP" desc="This text describes an action to press the up arrow key.">
+    Press the up arrow key
+  </message>
+  <message name="IDS_FACEGAZE_MACRO_TEXT_MOUSE_CLICK_LEFT" desc="This text describes an action to left-click the mouse.">
+    Left-click the mouse
+  </message>
+  <message name="IDS_FACEGAZE_MACRO_TEXT_MOUSE_CLICK_LEFT_DOUBLE" desc="This text describes an action to double click the mouse.">
+    Double-click the mouse
+  </message>
+  <message name="IDS_FACEGAZE_MACRO_TEXT_MOUSE_CLICK_RIGHT" desc="This text describes an action to right-click the mouse.">
+    Right-click the mouse
+  </message>
+  <message name="IDS_FACEGAZE_MACRO_TEXT_MOUSE_LONG_CLICK_LEFT" desc="This text describes an action to drag and drop.">
+    Drag and drop
+  </message>
+  <message name="IDS_FACEGAZE_MACRO_TEXT_RESET_CURSOR" desc="This text describes an action to reset the cursor to the center of the screen.">
+    Reset cursor to center
+  </message>
+  <message name="IDS_FACEGAZE_MACRO_TEXT_TOGGLE_DICTATION" desc="This text describes an action to start or stop the Dictation feature.">
+    Start or stop dictation
+  </message>
+  <message name="IDS_FACEGAZE_MACRO_TEXT_TOGGLE_FACEGAZE" desc="This text describes an action to pause or resume FaceGaze.">
+    Pause or resume face control
+  </message>
+  <message name="IDS_FACEGAZE_MACRO_TEXT_TOGGLE_SCROLL_MODE" desc="This text describes an action to pause or resume FaceGaze scroll mode.">
+    Enter or exit scroll mode
+  </message>
+  <message name="IDS_FACEGAZE_MACRO_TEXT_TOGGLE_VIRTUAL_KEYBOARD" desc="This text describes an action to show or hide the on-screen keyboard.">
+    Show or hide on-screen keyboard
+  </message>
+  <message name="IDS_FACEGAZE_GESTURE_TEXT_BROW_INNER_UP" desc="This text describes a gesture, or movement, that a user will make with their face. For this gesture, the user should raise their eyebrows.">
+    Raise eyebrows
+  </message>
+  <message name="IDS_FACEGAZE_GESTURE_TEXT_BROWS_DOWN" desc="This text describes a gesture, or movement, that a user will make with their face. For this gesture, the user should lower their eyebrows.">
+    Lower eyebrows
+  </message>
+  <message name="IDS_FACEGAZE_GESTURE_TEXT_EYE_SQUINT_LEFT" desc="This text describes a gesture, or movement, that a user will make with their face. For this gesture, the user should squint their left eye.">
+    Squint left eye
+  </message>
+  <message name="IDS_FACEGAZE_GESTURE_TEXT_EYE_SQUINT_RIGHT" desc="This text describes a gesture, or movement, that a user will make with their face. For this gesture, the user should squint their right eye.">
+    Squint right eye
+  </message>
+  <message name="IDS_FACEGAZE_GESTURE_TEXT_EYES_BLINK" desc="This text describes a gesture, or movement, that a user will make with their face. For this gesture, the user should raise blink.">
+    Blink both eyes
+  </message>
+  <message name="IDS_FACEGAZE_GESTURE_TEXT_EYES_LOOK_DOWN" desc="This text describes a gesture, or movement, that a user will make with their face. For this gesture, the user should look down.">
+    Look down
+  </message>
+  <message name="IDS_FACEGAZE_GESTURE_TEXT_EYES_LOOK_LEFT" desc="This text describes a gesture, or movement, that a user will make with their face. For this gesture, the user should look left.">
+    Look left
+  </message>
+  <message name="IDS_FACEGAZE_GESTURE_TEXT_EYES_LOOK_RIGHT" desc="This text describes a gesture, or movement, that a user will make with their face. For this gesture, the user should look right.">
+    Look right
+  </message>
+  <message name="IDS_FACEGAZE_GESTURE_TEXT_EYES_LOOK_UP" desc="This text describes a gesture, or movement, that a user will make with their face. For this gesture, the user should look up.">
+    Look up
+  </message>
+  <message name="IDS_FACEGAZE_GESTURE_TEXT_JAW_LEFT" desc="This text describes a gesture, or movement, that a user will make with their face. For this gesture, the user should shift their jaw to the left.">
+    Shift jaw left
+  </message>
+  <message name="IDS_FACEGAZE_GESTURE_TEXT_JAW_OPEN" desc="This text describes a gesture, or movement, that a user will make with their face. For this gesture, the user should open their mouth.">
+    Open your mouth wide
+  </message>
+  <message name="IDS_FACEGAZE_GESTURE_TEXT_JAW_RIGHT" desc="This text describes a gesture, or movement, that a user will make with their face. For this gesture, the user should shift their jaw to the right.">
+    Shift jaw right
+  </message>
+  <message name="IDS_FACEGAZE_GESTURE_TEXT_MOUTH_FUNNEL" desc="This text describes a gesture, or movement, that a user will make with their face. For this gesture, the user should make a circle with their lips.">
+    Make a circle with your lips
+  </message>
+  <message name="IDS_FACEGAZE_GESTURE_TEXT_MOUTH_LEFT" desc="This text describes a gesture, or movement, that a user will make with their face. For this gesture, the user should stretch the left corner of their mouth.">
+    Stretch left corner of your mouth
+  </message>
+  <message name="IDS_FACEGAZE_GESTURE_TEXT_MOUTH_PUCKER" desc="This text describes a gesture, or movement, that a user will make with their face. For this gesture, the user should pucker their lips.">
+    Pucker by squeezing lips together
+  </message>
+  <message name="IDS_FACEGAZE_GESTURE_TEXT_MOUTH_RIGHT" desc="This text describes a gesture, or movement, that a user will make with their face. For this gesture, the user should stretch the right corner of their mouth.">
+    Stretch right corner of your mouth
+  </message>
+  <message name="IDS_FACEGAZE_GESTURE_TEXT_MOUTH_SMILE" desc="This text describes a gesture, or movement, that a user will make with their face. For this gesture, the user should smile.">
+    Smile
+  </message>
+  <message name="IDS_FACEGAZE_GESTURE_TEXT_MOUTH_UPPER_UP" desc="This text describes a gesture, or movement, that a user will make with their face. For this gesture, the user should wrinkle their nose.">
+    Wrinkle your nose
+  </message>
 </grit-part>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_GESTURE_TEXT_BROWS_DOWN.png.sha1 b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_GESTURE_TEXT_BROWS_DOWN.png.sha1
new file mode 100644
index 0000000..7d89fd14
--- /dev/null
+++ b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_GESTURE_TEXT_BROWS_DOWN.png.sha1
@@ -0,0 +1 @@
+e2ae6c5c27f3551c31656a3a4bfdb032299945f2
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_GESTURE_TEXT_BROW_INNER_UP.png.sha1 b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_GESTURE_TEXT_BROW_INNER_UP.png.sha1
new file mode 100644
index 0000000..1e5d7dd
--- /dev/null
+++ b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_GESTURE_TEXT_BROW_INNER_UP.png.sha1
@@ -0,0 +1 @@
+68e92f1e40dc589d620627c510cc3476b08b9569
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_GESTURE_TEXT_EYES_BLINK.png.sha1 b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_GESTURE_TEXT_EYES_BLINK.png.sha1
new file mode 100644
index 0000000..2f5101b
--- /dev/null
+++ b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_GESTURE_TEXT_EYES_BLINK.png.sha1
@@ -0,0 +1 @@
+af8982edbe2ea0486d22d5b311ac96d30a2facc2
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_GESTURE_TEXT_EYES_LOOK_DOWN.png.sha1 b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_GESTURE_TEXT_EYES_LOOK_DOWN.png.sha1
new file mode 100644
index 0000000..43465aa
--- /dev/null
+++ b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_GESTURE_TEXT_EYES_LOOK_DOWN.png.sha1
@@ -0,0 +1 @@
+3ff2c5e4f59127fa14db76708291cb2b10778096
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_GESTURE_TEXT_EYES_LOOK_LEFT.png.sha1 b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_GESTURE_TEXT_EYES_LOOK_LEFT.png.sha1
new file mode 100644
index 0000000..6ebf9cc
--- /dev/null
+++ b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_GESTURE_TEXT_EYES_LOOK_LEFT.png.sha1
@@ -0,0 +1 @@
+9c3bcc9aeaef9d9ac7f905a2cbe76e95d626b381
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_GESTURE_TEXT_EYES_LOOK_RIGHT.png.sha1 b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_GESTURE_TEXT_EYES_LOOK_RIGHT.png.sha1
new file mode 100644
index 0000000..f221435
--- /dev/null
+++ b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_GESTURE_TEXT_EYES_LOOK_RIGHT.png.sha1
@@ -0,0 +1 @@
+308c4c824861902fb2afca1926ee4a339af020b3
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_GESTURE_TEXT_EYES_LOOK_UP.png.sha1 b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_GESTURE_TEXT_EYES_LOOK_UP.png.sha1
new file mode 100644
index 0000000..bf20f16d
--- /dev/null
+++ b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_GESTURE_TEXT_EYES_LOOK_UP.png.sha1
@@ -0,0 +1 @@
+bc7e6c7845c6d402ade789bc86f9b42c3b39f903
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_GESTURE_TEXT_EYE_SQUINT_LEFT.png.sha1 b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_GESTURE_TEXT_EYE_SQUINT_LEFT.png.sha1
new file mode 100644
index 0000000..dc2efea2
--- /dev/null
+++ b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_GESTURE_TEXT_EYE_SQUINT_LEFT.png.sha1
@@ -0,0 +1 @@
+cf34ccfb7fac8ade50c5a431ca8a44764d0a3c47
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_GESTURE_TEXT_EYE_SQUINT_RIGHT.png.sha1 b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_GESTURE_TEXT_EYE_SQUINT_RIGHT.png.sha1
new file mode 100644
index 0000000..6aa892e
--- /dev/null
+++ b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_GESTURE_TEXT_EYE_SQUINT_RIGHT.png.sha1
@@ -0,0 +1 @@
+d628bd5ceb1bc464f2ae0ee5f2f5723b4c9e0de4
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_GESTURE_TEXT_JAW_LEFT.png.sha1 b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_GESTURE_TEXT_JAW_LEFT.png.sha1
new file mode 100644
index 0000000..82632af9
--- /dev/null
+++ b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_GESTURE_TEXT_JAW_LEFT.png.sha1
@@ -0,0 +1 @@
+a40e5ae4787e9e13774df3112b639f31423a8ced
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_GESTURE_TEXT_JAW_OPEN.png.sha1 b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_GESTURE_TEXT_JAW_OPEN.png.sha1
new file mode 100644
index 0000000..915c164f
--- /dev/null
+++ b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_GESTURE_TEXT_JAW_OPEN.png.sha1
@@ -0,0 +1 @@
+3e92834c33dc02cc0dc7f79931e7b386efdae3ad
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_GESTURE_TEXT_JAW_RIGHT.png.sha1 b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_GESTURE_TEXT_JAW_RIGHT.png.sha1
new file mode 100644
index 0000000..d82f049
--- /dev/null
+++ b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_GESTURE_TEXT_JAW_RIGHT.png.sha1
@@ -0,0 +1 @@
+35c5831306e19bd82d5bccdf5f00bb21e7d91061
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_GESTURE_TEXT_MOUTH_FUNNEL.png.sha1 b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_GESTURE_TEXT_MOUTH_FUNNEL.png.sha1
new file mode 100644
index 0000000..e434eac
--- /dev/null
+++ b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_GESTURE_TEXT_MOUTH_FUNNEL.png.sha1
@@ -0,0 +1 @@
+43cec572acc4fbbe6d937d98cd4a7b18c7abcd02
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_GESTURE_TEXT_MOUTH_LEFT.png.sha1 b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_GESTURE_TEXT_MOUTH_LEFT.png.sha1
new file mode 100644
index 0000000..7a5df35
--- /dev/null
+++ b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_GESTURE_TEXT_MOUTH_LEFT.png.sha1
@@ -0,0 +1 @@
+3f64423ffac745670109ecf6ba32c3732df88e35
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_GESTURE_TEXT_MOUTH_PUCKER.png.sha1 b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_GESTURE_TEXT_MOUTH_PUCKER.png.sha1
new file mode 100644
index 0000000..b6865096
--- /dev/null
+++ b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_GESTURE_TEXT_MOUTH_PUCKER.png.sha1
@@ -0,0 +1 @@
+73c4be45bc16f34aa222bf38e0214711a62075d6
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_GESTURE_TEXT_MOUTH_RIGHT.png.sha1 b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_GESTURE_TEXT_MOUTH_RIGHT.png.sha1
new file mode 100644
index 0000000..872ad87
--- /dev/null
+++ b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_GESTURE_TEXT_MOUTH_RIGHT.png.sha1
@@ -0,0 +1 @@
+8cb0e14cffb050ba32f8a09261b74bc3320c46d8
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_GESTURE_TEXT_MOUTH_SMILE.png.sha1 b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_GESTURE_TEXT_MOUTH_SMILE.png.sha1
new file mode 100644
index 0000000..540fa57
--- /dev/null
+++ b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_GESTURE_TEXT_MOUTH_SMILE.png.sha1
@@ -0,0 +1 @@
+14b080d58fe8591ac4367672ce2672612b7a2899
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_GESTURE_TEXT_MOUTH_UPPER_UP.png.sha1 b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_GESTURE_TEXT_MOUTH_UPPER_UP.png.sha1
new file mode 100644
index 0000000..a5b89808
--- /dev/null
+++ b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_GESTURE_TEXT_MOUTH_UPPER_UP.png.sha1
@@ -0,0 +1 @@
+7e9319d61f808d3520f8eabcf0e4d272b882f9a0
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_MACRO_TEXT_CUSTOM_KEY_COMBO.png.sha1 b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_MACRO_TEXT_CUSTOM_KEY_COMBO.png.sha1
new file mode 100644
index 0000000..0e1daaf
--- /dev/null
+++ b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_MACRO_TEXT_CUSTOM_KEY_COMBO.png.sha1
@@ -0,0 +1 @@
+f161d60e8cdd6bb5bac96d8766850b0a472ee76d
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_MACRO_TEXT_KEY_PRESS_DOWN.png.sha1 b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_MACRO_TEXT_KEY_PRESS_DOWN.png.sha1
new file mode 100644
index 0000000..fee6dc93
--- /dev/null
+++ b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_MACRO_TEXT_KEY_PRESS_DOWN.png.sha1
@@ -0,0 +1 @@
+4a51d2e14c3a599d6ef1f2c69b518363431e3758
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_MACRO_TEXT_KEY_PRESS_LEFT.png.sha1 b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_MACRO_TEXT_KEY_PRESS_LEFT.png.sha1
new file mode 100644
index 0000000..76b606a
--- /dev/null
+++ b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_MACRO_TEXT_KEY_PRESS_LEFT.png.sha1
@@ -0,0 +1 @@
+afe9c356ca420f636e3692d19c28dbceadd7398b
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_MACRO_TEXT_KEY_PRESS_RIGHT.png.sha1 b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_MACRO_TEXT_KEY_PRESS_RIGHT.png.sha1
new file mode 100644
index 0000000..f730134
--- /dev/null
+++ b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_MACRO_TEXT_KEY_PRESS_RIGHT.png.sha1
@@ -0,0 +1 @@
+e9c651664d8b26f189d05cec93fcb1f91102afa9
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_MACRO_TEXT_KEY_PRESS_SPACE.png.sha1 b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_MACRO_TEXT_KEY_PRESS_SPACE.png.sha1
new file mode 100644
index 0000000..8e6f8fe9
--- /dev/null
+++ b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_MACRO_TEXT_KEY_PRESS_SPACE.png.sha1
@@ -0,0 +1 @@
+2dee633698c60174ea1e311d83e742f3c52883f5
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_MACRO_TEXT_KEY_PRESS_UP.png.sha1 b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_MACRO_TEXT_KEY_PRESS_UP.png.sha1
new file mode 100644
index 0000000..bd1b23d
--- /dev/null
+++ b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_MACRO_TEXT_KEY_PRESS_UP.png.sha1
@@ -0,0 +1 @@
+5a8d181009efb2d91cb95524598d13b033738394
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_MACRO_TEXT_MEDIA_PLAY_PAUSE.png.sha1 b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_MACRO_TEXT_MEDIA_PLAY_PAUSE.png.sha1
new file mode 100644
index 0000000..f1ed2350
--- /dev/null
+++ b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_MACRO_TEXT_MEDIA_PLAY_PAUSE.png.sha1
@@ -0,0 +1 @@
+2dd4e2810596b70a2ed27f4ed6e33db1b1cfe759
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_MACRO_TEXT_MOUSE_CLICK_LEFT.png.sha1 b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_MACRO_TEXT_MOUSE_CLICK_LEFT.png.sha1
new file mode 100644
index 0000000..c5bf8d33
--- /dev/null
+++ b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_MACRO_TEXT_MOUSE_CLICK_LEFT.png.sha1
@@ -0,0 +1 @@
+de53810f5ee53a886ebe0467c2297d988e4838d7
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_MACRO_TEXT_MOUSE_CLICK_LEFT_DOUBLE.png.sha1 b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_MACRO_TEXT_MOUSE_CLICK_LEFT_DOUBLE.png.sha1
new file mode 100644
index 0000000..946d1ba
--- /dev/null
+++ b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_MACRO_TEXT_MOUSE_CLICK_LEFT_DOUBLE.png.sha1
@@ -0,0 +1 @@
+05147e758e45af33c8869e791ddde26ba862d8ac
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_MACRO_TEXT_MOUSE_CLICK_RIGHT.png.sha1 b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_MACRO_TEXT_MOUSE_CLICK_RIGHT.png.sha1
new file mode 100644
index 0000000..312cbab
--- /dev/null
+++ b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_MACRO_TEXT_MOUSE_CLICK_RIGHT.png.sha1
@@ -0,0 +1 @@
+f4526aa1c851de3bfe43819a0bcba13ee27106cc
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_MACRO_TEXT_MOUSE_LONG_CLICK_LEFT.png.sha1 b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_MACRO_TEXT_MOUSE_LONG_CLICK_LEFT.png.sha1
new file mode 100644
index 0000000..e881a5c
--- /dev/null
+++ b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_MACRO_TEXT_MOUSE_LONG_CLICK_LEFT.png.sha1
@@ -0,0 +1 @@
+c8bcb5344d6fef18dea5f1369543ad9e7c128d38
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_MACRO_TEXT_RESET_CURSOR.png.sha1 b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_MACRO_TEXT_RESET_CURSOR.png.sha1
new file mode 100644
index 0000000..fd65404
--- /dev/null
+++ b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_MACRO_TEXT_RESET_CURSOR.png.sha1
@@ -0,0 +1 @@
+e940912a00a6101662144ce464b9d529a16c0bbb
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_MACRO_TEXT_TOGGLE_DICTATION.png.sha1 b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_MACRO_TEXT_TOGGLE_DICTATION.png.sha1
new file mode 100644
index 0000000..2d1fd2c
--- /dev/null
+++ b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_MACRO_TEXT_TOGGLE_DICTATION.png.sha1
@@ -0,0 +1 @@
+8c0676ce1f7cf1106d95d0df8f49ca6598723825
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_MACRO_TEXT_TOGGLE_FACEGAZE.png.sha1 b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_MACRO_TEXT_TOGGLE_FACEGAZE.png.sha1
new file mode 100644
index 0000000..53597e7
--- /dev/null
+++ b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_MACRO_TEXT_TOGGLE_FACEGAZE.png.sha1
@@ -0,0 +1 @@
+5f8f42994c29e18cfacea40f23877004305f9af7
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_MACRO_TEXT_TOGGLE_OVERVIEW.png.sha1 b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_MACRO_TEXT_TOGGLE_OVERVIEW.png.sha1
new file mode 100644
index 0000000..78c76a8
--- /dev/null
+++ b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_MACRO_TEXT_TOGGLE_OVERVIEW.png.sha1
@@ -0,0 +1 @@
+846f1eebe49bb7300513b0be6f01740a038e4c8f
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_MACRO_TEXT_TOGGLE_SCROLL_MODE.png.sha1 b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_MACRO_TEXT_TOGGLE_SCROLL_MODE.png.sha1
new file mode 100644
index 0000000..17d1680
--- /dev/null
+++ b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_MACRO_TEXT_TOGGLE_SCROLL_MODE.png.sha1
@@ -0,0 +1 @@
+1bdaa83fadd17add90b06c7c5d12d66413984489
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_MACRO_TEXT_TOGGLE_VIRTUAL_KEYBOARD.png.sha1 b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_MACRO_TEXT_TOGGLE_VIRTUAL_KEYBOARD.png.sha1
new file mode 100644
index 0000000..de510c6
--- /dev/null
+++ b/chrome/browser/resources/chromeos/accessibility/strings/facegaze_strings_grdp/IDS_FACEGAZE_MACRO_TEXT_TOGGLE_VIRTUAL_KEYBOARD.png.sha1
@@ -0,0 +1 @@
+dea0299d43d8da005beb49b07ff46ca283509169
\ No newline at end of file
diff --git a/chrome/browser/resources/privacy_sandbox/privacy_sandbox_dialog_consent_step.html b/chrome/browser/resources/privacy_sandbox/privacy_sandbox_dialog_consent_step.html
index 20ee3b4..0492e6b 100644
--- a/chrome/browser/resources/privacy_sandbox/privacy_sandbox_dialog_consent_step.html
+++ b/chrome/browser/resources/privacy_sandbox/privacy_sandbox_dialog_consent_step.html
@@ -1,8 +1,13 @@
 <style include="cr-shared-style shared-style">
   .iframe {
-    height: calc(100vh - var(--privacy-sandbox-dialog-buttons-row-height));
-    width: 100vw;
+    height: calc(100vh -
+      var(--privacy-sandbox-dialog-buttons-row-height) -
+      var(--privacy-sandbox-privacy-policy-back-button-section-height));
+    width: 96vw;
+    padding-right: 24px;
+    padding-left: 24px;
   }
+
   .iframe.hidden {
     position: absolute;
     z-index: -1;
@@ -15,11 +20,20 @@
   }
 
   .back-button {
-    --cr-icon-button-size: 20px;
-    --cr-icon-button-icon-size: 20px;
-    pointer-events: auto;
-    z-index: auto;
-    position: relative;
+    --cr-icon-button-size: 24px;
+    --cr-icon-button-icon-size: 24px;
+    margin-left: -4px;
+    display: flex;
+    align-items: flex-start;
+  }
+
+  .button-container {
+    display: flex;
+    width: 600px;
+    padding: 24px 40px;
+    align-items: flex-end;
+    gap: 16px;
+    border-radius: 0px 0px 8px 8px;
   }
 </style>
 
@@ -78,13 +92,13 @@
     </cr-button>
   </div>
 </div>
-<!-- TODO(crbug.com/358087159): Once UX mocks are approved,
- fix the spacing and visual of the back button, this is currently a
- placeholder for functionality. -->
  <template is="dom-if" if="[[isPrivacyPolicyLinkEnabled_]]">
-  <cr-icon-button id="backButton" hidden$="[[!hideConsentNoticePage_]]"
-    class="icon-arrow-back back-button"
-    on-click="onBackToConsentNotice_"></cr-icon-button>
+  <div class="button-container" style$="[[getBackButtonBorderStyle_()]]"
+    hidden$="[[!hideConsentNoticePage_]]">
+    <cr-icon-button id="backButton"
+      iron-icon="cr:arrow-back" class="back-button"
+      on-click="onBackToConsentNotice_"></cr-icon-button>
+  </div>
   <iframe id="privacyPolicy" class="iframe hidden"
     tabindex="-1" src='chrome-untrusted://privacy-sandbox-dialog/privacy-policy'
     frameBorder="0"></iframe>
diff --git a/chrome/browser/resources/privacy_sandbox/privacy_sandbox_dialog_consent_step.ts b/chrome/browser/resources/privacy_sandbox/privacy_sandbox_dialog_consent_step.ts
index 133942e..0070621 100644
--- a/chrome/browser/resources/privacy_sandbox/privacy_sandbox_dialog_consent_step.ts
+++ b/chrome/browser/resources/privacy_sandbox/privacy_sandbox_dialog_consent_step.ts
@@ -10,6 +10,7 @@
 import './shared_style.css.js';
 import './privacy_sandbox_dialog_learn_more.js';
 
+import {loadTimeData} from 'chrome://resources/js/load_time_data.js';
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {PrivacySandboxDialogBrowserProxy, PrivacySandboxPromptAction} from './privacy_sandbox_dialog_browser_proxy.js';
@@ -37,6 +38,16 @@
       },
 
       /**
+       * If true, the notice is in dark mode.
+       */
+      isDarkMode_: {
+        type: Boolean,
+        value: () => {
+          return loadTimeData.getBoolean('isDarkMode');
+        },
+      },
+
+      /**
        * If true, the privacy policy text is hyperlinked.
        */
       isPrivacyPolicyLinkEnabled_: {
@@ -59,6 +70,7 @@
   private privacyPolicyPageLoadEndTime_: number;
   private isPrivacyPolicyLinkEnabled_: boolean;
   private hideConsentNoticePage_: boolean;
+  private isDarkMode_: boolean;
 
   override ready() {
     super.ready();
@@ -145,6 +157,10 @@
     }
   }
 
+  private getBackButtonBorderStyle_(): string {
+    return this.isDarkMode_ ? 'border-bottom: 1px solid #505254;' :
+                              'border-bottom: 1px solid #E1E3E1;';
+  }
 }
 
 declare global {
diff --git a/chrome/browser/resources/privacy_sandbox/shared_vars.css b/chrome/browser/resources/privacy_sandbox/shared_vars.css
index 1f0ec115..94fc764 100644
--- a/chrome/browser/resources/privacy_sandbox/shared_vars.css
+++ b/chrome/browser/resources/privacy_sandbox/shared_vars.css
@@ -12,6 +12,7 @@
   --scrollbar-width: 7px;
   --scrollbar-background: var(--google-grey-200);
   --privacy-sandbox-dialog-buttons-row-height: 64px;
+  --privacy-sandbox-privacy-policy-back-button-section-height: 32px;
 }
 
 @media (prefers-color-scheme: dark) {
diff --git a/chrome/browser/resources/settings/basic_page/basic_page.html b/chrome/browser/resources/settings/basic_page/basic_page.html
index 5e62f63..e33e494 100644
--- a/chrome/browser/resources/settings/basic_page/basic_page.html
+++ b/chrome/browser/resources/settings/basic_page/basic_page.html
@@ -43,7 +43,7 @@
         <template is="dom-if"
             if="[[showExperimentalAdvancedPage_(pageVisibility.ai)]]"
             restamp>
-          <settings-section page-title="$i18n{aiPageTitle}" section="ai">
+          <settings-section page-title="[[aiPageTitle_]]" section="ai">
             <settings-ai-page prefs="{{prefs}}"></settings-ai-page>
           </settings-section>
         </template>
diff --git a/chrome/browser/resources/settings/basic_page/basic_page.ts b/chrome/browser/resources/settings/basic_page/basic_page.ts
index 498c576..06ed8d7e 100644
--- a/chrome/browser/resources/settings/basic_page/basic_page.ts
+++ b/chrome/browser/resources/settings/basic_page/basic_page.ts
@@ -166,6 +166,16 @@
         type: Boolean,
         value: () => loadTimeData.getBoolean('showAdvancedFeaturesMainControl'),
       },
+
+      enableAiSettingsPageRefresh_: {
+        type: Boolean,
+        value: () => loadTimeData.getBoolean('enableAiSettingsPageRefresh'),
+      },
+
+      aiPageTitle_: {
+        type: String,
+        computed: 'computeAiPageTitle_(enableAiSettingsPageRefresh_)',
+      },
     };
   }
 
@@ -187,7 +197,8 @@
   private advancedTogglingInProgress_: boolean;
   private showBatterySettings_: boolean;
   private showAdvancedFeaturesMainControl_: boolean;
-
+  private enableAiSettingsPageRefresh_: boolean;
+  private aiPageTitle_: string;
   private showPrivacyGuidePromo_: boolean;
   private privacyGuidePromoWasShown_: boolean;
   private privacyGuideBrowserProxy_: PrivacyGuideBrowserProxy =
@@ -358,6 +369,12 @@
         this.showPage_(visibility);
   }
 
+  private computeAiPageTitle_(): string {
+    return loadTimeData.getString(
+        this.enableAiSettingsPageRefresh_ ? 'aiInnovationsPageTitle' :
+                                            'aiPageTitle');
+  }
+
   // <if expr="_google_chrome">
   private onSendPerformanceFeedbackClick_(e: Event) {
     e.stopPropagation();
diff --git a/chrome/browser/resources/settings/settings_menu/settings_menu.html b/chrome/browser/resources/settings/settings_menu/settings_menu.html
index 245f24c..49749648 100644
--- a/chrome/browser/resources/settings/settings_menu/settings_menu.html
+++ b/chrome/browser/resources/settings/settings_menu/settings_menu.html
@@ -82,9 +82,8 @@
             hidden="[[!showExperimentalMenuItem_(
                 showAdvancedFeaturesMainControl_, pageVisibility.ai)]]"
             class="cr-nav-menu-item">
-          <cr-icon icon="[[getAiPageIcon_(enableAiSettingsPageRefresh_)]]">
-          </cr-icon>
-          $i18n{aiPageTitle}
+          <cr-icon icon="[[aiPageIcon_]]"></cr-icon>
+          [[aiPageTitle_]]
           <cr-ripple></cr-ripple>
         </a>
         <a role="menuitem" id="appearance" href="/appearance"
diff --git a/chrome/browser/resources/settings/settings_menu/settings_menu.ts b/chrome/browser/resources/settings/settings_menu/settings_menu.ts
index 494e343..9261945 100644
--- a/chrome/browser/resources/settings/settings_menu/settings_menu.ts
+++ b/chrome/browser/resources/settings/settings_menu/settings_menu.ts
@@ -63,6 +63,16 @@
         type: Boolean,
         value: () => loadTimeData.getBoolean('showAdvancedFeaturesMainControl'),
       },
+
+      aiPageIcon_: {
+        type: String,
+        computed: 'computeAiPageIcon_(enableAiSettingsPageRefresh_)',
+      },
+
+      aiPageTitle_: {
+        type: String,
+        computed: 'computeAiPageTitle_(enableAiSettingsPageRefresh_)',
+      },
     };
   }
 
@@ -70,6 +80,8 @@
   private enableAiSettingsPageRefresh_: boolean;
   private showAdvancedFeaturesMainControl_: boolean;
   private routes_: SettingsRoutes;
+  private aiPageIcon_: string;
+  private aiPageTitle_: string;
 
   override ready() {
     super.ready();
@@ -81,11 +93,17 @@
         (!this.pageVisibility || this.pageVisibility.ai !== false);
   }
 
-  private getAiPageIcon_(): string {
+  private computeAiPageIcon_(): string {
     return this.enableAiSettingsPageRefresh_ ? 'settings20:magic' :
                                                'settings20:ai';
   }
 
+  private computeAiPageTitle_(): string {
+    return loadTimeData.getString(
+        this.enableAiSettingsPageRefresh_ ? 'aiInnovationsPageTitle' :
+                                            'aiPageTitle');
+  }
+
   override currentRouteChanged(newRoute: Route) {
     // Focus the initially selected path.
     const anchors = this.shadowRoot!.querySelectorAll('a');
diff --git a/chrome/browser/storage_access_api/api_browsertest.cc b/chrome/browser/storage_access_api/api_browsertest.cc
index d973cf9..18fb67f 100644
--- a/chrome/browser/storage_access_api/api_browsertest.cc
+++ b/chrome/browser/storage_access_api/api_browsertest.cc
@@ -3188,6 +3188,27 @@
 }
 
 IN_PROC_BROWSER_TEST_F(StorageAccessHeadersBrowserTest,
+                       NonCookieStorage_Subresource) {
+  SetBlockThirdPartyCookies(true);
+  EnsureUserInteractionOn(kHostB);
+  prompt_factory()->set_response_type(
+      permissions::PermissionRequestManager::ACCEPT_ALL);
+
+  NavigateToPageWithFrame(kHostA);
+  // Header will be 'none' first time we navigate to `kHostB` since the
+  // permission grant does not exist yet.
+  NavigateFrameTo(GetURL(kHostB));
+  ASSERT_TRUE(content::ExecJs(
+      GetFrame(), "document.requestStorageAccess({'localStorage': true})"));
+
+  // Subresource fetches from the embed include the "inactive" header.
+  EXPECT_EQ(CookiesFromFetch(GetFrame(), kHostB), "None");
+  EXPECT_THAT(MostRecentRequestHeaders(),
+              Contains(Pair(net::HttpRequestHeaders::kSecFetchStorageAccess,
+                            "inactive")));
+}
+
+IN_PROC_BROWSER_TEST_F(StorageAccessHeadersBrowserTest,
                        RequestHeaderRetryToActive) {
   SetBlockThirdPartyCookies(true);
   SetRetryAllowedOriginFromHost(kHostA);
diff --git a/chrome/browser/tabmodel/OWNERS b/chrome/browser/tabmodel/OWNERS
index 69e8b30..d31dcfa 100644
--- a/chrome/browser/tabmodel/OWNERS
+++ b/chrome/browser/tabmodel/OWNERS
@@ -2,4 +2,5 @@
 dtrainor@chromium.org
 hnakashima@chromium.org
 meiliang@chromium.org
+skym@chromium.org
 wnwen@chromium.org
diff --git a/chrome/browser/ui/android/autofill/autofill_error_dialog_view_android.cc b/chrome/browser/ui/android/autofill/autofill_error_dialog_view_android.cc
index d48462f..a9fc4d4 100644
--- a/chrome/browser/ui/android/autofill/autofill_error_dialog_view_android.cc
+++ b/chrome/browser/ui/android/autofill/autofill_error_dialog_view_android.cc
@@ -6,7 +6,6 @@
 
 #include <jni.h>
 #include <stddef.h>
-#include "chrome/browser/android/resource_mapper.h"
 
 #include "base/android/jni_android.h"
 #include "base/android/jni_string.h"
@@ -14,11 +13,9 @@
 #include "base/compiler_specific.h"
 #include "base/memory/weak_ptr.h"
 #include "chrome/browser/ui/autofill/payments/view_factory.h"
-#include "components/grit/components_scaled_resources.h"
 #include "content/public/browser/web_contents.h"
 #include "ui/android/view_android.h"
 #include "ui/android/window_android.h"
-#include "ui/base/resource/resource_bundle.h"
 
 // Must come after all headers that specialize FromJniType() / ToJniType().
 #include "chrome/browser/ui/android/autofill/internal/jni_headers/AutofillErrorDialogBridge_jni.h"
@@ -75,9 +72,7 @@
   Java_AutofillErrorDialogBridge_show(
       env, java_object_, ConvertUTF16ToJavaString(env, controller_->GetTitle()),
       ConvertUTF16ToJavaString(env, controller_->GetDescription()),
-      ConvertUTF16ToJavaString(env, controller_->GetButtonLabel()),
-      ResourceMapper::MapToJavaDrawableId(
-          IDR_AUTOFILL_GOOGLE_PAY_WITH_DIVIDER));
+      ConvertUTF16ToJavaString(env, controller_->GetButtonLabel()));
 }
 
 base::WeakPtr<AutofillErrorDialogView> CreateAndShowAutofillErrorDialog(
diff --git a/chrome/browser/ui/android/autofill/autofill_progress_dialog_view_android.cc b/chrome/browser/ui/android/autofill/autofill_progress_dialog_view_android.cc
index 24b483c..162e319f 100644
--- a/chrome/browser/ui/android/autofill/autofill_progress_dialog_view_android.cc
+++ b/chrome/browser/ui/android/autofill/autofill_progress_dialog_view_android.cc
@@ -12,14 +12,11 @@
 #include "base/android/scoped_java_ref.h"
 #include "base/compiler_specific.h"
 #include "base/memory/weak_ptr.h"
-#include "chrome/browser/android/resource_mapper.h"
 #include "chrome/browser/ui/autofill/payments/view_factory.h"
 #include "components/autofill/core/browser/ui/payments/autofill_progress_dialog_controller.h"
-#include "components/grit/components_scaled_resources.h"
 #include "content/public/browser/web_contents.h"
 #include "ui/android/view_android.h"
 #include "ui/android/window_android.h"
-#include "ui/base/resource/resource_bundle.h"
 
 // Must come after all headers that specialize FromJniType() / ToJniType().
 #include "chrome/browser/ui/android/autofill/internal/jni_headers/AutofillProgressDialogBridge_jni.h"
@@ -98,9 +95,7 @@
         env, java_object_,
         ConvertUTF16ToJavaString(env, controller_->GetLoadingTitle()),
         ConvertUTF16ToJavaString(env, controller_->GetLoadingMessage()),
-        ConvertUTF16ToJavaString(env, controller_->GetCancelButtonLabel()),
-        ResourceMapper::MapToJavaDrawableId(
-            IDR_AUTOFILL_GOOGLE_PAY_WITH_DIVIDER));
+        ConvertUTF16ToJavaString(env, controller_->GetCancelButtonLabel()));
     return true;
   }
   return false;
diff --git a/chrome/browser/ui/android/autofill/autofill_save_iban_bottom_sheet_bridge.cc b/chrome/browser/ui/android/autofill/autofill_save_iban_bottom_sheet_bridge.cc
index 96562cc..8eecead 100644
--- a/chrome/browser/ui/android/autofill/autofill_save_iban_bottom_sheet_bridge.cc
+++ b/chrome/browser/ui/android/autofill/autofill_save_iban_bottom_sheet_bridge.cc
@@ -66,6 +66,18 @@
       ConvertUiInfoToJavaObject(env, ui_info));
 }
 
+void AutofillSaveIbanBottomSheetBridge::Hide() {
+  JNIEnv* env = base::android::AttachCurrentThread();
+  Java_AutofillSaveIbanBottomSheetBridge_hide(
+      env, java_autofill_save_iban_bottom_sheet_bridge_);
+}
+
+AutofillSaveIbanBottomSheetBridge::AutofillSaveIbanBottomSheetBridge(
+    base::android::ScopedJavaGlobalRef<jobject>
+        java_autofill_save_iban_bottom_sheet_bridge)
+    : java_autofill_save_iban_bottom_sheet_bridge_(
+          java_autofill_save_iban_bottom_sheet_bridge) {}
+
 void AutofillSaveIbanBottomSheetBridge::OnUiAccepted(
     JNIEnv* env,
     const std::u16string& user_provided_nickname) {
diff --git a/chrome/browser/ui/android/autofill/autofill_save_iban_bottom_sheet_bridge.h b/chrome/browser/ui/android/autofill/autofill_save_iban_bottom_sheet_bridge.h
index f4c8185..55741cf9 100644
--- a/chrome/browser/ui/android/autofill/autofill_save_iban_bottom_sheet_bridge.h
+++ b/chrome/browser/ui/android/autofill/autofill_save_iban_bottom_sheet_bridge.h
@@ -36,16 +36,25 @@
   AutofillSaveIbanBottomSheetBridge& operator=(
       const AutofillSaveIbanBottomSheetBridge&) = delete;
 
-  ~AutofillSaveIbanBottomSheetBridge();
+  virtual ~AutofillSaveIbanBottomSheetBridge();
 
   // Requests to show the save IBAN bottom sheet.
   void RequestShowContent(const AutofillSaveIbanUiInfo& ui_info,
                           std::unique_ptr<AutofillSaveIbanDelegate> delegate);
 
+  // Hides the save IBAN bottom sheet.
+  virtual void Hide();
+
   void OnUiAccepted(JNIEnv* env, const std::u16string& user_provided_nickname);
   void OnUiCanceled(JNIEnv* env);
   void OnUiIgnored(JNIEnv* env);
 
+ protected:
+  // Used in tests to inject dependencies.
+  explicit AutofillSaveIbanBottomSheetBridge(
+      base::android::ScopedJavaGlobalRef<jobject>
+          java_autofill_save_iban_bottom_sheet_bridge);
+
  private:
   void ResetSaveIbanDelegate();
 
diff --git a/chrome/browser/ui/android/autofill/internal/BUILD.gn b/chrome/browser/ui/android/autofill/internal/BUILD.gn
index 8b3ac01..7d926254 100644
--- a/chrome/browser/ui/android/autofill/internal/BUILD.gn
+++ b/chrome/browser/ui/android/autofill/internal/BUILD.gn
@@ -30,7 +30,6 @@
     ":java_resources",
     "//base:base_java",
     "//build/android:build_java",
-    "//chrome/browser/flags:java",
     "//components/autofill/android:main_autofill_java",
     "//third_party/androidx:androidx_annotation_annotation_java",
     "//third_party/androidx:androidx_core_core_java",
@@ -70,7 +69,6 @@
     "//base:base_java_test_support",
     "//base:base_junit_test_support",
     "//base/test:test_support_java",
-    "//chrome/browser/flags:java",
     "//chrome/test/android:chrome_java_test_support_common",
     "//components/autofill/android:main_autofill_java",
     "//third_party/androidx:androidx_core_core_java",
diff --git a/chrome/browser/ui/android/autofill/internal/java/src/org/chromium/chrome/browser/ui/autofill/AuthenticatorSelectionDialog.java b/chrome/browser/ui/android/autofill/internal/java/src/org/chromium/chrome/browser/ui/autofill/AuthenticatorSelectionDialog.java
index 280dcbc0..64da053 100644
--- a/chrome/browser/ui/android/autofill/internal/java/src/org/chromium/chrome/browser/ui/autofill/AuthenticatorSelectionDialog.java
+++ b/chrome/browser/ui/android/autofill/internal/java/src/org/chromium/chrome/browser/ui/autofill/AuthenticatorSelectionDialog.java
@@ -11,11 +11,8 @@
 import android.widget.ImageView;
 import android.widget.TextView;
 
-import androidx.annotation.DrawableRes;
-import androidx.core.content.res.ResourcesCompat;
 import androidx.recyclerview.widget.RecyclerView;
 
-import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.ui.autofill.data.AuthenticatorOption;
 import org.chromium.chrome.browser.ui.autofill.internal.R;
 import org.chromium.ui.modaldialog.DialogDismissalCause;
@@ -125,11 +122,6 @@
                 LayoutInflater.from(mContext)
                         .inflate(R.layout.authenticator_selection_dialog, null);
 
-        boolean useCustomTitleView =
-                ChromeFeatureList.isEnabled(
-                        ChromeFeatureList.AUTOFILL_ENABLE_MOVING_GPAY_LOGO_TO_THE_RIGHT_ON_CLANK);
-        int titleIconId =
-                useCustomTitleView ? R.drawable.google_pay : R.drawable.google_pay_with_divider;
         String title =
                 mContext.getResources()
                         .getString(
@@ -137,13 +129,16 @@
                                         ? R.string
                                                 .autofill_card_auth_selection_dialog_title_multiple_options
                                         : R.string.autofill_card_unmask_verification_title);
+        ViewStub title_view_stub =
+                mAuthenticatorSelectionDialogView.findViewById(R.id.title_with_icon_stub);
+        title_view_stub.setLayoutResource(R.layout.icon_after_title_view);
+        title_view_stub.inflate();
+        TextView titleView = (TextView) mAuthenticatorSelectionDialogView.findViewById(R.id.title);
+        titleView.setText(title);
+        ImageView iconView =
+                (ImageView) mAuthenticatorSelectionDialogView.findViewById(R.id.title_icon);
+        iconView.setImageResource(R.drawable.google_pay);
 
-        if (useCustomTitleView) {
-            ViewStub stub =
-                    mAuthenticatorSelectionDialogView.findViewById(R.id.title_with_icon_stub);
-            stub.setLayoutResource(R.layout.icon_after_title_view);
-            stub.inflate();
-        }
         mAuthenticatorSelectionDialogContentsView =
                 mAuthenticatorSelectionDialogView.findViewById(
                         R.id.authenticator_selection_dialog_contents);
@@ -175,43 +170,11 @@
                         .with(
                                 ModalDialogProperties.BUTTON_STYLES,
                                 ModalDialogProperties.ButtonStyles.PRIMARY_FILLED_NEGATIVE_OUTLINE);
-        updateTitleView(useCustomTitleView, title, titleIconId, builder);
         mDialogModel = builder.build();
         mModalDialogManager.showDialog(mDialogModel, ModalDialogManager.ModalDialogType.TAB);
     }
 
     /**
-     * Updates the title and icon view. If AUTOFILL_ENABLE_MOVING_GPAY_LOGO_TO_THE_RIGHT_ON_CLANK
-     * feature is enabled, sets title and icon in the customView otherwise uses
-     * PropertyModel.Builder for title and icon.
-     *
-     * @param useCustomTitleView Indicates true/false to use custom title view.
-     * @param title Title of the prompt dialog.
-     * @param titleIcon Icon near the title.
-     * @param builder The PropertyModel.Builder instance.
-     */
-    private void updateTitleView(
-            boolean useCustomTitleView,
-            String title,
-            @DrawableRes int titleIcon,
-            PropertyModel.Builder builder) {
-        if (useCustomTitleView) {
-            TextView titleView =
-                    (TextView) mAuthenticatorSelectionDialogView.findViewById(R.id.title);
-            titleView.setText(title);
-            ImageView iconView =
-                    (ImageView) mAuthenticatorSelectionDialogView.findViewById(R.id.title_icon);
-            iconView.setImageResource(titleIcon);
-        } else {
-            builder.with(ModalDialogProperties.TITLE, title);
-            builder.with(
-                    ModalDialogProperties.TITLE_ICON,
-                    ResourcesCompat.getDrawable(
-                            mContext.getResources(), titleIcon, mContext.getTheme()));
-        }
-    }
-
-    /**
      * Dismisses the Authenticator Selection dialog.
      *
      * @param cause The dialog dismissal cause.
diff --git a/chrome/browser/ui/android/autofill/internal/java/src/org/chromium/chrome/browser/ui/autofill/AuthenticatorSelectionDialogBridgeTest.java b/chrome/browser/ui/android/autofill/internal/java/src/org/chromium/chrome/browser/ui/autofill/AuthenticatorSelectionDialogBridgeTest.java
index d9abaf6..84d03b86 100644
--- a/chrome/browser/ui/android/autofill/internal/java/src/org/chromium/chrome/browser/ui/autofill/AuthenticatorSelectionDialogBridgeTest.java
+++ b/chrome/browser/ui/android/autofill/internal/java/src/org/chromium/chrome/browser/ui/autofill/AuthenticatorSelectionDialogBridgeTest.java
@@ -22,9 +22,7 @@
 import org.mockito.junit.MockitoRule;
 
 import org.chromium.base.test.BaseRobolectricTestRunner;
-import org.chromium.base.test.util.Features.EnableFeatures;
 import org.chromium.base.test.util.JniMocker;
-import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.ui.autofill.data.AuthenticatorOption;
 import org.chromium.ui.modaldialog.ModalDialogManager.ModalDialogType;
 import org.chromium.ui.test.util.modaldialog.FakeModalDialogManager;
@@ -34,7 +32,6 @@
 
 /** Unit tests for {@link AuthenticatorSelectionDialogBridge}. */
 @RunWith(BaseRobolectricTestRunner.class)
-@EnableFeatures({ChromeFeatureList.AUTOFILL_ENABLE_MOVING_GPAY_LOGO_TO_THE_RIGHT_ON_CLANK})
 public class AuthenticatorSelectionDialogBridgeTest {
     // The icon set on the AuthenticatorOption is not important and any icon would do.
     private static final AuthenticatorOption OPTION_1 =
diff --git a/chrome/browser/ui/android/autofill/internal/java/src/org/chromium/chrome/browser/ui/autofill/AuthenticatorSelectionDialogTest.java b/chrome/browser/ui/android/autofill/internal/java/src/org/chromium/chrome/browser/ui/autofill/AuthenticatorSelectionDialogTest.java
index ee595453..d26fe07 100644
--- a/chrome/browser/ui/android/autofill/internal/java/src/org/chromium/chrome/browser/ui/autofill/AuthenticatorSelectionDialogTest.java
+++ b/chrome/browser/ui/android/autofill/internal/java/src/org/chromium/chrome/browser/ui/autofill/AuthenticatorSelectionDialogTest.java
@@ -31,9 +31,6 @@
 import org.mockito.MockitoAnnotations;
 
 import org.chromium.base.test.BaseRobolectricTestRunner;
-import org.chromium.base.test.util.Features.DisableFeatures;
-import org.chromium.base.test.util.Features.EnableFeatures;
-import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.ui.autofill.AuthenticatorOptionsAdapter.AuthenticatorOptionViewHolder;
 import org.chromium.chrome.browser.ui.autofill.data.AuthenticatorOption;
 import org.chromium.chrome.browser.ui.autofill.internal.R;
@@ -47,7 +44,6 @@
 
 /** Unit tests for {@link AuthenticatorSelectionDialog}. */
 @RunWith(BaseRobolectricTestRunner.class)
-@EnableFeatures({ChromeFeatureList.AUTOFILL_ENABLE_MOVING_GPAY_LOGO_TO_THE_RIGHT_ON_CLANK})
 public class AuthenticatorSelectionDialogTest {
     // The icon set on the AuthenticatorOption is not important and any icon would do.
     private static final AuthenticatorOption OPTION_1 =
@@ -280,79 +276,7 @@
 
     @Test
     @SmallTest
-    @DisableFeatures({ChromeFeatureList.AUTOFILL_ENABLE_MOVING_GPAY_LOGO_TO_THE_RIGHT_ON_CLANK})
-    public void testSingleAuthenticatorOption_defaultTitleView() throws Exception {
-        ArrayList<AuthenticatorOption> options = new ArrayList<>();
-        options.add(OPTION_1);
-
-        mAuthenticatorSelectionDialog.show(options);
-
-        PropertyModel model = mModalDialogManager.getShownDialogModel();
-        assertThat(model).isNotNull();
-
-        forceAuthenticatorOptionsViewLayout(model);
-
-        // Verify that the title set by modal dialog is correct.
-        assertThat(model.get(ModalDialogProperties.TITLE))
-                .isEqualTo(mResources.getString(R.string.autofill_card_unmask_verification_title));
-
-        // Verify that the title icon set by modal dialog is correct.
-        Drawable expectedDrawable =
-                ResourcesCompat.getDrawable(
-                        mResources,
-                        R.drawable.google_pay_with_divider,
-                        ApplicationProvider.getApplicationContext().getTheme());
-        assertTrue(
-                getBitmap(expectedDrawable)
-                        .sameAs(getBitmap(model.get(ModalDialogProperties.TITLE_ICON))));
-
-        // Verify that title and title icon is not set by custom view.
-        View customView = model.get(ModalDialogProperties.CUSTOM_VIEW);
-        assertThat((TextView) customView.findViewById(R.id.title)).isNull();
-        assertThat((ImageView) customView.findViewById(R.id.title_icon)).isNull();
-    }
-
-    @Test
-    @SmallTest
-    @DisableFeatures({ChromeFeatureList.AUTOFILL_ENABLE_MOVING_GPAY_LOGO_TO_THE_RIGHT_ON_CLANK})
-    public void testMultipleAuthenticatorOption_defaultTitleView() throws Exception {
-        ArrayList<AuthenticatorOption> options = new ArrayList<>();
-        options.add(OPTION_1);
-        options.add(OPTION_2);
-
-        mAuthenticatorSelectionDialog.show(options);
-
-        PropertyModel model = mModalDialogManager.getShownDialogModel();
-        assertThat(model).isNotNull();
-
-        forceAuthenticatorOptionsViewLayout(model);
-
-        // Verify that the title set by modal dialog is correct.
-        assertThat(model.get(ModalDialogProperties.TITLE))
-                .isEqualTo(
-                        mResources.getString(
-                                R.string
-                                        .autofill_card_auth_selection_dialog_title_multiple_options));
-
-        // Verify that the title icon set by modal dialog is correct.
-        Drawable expectedDrawable =
-                ResourcesCompat.getDrawable(
-                        mResources,
-                        R.drawable.google_pay_with_divider,
-                        ApplicationProvider.getApplicationContext().getTheme());
-        assertTrue(
-                getBitmap(expectedDrawable)
-                        .sameAs(getBitmap(model.get(ModalDialogProperties.TITLE_ICON))));
-
-        // Verify that title and title icon is not set by custom view.
-        View customView = model.get(ModalDialogProperties.CUSTOM_VIEW);
-        assertThat((TextView) customView.findViewById(R.id.title)).isNull();
-        assertThat((ImageView) customView.findViewById(R.id.title_icon)).isNull();
-    }
-
-    @Test
-    @SmallTest
-    public void testSingleAuthenticatorOption_customTitleView() throws Exception {
+    public void testSingleAuthenticatorOption_titleView() throws Exception {
         ArrayList<AuthenticatorOption> options = new ArrayList<>();
         options.add(OPTION_1);
 
@@ -380,15 +304,11 @@
                         ApplicationProvider.getApplicationContext().getTheme());
         assertThat(title_icon.getVisibility()).isEqualTo(View.VISIBLE);
         assertTrue(getBitmap(expectedDrawable).sameAs(getBitmap(title_icon.getDrawable())));
-
-        // Verify that title and title icon is not set by modal dialog.
-        assertThat(model.get(ModalDialogProperties.TITLE)).isNull();
-        assertThat(model.get(ModalDialogProperties.TITLE_ICON)).isNull();
     }
 
     @Test
     @SmallTest
-    public void testMultipleAuthenticatorOption_customTitleView() throws Exception {
+    public void testMultipleAuthenticatorOption_titleView() throws Exception {
         ArrayList<AuthenticatorOption> options = new ArrayList<>();
         options.add(OPTION_1);
         options.add(OPTION_2);
@@ -420,10 +340,6 @@
                         ApplicationProvider.getApplicationContext().getTheme());
         assertThat(title_icon.getVisibility()).isEqualTo(View.VISIBLE);
         assertTrue(getBitmap(expectedDrawable).sameAs(getBitmap(title_icon.getDrawable())));
-
-        // Verify that title and title icon is not set by modal dialog.
-        assertThat(model.get(ModalDialogProperties.TITLE)).isNull();
-        assertThat(model.get(ModalDialogProperties.TITLE_ICON)).isNull();
     }
 
     private PropertyModel createAndShowModelForChangeSelectedOptionTest() {
diff --git a/chrome/browser/ui/android/autofill/internal/java/src/org/chromium/chrome/browser/ui/autofill/AutofillErrorDialogBridge.java b/chrome/browser/ui/android/autofill/internal/java/src/org/chromium/chrome/browser/ui/autofill/AutofillErrorDialogBridge.java
index b677c8e..a4aa60c5c 100644
--- a/chrome/browser/ui/android/autofill/internal/java/src/org/chromium/chrome/browser/ui/autofill/AutofillErrorDialogBridge.java
+++ b/chrome/browser/ui/android/autofill/internal/java/src/org/chromium/chrome/browser/ui/autofill/AutofillErrorDialogBridge.java
@@ -11,14 +11,10 @@
 import android.widget.ImageView;
 import android.widget.TextView;
 
-import androidx.annotation.DrawableRes;
-import androidx.core.content.res.ResourcesCompat;
-
 import org.jni_zero.CalledByNative;
 import org.jni_zero.JNINamespace;
 import org.jni_zero.NativeMethods;
 
-import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.ui.autofill.internal.R;
 import org.chromium.ui.base.WindowAndroid;
 import org.chromium.ui.modaldialog.DialogDismissalCause;
@@ -78,70 +74,30 @@
      * @param title Title for the error dialog.
      * @param description Description for the error dialog which shows below the title.
      * @param buttonLabel Label for the positive button which acts as a cancel button.
-     * @param titleIconId The resource id for the icon to be displayed to the left of the title. If
-     * flag 'AUTOFILL_ENABLE_MOVING_GPAY_LOGO_TO_THE_RIGHT_ON_CLANK' is enabled titleIconId is
-     * overridden.
      */
     @CalledByNative
-    public void show(String title, String description, String buttonLabel, int titleIconId) {
+    public void show(String title, String description, String buttonLabel) {
         View errorDialogContentView =
                 LayoutInflater.from(mContext).inflate(R.layout.autofill_error_dialog, null);
         ((TextView) errorDialogContentView.findViewById(R.id.error_message)).setText(description);
 
-        boolean useCustomTitleView =
-                ChromeFeatureList.isEnabled(
-                        ChromeFeatureList.AUTOFILL_ENABLE_MOVING_GPAY_LOGO_TO_THE_RIGHT_ON_CLANK);
-        if (useCustomTitleView) {
-            ViewStub stub = errorDialogContentView.findViewById(R.id.title_with_icon_stub);
-            stub.setLayoutResource(R.layout.icon_after_title_view);
-            stub.inflate();
-            titleIconId = R.drawable.google_pay;
-        }
+        ViewStub title_view_stub = errorDialogContentView.findViewById(R.id.title_with_icon_stub);
+        title_view_stub.setLayoutResource(R.layout.icon_after_title_view);
+        title_view_stub.inflate();
+        TextView titleView = (TextView) errorDialogContentView.findViewById(R.id.title);
+        titleView.setText(title);
+        ImageView iconView = (ImageView) errorDialogContentView.findViewById(R.id.title_icon);
+        iconView.setImageResource(R.drawable.google_pay);
         PropertyModel.Builder builder =
                 new PropertyModel.Builder(ModalDialogProperties.ALL_KEYS)
                         .with(ModalDialogProperties.CONTROLLER, mModalDialogController)
                         .with(ModalDialogProperties.CUSTOM_VIEW, errorDialogContentView)
                         .with(ModalDialogProperties.NEGATIVE_BUTTON_DISABLED, true)
                         .with(ModalDialogProperties.POSITIVE_BUTTON_TEXT, buttonLabel);
-        updateTitleView(useCustomTitleView, title, titleIconId, builder, errorDialogContentView);
         mDialogModel = builder.build();
         mModalDialogManager.showDialog(mDialogModel, ModalDialogManager.ModalDialogType.TAB);
     }
 
-    /**
-     * Updates the title and icon view. If AUTOFILL_ENABLE_MOVING_GPAY_LOGO_TO_THE_RIGHT_ON_CLANK
-     * feature is enabled, sets title and icon in the customView otherwise uses
-     * PropertyModel.Builder for title and icon.
-     *
-     * @param useCustomTitleView Indicates true/false to use custom title view.
-     * @param title Title of the prompt dialog.
-     * @param titleIcon Icon near the title.
-     * @param builder The PropertyModel.Builder instance.
-     * @param errorDialogContentView The CUSTOM_VIEW used in the PropertyModel that also has the
-     * view stub for custom title view.
-     */
-    private void updateTitleView(
-            boolean useCustomTitleView,
-            String title,
-            @DrawableRes int titleIcon,
-            PropertyModel.Builder builder,
-            View errorDialogContentView) {
-        if (useCustomTitleView) {
-            TextView titleView = (TextView) errorDialogContentView.findViewById(R.id.title);
-            titleView.setText(title);
-            ImageView iconView = (ImageView) errorDialogContentView.findViewById(R.id.title_icon);
-            iconView.setImageResource(titleIcon);
-        } else {
-            builder.with(ModalDialogProperties.TITLE, title);
-            if (titleIcon != 0) {
-                builder.with(
-                        ModalDialogProperties.TITLE_ICON,
-                        ResourcesCompat.getDrawable(
-                                mContext.getResources(), titleIcon, mContext.getTheme()));
-            }
-        }
-    }
-
     /** Dismisses the currently showing dialog. */
     @CalledByNative
     public void dismiss() {
diff --git a/chrome/browser/ui/android/autofill/internal/java/src/org/chromium/chrome/browser/ui/autofill/AutofillErrorDialogBridgeTest.java b/chrome/browser/ui/android/autofill/internal/java/src/org/chromium/chrome/browser/ui/autofill/AutofillErrorDialogBridgeTest.java
index 07090ede..500e318e 100644
--- a/chrome/browser/ui/android/autofill/internal/java/src/org/chromium/chrome/browser/ui/autofill/AutofillErrorDialogBridgeTest.java
+++ b/chrome/browser/ui/android/autofill/internal/java/src/org/chromium/chrome/browser/ui/autofill/AutofillErrorDialogBridgeTest.java
@@ -33,10 +33,7 @@
 import org.mockito.junit.MockitoRule;
 
 import org.chromium.base.test.BaseRobolectricTestRunner;
-import org.chromium.base.test.util.Features.DisableFeatures;
-import org.chromium.base.test.util.Features.EnableFeatures;
 import org.chromium.base.test.util.JniMocker;
-import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.ui.autofill.internal.R;
 import org.chromium.ui.modaldialog.ModalDialogManager.ModalDialogType;
 import org.chromium.ui.modaldialog.ModalDialogProperties;
@@ -45,7 +42,6 @@
 
 /** Unit tests for {@link AutofillErrorDialogBridge} */
 @RunWith(BaseRobolectricTestRunner.class)
-@EnableFeatures({ChromeFeatureList.AUTOFILL_ENABLE_MOVING_GPAY_LOGO_TO_THE_RIGHT_ON_CLANK})
 public class AutofillErrorDialogBridgeTest {
     @Rule public MockitoRule mMockitoRule = MockitoJUnit.rule();
     @Rule public JniMocker mMocker = new JniMocker();
@@ -77,7 +73,7 @@
     @Test
     @SmallTest
     public void testBasic() throws Exception {
-        showErrorDialog(/* titleIconId= */ 0);
+        showErrorDialog();
         Assert.assertNotNull(mModalDialogManager.getShownDialogModel());
 
         mAutofillErrorDialogBridge.dismiss();
@@ -89,7 +85,7 @@
     @Test
     @SmallTest
     public void testDismissedCalledOnButtonClick() throws Exception {
-        showErrorDialog(/* titleIconId= */ 0);
+        showErrorDialog();
 
         mModalDialogManager.clickPositiveButton();
 
@@ -98,38 +94,8 @@
 
     @Test
     @SmallTest
-    @DisableFeatures({ChromeFeatureList.AUTOFILL_ENABLE_MOVING_GPAY_LOGO_TO_THE_RIGHT_ON_CLANK})
-    public void testDefaultTitleView() throws Exception {
-        int titleIconId = R.drawable.google_pay_with_divider;
-        showErrorDialog(/* titleIconId= */ titleIconId);
-
-        PropertyModel model = mModalDialogManager.getShownDialogModel();
-        Assert.assertNotNull(model);
-
-        // Verify that the title set by modal dialog is correct.
-        assertThat(model.get(ModalDialogProperties.TITLE)).isEqualTo(ERROR_DIALOG_TITLE);
-
-        // Verify that the title icon set by modal dialog is correct.
-        Drawable expectedDrawable =
-                ResourcesCompat.getDrawable(
-                        mResources,
-                        titleIconId,
-                        ApplicationProvider.getApplicationContext().getTheme());
-        assertTrue(
-                getBitmap(expectedDrawable)
-                        .sameAs(getBitmap(model.get(ModalDialogProperties.TITLE_ICON))));
-
-        // Verify that title and title icon is not set by custom view.
-        View customView = model.get(ModalDialogProperties.CUSTOM_VIEW);
-        assertThat((TextView) customView.findViewById(R.id.title)).isNull();
-        assertThat((ImageView) customView.findViewById(R.id.title_icon)).isNull();
-    }
-
-    @Test
-    @SmallTest
-    public void testCustomTitleView() throws Exception {
-        int titleIconId = R.drawable.google_pay;
-        showErrorDialog(/* titleIconId= */ titleIconId);
+    public void testTitleView() throws Exception {
+        showErrorDialog();
 
         PropertyModel model = mModalDialogManager.getShownDialogModel();
         Assert.assertNotNull(model);
@@ -146,22 +112,15 @@
         Drawable expectedDrawable =
                 ResourcesCompat.getDrawable(
                         mResources,
-                        titleIconId,
+                        R.drawable.google_pay,
                         ApplicationProvider.getApplicationContext().getTheme());
         assertThat(title_icon.getVisibility()).isEqualTo(View.VISIBLE);
         assertTrue(getBitmap(expectedDrawable).sameAs(getBitmap(title_icon.getDrawable())));
-
-        // Verify that title and title icon is not set by modal dialog.
-        assertThat(model.get(ModalDialogProperties.TITLE)).isNull();
-        assertThat(model.get(ModalDialogProperties.TITLE_ICON)).isNull();
     }
 
-    private void showErrorDialog(int titleIconId) {
+    private void showErrorDialog() {
         mAutofillErrorDialogBridge.show(
-                ERROR_DIALOG_TITLE,
-                ERROR_DIALOG_DESCRIPTION,
-                ERROR_DIALOG_BUTTON_LABEL,
-                /* iconId= */ titleIconId);
+                ERROR_DIALOG_TITLE, ERROR_DIALOG_DESCRIPTION, ERROR_DIALOG_BUTTON_LABEL);
     }
 
     // Convert a drawable to a Bitmap for comparison.
diff --git a/chrome/browser/ui/android/autofill/internal/java/src/org/chromium/chrome/browser/ui/autofill/AutofillProgressDialogBridge.java b/chrome/browser/ui/android/autofill/internal/java/src/org/chromium/chrome/browser/ui/autofill/AutofillProgressDialogBridge.java
index 3b51a03..5e973953 100644
--- a/chrome/browser/ui/android/autofill/internal/java/src/org/chromium/chrome/browser/ui/autofill/AutofillProgressDialogBridge.java
+++ b/chrome/browser/ui/android/autofill/internal/java/src/org/chromium/chrome/browser/ui/autofill/AutofillProgressDialogBridge.java
@@ -12,14 +12,10 @@
 import android.widget.ImageView;
 import android.widget.TextView;
 
-import androidx.annotation.DrawableRes;
-import androidx.core.content.res.ResourcesCompat;
-
 import org.jni_zero.CalledByNative;
 import org.jni_zero.JNINamespace;
 import org.jni_zero.NativeMethods;
 
-import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.ui.autofill.internal.R;
 import org.chromium.ui.base.WindowAndroid;
 import org.chromium.ui.modaldialog.DialogDismissalCause;
@@ -81,27 +77,21 @@
      * Shows a progress bar dialog.
      *
      * @param loadingMessage Message to show below the progress bar.
-     * @param titleIconId The resource id for the icon to be displayed to the left of the title. If
-     * flag 'AUTOFILL_ENABLE_MOVING_GPAY_LOGO_TO_THE_RIGHT_ON_CLANK' is enabled titleIconId is
-     * overridden.
      */
     @CalledByNative
-    public void showDialog(
-            String title, String loadingMessage, String buttonLabel, int titleIconId) {
+    public void showDialog(String title, String loadingMessage, String buttonLabel) {
         mProgressDialogContentView =
                 LayoutInflater.from(mContext).inflate(R.layout.autofill_progress_dialog, null);
         ((TextView) mProgressDialogContentView.findViewById(R.id.message)).setText(loadingMessage);
 
-        boolean useCustomTitleView =
-                ChromeFeatureList.isEnabled(
-                        ChromeFeatureList.AUTOFILL_ENABLE_MOVING_GPAY_LOGO_TO_THE_RIGHT_ON_CLANK);
-
-        if (useCustomTitleView) {
-            ViewStub stub = mProgressDialogContentView.findViewById(R.id.title_with_icon_stub);
-            stub.setLayoutResource(R.layout.icon_after_title_view);
-            stub.inflate();
-            titleIconId = R.drawable.google_pay;
-        }
+        ViewStub title_view_stub =
+                mProgressDialogContentView.findViewById(R.id.title_with_icon_stub);
+        title_view_stub.setLayoutResource(R.layout.icon_after_title_view);
+        title_view_stub.inflate();
+        TextView titleView = (TextView) mProgressDialogContentView.findViewById(R.id.title);
+        titleView.setText(title);
+        ImageView iconView = (ImageView) mProgressDialogContentView.findViewById(R.id.title_icon);
+        iconView.setImageResource(R.drawable.google_pay);
 
         PropertyModel.Builder builder =
                 new PropertyModel.Builder(ModalDialogProperties.ALL_KEYS)
@@ -109,47 +99,14 @@
                         .with(ModalDialogProperties.CUSTOM_VIEW, mProgressDialogContentView)
                         .with(ModalDialogProperties.POSITIVE_BUTTON_DISABLED, true)
                         .with(ModalDialogProperties.NEGATIVE_BUTTON_TEXT, buttonLabel);
-        updateTitleView(useCustomTitleView, title, titleIconId, builder);
         mDialogModel = builder.build();
         mModalDialogManager.showDialog(mDialogModel, ModalDialogManager.ModalDialogType.TAB);
     }
 
     /**
-     * Updates the title and icon view. If AUTOFILL_ENABLE_MOVING_GPAY_LOGO_TO_THE_RIGHT_ON_CLANK
-     * feature is enabled, sets title and icon in the customView otherwise uses
-     * PropertyModel.Builder for title and icon.
-     *
-     * @param useCustomTitleView Indicates true/false to use custom title view.
-     * @param title Title of the prompt dialog.
-     * @param titleIcon Icon near the title.
-     * @param builder The PropertyModel.Builder instance.
-     */
-    private void updateTitleView(
-            boolean useCustomTitleView,
-            String title,
-            @DrawableRes int titleIcon,
-            PropertyModel.Builder builder) {
-        if (useCustomTitleView) {
-            TextView titleView = (TextView) mProgressDialogContentView.findViewById(R.id.title);
-            titleView.setText(title);
-            ImageView iconView =
-                    (ImageView) mProgressDialogContentView.findViewById(R.id.title_icon);
-            iconView.setImageResource(titleIcon);
-        } else {
-            builder.with(ModalDialogProperties.TITLE, title);
-            if (titleIcon != 0) {
-                builder.with(
-                        ModalDialogProperties.TITLE_ICON,
-                        ResourcesCompat.getDrawable(
-                                mContext.getResources(), titleIcon, mContext.getTheme()));
-            }
-        }
-    }
-
-    /**
      * Replaces the progress bar and loadingMessage with a confirmation icon and message and then
-     * dismisses the dialog after a certain period of time.
-     * NOTE: This should only be called after show(~) has been called.
+     * dismisses the dialog after a certain period of time. NOTE: This should only be called after
+     * show(~) has been called.
      *
      * @param confirmationMessage Message to show below the confirmation icon
      */
diff --git a/chrome/browser/ui/android/autofill/internal/java/src/org/chromium/chrome/browser/ui/autofill/AutofillProgressDialogBridgeTest.java b/chrome/browser/ui/android/autofill/internal/java/src/org/chromium/chrome/browser/ui/autofill/AutofillProgressDialogBridgeTest.java
index c446ad8..fd14684e 100644
--- a/chrome/browser/ui/android/autofill/internal/java/src/org/chromium/chrome/browser/ui/autofill/AutofillProgressDialogBridgeTest.java
+++ b/chrome/browser/ui/android/autofill/internal/java/src/org/chromium/chrome/browser/ui/autofill/AutofillProgressDialogBridgeTest.java
@@ -33,10 +33,7 @@
 import org.mockito.junit.MockitoRule;
 
 import org.chromium.base.test.BaseRobolectricTestRunner;
-import org.chromium.base.test.util.Features.DisableFeatures;
-import org.chromium.base.test.util.Features.EnableFeatures;
 import org.chromium.base.test.util.JniMocker;
-import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.ui.autofill.internal.R;
 import org.chromium.ui.modaldialog.ModalDialogManager.ModalDialogType;
 import org.chromium.ui.modaldialog.ModalDialogProperties;
@@ -45,7 +42,6 @@
 
 /** Unit tests for {@link AutofillProgressDialogBridge} */
 @RunWith(BaseRobolectricTestRunner.class)
-@EnableFeatures({ChromeFeatureList.AUTOFILL_ENABLE_MOVING_GPAY_LOGO_TO_THE_RIGHT_ON_CLANK})
 public class AutofillProgressDialogBridgeTest {
     @Rule public MockitoRule mMockitoRule = MockitoJUnit.rule();
     @Rule public JniMocker mMocker = new JniMocker();
@@ -62,12 +58,9 @@
     private FakeModalDialogManager mModalDialogManager;
     private Resources mResources;
 
-    private void showProgressDialog(int titleIconId) {
+    private void showProgressDialog() {
         mAutofillProgressDialogBridge.showDialog(
-                PROGRESS_DIALOG_TITLE,
-                PROGRESS_DIALOG_MESSAGE,
-                PROGRESS_DIALOG_BUTTON_LABEL,
-                /* iconId= */ titleIconId);
+                PROGRESS_DIALOG_TITLE, PROGRESS_DIALOG_MESSAGE, PROGRESS_DIALOG_BUTTON_LABEL);
     }
 
     @Before
@@ -86,7 +79,7 @@
     @Test
     @SmallTest
     public void testBasic() throws Exception {
-        showProgressDialog(/* titleIconId= */ 0);
+        showProgressDialog();
         Assert.assertNotNull(mModalDialogManager.getShownDialogModel());
 
         mAutofillProgressDialogBridge.dismiss();
@@ -97,7 +90,7 @@
 
     @Test
     public void testSuccessful() throws Exception {
-        showProgressDialog(/* titleIconId= */ 0);
+        showProgressDialog();
         Assert.assertNotNull(mModalDialogManager.getShownDialogModel());
         View dialogView =
                 mModalDialogManager.getShownDialogModel().get(ModalDialogProperties.CUSTOM_VIEW);
@@ -126,7 +119,7 @@
     @Test
     @SmallTest
     public void testDismissedCalledOnButtonClick() throws Exception {
-        showProgressDialog(/* titleIconId= */ 0);
+        showProgressDialog();
 
         mModalDialogManager.clickNegativeButton();
 
@@ -135,38 +128,8 @@
 
     @Test
     @SmallTest
-    @DisableFeatures({ChromeFeatureList.AUTOFILL_ENABLE_MOVING_GPAY_LOGO_TO_THE_RIGHT_ON_CLANK})
-    public void testDefaultTitleView() throws Exception {
-        int titleIconId = R.drawable.google_pay_with_divider;
-        showProgressDialog(/* titleIconId= */ titleIconId);
-
-        PropertyModel model = mModalDialogManager.getShownDialogModel();
-        Assert.assertNotNull(model);
-
-        // Verify that the title set by modal dialog is correct.
-        assertThat(model.get(ModalDialogProperties.TITLE)).isEqualTo(PROGRESS_DIALOG_TITLE);
-
-        // Verify that the title icon set by modal dialog is correct.
-        Drawable expectedDrawable =
-                ResourcesCompat.getDrawable(
-                        mResources,
-                        titleIconId,
-                        ApplicationProvider.getApplicationContext().getTheme());
-        assertTrue(
-                getBitmap(expectedDrawable)
-                        .sameAs(getBitmap(model.get(ModalDialogProperties.TITLE_ICON))));
-
-        // Verify that title and title icon is not set by custom view.
-        View customView = model.get(ModalDialogProperties.CUSTOM_VIEW);
-        assertThat((TextView) customView.findViewById(R.id.title)).isNull();
-        assertThat((ImageView) customView.findViewById(R.id.title_icon)).isNull();
-    }
-
-    @Test
-    @SmallTest
-    public void testCustomTitleView() throws Exception {
-        int titleIconId = R.drawable.google_pay;
-        showProgressDialog(/* titleIconId= */ titleIconId);
+    public void testTitleView() throws Exception {
+        showProgressDialog();
 
         PropertyModel model = mModalDialogManager.getShownDialogModel();
         Assert.assertNotNull(model);
@@ -183,14 +146,10 @@
         Drawable expectedDrawable =
                 ResourcesCompat.getDrawable(
                         mResources,
-                        titleIconId,
+                        R.drawable.google_pay,
                         ApplicationProvider.getApplicationContext().getTheme());
         assertThat(title_icon.getVisibility()).isEqualTo(View.VISIBLE);
         assertTrue(getBitmap(expectedDrawable).sameAs(getBitmap(title_icon.getDrawable())));
-
-        // Verify that title and title icon is not set by modal dialog.
-        assertThat(model.get(ModalDialogProperties.TITLE)).isNull();
-        assertThat(model.get(ModalDialogProperties.TITLE_ICON)).isNull();
     }
 
     // Convert a drawable to a Bitmap for comparison.
diff --git a/chrome/browser/ui/android/autofill/internal/java/src/org/chromium/chrome/browser/ui/autofill/OtpVerificationDialogCoordinator.java b/chrome/browser/ui/android/autofill/internal/java/src/org/chromium/chrome/browser/ui/autofill/OtpVerificationDialogCoordinator.java
index 6dab2c2..a869909 100644
--- a/chrome/browser/ui/android/autofill/internal/java/src/org/chromium/chrome/browser/ui/autofill/OtpVerificationDialogCoordinator.java
+++ b/chrome/browser/ui/android/autofill/internal/java/src/org/chromium/chrome/browser/ui/autofill/OtpVerificationDialogCoordinator.java
@@ -15,11 +15,8 @@
 import android.widget.ImageView;
 import android.widget.TextView;
 
-import androidx.annotation.DrawableRes;
 import androidx.annotation.VisibleForTesting;
-import androidx.core.content.res.ResourcesCompat;
 
-import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.ui.autofill.internal.R;
 import org.chromium.ui.modaldialog.ModalDialogManager;
 import org.chromium.ui.modaldialog.ModalDialogProperties;
@@ -89,22 +86,17 @@
         mContext = context;
         mDialogView = dialogView;
 
-        boolean useCustomTitleView =
-                ChromeFeatureList.isEnabled(
-                        ChromeFeatureList.AUTOFILL_ENABLE_MOVING_GPAY_LOGO_TO_THE_RIGHT_ON_CLANK);
-        int titleIconId =
-                useCustomTitleView ? R.drawable.google_pay : R.drawable.google_pay_with_divider;
-        String title =
+        ViewStub title_view_stub = mDialogView.findViewById(R.id.title_with_icon_stub);
+        title_view_stub.setLayoutResource(R.layout.icon_after_title_view);
+        title_view_stub.inflate();
+        TextView titleView = (TextView) mDialogView.findViewById(R.id.title);
+        titleView.setText(
                 mContext.getResources()
-                        .getString(R.string.autofill_card_unmask_otp_input_dialog_title);
+                        .getString(R.string.autofill_card_unmask_otp_input_dialog_title));
+        ImageView iconView = (ImageView) mDialogView.findViewById(R.id.title_icon);
+        iconView.setImageResource(R.drawable.google_pay);
 
-        if (useCustomTitleView) {
-            ViewStub stub = mDialogView.findViewById(R.id.title_with_icon_stub);
-            stub.setLayoutResource(R.layout.icon_after_title_view);
-            stub.inflate();
-        }
         PropertyModel.Builder dialogModelBuilder = getModalDialogModelBuilder(mDialogView);
-        updateTitleView(useCustomTitleView, title, titleIconId, dialogModelBuilder);
 
         mMediator =
                 new OtpVerificationDialogMediator(modalDialogManager, dialogModelBuilder, delegate);
@@ -192,33 +184,4 @@
                         ModalDialogProperties.BUTTON_STYLES,
                         ModalDialogProperties.ButtonStyles.PRIMARY_FILLED_NEGATIVE_OUTLINE);
     }
-
-    /**
-     * Updates the title and icon view. If AUTOFILL_ENABLE_MOVING_GPAY_LOGO_TO_THE_RIGHT_ON_CLANK
-     * feature is enabled, sets title and icon in the customView otherwise uses
-     * PropertyModel.Builder for title and icon.
-     *
-     * @param useCustomTitleView Indicates true/false to use custom title view.
-     * @param title Title of the prompt dialog.
-     * @param titleIcon Icon near the title.
-     * @param builder The PropertyModel.Builder instance.
-     */
-    private void updateTitleView(
-            boolean useCustomTitleView,
-            String title,
-            @DrawableRes int titleIcon,
-            PropertyModel.Builder builder) {
-        if (useCustomTitleView) {
-            TextView titleView = (TextView) mDialogView.findViewById(R.id.title);
-            titleView.setText(title);
-            ImageView iconView = (ImageView) mDialogView.findViewById(R.id.title_icon);
-            iconView.setImageResource(titleIcon);
-        } else {
-            builder.with(ModalDialogProperties.TITLE, title);
-            builder.with(
-                    ModalDialogProperties.TITLE_ICON,
-                    ResourcesCompat.getDrawable(
-                            mContext.getResources(), titleIcon, mContext.getTheme()));
-        }
-    }
 }
diff --git a/chrome/browser/ui/android/autofill/internal/java/src/org/chromium/chrome/browser/ui/autofill/OtpVerificationDialogTest.java b/chrome/browser/ui/android/autofill/internal/java/src/org/chromium/chrome/browser/ui/autofill/OtpVerificationDialogTest.java
index 237f377..49422d4 100644
--- a/chrome/browser/ui/android/autofill/internal/java/src/org/chromium/chrome/browser/ui/autofill/OtpVerificationDialogTest.java
+++ b/chrome/browser/ui/android/autofill/internal/java/src/org/chromium/chrome/browser/ui/autofill/OtpVerificationDialogTest.java
@@ -32,9 +32,6 @@
 import org.mockito.MockitoAnnotations;
 
 import org.chromium.base.test.BaseRobolectricTestRunner;
-import org.chromium.base.test.util.Features.DisableFeatures;
-import org.chromium.base.test.util.Features.EnableFeatures;
-import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.ui.autofill.internal.R;
 import org.chromium.ui.modaldialog.DialogDismissalCause;
 import org.chromium.ui.modaldialog.ModalDialogManager.ModalDialogType;
@@ -46,7 +43,6 @@
 
 /** Unit tests for {@link OtpVerificationDialogView}. */
 @RunWith(BaseRobolectricTestRunner.class)
-@EnableFeatures({ChromeFeatureList.AUTOFILL_ENABLE_MOVING_GPAY_LOGO_TO_THE_RIGHT_ON_CLANK})
 public class OtpVerificationDialogTest {
 
     private static final String ERROR_MESSAGE = "Error message";
@@ -182,36 +178,7 @@
     }
 
     @Test
-    @DisableFeatures({ChromeFeatureList.AUTOFILL_ENABLE_MOVING_GPAY_LOGO_TO_THE_RIGHT_ON_CLANK})
-    public void testDefaultTitleView() throws Exception {
-        mOtpVerificationDialogCoordinator.show(/* otpLength= */ 6);
-
-        PropertyModel model = mModalDialogManager.getShownDialogModel();
-        assertThat(model).isNotNull();
-
-        // Verify that the title set by modal dialog is correct.
-        assertThat(model.get(ModalDialogProperties.TITLE))
-                .isEqualTo(
-                        mResources.getString(R.string.autofill_card_unmask_otp_input_dialog_title));
-
-        // Verify that the title icon set by modal dialog is correct.
-        Drawable expectedDrawable =
-                ResourcesCompat.getDrawable(
-                        mResources,
-                        R.drawable.google_pay_with_divider,
-                        ApplicationProvider.getApplicationContext().getTheme());
-        assertTrue(
-                getBitmap(expectedDrawable)
-                        .sameAs(getBitmap(model.get(ModalDialogProperties.TITLE_ICON))));
-
-        // Verify that title and title icon is not set by custom view.
-        View customView = model.get(ModalDialogProperties.CUSTOM_VIEW);
-        assertThat((TextView) customView.findViewById(R.id.title)).isNull();
-        assertThat((ImageView) customView.findViewById(R.id.title_icon)).isNull();
-    }
-
-    @Test
-    public void testCustomTitleView() throws Exception {
+    public void testTitleView() throws Exception {
         mOtpVerificationDialogCoordinator.show(/* otpLength= */ 6);
 
         PropertyModel model = mModalDialogManager.getShownDialogModel();
@@ -235,10 +202,6 @@
                         ApplicationProvider.getApplicationContext().getTheme());
         assertThat(title_icon.getVisibility()).isEqualTo(View.VISIBLE);
         assertTrue(getBitmap(expectedDrawable).sameAs(getBitmap(title_icon.getDrawable())));
-
-        // Verify that title and title icon is not set by modal dialog.
-        assertThat(model.get(ModalDialogProperties.TITLE)).isNull();
-        assertThat(model.get(ModalDialogProperties.TITLE_ICON)).isNull();
     }
 
     // Convert a drawable to a Bitmap for comparison.
diff --git a/chrome/browser/ui/android/edge_to_edge/internal/java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeControllerImpl.java b/chrome/browser/ui/android/edge_to_edge/internal/java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeControllerImpl.java
index 30fd19e..ecdc3438 100644
--- a/chrome/browser/ui/android/edge_to_edge/internal/java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeControllerImpl.java
+++ b/chrome/browser/ui/android/edge_to_edge/internal/java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeControllerImpl.java
@@ -5,8 +5,6 @@
 package org.chromium.chrome.browser.ui.edge_to_edge;
 
 import android.app.Activity;
-import android.content.ComponentCallbacks;
-import android.content.res.Configuration;
 import android.graphics.Rect;
 import android.os.Build.VERSION_CODES;
 import android.view.View;
@@ -68,7 +66,6 @@
     private final Callback<LayoutManager> mOnLayoutManagerCallback =
             new ValueChangedCallback<>(this::updateLayoutStateProvider);
     private final FullscreenManager mFullscreenManager;
-    private final ComponentCallbacks mComponentCallback;
     private final @NonNull EdgeToEdgeStateProvider mEdgeToEdgeStateProvider;
     private final int mEdgeToEdgeToken;
 
@@ -185,20 +182,6 @@
         mWindowInsetsConsumer = this::handleWindowInsets;
         mInsetObserver.addInsetsConsumer(mWindowInsetsConsumer);
 
-        mComponentCallback =
-                new ComponentCallbacks() {
-                    @Override
-                    public void onConfigurationChanged(@NonNull Configuration newConfig) {
-                        // When configuration changed, force an padding update.
-                        // See https://crbug.com/369887909
-                        drawToEdge(mIsPageOptedIntoEdgeToEdge, /* changedWindowState= */ true);
-                    }
-
-                    @Override
-                    public void onLowMemory() {}
-                };
-        mActivity.registerComponentCallbacks(mComponentCallback);
-
         assert mInsetObserver.getLastRawWindowInsets() != null
                 : "The inset observer should have non-null insets by the time the"
                         + " EdgeToEdgeControllerImpl is initialized.";
@@ -501,11 +484,6 @@
             topPadding = Math.max(0, mCachedWindowVisibleRect.top - mCachedContentVisibleRect.top);
             bottomPadding =
                     Math.max(0, mCachedContentVisibleRect.bottom - mCachedWindowVisibleRect.bottom);
-        } else if (topPadding == 0) {
-            // In odd cases, we see Chrome has set a 0 as top padding observed in
-            // crbug.com/369887909. In those cases, fix the padding based on the visible area.
-            Log.w(TAG, "topPadding = 0 when not in fullscreen mode.");
-            topPadding = Math.abs(mCachedWindowVisibleRect.top - mCachedContentVisibleRect.top);
         }
 
         // Use Insets to store the paddings as it is immutable.
@@ -534,7 +512,6 @@
     @CallSuper
     @Override
     public void destroy() {
-        mActivity.unregisterComponentCallbacks(mComponentCallback);
         if (mWebContentsObserver != null) {
             mWebContentsObserver.destroy();
             mWebContentsObserver = null;
diff --git a/chrome/browser/ui/autofill/payments/chrome_payments_autofill_client.cc b/chrome/browser/ui/autofill/payments/chrome_payments_autofill_client.cc
index 00bc2df..5dbf6aa 100644
--- a/chrome/browser/ui/autofill/payments/chrome_payments_autofill_client.cc
+++ b/chrome/browser/ui/autofill/payments/chrome_payments_autofill_client.cc
@@ -527,7 +527,16 @@
 
 void ChromePaymentsAutofillClient::IbanUploadCompleted(bool iban_saved,
                                                        bool hit_max_strikes) {
-#if !BUILDFLAG(IS_ANDROID)
+#if BUILDFLAG(IS_ANDROID)
+  if (auto* bridge = GetOrCreateAutofillSaveIbanBottomSheetBridge()) {
+    bridge->Hide();
+  }
+  if (iban_saved) {
+    client_->GetAutofillSnackbarController()->Show(
+        AutofillSnackbarType::kSaveServerIbanSuccess,
+        /*on_action_clicked_callback=*/base::DoNothing());
+  }
+#else  // BUILDFLAG(IS_ANDROID)
   if (IbanBubbleControllerImpl* controller =
           IbanBubbleControllerImpl::FromWebContents(web_contents())) {
     controller->ShowConfirmationBubbleView(iban_saved, hit_max_strikes);
@@ -928,6 +937,14 @@
       std::move(autofill_save_card_bottom_sheet_bridge);
 }
 
+void ChromePaymentsAutofillClient::
+    SetAutofillSaveIbanBottomSheetBridgeForTesting(
+        std::unique_ptr<AutofillSaveIbanBottomSheetBridge>
+            autofill_save_iban_bottom_sheet_bridge) {
+  autofill_save_iban_bottom_sheet_bridge_ =
+      std::move(autofill_save_iban_bottom_sheet_bridge);
+}
+
 void ChromePaymentsAutofillClient::SetAutofillMessageControllerForTesting(
     std::unique_ptr<AutofillMessageController> autofill_message_controller) {
   autofill_message_controller_ = std::move(autofill_message_controller);
diff --git a/chrome/browser/ui/autofill/payments/chrome_payments_autofill_client.h b/chrome/browser/ui/autofill/payments/chrome_payments_autofill_client.h
index 1516f678..4930a80a 100644
--- a/chrome/browser/ui/autofill/payments/chrome_payments_autofill_client.h
+++ b/chrome/browser/ui/autofill/payments/chrome_payments_autofill_client.h
@@ -235,6 +235,10 @@
       std::unique_ptr<AutofillSaveCardBottomSheetBridge>
           autofill_save_card_bottom_sheet_bridge);
 
+  void SetAutofillSaveIbanBottomSheetBridgeForTesting(
+      std::unique_ptr<AutofillSaveIbanBottomSheetBridge>
+          autofill_save_iban_bottom_sheet_bridge);
+
   void SetAutofillMessageControllerForTesting(
       std::unique_ptr<AutofillMessageController> autofill_message_controller);
 #endif
diff --git a/chrome/browser/ui/autofill/payments/chrome_payments_autofill_client_unittest.cc b/chrome/browser/ui/autofill/payments/chrome_payments_autofill_client_unittest.cc
index 4865b363..28244a9 100644
--- a/chrome/browser/ui/autofill/payments/chrome_payments_autofill_client_unittest.cc
+++ b/chrome/browser/ui/autofill/payments/chrome_payments_autofill_client_unittest.cc
@@ -22,6 +22,7 @@
 #if BUILDFLAG(IS_ANDROID)
 #include "chrome/browser/ui/android/autofill/autofill_save_card_bottom_sheet_bridge.h"
 #include "chrome/browser/ui/android/autofill/autofill_save_card_delegate_android.h"
+#include "chrome/browser/ui/android/autofill/autofill_save_iban_bottom_sheet_bridge.h"
 #include "chrome/browser/ui/android/tab_model/tab_model_list.h"
 #include "chrome/browser/ui/android/tab_model/tab_model_test_helper.h"
 #include "chrome/browser/ui/autofill/autofill_snackbar_controller_impl.h"
@@ -55,6 +56,16 @@
   MOCK_METHOD(void, Hide, (), (override));
 };
 
+class MockAutofillSaveIbanBottomSheetBridge
+    : public AutofillSaveIbanBottomSheetBridge {
+ public:
+  MockAutofillSaveIbanBottomSheetBridge()
+      : AutofillSaveIbanBottomSheetBridge(
+            base::android::ScopedJavaGlobalRef<jobject>(nullptr)) {}
+
+  MOCK_METHOD(void, Hide, (), (override));
+};
+
 class MockAutofillSnackbarControllerImpl
     : public AutofillSnackbarControllerImpl {
  public:
@@ -176,6 +187,16 @@
     return pointer;
   }
 
+  MockAutofillSaveIbanBottomSheetBridge*
+  InjectMockAutofillSaveIbanBottomSheetBridge() {
+    std::unique_ptr<MockAutofillSaveIbanBottomSheetBridge> mock =
+        std::make_unique<MockAutofillSaveIbanBottomSheetBridge>();
+    MockAutofillSaveIbanBottomSheetBridge* pointer = mock.get();
+    chrome_payments_client()->SetAutofillSaveIbanBottomSheetBridgeForTesting(
+        std::move(mock));
+    return pointer;
+  }
+
   MockAutofillSnackbarControllerImpl*
   InjectMockAutofillSnackbarControllerImpl() {
     std::unique_ptr<MockAutofillSnackbarControllerImpl> mock =
@@ -482,6 +503,22 @@
 
   TabModelList::RemoveTabModel(&tab_model);
 }
+
+TEST_F(
+    ChromePaymentsAutofillClientTest,
+    IbanUploadCompletedSuccessful_CallsSaveIbanBottomSheetBridgeAndSnackbarController) {
+  MockAutofillSaveIbanBottomSheetBridge* save_iban_bridge =
+      InjectMockAutofillSaveIbanBottomSheetBridge();
+  MockAutofillSnackbarControllerImpl* snackbar_controller =
+      InjectMockAutofillSnackbarControllerImpl();
+
+  EXPECT_CALL(*save_iban_bridge, Hide);
+  EXPECT_CALL(*snackbar_controller,
+              Show(AutofillSnackbarType::kSaveServerIbanSuccess, _));
+  chrome_payments_client()->IbanUploadCompleted(/*iban_saved=*/true,
+                                                /*max_strikes=*/false);
+}
+
 #else   // !BUILDFLAG(IS_ANDROID)
 TEST_F(ChromePaymentsAutofillClientTest,
        ConfirmSaveCreditCardLocally_CallsOfferLocalSave) {
diff --git a/chrome/browser/ui/passwords/bubble_controllers/biometric_authentication_for_filling_bubble_controller.cc b/chrome/browser/ui/passwords/bubble_controllers/biometric_authentication_for_filling_bubble_controller.cc
index 5893ad9..7a3457f 100644
--- a/chrome/browser/ui/passwords/bubble_controllers/biometric_authentication_for_filling_bubble_controller.cc
+++ b/chrome/browser/ui/passwords/bubble_controllers/biometric_authentication_for_filling_bubble_controller.cc
@@ -114,8 +114,10 @@
 #elif BUILDFLAG(IS_WIN)
   message = l10n_util::GetStringUTF16(
       IDS_PASSWORD_MANAGER_TURN_ON_FILLING_REAUTH_WIN);
+#elif BUILDFLAG(IS_CHROMEOS_ASH)
+  message = l10n_util::GetStringUTF16(
+      IDS_PASSWORD_MANAGER_TURN_ON_FILLING_REAUTH_CHROMEOS);
 #endif
-  // TODO(crbug.com/367336383): Add ChromeOS specific string.
   delegate_->AuthenticateUserWithMessage(message,
                                          std::move(on_reauth_completed));
 }
diff --git a/chrome/browser/ui/passwords/credential_manager_dialog_controller_impl.cc b/chrome/browser/ui/passwords/credential_manager_dialog_controller_impl.cc
index ec93f00..b12b06d 100644
--- a/chrome/browser/ui/passwords/credential_manager_dialog_controller_impl.cc
+++ b/chrome/browser/ui/passwords/credential_manager_dialog_controller_impl.cc
@@ -38,8 +38,13 @@
       password_manager::GetShownOrigin(delegate->GetWebContents()
                                            ->GetPrimaryMainFrame()
                                            ->GetLastCommittedOrigin()));
+#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
   message =
       l10n_util::GetStringFUTF16(IDS_PASSWORD_MANAGER_FILLING_REAUTH, origin);
+#elif BUILDFLAG(IS_CHROMEOS)
+  message = l10n_util::GetStringFUTF16(
+      IDS_PASSWORD_MANAGER_FILLING_REAUTH_CHROMEOS, origin);
+#endif
   return message;
 }
 #endif
diff --git a/chrome/browser/ui/views/autofill/payments/payments_window_user_consent_dialog_view.cc b/chrome/browser/ui/views/autofill/payments/payments_window_user_consent_dialog_view.cc
index 876ec32..b792a94 100644
--- a/chrome/browser/ui/views/autofill/payments/payments_window_user_consent_dialog_view.cc
+++ b/chrome/browser/ui/views/autofill/payments/payments_window_user_consent_dialog_view.cc
@@ -18,6 +18,7 @@
 #include "ui/base/mojom/dialog_button.mojom.h"
 #include "ui/base/mojom/ui_base_types.mojom-shared.h"
 #include "ui/base/ui_base_types.h"
+#include "ui/views/accessibility/view_accessibility.h"
 #include "ui/views/bubble/bubble_frame_view.h"
 #include "ui/views/controls/label.h"
 #include "ui/views/layout/fill_layout.h"
@@ -125,8 +126,16 @@
 
 void PaymentsWindowUserConsentDialogView::OnDialogClosing() {
   if (payments_window_user_consent_dialog_controller_) {
+    PaymentsWindowUserConsentDialogResult dialog_result =
+        GetDialogResultForClosedReason(GetWidget()->closed_reason());
+    if (dialog_result ==
+        PaymentsWindowUserConsentDialogResult::kAcceptButtonClicked) {
+      GetViewAccessibility().AnnounceText(
+          payments_window_user_consent_dialog_controller_
+              ->GetAcceptanceAccessibilityAnnouncement());
+    }
     payments_window_user_consent_dialog_controller_->OnDialogClosing(
-        GetDialogResultForClosedReason(GetWidget()->closed_reason()));
+        dialog_result);
   }
 }
 
diff --git a/chrome/browser/ui/views/extensions/extensions_menu_main_page_view_unittest.cc b/chrome/browser/ui/views/extensions/extensions_menu_main_page_view_unittest.cc
index f1db0f9..0427bf8 100644
--- a/chrome/browser/ui/views/extensions/extensions_menu_main_page_view_unittest.cc
+++ b/chrome/browser/ui/views/extensions/extensions_menu_main_page_view_unittest.cc
@@ -1684,7 +1684,10 @@
   ASSERT_TRUE(extension_entry);
   views::Button* extension_allow_button =
       static_cast<views::Button*>(extension_entry->children()[3]);
+  extensions::PermissionsManagerWaiter waiter(
+      PermissionsManager::Get(profile()));
   ClickButton(extension_allow_button);
+  waiter.WaitForExtensionPermissionsUpdate();
 
   WaitForAnimation();
   LayoutContainerIfNecessary();
@@ -1694,14 +1697,14 @@
   //   - message section (menu) does not include extension and is hidden
   //   - request access button (toolbar) does not include extension
   //   - action has been run
-  //   - site access is still "on click" since clicking the button grants one
-  //   time access
+  //   - site access is "on site" since clicking the button grants always access
+  //     to the site.
   EXPECT_FALSE(requests_access_container->GetVisible());
   EXPECT_TRUE(GetExtensionsInRequestAccessSection().empty());
   EXPECT_TRUE(GetExtensionsInRequestAccessButton().empty());
   EXPECT_EQ(user_action_tester.GetActionCount(kActivatedUserAction), 1);
   EXPECT_EQ(permissions->GetUserSiteAccess(*extension, url),
-            PermissionsManager::UserSiteAccess::kOnClick);
+            PermissionsManager::UserSiteAccess::kOnSite);
 }
 
 TEST_F(ExtensionsMenuMainPageViewUnitTest,
diff --git a/chrome/browser/ui/views/extensions/extensions_menu_view_controller.cc b/chrome/browser/ui/views/extensions/extensions_menu_view_controller.cc
index 18da16f..66fdd5d 100644
--- a/chrome/browser/ui/views/extensions/extensions_menu_view_controller.cc
+++ b/chrome/browser/ui/views/extensions/extensions_menu_view_controller.cc
@@ -506,14 +506,14 @@
     return;
   }
 
+  // Accepting a site access request grants always access to the site.
+  extensions::SitePermissionsHelper(browser_->profile())
+      .UpdateSiteAccess(
+          *GetExtension(browser_, extension_id), web_contents,
+          extensions::PermissionsManager::UserSiteAccess::kOnSite);
+
   base::RecordAction(base::UserMetricsAction(
       "Extensions.Toolbar.ExtensionActivatedFromAllowingRequestAccessInMenu"));
-  action_runner->GrantTabPermissions({GetExtension(browser_, extension_id)});
-  // TODO(crbug.com/40912394): Granting tab permission but not accepting the
-  // reload page means we grant tab permissions but the action is not executed.
-  // This causes a mismatch between the request access button in the toolbar,
-  // and the request access section in the menu when the extension is granted
-  // tab permission by one item but the action is not run.
 }
 
 void ExtensionsMenuViewController::OnDismissExtensionClicked(
diff --git a/chrome/browser/ui/views/frame/browser_view.cc b/chrome/browser/ui/views/frame/browser_view.cc
index 423b6a4..8aa3d41e 100644
--- a/chrome/browser/ui/views/frame/browser_view.cc
+++ b/chrome/browser/ui/views/frame/browser_view.cc
@@ -4126,6 +4126,7 @@
     params.shadow_type = views::Widget::InitParams::ShadowType::kNone;
     params.activatable = views::Widget::InitParams::Activatable::kNo;
     params.is_overlay = true;
+    params.name = "mac-fullscreen-overlay";
     OverlayWidget* overlay_widget = new OverlayWidget(GetWidget());
 
     // When the overlay is used some Views are moved to the overlay_widget. When
diff --git a/chrome/browser/ui/views/omnibox/omnibox_popup_view_views.cc b/chrome/browser/ui/views/omnibox/omnibox_popup_view_views.cc
index f3fac1f6..fd8752ab 100644
--- a/chrome/browser/ui/views/omnibox/omnibox_popup_view_views.cc
+++ b/chrome/browser/ui/views/omnibox/omnibox_popup_view_views.cc
@@ -11,6 +11,7 @@
 #include "base/auto_reset.h"
 #include "base/functional/bind.h"
 #include "base/memory/weak_ptr.h"
+#include "base/metrics/histogram_functions.h"
 #include "build/build_config.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/color/chrome_color_id.h"
@@ -35,6 +36,26 @@
 #include "ui/views/cascading_property.h"
 #include "ui/views/layout/box_layout.h"
 #include "ui/views/widget/widget.h"
+// TODO(crbug.com/365733574): used for debugging the misplaced bubble issue on
+// mac fullscreen.
+#if BUILDFLAG(IS_MAC)
+#include "chrome/browser/platform_util.h"
+#endif  // BUILDFLAG(IS_MAC)
+
+namespace {
+
+#if BUILDFLAG(IS_MAC)
+// Returns true if the browser is in fullscreen. This depends on the fact in mac
+// fullscreen the topchrome UI is hosted in an overlay widget.
+// TODO(crbug.com/365733574): used for debugging the misplaced bubble issue on
+// mac fullscreen.
+bool IsInFullscreen(views::Widget* topchrome_host_widget) {
+  CHECK(topchrome_host_widget);
+  return topchrome_host_widget->GetName() == "mac-fullscreen-overlay";
+}
+#endif  // BUILDFLAG(IS_MAC)
+
+}  // namespace
 
 class OmniboxPopupViewViews::AutocompletePopupWidget final
     : public ThemeCopyingWidget {
@@ -76,6 +97,14 @@
   void SetTargetBounds(const gfx::Rect& bounds) {
     base::AutoReset<bool> reset(&is_setting_popup_bounds_, true);
     SetBounds(bounds);
+#if BUILDFLAG(IS_MAC)
+    // TODO(crbug.com/365733574): debug for the misplaced bubble issue on mac
+    // fullscreen.
+    if (IsInFullscreen(parent())) {
+      base::UmaHistogramSparse("Mac.Fullscreen.OmniboxPopupTargetScreenY",
+                               bounds.y());
+    }
+#endif  // BUILDFLAG(IS_MAC)
   }
 
   void ShowAnimated() {
@@ -553,6 +582,24 @@
 
   // The rounded popup is always offset the same amount from the omnibox.
   gfx::Rect content_rect = location_bar_view_->GetBoundsInScreen();
+
+#if BUILDFLAG(IS_MAC)
+  // TODO(crbug.com/365733574): debug for the misplaced bubble issue on mac
+  // fullscreen.
+  views::Widget* topchrome_host_widget = location_bar_view_->GetWidget();
+  if (IsInFullscreen(topchrome_host_widget)) {
+    base::UmaHistogramSparse(
+        "Mac.Fullscreen.OverlayWidgetScreenY",
+        topchrome_host_widget->GetWindowBoundsInScreen().y());
+    base::UmaHistogramSparse("Mac.Fullscreen.OverlayNSWindowScreenY",
+                             platform_util::GetWindowScreenBounds(
+                                 topchrome_host_widget->GetNativeWindow())
+                                 .y());
+    base::UmaHistogramSparse("Mac.Fullscreen.LocationBarViewScreenY",
+                             content_rect.y());
+  }
+#endif  // BUILDFLAG(IS_MAC)
+
   content_rect.Inset(
       -RoundedOmniboxResultsFrame::GetLocationBarAlignmentInsets());
   content_rect.set_height(popup_height);
diff --git a/chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_ui.cc b/chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_ui.cc
index 5d329cf..07775b7 100644
--- a/chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_ui.cc
+++ b/chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_ui.cc
@@ -15,6 +15,8 @@
 #include "base/values.h"
 #include "chrome/browser/privacy_sandbox/privacy_sandbox_service.h"
 #include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/themes/theme_service.h"
+#include "chrome/browser/themes/theme_service_factory.h"
 #include "chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_handler.h"
 #include "chrome/browser/ui/webui/webui_util.h"
 #include "chrome/common/webui_url_constants.h"
@@ -30,6 +32,7 @@
 #include "content/public/browser/web_ui_data_source.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/webui/web_ui_util.h"
+#include "ui/native_theme/native_theme.h"
 
 // The name of the on-click function when the privacy policy link is pressed.
 inline constexpr char16_t kPrivacyPolicyFunc[] = u"onPrivacyPolicyLinkClicked_";
@@ -229,6 +232,17 @@
   source->AddLocalizedString("m1ConsentLearnMoreLink",
                              IDS_PRIVACY_SANDBOX_M1_CONSENT_LEARN_MORE_LINK);
 
+  // Dark mode support.
+  ThemeService::BrowserColorScheme color_scheme =
+      ThemeServiceFactory::GetForProfile(Profile::FromWebUI(web_ui))
+          ->GetBrowserColorScheme();
+  bool is_dark_mode =
+      (color_scheme == ThemeService::BrowserColorScheme::kSystem)
+          ? ui::NativeTheme::GetInstanceForNativeUi()->ShouldUseDarkColors()
+          : color_scheme == ThemeService::BrowserColorScheme::kDark;
+
+  source->AddBoolean("isDarkMode", is_dark_mode);
+
   const GURL& url = web_ui->GetWebContents()->GetVisibleURL();
   if (url.query().find("debug") != std::string::npos) {
     // Not intended to be hooked to anything. The dialog will not initialize
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 6c64483..90063de 100644
--- a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
+++ b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
@@ -374,6 +374,7 @@
 void AddAiStrings(content::WebUIDataSource* html_source) {
   static constexpr webui::LocalizedString kLocalizedStrings[] = {
       {"aiPageTitle", IDS_SETTINGS_AI_PAGE_TITLE},
+      {"aiInnovationsPageTitle", IDS_SETTINGS_AI_INNOVATIONS_PAGE_TITLE},
       {"aiPageMainLabel", IDS_SETTINGS_AI_PAGE_MAIN_LABEL},
       {"aiPageMainSublabel", IDS_SETTINGS_AI_PAGE_MAIN_SUBLABEL},
 
diff --git a/chrome/browser/webauthn/chrome_authenticator_request_delegate.cc b/chrome/browser/webauthn/chrome_authenticator_request_delegate.cc
index 5ead59c6..9f4f5031 100644
--- a/chrome/browser/webauthn/chrome_authenticator_request_delegate.cc
+++ b/chrome/browser/webauthn/chrome_authenticator_request_delegate.cc
@@ -1188,8 +1188,9 @@
   std::vector<std::unique_ptr<device::cablev2::Pairing>> paired_phones;
   base::RepeatingCallback<void(std::unique_ptr<device::cablev2::Pairing>)>
       contact_phone_callback;
-  if (!cable_extension_provided ||
-      base::FeatureList::IsEnabled(device::kWebAuthCableExtensionAnywhere)) {
+  if (base::FeatureList::IsEnabled(device::kWebAuthnHybridLinking) &&
+      (!cable_extension_provided ||
+       base::FeatureList::IsEnabled(device::kWebAuthCableExtensionAnywhere))) {
     std::unique_ptr<cablev2::KnownDevices> known_devices =
         cablev2::KnownDevices::FromProfile(profile);
     if (g_observer) {
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt
index 9d8d9397..627ae970 100644
--- a/chrome/build/mac-arm.pgo.txt
+++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@
-chrome-mac-arm-main-1728597574-1d4787e7440f67466acd87dd79e6dd948eaf90a2-7d9ec9cbbae69668865b47017607e75cb40e9ead.profdata
+chrome-mac-arm-main-1728669490-a6b6514c9ae434e06875935434c017fa308351da-0e5be73d10c47015ce99b8b2ced63c3ae8af66a0.profdata
diff --git a/chrome/build/win-arm64.pgo.txt b/chrome/build/win-arm64.pgo.txt
index 91f83d1e..2d4314a 100644
--- a/chrome/build/win-arm64.pgo.txt
+++ b/chrome/build/win-arm64.pgo.txt
@@ -1 +1 @@
-chrome-win-arm64-main-1728583159-a57b102cd92c59ce5a193e3a334647c6ce4458b5-772a6b4ade0decd9bfc407f4651c3a331c516612.profdata
+chrome-win-arm64-main-1728669490-1fc110fccacc3d7021d635eff0fe164f0ef3d816-0e5be73d10c47015ce99b8b2ced63c3ae8af66a0.profdata
diff --git a/chrome/enterprise_companion/BUILD.gn b/chrome/enterprise_companion/BUILD.gn
index fb7c993..119818a9 100644
--- a/chrome/enterprise_companion/BUILD.gn
+++ b/chrome/enterprise_companion/BUILD.gn
@@ -426,6 +426,7 @@
       "$root_build_dir/${enterprise_companion_product_full_name}.app/Contents/MacOS/${enterprise_companion_product_full_name}",
       "$root_build_dir/${enterprise_companion_product_full_name}.app/Contents/PkgInfo",
       "$root_build_dir/EnterpriseCompanionSigning/sign.py",
+      "$root_build_dir/EnterpriseCompanionSigning/pkg-dmg",
     ]
     deps = [
       "//chrome/enterprise_companion/mac:copy_signing",
diff --git a/chrome/test/interaction/webcontents_interaction_test_util_interactive_uitest.cc b/chrome/test/interaction/webcontents_interaction_test_util_interactive_uitest.cc
index eaa3420..dc8364b 100644
--- a/chrome/test/interaction/webcontents_interaction_test_util_interactive_uitest.cc
+++ b/chrome/test/interaction/webcontents_interaction_test_util_interactive_uitest.cc
@@ -262,8 +262,16 @@
   EXPECT_CALL_IN_SCOPE(completed, Run, sequence->RunSynchronouslyForTesting());
 }
 
+// TODO(https://crbug.com/372873264): Re-enable on chrome linux builders.
+#if BUILDFLAG(IS_LINUX) && BUILDFLAG(GOOGLE_CHROME_BRANDING)
+#define MAYBE_UseElementBoundsInScreenToSendInput \
+  DISABLED_UseElementBoundsInScreenToSendInput
+#else
+#define MAYBE_UseElementBoundsInScreenToSendInput \
+  UseElementBoundsInScreenToSendInput
+#endif
 IN_PROC_BROWSER_TEST_F(WebContentsInteractionTestUtilInteractiveUiTest,
-                       UseElementBoundsInScreenToSendInput) {
+                       MAYBE_UseElementBoundsInScreenToSendInput) {
   UNCALLED_MOCK_CALLBACK(ui::InteractionSequence::CompletedCallback, completed);
   UNCALLED_MOCK_CALLBACK(ui::InteractionSequence::AbortedCallback, aborted);
   DEFINE_LOCAL_CUSTOM_ELEMENT_EVENT_TYPE(kMouseMoveCustomEvent);
diff --git a/clank b/clank
index d47d701..4f841d9 160000
--- a/clank
+++ b/clank
@@ -1 +1 @@
-Subproject commit d47d7011dff3490acd89bd81a313a9dd3c32d567
+Subproject commit 4f841d92100ecbb22d8e3c19492dc85a3177d31f
diff --git a/components/autofill/core/browser/ui/payments/card_expiration_date_fix_flow_controller_impl.cc b/components/autofill/core/browser/ui/payments/card_expiration_date_fix_flow_controller_impl.cc
index 079c66db..1c63c2b0 100644
--- a/components/autofill/core/browser/ui/payments/card_expiration_date_fix_flow_controller_impl.cc
+++ b/components/autofill/core/browser/ui/payments/card_expiration_date_fix_flow_controller_impl.cc
@@ -14,7 +14,6 @@
 #include "components/autofill/core/browser/metrics/payments/credit_card_save_metrics.h"
 #include "components/autofill/core/browser/payments/payments_autofill_client.h"
 #include "components/autofill/core/browser/ui/payments/card_expiration_date_fix_flow_view.h"
-#include "components/autofill/core/common/autofill_payments_features.h"
 #include "components/grit/components_scaled_resources.h"
 #include "components/strings/grit/components_strings.h"
 #include "ui/base/l10n/l10n_util.h"
@@ -81,11 +80,7 @@
 
 int CardExpirationDateFixFlowControllerImpl::GetIconId() const {
 #if BUILDFLAG(GOOGLE_CHROME_BRANDING)
-  if (base::FeatureList::IsEnabled(
-          autofill::features::kAutofillEnableMovingGPayLogoToTheRightOnClank)) {
-    return IDR_AUTOFILL_GOOGLE_PAY;
-  }
-  return IDR_AUTOFILL_GOOGLE_PAY_WITH_DIVIDER;
+  return IDR_AUTOFILL_GOOGLE_PAY;
 #else
   return 0;
 #endif
diff --git a/components/autofill/core/browser/ui/payments/payments_window_user_consent_dialog_controller.h b/components/autofill/core/browser/ui/payments/payments_window_user_consent_dialog_controller.h
index ebfaf1119..aa0439ab 100644
--- a/components/autofill/core/browser/ui/payments/payments_window_user_consent_dialog_controller.h
+++ b/components/autofill/core/browser/ui/payments/payments_window_user_consent_dialog_controller.h
@@ -37,6 +37,11 @@
 
   // Returns the label for the accept button.
   virtual std::u16string GetOkButtonLabel() const = 0;
+
+  // Returns the accessibility text to announce to the user after acceptance of
+  // the payments window pop-up user consent dialog. This is to let the user
+  // know the payment verification website is loading.
+  virtual std::u16string GetAcceptanceAccessibilityAnnouncement() const = 0;
 };
 
 }  // namespace autofill::payments
diff --git a/components/autofill/core/browser/ui/payments/payments_window_user_consent_dialog_controller_impl.cc b/components/autofill/core/browser/ui/payments/payments_window_user_consent_dialog_controller_impl.cc
index 2d483232..0ab23d3 100644
--- a/components/autofill/core/browser/ui/payments/payments_window_user_consent_dialog_controller_impl.cc
+++ b/components/autofill/core/browser/ui/payments/payments_window_user_consent_dialog_controller_impl.cc
@@ -74,4 +74,10 @@
       IDS_AUTOFILL_PAYMENTS_WINDOW_USER_CONSENT_DIALOG_OK_BUTTON_LABEL_VCN_3DS);
 }
 
+std::u16string PaymentsWindowUserConsentDialogControllerImpl::
+    GetAcceptanceAccessibilityAnnouncement() const {
+  return l10n_util::GetStringUTF16(
+      IDS_AUTOFILL_PAYMENTS_WINDOW_USER_CONSENT_DIALOG_ACCEPTANCE_ACCESSIBILITY_ANNOUNCEMENT);
+}
+
 }  // namespace autofill::payments
diff --git a/components/autofill/core/browser/ui/payments/payments_window_user_consent_dialog_controller_impl.h b/components/autofill/core/browser/ui/payments/payments_window_user_consent_dialog_controller_impl.h
index 68f85799..6abf59d 100644
--- a/components/autofill/core/browser/ui/payments/payments_window_user_consent_dialog_controller_impl.h
+++ b/components/autofill/core/browser/ui/payments/payments_window_user_consent_dialog_controller_impl.h
@@ -46,6 +46,7 @@
   std::u16string GetWindowTitle() const override;
   std::u16string GetDialogDescription() const override;
   std::u16string GetOkButtonLabel() const override;
+  std::u16string GetAcceptanceAccessibilityAnnouncement() const override;
 
   base::WeakPtr<PaymentsWindowUserConsentDialogControllerImpl> GetWeakPtr() {
     return weak_ptr_factory_.GetWeakPtr();
diff --git a/components/autofill/core/browser/ui/payments/payments_window_user_consent_dialog_controller_impl_unittest.cc b/components/autofill/core/browser/ui/payments/payments_window_user_consent_dialog_controller_impl_unittest.cc
index e5e7697..a83774d9 100644
--- a/components/autofill/core/browser/ui/payments/payments_window_user_consent_dialog_controller_impl_unittest.cc
+++ b/components/autofill/core/browser/ui/payments/payments_window_user_consent_dialog_controller_impl_unittest.cc
@@ -50,6 +50,10 @@
       controller()->GetOkButtonLabel(),
       l10n_util::GetStringUTF16(
           IDS_AUTOFILL_PAYMENTS_WINDOW_USER_CONSENT_DIALOG_OK_BUTTON_LABEL_VCN_3DS));
+  EXPECT_EQ(
+      controller()->GetAcceptanceAccessibilityAnnouncement(),
+      l10n_util::GetStringUTF16(
+          IDS_AUTOFILL_PAYMENTS_WINDOW_USER_CONSENT_DIALOG_ACCEPTANCE_ACCESSIBILITY_ANNOUNCEMENT));
 }
 
 // Tests that the accept callback is triggered when the dialog is accepted.
diff --git a/components/autofill/core/common/autofill_payments_features.cc b/components/autofill/core/common/autofill_payments_features.cc
index a5f90b5..7979376 100644
--- a/components/autofill/core/common/autofill_payments_features.cc
+++ b/components/autofill/core/common/autofill_payments_features.cc
@@ -146,12 +146,6 @@
              "AutofillEnableLogFormEventsToAllParsedFormTypes",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
-// When enabled, the GPay logo will be moved to the right side in payments
-// autofill dialogs and bubbles on clank.
-BASE_FEATURE(kAutofillEnableMovingGPayLogoToTheRightOnClank,
-             "AutofillEnableMovingGPayLogoToTheRightOnClank",
-             base::FEATURE_ENABLED_BY_DEFAULT);
-
 // When enabled, offers will be displayed in the Clank keyboard accessory during
 // downstream.
 BASE_FEATURE(kAutofillEnableOffersInClankKeyboardAccessory,
diff --git a/components/autofill/core/common/autofill_payments_features.h b/components/autofill/core/common/autofill_payments_features.h
index 68f2353..91638ed 100644
--- a/components/autofill/core/common/autofill_payments_features.h
+++ b/components/autofill/core/common/autofill_payments_features.h
@@ -57,8 +57,6 @@
 COMPONENT_EXPORT(AUTOFILL)
 BASE_DECLARE_FEATURE(kAutofillEnableLogFormEventsToAllParsedFormTypes);
 COMPONENT_EXPORT(AUTOFILL)
-BASE_DECLARE_FEATURE(kAutofillEnableMovingGPayLogoToTheRightOnClank);
-COMPONENT_EXPORT(AUTOFILL)
 BASE_DECLARE_FEATURE(kAutofillEnableNewCardArtAndNetworkImages);
 COMPONENT_EXPORT(AUTOFILL)
 BASE_DECLARE_FEATURE(kAutofillEnableOffersInClankKeyboardAccessory);
diff --git a/components/autofill/ios/browser/autofill_util.h b/components/autofill/ios/browser/autofill_util.h
index ead2124d..f303589 100644
--- a/components/autofill/ios/browser/autofill_util.h
+++ b/components/autofill/ios/browser/autofill_util.h
@@ -42,9 +42,12 @@
 
 // Processes the JSON form data extracted from the page into the format expected
 // by BrowserAutofillManager.
-// |filtered| and |form_name| limit the field that will be returned.
-// Returns an std::optional that contains the extracted vector of FormData or
-// nullopt if the data was invalid.
+// `filtered` and `form_name` limit the field that will be returned.
+// `host_frame` is the isolated world frame corresponding to the page content
+// world frame where the forms were extracted. For forms extracted in the
+// isolated world pass a null `host_frame` as the frame token is derived from
+// `frame_id`. Returns an std::optional that contains the extracted vector of
+// FormData or nullopt if the data was invalid.
 std::optional<std::vector<FormData>> ExtractFormsData(
     NSString* form_json,
     bool filtered,
@@ -52,14 +55,17 @@
     const GURL& main_frame_url,
     const GURL& frame_origin,
     const FieldDataManager& field_data_manager,
-    const std::string& frame_id);
+    const std::string& frame_id,
+    LocalFrameToken host_frame = LocalFrameToken());
 
 // Converts |form| into FormData.
-// Returns nullopt if a form can not be extracted.
-// Returns nullopt if |filtered| == true and |form["name"]| !=
-// |formName|. Returns false if |form["origin"]| !=
-// |form_frame_origin|. Returns an std::optional that contains a FormData if the
-// conversion succeeds.
+// `host_frame` is the isolated world frame corresponding to the page content
+// world frame where the forms were extracted. For forms extracted in the
+// isolated world pass a null `host_frame` as the frame token is derived from
+// `frame_id`. Returns nullopt if a form can not be extracted. Returns nullopt
+// if |filtered| == true and |form["name"]| != |formName|. Returns false if
+// |form["origin"]| != |form_frame_origin|. Returns an std::optional that
+// contains a FormData if the conversion succeeds.
 std::optional<FormData> ExtractFormData(
     const base::Value::Dict& form,
     bool filtered,
@@ -67,7 +73,8 @@
     const GURL& main_frame_url,
     const GURL& form_frame_origin,
     const FieldDataManager& field_data_manager,
-    const std::string& frame_id);
+    const std::string& frame_id,
+    LocalFrameToken host_frame = LocalFrameToken());
 
 // Extracts a single form field from the JSON dictionary into a FormFieldData
 // object.
diff --git a/components/autofill/ios/browser/autofill_util.mm b/components/autofill/ios/browser/autofill_util.mm
index 228f812..9acc809 100644
--- a/components/autofill/ios/browser/autofill_util.mm
+++ b/components/autofill/ios/browser/autofill_util.mm
@@ -122,7 +122,8 @@
     const GURL& main_frame_url,
     const GURL& frame_origin,
     const FieldDataManager& field_data_manager,
-    const std::string& frame_id) {
+    const std::string& frame_id,
+    LocalFrameToken host_frame) {
   std::unique_ptr<base::Value> forms_value = ParseJson(forms_json);
   if (!forms_value) {
     return std::nullopt;
@@ -144,9 +145,9 @@
       continue;
     }
 
-    if (std::optional<FormData> form =
-            ExtractFormData(*form_dict, filtered, form_name, main_frame_url,
-                            frame_origin, field_data_manager, frame_id)) {
+    if (std::optional<FormData> form = ExtractFormData(
+            *form_dict, filtered, form_name, main_frame_url, frame_origin,
+            field_data_manager, frame_id, host_frame)) {
       forms_data.push_back(*std::move(form));
     }
   }
@@ -160,7 +161,8 @@
     const GURL& main_frame_url,
     const GURL& form_frame_origin,
     const FieldDataManager& field_data_manager,
-    const std::string& frame_id) {
+    const std::string& frame_id,
+    LocalFrameToken host_frame) {
   FormData form_data;
   // Form data is copied into a FormData object field-by-field.
   const std::string* name = form.FindString("name");
@@ -198,14 +200,18 @@
     return std::nullopt;
   }
 
-  std::optional<base::UnguessableToken> host_frame =
-      DeserializeJavaScriptFrameId(*host_frame_param);
-  if (!host_frame) {
+  // Use provided isolated world host frame or derive it from frame id.
+  // Autofill works with isolated world frames, so frame id can only be used as
+  // host frame if the forms were extracted in the isolated world.
+  if (host_frame) {
+    form_data.set_host_frame(host_frame);
+  } else if (std::optional<base::UnguessableToken> host_frame_token =
+                 DeserializeJavaScriptFrameId(*host_frame_param)) {
+    form_data.set_host_frame(LocalFrameToken(*host_frame_token));
+  } else {
     return std::nullopt;
   }
 
-  form_data.set_host_frame(LocalFrameToken(*host_frame));
-
   if (base::FeatureList::IsEnabled(
           autofill::features::kAutofillAcrossIframesIos) &&
       *host_frame_param != frame_id) {
diff --git a/components/autofill/ios/form_util/BUILD.gn b/components/autofill/ios/form_util/BUILD.gn
index 090d7dd..5bc5af5 100644
--- a/components/autofill/ios/form_util/BUILD.gn
+++ b/components/autofill/ios/form_util/BUILD.gn
@@ -144,7 +144,8 @@
   sources = [ "resources/form.ts" ]
 
   deps = [
-    "//components/autofill/ios/form_util:fill_js_namespace",
+    ":fill_js_dependencies",
+    ":fill_js_namespace",
     "//ios/web/public/js_messaging:gcrweb",
     "//ios/web/public/js_messaging:util_scripts",
   ]
@@ -164,6 +165,7 @@
 
   deps = [
     ":child_frame_registration_ts_lib",
+    ":fill_js_dependencies",
     "//ios/web/public/js_messaging:frame_id",
   ]
 }
@@ -193,6 +195,30 @@
   ]
 }
 
+source_set("programmatic_form_submission_handler_feature") {
+  sources = [
+    "programmatic_form_submission_handler_java_script_feature.h",
+    "programmatic_form_submission_handler_java_script_feature.mm",
+  ]
+
+  deps = [
+    ":form_util",
+    ":form_util_feature",
+    ":programatic_form_submission_js",
+    "//base",
+    "//components/autofill/ios/common",
+    "//ios/web/public/js_messaging",
+    "//ios/web/public/js_messaging:content_world_header",
+  ]
+  configs += [ "//build/config/compiler:wexit_time_destructors" ]
+}
+
+optimize_ts("programatic_form_submission_js") {
+  sources = [ "resources/programmatic_form_submission_handler.ts" ]
+
+  deps = [ "//ios/web/public/js_messaging:gcrweb" ]
+}
+
 source_set("test_support") {
   testonly = true
   sources = [
diff --git a/components/autofill/ios/form_util/form_activity_tab_helper.mm b/components/autofill/ios/form_util/form_activity_tab_helper.mm
index 5901fd9..32f4d80 100644
--- a/components/autofill/ios/form_util/form_activity_tab_helper.mm
+++ b/components/autofill/ios/form_util/form_activity_tab_helper.mm
@@ -202,7 +202,8 @@
 
   FieldDataManager* fieldDataManager =
       FieldDataManagerFactoryIOS::FromWebFrame(sender_frame);
-
+  // TODO(crbug.com/357892651): Pass isolated local frame token for forms
+  // extracted in the page world.
   std::optional<std::vector<FormData>> forms = autofill::ExtractFormsData(
       base::SysUTF8ToNSString(form_data), true, base::UTF8ToUTF16(form_name),
       web_state->GetLastCommittedURL(), sender_frame->GetSecurityOrigin(),
diff --git a/components/autofill/ios/form_util/programmatic_form_submission_handler_java_script_feature.h b/components/autofill/ios/form_util/programmatic_form_submission_handler_java_script_feature.h
new file mode 100644
index 0000000..be62cfd
--- /dev/null
+++ b/components/autofill/ios/form_util/programmatic_form_submission_handler_java_script_feature.h
@@ -0,0 +1,46 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_AUTOFILL_IOS_FORM_UTIL_PROGRAMMATIC_FORM_SUBMISSION_HANDLER_JAVA_SCRIPT_FEATURE_H_
+#define COMPONENTS_AUTOFILL_IOS_FORM_UTIL_PROGRAMMATIC_FORM_SUBMISSION_HANDLER_JAVA_SCRIPT_FEATURE_H_
+
+#import "base/no_destructor.h"
+#import "ios/web/public/js_messaging/java_script_feature.h"
+
+namespace web {
+class WebState;
+}  // namespace web
+
+namespace autofill {
+
+// Installs a listener that gets called whenever HTMLElement.submit() is
+// invoked.
+class ProgrammaticFormSubmissionHandlerJavaScriptFeature
+    : public web::JavaScriptFeature {
+ public:
+  // This feature holds no state, so only a single static instance is ever
+  // needed.
+  static ProgrammaticFormSubmissionHandlerJavaScriptFeature* GetInstance();
+
+ private:
+  friend class base::NoDestructor<
+      ProgrammaticFormSubmissionHandlerJavaScriptFeature>;
+
+  // web::JavaScriptFeature
+  std::optional<std::string> GetScriptMessageHandlerName() const override;
+  void ScriptMessageReceived(web::WebState* web_state,
+                             const web::ScriptMessage& message) override;
+
+  ProgrammaticFormSubmissionHandlerJavaScriptFeature();
+  ~ProgrammaticFormSubmissionHandlerJavaScriptFeature() override;
+
+  ProgrammaticFormSubmissionHandlerJavaScriptFeature(
+      const ProgrammaticFormSubmissionHandlerJavaScriptFeature&) = delete;
+  ProgrammaticFormSubmissionHandlerJavaScriptFeature& operator=(
+      const ProgrammaticFormSubmissionHandlerJavaScriptFeature&) = delete;
+};
+
+}  // namespace autofill
+
+#endif  // COMPONENTS_AUTOFILL_IOS_FORM_UTIL_PROGRAMMATIC_FORM_SUBMISSION_HANDLER_JAVA_SCRIPT_FEATURE_H_
diff --git a/components/autofill/ios/form_util/programmatic_form_submission_handler_java_script_feature.mm b/components/autofill/ios/form_util/programmatic_form_submission_handler_java_script_feature.mm
new file mode 100644
index 0000000..55389d767
--- /dev/null
+++ b/components/autofill/ios/form_util/programmatic_form_submission_handler_java_script_feature.mm
@@ -0,0 +1,74 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "components/autofill/ios/form_util/programmatic_form_submission_handler_java_script_feature.h"
+
+#import <optional>
+
+#import "base/feature_list.h"
+#import "components/autofill/ios/common/features.h"
+#import "components/autofill/ios/form_util/form_activity_tab_helper.h"
+#import "components/autofill/ios/form_util/form_util_java_script_feature.h"
+#import "ios/web/public/js_messaging/content_world.h"
+#import "ios/web/public/js_messaging/java_script_feature_util.h"
+#import "ios/web/public/js_messaging/script_message.h"
+
+namespace {
+constexpr char kScriptName[] = "programmatic_form_submission_handler";
+constexpr char kScriptMessageName[] =
+    "ProgrammaticFormSubmissionHandlerMessage";
+}  // namespace
+
+namespace autofill {
+
+// static
+ProgrammaticFormSubmissionHandlerJavaScriptFeature*
+ProgrammaticFormSubmissionHandlerJavaScriptFeature::GetInstance() {
+  static base::NoDestructor<ProgrammaticFormSubmissionHandlerJavaScriptFeature>
+      instance;
+  return instance.get();
+}
+
+ProgrammaticFormSubmissionHandlerJavaScriptFeature::
+    ProgrammaticFormSubmissionHandlerJavaScriptFeature()
+    : web::JavaScriptFeature(
+          // This feature modifies the prototype of HTMLFormElement. The script
+          // has to be injected in the page content world so the page scripts
+          // use the modified JavaScript prototype. JavaScript variables are not
+          // shared across content worlds, which include prototypes. That is why
+          // the script would have no effect if injected in an isolated content
+          // world.
+          web::ContentWorld::kPageContentWorld,
+          {FeatureScript::CreateWithFilename(
+              kScriptName,
+              FeatureScript::InjectionTime::kDocumentStart,
+              FeatureScript::TargetFrames::kAllFrames,
+              FeatureScript::ReinjectionBehavior::kInjectOncePerWindow)},
+          {
+              web::java_script_features::GetCommonJavaScriptFeature(),
+              autofill::FormUtilJavaScriptFeature::GetInstance(),
+          }) {}
+
+ProgrammaticFormSubmissionHandlerJavaScriptFeature::
+    ~ProgrammaticFormSubmissionHandlerJavaScriptFeature() = default;
+
+std::optional<std::string> ProgrammaticFormSubmissionHandlerJavaScriptFeature::
+    GetScriptMessageHandlerName() const {
+  return kScriptMessageName;
+}
+
+void ProgrammaticFormSubmissionHandlerJavaScriptFeature::ScriptMessageReceived(
+    web::WebState* web_state,
+    const web::ScriptMessage& message) {
+  if (!base::FeatureList::IsEnabled(kAutofillIsolatedWorldForJavascriptIos)) {
+    return;
+  }
+
+  // Delegate message handling to FormActivityTabHelper.
+  FormActivityTabHelper* helper =
+      FormActivityTabHelper::GetOrCreateForWebState(web_state);
+  helper->OnFormMessageReceived(web_state, message);
+}
+
+}  // namespace autofill
diff --git a/components/autofill/ios/form_util/resources/fill.ts b/components/autofill/ios/form_util/resources/fill.ts
index ecaff851..0330034 100644
--- a/components/autofill/ios/form_util/resources/fill.ts
+++ b/components/autofill/ios/form_util/resources/fill.ts
@@ -422,10 +422,12 @@
 
   const controlElements = gCrWeb.form.getFormControlElements(formElement);
 
+  // TODO(crbug.com/372688163): Handle page world submissions of forms
+  // containing iframes.
   const iframeElements =
-    gCrWeb.autofill_form_features.isAutofillAcrossIframesEnabled() ?
-    gCrWeb.form.getIframeElements(formElement) :
-    [];
+      gCrWeb.autofill_form_features?.isAutofillAcrossIframesEnabled() ?
+      gCrWeb.form.getIframeElements(formElement) :
+      [];
 
   return formOrFieldsetsToFormData(
       formElement, formControlElement, /*fieldsets=*/[], controlElements,
diff --git a/components/autofill/ios/form_util/resources/fill_util.ts b/components/autofill/ios/form_util/resources/fill_util.ts
index 1364bd2..25173e45 100644
--- a/components/autofill/ios/form_util/resources/fill_util.ts
+++ b/components/autofill/ios/form_util/resources/fill_util.ts
@@ -50,6 +50,12 @@
   predecessor: number;
 }
 
+/*
+ Name of the html attribute used for storing the remote frame token assigned to
+ the current html document.
+ */
+const REMOTE_FRAME_TOKEN_ATTRIBUTE = '__gChrome_remoteFrameToken';
+
 /**
  * Acquires the specified DOM `attribute` from the DOM `element` and returns
  * its lower-case value, or null if not present.
@@ -691,4 +697,18 @@
   }
 };
 
-export {AutofillFormFieldData, AutofillFormData, FrameTokenWithPredecessor};
+function setRemoteFrameToken(token: string) {
+  document.documentElement.setAttribute(REMOTE_FRAME_TOKEN_ATTRIBUTE, token);
+}
+
+function getRemoteFrameToken(): string|null {
+  return document.documentElement.getAttribute(REMOTE_FRAME_TOKEN_ATTRIBUTE);
+}
+
+export {
+  AutofillFormFieldData,
+  AutofillFormData,
+  FrameTokenWithPredecessor,
+  setRemoteFrameToken,
+  getRemoteFrameToken,
+};
diff --git a/components/autofill/ios/form_util/resources/form.ts b/components/autofill/ios/form_util/resources/form.ts
index 5e5d8a7..e9b07a7 100644
--- a/components/autofill/ios/form_util/resources/form.ts
+++ b/components/autofill/ios/form_util/resources/form.ts
@@ -7,8 +7,9 @@
  */
 
 import {RENDERER_ID_NOT_SET} from '//components/autofill/ios/form_util/resources/fill_constants.js';
+import {getRemoteFrameToken} from '//components/autofill/ios/form_util/resources/fill_util.js';
 import {gCrWeb} from '//ios/web/public/js_messaging/resources/gcrweb.js';
-import {trim} from '//ios/web/public/js_messaging/resources/utils.js';
+import {sendWebKitMessage, trim} from '//ios/web/public/js_messaging/resources/utils.js';
 
 /**
  * Prefix used in references to form elements that have no 'id' or 'name'
@@ -307,6 +308,38 @@
   return wasEditedByUser.get(element);
 }
 
+/**
+ * @param originalURL A string containing a URL (absolute, relative...)
+ * @return A string containing a full URL (absolute with scheme)
+ */
+function getFullyQualifiedUrl(originalURL: string): string {
+  // A dummy anchor (never added to the document) is used to obtain the
+  // fully-qualified URL of `originalURL`.
+  const anchor = document.createElement('a');
+  anchor.href = originalURL;
+  return anchor.href;
+}
+
+// Send the form data to the browser.
+function formSubmitted(
+    form: HTMLFormElement, messageHandler: string,
+    includeRemoteFrameToken: boolean = false): void {
+  // Default URL for action is the document's URL.
+  const action = form.getAttribute('action') || document.URL;
+
+  const message = {
+    command: 'form.submit',
+    frameID: gCrWeb.message.getFrameId(),
+    formName: gCrWeb.form.getFormIdentifier(form),
+    href: getFullyQualifiedUrl(action),
+    formData: gCrWeb.fill.autofillSubmissionData(form),
+    remoteFrameToken: includeRemoteFrameToken ? getRemoteFrameToken() :
+                                                undefined,
+  };
+
+  sendWebKitMessage(messageHandler, message);
+}
+
 gCrWeb.form = {
   wasEditedByUser,
   isFormControlElement,
@@ -318,4 +351,5 @@
   getFormElementFromIdentifier,
   getFormElementFromRendererId,
   fieldWasEditedByUser,
+  formSubmitted,
 };
diff --git a/components/autofill/ios/form_util/resources/form_handlers.ts b/components/autofill/ios/form_util/resources/form_handlers.ts
index 84e1d7c8..9e08894 100644
--- a/components/autofill/ios/form_util/resources/form_handlers.ts
+++ b/components/autofill/ios/form_util/resources/form_handlers.ts
@@ -15,6 +15,13 @@
 import {sendWebKitMessage} from '//ios/web/public/js_messaging/resources/utils.js';
 
 /**
+ * The name of the message handler in the browser layer which will process
+ * messages sent by this script. This corresponds to
+ * FormHandlersJavaScriptFeature.
+ */
+const NATIVE_MESSAGE_HANDLER = 'FormHandlersMessage';
+
+/**
  * Metadata surrounding the scheduled batch of form messages.
  */
 interface FormMsgBatchMetadata {
@@ -63,7 +70,7 @@
 function sendMessageOnNextLoop(mesg: object): void {
   if (!messageToSend) {
     setTimeout(function() {
-      sendWebKitMessage('FormHandlersMessage', messageToSend!);
+      sendWebKitMessage(NATIVE_MESSAGE_HANDLER, messageToSend!);
       messageToSend = null;
     }, 0);
   }
@@ -71,18 +78,6 @@
 }
 
 /**
- * @param originalURL A string containing a URL (absolute, relative...)
- * @return A string containing a full URL (absolute with scheme)
- */
-function getFullyQualifiedUrl(originalURL: string): string {
-  // A dummy anchor (never added to the document) is used to obtain the
-  // fully-qualified URL of `originalURL`.
-  const anchor = document.createElement('a');
-  anchor.href = originalURL;
-  return anchor.href;
-}
-
-/**
  * Focus, input, change, keyup, blur and reset events for form elements (form
  * and input elements) are messaged to the main application for broadcast to
  * WebStateObservers.
@@ -171,20 +166,9 @@
     return;
   }
 
-  formSubmitted(evt.target as HTMLFormElement);
-}
-
-// Send the form data to the browser.
-function formSubmitted(form: HTMLFormElement): void {
-  // Default action is to re-submit to same page.
-  const action = form.getAttribute('action') || document.location.href;
-  sendWebKitMessage('FormHandlersMessage', {
-    'command': 'form.submit',
-    'frameID': gCrWeb.message.getFrameId(),
-    'formName': gCrWeb.form.getFormIdentifier(form),
-    'href': getFullyQualifiedUrl(action),
-    'formData': gCrWeb.fill.autofillSubmissionData(form),
-  });
+  gCrWeb.form.formSubmitted(
+      evt.target as HTMLFormElement,
+      /* messageHandler= */ NATIVE_MESSAGE_HANDLER);
 }
 
 /**
@@ -225,7 +209,7 @@
         // Reset the metadata for the next batch.
         formMsgBatchMetadata = {dropCount: 0};
       }
-      sendWebKitMessage('FormHandlersMessage', msg);
+      sendWebKitMessage(NATIVE_MESSAGE_HANDLER, msg);
     }, delay * (1 + i));
   });
   return true;
@@ -267,18 +251,24 @@
    */
   window.addEventListener('message', processInboundMessage);
 
-  // Per specification, SubmitEvent is not triggered when calling form.submit().
-  // Hook the method to call the handler in that case.
+  // Per specification, SubmitEvent is not triggered when calling
+  // form.submit(). Hook the method to call the handler in that case.
   if (formSubmitOriginalFunction === null) {
     formSubmitOriginalFunction = HTMLFormElement.prototype.submit;
     HTMLFormElement.prototype.submit = function() {
-      // If an error happens in formSubmitted, this will cancel the form
-      // submission which can lead to usability issue for the user.
-      // Put the formSubmitted in a try catch to ensure the original function
-      // is always called.
-      try {
-        formSubmitted(this);
-      } catch (e) {
+      if (!gCrWeb.autofill_form_features
+               .isAutofillIsolatedContentWorldEnabled()) {
+        // If an error happens in formSubmitted, this will cancel the form
+        // submission which can lead to usability issue for the user.
+        // Put the formSubmitted in a try catch to ensure the original function
+        // is always called.
+
+        try {
+          gCrWeb.form.formSubmitted(
+              this,
+              /* messageHandler= */ NATIVE_MESSAGE_HANDLER);
+        } catch (e) {
+        }
       }
       formSubmitOriginalFunction!.call(this);
     };
diff --git a/components/autofill/ios/form_util/resources/programmatic_form_submission_handler.ts b/components/autofill/ios/form_util/resources/programmatic_form_submission_handler.ts
new file mode 100644
index 0000000..4e09514
--- /dev/null
+++ b/components/autofill/ios/form_util/resources/programmatic_form_submission_handler.ts
@@ -0,0 +1,43 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview TODO(update this) Adds listeners that are used to handle forms,
+ * enabling autofill and the replacement method to dismiss the keyboard needed
+ * because of the Autofill keyboard accessory.
+ */
+
+// Requires functions from fill.ts, form.ts, and autofill_form_features.ts.
+
+import {gCrWeb} from '//ios/web/public/js_messaging/resources/gcrweb.js';
+//
+///**
+// * The name of the message handler in the browser layer which will process
+// * programmatic form submission messages. This corresponds to
+// * ProgrammaticFormSubmissionJavaScriptFeature.
+// */
+const NATIVE_MESSAGE_HANDLER = 'ProgrammaticFormSubmissionHandlerMessage';
+//
+///**
+// * The original implementation of HTMLFormElement.submit that will be called
+// by
+// * the hook.
+// */
+const formSubmitOriginalFunction = HTMLFormElement.prototype.submit;
+
+// Per specification, SubmitEvent is not triggered when calling form.submit().
+// Hook the method to call the handler in that case.
+HTMLFormElement.prototype.submit = function() {
+  // If an error happens in formSubmitted, this will cancel the form
+  // submission which can lead to usability issue for the user.
+  // Put the formSubmitted in a try catch to ensure the original function
+  // is always called.
+  try {
+    gCrWeb.form.formSubmitted(
+        this, /* messageHandler= */ NATIVE_MESSAGE_HANDLER,
+        /* includeRemoteFrameToken= */ true);
+  } catch (e) {
+  }
+  formSubmitOriginalFunction.call(this);
+};
diff --git a/components/autofill/ios/form_util/resources/register_remote_frame_token.ts b/components/autofill/ios/form_util/resources/register_remote_frame_token.ts
index e4ef5aa..67647c3 100644
--- a/components/autofill/ios/form_util/resources/register_remote_frame_token.ts
+++ b/components/autofill/ios/form_util/resources/register_remote_frame_token.ts
@@ -9,22 +9,16 @@
  */
 
 import {registerSelfWithRemoteToken} from '//components/autofill/ios/form_util/resources/child_frame_registration_lib.js';
+import {setRemoteFrameToken} from '//components/autofill/ios/form_util/resources/fill_util.js';
 import {generateRandomId} from '//ios/web/public/js_messaging/resources/frame_id.js';
 
-/*
- Name of the html attribute used for storing the remote frame token assigned to
- the current html document.
- */
-const REMOTE_FRAME_TOKEN_ATTRIBUTE = '__gChrome_remoteFrameToken';
-
 function registerRemoteToken(): void {
   const remoteFrameToken = generateRandomId();
   // Store the remote token in the DOM. Page content world scripts will be able
   // to read it and send it in the payload of their messages to the browser. The
   // browser layer uses remote tokens to map page content world frames to their
   // isolated world counter parts, which is where the rest of Autofill lives.
-  document.documentElement.setAttribute(
-      REMOTE_FRAME_TOKEN_ATTRIBUTE, remoteFrameToken);
+  setRemoteFrameToken(remoteFrameToken);
   registerSelfWithRemoteToken(remoteFrameToken);
 }
 
diff --git a/components/autofill_payments_strings.grdp b/components/autofill_payments_strings.grdp
index 275596e..f999aad 100644
--- a/components/autofill_payments_strings.grdp
+++ b/components/autofill_payments_strings.grdp
@@ -974,6 +974,9 @@
   <message name="IDS_AUTOFILL_PAYMENTS_WINDOW_USER_CONSENT_DIALOG_OK_BUTTON_LABEL_VCN_3DS" desc="This text is shown as the accept button label for the user consent dialog for VCN 3DS. If the user accepts the dialog, Chrome will open a pop-up and initiate the VCN 3DS flow.">
     Continue
   </message>
+  <message name="IDS_AUTOFILL_PAYMENTS_WINDOW_USER_CONSENT_DIALOG_ACCEPTANCE_ACCESSIBILITY_ANNOUNCEMENT" is_accessibility_with_no_ui="true" desc="This text is announced to the user after they have accepted the VCN 3DS consent dialog, to let the user know that the VCN 3DS pop-up is loading the bank verification website. Otherwise screen reader users would not know what is happening during the flow.">
+    Loading bank verification website
+  </message>
   <message name="IDS_AUTOFILL_REGULAR_CARD_MANUAL_FALLBACK_BUBBLE_CARD_NUMBER_LABEL_IOS" desc="Text shown above the card number in the manual fallback bubble on IOS. This bubble shows the card number for the card being shown to fill the form. Clicking this button will populate the available card-related fields of the form.">
       Card number:
   </message>
diff --git a/components/autofill_prediction_improvements/core/browser/autofill_prediction_improvements_features.h b/components/autofill_prediction_improvements/core/browser/autofill_prediction_improvements_features.h
index e437027..cb0cbd2 100644
--- a/components/autofill_prediction_improvements/core/browser/autofill_prediction_improvements_features.h
+++ b/components/autofill_prediction_improvements/core/browser/autofill_prediction_improvements_features.h
@@ -39,6 +39,11 @@
     &kAutofillPredictionImprovements, /*name=*/"execution_timeout",
     /*default_value=*/base::Seconds(10)};
 
+inline constexpr base::FeatureParam<bool> kExtractAXTreeForPredictions{
+    &kAutofillPredictionImprovements,
+    /*name=*/"extract_ax_tree_for_predictions",
+    /*default_value=*/false};
+
 }  // namespace autofill_prediction_improvements
 
 #endif  // COMPONENTS_AUTOFILL_PREDICTION_IMPROVEMENTS_CORE_BROWSER_AUTOFILL_PREDICTION_IMPROVEMENTS_FEATURES_H_
diff --git a/components/autofill_prediction_improvements/core/browser/autofill_prediction_improvements_manager.cc b/components/autofill_prediction_improvements/core/browser/autofill_prediction_improvements_manager.cc
index 78f6f14..e541a3d9 100644
--- a/components/autofill_prediction_improvements/core/browser/autofill_prediction_improvements_manager.cc
+++ b/components/autofill_prediction_improvements/core/browser/autofill_prediction_improvements_manager.cc
@@ -380,9 +380,14 @@
   }
   prediction_retrieval_state_ = PredictionRetrievalState::kIsLoadingPredictions;
   last_queried_form_global_id_ = form.global_id();
-  client_->GetAXTree(
-      base::BindOnce(&AutofillPredictionImprovementsManager::OnReceivedAXTree,
-                     weak_ptr_factory_.GetWeakPtr(), form, trigger_field));
+  if (kExtractAXTreeForPredictions.Get()) {
+    client_->GetAXTree(
+        base::BindOnce(&AutofillPredictionImprovementsManager::OnReceivedAXTree,
+                       weak_ptr_factory_.GetWeakPtr(), form, trigger_field));
+  } else {
+    optimization_guide::proto::AXTreeUpdate ax_tree_update;
+    OnReceivedAXTree(form, trigger_field, std::move(ax_tree_update));
+  }
 }
 
 void AutofillPredictionImprovementsManager::OnReceivedAXTree(
diff --git a/components/autofill_prediction_improvements/core/browser/autofill_prediction_improvements_manager_unittest.cc b/components/autofill_prediction_improvements/core/browser/autofill_prediction_improvements_manager_unittest.cc
index 44413c78..871c2847 100644
--- a/components/autofill_prediction_improvements/core/browser/autofill_prediction_improvements_manager_unittest.cc
+++ b/components/autofill_prediction_improvements/core/browser/autofill_prediction_improvements_manager_unittest.cc
@@ -185,8 +185,10 @@
     : public BaseAutofillPredictionImprovementsManagerTest {
  public:
   AutofillPredictionImprovementsManagerTest() {
-    feature_.InitAndEnableFeatureWithParameters(kAutofillPredictionImprovements,
-                                                {{"skip_allowlist", "true"}});
+    feature_.InitAndEnableFeatureWithParameters(
+        kAutofillPredictionImprovements,
+        {{"skip_allowlist", "true"},
+         {"extract_ax_tree_for_predictions", "true"}});
     ON_CALL(client_, GetFillingEngine).WillByDefault(Return(&filling_engine_));
     ON_CALL(client_, GetLastCommittedURL).WillByDefault(ReturnRef(url_));
     ON_CALL(client_, GetTitle).WillByDefault(Return("title"));
@@ -903,13 +905,17 @@
 }
 
 class AutofillPredictionImprovementsManagerTriggerAutomaticallyTest
-    : public BaseAutofillPredictionImprovementsManagerTest {
+    : public BaseAutofillPredictionImprovementsManagerTest,
+      public testing::WithParamInterface<bool> {
  public:
   AutofillPredictionImprovementsManagerTriggerAutomaticallyTest() {
     feature_.InitAndEnableFeatureWithParameters(
         kAutofillPredictionImprovements,
-        {{"skip_allowlist", "true"}, {"trigger_automatically", "true"}});
+        {{"skip_allowlist", "true"},
+         {"trigger_automatically", "true"},
+         {"extract_ax_tree_for_predictions", GetParam() ? "true" : "false"}});
     ON_CALL(client_, GetLastCommittedURL).WillByDefault(ReturnRef(url_));
+    ON_CALL(client_, GetFillingEngine).WillByDefault(Return(&filling_engine_));
     manager_ = std::make_unique<AutofillPredictionImprovementsManager>(
         &client_, &decider_, &strike_database_);
   }
@@ -918,7 +924,7 @@
 // Tests that calling `OnLoadingSuggestionShown()` results in retrieving the AX
 // tree (implying predictions will be attempted to be retrieved) if the
 // `kTriggerAutomatically` parameter is enabled.
-TEST_F(AutofillPredictionImprovementsManagerTriggerAutomaticallyTest,
+TEST_P(AutofillPredictionImprovementsManagerTriggerAutomaticallyTest,
        OnLoadingSuggestionShownGetsAXTreeIfParamEnabled) {
   base::test::SingleThreadTaskEnvironment task_environment;
   autofill::test::FormDescription form_description = {
@@ -927,11 +933,18 @@
   base::MockCallback<autofill::AutofillPredictionImprovementsDelegate::
                          UpdateSuggestionsCallback>
       update_suggestions_callback;
-  EXPECT_CALL(client_, GetAXTree);
+  if (GetParam()) {
+    EXPECT_CALL(client_, GetAXTree);
+  }
   manager_->OnLoadingSuggestionShown(form, form.fields().front(),
                                      update_suggestions_callback.Get());
 }
 
+INSTANTIATE_TEST_SUITE_P(
+    ,
+    AutofillPredictionImprovementsManagerTriggerAutomaticallyTest,
+    testing::Bool());
+
 class IsFormAndFieldEligibleAutofillPredictionImprovementsTest
     : public BaseAutofillPredictionImprovementsManagerTest {
  public:
diff --git a/components/history_embeddings/history_embeddings_service.cc b/components/history_embeddings/history_embeddings_service.cc
index 424bbac..22def83 100644
--- a/components/history_embeddings/history_embeddings_service.cc
+++ b/components/history_embeddings/history_embeddings_service.cc
@@ -1182,18 +1182,11 @@
     RecordQueryFiltered(QueryFiltered::FILTERED_NOT_ASCII);
     return true;
   }
-  std::string query = base::ToLowerASCII(raw_query);
-  std::vector<std::string_view> query_terms = base::SplitStringPiece(
-      query, " ", base::WhitespaceHandling::TRIM_WHITESPACE,
-      base::SplitResult::SPLIT_WANT_NONEMPTY);
-  for (std::string_view& query_term : query_terms) {
-    query_term = base::TrimString(
-        query_term,
-        ".?!,:;-()[]{}<>\"'/\\*&#~@^|%$`+=", base::TrimPositions::TRIM_ALL);
-  }
-  // Erase any query terms that were trimmed to empty so they don't disrupt
-  // the two term pairing logic below.
-  std::erase(query_terms, "");
+  const std::unordered_set<uint32_t>& stop_words_hashes =
+      SearchStringsUpdateListener::GetInstance()->stop_words_hashes();
+  size_t min_term_length = kWordMatchMinTermLength.Get();
+  std::vector<std::string> query_terms =
+      SplitQueryToTerms(stop_words_hashes, raw_query, min_term_length);
   const std::unordered_set<uint32_t>& filter_words_hashes =
       SearchStringsUpdateListener::GetInstance()->filter_words_hashes();
   if (std::ranges::any_of(query_terms, [&](std::string_view query_term) {
@@ -1213,15 +1206,7 @@
     }
   }
   RecordQueryFiltered(QueryFiltered::NOT_FILTERED);
-  size_t min_term_length = kWordMatchMinTermLength.Get();
-  const std::unordered_set<uint32_t>& stop_words_hashes =
-      SearchStringsUpdateListener::GetInstance()->stop_words_hashes();
-  for (std::string_view term : query_terms) {
-    if (query_terms.size() >= min_term_length &&
-        !stop_words_hashes.contains(HashString(term))) {
-      search_params.query_terms.emplace_back(term);
-    }
-  }
+  search_params.query_terms = std::move(query_terms);
   return false;
 }
 
diff --git a/components/history_embeddings/proto/history_embeddings.proto b/components/history_embeddings/proto/history_embeddings.proto
index 59e89f8..83a87fb 100644
--- a/components/history_embeddings/proto/history_embeddings.proto
+++ b/components/history_embeddings/proto/history_embeddings.proto
@@ -29,3 +29,33 @@
 message EmbeddingsValue {
   repeated EmbeddingVector vectors = 1;
 }
+
+// Represents configurable parameters for word match boosting.
+message WordMatchSearchParams {
+  float minimum_embedding_score = 1;
+  float score_boost_factor = 2;
+  float word_match_limit = 3;
+  float smoothing_factor = 4;
+  float minimum_term_length = 5;
+}
+
+// A single test case for word match boosting.
+message WordMatchBoostTestCase {
+  // Configuration for the word match boosting algorithm and formula.
+  WordMatchSearchParams params = 1;
+
+  // Raw query text.
+  string query = 2;
+
+  // Full set of passages for a hypothetical page.
+  PassagesValue passages = 3;
+
+  // This represents the boost term only, not including best embedding score.
+  float expected_score_boost = 4;
+}
+
+// A composite of many test cases for word match boosting.
+message WordMatchBoostTest {
+  repeated string stop_words = 1;
+  repeated WordMatchBoostTestCase cases = 2;
+}
diff --git a/components/history_embeddings/vector_database.cc b/components/history_embeddings/vector_database.cc
index a922b7c..f95d8ca 100644
--- a/components/history_embeddings/vector_database.cc
+++ b/components/history_embeddings/vector_database.cc
@@ -7,6 +7,7 @@
 #include <queue>
 
 #include "base/ranges/algorithm.h"
+#include "base/strings/string_split.h"
 #include "base/strings/string_tokenizer.h"
 #include "base/strings/string_util.h"
 #include "base/timer/elapsed_timer.h"
@@ -414,4 +415,25 @@
   return std::make_unique<SimpleIterator>(data_, time_range_start);
 }
 
+std::vector<std::string> SplitQueryToTerms(
+    const std::unordered_set<uint32_t>& stop_words_hashes,
+    std::string_view raw_query,
+    size_t min_term_length) {
+  extern uint32_t HashString(std::string_view str);
+  std::string query = base::ToLowerASCII(raw_query);
+  std::vector<std::string_view> term_views = base::SplitStringPiece(
+      query, " ", base::WhitespaceHandling::TRIM_WHITESPACE,
+      base::SplitResult::SPLIT_WANT_NONEMPTY);
+  std::vector<std::string> query_terms;
+  for (std::string_view& term_view : term_views) {
+    term_view = base::TrimString(term_view, ".?!,:;-()[]{}<>\"'/\\*&#~@^|%$`+=",
+                                 base::TrimPositions::TRIM_ALL);
+    if (term_view.size() >= min_term_length &&
+        !stop_words_hashes.contains(HashString(term_view))) {
+      query_terms.emplace_back(term_view);
+    }
+  }
+  return query_terms;
+}
+
 }  // namespace history_embeddings
diff --git a/components/history_embeddings/vector_database.h b/components/history_embeddings/vector_database.h
index fd87b06..76cb410 100644
--- a/components/history_embeddings/vector_database.h
+++ b/components/history_embeddings/vector_database.h
@@ -6,6 +6,7 @@
 #define COMPONENTS_HISTORY_EMBEDDINGS_VECTOR_DATABASE_H_
 
 #include <optional>
+#include <unordered_set>
 #include <vector>
 
 #include "base/time/time.h"
@@ -249,6 +250,12 @@
   std::vector<UrlPassagesEmbeddings> data_;
 };
 
+// Utility method to split a query into separate query terms for search.
+std::vector<std::string> SplitQueryToTerms(
+    const std::unordered_set<uint32_t>& stop_words_hashes,
+    std::string_view raw_query,
+    size_t min_term_length);
+
 }  // namespace history_embeddings
 
 #endif  // COMPONENTS_HISTORY_EMBEDDINGS_VECTOR_DATABASE_H_
diff --git a/components/history_embeddings/vector_database_unittest.cc b/components/history_embeddings/vector_database_unittest.cc
index 108ca045..b7252044 100644
--- a/components/history_embeddings/vector_database_unittest.cc
+++ b/components/history_embeddings/vector_database_unittest.cc
@@ -5,13 +5,18 @@
 #include "components/history_embeddings/vector_database.h"
 
 #include <atomic>
+#include <cstdint>
 #include <memory>
 
+#include "base/files/file_path.h"
+#include "base/files/file_util.h"
 #include "base/logging.h"
 #include "base/memory/weak_ptr.h"
+#include "base/path_service.h"
 #include "base/rand_util.h"
 #include "base/time/time.h"
 #include "base/timer/elapsed_timer.h"
+#include "components/history_embeddings/proto/history_embeddings.pb.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -354,4 +359,88 @@
   LOG(INFO) << "Searched " << count << " embeddings in " << timer.Elapsed();
 }
 
+base::FilePath GetWordMatchBoostTestDataPath() {
+  base::FilePath test_data_dir;
+  base::PathService::Get(base::DIR_SRC_TEST_DATA_ROOT, &test_data_dir);
+  return test_data_dir.AppendASCII(
+      "components/test/data/history_embeddings/word_match_boost_test_data");
+}
+
+// This is a utility test to produce a simple test data protobuf text file.  It
+// shows structure and can be enabled if we need to produce a stub or extra test
+// files, but the main test file should be filled manually with real test cases.
+TEST(HistoryEmbeddingsVectorDatabaseTest,
+     DISABLED_GenerateWordMatchBoostProtoDataTest) {
+  proto::WordMatchBoostTest test;
+  proto::WordMatchBoostTestCase* test_case = test.add_cases();
+  test_case->mutable_params()->set_minimum_embedding_score(0.0f);
+  test_case->mutable_params()->set_score_boost_factor(0.2f);
+  test_case->mutable_params()->set_word_match_limit(5);
+  test_case->mutable_params()->set_smoothing_factor(1);
+  test_case->set_query("example test query");
+  test_case->mutable_passages()->add_passages("this is an example passage");
+  test_case->mutable_passages()->add_passages(
+      "this example passage matches the test query term 'query'");
+  test_case->mutable_passages()->add_passages(
+      "all of this test data is for test, test, testing!");
+  test_case->set_expected_score_boost(0.070000052f);
+  EXPECT_TRUE(base::WriteFile(GetWordMatchBoostTestDataPath(),
+                              test.SerializeAsString()));
+}
+
+TEST(HistoryEmbeddingsVectorDatabaseTest, WordMatchBoostProtoDataTest) {
+  extern uint32_t HashString(std::string_view str);
+  auto no = base::BindRepeating([]() { return false; });
+  std::string test_proto_content;
+  EXPECT_TRUE(base::ReadFileToString(GetWordMatchBoostTestDataPath(),
+                                     &test_proto_content));
+
+  history_embeddings::proto::WordMatchBoostTest test;
+  EXPECT_TRUE(test.ParseFromString(test_proto_content));
+
+  std::unordered_set<uint32_t> stop_words_hashes;
+  for (const std::string& stop_word : test.stop_words()) {
+    stop_words_hashes.insert(HashString(stop_word));
+  }
+
+  for (const proto::WordMatchBoostTestCase& test_case : test.cases()) {
+    VectorDatabaseInMemory database;
+    SearchParams search_params;
+    search_params.word_match_minimum_embedding_score =
+        test_case.params().minimum_embedding_score();
+    search_params.word_match_limit = test_case.params().word_match_limit();
+    search_params.word_match_score_boost_factor =
+        test_case.params().score_boost_factor();
+    search_params.word_match_smoothing_factor =
+        test_case.params().smoothing_factor();
+    UrlPassagesEmbeddings url_data(1, 1, base::Time::Now());
+    for (const std::string& passage : test_case.passages().passages()) {
+      url_data.url_passages.passages.add_passages(passage);
+      url_data.url_embeddings.embeddings.push_back(DeterministicEmbedding(0));
+    }
+    database.AddUrlData(url_data);
+
+    // Basic embedding search with no query terms produces flat embedding score.
+    Embedding query_embedding = DeterministicEmbedding(0);
+    std::vector<ScoredUrl> scored_urls =
+        database.FindNearest({}, 1, /*search_params=*/{}, query_embedding, no)
+            .scored_urls;
+    EXPECT_EQ(scored_urls.size(), 1u);
+    EXPECT_FLOAT_EQ(scored_urls[0].score, 1.0f);
+
+    // Set up some query terms to boost score with word matches against
+    // passages.
+    search_params.query_terms =
+        SplitQueryToTerms(stop_words_hashes, test_case.query(),
+                          test_case.params().minimum_term_length());
+    scored_urls =
+        database.FindNearest({}, 1, search_params, query_embedding, no)
+            .scored_urls;
+    EXPECT_EQ(scored_urls.size(), 1u);
+    // Embedding score without boost is 1.0f; subtract it to determine boost.
+    float word_match_boost = scored_urls[0].score - 1.0f;
+    EXPECT_FLOAT_EQ(word_match_boost, test_case.expected_score_boost());
+  }
+}
+
 }  // namespace history_embeddings
diff --git a/components/ip_protection/common/ip_protection_core.h b/components/ip_protection/common/ip_protection_core.h
index 83c350677..7cc28b6 100644
--- a/components/ip_protection/common/ip_protection_core.h
+++ b/components/ip_protection/common/ip_protection_core.h
@@ -29,6 +29,13 @@
   // This function is called on every URL load, so it should complete quickly.
   virtual bool AreAuthTokensAvailable() = 0;
 
+  // Check whether the tokens in either cache have ever been filled.
+  //
+  // If even one cache has not been filled at least once, this method should
+  // return false. Also, this method will ALWAYS return false if the proxy list
+  // is unavailable.
+  virtual bool WereTokenCachesEverFilled() = 0;
+
   // Get a token, if one is available.
   //
   // Returns `nullopt` if no token is available, whether for a transient or
diff --git a/components/ip_protection/common/ip_protection_core_impl.cc b/components/ip_protection/common/ip_protection_core_impl.cc
index 33d5047e..84c7135 100644
--- a/components/ip_protection/common/ip_protection_core_impl.cc
+++ b/components/ip_protection/common/ip_protection_core_impl.cc
@@ -123,6 +123,22 @@
   return all_caches_have_tokens;
 }
 
+bool IpProtectionCoreImpl::WereTokenCachesEverFilled() {
+  // If proxy list is not available, tokens cannot be available. Also if there
+  // are no token cache managers, there are no tokens.
+  if (!IsProxyListAvailable() || ipp_token_managers_.empty()) {
+    return false;
+  }
+
+  bool all_caches_have_been_filled = true;
+  for (const auto& manager : ipp_token_managers_) {
+    if (!manager.second->WasTokenCacheEverFilled()) {
+      all_caches_have_been_filled = false;
+    }
+  }
+  return all_caches_have_been_filled;
+}
+
 std::optional<BlindSignedAuthToken> IpProtectionCoreImpl::GetAuthToken(
     size_t chain_index) {
   std::optional<BlindSignedAuthToken> result;
diff --git a/components/ip_protection/common/ip_protection_core_impl.h b/components/ip_protection/common/ip_protection_core_impl.h
index a5f70e2af..0bb223a4 100644
--- a/components/ip_protection/common/ip_protection_core_impl.h
+++ b/components/ip_protection/common/ip_protection_core_impl.h
@@ -42,6 +42,7 @@
   // IpProtectionCore implementation.
   bool IsIpProtectionEnabled() override;
   bool AreAuthTokensAvailable() override;
+  bool WereTokenCachesEverFilled() override;
   std::optional<BlindSignedAuthToken> GetAuthToken(size_t chain_index) override;
   bool IsProxyListAvailable() override;
   void QuicProxiesFailed() override;
diff --git a/components/ip_protection/common/ip_protection_core_impl_unittest.cc b/components/ip_protection/common/ip_protection_core_impl_unittest.cc
index cd2d9e8c2..a024413 100644
--- a/components/ip_protection/common/ip_protection_core_impl_unittest.cc
+++ b/components/ip_protection/common/ip_protection_core_impl_unittest.cc
@@ -46,6 +46,10 @@
     return auth_tokens_.contains(geo_id);
   }
 
+  bool WasTokenCacheEverFilled() override {
+    return was_token_cache_ever_filled_;
+  }
+
   void InvalidateTryAgainAfterTime() override {}
 
   std::string CurrentGeo() const override { return current_geo_id_; }
@@ -68,6 +72,7 @@
   }
 
   void SetAuthToken(BlindSignedAuthToken auth_token) {
+    was_token_cache_ever_filled_ = true;
     auth_tokens_[GetGeoIdFromGeoHint(auth_token.geo_hint)] = auth_token;
   }
 
@@ -75,6 +80,7 @@
   std::map<std::string, BlindSignedAuthToken> auth_tokens_;
   std::optional<BlindSignedAuthToken> auth_token_;
   std::string current_geo_id_;
+  bool was_token_cache_ever_filled_ = false;
 };
 
 class MockIpProtectionProxyConfigManager
@@ -183,6 +189,7 @@
   ipp_core_->SetIpProtectionProxyConfigManagerForTesting(
       std::move(ipp_proxy_config_manager));
 
+  ASSERT_FALSE(ipp_core_->WereTokenCachesEverFilled());
   ASSERT_FALSE(ipp_core_->AreAuthTokensAvailable());
 }
 
@@ -199,6 +206,7 @@
   ipp_core_->SetIpProtectionTokenManagerForTesting(
       ProxyLayer::kProxyA, std::move(ipp_token_manager));
 
+  ASSERT_FALSE(ipp_core_->WereTokenCachesEverFilled());
   ASSERT_FALSE(ipp_core_->AreAuthTokensAvailable());
   // Neither calls will return a token since there is no proxy list available.
   ASSERT_FALSE(ipp_core_->GetAuthToken(0).has_value());
@@ -222,6 +230,7 @@
   ipp_core_->SetIpProtectionTokenManagerForTesting(
       ProxyLayer::kProxyA, std::move(ipp_token_manager));
 
+  ASSERT_TRUE(ipp_core_->WereTokenCachesEverFilled());
   ASSERT_TRUE(ipp_core_->AreAuthTokensAvailable());
   ASSERT_FALSE(
       ipp_core_->GetAuthToken(1).has_value());  // ProxyB has no tokens.
@@ -247,6 +256,7 @@
   ipp_core_->SetIpProtectionTokenManagerForTesting(
       ProxyLayer::kProxyB, std::move(ipp_token_manager));
 
+  ASSERT_TRUE(ipp_core_->WereTokenCachesEverFilled());
   ASSERT_TRUE(ipp_core_->AreAuthTokensAvailable());
   ASSERT_FALSE(
       ipp_core_->GetAuthToken(0).has_value());  // ProxyA has no tokens.
@@ -275,6 +285,7 @@
   ipp_core_->SetIpProtectionTokenManagerForTesting(
       ProxyLayer::kProxyB, std::make_unique<MockIpProtectionTokenManager>());
 
+  ASSERT_FALSE(ipp_core_->WereTokenCachesEverFilled());
   ASSERT_FALSE(ipp_core_->AreAuthTokensAvailable());
   histogram_tester_.ExpectTotalCount(kEmptyTokenCacheHistogram, 1);
   histogram_tester_.ExpectBucketCount(kEmptyTokenCacheHistogram,
@@ -306,6 +317,7 @@
 
   // The following calls will be based on the proxy list manager's geo (Mountain
   // View).
+  ASSERT_TRUE(ipp_core_->WereTokenCachesEverFilled());
   ASSERT_TRUE(ipp_core_->AreAuthTokensAvailable());
   std::optional<BlindSignedAuthToken> token = ipp_core_->GetAuthToken(0);
   ASSERT_TRUE(token);
diff --git a/components/ip_protection/common/ip_protection_proxy_config_manager_impl_unittest.cc b/components/ip_protection/common/ip_protection_proxy_config_manager_impl_unittest.cc
index 3471dc0a..a3474c61 100644
--- a/components/ip_protection/common/ip_protection_proxy_config_manager_impl_unittest.cc
+++ b/components/ip_protection/common/ip_protection_proxy_config_manager_impl_unittest.cc
@@ -100,6 +100,7 @@
   // Dummy implementations for functions not tested in this file.
   bool IsIpProtectionEnabled() override { return true; }
   bool AreAuthTokensAvailable() override { return false; }
+  bool WereTokenCachesEverFilled() override { return false; }
   std::optional<BlindSignedAuthToken> GetAuthToken(
       size_t chain_index) override {
     return std::nullopt;
diff --git a/components/ip_protection/common/ip_protection_proxy_delegate.cc b/components/ip_protection/common/ip_protection_proxy_delegate.cc
index baa1b76..ef6078d 100644
--- a/components/ip_protection/common/ip_protection_proxy_delegate.cc
+++ b/components/ip_protection/common/ip_protection_proxy_delegate.cc
@@ -100,17 +100,20 @@
     vlog("ip protection proxy is not currently enabled");
     return ProxyResolutionResult::kSettingDisabled;
   }
+  const bool were_token_caches_ever_filled =
+      ipp_core_->WereTokenCachesEverFilled();
   const bool auth_tokens_are_available = ipp_core_->AreAuthTokensAvailable();
   const bool proxy_list_is_available = ipp_core_->IsProxyListAvailable();
-  if (!auth_tokens_are_available && !proxy_list_is_available) {
-    vlog("neither proxy list nor auth token available");
-    return ProxyResolutionResult::kTokensAndProxyListNotAvailable;
-  } else if (!auth_tokens_are_available) {
-    vlog("no auth token available from cache");
-    return ProxyResolutionResult::kTokensNotAvailable;
-  } else if (!proxy_list_is_available) {
+
+  if (!proxy_list_is_available) {
     vlog("no proxy list available from cache");
     return ProxyResolutionResult::kProxyListNotAvailable;
+  } else if (!were_token_caches_ever_filled) {
+    vlog("token caches have never been filled");
+    return ProxyResolutionResult::kTokensNeverAvailable;
+  } else if (!auth_tokens_are_available) {
+    vlog("no auth token available from cache");
+    return ProxyResolutionResult::kTokensExhausted;
   }
 
   return ProxyResolutionResult::kAttemptProxy;
diff --git a/components/ip_protection/common/ip_protection_proxy_delegate_unittest.cc b/components/ip_protection/common/ip_protection_proxy_delegate_unittest.cc
index 4a66cea..723d381 100644
--- a/components/ip_protection/common/ip_protection_proxy_delegate_unittest.cc
+++ b/components/ip_protection/common/ip_protection_proxy_delegate_unittest.cc
@@ -63,6 +63,11 @@
   bool IsIpProtectionEnabled() override { return is_ip_protection_enabled_; }
 
   bool AreAuthTokensAvailable() override { return auth_token_.has_value(); }
+
+  bool WereTokenCachesEverFilled() override {
+    return were_token_caches_ever_filled_;
+  }
+
   std::optional<BlindSignedAuthToken> GetAuthToken(
       size_t chain_index) override {
     return std::move(auth_token_);
@@ -72,6 +77,7 @@
   // `GetAuthToken()`.
   void SetNextAuthToken(std::optional<BlindSignedAuthToken> auth_token) {
     auth_token_ = std::move(auth_token);
+    were_token_caches_ever_filled_ = true;
   }
 
   std::vector<net::ProxyChain> GetProxyChainList() override {
@@ -110,8 +116,11 @@
     on_proxies_failed_ = std::move(on_proxies_failed);
   }
 
+  void ExhaustTokenCache() { auth_token_ = std::nullopt; }
+
  private:
   bool is_ip_protection_enabled_ = true;
+  bool were_token_caches_ever_filled_ = false;
   std::optional<BlindSignedAuthToken> auth_token_;
   std::optional<std::vector<net::ProxyChain>> proxy_list_;
   std::vector<net::ProxyChain> proxy_chain_list_;
@@ -510,7 +519,7 @@
   histogram_tester_.ExpectTotalCount(kAvailabilityHistogram, 0);
 }
 
-TEST_F(IpProtectionProxyDelegateTest, OnResolveProxy_NoAuthToken) {
+TEST_F(IpProtectionProxyDelegateTest, OnResolveProxy_NoAuthTokenEver) {
   std::map<std::string, std::set<std::string>> first_party_map;
   first_party_map["example.com"] = {};
   auto masked_domain_list_manager =
@@ -530,8 +539,46 @@
 
   EXPECT_TRUE(result.is_direct());
   EXPECT_FALSE(result.is_for_ip_protection());
+
   histogram_tester_.ExpectUniqueSample(
-      kProxyResolutionHistogram, ProxyResolutionResult::kTokensNotAvailable, 1);
+      kProxyResolutionHistogram, ProxyResolutionResult::kTokensNeverAvailable,
+      1);
+  histogram_tester_.ExpectUniqueSample(kEligibilityHistogram,
+                                       ProtectionEligibility::kEligible, 1);
+  histogram_tester_.ExpectUniqueSample(kAreAuthTokensAvailableHistogram, false,
+                                       1);
+  histogram_tester_.ExpectUniqueSample(kIsProxyListAvailableHistogram, true, 1);
+  histogram_tester_.ExpectUniqueSample(kAvailabilityHistogram, false, 1);
+}
+
+TEST_F(IpProtectionProxyDelegateTest, OnResolveProxy_NoAuthToken_Exhausted) {
+  std::map<std::string, std::set<std::string>> first_party_map;
+  first_party_map["example.com"] = {};
+  auto masked_domain_list_manager =
+      MaskedDomainListManager::CreateForTesting(first_party_map);
+  auto ipp_core = std::make_unique<MockIpProtectionCore>();
+  ipp_core->SetProxyList({MakeChain({"proxy"})});
+
+  // Token is added but will be removed to simulate exhaustion.
+  ipp_core->SetNextAuthToken(MakeAuthToken("Bearer: a-token"));
+  ipp_core->ExhaustTokenCache();
+
+  // Tokens in cache are exhausted, so the result will be direct.
+  auto delegate =
+      CreateDelegate(&masked_domain_list_manager, std::move(ipp_core));
+
+  net::ProxyInfo result;
+  result.UseDirect();
+  delegate->OnResolveProxy(GURL(kHttpsUrl),
+                           net::NetworkAnonymizationKey::CreateCrossSite(
+                               net::SchemefulSite(GURL("https://top.com"))),
+                           "GET", net::ProxyRetryInfoMap(), &result);
+
+  EXPECT_TRUE(result.is_direct());
+  EXPECT_FALSE(result.is_for_ip_protection());
+
+  histogram_tester_.ExpectUniqueSample(
+      kProxyResolutionHistogram, ProxyResolutionResult::kTokensExhausted, 1);
   histogram_tester_.ExpectUniqueSample(kEligibilityHistogram,
                                        ProtectionEligibility::kEligible, 1);
   histogram_tester_.ExpectUniqueSample(kAreAuthTokensAvailableHistogram, false,
@@ -565,7 +612,7 @@
       1);
   histogram_tester_.ExpectUniqueSample(kEligibilityHistogram,
                                        ProtectionEligibility::kEligible, 1);
-  histogram_tester_.ExpectUniqueSample(kAreAuthTokensAvailableHistogram, true,
+  histogram_tester_.ExpectUniqueSample(kAreAuthTokensAvailableHistogram, false,
                                        1);
   histogram_tester_.ExpectUniqueSample(kIsProxyListAvailableHistogram, false,
                                        1);
diff --git a/components/ip_protection/common/ip_protection_telemetry.h b/components/ip_protection/common/ip_protection_telemetry.h
index 501faa7..10ad16f 100644
--- a/components/ip_protection/common/ip_protection_telemetry.h
+++ b/components/ip_protection/common/ip_protection_telemetry.h
@@ -38,12 +38,16 @@
   kFeatureDisabled = 2,
   // The IP Protection setting is disabled.
   kSettingDisabled = 3,
-  // Tokens for the current geo are not available.
-  kTokensNotAvailable = 4,
-  // The proxy list is not available.
-  kProxyListNotAvailable = 5,
-  // Neither tokens for the current geo, nor the proxy list, are available.
-  kTokensAndProxyListNotAvailable = 6,
+  // The proxy list is not available. This disposition does not imply that
+  // tokens were available. It is possible that the proxy list was not available
+  // AND tokens were not available.
+  kProxyListNotAvailable = 4,
+  // Tokens are not available because the one or both of the token caches was
+  // never filled.
+  kTokensNeverAvailable = 5,
+  // Tokens are not available for the current geo due to the cache being
+  // exhausted.
+  kTokensExhausted = 6,
   // The request was resolved to use the IP Protection proxies.
   kAttemptProxy = 7,
   kMaxValue = kAttemptProxy,
diff --git a/components/ip_protection/common/ip_protection_telemetry_uma.cc b/components/ip_protection/common/ip_protection_telemetry_uma.cc
index 170a5b0b..3c6fe23 100644
--- a/components/ip_protection/common/ip_protection_telemetry_uma.cc
+++ b/components/ip_protection/common/ip_protection_telemetry_uma.cc
@@ -128,24 +128,21 @@
     case ProxyResolutionResult::kSettingDisabled:
       eligibility = ProtectionEligibility::kEligible;
       break;
-    case ProxyResolutionResult::kTokensNotAvailable:
+    case ProxyResolutionResult::kProxyListNotAvailable:
+      eligibility = ProtectionEligibility::kEligible;
+      record_availability(
+          /*are_auth_tokens_available=*/false,
+          /*is_proxy_list_available=*/false);
+      break;
+    case ProxyResolutionResult::kTokensNeverAvailable:
+      // fall through to the same as exhausted tokens for the purpose of this
+      // metric.
+    case ProxyResolutionResult::kTokensExhausted:
       eligibility = ProtectionEligibility::kEligible;
       record_availability(
           /*are_auth_tokens_available=*/false,
           /*is_proxy_list_available=*/true);
       break;
-    case ProxyResolutionResult::kProxyListNotAvailable:
-      eligibility = ProtectionEligibility::kEligible;
-      record_availability(
-          /*are_auth_tokens_available=*/true,
-          /*is_proxy_list_available=*/false);
-      break;
-    case ProxyResolutionResult::kTokensAndProxyListNotAvailable:
-      eligibility = ProtectionEligibility::kEligible;
-      record_availability(
-          /*are_auth_tokens_available=*/false,
-          /*is_proxy_list_available=*/false);
-      break;
     case ProxyResolutionResult::kAttemptProxy:
       eligibility = ProtectionEligibility::kEligible;
       record_availability(
diff --git a/components/ip_protection/common/ip_protection_token_manager.h b/components/ip_protection/common/ip_protection_token_manager.h
index bb03244..5d7435b 100644
--- a/components/ip_protection/common/ip_protection_token_manager.h
+++ b/components/ip_protection/common/ip_protection_token_manager.h
@@ -61,6 +61,11 @@
   // be called by the `IpProtectionCore` for when a geo change has been
   // observed.
   virtual void SetCurrentGeo(const std::string& geo_id) = 0;
+
+  // Returns a bool indicating whether the token cache was ever filled.
+  //
+  // Returns true if the token cache was filled at some point, false otherwise.
+  virtual bool WasTokenCacheEverFilled() = 0;
 };
 
 }  // namespace ip_protection
diff --git a/components/ip_protection/common/ip_protection_token_manager_impl.cc b/components/ip_protection/common/ip_protection_token_manager_impl.cc
index 77b04e0..0ddfdd5 100644
--- a/components/ip_protection/common/ip_protection_token_manager_impl.cc
+++ b/components/ip_protection/common/ip_protection_token_manager_impl.cc
@@ -95,6 +95,10 @@
                                                              : kDefaultGeo);
 }
 
+bool IpProtectionTokenManagerImpl::WasTokenCacheEverFilled() {
+  return cache_has_been_filled_;
+}
+
 // If this is a good time to request another batch of tokens, do so. This
 // method is idempotent, and can be called at any time.
 void IpProtectionTokenManagerImpl::MaybeRefillCache() {
@@ -263,8 +267,7 @@
   }
 
   VLOG(2) << "IPPATC::OnGotAuthTokens got " << tokens->size()
-          << " tokens for proxy "
-          << int(proxy_layer_);
+          << " tokens for proxy " << int(proxy_layer_);
   try_get_auth_tokens_after_ = base::Time();
 
   RemoveExpiredTokens();
@@ -317,6 +320,9 @@
               return a.expiration < b.expiration;
             });
 
+  // Cache at this point should be filled with tokens at least once.
+  cache_has_been_filled_ = true;
+
   // If a refill is still needed, we do not want to immediately re-request
   // tokens, lest we overwhelm the server. This is unlikely to happen in
   // practice, but exists as a safety check.
diff --git a/components/ip_protection/common/ip_protection_token_manager_impl.h b/components/ip_protection/common/ip_protection_token_manager_impl.h
index a271a1e..5f71550 100644
--- a/components/ip_protection/common/ip_protection_token_manager_impl.h
+++ b/components/ip_protection/common/ip_protection_token_manager_impl.h
@@ -36,6 +36,7 @@
   // IpProtectionTokenManager implementation.
   bool IsAuthTokenAvailable() override;
   bool IsAuthTokenAvailable(const std::string& geo_id) override;
+  bool WasTokenCacheEverFilled() override;
   std::optional<BlindSignedAuthToken> GetAuthToken() override;
   std::optional<BlindSignedAuthToken> GetAuthToken(
       const std::string& geo_id) override;
@@ -128,6 +129,9 @@
   // outstanding.
   bool fetching_auth_tokens_ = false;
 
+  // True if the cache has been filled at least once.
+  bool cache_has_been_filled_ = false;
+
   // True if the "NetworkService.IpProtection.GeoChangeTokenPresence" metric
   // needs to be sampled. False if the presence has already been sampled. This
   // value should be reset to true after `SetCurrentGeo` is called after a token
diff --git a/components/ip_protection/common/ip_protection_token_manager_impl_unittest.cc b/components/ip_protection/common/ip_protection_token_manager_impl_unittest.cc
index 54b74a9..dda2964 100644
--- a/components/ip_protection/common/ip_protection_token_manager_impl_unittest.cc
+++ b/components/ip_protection/common/ip_protection_token_manager_impl_unittest.cc
@@ -29,7 +29,6 @@
 
 constexpr char kGeoChangeTokenPresence[] =
     "NetworkService.IpProtection.GeoChangeTokenPresence";
-
 constexpr char kGetAuthTokenResultHistogram[] =
     "NetworkService.IpProtection.GetAuthTokenResult";
 constexpr char kProxyATokenSpendRateHistogram[] =
@@ -132,6 +131,7 @@
   // Dummy implementations for functions not tested in this file.
   bool IsIpProtectionEnabled() override { return true; }
   bool AreAuthTokensAvailable() override { return false; }
+  bool WereTokenCachesEverFilled() override { return false; }
   std::optional<BlindSignedAuthToken> GetAuthToken(
       size_t chain_index) override {
     return std::nullopt;
@@ -271,7 +271,9 @@
 // disabled.
 TEST_F(IpProtectionTokenManagerImplTest, IsAuthTokenAvailableFalseEmpty) {
   SetUpIpProtectionTokenManager(kDisableTokenCacheByGeo);
+
   EXPECT_FALSE(ipp_proxy_a_token_manager_->IsAuthTokenAvailable());
+  EXPECT_FALSE(ipp_proxy_a_token_manager_->WasTokenCacheEverFilled());
 }
 
 // `IsAuthTokenAvailable()` returns false on an empty cache. Geo Caching
@@ -290,6 +292,10 @@
   // false.
   EXPECT_FALSE(
       ipp_proxy_a_token_manager_->IsAuthTokenAvailable(kMountainViewGeoId));
+
+  // Although the tokens were not available for a given geo, the cache had
+  // already been filled at some point.
+  EXPECT_TRUE(ipp_proxy_a_token_manager_->WasTokenCacheEverFilled());
 }
 
 // `IsAuthTokenAvailable()` returns true on a cache containing unexpired
@@ -303,6 +309,7 @@
   ASSERT_TRUE(mock_.GotAllExpectedMockCalls());
 
   EXPECT_TRUE(ipp_proxy_a_token_manager_->IsAuthTokenAvailable());
+  EXPECT_TRUE(ipp_proxy_a_token_manager_->WasTokenCacheEverFilled());
 }
 
 // `IsAuthTokenAvailable()` returns true on a cache containing unexpired
@@ -318,6 +325,7 @@
 
   EXPECT_TRUE(
       ipp_proxy_a_token_manager_->IsAuthTokenAvailable(kMountainViewGeoId));
+  EXPECT_TRUE(ipp_proxy_a_token_manager_->WasTokenCacheEverFilled());
 }
 
 // `IsAuthTokenAvailable()` returns false on a cache containing expired
@@ -330,6 +338,9 @@
   CallTryGetAuthTokensAndWait(ProxyLayer::kProxyA);
   ASSERT_TRUE(mock_.GotAllExpectedMockCalls());
   EXPECT_FALSE(ipp_proxy_a_token_manager_->IsAuthTokenAvailable());
+
+  // The cache has been filled at some point despite the tokens being expired.
+  EXPECT_TRUE(ipp_proxy_a_token_manager_->WasTokenCacheEverFilled());
 }
 
 // `IsAuthTokenAvailable()` returns false on a geo's cache containing expired
@@ -346,6 +357,9 @@
 
   EXPECT_FALSE(
       ipp_proxy_a_token_manager_->IsAuthTokenAvailable(kMountainViewGeoId));
+
+  // Cache has been filled at some point despite expired tokens.
+  EXPECT_TRUE(ipp_proxy_a_token_manager_->WasTokenCacheEverFilled());
 }
 
 // `GetAuthToken()` returns nullopt on an empty cache.
@@ -538,6 +552,10 @@
   ASSERT_FALSE(
       ipp_proxy_a_token_manager_->IsAuthTokenAvailable(kMountainViewGeoId));
   ASSERT_FALSE(ipp_proxy_a_token_manager_->GetAuthToken(kMountainViewGeoId));
+
+  // Cache was never filled due to error.
+  ASSERT_FALSE(ipp_proxy_a_token_manager_->WasTokenCacheEverFilled());
+
   ExpectHistogramState(
       HistogramState{.success = 0, .failure = 1, .generated = 0});
 }
@@ -592,6 +610,9 @@
 
   EXPECT_FALSE(ipp_token_manager.IsAuthTokenAvailable(kMountainViewGeoId));
 
+  // Cache was never filled due to nullptr.
+  EXPECT_FALSE(ipp_token_manager.WasTokenCacheEverFilled());
+
   auto token = ipp_token_manager.GetAuthToken(kMountainViewGeoId);
   ASSERT_FALSE(token);
   ExpectHistogramState(
diff --git a/components/live_caption/BUILD.gn b/components/live_caption/BUILD.gn
index 672df97..59b5f7a2 100644
--- a/components/live_caption/BUILD.gn
+++ b/components/live_caption/BUILD.gn
@@ -76,6 +76,8 @@
       "greedy_text_stabilizer.h",
       "live_translate_controller.cc",
       "live_translate_controller.h",
+      "translation_dispatcher.cc",
+      "translation_dispatcher.h",
     ]
 
     deps = [
diff --git a/components/live_caption/live_translate_controller.cc b/components/live_caption/live_translate_controller.cc
index 68888c8..e10b7306 100644
--- a/components/live_caption/live_translate_controller.cc
+++ b/components/live_caption/live_translate_controller.cc
@@ -9,54 +9,29 @@
 #include <utility>
 
 #include "base/functional/bind.h"
-#include "base/json/json_reader.h"
-#include "base/metrics/histogram_functions.h"
-#include "base/metrics/metrics_hashes.h"
 #include "base/strings/stringprintf.h"
 #include "base/values.h"
 #include "components/live_caption/pref_names.h"
+#include "components/live_caption/translation_dispatcher.h"
 #include "components/pref_registry/pref_registry_syncable.h"
 #include "components/prefs/pref_change_registrar.h"
 #include "components/prefs/pref_service.h"
 #include "components/soda/constants.h"
 #include "components/sync_preferences/pref_service_syncable.h"
 #include "content/public/browser/browser_context.h"
-#include "content/public/browser/storage_partition.h"
 #include "google_apis/google_api_keys.h"
 #include "media/mojo/mojom/speech_recognition_result.h"
-#include "mojo/public/cpp/bindings/remote.h"
-#include "net/http/http_request_headers.h"
-#include "services/network/public/cpp/resource_request.h"
-#include "services/network/public/cpp/simple_url_loader.h"
-#include "services/network/public/mojom/network_context.mojom.h"
-#include "url/gurl.h"
 
 namespace captions {
 
-// Request constants.
-const size_t kMaxMessageSize = 1024 * 1024;  // 1MB
-constexpr char kTranslateBodyRequestTemplate[] =
-    "{"
-    "\"q\":\"%s\","
-    "\"source\":\"%s\","
-    "\"target\":\"%s\","
-    "\"format\":\"text\""
-    "}";
-constexpr char kTranslateUrl[] =
-    "https://translation.googleapis.com/language/translate/v2?key=%s";
-constexpr char kUploadContentType[] = "application/json";
-
-// Response constants.
-constexpr char kDataKey[] = "data";
-constexpr char kTranslationsKey[] = "translations";
-constexpr char kTranslatedTextKey[] = "translatedText";
-
 LiveTranslateController::LiveTranslateController(
     PrefService* profile_prefs,
     content::BrowserContext* browser_context)
-    : browser_context_(browser_context),
-      profile_prefs_(profile_prefs),
-      pref_change_registrar_(std::make_unique<PrefChangeRegistrar>()) {
+    : profile_prefs_(profile_prefs),
+      pref_change_registrar_(std::make_unique<PrefChangeRegistrar>()),
+      translation_dispatcher_(
+          std::make_unique<TranslationDispatcher>(google_apis::GetAPIKey(),
+                                                  browser_context)) {
   pref_change_registrar_->Init(profile_prefs_);
   pref_change_registrar_->Add(
       prefs::kLiveTranslateEnabled,
@@ -81,132 +56,8 @@
     std::string source_language,
     std::string target_language,
     OnTranslateEventCallback callback) {
-  if (!url_loader_factory_.is_bound() || !url_loader_factory_.is_connected()) {
-    ResetURLLoaderFactory();
-  }
-
-  auto resource_request = std::make_unique<network::ResourceRequest>();
-  resource_request->url =
-      GURL(base::StringPrintf(kTranslateUrl, google_apis::GetAPIKey().c_str()));
-
-  resource_request->method = net::HttpRequestHeaders::kPostMethod;
-  resource_request->credentials_mode = network::mojom::CredentialsMode::kOmit;
-
-  net::NetworkTrafficAnnotationTag traffic_annotation =
-      net::DefineNetworkTrafficAnnotation("cloud_speech_recognition",
-                                          R"(
-        semantics {
-          sender: "Live Translate"
-          description:
-            "Chrome provides the ability to translate captions generated from "
-            "output audio by using the Google Cloud Translate web service. "
-            "Captions are sent to Google's servers and translated captions are "
-            "returned."
-          trigger:
-            "Triggered in direct response to a user playing a media with audio "
-            "with the Live Translate feature enabled."
-          data: "Captions to be translated by Google's Cloud Translate web "
-            "service."
-          destination: GOOGLE_OWNED_SERVICE
-        }
-        policy {
-          cookies_allowed: NO
-          setting:
-            "You can enable or disable this feature via the caption settings "
-            "page."
-          chrome_policy {
-            TranslateEnabled {
-                TranslateEnabled: false
-            }
-          }
-        })");
-  url_loader_ = network::SimpleURLLoader::Create(std::move(resource_request),
-                                                 traffic_annotation);
-  url_loader_->AttachStringForUpload(
-      base::StringPrintf(kTranslateBodyRequestTemplate, result.c_str(),
-                         source_language.c_str(), target_language.c_str()),
-      kUploadContentType);
-  url_loader_->SetAllowHttpErrorResults(true);
-
-  // Unretained is safe because |this| owns |url_loader_|.
-  url_loader_->DownloadToString(
-      url_loader_factory_.get(),
-      base::BindOnce(&LiveTranslateController::OnURLLoadComplete,
-                     base::Unretained(this), std::move(callback)),
-      kMaxMessageSize);
-
-  base::UmaHistogramSparse("Accessibility.LiveTranslate.TargetLanguage",
-                           base::HashMetricName(target_language));
-  base::UmaHistogramSparse("Accessibility.LiveTranslate.SourceLanguage",
-                           base::HashMetricName(source_language));
-}
-
-void LiveTranslateController::ResetURLLoaderFactory() {
-  network::mojom::URLLoaderFactoryParamsPtr params =
-      network::mojom::URLLoaderFactoryParams::New();
-  params->process_id = network::mojom::kBrowserProcessId;
-  params->is_trusted = false;
-  params->automatically_assign_isolation_info = true;
-  network::mojom::NetworkContext* network_context =
-      browser_context_->GetDefaultStoragePartition()->GetNetworkContext();
-  network_context->CreateURLLoaderFactory(
-      url_loader_factory_.BindNewPipeAndPassReceiver(), std::move(params));
-}
-
-void LiveTranslateController::OnURLLoadComplete(
-    OnTranslateEventCallback callback,
-    std::unique_ptr<std::string> response_body) {
-  if (!response_body) {
-    LOG(ERROR) << "Error parsing response: reponse body null";
-    return;
-  }
-
-  // Parse the response in a utility process.
-  data_decoder_.ParseJson(
-      *response_body,
-      base::BindOnce(&LiveTranslateController::OnResponseJsonParsed,
-                     weak_factory_.GetWeakPtr(), std::move(callback)));
-}
-
-void LiveTranslateController::OnResponseJsonParsed(
-    OnTranslateEventCallback callback,
-    data_decoder::DataDecoder::ValueOrError result) {
-  std::string error = [&]() -> std::string {
-    if (!result.has_value()) {
-      return "Error parsing response: value null";
-    }
-
-    if (!result.value().is_dict()) {
-      return "Error parsing response: result value is not a dictionary";
-    }
-
-    const base::Value::Dict* data_dict =
-        result.value().GetDict().FindDict(kDataKey);
-    if (!data_dict) {
-      return "Error parsing response: dictionary not found";
-    }
-
-    const base::Value::List* translations_list =
-        data_dict->FindList(kTranslationsKey);
-    if (!translations_list || translations_list->empty()) {
-      return "Error parsing response: translations not found";
-    }
-
-    const base::Value::Dict* translated_text =
-        (*translations_list)[0].GetIfDict();
-    if (!translated_text) {
-      return "Error parsing response: translated text not found";
-    }
-
-    if (const std::string* value =
-            translated_text->FindString(kTranslatedTextKey)) {
-      std::move(callback).Run(*value);
-    }
-    return std::string();
-  }();
-  if (!error.empty()) {
-    LOG(ERROR) << std::move(error);
-  }
+  translation_dispatcher_->GetTranslation(result, source_language,
+                                          target_language, std::move(callback));
 }
 
 void LiveTranslateController::OnLiveTranslateEnabledChanged() {
diff --git a/components/live_caption/live_translate_controller.h b/components/live_caption/live_translate_controller.h
index 55c50d4..f34968d 100644
--- a/components/live_caption/live_translate_controller.h
+++ b/components/live_caption/live_translate_controller.h
@@ -9,13 +9,10 @@
 #include <string>
 
 #include "base/memory/raw_ptr.h"
-#include "base/memory/weak_ptr.h"
 #include "components/keyed_service/core/keyed_service.h"
-#include "components/soda/constants.h"
+#include "components/live_caption/translation_dispatcher.h"
 #include "media/mojo/mojom/speech_recognition_result.h"
 #include "mojo/public/cpp/bindings/remote.h"
-#include "services/data_decoder/public/cpp/data_decoder.h"
-#include "services/network/public/mojom/url_loader_factory.mojom.h"
 
 class PrefChangeRegistrar;
 class PrefService;
@@ -28,10 +25,6 @@
 class PrefRegistrySyncable;
 }  // namespace user_prefs
 
-namespace network {
-class SimpleURLLoader;
-}  // namespace network
-
 namespace captions {
 
 using OnTranslateEventCallback = base::OnceCallback<void(const std::string&)>;
@@ -59,28 +52,10 @@
                               OnTranslateEventCallback callback);
 
  private:
-  void ResetURLLoaderFactory();
-  void OnURLLoadComplete(OnTranslateEventCallback callback,
-                         std::unique_ptr<std::string> response_body);
-
-  // Called when the data decoder service provides parsed JSON data for a server
-  // response.
-  void OnResponseJsonParsed(OnTranslateEventCallback callback,
-                            data_decoder::DataDecoder::ValueOrError result);
-
   void OnLiveTranslateEnabledChanged();
-
-  raw_ptr<content::BrowserContext> browser_context_;
   raw_ptr<PrefService> profile_prefs_;
-
-  mojo::Remote<network::mojom::URLLoaderFactory> url_loader_factory_;
-  std::unique_ptr<network::SimpleURLLoader> url_loader_;
-
-  data_decoder::DataDecoder data_decoder_;
-
   const std::unique_ptr<PrefChangeRegistrar> pref_change_registrar_;
-
-  base::WeakPtrFactory<LiveTranslateController> weak_factory_{this};
+  const std::unique_ptr<TranslationDispatcher> translation_dispatcher_;
 };
 
 }  // namespace captions
diff --git a/components/live_caption/translation_dispatcher.cc b/components/live_caption/translation_dispatcher.cc
new file mode 100644
index 0000000..2460441
--- /dev/null
+++ b/components/live_caption/translation_dispatcher.cc
@@ -0,0 +1,196 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/live_caption/translation_dispatcher.h"
+
+#include <memory>
+#include <string>
+#include <utility>
+
+#include "base/functional/bind.h"
+#include "base/json/json_reader.h"
+#include "base/metrics/histogram_functions.h"
+#include "base/metrics/metrics_hashes.h"
+#include "base/strings/stringprintf.h"
+#include "base/values.h"
+#include "components/soda/constants.h"
+#include "content/public/browser/browser_context.h"
+#include "content/public/browser/storage_partition.h"
+#include "media/mojo/mojom/speech_recognition_result.h"
+#include "mojo/public/cpp/bindings/remote.h"
+#include "net/http/http_request_headers.h"
+#include "services/network/public/cpp/resource_request.h"
+#include "services/network/public/cpp/simple_url_loader.h"
+#include "services/network/public/mojom/network_context.mojom.h"
+#include "url/gurl.h"
+
+namespace captions {
+
+// Request constants.
+const size_t kMaxMessageSize = 1024 * 1024;  // 1MB
+constexpr char kTranslateBodyRequestTemplate[] =
+    "{"
+    "\"q\":\"%s\","
+    "\"source\":\"%s\","
+    "\"target\":\"%s\","
+    "\"format\":\"text\""
+    "}";
+constexpr char kTranslateUrl[] =
+    "https://translation.googleapis.com/language/translate/v2?key=%s";
+constexpr char kUploadContentType[] = "application/json";
+
+// Response constants.
+constexpr char kDataKey[] = "data";
+constexpr char kTranslationsKey[] = "translations";
+constexpr char kTranslatedTextKey[] = "translatedText";
+
+TranslationDispatcher::TranslationDispatcher(
+    std::string api_key,
+    content::BrowserContext* browser_context)
+    : api_key_(api_key), browser_context_(browser_context) {}
+
+TranslationDispatcher::~TranslationDispatcher() = default;
+
+void TranslationDispatcher::GetTranslation(const std::string& result,
+                                           std::string source_language,
+                                           std::string target_language,
+                                           OnTranslateEventCallback callback) {
+  if (!url_loader_factory_.is_bound() || !url_loader_factory_.is_connected()) {
+    ResetURLLoaderFactory();
+  }
+
+  auto resource_request = std::make_unique<network::ResourceRequest>();
+  resource_request->url =
+      GURL(base::StringPrintf(kTranslateUrl, api_key_.c_str()));
+
+  resource_request->method = net::HttpRequestHeaders::kPostMethod;
+  resource_request->credentials_mode = network::mojom::CredentialsMode::kOmit;
+
+  net::NetworkTrafficAnnotationTag traffic_annotation =
+      net::DefineNetworkTrafficAnnotation("cloud_speech_recognition",
+                                          R"(
+        semantics {
+          sender: "Live Translate"
+          description:
+            "Chrome provides the ability to translate captions generated from "
+            "output audio by using the Google Cloud Translate web service. "
+            "Captions are sent to Google's servers and translated captions are "
+            "returned."
+          trigger:
+            "Triggered in direct response to a user playing a media with audio "
+            "with the Live Translate feature enabled."
+          data: "Captions to be translated by Google's Cloud Translate web "
+            "service."
+          destination: GOOGLE_OWNED_SERVICE
+          internal {
+            contacts {
+              email: "evanliu@google.com"
+            }
+          }
+          user_data {
+            type: OTHER
+          }
+          last_reviewed: "2024-10-11"
+        }
+        policy {
+          cookies_allowed: NO
+          setting:
+            "You can enable or disable this feature via the caption settings "
+            "page."
+          chrome_policy {
+            TranslateEnabled {
+                TranslateEnabled: false
+            }
+          }
+        })");
+  url_loader_ = network::SimpleURLLoader::Create(std::move(resource_request),
+                                                 traffic_annotation);
+  url_loader_->AttachStringForUpload(
+      base::StringPrintf(kTranslateBodyRequestTemplate, result.c_str(),
+                         source_language.c_str(), target_language.c_str()),
+      kUploadContentType);
+  url_loader_->SetAllowHttpErrorResults(true);
+
+  // Unretained is safe because |this| owns |url_loader_|.
+  url_loader_->DownloadToString(
+      url_loader_factory_.get(),
+      base::BindOnce(&TranslationDispatcher::OnURLLoadComplete,
+                     base::Unretained(this), std::move(callback)),
+      kMaxMessageSize);
+
+  base::UmaHistogramSparse("Accessibility.LiveTranslate.TargetLanguage",
+                           base::HashMetricName(target_language));
+  base::UmaHistogramSparse("Accessibility.LiveTranslate.SourceLanguage",
+                           base::HashMetricName(source_language));
+}
+
+void TranslationDispatcher::ResetURLLoaderFactory() {
+  network::mojom::URLLoaderFactoryParamsPtr params =
+      network::mojom::URLLoaderFactoryParams::New();
+  params->process_id = network::mojom::kBrowserProcessId;
+  params->is_trusted = false;
+  params->automatically_assign_isolation_info = true;
+  network::mojom::NetworkContext* network_context =
+      browser_context_->GetDefaultStoragePartition()->GetNetworkContext();
+  network_context->CreateURLLoaderFactory(
+      url_loader_factory_.BindNewPipeAndPassReceiver(), std::move(params));
+}
+
+void TranslationDispatcher::OnURLLoadComplete(
+    OnTranslateEventCallback callback,
+    std::unique_ptr<std::string> response_body) {
+  if (!response_body) {
+    LOG(ERROR) << "Error parsing response: reponse body null";
+    return;
+  }
+
+  // Parse the response in a utility process.
+  data_decoder_.ParseJson(
+      *response_body,
+      base::BindOnce(&TranslationDispatcher::OnResponseJsonParsed,
+                     weak_factory_.GetWeakPtr(), std::move(callback)));
+}
+
+void TranslationDispatcher::OnResponseJsonParsed(
+    OnTranslateEventCallback callback,
+    data_decoder::DataDecoder::ValueOrError result) {
+  std::string error = [&]() -> std::string {
+    if (!result.has_value()) {
+      return "Error parsing response: value null";
+    }
+
+    if (!result.value().is_dict()) {
+      return "Error parsing response: result value is not a dictionary";
+    }
+
+    const base::Value::Dict* data_dict =
+        result.value().GetDict().FindDict(kDataKey);
+    if (!data_dict) {
+      return "Error parsing response: dictionary not found";
+    }
+
+    const base::Value::List* translations_list =
+        data_dict->FindList(kTranslationsKey);
+    if (!translations_list || translations_list->empty()) {
+      return "Error parsing response: translations not found";
+    }
+
+    const base::Value::Dict* translated_text =
+        (*translations_list)[0].GetIfDict();
+    if (!translated_text) {
+      return "Error parsing response: translated text not found";
+    }
+
+    if (const std::string* value =
+            translated_text->FindString(kTranslatedTextKey)) {
+      std::move(callback).Run(*value);
+    }
+    return std::string();
+  }();
+  if (!error.empty()) {
+    LOG(ERROR) << std::move(error);
+  }
+}
+
+}  // namespace captions
diff --git a/components/live_caption/translation_dispatcher.h b/components/live_caption/translation_dispatcher.h
new file mode 100644
index 0000000..26d0d92e
--- /dev/null
+++ b/components/live_caption/translation_dispatcher.h
@@ -0,0 +1,73 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_LIVE_CAPTION_TRANSLATION_DISPATCHER_H_
+#define COMPONENTS_LIVE_CAPTION_TRANSLATION_DISPATCHER_H_
+
+#include <memory>
+#include <string>
+
+#include "base/memory/raw_ptr.h"
+#include "base/memory/weak_ptr.h"
+#include "components/soda/constants.h"
+#include "media/mojo/mojom/speech_recognition_result.h"
+#include "mojo/public/cpp/bindings/remote.h"
+#include "services/data_decoder/public/cpp/data_decoder.h"
+#include "services/network/public/mojom/url_loader_factory.mojom.h"
+
+namespace content {
+class BrowserContext;
+}  // namespace content
+
+namespace network {
+class SimpleURLLoader;
+}  // namespace network
+
+namespace captions {
+
+using OnTranslateEventCallback = base::OnceCallback<void(const std::string&)>;
+
+///////////////////////////////////////////////////////////////////////////////
+// Live Translate Dispatcher
+//
+//  Sends out the request to Cloud Translate API. The owning class provides the
+//  API key which is used to call the service.
+//
+class TranslationDispatcher {
+ public:
+  TranslationDispatcher(std::string api_key,
+                        content::BrowserContext* browser_context);
+  TranslationDispatcher(const TranslationDispatcher&) = delete;
+  TranslationDispatcher& operator=(const TranslationDispatcher&) = delete;
+  ~TranslationDispatcher();
+
+  void GetTranslation(const std::string& result,
+                      std::string source_language,
+                      std::string target_language,
+                      OnTranslateEventCallback callback);
+
+ private:
+  void ResetURLLoaderFactory();
+  void OnURLLoadComplete(OnTranslateEventCallback callback,
+                         std::unique_ptr<std::string> response_body);
+
+  // Called when the data decoder service provides parsed JSON data for a server
+  // response.
+  void OnResponseJsonParsed(OnTranslateEventCallback callback,
+                            data_decoder::DataDecoder::ValueOrError result);
+
+  const std::string api_key_;
+  raw_ptr<content::BrowserContext> browser_context_;
+
+  mojo::Remote<network::mojom::URLLoaderFactory> url_loader_factory_;
+  std::unique_ptr<network::SimpleURLLoader> url_loader_;
+
+  data_decoder::DataDecoder data_decoder_;
+
+  base::WeakPtrFactory<TranslationDispatcher> weak_factory_{this};
+};
+
+}  // namespace captions
+
+#endif  // COMPONENTS_LIVE_CAPTION_TRANSLATION_DISPATCHER_H_
diff --git a/components/neterror/resources/BUILD.gn b/components/neterror/resources/BUILD.gn
index 2a56f44..80c3554 100644
--- a/components/neterror/resources/BUILD.gn
+++ b/components/neterror/resources/BUILD.gn
@@ -11,9 +11,17 @@
     "constants.js",
     "neterror.js",
     "offline.js",
+    "dino_game/background_el.js",
     "dino_game/cloud.js",
     "dino_game/constants.js",
+    "dino_game/distance_meter.js",
     "dino_game/generated_sound_fx.js",
+    "dino_game/game_over_panel.js",
+    "dino_game/horizon_line.js",
+    "dino_game/horizon.js",
+    "dino_game/night_mode.js",
+    "dino_game/obstacle.js",
+    "dino_game/trex.js",
     "dino_game/utils.js",
     "offline-sprite-definitions.js",
   ]
diff --git a/components/neterror/resources/dino_game/background_el.js b/components/neterror/resources/dino_game/background_el.js
new file mode 100644
index 0000000..93721af
--- /dev/null
+++ b/components/neterror/resources/dino_game/background_el.js
@@ -0,0 +1,130 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import {Runner} from '../offline.js';
+
+import {IS_HIDPI} from './constants.js';
+import {getRandomNum} from './utils.js';
+
+
+export class BackgroundEl {
+  /**
+   * Background item.
+   * Similar to cloud, without random y position.
+   * @param {HTMLCanvasElement} canvas Canvas element.
+   * @param {Object} spritePos Position of image in sprite.
+   * @param {number} containerWidth
+   * @param {string} type Element type.
+   */
+  constructor(canvas, spritePos, containerWidth, type) {
+    this.canvas = canvas;
+    this.canvasCtx =
+        /** @type {CanvasRenderingContext2D} */ (this.canvas.getContext('2d'));
+    this.spritePos = spritePos;
+    this.containerWidth = containerWidth;
+    this.xPos = containerWidth;
+    this.yPos = 0;
+    this.remove = false;
+    this.type = type;
+    this.gap =
+        getRandomNum(BackgroundEl.config.MIN_GAP, BackgroundEl.config.MAX_GAP);
+    this.animTimer = 0;
+    this.switchFrames = false;
+
+    this.spriteConfig = {};
+    this.init();
+  }
+
+
+  /**
+   * Initialise the element setting the y position.
+   */
+  init() {
+    this.spriteConfig = Runner.spriteDefinition.BACKGROUND_EL[this.type];
+    if (this.spriteConfig.FIXED) {
+      this.xPos = this.spriteConfig.FIXED_X_POS;
+    }
+    this.yPos = BackgroundEl.config.Y_POS - this.spriteConfig.HEIGHT +
+        this.spriteConfig.OFFSET;
+    this.draw();
+  }
+
+  /**
+   * Draw the element.
+   */
+  draw() {
+    this.canvasCtx.save();
+    let sourceWidth = this.spriteConfig.WIDTH;
+    let sourceHeight = this.spriteConfig.HEIGHT;
+    let sourceX = this.spriteConfig.X_POS;
+    const outputWidth = sourceWidth;
+    const outputHeight = sourceHeight;
+
+    if (IS_HIDPI) {
+      sourceWidth *= 2;
+      sourceHeight *= 2;
+      sourceX *= 2;
+    }
+
+    this.canvasCtx.drawImage(
+        Runner.imageSprite, sourceX, this.spritePos.y, sourceWidth,
+        sourceHeight, this.xPos, this.yPos, outputWidth, outputHeight);
+
+    this.canvasCtx.restore();
+  }
+
+  /**
+   * Update the background element position.
+   * @param {number} speed
+   */
+  update(speed) {
+    if (!this.remove) {
+      if (this.spriteConfig.FIXED) {
+        this.animTimer += speed;
+        if (this.animTimer > BackgroundEl.config.MS_PER_FRAME) {
+          this.animTimer = 0;
+          this.switchFrames = !this.switchFrames;
+        }
+
+        if (this.spriteConfig.FIXED_Y_POS_1 &&
+            this.spriteConfig.FIXED_Y_POS_2) {
+          this.yPos = this.switchFrames ? this.spriteConfig.FIXED_Y_POS_1 :
+                                          this.spriteConfig.FIXED_Y_POS_2;
+        }
+      } else {
+        // Fixed speed, regardless of actual game speed.
+        this.xPos -= BackgroundEl.config.SPEED;
+      }
+      this.draw();
+
+      // Mark as removable if no longer in the canvas.
+      if (!this.isVisible()) {
+        this.remove = true;
+      }
+    }
+  }
+
+  /**
+   * Check if the element is visible on the stage.
+   * @return {boolean}
+   */
+  isVisible() {
+    return this.xPos + this.spriteConfig.WIDTH > 0;
+  }
+}
+
+/**
+ * Background element object config.
+ * Real values assigned when game type changes.
+ * @enum {number}
+ */
+BackgroundEl.config = {
+  MAX_BG_ELS: 0,
+  MAX_GAP: 0,
+  MIN_GAP: 0,
+  POS: 0,
+  SPEED: 0,
+  Y_POS: 0,
+  MS_PER_FRAME: 0,  // only needed when BACKGROUND_EL.FIXED is true
+};
\ No newline at end of file
diff --git a/components/neterror/resources/dino_game/constants.js b/components/neterror/resources/dino_game/constants.js
index 6886370..00d1767f 100644
--- a/components/neterror/resources/dino_game/constants.js
+++ b/components/neterror/resources/dino_game/constants.js
@@ -6,3 +6,14 @@
 export const IS_IOS = /CriOS/.test(window.navigator.userAgent);
 
 export const IS_HIDPI = window.devicePixelRatio > 1;
+
+export const IS_MOBILE = /Android/.test(window.navigator.userAgent) || IS_IOS;
+
+export const IS_RTL = document.querySelector('html').dir == 'rtl';
+
+
+/**
+ * Frames per second.
+ * @const
+ */
+export const FPS = 60;
diff --git a/components/neterror/resources/dino_game/distance_meter.js b/components/neterror/resources/dino_game/distance_meter.js
new file mode 100644
index 0000000..67d91735
--- /dev/null
+++ b/components/neterror/resources/dino_game/distance_meter.js
@@ -0,0 +1,419 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import {Runner} from '../offline.js';
+
+import {IS_HIDPI, IS_RTL} from './constants.js';
+import {getTimeStamp} from './utils.js';
+
+export class DistanceMeter {
+  /**
+   * Handles displaying the distance meter.
+   * @param {!HTMLCanvasElement} canvas
+   * @param {Object} spritePos Image position in sprite.
+   * @param {number} canvasWidth
+   */
+  constructor(canvas, spritePos, canvasWidth) {
+    this.canvas = canvas;
+    this.canvasCtx =
+        /** @type {CanvasRenderingContext2D} */ (canvas.getContext('2d'));
+    this.image = Runner.imageSprite;
+    this.spritePos = spritePos;
+    this.x = 0;
+    this.y = 5;
+
+    this.currentDistance = 0;
+    this.maxScore = 0;
+    this.highScore = '0';
+    this.container = null;
+
+    this.digits = [];
+    this.achievement = false;
+    this.defaultString = '';
+    this.flashTimer = 0;
+    this.flashIterations = 0;
+    this.invertTrigger = false;
+    this.flashingRafId = null;
+    this.highScoreBounds = {};
+    this.highScoreFlashing = false;
+
+    this.config = DistanceMeter.config;
+    this.maxScoreUnits = this.config.MAX_DISTANCE_UNITS;
+    this.canvasWidth = canvasWidth;
+    this.init(canvasWidth);
+  }
+
+
+  /**
+   * Initialise the distance meter to '00000'.
+   * @param {number} width Canvas width in px.
+   */
+  init(width) {
+    let maxDistanceStr = '';
+
+    this.calcXPos(width);
+    this.maxScore = this.maxScoreUnits;
+    for (let i = 0; i < this.maxScoreUnits; i++) {
+      this.draw(i, 0);
+      this.defaultString += '0';
+      maxDistanceStr += '9';
+    }
+
+    this.maxScore = parseInt(maxDistanceStr, 10);
+  }
+
+  /**
+   * Calculate the xPos in the canvas.
+   * @param {number} canvasWidth
+   */
+  calcXPos(canvasWidth) {
+    this.x = canvasWidth -
+        (DistanceMeter.dimensions.DEST_WIDTH * (this.maxScoreUnits + 1));
+  }
+
+  /**
+   * Draw a digit to canvas.
+   * @param {number} digitPos Position of the digit.
+   * @param {number} value Digit value 0-9.
+   * @param {boolean=} opt_highScore Whether drawing the high score.
+   */
+  draw(digitPos, value, opt_highScore) {
+    let sourceWidth = DistanceMeter.dimensions.WIDTH;
+    let sourceHeight = DistanceMeter.dimensions.HEIGHT;
+    let sourceX = DistanceMeter.dimensions.WIDTH * value;
+    let sourceY = 0;
+
+    const targetX = digitPos * DistanceMeter.dimensions.DEST_WIDTH;
+    const targetY = this.y;
+    const targetWidth = DistanceMeter.dimensions.WIDTH;
+    const targetHeight = DistanceMeter.dimensions.HEIGHT;
+
+    // For high DPI we 2x source values.
+    if (IS_HIDPI) {
+      sourceWidth *= 2;
+      sourceHeight *= 2;
+      sourceX *= 2;
+    }
+
+    sourceX += this.spritePos.x;
+    sourceY += this.spritePos.y;
+
+    this.canvasCtx.save();
+
+    if (IS_RTL) {
+      if (opt_highScore) {
+        this.canvasCtx.translate(
+            this.canvasWidth -
+                (DistanceMeter.dimensions.WIDTH * (this.maxScoreUnits + 3)),
+            this.y);
+      } else {
+        this.canvasCtx.translate(
+            this.canvasWidth - DistanceMeter.dimensions.WIDTH, this.y);
+      }
+      this.canvasCtx.scale(-1, 1);
+    } else {
+      const highScoreX =
+          this.x - (this.maxScoreUnits * 2) * DistanceMeter.dimensions.WIDTH;
+      if (opt_highScore) {
+        this.canvasCtx.translate(highScoreX, this.y);
+      } else {
+        this.canvasCtx.translate(this.x, this.y);
+      }
+    }
+
+    this.canvasCtx.drawImage(
+        this.image,
+        sourceX,
+        sourceY,
+        sourceWidth,
+        sourceHeight,
+        targetX,
+        targetY,
+        targetWidth,
+        targetHeight,
+    );
+
+    this.canvasCtx.restore();
+  }
+
+  /**
+   * Covert pixel distance to a 'real' distance.
+   * @param {number} distance Pixel distance ran.
+   * @return {number} The 'real' distance ran.
+   */
+  getActualDistance(distance) {
+    return distance ? Math.round(distance * this.config.COEFFICIENT) : 0;
+  }
+
+  /**
+   * Update the distance meter.
+   * @param {number} distance
+   * @param {number} deltaTime
+   * @return {boolean} Whether the achievement sound fx should be played.
+   */
+  update(deltaTime, distance) {
+    let paint = true;
+    let playSound = false;
+
+    if (!this.achievement) {
+      distance = this.getActualDistance(distance);
+      // Score has gone beyond the initial digit count.
+      if (distance > this.maxScore &&
+          this.maxScoreUnits == this.config.MAX_DISTANCE_UNITS) {
+        this.maxScoreUnits++;
+        this.maxScore = parseInt(this.maxScore + '9', 10);
+      } else {
+        this.distance = 0;
+      }
+
+      if (distance > 0) {
+        // Achievement unlocked.
+        if (distance % this.config.ACHIEVEMENT_DISTANCE === 0) {
+          // Flash score and play sound.
+          this.achievement = true;
+          this.flashTimer = 0;
+          playSound = true;
+        }
+
+        // Create a string representation of the distance with leading 0.
+        const distanceStr =
+            (this.defaultString + distance).substr(-this.maxScoreUnits);
+        this.digits = distanceStr.split('');
+      } else {
+        this.digits = this.defaultString.split('');
+      }
+    } else {
+      // Control flashing of the score on reaching achievement.
+      if (this.flashIterations <= this.config.FLASH_ITERATIONS) {
+        this.flashTimer += deltaTime;
+
+        if (this.flashTimer < this.config.FLASH_DURATION) {
+          paint = false;
+        } else if (this.flashTimer > this.config.FLASH_DURATION * 2) {
+          this.flashTimer = 0;
+          this.flashIterations++;
+        }
+      } else {
+        this.achievement = false;
+        this.flashIterations = 0;
+        this.flashTimer = 0;
+      }
+    }
+
+    // Draw the digits if not flashing.
+    if (paint) {
+      for (let i = this.digits.length - 1; i >= 0; i--) {
+        this.draw(i, parseInt(this.digits[i], 10));
+      }
+    }
+
+    this.drawHighScore();
+    return playSound;
+  }
+
+  /**
+   * Draw the high score.
+   */
+  drawHighScore() {
+    if (parseInt(this.highScore, 10) > 0) {
+      this.canvasCtx.save();
+      this.canvasCtx.globalAlpha = .8;
+      for (let i = this.highScore.length - 1; i >= 0; i--) {
+        this.draw(i, parseInt(this.highScore[i], 10), true);
+      }
+      this.canvasCtx.restore();
+    }
+  }
+
+  /**
+   * Set the highscore as a array string.
+   * Position of char in the sprite: H - 10, I - 11.
+   * @param {number} distance Distance ran in pixels.
+   */
+  setHighScore(distance) {
+    distance = this.getActualDistance(distance);
+    const highScoreStr =
+        (this.defaultString + distance).substr(-this.maxScoreUnits);
+
+    this.highScore = ['10', '11', ''].concat(highScoreStr.split(''));
+  }
+
+
+  /**
+   * Whether a clicked is in the high score area.
+   * @param {Event} e Event object.
+   * @return {boolean} Whether the click was in the high score bounds.
+   */
+  hasClickedOnHighScore(e) {
+    let x = 0;
+    let y = 0;
+
+    if (e.touches) {
+      // Bounds for touch differ from pointer.
+      const canvasBounds = this.canvas.getBoundingClientRect();
+      x = e.touches[0].clientX - canvasBounds.left;
+      y = e.touches[0].clientY - canvasBounds.top;
+    } else {
+      x = e.offsetX;
+      y = e.offsetY;
+    }
+
+    this.highScoreBounds = this.getHighScoreBounds();
+    return x >= this.highScoreBounds.x &&
+        x <= this.highScoreBounds.x + this.highScoreBounds.width &&
+        y >= this.highScoreBounds.y &&
+        y <= this.highScoreBounds.y + this.highScoreBounds.height;
+  }
+
+  /**
+   * Get the bounding box for the high score.
+   * @return {Object} Object with x, y, width and height properties.
+   */
+  getHighScoreBounds() {
+    return {
+      x: (this.x - (this.maxScoreUnits * 2) * DistanceMeter.dimensions.WIDTH) -
+          DistanceMeter.config.HIGH_SCORE_HIT_AREA_PADDING,
+      y: this.y,
+      width: DistanceMeter.dimensions.WIDTH * (this.highScore.length + 1) +
+          DistanceMeter.config.HIGH_SCORE_HIT_AREA_PADDING,
+      height: DistanceMeter.dimensions.HEIGHT +
+          (DistanceMeter.config.HIGH_SCORE_HIT_AREA_PADDING * 2),
+    };
+  }
+
+  /**
+   * Animate flashing the high score to indicate ready for resetting.
+   * The flashing stops following this.config.FLASH_ITERATIONS x 2 flashes.
+   */
+  flashHighScore() {
+    const now = getTimeStamp();
+    const deltaTime = now - (this.frameTimeStamp || now);
+    let paint = true;
+    this.frameTimeStamp = now;
+
+    // Reached the max number of flashes.
+    if (this.flashIterations > this.config.FLASH_ITERATIONS * 2) {
+      this.cancelHighScoreFlashing();
+      return;
+    }
+
+    this.flashTimer += deltaTime;
+
+    if (this.flashTimer < this.config.FLASH_DURATION) {
+      paint = false;
+    } else if (this.flashTimer > this.config.FLASH_DURATION * 2) {
+      this.flashTimer = 0;
+      this.flashIterations++;
+    }
+
+    if (paint) {
+      this.drawHighScore();
+    } else {
+      this.clearHighScoreBounds();
+    }
+    // Frame update.
+    this.flashingRafId = requestAnimationFrame(this.flashHighScore.bind(this));
+  }
+
+  /**
+   * Draw empty rectangle over high score.
+   */
+  clearHighScoreBounds() {
+    this.canvasCtx.save();
+    this.canvasCtx.fillStyle = '#fff';
+    this.canvasCtx.rect(
+        this.highScoreBounds.x, this.highScoreBounds.y,
+        this.highScoreBounds.width, this.highScoreBounds.height);
+    this.canvasCtx.fill();
+    this.canvasCtx.restore();
+  }
+
+  /**
+   * Starts the flashing of the high score.
+   */
+  startHighScoreFlashing() {
+    this.highScoreFlashing = true;
+    this.flashHighScore();
+  }
+
+  /**
+   * Whether high score is flashing.
+   * @return {boolean}
+   */
+  isHighScoreFlashing() {
+    return this.highScoreFlashing;
+  }
+
+  /**
+   * Stop flashing the high score.
+   */
+  cancelHighScoreFlashing() {
+    if (this.flashingRafId) {
+      cancelAnimationFrame(this.flashingRafId);
+    }
+    this.flashIterations = 0;
+    this.flashTimer = 0;
+    this.highScoreFlashing = false;
+    this.clearHighScoreBounds();
+    this.drawHighScore();
+  }
+
+  /**
+   * Clear the high score.
+   */
+  resetHighScore() {
+    this.setHighScore(0);
+    this.cancelHighScoreFlashing();
+  }
+
+  /**
+   * Reset the distance meter back to '00000'.
+   */
+  reset() {
+    this.update(0, 0);
+    this.achievement = false;
+  }
+}
+
+/**
+ * @enum {number}
+ */
+DistanceMeter.dimensions = {
+  WIDTH: 10,
+  HEIGHT: 13,
+  DEST_WIDTH: 11,
+};
+
+
+/**
+ * Y positioning of the digits in the sprite sheet.
+ * X position is always 0.
+ * @type {Array<number>}
+ */
+DistanceMeter.yPos = [0, 13, 27, 40, 53, 67, 80, 93, 107, 120];
+
+
+/**
+ * Distance meter config.
+ * @enum {number}
+ */
+DistanceMeter.config = {
+  // Number of digits.
+  MAX_DISTANCE_UNITS: 5,
+
+  // Distance that causes achievement animation.
+  ACHIEVEMENT_DISTANCE: 100,
+
+  // Used for conversion from pixel distance to a scaled unit.
+  COEFFICIENT: 0.025,
+
+  // Flash duration in milliseconds.
+  FLASH_DURATION: 1000 / 4,
+
+  // Flash iterations for achievement animation.
+  FLASH_ITERATIONS: 3,
+
+  // Padding around the high score hit area.
+  HIGH_SCORE_HIT_AREA_PADDING: 4,
+};
\ No newline at end of file
diff --git a/components/neterror/resources/dino_game/game_over_panel.js b/components/neterror/resources/dino_game/game_over_panel.js
new file mode 100644
index 0000000..c8bd0086
--- /dev/null
+++ b/components/neterror/resources/dino_game/game_over_panel.js
@@ -0,0 +1,294 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import {spriteDefinitionByType} from '../offline-sprite-definitions.js';
+import {Runner} from '../offline.js';
+
+import {IS_HIDPI, IS_RTL} from './constants.js';
+import {Trex} from './trex.js';
+import {getTimeStamp} from './utils.js';
+
+export class GameOverPanel {
+  /**
+   * Game over panel.
+   * @param {!HTMLCanvasElement} canvas
+   * @param {Object} textImgPos
+   * @param {Object} restartImgPos
+   * @param {!Object} dimensions Canvas dimensions.
+   * @param {Object=} opt_altGameEndImgPos
+   * @param {boolean=} opt_altGameActive
+   */
+  constructor(
+      canvas, textImgPos, restartImgPos, dimensions, opt_altGameEndImgPos,
+      opt_altGameActive) {
+    this.canvas = canvas;
+    this.canvasCtx =
+        /** @type {CanvasRenderingContext2D} */ (canvas.getContext('2d'));
+    this.canvasDimensions = dimensions;
+    this.textImgPos = textImgPos;
+    this.restartImgPos = restartImgPos;
+    this.altGameEndImgPos = opt_altGameEndImgPos;
+    this.altGameModeActive = opt_altGameActive;
+
+    // Retry animation.
+    this.frameTimeStamp = 0;
+    this.animTimer = 0;
+    this.currentFrame = 0;
+
+    this.gameOverRafId = null;
+
+    this.flashTimer = 0;
+    this.flashCounter = 0;
+    this.originalText = true;
+  }
+
+
+  /**
+   * Update the panel dimensions.
+   * @param {number} width New canvas width.
+   * @param {number} opt_height Optional new canvas height.
+   */
+  updateDimensions(width, opt_height) {
+    this.canvasDimensions.WIDTH = width;
+    if (opt_height) {
+      this.canvasDimensions.HEIGHT = opt_height;
+    }
+    this.currentFrame = GameOverPanel.animConfig.frames.length - 1;
+  }
+
+  drawGameOverText(dimensions, opt_useAltText) {
+    const centerX = this.canvasDimensions.WIDTH / 2;
+    let textSourceX = dimensions.TEXT_X;
+    let textSourceY = dimensions.TEXT_Y;
+    let textSourceWidth = dimensions.TEXT_WIDTH;
+    let textSourceHeight = dimensions.TEXT_HEIGHT;
+
+    const textTargetX = Math.round(centerX - (dimensions.TEXT_WIDTH / 2));
+    const textTargetY = Math.round((this.canvasDimensions.HEIGHT - 25) / 3);
+    const textTargetWidth = dimensions.TEXT_WIDTH;
+    const textTargetHeight = dimensions.TEXT_HEIGHT;
+
+    if (IS_HIDPI) {
+      textSourceY *= 2;
+      textSourceX *= 2;
+      textSourceWidth *= 2;
+      textSourceHeight *= 2;
+    }
+
+    if (!opt_useAltText) {
+      textSourceX += this.textImgPos.x;
+      textSourceY += this.textImgPos.y;
+    }
+
+    const spriteSource =
+        opt_useAltText ? Runner.altCommonImageSprite : Runner.origImageSprite;
+
+    this.canvasCtx.save();
+
+    if (IS_RTL) {
+      this.canvasCtx.translate(this.canvasDimensions.WIDTH, 0);
+      this.canvasCtx.scale(-1, 1);
+    }
+
+    // Game over text from sprite.
+    this.canvasCtx.drawImage(
+        spriteSource, textSourceX, textSourceY, textSourceWidth,
+        textSourceHeight, textTargetX, textTargetY, textTargetWidth,
+        textTargetHeight);
+
+    this.canvasCtx.restore();
+  }
+
+  /**
+   * Draw additional adornments for alternative game types.
+   */
+  drawAltGameElements(tRex) {
+    // Additional adornments.
+    if (this.altGameModeActive && Runner.spriteDefinition.ALT_GAME_END_CONFIG) {
+      const altGameEndConfig = Runner.spriteDefinition.ALT_GAME_END_CONFIG;
+
+      let altGameEndSourceWidth = altGameEndConfig.WIDTH;
+      let altGameEndSourceHeight = altGameEndConfig.HEIGHT;
+      const altGameEndTargetX = tRex.xPos + altGameEndConfig.X_OFFSET;
+      const altGameEndTargetY = tRex.yPos + altGameEndConfig.Y_OFFSET;
+
+      if (IS_HIDPI) {
+        altGameEndSourceWidth *= 2;
+        altGameEndSourceHeight *= 2;
+      }
+
+      this.canvasCtx.drawImage(
+          Runner.altCommonImageSprite, this.altGameEndImgPos.x,
+          this.altGameEndImgPos.y, altGameEndSourceWidth,
+          altGameEndSourceHeight, altGameEndTargetX, altGameEndTargetY,
+          altGameEndConfig.WIDTH, altGameEndConfig.HEIGHT);
+    }
+  }
+
+  /**
+   * Draw restart button.
+   */
+  drawRestartButton() {
+    const dimensions = GameOverPanel.dimensions;
+    let framePosX = GameOverPanel.animConfig.frames[this.currentFrame];
+    let restartSourceWidth = dimensions.RESTART_WIDTH;
+    let restartSourceHeight = dimensions.RESTART_HEIGHT;
+    const restartTargetX =
+        (this.canvasDimensions.WIDTH / 2) - (dimensions.RESTART_WIDTH / 2);
+    const restartTargetY = this.canvasDimensions.HEIGHT / 2;
+
+    if (IS_HIDPI) {
+      restartSourceWidth *= 2;
+      restartSourceHeight *= 2;
+      framePosX *= 2;
+    }
+
+    this.canvasCtx.save();
+
+    if (IS_RTL) {
+      this.canvasCtx.translate(this.canvasDimensions.WIDTH, 0);
+      this.canvasCtx.scale(-1, 1);
+    }
+
+    this.canvasCtx.drawImage(
+        Runner.origImageSprite, this.restartImgPos.x + framePosX,
+        this.restartImgPos.y, restartSourceWidth, restartSourceHeight,
+        restartTargetX, restartTargetY, dimensions.RESTART_WIDTH,
+        dimensions.RESTART_HEIGHT);
+    this.canvasCtx.restore();
+  }
+
+
+  /**
+   * Draw the panel.
+   * @param {boolean} opt_altGameModeActive
+   * @param {!Trex} opt_tRex
+   */
+  draw(opt_altGameModeActive, opt_tRex) {
+    if (opt_altGameModeActive) {
+      this.altGameModeActive = opt_altGameModeActive;
+    }
+
+    this.drawGameOverText(GameOverPanel.dimensions, false);
+    this.drawRestartButton();
+    this.drawAltGameElements(opt_tRex);
+    this.update();
+  }
+
+  /**
+   * Update animation frames.
+   */
+  update() {
+    const now = getTimeStamp();
+    const deltaTime = now - (this.frameTimeStamp || now);
+
+    this.frameTimeStamp = now;
+    this.animTimer += deltaTime;
+    this.flashTimer += deltaTime;
+
+    // Restart Button
+    if (this.currentFrame == 0 &&
+        this.animTimer > GameOverPanel.LOGO_PAUSE_DURATION) {
+      this.animTimer = 0;
+      this.currentFrame++;
+      this.drawRestartButton();
+    } else if (
+        this.currentFrame > 0 &&
+        this.currentFrame < GameOverPanel.animConfig.frames.length) {
+      if (this.animTimer >= GameOverPanel.animConfig.msPerFrame) {
+        this.currentFrame++;
+        this.drawRestartButton();
+      }
+    } else if (
+        !this.altGameModeActive &&
+        this.currentFrame == GameOverPanel.animConfig.frames.length) {
+      this.reset();
+      return;
+    }
+
+    // Game over text
+    if (this.altGameModeActive &&
+        spriteDefinitionByType.original.ALT_GAME_OVER_TEXT_CONFIG) {
+      const altTextConfig =
+          spriteDefinitionByType.original.ALT_GAME_OVER_TEXT_CONFIG;
+
+      if (altTextConfig.FLASHING) {
+        if (this.flashCounter < GameOverPanel.FLASH_ITERATIONS &&
+            this.flashTimer > altTextConfig.FLASH_DURATION) {
+          this.flashTimer = 0;
+          this.originalText = !this.originalText;
+
+          this.clearGameOverTextBounds();
+          if (this.originalText) {
+            this.drawGameOverText(GameOverPanel.dimensions, false);
+            this.flashCounter++;
+          } else {
+            this.drawGameOverText(altTextConfig, true);
+          }
+        } else if (this.flashCounter >= GameOverPanel.FLASH_ITERATIONS) {
+          this.reset();
+          return;
+        }
+      } else {
+        this.clearGameOverTextBounds(altTextConfig);
+        this.drawGameOverText(altTextConfig, true);
+      }
+    }
+
+    this.gameOverRafId = requestAnimationFrame(this.update.bind(this));
+  }
+
+  /**
+   * Clear game over text.
+   * @param {Object} dimensions Game over text config.
+   */
+  clearGameOverTextBounds(dimensions) {
+    this.canvasCtx.save();
+
+    this.canvasCtx.clearRect(
+        Math.round(
+            this.canvasDimensions.WIDTH / 2 - (dimensions.TEXT_WIDTH / 2)),
+        Math.round((this.canvasDimensions.HEIGHT - 25) / 3),
+        dimensions.TEXT_WIDTH, dimensions.TEXT_HEIGHT + 4);
+    this.canvasCtx.restore();
+  }
+
+  reset() {
+    if (this.gameOverRafId) {
+      cancelAnimationFrame(this.gameOverRafId);
+      this.gameOverRafId = null;
+    }
+    this.animTimer = 0;
+    this.frameTimeStamp = 0;
+    this.currentFrame = 0;
+    this.flashTimer = 0;
+    this.flashCounter = 0;
+    this.originalText = true;
+  }
+}
+
+GameOverPanel.RESTART_ANIM_DURATION = 875;
+GameOverPanel.LOGO_PAUSE_DURATION = 875;
+GameOverPanel.FLASH_ITERATIONS = 5;
+
+/**
+ * Animation frames spec.
+ */
+GameOverPanel.animConfig = {
+  frames: [0, 36, 72, 108, 144, 180, 216, 252],
+  msPerFrame: GameOverPanel.RESTART_ANIM_DURATION / 8,
+};
+
+/**
+ * Dimensions used in the panel.
+ * @enum {number}
+ */
+GameOverPanel.dimensions = {
+  TEXT_X: 0,
+  TEXT_Y: 13,
+  TEXT_WIDTH: 191,
+  TEXT_HEIGHT: 11,
+  RESTART_WIDTH: 36,
+  RESTART_HEIGHT: 32,
+};
\ No newline at end of file
diff --git a/components/neterror/resources/dino_game/horizon.js b/components/neterror/resources/dino_game/horizon.js
new file mode 100644
index 0000000..10141b12
--- /dev/null
+++ b/components/neterror/resources/dino_game/horizon.js
@@ -0,0 +1,363 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import {spriteDefinitionByType} from '../offline-sprite-definitions.js';
+import {Runner} from '../offline.js';
+
+import {BackgroundEl} from './background_el.js';
+import {Cloud} from './cloud.js';
+import {HorizonLine} from './horizon_line.js';
+import {NightMode} from './night_mode.js';
+import {Obstacle} from './obstacle.js';
+import {getRandomNum} from './utils.js';
+
+/**
+ * Horizon background class.
+ */
+export class Horizon {
+  /**
+   * @param {HTMLCanvasElement} canvas
+   * @param {Object} spritePos Sprite positioning.
+   * @param {Object} dimensions Canvas dimensions.
+   * @param {number} gapCoefficient
+   */
+  constructor(canvas, spritePos, dimensions, gapCoefficient) {
+    this.canvas = canvas;
+    this.canvasCtx =
+        /** @type {CanvasRenderingContext2D} */ (this.canvas.getContext('2d'));
+    this.config = Horizon.config;
+    this.dimensions = dimensions;
+    this.gapCoefficient = gapCoefficient;
+    this.obstacles = [];
+    this.obstacleHistory = [];
+    this.horizonOffsets = [0, 0];
+    this.cloudFrequency = this.config.CLOUD_FREQUENCY;
+    this.spritePos = spritePos;
+    this.nightMode = null;
+    this.altGameModeActive = false;
+
+    // Cloud
+    this.clouds = [];
+    this.cloudSpeed = this.config.BG_CLOUD_SPEED;
+
+    // Background elements
+    this.backgroundEls = [];
+    this.lastEl = null;
+    this.backgroundSpeed = this.config.BG_CLOUD_SPEED;
+
+    // Horizon
+    this.horizonLine = null;
+    this.horizonLines = [];
+    this.init();
+  }
+
+
+
+  /**
+   * Initialise the horizon. Just add the line and a cloud. No obstacles.
+   */
+  init() {
+    Obstacle.types = spriteDefinitionByType.original.OBSTACLES;
+    this.addCloud();
+    // Multiple Horizon lines
+    for (let i = 0; i < Runner.spriteDefinition.LINES.length; i++) {
+      this.horizonLines.push(
+          new HorizonLine(this.canvas, Runner.spriteDefinition.LINES[i]));
+    }
+
+    this.nightMode =
+        new NightMode(this.canvas, this.spritePos.MOON, this.dimensions.WIDTH);
+  }
+
+  /**
+   * Update obstacle definitions based on the speed of the game.
+   */
+  adjustObstacleSpeed() {
+    for (let i = 0; i < Obstacle.types.length; i++) {
+      if (Runner.slowDown) {
+        Obstacle.types[i].multipleSpeed = Obstacle.types[i].multipleSpeed / 2;
+        Obstacle.types[i].minGap *= 1.5;
+        Obstacle.types[i].minSpeed = Obstacle.types[i].minSpeed / 2;
+
+        // Convert variable y position obstacles to fixed.
+        if (typeof (Obstacle.types[i].yPos) == 'object') {
+          Obstacle.types[i].yPos = Obstacle.types[i].yPos[0];
+          Obstacle.types[i].yPosMobile = Obstacle.types[i].yPos[0];
+        }
+      }
+    }
+  }
+
+  /**
+   * Update sprites to correspond to change in sprite sheet.
+   * @param {number} spritePos
+   */
+  enableAltGameMode(spritePos) {
+    // Clear existing horizon objects.
+    this.clouds = [];
+    this.backgroundEls = [];
+
+    this.altGameModeActive = true;
+    this.spritePos = spritePos;
+
+    Obstacle.types = Runner.spriteDefinition.OBSTACLES;
+    this.adjustObstacleSpeed();
+
+    Obstacle.MAX_GAP_COEFFICIENT = Runner.spriteDefinition.MAX_GAP_COEFFICIENT;
+    Obstacle.MAX_OBSTACLE_LENGTH = Runner.spriteDefinition.MAX_OBSTACLE_LENGTH;
+
+    BackgroundEl.config = Runner.spriteDefinition.BACKGROUND_EL_CONFIG;
+
+    this.horizonLines = [];
+    for (let i = 0; i < Runner.spriteDefinition.LINES.length; i++) {
+      this.horizonLines.push(
+          new HorizonLine(this.canvas, Runner.spriteDefinition.LINES[i]));
+    }
+    this.reset();
+  }
+
+  /**
+   * @param {number} deltaTime
+   * @param {number} currentSpeed
+   * @param {boolean} updateObstacles Used as an override to prevent
+   *     the obstacles from being updated / added. This happens in the
+   *     ease in section.
+   * @param {boolean} showNightMode Night mode activated.
+   */
+  update(deltaTime, currentSpeed, updateObstacles, showNightMode) {
+    this.runningTime += deltaTime;
+
+    if (this.altGameModeActive) {
+      this.updateBackgroundEls(deltaTime, currentSpeed);
+    }
+
+    for (let i = 0; i < this.horizonLines.length; i++) {
+      this.horizonLines[i].update(deltaTime, currentSpeed);
+    }
+
+    if (!this.altGameModeActive || Runner.spriteDefinition.HAS_CLOUDS) {
+      this.nightMode.update(showNightMode);
+      this.updateClouds(deltaTime, currentSpeed);
+    }
+
+    if (updateObstacles) {
+      this.updateObstacles(deltaTime, currentSpeed);
+    }
+  }
+
+  /**
+   * Update background element positions. Also handles creating new elements.
+   * @param {number} elSpeed
+   * @param {Array<Object>} bgElArray
+   * @param {number} maxBgEl
+   * @param {Function} bgElAddFunction
+   * @param {number} frequency
+   */
+  updateBackgroundEl(elSpeed, bgElArray, maxBgEl, bgElAddFunction, frequency) {
+    const numElements = bgElArray.length;
+
+    if (numElements) {
+      for (let i = numElements - 1; i >= 0; i--) {
+        bgElArray[i].update(elSpeed);
+      }
+
+      const lastEl = bgElArray[numElements - 1];
+
+      // Check for adding a new element.
+      if (numElements < maxBgEl &&
+          (this.dimensions.WIDTH - lastEl.xPos) > lastEl.gap &&
+          frequency > Math.random()) {
+        bgElAddFunction();
+      }
+    } else {
+      bgElAddFunction();
+    }
+  }
+
+  /**
+   * Update the cloud positions.
+   * @param {number} deltaTime
+   * @param {number} speed
+   */
+  updateClouds(deltaTime, speed) {
+    const elSpeed = this.cloudSpeed / 1000 * deltaTime * speed;
+    this.updateBackgroundEl(
+        elSpeed, this.clouds, this.config.MAX_CLOUDS, this.addCloud.bind(this),
+        this.cloudFrequency);
+
+    // Remove expired elements.
+    this.clouds = this.clouds.filter((obj) => !obj.remove);
+  }
+
+  /**
+   * Update the background element positions.
+   * @param {number} deltaTime
+   * @param {number} speed
+   */
+  updateBackgroundEls(deltaTime, speed) {
+    this.updateBackgroundEl(
+        deltaTime, this.backgroundEls, BackgroundEl.config.MAX_BG_ELS,
+        this.addBackgroundEl.bind(this), this.cloudFrequency);
+
+    // Remove expired elements.
+    this.backgroundEls = this.backgroundEls.filter((obj) => !obj.remove);
+  }
+
+  /**
+   * Update the obstacle positions.
+   * @param {number} deltaTime
+   * @param {number} currentSpeed
+   */
+  updateObstacles(deltaTime, currentSpeed) {
+    const updatedObstacles = this.obstacles.slice(0);
+
+    for (let i = 0; i < this.obstacles.length; i++) {
+      const obstacle = this.obstacles[i];
+      obstacle.update(deltaTime, currentSpeed);
+
+      // Clean up existing obstacles.
+      if (obstacle.remove) {
+        updatedObstacles.shift();
+      }
+    }
+    this.obstacles = updatedObstacles;
+
+    if (this.obstacles.length > 0) {
+      const lastObstacle = this.obstacles[this.obstacles.length - 1];
+
+      if (lastObstacle && !lastObstacle.followingObstacleCreated &&
+          lastObstacle.isVisible() &&
+          (lastObstacle.xPos + lastObstacle.width + lastObstacle.gap) <
+              this.dimensions.WIDTH) {
+        this.addNewObstacle(currentSpeed);
+        lastObstacle.followingObstacleCreated = true;
+      }
+    } else {
+      // Create new obstacles.
+      this.addNewObstacle(currentSpeed);
+    }
+  }
+
+  removeFirstObstacle() {
+    this.obstacles.shift();
+  }
+
+  /**
+   * Add a new obstacle.
+   * @param {number} currentSpeed
+   */
+  addNewObstacle(currentSpeed) {
+    const obstacleCount =
+        Obstacle.types[Obstacle.types.length - 1].type != 'COLLECTABLE' ||
+            (Runner.isAltGameModeEnabled() && !this.altGameModeActive ||
+             this.altGameModeActive) ?
+        Obstacle.types.length - 1 :
+        Obstacle.types.length - 2;
+    const obstacleTypeIndex =
+        obstacleCount > 0 ? getRandomNum(0, obstacleCount) : 0;
+    const obstacleType = Obstacle.types[obstacleTypeIndex];
+
+    // Check for multiples of the same type of obstacle.
+    // Also check obstacle is available at current speed.
+    if ((obstacleCount > 0 && this.duplicateObstacleCheck(obstacleType.type)) ||
+        currentSpeed < obstacleType.minSpeed) {
+      this.addNewObstacle(currentSpeed);
+    } else {
+      const obstacleSpritePos = this.spritePos[obstacleType.type];
+
+      this.obstacles.push(new Obstacle(
+          this.canvasCtx, obstacleType, obstacleSpritePos, this.dimensions,
+          this.gapCoefficient, currentSpeed, obstacleType.width,
+          this.altGameModeActive));
+
+      this.obstacleHistory.unshift(obstacleType.type);
+
+      if (this.obstacleHistory.length > 1) {
+        this.obstacleHistory.splice(Runner.config.MAX_OBSTACLE_DUPLICATION);
+      }
+    }
+  }
+
+  /**
+   * Returns whether the previous two obstacles are the same as the next one.
+   * Maximum duplication is set in config value MAX_OBSTACLE_DUPLICATION.
+   * @return {boolean}
+   */
+  duplicateObstacleCheck(nextObstacleType) {
+    let duplicateCount = 0;
+
+    for (let i = 0; i < this.obstacleHistory.length; i++) {
+      duplicateCount =
+          this.obstacleHistory[i] === nextObstacleType ? duplicateCount + 1 : 0;
+    }
+    return duplicateCount >= Runner.config.MAX_OBSTACLE_DUPLICATION;
+  }
+
+  /**
+   * Reset the horizon layer.
+   * Remove existing obstacles and reposition the horizon line.
+   */
+  reset() {
+    this.obstacles = [];
+    for (let l = 0; l < this.horizonLines.length; l++) {
+      this.horizonLines[l].reset();
+    }
+
+    this.nightMode.reset();
+  }
+
+  /**
+   * Update the canvas width and scaling.
+   * @param {number} width Canvas width.
+   * @param {number} height Canvas height.
+   */
+  resize(width, height) {
+    this.canvas.width = width;
+    this.canvas.height = height;
+  }
+
+  /**
+   * Add a new cloud to the horizon.
+   */
+  addCloud() {
+    this.clouds.push(
+        new Cloud(this.canvas, this.spritePos.CLOUD, this.dimensions.WIDTH));
+  }
+
+  /**
+   * Add a random background element to the horizon.
+   */
+  addBackgroundEl() {
+    const backgroundElTypes =
+        Object.keys(Runner.spriteDefinition.BACKGROUND_EL);
+
+    if (backgroundElTypes.length > 0) {
+      let index = getRandomNum(0, backgroundElTypes.length - 1);
+      let type = backgroundElTypes[index];
+
+      // Add variation if available.
+      while (type == this.lastEl && backgroundElTypes.length > 1) {
+        index = getRandomNum(0, backgroundElTypes.length - 1);
+        type = backgroundElTypes[index];
+      }
+
+      this.lastEl = type;
+      this.backgroundEls.push(new BackgroundEl(
+          this.canvas, this.spritePos.BACKGROUND_EL, this.dimensions.WIDTH,
+          type));
+    }
+  }
+}
+
+/**
+ * Horizon config.
+ * @enum {number}
+ */
+Horizon.config = {
+  BG_CLOUD_SPEED: 0.2,
+  BUMPY_THRESHOLD: .3,
+  CLOUD_FREQUENCY: .5,
+  HORIZON_HEIGHT: 16,
+  MAX_CLOUDS: 6,
+};
\ No newline at end of file
diff --git a/components/neterror/resources/dino_game/horizon_line.js b/components/neterror/resources/dino_game/horizon_line.js
new file mode 100644
index 0000000..cf521fc
--- /dev/null
+++ b/components/neterror/resources/dino_game/horizon_line.js
@@ -0,0 +1,128 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import {Runner} from '../offline.js';
+
+import {FPS, IS_HIDPI} from './constants.js';
+
+export class HorizonLine {
+  /**
+   * Horizon Line.
+   * Consists of two connecting lines. Randomly assigns a flat / bumpy horizon.
+   * @param {HTMLCanvasElement} canvas
+   * @param {Object} lineConfig Configuration object.
+   */
+  constructor(canvas, lineConfig) {
+    let sourceX = lineConfig.SOURCE_X;
+    let sourceY = lineConfig.SOURCE_Y;
+
+    if (IS_HIDPI) {
+      sourceX *= 2;
+      sourceY *= 2;
+    }
+
+    this.spritePos = {x: sourceX, y: sourceY};
+    this.canvas = canvas;
+    this.canvasCtx =
+        /** @type {CanvasRenderingContext2D} */ (canvas.getContext('2d'));
+    this.sourceDimensions = {};
+    this.dimensions = lineConfig;
+
+    this.sourceXPos =
+        [this.spritePos.x, this.spritePos.x + this.dimensions.WIDTH];
+    this.xPos = [];
+    this.yPos = 0;
+    this.bumpThreshold = 0.5;
+
+    this.setSourceDimensions(lineConfig);
+    this.draw();
+  }
+
+
+  /**
+   * Set the source dimensions of the horizon line.
+   */
+  setSourceDimensions(newDimensions) {
+    for (const dimension in newDimensions) {
+      if (dimension !== 'SOURCE_X' && dimension !== 'SOURCE_Y') {
+        if (IS_HIDPI) {
+          if (dimension !== 'YPOS') {
+            this.sourceDimensions[dimension] = newDimensions[dimension] * 2;
+          }
+        } else {
+          this.sourceDimensions[dimension] = newDimensions[dimension];
+        }
+        this.dimensions[dimension] = newDimensions[dimension];
+      }
+    }
+
+    this.xPos = [0, newDimensions.WIDTH];
+    this.yPos = newDimensions.YPOS;
+  }
+
+  /**
+   * Return the crop x position of a type.
+   */
+  getRandomType() {
+    return Math.random() > this.bumpThreshold ? this.dimensions.WIDTH : 0;
+  }
+
+  /**
+   * Draw the horizon line.
+   */
+  draw() {
+    this.canvasCtx.drawImage(
+        Runner.imageSprite, this.sourceXPos[0], this.spritePos.y,
+        this.sourceDimensions.WIDTH, this.sourceDimensions.HEIGHT, this.xPos[0],
+        this.yPos, this.dimensions.WIDTH, this.dimensions.HEIGHT);
+
+    this.canvasCtx.drawImage(
+        Runner.imageSprite, this.sourceXPos[1], this.spritePos.y,
+        this.sourceDimensions.WIDTH, this.sourceDimensions.HEIGHT, this.xPos[1],
+        this.yPos, this.dimensions.WIDTH, this.dimensions.HEIGHT);
+  }
+
+  /**
+   * Update the x position of an individual piece of the line.
+   * @param {number} pos Line position.
+   * @param {number} increment
+   */
+  updateXPos(pos, increment) {
+    const line1 = pos;
+    const line2 = pos === 0 ? 1 : 0;
+
+    this.xPos[line1] -= increment;
+    this.xPos[line2] = this.xPos[line1] + this.dimensions.WIDTH;
+
+    if (this.xPos[line1] <= -this.dimensions.WIDTH) {
+      this.xPos[line1] += this.dimensions.WIDTH * 2;
+      this.xPos[line2] = this.xPos[line1] - this.dimensions.WIDTH;
+      this.sourceXPos[line1] = this.getRandomType() + this.spritePos.x;
+    }
+  }
+
+  /**
+   * Update the horizon line.
+   * @param {number} deltaTime
+   * @param {number} speed
+   */
+  update(deltaTime, speed) {
+    const increment = Math.floor(speed * (FPS / 1000) * deltaTime);
+
+    if (this.xPos[0] <= 0) {
+      this.updateXPos(0, increment);
+    } else {
+      this.updateXPos(1, increment);
+    }
+    this.draw();
+  }
+
+  /**
+   * Reset horizon to the starting position.
+   */
+  reset() {
+    this.xPos[0] = 0;
+    this.xPos[1] = this.dimensions.WIDTH;
+  }
+}
\ No newline at end of file
diff --git a/components/neterror/resources/dino_game/night_mode.js b/components/neterror/resources/dino_game/night_mode.js
new file mode 100644
index 0000000..abcfc90
--- /dev/null
+++ b/components/neterror/resources/dino_game/night_mode.js
@@ -0,0 +1,165 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import {spriteDefinitionByType} from '../offline-sprite-definitions.js';
+import {Runner} from '../offline.js';
+
+import {IS_HIDPI} from './constants.js';
+import {getRandomNum} from './utils.js';
+
+export class NightMode {
+  /**
+   * Nightmode shows a moon and stars on the horizon.
+   * @param {HTMLCanvasElement} canvas
+   * @param {number} spritePos
+   * @param {number} containerWidth
+   */
+  constructor(canvas, spritePos, containerWidth) {
+    this.spritePos = spritePos;
+    this.canvas = canvas;
+    this.canvasCtx =
+        /** @type {CanvasRenderingContext2D} */ (canvas.getContext('2d'));
+    this.xPos = containerWidth - 50;
+    this.yPos = 30;
+    this.currentPhase = 0;
+    this.opacity = 0;
+    this.containerWidth = containerWidth;
+    this.stars = [];
+    this.drawStars = false;
+    this.placeStars();
+  }
+
+
+  /**
+   * Update moving moon, changing phases.
+   * @param {boolean} activated Whether night mode is activated.
+   */
+  update(activated) {
+    // Moon phase.
+    if (activated && this.opacity === 0) {
+      this.currentPhase++;
+
+      if (this.currentPhase >= NightMode.phases.length) {
+        this.currentPhase = 0;
+      }
+    }
+
+    // Fade in / out.
+    if (activated && (this.opacity < 1 || this.opacity === 0)) {
+      this.opacity += NightMode.config.FADE_SPEED;
+    } else if (this.opacity > 0) {
+      this.opacity -= NightMode.config.FADE_SPEED;
+    }
+
+    // Set moon positioning.
+    if (this.opacity > 0) {
+      this.xPos = this.updateXPos(this.xPos, NightMode.config.MOON_SPEED);
+
+      // Update stars.
+      if (this.drawStars) {
+        for (let i = 0; i < NightMode.config.NUM_STARS; i++) {
+          this.stars[i].x =
+              this.updateXPos(this.stars[i].x, NightMode.config.STAR_SPEED);
+        }
+      }
+      this.draw();
+    } else {
+      this.opacity = 0;
+      this.placeStars();
+    }
+    this.drawStars = true;
+  }
+
+  updateXPos(currentPos, speed) {
+    if (currentPos < -NightMode.config.WIDTH) {
+      currentPos = this.containerWidth;
+    } else {
+      currentPos -= speed;
+    }
+    return currentPos;
+  }
+
+  draw() {
+    let moonSourceWidth = this.currentPhase === 3 ? NightMode.config.WIDTH * 2 :
+                                                    NightMode.config.WIDTH;
+    let moonSourceHeight = NightMode.config.HEIGHT;
+    let moonSourceX = this.spritePos.x + NightMode.phases[this.currentPhase];
+    const moonOutputWidth = moonSourceWidth;
+    let starSize = NightMode.config.STAR_SIZE;
+    let starSourceX = spriteDefinitionByType.original.LDPI.STAR.x;
+
+    if (IS_HIDPI) {
+      moonSourceWidth *= 2;
+      moonSourceHeight *= 2;
+      moonSourceX =
+          this.spritePos.x + (NightMode.phases[this.currentPhase] * 2);
+      starSize *= 2;
+      starSourceX = spriteDefinitionByType.original.HDPI.STAR.x;
+    }
+
+    this.canvasCtx.save();
+    this.canvasCtx.globalAlpha = this.opacity;
+
+    // Stars.
+    if (this.drawStars) {
+      for (let i = 0; i < NightMode.config.NUM_STARS; i++) {
+        this.canvasCtx.drawImage(
+            Runner.origImageSprite, starSourceX, this.stars[i].sourceY,
+            starSize, starSize, Math.round(this.stars[i].x), this.stars[i].y,
+            NightMode.config.STAR_SIZE, NightMode.config.STAR_SIZE);
+      }
+    }
+
+    // Moon.
+    this.canvasCtx.drawImage(
+        Runner.origImageSprite, moonSourceX, this.spritePos.y, moonSourceWidth,
+        moonSourceHeight, Math.round(this.xPos), this.yPos, moonOutputWidth,
+        NightMode.config.HEIGHT);
+
+    this.canvasCtx.globalAlpha = 1;
+    this.canvasCtx.restore();
+  }
+
+  // Do star placement.
+  placeStars() {
+    const segmentSize =
+        Math.round(this.containerWidth / NightMode.config.NUM_STARS);
+
+    for (let i = 0; i < NightMode.config.NUM_STARS; i++) {
+      this.stars[i] = {};
+      this.stars[i].x = getRandomNum(segmentSize * i, segmentSize * (i + 1));
+      this.stars[i].y = getRandomNum(0, NightMode.config.STAR_MAX_Y);
+
+      if (IS_HIDPI) {
+        this.stars[i].sourceY = spriteDefinitionByType.original.HDPI.STAR.y +
+            NightMode.config.STAR_SIZE * 2 * i;
+      } else {
+        this.stars[i].sourceY = spriteDefinitionByType.original.LDPI.STAR.y +
+            NightMode.config.STAR_SIZE * i;
+      }
+    }
+  }
+
+  reset() {
+    this.currentPhase = 0;
+    this.opacity = 0;
+    this.update(false);
+  }
+}
+
+/**
+ * @enum {number}
+ */
+NightMode.config = {
+  FADE_SPEED: 0.035,
+  HEIGHT: 40,
+  MOON_SPEED: 0.25,
+  NUM_STARS: 2,
+  STAR_SIZE: 9,
+  STAR_SPEED: 0.3,
+  STAR_MAX_Y: 70,
+  WIDTH: 20,
+};
+
+NightMode.phases = [140, 120, 100, 60, 40, 20, 0];
\ No newline at end of file
diff --git a/components/neterror/resources/dino_game/obstacle.js b/components/neterror/resources/dino_game/obstacle.js
new file mode 100644
index 0000000..fa6b3ab
--- /dev/null
+++ b/components/neterror/resources/dino_game/obstacle.js
@@ -0,0 +1,210 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import {CollisionBox} from '../offline-sprite-definitions.js';
+import {Runner} from '../offline.js';
+
+import {FPS, IS_HIDPI, IS_MOBILE} from './constants.js';
+import {getRandomNum} from './utils.js';
+
+export class Obstacle {
+  /**
+   * Obstacle.
+   * @param {CanvasRenderingContext2D} canvasCtx
+   * @param {ObstacleType} type
+   * @param {Object} spriteImgPos Obstacle position in sprite.
+   * @param {Object} dimensions
+   * @param {number} gapCoefficient Mutipler in determining the gap.
+   * @param {number} speed
+   * @param {number=} opt_xOffset
+   * @param {boolean=} opt_isAltGameMode
+   */
+  constructor(
+      canvasCtx, type, spriteImgPos, dimensions, gapCoefficient, speed,
+      opt_xOffset, opt_isAltGameMode) {
+    this.canvasCtx = canvasCtx;
+    this.spritePos = spriteImgPos;
+    this.typeConfig = type;
+    this.gapCoefficient = Runner.slowDown ? gapCoefficient * 2 : gapCoefficient;
+    this.size = getRandomNum(1, Obstacle.MAX_OBSTACLE_LENGTH);
+    this.dimensions = dimensions;
+    this.remove = false;
+    this.xPos = dimensions.WIDTH + (opt_xOffset || 0);
+    this.yPos = 0;
+    this.width = 0;
+    this.collisionBoxes = [];
+    this.gap = 0;
+    this.speedOffset = 0;
+    this.altGameModeActive = opt_isAltGameMode;
+    this.imageSprite = this.typeConfig.type == 'COLLECTABLE' ?
+        Runner.altCommonImageSprite :
+        this.altGameModeActive ? Runner.altGameImageSprite :
+                                 Runner.imageSprite;
+
+    // For animated obstacles.
+    this.currentFrame = 0;
+    this.timer = 0;
+
+    this.init(speed);
+  }
+
+
+  /**
+   * Initialise the DOM for the obstacle.
+   * @param {number} speed
+   */
+  init(speed) {
+    this.cloneCollisionBoxes();
+
+    // Only allow sizing if we're at the right speed.
+    if (this.size > 1 && this.typeConfig.multipleSpeed > speed) {
+      this.size = 1;
+    }
+
+    this.width = this.typeConfig.width * this.size;
+
+    // Check if obstacle can be positioned at various heights.
+    if (Array.isArray(this.typeConfig.yPos)) {
+      const yPosConfig =
+          IS_MOBILE ? this.typeConfig.yPosMobile : this.typeConfig.yPos;
+      this.yPos = yPosConfig[getRandomNum(0, yPosConfig.length - 1)];
+    } else {
+      this.yPos = this.typeConfig.yPos;
+    }
+
+    this.draw();
+
+    // Make collision box adjustments,
+    // Central box is adjusted to the size as one box.
+    //      ____        ______        ________
+    //    _|   |-|    _|     |-|    _|       |-|
+    //   | |<->| |   | |<--->| |   | |<----->| |
+    //   | | 1 | |   | |  2  | |   | |   3   | |
+    //   |_|___|_|   |_|_____|_|   |_|_______|_|
+    //
+    if (this.size > 1) {
+      this.collisionBoxes[1].width = this.width - this.collisionBoxes[0].width -
+          this.collisionBoxes[2].width;
+      this.collisionBoxes[2].x = this.width - this.collisionBoxes[2].width;
+    }
+
+    // For obstacles that go at a different speed from the horizon.
+    if (this.typeConfig.speedOffset) {
+      this.speedOffset = Math.random() > 0.5 ? this.typeConfig.speedOffset :
+                                               -this.typeConfig.speedOffset;
+    }
+
+    this.gap = this.getGap(this.gapCoefficient, speed);
+
+    // Increase gap for audio cues enabled.
+    if (Runner.audioCues) {
+      this.gap *= 2;
+    }
+  }
+
+  /**
+   * Draw and crop based on size.
+   */
+  draw() {
+    let sourceWidth = this.typeConfig.width;
+    let sourceHeight = this.typeConfig.height;
+
+    if (IS_HIDPI) {
+      sourceWidth = sourceWidth * 2;
+      sourceHeight = sourceHeight * 2;
+    }
+
+    // X position in sprite.
+    let sourceX =
+        (sourceWidth * this.size) * (0.5 * (this.size - 1)) + this.spritePos.x;
+
+    // Animation frames.
+    if (this.currentFrame > 0) {
+      sourceX += sourceWidth * this.currentFrame;
+    }
+
+    this.canvasCtx.drawImage(
+        this.imageSprite, sourceX, this.spritePos.y, sourceWidth * this.size,
+        sourceHeight, this.xPos, this.yPos, this.typeConfig.width * this.size,
+        this.typeConfig.height);
+  }
+
+  /**
+   * Obstacle frame update.
+   * @param {number} deltaTime
+   * @param {number} speed
+   */
+  update(deltaTime, speed) {
+    if (!this.remove) {
+      if (this.typeConfig.speedOffset) {
+        speed += this.speedOffset;
+      }
+      this.xPos -= Math.floor((speed * FPS / 1000) * deltaTime);
+
+      // Update frame
+      if (this.typeConfig.numFrames) {
+        this.timer += deltaTime;
+        if (this.timer >= this.typeConfig.frameRate) {
+          this.currentFrame =
+              this.currentFrame === this.typeConfig.numFrames - 1 ?
+              0 :
+              this.currentFrame + 1;
+          this.timer = 0;
+        }
+      }
+      this.draw();
+
+      if (!this.isVisible()) {
+        this.remove = true;
+      }
+    }
+  }
+
+  /**
+   * Calculate a random gap size.
+   * - Minimum gap gets wider as speed increases
+   * @param {number} gapCoefficient
+   * @param {number} speed
+   * @return {number} The gap size.
+   */
+  getGap(gapCoefficient, speed) {
+    const minGap = Math.round(
+        this.width * speed + this.typeConfig.minGap * gapCoefficient);
+    const maxGap = Math.round(minGap * Obstacle.MAX_GAP_COEFFICIENT);
+    return getRandomNum(minGap, maxGap);
+  }
+
+  /**
+   * Check if obstacle is visible.
+   * @return {boolean} Whether the obstacle is in the game area.
+   */
+  isVisible() {
+    return this.xPos + this.width > 0;
+  }
+
+  /**
+   * Make a copy of the collision boxes, since these will change based on
+   * obstacle type and size.
+   */
+  cloneCollisionBoxes() {
+    const collisionBoxes = this.typeConfig.collisionBoxes;
+
+    for (let i = collisionBoxes.length - 1; i >= 0; i--) {
+      this.collisionBoxes[i] = new CollisionBox(
+          collisionBoxes[i].x, collisionBoxes[i].y, collisionBoxes[i].width,
+          collisionBoxes[i].height);
+    }
+  }
+}
+
+
+/**
+ * Coefficient for calculating the maximum gap.
+ */
+Obstacle.MAX_GAP_COEFFICIENT = 1.5;
+
+/**
+ * Maximum obstacle grouping count.
+ */
+Obstacle.MAX_OBSTACLE_LENGTH = 3;
\ No newline at end of file
diff --git a/components/neterror/resources/dino_game/trex.js b/components/neterror/resources/dino_game/trex.js
new file mode 100644
index 0000000..3b20cb7
--- /dev/null
+++ b/components/neterror/resources/dino_game/trex.js
@@ -0,0 +1,512 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import {CollisionBox} from '../offline-sprite-definitions.js';
+import {Runner} from '../offline.js';
+
+import {FPS, IS_HIDPI} from './constants.js';
+import {getTimeStamp} from './utils.js';
+
+
+export class Trex {
+  /**
+   * T-rex game character.
+   * @param {HTMLCanvasElement} canvas
+   * @param {Object} spritePos Positioning within image sprite.
+   */
+  constructor(canvas, spritePos) {
+    this.canvas = canvas;
+    this.canvasCtx =
+        /** @type {CanvasRenderingContext2D} */ (canvas.getContext('2d'));
+    this.spritePos = spritePos;
+    this.xPos = 0;
+    this.yPos = 0;
+    this.xInitialPos = 0;
+    // Position when on the ground.
+    this.groundYPos = 0;
+    this.currentFrame = 0;
+    this.currentAnimFrames = [];
+    this.blinkDelay = 0;
+    this.blinkCount = 0;
+    this.animStartTime = 0;
+    this.timer = 0;
+    this.msPerFrame = 1000 / FPS;
+    this.config = Object.assign(Trex.config, Trex.normalJumpConfig);
+    // Current status.
+    this.status = Trex.status.WAITING;
+    this.jumping = false;
+    this.ducking = false;
+    this.jumpVelocity = 0;
+    this.reachedMinHeight = false;
+    this.speedDrop = false;
+    this.jumpCount = 0;
+    this.jumpspotX = 0;
+    this.altGameModeEnabled = false;
+    this.flashing = false;
+
+    this.init();
+  }
+
+
+  /**
+   * T-rex player initialiser.
+   * Sets the t-rex to blink at random intervals.
+   */
+  init() {
+    this.groundYPos = Runner.defaultDimensions.HEIGHT - this.config.HEIGHT -
+        Runner.config.BOTTOM_PAD;
+    this.yPos = this.groundYPos;
+    this.minJumpHeight = this.groundYPos - this.config.MIN_JUMP_HEIGHT;
+
+    this.draw(0, 0);
+    this.update(0, Trex.status.WAITING);
+  }
+
+  /**
+   * Assign the appropriate jump parameters based on the game speed.
+   */
+  enableSlowConfig() {
+    const jumpConfig =
+        Runner.slowDown ? Trex.slowJumpConfig : Trex.normalJumpConfig;
+    Trex.config = Object.assign(Trex.config, jumpConfig);
+
+    this.adjustAltGameConfigForSlowSpeed();
+  }
+
+  /**
+   * Enables the alternative game. Redefines the dino config.
+   * @param {Object} spritePos New positioning within image sprite.
+   */
+  enableAltGameMode(spritePos) {
+    this.altGameModeEnabled = true;
+    this.spritePos = spritePos;
+    const spriteDefinition = Runner.spriteDefinition['TREX'];
+
+    // Update animation frames.
+    Trex.animFrames.RUNNING.frames =
+        [spriteDefinition.RUNNING_1.x, spriteDefinition.RUNNING_2.x];
+    Trex.animFrames.CRASHED.frames = [spriteDefinition.CRASHED.x];
+
+    if (typeof spriteDefinition.JUMPING.x == 'object') {
+      Trex.animFrames.JUMPING.frames = spriteDefinition.JUMPING.x;
+    } else {
+      Trex.animFrames.JUMPING.frames = [spriteDefinition.JUMPING.x];
+    }
+
+    Trex.animFrames.DUCKING.frames =
+        [spriteDefinition.DUCKING_1.x, spriteDefinition.DUCKING_2.x];
+
+    // Update Trex config
+    Trex.config.GRAVITY = spriteDefinition.GRAVITY || Trex.config.GRAVITY;
+    Trex.config.HEIGHT = spriteDefinition.RUNNING_1.h,
+    Trex.config.INITIAL_JUMP_VELOCITY = spriteDefinition.INITIAL_JUMP_VELOCITY;
+    Trex.config.MAX_JUMP_HEIGHT = spriteDefinition.MAX_JUMP_HEIGHT;
+    Trex.config.MIN_JUMP_HEIGHT = spriteDefinition.MIN_JUMP_HEIGHT;
+    Trex.config.WIDTH = spriteDefinition.RUNNING_1.w;
+    Trex.config.WIDTH_CRASHED = spriteDefinition.CRASHED.w;
+    Trex.config.WIDTH_JUMP = spriteDefinition.JUMPING.w;
+    Trex.config.INVERT_JUMP = spriteDefinition.INVERT_JUMP;
+
+    this.adjustAltGameConfigForSlowSpeed(spriteDefinition.GRAVITY);
+    this.config = Trex.config;
+
+    // Adjust bottom horizon placement.
+    this.groundYPos = Runner.defaultDimensions.HEIGHT - this.config.HEIGHT -
+        Runner.spriteDefinition['BOTTOM_PAD'];
+    this.yPos = this.groundYPos;
+    this.reset();
+  }
+
+  /**
+   * Slow speeds adjustments for the alt game modes.
+   * @param {number=} opt_gravityValue
+   */
+  adjustAltGameConfigForSlowSpeed(opt_gravityValue) {
+    if (Runner.slowDown) {
+      if (opt_gravityValue) {
+        Trex.config.GRAVITY = opt_gravityValue / 1.5;
+      }
+      Trex.config.MIN_JUMP_HEIGHT *= 1.5;
+      Trex.config.MAX_JUMP_HEIGHT *= 1.5;
+      Trex.config.INITIAL_JUMP_VELOCITY =
+          Trex.config.INITIAL_JUMP_VELOCITY * 1.5;
+    }
+  }
+
+  /**
+   * Setter whether dino is flashing.
+   * @param {boolean} status
+   */
+  setFlashing(status) {
+    this.flashing = status;
+  }
+
+  /**
+   * Setter for the jump velocity.
+   * The appropriate drop velocity is also set.
+   * @param {number} setting
+   */
+  setJumpVelocity(setting) {
+    this.config.INITIAL_JUMP_VELOCITY = -setting;
+    this.config.DROP_VELOCITY = -setting / 2;
+  }
+
+  /**
+   * Set the animation status.
+   * @param {!number} deltaTime
+   * @param {Trex.status=} opt_status Optional status to switch to.
+   */
+  update(deltaTime, opt_status) {
+    this.timer += deltaTime;
+
+    // Update the status.
+    if (opt_status) {
+      this.status = opt_status;
+      this.currentFrame = 0;
+      this.msPerFrame = Trex.animFrames[opt_status].msPerFrame;
+      this.currentAnimFrames = Trex.animFrames[opt_status].frames;
+
+      if (opt_status === Trex.status.WAITING) {
+        this.animStartTime = getTimeStamp();
+        this.setBlinkDelay();
+      }
+    }
+    // Game intro animation, T-rex moves in from the left.
+    if (this.playingIntro && this.xPos < this.config.START_X_POS) {
+      this.xPos += Math.round(
+          (this.config.START_X_POS / this.config.INTRO_DURATION) * deltaTime);
+      this.xInitialPos = this.xPos;
+    }
+
+    if (this.status === Trex.status.WAITING) {
+      this.blink(getTimeStamp());
+    } else {
+      this.draw(this.currentAnimFrames[this.currentFrame], 0);
+    }
+
+    // Update the frame position.
+    if (!this.flashing && this.timer >= this.msPerFrame) {
+      this.currentFrame =
+          this.currentFrame == this.currentAnimFrames.length - 1 ?
+          0 :
+          this.currentFrame + 1;
+      this.timer = 0;
+    }
+
+    // Speed drop becomes duck if the down key is still being pressed.
+    if (this.speedDrop && this.yPos === this.groundYPos) {
+      this.speedDrop = false;
+      this.setDuck(true);
+    }
+  }
+
+  /**
+   * Draw the t-rex to a particular position.
+   * @param {number} x
+   * @param {number} y
+   */
+  draw(x, y) {
+    let sourceX = x;
+    let sourceY = y;
+    let sourceWidth = this.ducking && this.status !== Trex.status.CRASHED ?
+        this.config.WIDTH_DUCK :
+        this.config.WIDTH;
+    let sourceHeight = this.config.HEIGHT;
+    const outputHeight = sourceHeight;
+    const outputWidth =
+        this.altGameModeEnabled && this.status == Trex.status.CRASHED ?
+        this.config.WIDTH_CRASHED :
+        this.config.WIDTH;
+
+    let jumpOffset = Runner.spriteDefinition.TREX.JUMPING.xOffset;
+
+    // Width of sprite can change on jump or crashed.
+    if (this.altGameModeEnabled) {
+      if (this.jumping && this.status !== Trex.status.CRASHED) {
+        sourceWidth = this.config.WIDTH_JUMP;
+      } else if (this.status == Trex.status.CRASHED) {
+        sourceWidth = this.config.WIDTH_CRASHED;
+      }
+    }
+
+    if (IS_HIDPI) {
+      sourceX *= 2;
+      sourceY *= 2;
+      sourceWidth *= 2;
+      sourceHeight *= 2;
+      jumpOffset *= 2;
+    }
+
+    // Adjustments for sprite sheet position.
+    sourceX += this.spritePos.x;
+    sourceY += this.spritePos.y;
+
+    // Flashing.
+    if (this.flashing) {
+      if (this.timer < this.config.FLASH_ON) {
+        this.canvasCtx.globalAlpha = 0.5;
+      } else if (this.timer > this.config.FLASH_OFF) {
+        this.timer = 0;
+      }
+    }
+
+    // Ducking.
+    if (this.ducking && this.status !== Trex.status.CRASHED) {
+      this.canvasCtx.drawImage(
+          Runner.imageSprite, sourceX, sourceY, sourceWidth, sourceHeight,
+          this.xPos, this.yPos, this.config.WIDTH_DUCK, outputHeight);
+    } else if (
+        this.altGameModeEnabled && this.jumping &&
+        this.status !== Trex.status.CRASHED) {
+      // Jumping with adjustments.
+      this.canvasCtx.drawImage(
+          Runner.imageSprite, sourceX, sourceY, sourceWidth, sourceHeight,
+          this.xPos - jumpOffset, this.yPos, this.config.WIDTH_JUMP,
+          outputHeight);
+    } else {
+      // Crashed whilst ducking. Trex is standing up so needs adjustment.
+      if (this.ducking && this.status === Trex.status.CRASHED) {
+        this.xPos++;
+      }
+      // Standing / running
+      this.canvasCtx.drawImage(
+          Runner.imageSprite, sourceX, sourceY, sourceWidth, sourceHeight,
+          this.xPos, this.yPos, outputWidth, outputHeight);
+    }
+    this.canvasCtx.globalAlpha = 1;
+  }
+
+  /**
+   * Sets a random time for the blink to happen.
+   */
+  setBlinkDelay() {
+    this.blinkDelay = Math.ceil(Math.random() * Trex.BLINK_TIMING);
+  }
+
+  /**
+   * Make t-rex blink at random intervals.
+   * @param {number} time Current time in milliseconds.
+   */
+  blink(time) {
+    const deltaTime = time - this.animStartTime;
+
+    if (deltaTime >= this.blinkDelay) {
+      this.draw(this.currentAnimFrames[this.currentFrame], 0);
+
+      if (this.currentFrame === 1) {
+        // Set new random delay to blink.
+        this.setBlinkDelay();
+        this.animStartTime = time;
+        this.blinkCount++;
+      }
+    }
+  }
+
+  /**
+   * Initialise a jump.
+   * @param {number} speed
+   */
+  startJump(speed) {
+    if (!this.jumping) {
+      this.update(0, Trex.status.JUMPING);
+      // Tweak the jump velocity based on the speed.
+      this.jumpVelocity = this.config.INITIAL_JUMP_VELOCITY - (speed / 10);
+      this.jumping = true;
+      this.reachedMinHeight = false;
+      this.speedDrop = false;
+
+      if (this.config.INVERT_JUMP) {
+        this.minJumpHeight = this.groundYPos + this.config.MIN_JUMP_HEIGHT;
+      }
+    }
+  }
+
+  /**
+   * Jump is complete, falling down.
+   */
+  endJump() {
+    if (this.reachedMinHeight &&
+        this.jumpVelocity < this.config.DROP_VELOCITY) {
+      this.jumpVelocity = this.config.DROP_VELOCITY;
+    }
+  }
+
+  /**
+   * Update frame for a jump.
+   * @param {number} deltaTime
+   */
+  updateJump(deltaTime) {
+    const msPerFrame = Trex.animFrames[this.status].msPerFrame;
+    const framesElapsed = deltaTime / msPerFrame;
+
+    // Speed drop makes Trex fall faster.
+    if (this.speedDrop) {
+      this.yPos += Math.round(
+          this.jumpVelocity * this.config.SPEED_DROP_COEFFICIENT *
+          framesElapsed);
+    } else if (this.config.INVERT_JUMP) {
+      this.yPos -= Math.round(this.jumpVelocity * framesElapsed);
+    } else {
+      this.yPos += Math.round(this.jumpVelocity * framesElapsed);
+    }
+
+    this.jumpVelocity += this.config.GRAVITY * framesElapsed;
+
+    // Minimum height has been reached.
+    if (this.config.INVERT_JUMP && (this.yPos > this.minJumpHeight) ||
+        !this.config.INVERT_JUMP && (this.yPos < this.minJumpHeight) ||
+        this.speedDrop) {
+      this.reachedMinHeight = true;
+    }
+
+    // Reached max height.
+    if (this.config.INVERT_JUMP && (this.yPos > -this.config.MAX_JUMP_HEIGHT) ||
+        !this.config.INVERT_JUMP && (this.yPos < this.config.MAX_JUMP_HEIGHT) ||
+        this.speedDrop) {
+      this.endJump();
+    }
+
+    // Back down at ground level. Jump completed.
+    if ((this.config.INVERT_JUMP && this.yPos) < this.groundYPos ||
+        (!this.config.INVERT_JUMP && this.yPos) > this.groundYPos) {
+      this.reset();
+      this.jumpCount++;
+
+      if (Runner.audioCues) {
+        Runner.generatedSoundFx.loopFootSteps();
+      }
+    }
+  }
+
+  /**
+   * Set the speed drop. Immediately cancels the current jump.
+   */
+  setSpeedDrop() {
+    this.speedDrop = true;
+    this.jumpVelocity = 1;
+  }
+
+  /**
+   * @param {boolean} isDucking
+   */
+  setDuck(isDucking) {
+    if (isDucking && this.status !== Trex.status.DUCKING) {
+      this.update(0, Trex.status.DUCKING);
+      this.ducking = true;
+    } else if (this.status === Trex.status.DUCKING) {
+      this.update(0, Trex.status.RUNNING);
+      this.ducking = false;
+    }
+  }
+
+  /**
+   * Reset the t-rex to running at start of game.
+   */
+  reset() {
+    this.xPos = this.xInitialPos;
+    this.yPos = this.groundYPos;
+    this.jumpVelocity = 0;
+    this.jumping = false;
+    this.ducking = false;
+    this.update(0, Trex.status.RUNNING);
+    this.midair = false;
+    this.speedDrop = false;
+    this.jumpCount = 0;
+  }
+}
+
+
+/**
+ * T-rex player config.
+ */
+Trex.config = {
+  DROP_VELOCITY: -5,
+  FLASH_OFF: 175,
+  FLASH_ON: 100,
+  HEIGHT: 47,
+  HEIGHT_DUCK: 25,
+  INTRO_DURATION: 1500,
+  SPEED_DROP_COEFFICIENT: 3,
+  SPRITE_WIDTH: 262,
+  START_X_POS: 50,
+  WIDTH: 44,
+  WIDTH_DUCK: 59,
+};
+
+Trex.slowJumpConfig = {
+  GRAVITY: 0.25,
+  MAX_JUMP_HEIGHT: 50,
+  MIN_JUMP_HEIGHT: 45,
+  INITIAL_JUMP_VELOCITY: -20,
+};
+
+Trex.normalJumpConfig = {
+  GRAVITY: 0.6,
+  MAX_JUMP_HEIGHT: 30,
+  MIN_JUMP_HEIGHT: 30,
+  INITIAL_JUMP_VELOCITY: -10,
+};
+
+/**
+ * Used in collision detection.
+ * @enum {Array<CollisionBox>}
+ */
+Trex.collisionBoxes = {
+  DUCKING: [new CollisionBox(1, 18, 55, 25)],
+  RUNNING: [
+    new CollisionBox(22, 0, 17, 16),
+    new CollisionBox(1, 18, 30, 9),
+    new CollisionBox(10, 35, 14, 8),
+    new CollisionBox(1, 24, 29, 5),
+    new CollisionBox(5, 30, 21, 4),
+    new CollisionBox(9, 34, 15, 4),
+  ],
+};
+
+
+/**
+ * Animation states.
+ * @enum {string}
+ */
+Trex.status = {
+  CRASHED: 'CRASHED',
+  DUCKING: 'DUCKING',
+  JUMPING: 'JUMPING',
+  RUNNING: 'RUNNING',
+  WAITING: 'WAITING',
+};
+
+/**
+ * Blinking coefficient.
+ * @const
+ */
+Trex.BLINK_TIMING = 7000;
+
+
+/**
+ * Animation config for different states.
+ * @enum {Object}
+ */
+Trex.animFrames = {
+  WAITING: {
+    frames: [44, 0],
+    msPerFrame: 1000 / 3,
+  },
+  RUNNING: {
+    frames: [88, 132],
+    msPerFrame: 1000 / 12,
+  },
+  CRASHED: {
+    frames: [220],
+    msPerFrame: 1000 / 60,
+  },
+  JUMPING: {
+    frames: [0],
+    msPerFrame: 1000 / 60,
+  },
+  DUCKING: {
+    frames: [264, 323],
+    msPerFrame: 1000 / 8,
+  },
+};
\ No newline at end of file
diff --git a/components/neterror/resources/dino_game/utils.js b/components/neterror/resources/dino_game/utils.js
index 31950e2..a7a5c6f 100644
--- a/components/neterror/resources/dino_game/utils.js
+++ b/components/neterror/resources/dino_game/utils.js
@@ -2,6 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+import {IS_IOS} from './constants.js';
 
 /**
  * Get random number.
@@ -11,3 +12,11 @@
 export function getRandomNum(min, max) {
   return Math.floor(Math.random() * (max - min + 1)) + min;
 }
+
+/**
+ * Return the current timestamp.
+ * @return {number}
+ */
+export function getTimeStamp() {
+  return IS_IOS ? new Date().getTime() : performance.now();
+}
diff --git a/components/neterror/resources/offline.js b/components/neterror/resources/offline.js
index 4deb79e..8c96723 100644
--- a/components/neterror/resources/offline.js
+++ b/components/neterror/resources/offline.js
@@ -5,10 +5,14 @@
 import {loadTimeData} from 'chrome://resources/js/load_time_data.js';
 
 import {HIDDEN_CLASS} from './constants.js';
-import {Cloud} from './dino_game/cloud.js';
-import {IS_HIDPI, IS_IOS} from './dino_game/constants.js';
+import {FPS, IS_HIDPI, IS_IOS, IS_MOBILE, IS_RTL} from './dino_game/constants.js';
+import {DistanceMeter} from './dino_game/distance_meter.js';
+import {GameOverPanel} from './dino_game/game_over_panel.js';
 import {GeneratedSoundFx} from './dino_game/generated_sound_fx.js';
-import {getRandomNum} from './dino_game/utils.js';
+import {Horizon} from './dino_game/horizon.js';
+import {Obstacle} from './dino_game/obstacle.js';
+import {Trex} from './dino_game/trex.js';
+import {getTimeStamp} from './dino_game/utils.js';
 import {CollisionBox, GAME_TYPE, spriteDefinitionByType} from './offline-sprite-definitions.js';
 
 /**
@@ -112,18 +116,6 @@
  */
 const DEFAULT_WIDTH = 600;
 
-/**
- * Frames per second.
- * @const
- */
-const FPS = 60;
-
-/** @const */
-const IS_MOBILE = /Android/.test(window.navigator.userAgent) || IS_IOS;
-
-/** @const */
-const IS_RTL = document.querySelector('html').dir === 'rtl';
-
 /** @const */
 const ARCADE_MODE_URL = 'chrome://dino/';
 
@@ -1609,303 +1601,6 @@
 }
 
 
-/**
- * Return the current timestamp.
- * @return {number}
- */
-function getTimeStamp() {
-  return IS_IOS ? new Date().getTime() : performance.now();
-}
-
-
-//******************************************************************************
-
-
-/**
- * Game over panel.
- * @param {!HTMLCanvasElement} canvas
- * @param {Object} textImgPos
- * @param {Object} restartImgPos
- * @param {!Object} dimensions Canvas dimensions.
- * @param {Object=} opt_altGameEndImgPos
- * @param {boolean=} opt_altGameActive
- * @constructor
- */
-function GameOverPanel(
-    canvas, textImgPos, restartImgPos, dimensions, opt_altGameEndImgPos,
-    opt_altGameActive) {
-  this.canvas = canvas;
-  this.canvasCtx =
-      /** @type {CanvasRenderingContext2D} */ (canvas.getContext('2d'));
-  this.canvasDimensions = dimensions;
-  this.textImgPos = textImgPos;
-  this.restartImgPos = restartImgPos;
-  this.altGameEndImgPos = opt_altGameEndImgPos;
-  this.altGameModeActive = opt_altGameActive;
-
-  // Retry animation.
-  this.frameTimeStamp = 0;
-  this.animTimer = 0;
-  this.currentFrame = 0;
-
-  this.gameOverRafId = null;
-
-  this.flashTimer = 0;
-  this.flashCounter = 0;
-  this.originalText = true;
-}
-
-GameOverPanel.RESTART_ANIM_DURATION = 875;
-GameOverPanel.LOGO_PAUSE_DURATION = 875;
-GameOverPanel.FLASH_ITERATIONS = 5;
-
-/**
- * Animation frames spec.
- */
-GameOverPanel.animConfig = {
-  frames: [0, 36, 72, 108, 144, 180, 216, 252],
-  msPerFrame: GameOverPanel.RESTART_ANIM_DURATION / 8,
-};
-
-/**
- * Dimensions used in the panel.
- * @enum {number}
- */
-GameOverPanel.dimensions = {
-  TEXT_X: 0,
-  TEXT_Y: 13,
-  TEXT_WIDTH: 191,
-  TEXT_HEIGHT: 11,
-  RESTART_WIDTH: 36,
-  RESTART_HEIGHT: 32,
-};
-
-
-GameOverPanel.prototype = {
-  /**
-   * Update the panel dimensions.
-   * @param {number} width New canvas width.
-   * @param {number} opt_height Optional new canvas height.
-   */
-  updateDimensions(width, opt_height) {
-    this.canvasDimensions.WIDTH = width;
-    if (opt_height) {
-      this.canvasDimensions.HEIGHT = opt_height;
-    }
-    this.currentFrame = GameOverPanel.animConfig.frames.length - 1;
-  },
-
-  drawGameOverText(dimensions, opt_useAltText) {
-    const centerX = this.canvasDimensions.WIDTH / 2;
-    let textSourceX = dimensions.TEXT_X;
-    let textSourceY = dimensions.TEXT_Y;
-    let textSourceWidth = dimensions.TEXT_WIDTH;
-    let textSourceHeight = dimensions.TEXT_HEIGHT;
-
-    const textTargetX = Math.round(centerX - (dimensions.TEXT_WIDTH / 2));
-    const textTargetY = Math.round((this.canvasDimensions.HEIGHT - 25) / 3);
-    const textTargetWidth = dimensions.TEXT_WIDTH;
-    const textTargetHeight = dimensions.TEXT_HEIGHT;
-
-    if (IS_HIDPI) {
-      textSourceY *= 2;
-      textSourceX *= 2;
-      textSourceWidth *= 2;
-      textSourceHeight *= 2;
-    }
-
-    if (!opt_useAltText) {
-      textSourceX += this.textImgPos.x;
-      textSourceY += this.textImgPos.y;
-    }
-
-    const spriteSource =
-        opt_useAltText ? Runner.altCommonImageSprite : Runner.origImageSprite;
-
-    this.canvasCtx.save();
-
-    if (IS_RTL) {
-      this.canvasCtx.translate(this.canvasDimensions.WIDTH, 0);
-      this.canvasCtx.scale(-1, 1);
-    }
-
-    // Game over text from sprite.
-    this.canvasCtx.drawImage(
-        spriteSource, textSourceX, textSourceY, textSourceWidth,
-        textSourceHeight, textTargetX, textTargetY, textTargetWidth,
-        textTargetHeight);
-
-    this.canvasCtx.restore();
-  },
-
-  /**
-   * Draw additional adornments for alternative game types.
-   */
-  drawAltGameElements(tRex) {
-    // Additional adornments.
-    if (this.altGameModeActive && Runner.spriteDefinition.ALT_GAME_END_CONFIG) {
-      const altGameEndConfig = Runner.spriteDefinition.ALT_GAME_END_CONFIG;
-
-      let altGameEndSourceWidth = altGameEndConfig.WIDTH;
-      let altGameEndSourceHeight = altGameEndConfig.HEIGHT;
-      const altGameEndTargetX = tRex.xPos + altGameEndConfig.X_OFFSET;
-      const altGameEndTargetY = tRex.yPos + altGameEndConfig.Y_OFFSET;
-
-      if (IS_HIDPI) {
-        altGameEndSourceWidth *= 2;
-        altGameEndSourceHeight *= 2;
-      }
-
-      this.canvasCtx.drawImage(
-          Runner.altCommonImageSprite, this.altGameEndImgPos.x,
-          this.altGameEndImgPos.y, altGameEndSourceWidth,
-          altGameEndSourceHeight, altGameEndTargetX, altGameEndTargetY,
-          altGameEndConfig.WIDTH, altGameEndConfig.HEIGHT);
-    }
-  },
-
-  /**
-   * Draw restart button.
-   */
-  drawRestartButton() {
-    const dimensions = GameOverPanel.dimensions;
-    let framePosX = GameOverPanel.animConfig.frames[this.currentFrame];
-    let restartSourceWidth = dimensions.RESTART_WIDTH;
-    let restartSourceHeight = dimensions.RESTART_HEIGHT;
-    const restartTargetX =
-        (this.canvasDimensions.WIDTH / 2) - (dimensions.RESTART_WIDTH / 2);
-    const restartTargetY = this.canvasDimensions.HEIGHT / 2;
-
-    if (IS_HIDPI) {
-      restartSourceWidth *= 2;
-      restartSourceHeight *= 2;
-      framePosX *= 2;
-    }
-
-    this.canvasCtx.save();
-
-    if (IS_RTL) {
-      this.canvasCtx.translate(this.canvasDimensions.WIDTH, 0);
-      this.canvasCtx.scale(-1, 1);
-    }
-
-    this.canvasCtx.drawImage(
-        Runner.origImageSprite, this.restartImgPos.x + framePosX,
-        this.restartImgPos.y, restartSourceWidth, restartSourceHeight,
-        restartTargetX, restartTargetY, dimensions.RESTART_WIDTH,
-        dimensions.RESTART_HEIGHT);
-    this.canvasCtx.restore();
-  },
-
-
-  /**
-   * Draw the panel.
-   * @param {boolean} opt_altGameModeActive
-   * @param {!Trex} opt_tRex
-   */
-  draw(opt_altGameModeActive, opt_tRex) {
-    if (opt_altGameModeActive) {
-      this.altGameModeActive = opt_altGameModeActive;
-    }
-
-    this.drawGameOverText(GameOverPanel.dimensions, false);
-    this.drawRestartButton();
-    this.drawAltGameElements(opt_tRex);
-    this.update();
-  },
-
-  /**
-   * Update animation frames.
-   */
-  update() {
-    const now = getTimeStamp();
-    const deltaTime = now - (this.frameTimeStamp || now);
-
-    this.frameTimeStamp = now;
-    this.animTimer += deltaTime;
-    this.flashTimer += deltaTime;
-
-    // Restart Button
-    if (this.currentFrame === 0 &&
-        this.animTimer > GameOverPanel.LOGO_PAUSE_DURATION) {
-      this.animTimer = 0;
-      this.currentFrame++;
-      this.drawRestartButton();
-    } else if (
-        this.currentFrame > 0 &&
-        this.currentFrame < GameOverPanel.animConfig.frames.length) {
-      if (this.animTimer >= GameOverPanel.animConfig.msPerFrame) {
-        this.currentFrame++;
-        this.drawRestartButton();
-      }
-    } else if (
-        !this.altGameModeActive &&
-        this.currentFrame === GameOverPanel.animConfig.frames.length) {
-      this.reset();
-      return;
-    }
-
-    // Game over text
-    if (this.altGameModeActive &&
-        spriteDefinitionByType.original.ALT_GAME_OVER_TEXT_CONFIG) {
-      const altTextConfig =
-          spriteDefinitionByType.original.ALT_GAME_OVER_TEXT_CONFIG;
-
-      if (altTextConfig.FLASHING) {
-        if (this.flashCounter < GameOverPanel.FLASH_ITERATIONS &&
-            this.flashTimer > altTextConfig.FLASH_DURATION) {
-          this.flashTimer = 0;
-          this.originalText = !this.originalText;
-
-          this.clearGameOverTextBounds();
-          if (this.originalText) {
-            this.drawGameOverText(GameOverPanel.dimensions, false);
-            this.flashCounter++;
-          } else {
-            this.drawGameOverText(altTextConfig, true);
-          }
-        } else if (this.flashCounter >= GameOverPanel.FLASH_ITERATIONS) {
-          this.reset();
-          return;
-        }
-      } else {
-        this.clearGameOverTextBounds(altTextConfig);
-        this.drawGameOverText(altTextConfig, true);
-      }
-    }
-
-    this.gameOverRafId = requestAnimationFrame(this.update.bind(this));
-  },
-
-  /**
-   * Clear game over text.
-   * @param {Object} dimensions Game over text config.
-   */
-  clearGameOverTextBounds(dimensions) {
-    this.canvasCtx.save();
-
-    this.canvasCtx.clearRect(
-        Math.round(
-            this.canvasDimensions.WIDTH / 2 - (dimensions.TEXT_WIDTH / 2)),
-        Math.round((this.canvasDimensions.HEIGHT - 25) / 3),
-        dimensions.TEXT_WIDTH, dimensions.TEXT_HEIGHT + 4);
-    this.canvasCtx.restore();
-  },
-
-  reset() {
-    if (this.gameOverRafId) {
-      cancelAnimationFrame(this.gameOverRafId);
-      this.gameOverRafId = null;
-    }
-    this.animTimer = 0;
-    this.frameTimeStamp = 0;
-    this.currentFrame = 0;
-    this.flashTimer = 0;
-    this.flashCounter = 0;
-    this.originalText = true;
-  },
-};
-
 
 //******************************************************************************
 
@@ -2028,1908 +1723,4 @@
   }
 
   return crashed;
-}
-
-
-//******************************************************************************
-
-/**
- * Obstacle.
- * @param {CanvasRenderingContext2D} canvasCtx
- * @param {ObstacleType} type
- * @param {Object} spriteImgPos Obstacle position in sprite.
- * @param {Object} dimensions
- * @param {number} gapCoefficient Mutipler in determining the gap.
- * @param {number} speed
- * @param {number=} opt_xOffset
- * @param {boolean=} opt_isAltGameMode
- * @constructor
- */
-function Obstacle(
-    canvasCtx, type, spriteImgPos, dimensions, gapCoefficient, speed,
-    opt_xOffset, opt_isAltGameMode) {
-  this.canvasCtx = canvasCtx;
-  this.spritePos = spriteImgPos;
-  this.typeConfig = type;
-  this.gapCoefficient = Runner.slowDown ? gapCoefficient * 2 : gapCoefficient;
-  this.size = getRandomNum(1, Obstacle.MAX_OBSTACLE_LENGTH);
-  this.dimensions = dimensions;
-  this.remove = false;
-  this.xPos = dimensions.WIDTH + (opt_xOffset || 0);
-  this.yPos = 0;
-  this.width = 0;
-  this.collisionBoxes = [];
-  this.gap = 0;
-  this.speedOffset = 0;
-  this.altGameModeActive = opt_isAltGameMode;
-  this.imageSprite = this.typeConfig.type === 'COLLECTABLE' ?
-      Runner.altCommonImageSprite :
-      this.altGameModeActive ? Runner.altGameImageSprite :
-                               Runner.imageSprite;
-
-  // For animated obstacles.
-  this.currentFrame = 0;
-  this.timer = 0;
-
-  this.init(speed);
-}
-
-/**
- * Coefficient for calculating the maximum gap.
- */
-Obstacle.MAX_GAP_COEFFICIENT = 1.5;
-
-/**
- * Maximum obstacle grouping count.
- */
-Obstacle.MAX_OBSTACLE_LENGTH = 3;
-
-
-Obstacle.prototype = {
-  /**
-   * Initialise the DOM for the obstacle.
-   * @param {number} speed
-   */
-  init(speed) {
-    this.cloneCollisionBoxes();
-
-    // Only allow sizing if we're at the right speed.
-    if (this.size > 1 && this.typeConfig.multipleSpeed > speed) {
-      this.size = 1;
-    }
-
-    this.width = this.typeConfig.width * this.size;
-
-    // Check if obstacle can be positioned at various heights.
-    if (Array.isArray(this.typeConfig.yPos)) {
-      const yPosConfig =
-          IS_MOBILE ? this.typeConfig.yPosMobile : this.typeConfig.yPos;
-      this.yPos = yPosConfig[getRandomNum(0, yPosConfig.length - 1)];
-    } else {
-      this.yPos = this.typeConfig.yPos;
-    }
-
-    this.draw();
-
-    // Make collision box adjustments,
-    // Central box is adjusted to the size as one box.
-    //      ____        ______        ________
-    //    _|   |-|    _|     |-|    _|       |-|
-    //   | |<->| |   | |<--->| |   | |<----->| |
-    //   | | 1 | |   | |  2  | |   | |   3   | |
-    //   |_|___|_|   |_|_____|_|   |_|_______|_|
-    //
-    if (this.size > 1) {
-      this.collisionBoxes[1].width = this.width - this.collisionBoxes[0].width -
-          this.collisionBoxes[2].width;
-      this.collisionBoxes[2].x = this.width - this.collisionBoxes[2].width;
-    }
-
-    // For obstacles that go at a different speed from the horizon.
-    if (this.typeConfig.speedOffset) {
-      this.speedOffset = Math.random() > 0.5 ? this.typeConfig.speedOffset :
-                                               -this.typeConfig.speedOffset;
-    }
-
-    this.gap = this.getGap(this.gapCoefficient, speed);
-
-    // Increase gap for audio cues enabled.
-    if (Runner.audioCues) {
-      this.gap *= 2;
-    }
-  },
-
-  /**
-   * Draw and crop based on size.
-   */
-  draw() {
-    let sourceWidth = this.typeConfig.width;
-    let sourceHeight = this.typeConfig.height;
-
-    if (IS_HIDPI) {
-      sourceWidth = sourceWidth * 2;
-      sourceHeight = sourceHeight * 2;
-    }
-
-    // X position in sprite.
-    let sourceX =
-        (sourceWidth * this.size) * (0.5 * (this.size - 1)) + this.spritePos.x;
-
-    // Animation frames.
-    if (this.currentFrame > 0) {
-      sourceX += sourceWidth * this.currentFrame;
-    }
-
-    this.canvasCtx.drawImage(
-        this.imageSprite, sourceX, this.spritePos.y, sourceWidth * this.size,
-        sourceHeight, this.xPos, this.yPos, this.typeConfig.width * this.size,
-        this.typeConfig.height);
-  },
-
-  /**
-   * Obstacle frame update.
-   * @param {number} deltaTime
-   * @param {number} speed
-   */
-  update(deltaTime, speed) {
-    if (!this.remove) {
-      if (this.typeConfig.speedOffset) {
-        speed += this.speedOffset;
-      }
-      this.xPos -= Math.floor((speed * FPS / 1000) * deltaTime);
-
-      // Update frame
-      if (this.typeConfig.numFrames) {
-        this.timer += deltaTime;
-        if (this.timer >= this.typeConfig.frameRate) {
-          this.currentFrame =
-              this.currentFrame === this.typeConfig.numFrames - 1 ?
-              0 :
-              this.currentFrame + 1;
-          this.timer = 0;
-        }
-      }
-      this.draw();
-
-      if (!this.isVisible()) {
-        this.remove = true;
-      }
-    }
-  },
-
-  /**
-   * Calculate a random gap size.
-   * - Minimum gap gets wider as speed increses
-   * @param {number} gapCoefficient
-   * @param {number} speed
-   * @return {number} The gap size.
-   */
-  getGap(gapCoefficient, speed) {
-    const minGap = Math.round(
-        this.width * speed + this.typeConfig.minGap * gapCoefficient);
-    const maxGap = Math.round(minGap * Obstacle.MAX_GAP_COEFFICIENT);
-    return getRandomNum(minGap, maxGap);
-  },
-
-  /**
-   * Check if obstacle is visible.
-   * @return {boolean} Whether the obstacle is in the game area.
-   */
-  isVisible() {
-    return this.xPos + this.width > 0;
-  },
-
-  /**
-   * Make a copy of the collision boxes, since these will change based on
-   * obstacle type and size.
-   */
-  cloneCollisionBoxes() {
-    const collisionBoxes = this.typeConfig.collisionBoxes;
-
-    for (let i = collisionBoxes.length - 1; i >= 0; i--) {
-      this.collisionBoxes[i] = new CollisionBox(
-          collisionBoxes[i].x, collisionBoxes[i].y, collisionBoxes[i].width,
-          collisionBoxes[i].height);
-    }
-  },
-};
-
-
-//******************************************************************************
-/**
- * T-rex game character.
- * @param {HTMLCanvasElement} canvas
- * @param {Object} spritePos Positioning within image sprite.
- * @constructor
- */
-function Trex(canvas, spritePos) {
-  this.canvas = canvas;
-  this.canvasCtx =
-      /** @type {CanvasRenderingContext2D} */ (canvas.getContext('2d'));
-  this.spritePos = spritePos;
-  this.xPos = 0;
-  this.yPos = 0;
-  this.xInitialPos = 0;
-  // Position when on the ground.
-  this.groundYPos = 0;
-  this.currentFrame = 0;
-  this.currentAnimFrames = [];
-  this.blinkDelay = 0;
-  this.blinkCount = 0;
-  this.animStartTime = 0;
-  this.timer = 0;
-  this.msPerFrame = 1000 / FPS;
-  this.config = Object.assign(Trex.config, Trex.normalJumpConfig);
-  // Current status.
-  this.status = Trex.status.WAITING;
-  this.jumping = false;
-  this.ducking = false;
-  this.jumpVelocity = 0;
-  this.reachedMinHeight = false;
-  this.speedDrop = false;
-  this.jumpCount = 0;
-  this.jumpspotX = 0;
-  this.altGameModeEnabled = false;
-  this.flashing = false;
-
-  this.init();
-}
-
-
-/**
- * T-rex player config.
- */
-Trex.config = {
-  DROP_VELOCITY: -5,
-  FLASH_OFF: 175,
-  FLASH_ON: 100,
-  HEIGHT: 47,
-  HEIGHT_DUCK: 25,
-  INTRO_DURATION: 1500,
-  SPEED_DROP_COEFFICIENT: 3,
-  SPRITE_WIDTH: 262,
-  START_X_POS: 50,
-  WIDTH: 44,
-  WIDTH_DUCK: 59,
-};
-
-Trex.slowJumpConfig = {
-  GRAVITY: 0.25,
-  MAX_JUMP_HEIGHT: 50,
-  MIN_JUMP_HEIGHT: 45,
-  INITIAL_JUMP_VELOCITY: -20,
-};
-
-Trex.normalJumpConfig = {
-  GRAVITY: 0.6,
-  MAX_JUMP_HEIGHT: 30,
-  MIN_JUMP_HEIGHT: 30,
-  INITIAL_JUMP_VELOCITY: -10,
-};
-
-/**
- * Used in collision detection.
- * @enum {Array<CollisionBox>}
- */
-Trex.collisionBoxes = {
-  DUCKING: [new CollisionBox(1, 18, 55, 25)],
-  RUNNING: [
-    new CollisionBox(22, 0, 17, 16),
-    new CollisionBox(1, 18, 30, 9),
-    new CollisionBox(10, 35, 14, 8),
-    new CollisionBox(1, 24, 29, 5),
-    new CollisionBox(5, 30, 21, 4),
-    new CollisionBox(9, 34, 15, 4),
-  ],
-};
-
-
-/**
- * Animation states.
- * @enum {string}
- */
-Trex.status = {
-  CRASHED: 'CRASHED',
-  DUCKING: 'DUCKING',
-  JUMPING: 'JUMPING',
-  RUNNING: 'RUNNING',
-  WAITING: 'WAITING',
-};
-
-/**
- * Blinking coefficient.
- * @const
- */
-Trex.BLINK_TIMING = 7000;
-
-
-/**
- * Animation config for different states.
- * @enum {Object}
- */
-Trex.animFrames = {
-  WAITING: {
-    frames: [44, 0],
-    msPerFrame: 1000 / 3,
-  },
-  RUNNING: {
-    frames: [88, 132],
-    msPerFrame: 1000 / 12,
-  },
-  CRASHED: {
-    frames: [220],
-    msPerFrame: 1000 / 60,
-  },
-  JUMPING: {
-    frames: [0],
-    msPerFrame: 1000 / 60,
-  },
-  DUCKING: {
-    frames: [264, 323],
-    msPerFrame: 1000 / 8,
-  },
-};
-
-
-Trex.prototype = {
-  /**
-   * T-rex player initaliser.
-   * Sets the t-rex to blink at random intervals.
-   */
-  init() {
-    this.groundYPos = Runner.defaultDimensions.HEIGHT - this.config.HEIGHT -
-        Runner.config.BOTTOM_PAD;
-    this.yPos = this.groundYPos;
-    this.minJumpHeight = this.groundYPos - this.config.MIN_JUMP_HEIGHT;
-
-    this.draw(0, 0);
-    this.update(0, Trex.status.WAITING);
-  },
-
-  /**
-   * Assign the appropriate jump parameters based on the game speed.
-   */
-  enableSlowConfig: function() {
-    const jumpConfig =
-        Runner.slowDown ? Trex.slowJumpConfig : Trex.normalJumpConfig;
-    Trex.config = Object.assign(Trex.config, jumpConfig);
-
-    this.adjustAltGameConfigForSlowSpeed();
-  },
-
-  /**
-   * Enables the alternative game. Redefines the dino config.
-   * @param {Object} spritePos New positioning within image sprite.
-   */
-  enableAltGameMode: function(spritePos) {
-    this.altGameModeEnabled = true;
-    this.spritePos = spritePos;
-    const spriteDefinition = Runner.spriteDefinition['TREX'];
-
-    // Update animation frames.
-    Trex.animFrames.RUNNING.frames =
-        [spriteDefinition.RUNNING_1.x, spriteDefinition.RUNNING_2.x];
-    Trex.animFrames.CRASHED.frames = [spriteDefinition.CRASHED.x];
-
-    if (typeof spriteDefinition.JUMPING.x === 'object') {
-      Trex.animFrames.JUMPING.frames = spriteDefinition.JUMPING.x;
-    } else {
-      Trex.animFrames.JUMPING.frames = [spriteDefinition.JUMPING.x];
-    }
-
-    Trex.animFrames.DUCKING.frames =
-        [spriteDefinition.DUCKING_1.x, spriteDefinition.DUCKING_2.x];
-
-    // Update Trex config
-    Trex.config.GRAVITY = spriteDefinition.GRAVITY || Trex.config.GRAVITY;
-    Trex.config.HEIGHT = spriteDefinition.RUNNING_1.h,
-    Trex.config.INITIAL_JUMP_VELOCITY = spriteDefinition.INITIAL_JUMP_VELOCITY;
-    Trex.config.MAX_JUMP_HEIGHT = spriteDefinition.MAX_JUMP_HEIGHT;
-    Trex.config.MIN_JUMP_HEIGHT = spriteDefinition.MIN_JUMP_HEIGHT;
-    Trex.config.WIDTH = spriteDefinition.RUNNING_1.w;
-    Trex.config.WIDTH_CRASHED = spriteDefinition.CRASHED.w;
-    Trex.config.WIDTH_JUMP = spriteDefinition.JUMPING.w;
-    Trex.config.INVERT_JUMP = spriteDefinition.INVERT_JUMP;
-
-    this.adjustAltGameConfigForSlowSpeed(spriteDefinition.GRAVITY);
-    this.config = Trex.config;
-
-    // Adjust bottom horizon placement.
-    this.groundYPos = Runner.defaultDimensions.HEIGHT - this.config.HEIGHT -
-        Runner.spriteDefinition['BOTTOM_PAD'];
-    this.yPos = this.groundYPos;
-    this.reset();
-  },
-
-  /**
-   * Slow speeds adjustments for the alt game modes.
-   * @param {number=} opt_gravityValue
-   */
-  adjustAltGameConfigForSlowSpeed: function(opt_gravityValue) {
-    if (Runner.slowDown) {
-      if (opt_gravityValue) {
-        Trex.config.GRAVITY = opt_gravityValue / 1.5;
-      }
-      Trex.config.MIN_JUMP_HEIGHT *= 1.5;
-      Trex.config.MAX_JUMP_HEIGHT *= 1.5;
-      Trex.config.INITIAL_JUMP_VELOCITY =
-          Trex.config.INITIAL_JUMP_VELOCITY * 1.5;
-    }
-  },
-
-  /**
-   * Setter whether dino is flashing.
-   * @param {boolean} status
-   */
-  setFlashing: function(status) {
-    this.flashing = status;
-  },
-
-  /**
-   * Setter for the jump velocity.
-   * The approriate drop velocity is also set.
-   * @param {number} setting
-   */
-  setJumpVelocity(setting) {
-    this.config.INITIAL_JUMP_VELOCITY = -setting;
-    this.config.DROP_VELOCITY = -setting / 2;
-  },
-
-  /**
-   * Set the animation status.
-   * @param {!number} deltaTime
-   * @param {Trex.status=} opt_status Optional status to switch to.
-   */
-  update(deltaTime, opt_status) {
-    this.timer += deltaTime;
-
-    // Update the status.
-    if (opt_status) {
-      this.status = opt_status;
-      this.currentFrame = 0;
-      this.msPerFrame = Trex.animFrames[opt_status].msPerFrame;
-      this.currentAnimFrames = Trex.animFrames[opt_status].frames;
-
-      if (opt_status === Trex.status.WAITING) {
-        this.animStartTime = getTimeStamp();
-        this.setBlinkDelay();
-      }
-    }
-    // Game intro animation, T-rex moves in from the left.
-    if (this.playingIntro && this.xPos < this.config.START_X_POS) {
-      this.xPos += Math.round((this.config.START_X_POS /
-          this.config.INTRO_DURATION) * deltaTime);
-      this.xInitialPos = this.xPos;
-    }
-
-    if (this.status === Trex.status.WAITING) {
-      this.blink(getTimeStamp());
-    } else {
-      this.draw(this.currentAnimFrames[this.currentFrame], 0);
-    }
-
-    // Update the frame position.
-    if (!this.flashing && this.timer >= this.msPerFrame) {
-      this.currentFrame =
-          (this.currentFrame === this.currentAnimFrames.length - 1) ?
-          0 :
-          this.currentFrame + 1;
-      this.timer = 0;
-    }
-
-    // Speed drop becomes duck if the down key is still being pressed.
-    if (this.speedDrop && this.yPos === this.groundYPos) {
-      this.speedDrop = false;
-      this.setDuck(true);
-    }
-  },
-
-  /**
-   * Draw the t-rex to a particular position.
-   * @param {number} x
-   * @param {number} y
-   */
-  draw(x, y) {
-    let sourceX = x;
-    let sourceY = y;
-    let sourceWidth = this.ducking && this.status !== Trex.status.CRASHED ?
-        this.config.WIDTH_DUCK :
-        this.config.WIDTH;
-    let sourceHeight = this.config.HEIGHT;
-    const outputHeight = sourceHeight;
-    const outputWidth =
-        this.altGameModeEnabled && this.status === Trex.status.CRASHED ?
-        this.config.WIDTH_CRASHED :
-        this.config.WIDTH;
-
-    let jumpOffset = Runner.spriteDefinition.TREX.JUMPING.xOffset;
-
-    // Width of sprite can change on jump or crashed.
-    if (this.altGameModeEnabled) {
-      if (this.jumping && this.status !== Trex.status.CRASHED) {
-        sourceWidth = this.config.WIDTH_JUMP;
-      } else if (this.status === Trex.status.CRASHED) {
-        sourceWidth = this.config.WIDTH_CRASHED;
-      }
-    }
-
-    if (IS_HIDPI) {
-      sourceX *= 2;
-      sourceY *= 2;
-      sourceWidth *= 2;
-      sourceHeight *= 2;
-      jumpOffset *= 2;
-    }
-
-    // Adjustments for sprite sheet position.
-    sourceX += this.spritePos.x;
-    sourceY += this.spritePos.y;
-
-    // Flashing.
-    if (this.flashing) {
-      if (this.timer < this.config.FLASH_ON) {
-        this.canvasCtx.globalAlpha = 0.5;
-      } else if (this.timer > this.config.FLASH_OFF) {
-        this.timer = 0;
-      }
-    }
-
-    // Ducking.
-    if (this.ducking && this.status !== Trex.status.CRASHED) {
-      this.canvasCtx.drawImage(Runner.imageSprite, sourceX, sourceY,
-          sourceWidth, sourceHeight,
-          this.xPos, this.yPos,
-          this.config.WIDTH_DUCK, outputHeight);
-    } else if (
-        this.altGameModeEnabled && this.jumping &&
-        this.status !== Trex.status.CRASHED) {
-      // Jumping with adjustments.
-      this.canvasCtx.drawImage(
-          Runner.imageSprite, sourceX, sourceY, sourceWidth, sourceHeight,
-          this.xPos - jumpOffset, this.yPos, this.config.WIDTH_JUMP,
-          outputHeight);
-    } else {
-      // Crashed whilst ducking. Trex is standing up so needs adjustment.
-      if (this.ducking && this.status === Trex.status.CRASHED) {
-        this.xPos++;
-      }
-      // Standing / running
-      this.canvasCtx.drawImage(
-          Runner.imageSprite, sourceX, sourceY, sourceWidth, sourceHeight,
-          this.xPos, this.yPos, outputWidth, outputHeight);
-    }
-    this.canvasCtx.globalAlpha = 1;
-  },
-
-  /**
-   * Sets a random time for the blink to happen.
-   */
-  setBlinkDelay() {
-    this.blinkDelay = Math.ceil(Math.random() * Trex.BLINK_TIMING);
-  },
-
-  /**
-   * Make t-rex blink at random intervals.
-   * @param {number} time Current time in milliseconds.
-   */
-  blink(time) {
-    const deltaTime = time - this.animStartTime;
-
-    if (deltaTime >= this.blinkDelay) {
-      this.draw(this.currentAnimFrames[this.currentFrame], 0);
-
-      if (this.currentFrame === 1) {
-        // Set new random delay to blink.
-        this.setBlinkDelay();
-        this.animStartTime = time;
-        this.blinkCount++;
-      }
-    }
-  },
-
-  /**
-   * Initialise a jump.
-   * @param {number} speed
-   */
-  startJump(speed) {
-    if (!this.jumping) {
-      this.update(0, Trex.status.JUMPING);
-      // Tweak the jump velocity based on the speed.
-      this.jumpVelocity = this.config.INITIAL_JUMP_VELOCITY - (speed / 10);
-      this.jumping = true;
-      this.reachedMinHeight = false;
-      this.speedDrop = false;
-
-      if (this.config.INVERT_JUMP) {
-        this.minJumpHeight = this.groundYPos + this.config.MIN_JUMP_HEIGHT;
-      }
-    }
-  },
-
-  /**
-   * Jump is complete, falling down.
-   */
-  endJump() {
-    if (this.reachedMinHeight &&
-        this.jumpVelocity < this.config.DROP_VELOCITY) {
-      this.jumpVelocity = this.config.DROP_VELOCITY;
-    }
-  },
-
-  /**
-   * Update frame for a jump.
-   * @param {number} deltaTime
-   */
-  updateJump(deltaTime) {
-    const msPerFrame = Trex.animFrames[this.status].msPerFrame;
-    const framesElapsed = deltaTime / msPerFrame;
-
-    // Speed drop makes Trex fall faster.
-    if (this.speedDrop) {
-      this.yPos += Math.round(this.jumpVelocity *
-          this.config.SPEED_DROP_COEFFICIENT * framesElapsed);
-    } else if (this.config.INVERT_JUMP) {
-      this.yPos -= Math.round(this.jumpVelocity * framesElapsed);
-    } else {
-      this.yPos += Math.round(this.jumpVelocity * framesElapsed);
-    }
-
-    this.jumpVelocity += this.config.GRAVITY * framesElapsed;
-
-    // Minimum height has been reached.
-    if (this.config.INVERT_JUMP && (this.yPos > this.minJumpHeight) ||
-        !this.config.INVERT_JUMP && (this.yPos < this.minJumpHeight) ||
-        this.speedDrop) {
-      this.reachedMinHeight = true;
-    }
-
-    // Reached max height.
-    if (this.config.INVERT_JUMP && (this.yPos > -this.config.MAX_JUMP_HEIGHT) ||
-        !this.config.INVERT_JUMP && (this.yPos < this.config.MAX_JUMP_HEIGHT) ||
-        this.speedDrop) {
-      this.endJump();
-    }
-
-    // Back down at ground level. Jump completed.
-    if ((this.config.INVERT_JUMP && this.yPos) < this.groundYPos ||
-        (!this.config.INVERT_JUMP && this.yPos) > this.groundYPos) {
-      this.reset();
-      this.jumpCount++;
-
-      if (Runner.audioCues) {
-        Runner.generatedSoundFx.loopFootSteps();
-      }
-    }
-  },
-
-  /**
-   * Set the speed drop. Immediately cancels the current jump.
-   */
-  setSpeedDrop() {
-    this.speedDrop = true;
-    this.jumpVelocity = 1;
-  },
-
-  /**
-   * @param {boolean} isDucking
-   */
-  setDuck(isDucking) {
-    if (isDucking && this.status !== Trex.status.DUCKING) {
-      this.update(0, Trex.status.DUCKING);
-      this.ducking = true;
-    } else if (this.status === Trex.status.DUCKING) {
-      this.update(0, Trex.status.RUNNING);
-      this.ducking = false;
-    }
-  },
-
-  /**
-   * Reset the t-rex to running at start of game.
-   */
-  reset() {
-    this.xPos = this.xInitialPos;
-    this.yPos = this.groundYPos;
-    this.jumpVelocity = 0;
-    this.jumping = false;
-    this.ducking = false;
-    this.update(0, Trex.status.RUNNING);
-    this.midair = false;
-    this.speedDrop = false;
-    this.jumpCount = 0;
-  },
-};
-
-
-//******************************************************************************
-
-/**
- * Handles displaying the distance meter.
- * @param {!HTMLCanvasElement} canvas
- * @param {Object} spritePos Image position in sprite.
- * @param {number} canvasWidth
- * @constructor
- */
-function DistanceMeter(canvas, spritePos, canvasWidth) {
-  this.canvas = canvas;
-  this.canvasCtx =
-      /** @type {CanvasRenderingContext2D} */ (canvas.getContext('2d'));
-  this.image = Runner.imageSprite;
-  this.spritePos = spritePos;
-  this.x = 0;
-  this.y = 5;
-
-  this.currentDistance = 0;
-  this.maxScore = 0;
-  this.highScore = '0';
-  this.container = null;
-
-  this.digits = [];
-  this.achievement = false;
-  this.defaultString = '';
-  this.flashTimer = 0;
-  this.flashIterations = 0;
-  this.invertTrigger = false;
-  this.flashingRafId = null;
-  this.highScoreBounds = {};
-  this.highScoreFlashing = false;
-
-  this.config = DistanceMeter.config;
-  this.maxScoreUnits = this.config.MAX_DISTANCE_UNITS;
-  this.canvasWidth = canvasWidth;
-  this.init(canvasWidth);
-}
-
-
-/**
- * @enum {number}
- */
-DistanceMeter.dimensions = {
-  WIDTH: 10,
-  HEIGHT: 13,
-  DEST_WIDTH: 11,
-};
-
-
-/**
- * Y positioning of the digits in the sprite sheet.
- * X position is always 0.
- * @type {Array<number>}
- */
-DistanceMeter.yPos = [0, 13, 27, 40, 53, 67, 80, 93, 107, 120];
-
-
-/**
- * Distance meter config.
- * @enum {number}
- */
-DistanceMeter.config = {
-  // Number of digits.
-  MAX_DISTANCE_UNITS: 5,
-
-  // Distance that causes achievement animation.
-  ACHIEVEMENT_DISTANCE: 100,
-
-  // Used for conversion from pixel distance to a scaled unit.
-  COEFFICIENT: 0.025,
-
-  // Flash duration in milliseconds.
-  FLASH_DURATION: 1000 / 4,
-
-  // Flash iterations for achievement animation.
-  FLASH_ITERATIONS: 3,
-
-  // Padding around the high score hit area.
-  HIGH_SCORE_HIT_AREA_PADDING: 4,
-};
-
-
-DistanceMeter.prototype = {
-  /**
-   * Initialise the distance meter to '00000'.
-   * @param {number} width Canvas width in px.
-   */
-  init(width) {
-    let maxDistanceStr = '';
-
-    this.calcXPos(width);
-    this.maxScore = this.maxScoreUnits;
-    for (let i = 0; i < this.maxScoreUnits; i++) {
-      this.draw(i, 0);
-      this.defaultString += '0';
-      maxDistanceStr += '9';
-    }
-
-    this.maxScore = parseInt(maxDistanceStr, 10);
-  },
-
-  /**
-   * Calculate the xPos in the canvas.
-   * @param {number} canvasWidth
-   */
-  calcXPos(canvasWidth) {
-    this.x = canvasWidth - (DistanceMeter.dimensions.DEST_WIDTH *
-        (this.maxScoreUnits + 1));
-  },
-
-  /**
-   * Draw a digit to canvas.
-   * @param {number} digitPos Position of the digit.
-   * @param {number} value Digit value 0-9.
-   * @param {boolean=} opt_highScore Whether drawing the high score.
-   */
-  draw(digitPos, value, opt_highScore) {
-    let sourceWidth = DistanceMeter.dimensions.WIDTH;
-    let sourceHeight = DistanceMeter.dimensions.HEIGHT;
-    let sourceX = DistanceMeter.dimensions.WIDTH * value;
-    let sourceY = 0;
-
-    const targetX = digitPos * DistanceMeter.dimensions.DEST_WIDTH;
-    const targetY = this.y;
-    const targetWidth = DistanceMeter.dimensions.WIDTH;
-    const targetHeight = DistanceMeter.dimensions.HEIGHT;
-
-    // For high DPI we 2x source values.
-    if (IS_HIDPI) {
-      sourceWidth *= 2;
-      sourceHeight *= 2;
-      sourceX *= 2;
-    }
-
-    sourceX += this.spritePos.x;
-    sourceY += this.spritePos.y;
-
-    this.canvasCtx.save();
-
-    if (IS_RTL) {
-      if (opt_highScore) {
-        this.canvasCtx.translate(
-            this.canvasWidth -
-                (DistanceMeter.dimensions.WIDTH * (this.maxScoreUnits + 3)),
-            this.y);
-      } else {
-        this.canvasCtx.translate(
-            this.canvasWidth - DistanceMeter.dimensions.WIDTH, this.y);
-      }
-      this.canvasCtx.scale(-1, 1);
-    } else {
-      const highScoreX =
-          this.x - (this.maxScoreUnits * 2) * DistanceMeter.dimensions.WIDTH;
-      if (opt_highScore) {
-        this.canvasCtx.translate(highScoreX, this.y);
-      } else {
-        this.canvasCtx.translate(this.x, this.y);
-      }
-    }
-
-    this.canvasCtx.drawImage(
-        this.image,
-        sourceX,
-        sourceY,
-        sourceWidth,
-        sourceHeight,
-        targetX,
-        targetY,
-        targetWidth,
-        targetHeight,
-    );
-
-    this.canvasCtx.restore();
-  },
-
-  /**
-   * Covert pixel distance to a 'real' distance.
-   * @param {number} distance Pixel distance ran.
-   * @return {number} The 'real' distance ran.
-   */
-  getActualDistance(distance) {
-    return distance ? Math.round(distance * this.config.COEFFICIENT) : 0;
-  },
-
-  /**
-   * Update the distance meter.
-   * @param {number} distance
-   * @param {number} deltaTime
-   * @return {boolean} Whether the acheivement sound fx should be played.
-   */
-  update(deltaTime, distance) {
-    let paint = true;
-    let playSound = false;
-
-    if (!this.achievement) {
-      distance = this.getActualDistance(distance);
-      // Score has gone beyond the initial digit count.
-      if (distance > this.maxScore &&
-          this.maxScoreUnits === this.config.MAX_DISTANCE_UNITS) {
-        this.maxScoreUnits++;
-        this.maxScore = parseInt(this.maxScore + '9', 10);
-      } else {
-        this.distance = 0;
-      }
-
-      if (distance > 0) {
-        // Achievement unlocked.
-        if (distance % this.config.ACHIEVEMENT_DISTANCE === 0) {
-          // Flash score and play sound.
-          this.achievement = true;
-          this.flashTimer = 0;
-          playSound = true;
-        }
-
-        // Create a string representation of the distance with leading 0.
-        const distanceStr = (this.defaultString +
-            distance).substr(-this.maxScoreUnits);
-        this.digits = distanceStr.split('');
-      } else {
-        this.digits = this.defaultString.split('');
-      }
-    } else {
-      // Control flashing of the score on reaching acheivement.
-      if (this.flashIterations <= this.config.FLASH_ITERATIONS) {
-        this.flashTimer += deltaTime;
-
-        if (this.flashTimer < this.config.FLASH_DURATION) {
-          paint = false;
-        } else if (this.flashTimer > this.config.FLASH_DURATION * 2) {
-          this.flashTimer = 0;
-          this.flashIterations++;
-        }
-      } else {
-        this.achievement = false;
-        this.flashIterations = 0;
-        this.flashTimer = 0;
-      }
-    }
-
-    // Draw the digits if not flashing.
-    if (paint) {
-      for (let i = this.digits.length - 1; i >= 0; i--) {
-        this.draw(i, parseInt(this.digits[i], 10));
-      }
-    }
-
-    this.drawHighScore();
-    return playSound;
-  },
-
-  /**
-   * Draw the high score.
-   */
-  drawHighScore() {
-    if (parseInt(this.highScore, 10) > 0) {
-      this.canvasCtx.save();
-      this.canvasCtx.globalAlpha = .8;
-      for (let i = this.highScore.length - 1; i >= 0; i--) {
-        this.draw(i, parseInt(this.highScore[i], 10), true);
-      }
-      this.canvasCtx.restore();
-    }
-  },
-
-  /**
-   * Set the highscore as a array string.
-   * Position of char in the sprite: H - 10, I - 11.
-   * @param {number} distance Distance ran in pixels.
-   */
-  setHighScore(distance) {
-    distance = this.getActualDistance(distance);
-    const highScoreStr = (this.defaultString +
-        distance).substr(-this.maxScoreUnits);
-
-    this.highScore = ['10', '11', ''].concat(highScoreStr.split(''));
-  },
-
-
-  /**
-   * Whether a clicked is in the high score area.
-   * @param {Event} e Event object.
-   * @return {boolean} Whether the click was in the high score bounds.
-   */
-  hasClickedOnHighScore(e) {
-    let x = 0;
-    let y = 0;
-
-    if (e.touches) {
-      // Bounds for touch differ from pointer.
-      const canvasBounds = this.canvas.getBoundingClientRect();
-      x = e.touches[0].clientX - canvasBounds.left;
-      y = e.touches[0].clientY - canvasBounds.top;
-    } else {
-      x = e.offsetX;
-      y = e.offsetY;
-    }
-
-    this.highScoreBounds = this.getHighScoreBounds();
-    return x >= this.highScoreBounds.x && x <=
-        this.highScoreBounds.x + this.highScoreBounds.width &&
-        y >= this.highScoreBounds.y && y <=
-        this.highScoreBounds.y + this.highScoreBounds.height;
-  },
-
-  /**
-   * Get the bounding box for the high score.
-   * @return {Object} Object with x, y, width and height properties.
-   */
-  getHighScoreBounds() {
-    return {
-      x: (this.x - (this.maxScoreUnits * 2) * DistanceMeter.dimensions.WIDTH) -
-          DistanceMeter.config.HIGH_SCORE_HIT_AREA_PADDING,
-      y: this.y,
-      width: DistanceMeter.dimensions.WIDTH * (this.highScore.length + 1) +
-          DistanceMeter.config.HIGH_SCORE_HIT_AREA_PADDING,
-      height: DistanceMeter.dimensions.HEIGHT +
-          (DistanceMeter.config.HIGH_SCORE_HIT_AREA_PADDING * 2),
-    };
-  },
-
-  /**
-   * Animate flashing the high score to indicate ready for resetting.
-   * The flashing stops following this.config.FLASH_ITERATIONS x 2 flashes.
-   */
-  flashHighScore() {
-    const now = getTimeStamp();
-    const deltaTime = now - (this.frameTimeStamp || now);
-    let paint = true;
-    this.frameTimeStamp = now;
-
-    // Reached the max number of flashes.
-    if (this.flashIterations > this.config.FLASH_ITERATIONS * 2) {
-      this.cancelHighScoreFlashing();
-      return;
-    }
-
-    this.flashTimer += deltaTime;
-
-    if (this.flashTimer < this.config.FLASH_DURATION) {
-      paint = false;
-    } else if (this.flashTimer > this.config.FLASH_DURATION * 2) {
-      this.flashTimer = 0;
-      this.flashIterations++;
-    }
-
-    if (paint) {
-      this.drawHighScore();
-    } else {
-      this.clearHighScoreBounds();
-    }
-    // Frame update.
-    this.flashingRafId =
-        requestAnimationFrame(this.flashHighScore.bind(this));
-  },
-
-  /**
-   * Draw empty rectangle over high score.
-   */
-  clearHighScoreBounds() {
-    this.canvasCtx.save();
-    this.canvasCtx.fillStyle = '#fff';
-    this.canvasCtx.rect(this.highScoreBounds.x, this.highScoreBounds.y,
-        this.highScoreBounds.width, this.highScoreBounds.height);
-    this.canvasCtx.fill();
-    this.canvasCtx.restore();
-  },
-
-  /**
-   * Starts the flashing of the high score.
-   */
-  startHighScoreFlashing() {
-    this.highScoreFlashing = true;
-    this.flashHighScore();
-  },
-
-  /**
-   * Whether high score is flashing.
-   * @return {boolean}
-   */
-  isHighScoreFlashing() {
-    return this.highScoreFlashing;
-  },
-
-  /**
-   * Stop flashing the high score.
-   */
-  cancelHighScoreFlashing() {
-    if (this.flashingRafId) {
-      cancelAnimationFrame(this.flashingRafId);
-    }
-    this.flashIterations = 0;
-    this.flashTimer = 0;
-    this.highScoreFlashing = false;
-    this.clearHighScoreBounds();
-    this.drawHighScore();
-  },
-
-  /**
-   * Clear the high score.
-   */
-  resetHighScore() {
-    this.setHighScore(0);
-    this.cancelHighScoreFlashing();
-  },
-
-  /**
-   * Reset the distance meter back to '00000'.
-   */
-  reset() {
-    this.update(0, 0);
-    this.achievement = false;
-  },
-};
-
-
-//******************************************************************************
-
-
-
-
-/**
- * Background item.
- * Similar to cloud, without random y position.
- * @param {HTMLCanvasElement} canvas Canvas element.
- * @param {Object} spritePos Position of image in sprite.
- * @param {number} containerWidth
- * @param {string} type Element type.
- * @constructor
- */
-function BackgroundEl(canvas, spritePos, containerWidth, type) {
-  this.canvas = canvas;
-  this.canvasCtx =
-      /** @type {CanvasRenderingContext2D} */ (this.canvas.getContext('2d'));
-  this.spritePos = spritePos;
-  this.containerWidth = containerWidth;
-  this.xPos = containerWidth;
-  this.yPos = 0;
-  this.remove = false;
-  this.type = type;
-  this.gap =
-      getRandomNum(BackgroundEl.config.MIN_GAP, BackgroundEl.config.MAX_GAP);
-  this.animTimer = 0;
-  this.switchFrames = false;
-
-  this.spriteConfig = {};
-  this.init();
-}
-
-/**
- * Background element object config.
- * Real values assigned when game type changes.
- * @enum {number}
- */
-BackgroundEl.config = {
-  MAX_BG_ELS: 0,
-  MAX_GAP: 0,
-  MIN_GAP: 0,
-  POS: 0,
-  SPEED: 0,
-  Y_POS: 0,
-  MS_PER_FRAME: 0,  // only needed when BACKGROUND_EL.FIXED is true
-};
-
-
-BackgroundEl.prototype = {
-  /**
-   * Initialise the element setting the y position.
-   */
-  init() {
-    this.spriteConfig = Runner.spriteDefinition.BACKGROUND_EL[this.type];
-    if (this.spriteConfig.FIXED) {
-      this.xPos = this.spriteConfig.FIXED_X_POS;
-    }
-    this.yPos = BackgroundEl.config.Y_POS - this.spriteConfig.HEIGHT +
-        this.spriteConfig.OFFSET;
-    this.draw();
-  },
-
-  /**
-   * Draw the element.
-   */
-  draw() {
-    this.canvasCtx.save();
-    let sourceWidth = this.spriteConfig.WIDTH;
-    let sourceHeight = this.spriteConfig.HEIGHT;
-    let sourceX = this.spriteConfig.X_POS;
-    const outputWidth = sourceWidth;
-    const outputHeight = sourceHeight;
-
-    if (IS_HIDPI) {
-      sourceWidth *= 2;
-      sourceHeight *= 2;
-      sourceX *= 2;
-    }
-
-    this.canvasCtx.drawImage(
-        Runner.imageSprite, sourceX, this.spritePos.y, sourceWidth,
-        sourceHeight, this.xPos, this.yPos, outputWidth, outputHeight);
-
-    this.canvasCtx.restore();
-  },
-
-  /**
-   * Update the background element position.
-   * @param {number} speed
-   */
-  update(speed) {
-    if (!this.remove) {
-      if (this.spriteConfig.FIXED) {
-        this.animTimer += speed;
-        if (this.animTimer > BackgroundEl.config.MS_PER_FRAME) {
-          this.animTimer = 0;
-          this.switchFrames = !this.switchFrames;
-        }
-
-        if (this.spriteConfig.FIXED_Y_POS_1 &&
-            this.spriteConfig.FIXED_Y_POS_2) {
-          this.yPos = this.switchFrames ? this.spriteConfig.FIXED_Y_POS_1 :
-                                          this.spriteConfig.FIXED_Y_POS_2;
-        }
-      } else {
-        // Fixed speed, regardless of actual game speed.
-        this.xPos -= BackgroundEl.config.SPEED;
-      }
-      this.draw();
-
-      // Mark as removable if no longer in the canvas.
-      if (!this.isVisible()) {
-        this.remove = true;
-      }
-    }
-  },
-
-  /**
-   * Check if the element is visible on the stage.
-   * @return {boolean}
-   */
-  isVisible() {
-    return this.xPos + this.spriteConfig.WIDTH > 0;
-  },
-};
-
-
-
-//******************************************************************************
-
-/**
- * Nightmode shows a moon and stars on the horizon.
- * @param {HTMLCanvasElement} canvas
- * @param {number} spritePos
- * @param {number} containerWidth
- * @constructor
- */
-function NightMode(canvas, spritePos, containerWidth) {
-  this.spritePos = spritePos;
-  this.canvas = canvas;
-  this.canvasCtx =
-      /** @type {CanvasRenderingContext2D} */ (canvas.getContext('2d'));
-  this.xPos = containerWidth - 50;
-  this.yPos = 30;
-  this.currentPhase = 0;
-  this.opacity = 0;
-  this.containerWidth = containerWidth;
-  this.stars = [];
-  this.drawStars = false;
-  this.placeStars();
-}
-
-/**
- * @enum {number}
- */
-NightMode.config = {
-  FADE_SPEED: 0.035,
-  HEIGHT: 40,
-  MOON_SPEED: 0.25,
-  NUM_STARS: 2,
-  STAR_SIZE: 9,
-  STAR_SPEED: 0.3,
-  STAR_MAX_Y: 70,
-  WIDTH: 20,
-};
-
-NightMode.phases = [140, 120, 100, 60, 40, 20, 0];
-
-NightMode.prototype = {
-  /**
-   * Update moving moon, changing phases.
-   * @param {boolean} activated Whether night mode is activated.
-   */
-  update(activated) {
-    // Moon phase.
-    if (activated && this.opacity === 0) {
-      this.currentPhase++;
-
-      if (this.currentPhase >= NightMode.phases.length) {
-        this.currentPhase = 0;
-      }
-    }
-
-    // Fade in / out.
-    if (activated && (this.opacity < 1 || this.opacity === 0)) {
-      this.opacity += NightMode.config.FADE_SPEED;
-    } else if (this.opacity > 0) {
-      this.opacity -= NightMode.config.FADE_SPEED;
-    }
-
-    // Set moon positioning.
-    if (this.opacity > 0) {
-      this.xPos = this.updateXPos(this.xPos, NightMode.config.MOON_SPEED);
-
-      // Update stars.
-      if (this.drawStars) {
-        for (let i = 0; i < NightMode.config.NUM_STARS; i++) {
-          this.stars[i].x =
-              this.updateXPos(this.stars[i].x, NightMode.config.STAR_SPEED);
-        }
-      }
-      this.draw();
-    } else {
-      this.opacity = 0;
-      this.placeStars();
-    }
-    this.drawStars = true;
-  },
-
-  updateXPos(currentPos, speed) {
-    if (currentPos < -NightMode.config.WIDTH) {
-      currentPos = this.containerWidth;
-    } else {
-      currentPos -= speed;
-    }
-    return currentPos;
-  },
-
-  draw() {
-    let moonSourceWidth = this.currentPhase === 3 ? NightMode.config.WIDTH * 2 :
-                                                    NightMode.config.WIDTH;
-    let moonSourceHeight = NightMode.config.HEIGHT;
-    let moonSourceX = this.spritePos.x + NightMode.phases[this.currentPhase];
-    const moonOutputWidth = moonSourceWidth;
-    let starSize = NightMode.config.STAR_SIZE;
-    let starSourceX = spriteDefinitionByType.original.LDPI.STAR.x;
-
-    if (IS_HIDPI) {
-      moonSourceWidth *= 2;
-      moonSourceHeight *= 2;
-      moonSourceX = this.spritePos.x +
-          (NightMode.phases[this.currentPhase] * 2);
-      starSize *= 2;
-      starSourceX = spriteDefinitionByType.original.HDPI.STAR.x;
-    }
-
-    this.canvasCtx.save();
-    this.canvasCtx.globalAlpha = this.opacity;
-
-    // Stars.
-    if (this.drawStars) {
-      for (let i = 0; i < NightMode.config.NUM_STARS; i++) {
-        this.canvasCtx.drawImage(
-            Runner.origImageSprite, starSourceX, this.stars[i].sourceY,
-            starSize, starSize, Math.round(this.stars[i].x), this.stars[i].y,
-            NightMode.config.STAR_SIZE, NightMode.config.STAR_SIZE);
-      }
-    }
-
-    // Moon.
-    this.canvasCtx.drawImage(
-        Runner.origImageSprite, moonSourceX, this.spritePos.y, moonSourceWidth,
-        moonSourceHeight, Math.round(this.xPos), this.yPos, moonOutputWidth,
-        NightMode.config.HEIGHT);
-
-    this.canvasCtx.globalAlpha = 1;
-    this.canvasCtx.restore();
-  },
-
-  // Do star placement.
-  placeStars() {
-    const segmentSize = Math.round(this.containerWidth /
-        NightMode.config.NUM_STARS);
-
-    for (let i = 0; i < NightMode.config.NUM_STARS; i++) {
-      this.stars[i] = {};
-      this.stars[i].x = getRandomNum(segmentSize * i, segmentSize * (i + 1));
-      this.stars[i].y = getRandomNum(0, NightMode.config.STAR_MAX_Y);
-
-      if (IS_HIDPI) {
-        this.stars[i].sourceY = spriteDefinitionByType.original.HDPI.STAR.y +
-            NightMode.config.STAR_SIZE * 2 * i;
-      } else {
-        this.stars[i].sourceY = spriteDefinitionByType.original.LDPI.STAR.y +
-            NightMode.config.STAR_SIZE * i;
-      }
-    }
-  },
-
-  reset() {
-    this.currentPhase = 0;
-    this.opacity = 0;
-    this.update(false);
-  },
-
-};
-
-
-//******************************************************************************
-
-/**
- * Horizon Line.
- * Consists of two connecting lines. Randomly assigns a flat / bumpy horizon.
- * @param {HTMLCanvasElement} canvas
- * @param {Object} lineConfig Configuration object.
- * @constructor
- */
-function HorizonLine(canvas, lineConfig) {
-  let sourceX = lineConfig.SOURCE_X;
-  let sourceY = lineConfig.SOURCE_Y;
-
-  if (IS_HIDPI) {
-    sourceX *= 2;
-    sourceY *= 2;
-  }
-
-  this.spritePos = {x: sourceX, y: sourceY};
-  this.canvas = canvas;
-  this.canvasCtx =
-      /** @type {CanvasRenderingContext2D} */ (canvas.getContext('2d'));
-  this.sourceDimensions = {};
-  this.dimensions = lineConfig;
-
-  this.sourceXPos = [this.spritePos.x, this.spritePos.x +
-      this.dimensions.WIDTH];
-  this.xPos = [];
-  this.yPos = 0;
-  this.bumpThreshold = 0.5;
-
-  this.setSourceDimensions(lineConfig);
-  this.draw();
-}
-
-
-/**
- * Horizon line dimensions.
- * @enum {number}
- */
-HorizonLine.dimensions = {
-  WIDTH: 600,
-  HEIGHT: 12,
-  YPOS: 127,
-};
-
-
-HorizonLine.prototype = {
-  /**
-   * Set the source dimensions of the horizon line.
-   */
-  setSourceDimensions(newDimensions) {
-    for (const dimension in newDimensions) {
-      if (dimension !== 'SOURCE_X' && dimension !== 'SOURCE_Y') {
-        if (IS_HIDPI) {
-          if (dimension !== 'YPOS') {
-            this.sourceDimensions[dimension] = newDimensions[dimension] * 2;
-          }
-        } else {
-          this.sourceDimensions[dimension] = newDimensions[dimension];
-        }
-        this.dimensions[dimension] = newDimensions[dimension];
-      }
-    }
-
-    this.xPos = [0, newDimensions.WIDTH];
-    this.yPos = newDimensions.YPOS;
-  },
-
-  /**
-   * Return the crop x position of a type.
-   */
-  getRandomType() {
-    return Math.random() > this.bumpThreshold ? this.dimensions.WIDTH : 0;
-  },
-
-  /**
-   * Draw the horizon line.
-   */
-  draw() {
-    this.canvasCtx.drawImage(Runner.imageSprite, this.sourceXPos[0],
-        this.spritePos.y,
-        this.sourceDimensions.WIDTH, this.sourceDimensions.HEIGHT,
-        this.xPos[0], this.yPos,
-        this.dimensions.WIDTH, this.dimensions.HEIGHT);
-
-    this.canvasCtx.drawImage(Runner.imageSprite, this.sourceXPos[1],
-        this.spritePos.y,
-        this.sourceDimensions.WIDTH, this.sourceDimensions.HEIGHT,
-        this.xPos[1], this.yPos,
-        this.dimensions.WIDTH, this.dimensions.HEIGHT);
-  },
-
-  /**
-   * Update the x position of an indivdual piece of the line.
-   * @param {number} pos Line position.
-   * @param {number} increment
-   */
-  updateXPos(pos, increment) {
-    const line1 = pos;
-    const line2 = pos === 0 ? 1 : 0;
-
-    this.xPos[line1] -= increment;
-    this.xPos[line2] = this.xPos[line1] + this.dimensions.WIDTH;
-
-    if (this.xPos[line1] <= -this.dimensions.WIDTH) {
-      this.xPos[line1] += this.dimensions.WIDTH * 2;
-      this.xPos[line2] = this.xPos[line1] - this.dimensions.WIDTH;
-      this.sourceXPos[line1] = this.getRandomType() + this.spritePos.x;
-    }
-  },
-
-  /**
-   * Update the horizon line.
-   * @param {number} deltaTime
-   * @param {number} speed
-   */
-  update(deltaTime, speed) {
-    const increment = Math.floor(speed * (FPS / 1000) * deltaTime);
-
-    if (this.xPos[0] <= 0) {
-      this.updateXPos(0, increment);
-    } else {
-      this.updateXPos(1, increment);
-    }
-    this.draw();
-  },
-
-  /**
-   * Reset horizon to the starting position.
-   */
-  reset() {
-    this.xPos[0] = 0;
-    this.xPos[1] = this.dimensions.WIDTH;
-  },
-};
-
-
-//******************************************************************************
-
-/**
- * Horizon background class.
- * @param {HTMLCanvasElement} canvas
- * @param {Object} spritePos Sprite positioning.
- * @param {Object} dimensions Canvas dimensions.
- * @param {number} gapCoefficient
- * @constructor
- */
-function Horizon(canvas, spritePos, dimensions, gapCoefficient) {
-  this.canvas = canvas;
-  this.canvasCtx =
-      /** @type {CanvasRenderingContext2D} */ (this.canvas.getContext('2d'));
-  this.config = Horizon.config;
-  this.dimensions = dimensions;
-  this.gapCoefficient = gapCoefficient;
-  this.obstacles = [];
-  this.obstacleHistory = [];
-  this.horizonOffsets = [0, 0];
-  this.cloudFrequency = this.config.CLOUD_FREQUENCY;
-  this.spritePos = spritePos;
-  this.nightMode = null;
-  this.altGameModeActive = false;
-
-  // Cloud
-  this.clouds = [];
-  this.cloudSpeed = this.config.BG_CLOUD_SPEED;
-
-  // Background elements
-  this.backgroundEls = [];
-  this.lastEl = null;
-  this.backgroundSpeed = this.config.BG_CLOUD_SPEED;
-
-  // Horizon
-  this.horizonLine = null;
-  this.horizonLines = [];
-  this.init();
-}
-
-
-/**
- * Horizon config.
- * @enum {number}
- */
-Horizon.config = {
-  BG_CLOUD_SPEED: 0.2,
-  BUMPY_THRESHOLD: .3,
-  CLOUD_FREQUENCY: .5,
-  HORIZON_HEIGHT: 16,
-  MAX_CLOUDS: 6,
-};
-
-
-Horizon.prototype = {
-  /**
-   * Initialise the horizon. Just add the line and a cloud. No obstacles.
-   */
-  init() {
-    Obstacle.types = spriteDefinitionByType.original.OBSTACLES;
-    this.addCloud();
-    // Multiple Horizon lines
-    for (let i = 0; i < Runner.spriteDefinition.LINES.length; i++) {
-      this.horizonLines.push(
-          new HorizonLine(this.canvas, Runner.spriteDefinition.LINES[i]));
-    }
-
-    this.nightMode = new NightMode(this.canvas, this.spritePos.MOON,
-        this.dimensions.WIDTH);
-  },
-
-  /**
-   * Update obstacle definitions based on the speed of the game.
-   */
-  adjustObstacleSpeed: function() {
-    for (let i = 0; i < Obstacle.types.length; i++) {
-      if (Runner.slowDown) {
-        Obstacle.types[i].multipleSpeed = Obstacle.types[i].multipleSpeed / 2;
-        Obstacle.types[i].minGap *= 1.5;
-        Obstacle.types[i].minSpeed = Obstacle.types[i].minSpeed / 2;
-
-        // Convert variable y position obstacles to fixed.
-        if (typeof (Obstacle.types[i].yPos) === 'object') {
-          Obstacle.types[i].yPos = Obstacle.types[i].yPos[0];
-          Obstacle.types[i].yPosMobile = Obstacle.types[i].yPos[0];
-        }
-      }
-    }
-  },
-
-  /**
-   * Update sprites to correspond to change in sprite sheet.
-   * @param {number} spritePos
-   */
-  enableAltGameMode: function(spritePos) {
-    // Clear existing horizon objects.
-    this.clouds = [];
-    this.backgroundEls = [];
-
-    this.altGameModeActive = true;
-    this.spritePos = spritePos;
-
-    Obstacle.types = Runner.spriteDefinition.OBSTACLES;
-    this.adjustObstacleSpeed();
-
-    Obstacle.MAX_GAP_COEFFICIENT = Runner.spriteDefinition.MAX_GAP_COEFFICIENT;
-    Obstacle.MAX_OBSTACLE_LENGTH = Runner.spriteDefinition.MAX_OBSTACLE_LENGTH;
-
-    BackgroundEl.config = Runner.spriteDefinition.BACKGROUND_EL_CONFIG;
-
-    this.horizonLines = [];
-    for (let i = 0; i < Runner.spriteDefinition.LINES.length; i++) {
-      this.horizonLines.push(
-          new HorizonLine(this.canvas, Runner.spriteDefinition.LINES[i]));
-    }
-    this.reset();
-  },
-
-  /**
-   * @param {number} deltaTime
-   * @param {number} currentSpeed
-   * @param {boolean} updateObstacles Used as an override to prevent
-   *     the obstacles from being updated / added. This happens in the
-   *     ease in section.
-   * @param {boolean} showNightMode Night mode activated.
-   */
-  update(deltaTime, currentSpeed, updateObstacles, showNightMode) {
-    this.runningTime += deltaTime;
-
-    if (this.altGameModeActive) {
-      this.updateBackgroundEls(deltaTime, currentSpeed);
-    }
-
-    for (let i = 0; i < this.horizonLines.length; i++) {
-      this.horizonLines[i].update(deltaTime, currentSpeed);
-    }
-
-    if (!this.altGameModeActive || Runner.spriteDefinition.HAS_CLOUDS) {
-      this.nightMode.update(showNightMode);
-      this.updateClouds(deltaTime, currentSpeed);
-    }
-
-    if (updateObstacles) {
-      this.updateObstacles(deltaTime, currentSpeed);
-    }
-  },
-
-  /**
-   * Update background element positions. Also handles creating new elements.
-   * @param {number} elSpeed
-   * @param {Array<Object>} bgElArray
-   * @param {number} maxBgEl
-   * @param {Function} bgElAddFunction
-   * @param {number} frequency
-   */
-  updateBackgroundEl(elSpeed, bgElArray, maxBgEl, bgElAddFunction, frequency) {
-    const numElements = bgElArray.length;
-
-    if (numElements) {
-      for (let i = numElements - 1; i >= 0; i--) {
-        bgElArray[i].update(elSpeed);
-      }
-
-      const lastEl = bgElArray[numElements - 1];
-
-      // Check for adding a new element.
-      if (numElements < maxBgEl &&
-          (this.dimensions.WIDTH - lastEl.xPos) > lastEl.gap &&
-          frequency > Math.random()) {
-        bgElAddFunction();
-      }
-    } else {
-      bgElAddFunction();
-    }
-  },
-
-  /**
-   * Update the cloud positions.
-   * @param {number} deltaTime
-   * @param {number} speed
-   */
-  updateClouds(deltaTime, speed) {
-    const elSpeed = this.cloudSpeed / 1000 * deltaTime * speed;
-    this.updateBackgroundEl(
-        elSpeed, this.clouds, this.config.MAX_CLOUDS, this.addCloud.bind(this),
-        this.cloudFrequency);
-
-    // Remove expired elements.
-    this.clouds = this.clouds.filter((obj) => !obj.remove);
-  },
-
-  /**
-   * Update the background element positions.
-   * @param {number} deltaTime
-   * @param {number} speed
-   */
-  updateBackgroundEls(deltaTime, speed) {
-    this.updateBackgroundEl(
-        deltaTime, this.backgroundEls, BackgroundEl.config.MAX_BG_ELS,
-        this.addBackgroundEl.bind(this), this.cloudFrequency);
-
-    // Remove expired elements.
-    this.backgroundEls = this.backgroundEls.filter((obj) => !obj.remove);
-  },
-
-  /**
-   * Update the obstacle positions.
-   * @param {number} deltaTime
-   * @param {number} currentSpeed
-   */
-  updateObstacles(deltaTime, currentSpeed) {
-    const updatedObstacles = this.obstacles.slice(0);
-
-    for (let i = 0; i < this.obstacles.length; i++) {
-      const obstacle = this.obstacles[i];
-      obstacle.update(deltaTime, currentSpeed);
-
-      // Clean up existing obstacles.
-      if (obstacle.remove) {
-        updatedObstacles.shift();
-      }
-    }
-    this.obstacles = updatedObstacles;
-
-    if (this.obstacles.length > 0) {
-      const lastObstacle = this.obstacles[this.obstacles.length - 1];
-
-      if (lastObstacle && !lastObstacle.followingObstacleCreated &&
-          lastObstacle.isVisible() &&
-          (lastObstacle.xPos + lastObstacle.width + lastObstacle.gap) <
-          this.dimensions.WIDTH) {
-        this.addNewObstacle(currentSpeed);
-        lastObstacle.followingObstacleCreated = true;
-      }
-    } else {
-      // Create new obstacles.
-      this.addNewObstacle(currentSpeed);
-    }
-  },
-
-  removeFirstObstacle() {
-    this.obstacles.shift();
-  },
-
-  /**
-   * Add a new obstacle.
-   * @param {number} currentSpeed
-   */
-  addNewObstacle(currentSpeed) {
-    const obstacleCount =
-        Obstacle.types[Obstacle.types.length - 1].type !== 'COLLECTABLE' ||
-            (Runner.isAltGameModeEnabled() && !this.altGameModeActive ||
-             this.altGameModeActive) ?
-        Obstacle.types.length - 1 :
-        Obstacle.types.length - 2;
-    const obstacleTypeIndex =
-        obstacleCount > 0 ? getRandomNum(0, obstacleCount) : 0;
-    const obstacleType = Obstacle.types[obstacleTypeIndex];
-
-    // Check for multiples of the same type of obstacle.
-    // Also check obstacle is available at current speed.
-    if ((obstacleCount > 0 && this.duplicateObstacleCheck(obstacleType.type)) ||
-        currentSpeed < obstacleType.minSpeed) {
-      this.addNewObstacle(currentSpeed);
-    } else {
-      const obstacleSpritePos = this.spritePos[obstacleType.type];
-
-      this.obstacles.push(new Obstacle(
-          this.canvasCtx, obstacleType, obstacleSpritePos, this.dimensions,
-          this.gapCoefficient, currentSpeed, obstacleType.width,
-          this.altGameModeActive));
-
-      this.obstacleHistory.unshift(obstacleType.type);
-
-      if (this.obstacleHistory.length > 1) {
-        this.obstacleHistory.splice(Runner.config.MAX_OBSTACLE_DUPLICATION);
-      }
-    }
-  },
-
-  /**
-   * Returns whether the previous two obstacles are the same as the next one.
-   * Maximum duplication is set in config value MAX_OBSTACLE_DUPLICATION.
-   * @return {boolean}
-   */
-  duplicateObstacleCheck(nextObstacleType) {
-    let duplicateCount = 0;
-
-    for (let i = 0; i < this.obstacleHistory.length; i++) {
-      duplicateCount =
-          this.obstacleHistory[i] === nextObstacleType ? duplicateCount + 1 : 0;
-    }
-    return duplicateCount >= Runner.config.MAX_OBSTACLE_DUPLICATION;
-  },
-
-  /**
-   * Reset the horizon layer.
-   * Remove existing obstacles and reposition the horizon line.
-   */
-  reset() {
-    this.obstacles = [];
-    for (let l = 0; l < this.horizonLines.length; l++) {
-      this.horizonLines[l].reset();
-    }
-
-    this.nightMode.reset();
-  },
-
-  /**
-   * Update the canvas width and scaling.
-   * @param {number} width Canvas width.
-   * @param {number} height Canvas height.
-   */
-  resize(width, height) {
-    this.canvas.width = width;
-    this.canvas.height = height;
-  },
-
-  /**
-   * Add a new cloud to the horizon.
-   */
-  addCloud() {
-    this.clouds.push(new Cloud(this.canvas, this.spritePos.CLOUD,
-        this.dimensions.WIDTH));
-  },
-
-  /**
-   * Add a random background element to the horizon.
-   */
-  addBackgroundEl() {
-    const backgroundElTypes =
-        Object.keys(Runner.spriteDefinition.BACKGROUND_EL);
-
-    if (backgroundElTypes.length > 0) {
-      let index = getRandomNum(0, backgroundElTypes.length - 1);
-      let type = backgroundElTypes[index];
-
-      // Add variation if available.
-      while (type === this.lastEl && backgroundElTypes.length > 1) {
-        index = getRandomNum(0, backgroundElTypes.length - 1);
-        type = backgroundElTypes[index];
-      }
-
-      this.lastEl = type;
-      this.backgroundEls.push(new BackgroundEl(
-          this.canvas, this.spritePos.BACKGROUND_EL, this.dimensions.WIDTH,
-          type));
-    }
-  },
-};
+}
\ No newline at end of file
diff --git a/components/omnibox/browser/autocomplete_grouper_sections.cc b/components/omnibox/browser/autocomplete_grouper_sections.cc
index c7fc796..91bb30c 100644
--- a/components/omnibox/browser/autocomplete_grouper_sections.cc
+++ b/components/omnibox/browser/autocomplete_grouper_sections.cc
@@ -182,10 +182,20 @@
   above_keyboard_group.set_limit(above_keyboard_group.limit() - 1);
 }
 
+AndroidHubZPSSection::AndroidHubZPSSection(
+    omnibox::GroupConfigMap& group_configs)
+    : Section(10,
+              {{10, omnibox::GROUP_MOBILE_OPEN_TABS}},
+              group_configs,
+              omnibox::GroupConfig_SideType_DEFAULT_PRIMARY) {}
+
 AndroidHubNonZPSSection::AndroidHubNonZPSSection(
     omnibox::GroupConfigMap& group_configs)
-    : Section(30,
-              {{30, omnibox::GROUP_MOBILE_OPEN_TABS}},
+    : Section(25,
+              // Reserve most of the spots for open tabs.
+              {{20, omnibox::GROUP_MOBILE_OPEN_TABS},
+               // Fallback to search suggestions at the bottom of the reuslts.
+               {5, omnibox::GROUP_SEARCH}},
               group_configs,
               omnibox::GroupConfig_SideType_DEFAULT_PRIMARY) {}
 
diff --git a/components/omnibox/browser/autocomplete_grouper_sections.h b/components/omnibox/browser/autocomplete_grouper_sections.h
index f04dbf9..ee78622c3 100644
--- a/components/omnibox/browser/autocomplete_grouper_sections.h
+++ b/components/omnibox/browser/autocomplete_grouper_sections.h
@@ -102,7 +102,13 @@
   static size_t num_visible_matches_;
 };
 
-// Android prefix section for Hub search.
+// Android prefix section for Hub search (ZPS).
+class AndroidHubZPSSection : public Section {
+ public:
+  explicit AndroidHubZPSSection(omnibox::GroupConfigMap& group_configs);
+};
+
+// Android prefix section for Hub search (non-ZPS).
 class AndroidHubNonZPSSection : public Section {
  public:
   explicit AndroidHubNonZPSSection(omnibox::GroupConfigMap& group_configs);
diff --git a/components/omnibox/browser/autocomplete_result.cc b/components/omnibox/browser/autocomplete_result.cc
index 20eff2f..1b872c3 100644
--- a/components/omnibox/browser/autocomplete_result.cc
+++ b/components/omnibox/browser/autocomplete_result.cc
@@ -392,6 +392,9 @@
       } else if (omnibox::IsSearchResultsPage(page_classification)) {
         sections.push_back(
             std::make_unique<AndroidSRPZpsSection>(suggestion_groups_map_));
+      } else if (omnibox::IsAndroidHub(page_classification)) {
+        sections.push_back(
+            std::make_unique<AndroidHubZPSSection>(suggestion_groups_map_));
       } else {
         sections.push_back(
             std::make_unique<AndroidWebZpsSection>(suggestion_groups_map_));
diff --git a/components/optimization_guide/core/model_execution/on_device_model_service_controller.cc b/components/optimization_guide/core/model_execution/on_device_model_service_controller.cc
index cc47b6b9..ea439a69 100644
--- a/components/optimization_guide/core/model_execution/on_device_model_service_controller.cc
+++ b/components/optimization_guide/core/model_execution/on_device_model_service_controller.cc
@@ -227,10 +227,16 @@
       std::make_unique<SafetyChecker>(SafetyConfig(safety_config));
   opts.token_limits = GetTokenLimits();
 
+  base::WeakPtr<ModelQualityLogsUploaderService> log_uploader =
+      (config_params && config_params->logging_mode ==
+                            SessionConfigParams::LoggingMode::kAlwaysDisable
+           ? nullptr
+           : model_quality_uploader_service);
+
   has_started_session_ = true;
   return std::make_unique<SessionImpl>(
       feature, std::move(opts), std::move(execute_remote_fn),
-      optimization_guide_logger, model_quality_uploader_service, config_params);
+      optimization_guide_logger, log_uploader, config_params);
 }
 
 void OnDeviceModelServiceController::GetEstimatedPerformanceClass(
diff --git a/components/optimization_guide/core/model_execution/on_device_model_service_controller_unittest.cc b/components/optimization_guide/core/model_execution/on_device_model_service_controller_unittest.cc
index 14d7ac8a..69184ed6 100644
--- a/components/optimization_guide/core/model_execution/on_device_model_service_controller_unittest.cc
+++ b/components/optimization_guide/core/model_execution/on_device_model_service_controller_unittest.cc
@@ -38,6 +38,7 @@
 #include "components/optimization_guide/core/model_execution/test/response_holder.h"
 #include "components/optimization_guide/core/model_execution/test/test_on_device_model_component_state_manager.h"
 #include "components/optimization_guide/core/model_info.h"
+#include "components/optimization_guide/core/model_quality/test_model_quality_logs_uploader_service.h"
 #include "components/optimization_guide/core/optimization_guide_constants.h"
 #include "components/optimization_guide/core/optimization_guide_features.h"
 #include "components/optimization_guide/core/optimization_guide_logger.h"
@@ -185,6 +186,7 @@
          {features::kOnDeviceModelValidation,
           {{"on_device_model_validation_delay", "0"}}}},
         {features::internal::kModelAdaptationCompose});
+    model_execution::prefs::RegisterProfilePrefs(pref_service_.registry());
     model_execution::prefs::RegisterLocalStatePrefs(pref_service_.registry());
 
     // Fake the requirements to install the model.
@@ -3580,4 +3582,37 @@
   EXPECT_FALSE(test_controller_->IsConnectedForTesting());
 }
 
+TEST_F(OnDeviceModelServiceControllerTest, LoggingModeDefault) {
+  TestModelQualityLogsUploaderService test_uploader(&pref_service_);
+  Initialize();
+  auto session = test_controller_->CreateSession(
+      kFeature, base::DoNothing(), logger_.GetWeakPtr(),
+      test_uploader.GetWeakPtr(),
+      SessionConfigParams{.logging_mode =
+                              SessionConfigParams::LoggingMode::kDefault});
+  ASSERT_TRUE(session);
+  ResponseHolder response_holder;
+  session->ExecuteModel(UserInputRequest("input"), response_holder.callback());
+  EXPECT_TRUE(response_holder.GetFinalStatus());
+  EXPECT_TRUE(response_holder.log_entry());
+  response_holder.ClearLogEntry();
+  EXPECT_EQ(1u, test_uploader.uploaded_logs().size());
+}
+
+TEST_F(OnDeviceModelServiceControllerTest, LoggingModeAlwaysDisable) {
+  TestModelQualityLogsUploaderService test_uploader(&pref_service_);
+  Initialize();
+  auto session = test_controller_->CreateSession(
+      kFeature, base::DoNothing(), logger_.GetWeakPtr(),
+      test_uploader.GetWeakPtr(),
+      SessionConfigParams{
+          .logging_mode = SessionConfigParams::LoggingMode::kAlwaysDisable});
+  ASSERT_TRUE(session);
+  ResponseHolder response_holder;
+  session->ExecuteModel(UserInputRequest("input"), response_holder.callback());
+  EXPECT_TRUE(response_holder.GetFinalStatus());
+  response_holder.ClearLogEntry();
+  EXPECT_EQ(0u, test_uploader.uploaded_logs().size());
+}
+
 }  // namespace optimization_guide
diff --git a/components/optimization_guide/core/model_execution/test/response_holder.h b/components/optimization_guide/core/model_execution/test/response_holder.h
index ac5005b..32358e6 100644
--- a/components/optimization_guide/core/model_execution/test/response_holder.h
+++ b/components/optimization_guide/core/model_execution/test/response_holder.h
@@ -44,6 +44,8 @@
         .execution_infos();
   }
 
+  void ClearLogEntry() { log_entry_received_.reset(); }
+
  private:
   void OnResponse(OptimizationGuideModelStreamingExecutionResult result);
 
diff --git a/components/optimization_guide/core/optimization_guide_model_executor.h b/components/optimization_guide/core/optimization_guide_model_executor.h
index 539fcb2..57e3a4d4 100644
--- a/components/optimization_guide/core/optimization_guide_model_executor.h
+++ b/components/optimization_guide/core/optimization_guide_model_executor.h
@@ -103,6 +103,14 @@
   // If `execution_mode` allows, model execution will fall back to the server
   // instead of failing entirely when this timeout is reached.
   std::optional<base::TimeDelta> on_device_execution_timeout;
+
+  enum class LoggingMode {
+    // Enable logging if it's enabled for ModelBasedCapability.
+    kDefault,
+    // Always disable logging.
+    kAlwaysDisable,
+  };
+  LoggingMode logging_mode = LoggingMode::kDefault;
 };
 
 // Reasons why the on-device model was not available for use.
diff --git a/components/optimization_guide/internal b/components/optimization_guide/internal
index 131a9ad..4f82443 160000
--- a/components/optimization_guide/internal
+++ b/components/optimization_guide/internal
@@ -1 +1 @@
-Subproject commit 131a9ad09d2b447fa737fdbba2445de686328d9a
+Subproject commit 4f82443aa1ee185d26ed402bd0d0dbd969079560
diff --git a/components/optimization_guide/proto/model_validation.proto b/components/optimization_guide/proto/model_validation.proto
index b41e875..bec6b29 100644
--- a/components/optimization_guide/proto/model_validation.proto
+++ b/components/optimization_guide/proto/model_validation.proto
@@ -9,15 +9,31 @@
 
 package optimization_guide.proto;
 
+import "components/optimization_guide/proto/common_types.proto";
 import "components/optimization_guide/proto/model_execution.proto";
-import "components/optimization_guide/proto/model_quality_service.proto";
+import "components/optimization_guide/proto/model_quality_metadata.proto";
 
 message ModelValidationInput {
   // The requests for the feature to be used for validation.
   repeated ExecuteRequest requests = 2;
 }
 
+message ModelCall {
+  // The model execution request.
+  ExecuteRequest request = 1;
+
+  // The model execution response proto. Each type of model call uses a
+  // different type of response proto.
+  Any response = 2;
+
+  // The log entry containing details about how execution proceeded (errors,
+  // internal requests, model version, etc.).
+  ModelExecutionInfo model_execution_info = 3;
+}
+
 message ModelValidationOutput {
+  reserved 1;
+
   // The requests to send AI data logs to the model quality server.
-  repeated LogAiDataRequest log_ai_data_requests = 1;
+  repeated ModelCall model_calls = 2;
 }
diff --git a/components/password_manager/core/browser/password_autofill_manager.cc b/components/password_manager/core/browser/password_autofill_manager.cc
index 3e2c7d10..b6dd6f4 100644
--- a/components/password_manager/core/browser/password_autofill_manager.cc
+++ b/components/password_manager/core/browser/password_autofill_manager.cc
@@ -334,8 +334,13 @@
         const std::u16string origin =
             base::UTF8ToUTF16(GetShownOrigin(url::Origin::Create(
                 password_manager_driver_->GetLastCommittedURL())));
+#endif
+#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
         message = l10n_util::GetStringFUTF16(
             IDS_PASSWORD_MANAGER_FILLING_REAUTH, origin);
+#elif BUILDFLAG(IS_CHROMEOS)
+        message = l10n_util::GetStringFUTF16(
+            IDS_PASSWORD_MANAGER_FILLING_REAUTH_CHROMEOS, origin);
 #endif
         authenticator_->AuthenticateWithMessage(
             message,
diff --git a/components/password_manager/core/browser/password_manual_fallback_flow.cc b/components/password_manager/core/browser/password_manual_fallback_flow.cc
index 5f03870..5885c24 100644
--- a/components/password_manager/core/browser/password_manual_fallback_flow.cc
+++ b/components/password_manager/core/browser/password_manual_fallback_flow.cc
@@ -379,8 +379,13 @@
 #if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_CHROMEOS)
     const std::u16string origin = base::UTF8ToUTF16(GetShownOrigin(
         url::Origin::Create(password_manager_driver_->GetLastCommittedURL())));
+#endif
+#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
     message =
         l10n_util::GetStringFUTF16(IDS_PASSWORD_MANAGER_FILLING_REAUTH, origin);
+#elif BUILDFLAG(IS_CHROMEOS)
+    message = l10n_util::GetStringFUTF16(
+        IDS_PASSWORD_MANAGER_FILLING_REAUTH_CHROMEOS, origin);
 #endif
     authenticator_->AuthenticateWithMessage(
         message, metrics_util::TimeCallbackMediumTimes(
diff --git a/components/password_manager_strings.grdp b/components/password_manager_strings.grdp
index 546a409f..ec92e12 100644
--- a/components/password_manager_strings.grdp
+++ b/components/password_manager_strings.grdp
@@ -165,8 +165,8 @@
     </message>
   </if>
   <if expr="is_chromeos">
-    <message name="IDS_PASSWORD_MANAGER_FILLING_REAUTH" desc="Text appears in the password autofill reauthentication popup, asking user to authenticate using biometric before filling.">
-      Chrome is trying to fill your password on <ph name="APP_NAME">$1<ex>google.com</ex></ph>.
+    <message name="IDS_PASSWORD_MANAGER_FILLING_REAUTH_CHROMEOS" desc="Text appears in the password autofill reauthentication popup, asking user to authenticate using biometric before filling.">
+      Chrome browser is trying to fill your password on <ph name="APP_NAME">$1<ex>google.com</ex></ph>.
     </message>
     <message name="IDS_PASSWORD_MANAGER_BIOMETRIC_AUTHENTICATION_CONFIRMATION_TITLE_CHROMEOS" desc="Text that appears in the title of biometric authentication confirmation popup.">
       You're using your fingerprint for filling passwords
@@ -186,6 +186,9 @@
     <message name="IDS_PASSWORD_MANAGER_TURN_OFF_FILLING_REAUTH_CHROMEOS" desc="Text appears in the authentication popup, asking user to authenticate using biometric before enabling authentication for filling">
       Chrome browser will no longer require your fingerprint to autofill passwords
     </message>
+    <message name="IDS_PASSWORDS_PAGE_AUTHENTICATION_PROMPT_CHROMEOS" desc="Text appears in the authentication popup, asking user to authenticate before revealing password on the password page">
+      Chrome browser is trying to show passwords
+    </message>
   </if>
   <if expr="is_win">
     <message name="IDS_PASSWORD_MANAGER_FILLING_REAUTH" desc="Text appears in the password autofill reauthentication popup, asking user to authenticate using biometric before filling.">
diff --git a/components/password_manager_strings_grdp/IDS_PASSWORDS_PAGE_AUTHENTICATION_PROMPT_CHROMEOS.png.sha1 b/components/password_manager_strings_grdp/IDS_PASSWORDS_PAGE_AUTHENTICATION_PROMPT_CHROMEOS.png.sha1
new file mode 100644
index 0000000..0cc7aca
--- /dev/null
+++ b/components/password_manager_strings_grdp/IDS_PASSWORDS_PAGE_AUTHENTICATION_PROMPT_CHROMEOS.png.sha1
@@ -0,0 +1 @@
+0013d90d36ed1d3f9733cbec433eb15b1722e7da
\ No newline at end of file
diff --git a/components/password_manager_strings_grdp/IDS_PASSWORD_MANAGER_FILLING_REAUTH_CHROMEOS.png.sha1 b/components/password_manager_strings_grdp/IDS_PASSWORD_MANAGER_FILLING_REAUTH_CHROMEOS.png.sha1
new file mode 100644
index 0000000..c4f9ec4
--- /dev/null
+++ b/components/password_manager_strings_grdp/IDS_PASSWORD_MANAGER_FILLING_REAUTH_CHROMEOS.png.sha1
@@ -0,0 +1 @@
+a35018af0487bed85ecf0ed796edc39543c990e3
\ No newline at end of file
diff --git a/components/plus_addresses/BUILD.gn b/components/plus_addresses/BUILD.gn
index dbb5241a..5e65340a 100644
--- a/components/plus_addresses/BUILD.gn
+++ b/components/plus_addresses/BUILD.gn
@@ -6,6 +6,16 @@
 import("//components/plus_addresses/buildflags.gni")
 import("//third_party/protobuf/proto_library.gni")
 
+component("features") {
+  output_name = "plus_addresses_features"
+  defines = [ "IS_PLUS_ADDRESSES_FEATURES_IMPL" ]
+  sources = [
+    "features.cc",
+    "features.h",
+  ]
+  public_deps = [ "//base" ]
+}
+
 source_set("types") {
   sources = [
     "plus_address_types.cc",
@@ -25,6 +35,7 @@
     "plus_address_parsing_utils.h",
   ]
 
+  deps = [ ":features" ]
   public_deps = [
     ":types",
     "//base",
@@ -116,16 +127,6 @@
   ]
 }
 
-component("features") {
-  output_name = "plus_addresses_features"
-  defines = [ "IS_PLUS_ADDRESSES_FEATURES_IMPL" ]
-  sources = [
-    "features.cc",
-    "features.h",
-  ]
-  public_deps = [ "//base" ]
-}
-
 buildflag_header("plus_addresses_buildflags") {
   header = "plus_addresses_buildflags.h"
   flags = [ "PLUS_ADDRESSES_USE_INTERNAL_ANDROID_RESOURCES=$plus_addresses_use_internal_android_resources" ]
diff --git a/components/plus_addresses/features.cc b/components/plus_addresses/features.cc
index 560caf6..024f4a4 100644
--- a/components/plus_addresses/features.cc
+++ b/components/plus_addresses/features.cc
@@ -131,6 +131,12 @@
              "PlusAddressOfferCreationOnSingleUsernameForms",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
+// When enabled, we check whether the server response to a Create call returned
+// information about existing profiles and return those as the parsing result.
+BASE_FEATURE(kPlusAddressParseExistingProfilesFromCreateResponse,
+             "PlusAddressParseExistingProfilesFromCreateResponse",
+             base::FEATURE_ENABLED_BY_DEFAULT);
+
 // When enabled, plus addresses are preallocated to avoid having to query the
 // server for every reserve call.
 BASE_FEATURE(kPlusAddressPreallocation,
diff --git a/components/plus_addresses/features.h b/components/plus_addresses/features.h
index 049db89..809c9025 100644
--- a/components/plus_addresses/features.h
+++ b/components/plus_addresses/features.h
@@ -90,6 +90,9 @@
 BASE_DECLARE_FEATURE(kPlusAddressOfferCreationOnSingleUsernameForms);
 
 COMPONENT_EXPORT(PLUS_ADDRESSES_FEATURES)
+BASE_DECLARE_FEATURE(kPlusAddressParseExistingProfilesFromCreateResponse);
+
+COMPONENT_EXPORT(PLUS_ADDRESSES_FEATURES)
 BASE_DECLARE_FEATURE(kPlusAddressPreallocation);
 
 COMPONENT_EXPORT(PLUS_ADDRESSES_FEATURES)
diff --git a/components/plus_addresses/plus_address_parsing_utils.cc b/components/plus_addresses/plus_address_parsing_utils.cc
index 596f637..71e43d7 100644
--- a/components/plus_addresses/plus_address_parsing_utils.cc
+++ b/components/plus_addresses/plus_address_parsing_utils.cc
@@ -10,9 +10,11 @@
 #include <utility>
 #include <vector>
 
+#include "base/feature_list.h"
 #include "base/strings/pattern.h"
 #include "base/strings/string_number_conversions.h"
 #include "components/affiliations/core/browser/affiliation_utils.h"
+#include "components/plus_addresses/features.h"
 #include "components/plus_addresses/plus_address_types.h"
 #include "services/data_decoder/public/cpp/data_decoder.h"
 
@@ -126,14 +128,39 @@
   }
 
   // Use iterators to avoid looking up by JSON keys.
+  base::Value::List* existing_profiles = nullptr;
   for (std::pair<const std::string&, base::Value&> first_level_entry :
        response->GetDict()) {
     auto [first_key, first_val] = first_level_entry;
     if (base::MatchPattern(first_key, "*Profile") && first_val.is_dict()) {
       return ParsePlusProfileFromV1Dict(std::move(first_val.GetDict()));
     }
+    if (base::MatchPattern(first_key, "existing*Profiles") &&
+        first_val.is_list()) {
+      existing_profiles = first_val.GetIfList();
+    }
   }
-  return std::nullopt;
+  if (!existing_profiles || existing_profiles->empty() ||
+      !base::FeatureList::IsEnabled(
+          features::kPlusAddressParseExistingProfilesFromCreateResponse)) {
+    return std::nullopt;
+  }
+
+  // If kPlusAddressParseExistingProfilesFromCreateResponse is enabled, there is
+  // no entry for a newly created profile, but there is an entry for existing
+  // profiles, then we return the first existing profile. This scenario can
+  // occur if the client tries to create a plus profile on a domain for which
+  // the server already has affiliated profiles. In theory, there could even be
+  // multiple such profiles (due to changing affiliations over time), but to
+  // save complexity, we currently just pick the first profile and return it.
+  // At a later point, we may choose to add logic that picks one out of multiple
+  // profiles further downstream - in that case, we would need to change the
+  // signature of this function.
+  base::Value::Dict* first_existing_profile =
+      (*existing_profiles)[0].GetIfDict();
+  return first_existing_profile
+             ? ParsePlusProfileFromV1Dict(std::move(*first_existing_profile))
+             : std::nullopt;
 }
 
 std::optional<std::vector<PreallocatedPlusAddress>>
diff --git a/components/plus_addresses/plus_address_parsing_utils_unittest.cc b/components/plus_addresses/plus_address_parsing_utils_unittest.cc
index 958edb7..963c277 100644
--- a/components/plus_addresses/plus_address_parsing_utils_unittest.cc
+++ b/components/plus_addresses/plus_address_parsing_utils_unittest.cc
@@ -7,7 +7,9 @@
 #include <optional>
 
 #include "base/json/json_reader.h"
+#include "base/test/scoped_feature_list.h"
 #include "base/types/expected.h"
+#include "components/plus_addresses/features.h"
 #include "components/plus_addresses/plus_address_test_utils.h"
 #include "components/plus_addresses/plus_address_types.h"
 #include "services/data_decoder/public/cpp/data_decoder.h"
@@ -175,6 +177,71 @@
   EXPECT_EQ(ParsePlusProfileFromV1Create(std::move(value)), std::nullopt);
 }
 
+// Tests that parsing the create response returns the first existing profile if
+// there is no newly created profile.
+TEST(PlusAddressParsing, FromV1Create_ParseExistingPlusProfiles) {
+  base::test::ScopedFeatureList feature_list{
+      features::kPlusAddressParseExistingProfilesFromCreateResponse};
+
+  const std::string kProfileId1 = "123";
+  const std::string kProfileId2 = "123";
+  const affiliations::FacetURI kFacet =
+      affiliations::FacetURI::FromPotentiallyInvalidSpec(
+          "https://www.apple.com");
+  const std::string kPlusAddress1 = "fubar@plus.com";
+  const std::string kPlusAddress2 = "fubar2@plus.com";
+
+  std::optional<base::Value> json =
+      base::JSONReader::Read(base::ReplaceStringPlaceholders(
+          R"(
+    {
+      "existingPlusProfiles": [
+        {
+          "ProfileId": "$1",
+          "facet": "$2",
+          "plusEmail": {
+            "plusAddress": "$3",
+            "plusMode": "validMode"
+          }
+        },
+        {
+          "ProfileId": "$4",
+          "facet": "$5",
+          "plusEmail": {
+            "plusAddress": "$6",
+            "plusMode": "validMode"
+          }
+        }
+      ]
+    })",
+          {kProfileId1, kFacet.canonical_spec(), kPlusAddress1, kProfileId2,
+           kFacet.canonical_spec(), kPlusAddress2},
+          /*offsets=*/nullptr));
+  ASSERT_TRUE(json.has_value());
+  data_decoder::DataDecoder::ValueOrError value = std::move(json.value());
+  std::optional<PlusProfile> profile =
+      ParsePlusProfileFromV1Create(std::move(value));
+  EXPECT_EQ(profile,
+            PlusProfile(kProfileId1, kFacet, PlusAddress(kPlusAddress1),
+                        /*is_confirmed=*/true));
+}
+
+// Tests that parsing the create response returns `std::nullopt` if there are no
+// newly created or existing profiles.
+TEST(PlusAddressParsing, FromV1Create_ParseEmptyExistingPlusProfiles) {
+  base::test::ScopedFeatureList feature_list{
+      features::kPlusAddressParseExistingProfilesFromCreateResponse};
+
+  std::optional<base::Value> json = base::JSONReader::Read(
+      R"(
+    {
+      "existingPlusProfiles": []
+    })");
+  ASSERT_TRUE(json.has_value());
+  data_decoder::DataDecoder::ValueOrError value = std::move(json.value());
+  EXPECT_EQ(ParsePlusProfileFromV1Create(std::move(value)), std::nullopt);
+}
+
 TEST(PlusAddressParsing, ParsePreallocatedPlusAddresses) {
   std::optional<base::Value> json = base::JSONReader::Read(R"(
   {
diff --git a/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.cc b/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.cc
index fdd15d3..982d728 100644
--- a/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.cc
+++ b/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.cc
@@ -156,7 +156,7 @@
              base::Contains(
                  ad_frames_,
                  frame_host->GetParentOrOuterDocument()->GetFrameTreeNodeId()),
-             base::NotFatalUntil::M132);
+             base::NotFatalUntil::M134);
     ad_evidence.set_is_complete();
     ad_evidence_for_navigation = ad_evidence;
 
@@ -307,7 +307,7 @@
     // (regardless of the URL).
     CHECK(!(navigation_handle->GetURL().IsAboutBlank() &&
             EnsureFrameAdEvidence(navigation_handle).IndicatesAdFrame()),
-          base::NotFatalUntil::M132);
+          base::NotFatalUntil::M134);
   } else {
     CHECK(navigation_handle->IsInMainFrame() ||
               EnsureFrameAdEvidence(navigation_handle).is_complete(),
@@ -561,7 +561,7 @@
            base::Contains(ad_frames_,
                           navigation_handle->GetParentFrameOrOuterDocument()
                               ->GetFrameTreeNodeId()),
-           base::NotFatalUntil::M132);
+           base::NotFatalUntil::M134);
 
   ad_evidence.UpdateFilterListResult(
       InterpretLoadPolicyAsEvidence(load_policy));
diff --git a/components/test/data/history_embeddings/unit_tests_bundle_data.filelist b/components/test/data/history_embeddings/unit_tests_bundle_data.filelist
index 09adfdea..7d845ef 100644
--- a/components/test/data/history_embeddings/unit_tests_bundle_data.filelist
+++ b/components/test/data/history_embeddings/unit_tests_bundle_data.filelist
@@ -8,3 +8,4 @@
 //components/test/data/history_embeddings/empty_search_strings_file
 //components/test/data/history_embeddings/fake_model_file
 //components/test/data/history_embeddings/fake_search_strings_file
+//components/test/data/history_embeddings/word_match_boost_test_data
diff --git a/components/test/data/history_embeddings/word_match_boost_test_data b/components/test/data/history_embeddings/word_match_boost_test_data
new file mode 100644
index 0000000..82fb05f
--- /dev/null
+++ b/components/test/data/history_embeddings/word_match_boost_test_data
Binary files differ
diff --git a/components/viz/service/display_embedder/output_presenter_gl.cc b/components/viz/service/display_embedder/output_presenter_gl.cc
index ce3db69..e014617b 100644
--- a/components/viz/service/display_embedder/output_presenter_gl.cc
+++ b/components/viz/service/display_embedder/output_presenter_gl.cc
@@ -118,63 +118,61 @@
   // TODO(crbug.com/40239878): Add ScopedOverlayAccess::GetOverlayImage() that
   // works on all platforms.
   gl::OverlayImage overlay_image = access ? access->GetNativePixmap() : nullptr;
+  if (!overlay_plane_candidate.is_root_render_pass && !overlay_image &&
+      !overlay_plane_candidate.is_solid_color) {
+    // Allow non-root overlays to be skipped if missing for transient causes.
+    // E.g. missing overlay_image because video decoder is destroyed during
+    // navigation.
+    return;
+  }
 #elif BUILDFLAG(IS_ANDROID)
   gl::OverlayImage overlay_image =
       access ? access->GetAHardwareBufferFenceSync() : nullptr;
-#endif
-  // TODO(msisov): Once shared image factory allows creating a non backed
-  // images, remove the if condition that checks if this is a solid color
-  // overlay plane.
-  //
-  // Solid color overlays can be non-backed and are delegated for processing
-  // to underlying backend. The only backend that uses them is Wayland - it
-  // may have a protocol that asks Wayland compositor to create a solid color
-  // buffer for a client. OverlayProcessorDelegated decides if a solid color
-  // overlay is an overlay candidate and should be scheduled.
-  if (overlay_image || overlay_plane_candidate.is_solid_color) {
-#if DCHECK_IS_ON()
-    if (overlay_plane_candidate.is_solid_color) {
-      LOG_IF(FATAL, !overlay_plane_candidate.color.has_value())
-          << "Solid color quads must have color set.";
-    }
-
-    if (acquire_fence && !acquire_fence->GetGpuFenceHandle().is_null()) {
-      CHECK(access);
-      CHECK_EQ(gpu::GrContextType::kGL,
-               dependency_->GetSharedContextState()->gr_context_type());
-      CHECK(features::IsDelegatedCompositingEnabled());
-      CHECK(access->representation()->usage().Has(
-          gpu::SHARED_IMAGE_USAGE_RASTER_DELEGATED_COMPOSITING));
-    }
-#endif
-
-    // Access fence takes priority over composite fence iff it exists.
-    if (access) {
-      auto access_fence = TakeGpuFence(access->TakeAcquireFence());
-      if (access_fence) {
-        DCHECK(!acquire_fence);
-        acquire_fence = std::move(access_fence);
-      }
-    }
-
-    presenter_->ScheduleOverlayPlane(
-        std::move(overlay_image), std::move(acquire_fence),
-        gfx::OverlayPlaneData(
-            overlay_plane_candidate.plane_z_order,
-            overlay_plane_candidate.transform,
-            overlay_plane_candidate.display_rect,
-            overlay_plane_candidate.uv_rect, !overlay_plane_candidate.is_opaque,
-            ToEnclosingRect(overlay_plane_candidate.damage_rect),
-            overlay_plane_candidate.opacity,
-            overlay_plane_candidate.priority_hint,
-            overlay_plane_candidate.rounded_corners,
-            overlay_plane_candidate.color_space,
-            overlay_plane_candidate.hdr_metadata, overlay_plane_candidate.color,
-            overlay_plane_candidate.is_solid_color,
-            overlay_plane_candidate.is_root_render_pass,
-            overlay_plane_candidate.clip_rect,
-            overlay_plane_candidate.overlay_type));
+  if (!overlay_image) {
+    return;
   }
+#endif
+#if DCHECK_IS_ON()
+  if (overlay_plane_candidate.is_solid_color) {
+    LOG_IF(FATAL, !overlay_plane_candidate.color.has_value())
+        << "Solid color quads must have color set.";
+  }
+
+  if (acquire_fence && !acquire_fence->GetGpuFenceHandle().is_null()) {
+    CHECK(access);
+    CHECK_EQ(gpu::GrContextType::kGL,
+             dependency_->GetSharedContextState()->gr_context_type());
+    CHECK(features::IsDelegatedCompositingEnabled());
+    CHECK(access->representation()->usage().Has(
+        gpu::SHARED_IMAGE_USAGE_RASTER_DELEGATED_COMPOSITING));
+  }
+#endif  // DCHECK_IS_ON()
+  // Access fence takes priority over composite fence iff it exists.
+  if (access) {
+    auto access_fence = TakeGpuFence(access->TakeAcquireFence());
+    if (access_fence) {
+      DCHECK(!acquire_fence);
+      acquire_fence = std::move(access_fence);
+    }
+  }
+
+  presenter_->ScheduleOverlayPlane(
+      std::move(overlay_image), std::move(acquire_fence),
+      gfx::OverlayPlaneData(
+          overlay_plane_candidate.plane_z_order,
+          overlay_plane_candidate.transform,
+          overlay_plane_candidate.display_rect, overlay_plane_candidate.uv_rect,
+          !overlay_plane_candidate.is_opaque,
+          ToEnclosingRect(overlay_plane_candidate.damage_rect),
+          overlay_plane_candidate.opacity,
+          overlay_plane_candidate.priority_hint,
+          overlay_plane_candidate.rounded_corners,
+          overlay_plane_candidate.color_space,
+          overlay_plane_candidate.hdr_metadata, overlay_plane_candidate.color,
+          overlay_plane_candidate.is_solid_color,
+          overlay_plane_candidate.is_root_render_pass,
+          overlay_plane_candidate.clip_rect,
+          overlay_plane_candidate.overlay_type));
 #elif BUILDFLAG(IS_APPLE)
   presenter_->ScheduleCALayer(ui::CARendererLayerParams(
       overlay_plane_candidate.clip_rect.has_value(),
diff --git a/content/browser/ai/echo_ai_manager_impl.cc b/content/browser/ai/echo_ai_manager_impl.cc
index 41cc1f0..079a314 100644
--- a/content/browser/ai/echo_ai_manager_impl.cc
+++ b/content/browser/ai/echo_ai_manager_impl.cc
@@ -18,17 +18,15 @@
 
 namespace content {
 
-EchoAIManagerImpl::EchoAIManagerImpl(content::BrowserContext* browser_context,
-                                     ReceiverContext context) {}
+EchoAIManagerImpl::EchoAIManagerImpl() = default;
 
 EchoAIManagerImpl::~EchoAIManagerImpl() = default;
 
 // static
 void EchoAIManagerImpl::Create(
-    content::BrowserContext* browser_context,
     ReceiverContext context,
     mojo::PendingReceiver<blink::mojom::AIManager> receiver) {
-  static base::NoDestructor<EchoAIManagerImpl> ai(browser_context, context);
+  static base::NoDestructor<EchoAIManagerImpl> ai;
   ai->receivers_.Add(ai.get(), std::move(receiver), context);
 }
 
diff --git a/content/browser/ai/echo_ai_manager_impl.h b/content/browser/ai/echo_ai_manager_impl.h
index 60221e8..a01a5868 100644
--- a/content/browser/ai/echo_ai_manager_impl.h
+++ b/content/browser/ai/echo_ai_manager_impl.h
@@ -30,15 +30,13 @@
 
   ~EchoAIManagerImpl() override;
 
-  static void Create(content::BrowserContext* browser_context,
-                     ReceiverContext context,
+  static void Create(ReceiverContext context,
                      mojo::PendingReceiver<blink::mojom::AIManager> receiver);
 
  private:
   friend base::NoDestructor<EchoAIManagerImpl>;
 
-  EchoAIManagerImpl(content::BrowserContext* browser_context,
-                    ReceiverContext context);
+  EchoAIManagerImpl();
 
   // `blink::mojom::AIManager` implementation.
   void CanCreateAssistant(CanCreateAssistantCallback callback) override;
diff --git a/content/browser/webrtc/webrtc_capture_from_element_browsertest.cc b/content/browser/webrtc/webrtc_capture_from_element_browsertest.cc
index a7e25a62..2b554b9 100644
--- a/content/browser/webrtc/webrtc_capture_from_element_browsertest.cc
+++ b/content/browser/webrtc/webrtc_capture_from_element_browsertest.cc
@@ -124,16 +124,10 @@
   MakeTypicalCall("testCanvasCapture(draw2d);", kCanvasCaptureTestHtmlFile);
 }
 
-// TODO(crbug.com/40846825): Flaky.
+// TODO(crbug.com/40846825): Flaky on mac, windows, and linux.
 // TODO(crbug.com/362833242): Flaky on Android.
-#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_ANDROID)
-#define MAYBE_VerifyCanvasCaptureWebGLFrames \
-  DISABLED_VerifyCanvasCaptureWebGLFrames
-#else
-#define MAYBE_VerifyCanvasCaptureWebGLFrames VerifyCanvasCaptureWebGLFrames
-#endif
 IN_PROC_BROWSER_TEST_F(WebRtcCaptureFromElementBrowserTest,
-                       MAYBE_VerifyCanvasCaptureWebGLFrames) {
+                       DISABLED_VerifyCanvasCaptureWebGLFrames) {
   MakeTypicalCall("testCanvasCapture(drawWebGL);", kCanvasCaptureTestHtmlFile);
 }
 
diff --git a/content/public/browser/content_browser_client.cc b/content/public/browser/content_browser_client.cc
index a555578..b551c97 100644
--- a/content/public/browser/content_browser_client.cc
+++ b/content/public/browser/content_browser_client.cc
@@ -1772,7 +1772,7 @@
     BrowserContext* browser_context,
     std::variant<RenderFrameHost*, base::SupportsUserData*> context,
     mojo::PendingReceiver<blink::mojom::AIManager> receiver) {
-  EchoAIManagerImpl::Create(browser_context, context, std::move(receiver));
+  EchoAIManagerImpl::Create(context, std::move(receiver));
 }
 
 #if !BUILDFLAG(IS_ANDROID)
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn
index 7a8f8b5..b16333d 100644
--- a/content/test/BUILD.gn
+++ b/content/test/BUILD.gn
@@ -3657,6 +3657,7 @@
     "//content/test/gpu/unexpected_passes/",
     "//testing/flake_suppressor_common/",
     "//testing/unexpected_passes_common/",
+    "//third_party/blink/tools/blinkpy/",
   ]
 
   data_deps = [
diff --git a/content/test/gpu/PRESUBMIT.py b/content/test/gpu/PRESUBMIT.py
index 261a1b9e..dd5f566 100644
--- a/content/test/gpu/PRESUBMIT.py
+++ b/content/test/gpu/PRESUBMIT.py
@@ -16,6 +16,7 @@
     ('build', 'fuchsia', 'test'),
     ('build', 'util'),
     ('testing', ),
+    ('third_party', 'blink', 'tools'),
     ('third_party', 'catapult', 'common', 'py_utils'),
     ('third_party', 'catapult', 'devil'),
     ('third_party', 'catapult', 'telemetry'),
diff --git a/content/test/gpu/bad_machine_finder/__init__.py b/content/test/gpu/bad_machine_finder/__init__.py
index 4547f8b..b63e0d5 100644
--- a/content/test/gpu/bad_machine_finder/__init__.py
+++ b/content/test/gpu/bad_machine_finder/__init__.py
@@ -1,3 +1,14 @@
 # Copyright 2024 The Chromium Authors
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
+
+import os
+import sys
+
+CHROMIUM_SRC_DIR = os.path.join(os.path.dirname(__file__), '..', '..', '..',
+                                '..')
+BLINK_TOOLS_PATH = os.path.join(CHROMIUM_SRC_DIR, 'third_party', 'blink',
+                                'tools')
+
+if BLINK_TOOLS_PATH not in sys.path:
+  sys.path.append(BLINK_TOOLS_PATH)
diff --git a/content/test/gpu/bad_machine_finder/buganizer.py b/content/test/gpu/bad_machine_finder/buganizer.py
new file mode 100644
index 0000000..94cecea
--- /dev/null
+++ b/content/test/gpu/bad_machine_finder/buganizer.py
@@ -0,0 +1,121 @@
+# Copyright 2024 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+"""Code for interacting with Buganizer."""
+
+import datetime
+from typing import Iterable, Set
+
+from bad_machine_finder import detection
+
+from blinkpy.w3c import buganizer
+
+_AUTOMATED_COMMENT_START = 'Automated Report Of Bad Machines'
+
+
+class BuganizerException(Exception):
+  """A general exception for Buganizer-related errors."""
+
+
+class ClientNotAvailableException(BuganizerException):
+  """Indicates that a Buganzier client could not be created."""
+
+
+class BugNotAccessibleException(BuganizerException):
+  """Indicates that the specified bug could not be accessed."""
+
+
+def UpdateBug(bug_id: int,
+              mixin_grouped_bad_machines: detection.MixinGroupedBadMachines,
+              grace_period: int) -> None:
+  """Updates the given |bug_id| with bad machine results.
+
+  Will automatically omit bad machines that have previously been reported in the
+  past |grace_period| days.
+
+  Args:
+    bug_id: The Buganizer bug ID to update.
+    mixin_groupd_bad_machines: A MixinGroupedBadMachines object containing all
+        of the bad machine data to use when updating the bug.
+    grace_period: The minimum number of days between when a bad machine was
+        reported and when it can be reported again.
+  """
+  client = _GetBuganizerClient()
+
+  bad_machine_names = mixin_grouped_bad_machines.GetAllBadMachineNames()
+  recently_reported_bots = _GetRecentlyReportedBots(bug_id, client,
+                                                    bad_machine_names,
+                                                    grace_period)
+
+  markdown_components = [
+      _AUTOMATED_COMMENT_START,
+  ]
+  mixin_report_markdown = mixin_grouped_bad_machines.GenerateMarkdown(
+      bots_to_skip=recently_reported_bots)
+  if mixin_report_markdown:
+    markdown_components.append(mixin_report_markdown)
+  else:
+    markdown_components.append('No new bad machines detected')
+  markdown_comment = '\n\n'.join(markdown_components)
+
+  client.NewComment(bug_id, markdown_comment, use_markdown=True)
+
+
+def _GetRecentlyReportedBots(bug_id: int, client: buganizer.BuganizerClient,
+                             bad_machine_names: Iterable[str],
+                             grace_period: int) -> Set[str]:
+  """Retrieves the subset of |bad_machine_names| which were reported recently.
+
+  Args:
+    bug_id: The Buganizer bug ID to check.
+    client: The BuganizerClient to use for interacting with Buganizer.
+    bad_machine_names: All machine names that should be looked for within
+        recent comments on the bug.
+    grace_period: The minimum number of days since the last mention of a machine
+        on the bug for it not to be considered recently reported.
+
+  Returns:
+    A set of machine names which were reported on |bug_id| within the past
+    |grace_period| days. Guaranteed to be a subset of |bad_machine_names|.
+  """
+  comment_list = client.GetIssueComments(bug_id)
+  # GetIssueComments currently returns a dict if something goes wrong instead of
+  # raising an exception.
+  # TODO(crbug.com/361602059): Switch to catching exceptions once those are
+  # raised.
+  if isinstance(comment_list, dict):
+    raise BugNotAccessibleException(
+        f'Failed to get comments from {bug_id}: '
+        f'{comment_list.get("error", "error not provided")}')
+
+  recent_comment_bodies = []
+  for c in comment_list:
+    comment_iso_timestamp = c['timestamp']
+    # Z indicates the UTC timezone, but is not supported until Python 3.11.
+    if comment_iso_timestamp.endswith(('z', 'Z')):
+      comment_iso_timestamp = comment_iso_timestamp[:-1]
+    comment_date = datetime.datetime.fromisoformat(comment_iso_timestamp)
+    n_days_ago = (datetime.datetime.now(comment_date.tzinfo) -
+                  datetime.timedelta(days=grace_period))
+    if comment_date < n_days_ago:
+      continue
+    if _AUTOMATED_COMMENT_START not in c['comment']:
+      continue
+    recent_comment_bodies.append(c['comment'])
+
+  recently_reported_bots = set()
+  for bot_id in bad_machine_names:
+    for cb in recent_comment_bodies:
+      if bot_id in cb:
+        recently_reported_bots.add(bot_id)
+        break
+
+  return recently_reported_bots
+
+
+def _GetBuganizerClient() -> buganizer.BuganizerClient:
+  try:
+    return buganizer.BuganizerClient()
+  except Exception as e:  # pylint: disable=broad-except
+    raise ClientNotAvailableException(
+        'Failed to create Buganizer client') from e
diff --git a/content/test/gpu/bad_machine_finder/buganizer_unittest.py b/content/test/gpu/bad_machine_finder/buganizer_unittest.py
new file mode 100644
index 0000000..2f7a046
--- /dev/null
+++ b/content/test/gpu/bad_machine_finder/buganizer_unittest.py
@@ -0,0 +1,216 @@
+# Copyright 2024 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import datetime
+import typing
+from typing import Union
+import unittest
+from unittest import mock
+
+from bad_machine_finder import buganizer
+from bad_machine_finder import detection
+
+from blinkpy.w3c import buganizer as blink_buganizer
+
+# pylint: disable=protected-access
+
+
+class FakeBuganizerClient:
+
+  def __init__(self):
+    # GetIssueComments
+    self.issue_comments = []
+
+    # NewComment
+    self.comment_content = None
+
+  def GetIssueComments(self, bug_id: int) -> Union[dict, list]:
+    del bug_id  # unused.
+    return self.issue_comments
+
+  def NewComment(self, bug_id: int, comment: str, use_markdown: bool) -> None:
+    del bug_id, use_markdown  # unused.
+    self.comment_content = comment
+
+
+def _GetIsoFormatStringForNDaysAgo(num_days: int) -> str:
+  now = datetime.datetime.now()
+  n_days_ago = now - datetime.timedelta(days=num_days)
+  return n_days_ago.isoformat()
+
+
+class UpdateBugUnittest(unittest.TestCase):
+
+  def testBasic(self):
+    """Tests the basic behavior of posting an update to a bug."""
+    client = FakeBuganizerClient()
+    client.issue_comments = [
+        {
+            'timestamp':
+            _GetIsoFormatStringForNDaysAgo(1),
+            'comment':
+            '\n'.join([
+                buganizer._AUTOMATED_COMMENT_START,
+                'bot-2',
+                'bot-3',
+            ]),
+        },
+    ]
+
+    first_machine_list = detection.BadMachineList()
+    first_machine_list.AddBadMachine('bot-1', 'reason-1a')
+    first_machine_list.AddBadMachine('bot-1', 'reason-1b')
+    first_machine_list.AddBadMachine('bot-2', 'reason-2')
+
+    second_machine_list = detection.BadMachineList()
+    second_machine_list.AddBadMachine('bot-3', 'reason-3')
+    second_machine_list.AddBadMachine('bot-4', 'reason-4')
+    second_machine_list.AddBadMachine('bot-5', 'reason-5')
+
+    mgbm = detection.MixinGroupedBadMachines()
+    mgbm.AddMixinData('mixin-a', first_machine_list)
+    mgbm.AddMixinData('mixin-b', second_machine_list)
+
+    with mock.patch.object(buganizer,
+                           '_GetBuganizerClient',
+                           return_value=client):
+      buganizer.UpdateBug(1234, mgbm, 7)
+
+    expected_markdown = f"""\
+{buganizer._AUTOMATED_COMMENT_START}
+
+Bad machines for mixin-a
+  * bot-1
+    * reason-1a
+    * reason-1b
+
+Bad machines for mixin-b
+  * bot-4
+    * reason-4
+  * bot-5
+    * reason-5"""
+    self.assertEqual(client.comment_content, expected_markdown)
+
+  def testNoNewBadMachines(self):
+    """Tests behavior when all bad machines were recently reported."""
+    client = FakeBuganizerClient()
+    client.issue_comments = [
+        {
+            'timestamp':
+            _GetIsoFormatStringForNDaysAgo(1),
+            'comment':
+            '\n'.join([
+                buganizer._AUTOMATED_COMMENT_START,
+                'bot-1'
+                'bot-2',
+                'bot-3',
+                'bot-4',
+                'bot-5',
+            ]),
+        },
+    ]
+
+    first_machine_list = detection.BadMachineList()
+    first_machine_list.AddBadMachine('bot-1', 'reason-1a')
+    first_machine_list.AddBadMachine('bot-1', 'reason-1b')
+    first_machine_list.AddBadMachine('bot-2', 'reason-2')
+
+    second_machine_list = detection.BadMachineList()
+    second_machine_list.AddBadMachine('bot-3', 'reason-3')
+    second_machine_list.AddBadMachine('bot-4', 'reason-4')
+    second_machine_list.AddBadMachine('bot-5', 'reason-5')
+
+    mgbm = detection.MixinGroupedBadMachines()
+    mgbm.AddMixinData('mixin-a', first_machine_list)
+    mgbm.AddMixinData('mixin-b', second_machine_list)
+
+    with mock.patch.object(buganizer,
+                           '_GetBuganizerClient',
+                           return_value=client):
+      buganizer.UpdateBug(1234, mgbm, 7)
+
+    expected_markdown = f"""\
+{buganizer._AUTOMATED_COMMENT_START}
+
+No new bad machines detected"""
+    self.assertEqual(client.comment_content, expected_markdown)
+
+
+class GetRecentlyReportedBotsUnittest(unittest.TestCase):
+
+  def testBugNotAccessible(self):
+    """Tests behavior when accessing the bug returns an error."""
+    client = typing.cast(blink_buganizer.BuganizerClient, FakeBuganizerClient())
+    client.issue_comments = {'error': 'error_message'}
+
+    with self.assertRaisesRegex(
+        buganizer.BugNotAccessibleException,
+        'Failed to get comments from 1234: error_message'):
+      buganizer._GetRecentlyReportedBots(1234, client, [], 7)
+
+  def testBasic(self):
+    """Tests the basic behavior of finding recently reported bots."""
+    client = typing.cast(blink_buganizer.BuganizerClient, FakeBuganizerClient())
+    client.issue_comments = [
+        # Should be ignored because it's not an automated comment.
+        {
+            'timestamp': _GetIsoFormatStringForNDaysAgo(1),
+            'comment': '\n'.join([
+                'bot-1',
+                'bot-2',
+                'bot-3',
+                'bot-4',
+            ]),
+        },
+        # Should be ignored because it's too old.
+        {
+            'timestamp':
+            _GetIsoFormatStringForNDaysAgo(14),
+            'comment':
+            '\n'.join([
+                buganizer._AUTOMATED_COMMENT_START,
+                'bot-1',
+                'bot-2',
+                'bot-3',
+                'bot-4',
+            ]),
+        },
+        # Should be parsed.
+        {
+            'timestamp':
+            _GetIsoFormatStringForNDaysAgo(1),
+            'comment':
+            '\n'.join([
+                buganizer._AUTOMATED_COMMENT_START,
+                'bot-2',
+                'bot-3',
+                'bot-5',
+            ]),
+        },
+    ]
+
+    recently_reported_bots = buganizer._GetRecentlyReportedBots(
+        1234, client, {'bot-1', 'bot-2', 'bot-3', 'bot-4'}, 7)
+    self.assertEqual(recently_reported_bots, {'bot-2', 'bot-3'})
+
+  def testIsoZCompatibility(self):
+    """Tests that a trailing Z in an ISO 8601 string does not cause issues."""
+    client = typing.cast(blink_buganizer.BuganizerClient, FakeBuganizerClient())
+    client.issue_comments = [
+        {
+            'timestamp':
+            _GetIsoFormatStringForNDaysAgo(1) + 'Z',
+            'comment':
+            '\n'.join([
+                buganizer._AUTOMATED_COMMENT_START,
+                'bot-2',
+                'bot-3',
+                'bot-5',
+            ]),
+        },
+    ]
+
+    recently_reported_bots = buganizer._GetRecentlyReportedBots(
+        1234, client, {'bot-1', 'bot-2', 'bot-3', 'bot-4'}, 7)
+    self.assertEqual(recently_reported_bots, {'bot-2', 'bot-3'})
diff --git a/content/test/gpu/bad_machine_finder/detection.py b/content/test/gpu/bad_machine_finder/detection.py
index 51ede8b..fe273e32 100644
--- a/content/test/gpu/bad_machine_finder/detection.py
+++ b/content/test/gpu/bad_machine_finder/detection.py
@@ -9,6 +9,7 @@
 import logging
 import math
 import statistics
+from typing import Generator, Iterable, Optional, Set, Tuple
 
 from bad_machine_finder import tasks
 
@@ -37,6 +38,100 @@
     for bot_id, reasons in other.bad_machines.items():
       self.bad_machines[bot_id].extend(reasons)
 
+  def RemoveLowConfidenceMachines(self, num_detections: int) -> None:
+    """Removes machines that weren't flagged at least |num_detections| times.
+
+    Args:
+      num_detections: The minimum number times a machine needs to be flagged as
+          bad in order to be kept.
+    """
+    trimmed_machines = collections.defaultdict(list)
+    for bot_id, reasons in self.bad_machines.items():
+      if len(reasons) >= num_detections:
+        trimmed_machines[bot_id] = reasons
+      else:
+        logging.debug(
+            'Bot %s removed because it was only flagged by %d detection '
+            'method(s)', bot_id, len(reasons))
+    self.bad_machines = trimmed_machines
+
+  def IterMarkdown(self) -> Generator[Tuple[str, str], None, None]:
+    """Iterates over contents, producing Markdown for each machine.
+
+    Yields:
+      A tuple (bot_id, markdown). |bot_id| is the ID of the Swarming bot,
+      |markdown| is a Markdown string describing why the bot is bad.
+    """
+    # Keep a consistent order.
+    bot_ids = sorted(list(self.bad_machines.keys()))
+    for b in bot_ids:
+      markdown_components = []
+      markdown_components.append(f'  * {b}')
+      reasons = self.bad_machines[b]
+      for r in reasons:
+        markdown_components.append(f'    * {r}')
+      yield b, '\n'.join(markdown_components)
+
+
+class MixinGroupedBadMachines:
+  """Stores BadMachineLists for multiple mixins."""
+
+  def __init__(self):
+    self._bad_machines_by_mixin = {}
+
+  def AddMixinData(self, mixin_name: str,
+                   bad_machine_list: 'BadMachineList') -> None:
+    """Adds a BadMachineList for |mixin_name|.
+
+    Args:
+      mixin_name: The name of the mixin
+      bad_machine_list: The BadMachineList for the mixin
+    """
+    if mixin_name in self._bad_machines_by_mixin:
+      raise ValueError(
+          f'Bad machines for mixin {mixin_name} were already added')
+    self._bad_machines_by_mixin[mixin_name] = bad_machine_list
+
+  def GetAllBadMachineNames(self) -> Set[str]:
+    """Gets all unique bad machine names across all stored mixins.
+
+    Returns:
+      A set containing all bad machine names.
+    """
+    bad_machine_names = set()
+    for _, bad_machine_list in self._bad_machines_by_mixin.items():
+      for bot_id in bad_machine_list.bad_machines.keys():
+        bad_machine_names.add(bot_id)
+    return bad_machine_names
+
+  def GenerateMarkdown(self,
+                       bots_to_skip: Optional[Iterable[str]] = None) -> str:
+    """Generates a Markdown string describing the object's contents.
+
+    Args:
+      bots_to_skip: An optional iterable of bot names to not include in the
+          Markdown content. If not provided, all bots will be included.
+
+    Returns:
+      A Markdown string describing each bad machine for each mixin.
+    """
+    bots_to_skip = bots_to_skip or []
+    markdown_components = []
+    # Guarantee a consistent ordering.
+    for mixin_name in sorted(self._bad_machines_by_mixin.keys()):
+      bad_machine_list = self._bad_machines_by_mixin[mixin_name]
+      mixin_report_components = [
+          f'Bad machines for {mixin_name}',
+      ]
+      for bot_id, markdown in bad_machine_list.IterMarkdown():
+        if bot_id in bots_to_skip:
+          continue
+        mixin_report_components.append(markdown)
+      if len(mixin_report_components) > 1:
+        markdown_components.append('\n'.join(mixin_report_components))
+
+    return '\n\n'.join(markdown_components)
+
 
 def DetectViaStdDevOutlier(mixin_stats: tasks.MixinStats,
                            stddev_multiplier: float) -> 'BadMachineList':
diff --git a/content/test/gpu/bad_machine_finder/detection_unittest.py b/content/test/gpu/bad_machine_finder/detection_unittest.py
index 855c92a0..7bf49c7b 100644
--- a/content/test/gpu/bad_machine_finder/detection_unittest.py
+++ b/content/test/gpu/bad_machine_finder/detection_unittest.py
@@ -35,6 +35,152 @@
 
     self.assertEqual(first_list.bad_machines, expected_bad_machines)
 
+  def testRemoveLowConfidenceMachines(self):
+    """Tests that low confidence machines are correctly removed."""
+    bad_machine_list = detection.BadMachineList()
+    bad_machine_list.AddBadMachine('bot-1', 'reason-1')
+    bad_machine_list.AddBadMachine('bot-2', 'reason-2')
+    bad_machine_list.AddBadMachine('bot-2', 'reason-3')
+
+    expected_bad_machines = {
+        'bot-1': ['reason-1'],
+        'bot-2': [
+            'reason-2',
+            'reason-3',
+        ],
+    }
+    self.assertEqual(bad_machine_list.bad_machines, expected_bad_machines)
+
+    bad_machine_list.RemoveLowConfidenceMachines(2)
+    expected_bad_machines = {
+        'bot-2': [
+            'reason-2',
+            'reason-3',
+        ],
+    }
+    self.assertEqual(bad_machine_list.bad_machines, expected_bad_machines)
+
+  def testIterMarkdown(self):
+    """Tests that Markdown output is correct."""
+    bad_machine_list = detection.BadMachineList()
+    bad_machine_list.AddBadMachine('bot-2', 'reason-2')
+    bad_machine_list.AddBadMachine('bot-2', 'reason-3')
+    bad_machine_list.AddBadMachine('bot-1', 'reason-1')
+
+    bot_1_expected_markdown = """\
+  * bot-1
+    * reason-1"""
+    bot_2_expected_markdown = """\
+  * bot-2
+    * reason-2
+    * reason-3"""
+
+    expected_pairs = [
+        ('bot-1', bot_1_expected_markdown),
+        ('bot-2', bot_2_expected_markdown),
+    ]
+    self.assertEqual(list(bad_machine_list.IterMarkdown()), expected_pairs)
+
+
+class MixinGroupedBadMachinesUnittest(unittest.TestCase):
+
+  def testInputValidation(self):
+    """Tests that invalid inputs are properly caught."""
+    bad_machine_list = detection.BadMachineList()
+    mgbm = detection.MixinGroupedBadMachines()
+    mgbm.AddMixinData('mixin_name', bad_machine_list)
+    with self.assertRaisesRegex(
+        ValueError, 'Bad machines for mixin mixin_name were already added'):
+      mgbm.AddMixinData('mixin_name', bad_machine_list)
+
+  def testGetAllBadMachineNames(self):
+    """Tests that all bad machine names are properly returned."""
+    first_bad_machine_list = detection.BadMachineList()
+    first_bad_machine_list.AddBadMachine('bot-1', 'reason-1')
+    first_bad_machine_list.AddBadMachine('bot-2', 'reason-2')
+
+    second_bad_machine_list = detection.BadMachineList()
+    second_bad_machine_list.AddBadMachine('bot-2', 'reason-3')
+    second_bad_machine_list.AddBadMachine('bot-3', 'reason-4')
+
+    mgbm = detection.MixinGroupedBadMachines()
+    mgbm.AddMixinData('first', first_bad_machine_list)
+    mgbm.AddMixinData('second', second_bad_machine_list)
+
+    self.assertEqual(mgbm.GetAllBadMachineNames(), {'bot-1', 'bot-2', 'bot-3'})
+
+  def testGenerateMarkdown(self):
+    """Tests basic Markdown generation."""
+    first_bad_machine_list = detection.BadMachineList()
+    first_bad_machine_list.AddBadMachine('bot-1', 'reason-1a')
+    first_bad_machine_list.AddBadMachine('bot-1', 'reason-1b')
+    first_bad_machine_list.AddBadMachine('bot-2', 'reason-2')
+
+    second_bad_machine_list = detection.BadMachineList()
+    second_bad_machine_list.AddBadMachine('bot-3', 'reason-3')
+    second_bad_machine_list.AddBadMachine('bot-4', 'reason-4')
+
+    mgbm = detection.MixinGroupedBadMachines()
+    mgbm.AddMixinData('mixin-b', second_bad_machine_list)
+    mgbm.AddMixinData('mixin-a', first_bad_machine_list)
+
+    expected_markdown = """\
+Bad machines for mixin-a
+  * bot-1
+    * reason-1a
+    * reason-1b
+  * bot-2
+    * reason-2
+
+Bad machines for mixin-b
+  * bot-3
+    * reason-3
+  * bot-4
+    * reason-4"""
+    self.assertEqual(mgbm.GenerateMarkdown(), expected_markdown)
+
+  def testGenerateMarkdownWithSomeBotsSkipped(self):
+    """Tests Markdown generation when some bots should be skipped."""
+    first_bad_machine_list = detection.BadMachineList()
+    first_bad_machine_list.AddBadMachine('bot-1', 'reason-1a')
+    first_bad_machine_list.AddBadMachine('bot-1', 'reason-1b')
+    first_bad_machine_list.AddBadMachine('bot-2', 'reason-2')
+
+    second_bad_machine_list = detection.BadMachineList()
+    second_bad_machine_list.AddBadMachine('bot-3', 'reason-3')
+    second_bad_machine_list.AddBadMachine('bot-4', 'reason-4')
+
+    mgbm = detection.MixinGroupedBadMachines()
+    mgbm.AddMixinData('mixin-b', second_bad_machine_list)
+    mgbm.AddMixinData('mixin-a', first_bad_machine_list)
+
+    expected_markdown = """\
+Bad machines for mixin-a
+  * bot-2
+    * reason-2"""
+    self.assertEqual(
+        mgbm.GenerateMarkdown(bots_to_skip={'bot-1', 'bot-3', 'bot-4'}),
+        expected_markdown)
+
+  def testGenerateMarkdownWithAllBotsSkipped(self):
+    """Tests Markdown generation when all bots should be skipped."""
+    first_bad_machine_list = detection.BadMachineList()
+    first_bad_machine_list.AddBadMachine('bot-1', 'reason-1a')
+    first_bad_machine_list.AddBadMachine('bot-1', 'reason-1b')
+    first_bad_machine_list.AddBadMachine('bot-2', 'reason-2')
+
+    second_bad_machine_list = detection.BadMachineList()
+    second_bad_machine_list.AddBadMachine('bot-3', 'reason-3')
+    second_bad_machine_list.AddBadMachine('bot-4', 'reason-4')
+
+    mgbm = detection.MixinGroupedBadMachines()
+    mgbm.AddMixinData('mixin-b', second_bad_machine_list)
+    mgbm.AddMixinData('mixin-a', first_bad_machine_list)
+
+    self.assertEqual(
+        mgbm.GenerateMarkdown(
+            bots_to_skip={'bot-1', 'bot-2', 'bot-3', 'bot-4'}), '')
+
 
 class DetectViaStdDevOutlierUnittest(unittest.TestCase):
 
diff --git a/content/test/gpu/find_bad_machines.py b/content/test/gpu/find_bad_machines.py
index 00120cf2..dd56d10 100755
--- a/content/test/gpu/find_bad_machines.py
+++ b/content/test/gpu/find_bad_machines.py
@@ -9,6 +9,7 @@
 from typing import Dict
 
 from bad_machine_finder import bigquery
+from bad_machine_finder import buganizer
 from bad_machine_finder import detection
 from bad_machine_finder import swarming
 from bad_machine_finder import tasks
@@ -88,6 +89,18 @@
                       help=('The minimum number of detection methods that need '
                             'to flag a machine as bad in order for it to be '
                             'reported.'))
+  # Does not work locally due to auth issues reported in crbug.com/361488152.
+  parser.add_argument('--bug-id',
+                      type=int,
+                      default=0,
+                      help=('A Buganizer bug ID. If specified, the bug will be '
+                            'updated with the script results. DOES NOT '
+                            'CURRENTLY WORK LOCALLY.'))
+  parser.add_argument('--report-grace-period',
+                      type=int,
+                      default=7,
+                      help=('The number of days to wait before reporting the '
+                            'same bot to the bug again'))
 
   detection_modifiers = parser.add_argument_group(
       title='Detection Method Modifiers',
@@ -138,6 +151,10 @@
     parser.error('--sample-period must be greater than 0')
   if args.minimum_detection_method_count <= 0:
     parser.error('--minimum-detection-method-count must be greater than 0')
+  if args.bug_id < 0:
+    parser.error('--bug-id must be non-negative')
+  if args.report_grace_period < 0:
+    parser.error('--report-grace-period must be non-negative')
 
 
 def _SetLoggingVerbosity(args: argparse.Namespace) -> None:
@@ -190,24 +207,25 @@
   task_stats = swarming.GetTaskStatsForMixins(querier, dimensions_by_mixin,
                                               args.sample_period)
 
+  mixin_grouped_bad_machines = detection.MixinGroupedBadMachines()
+
   for mixin_name, mixin_stats in task_stats.items():
     bad_machine_list = _AnalyzeMixin(mixin_stats, mixin_name, args)
+    bad_machine_list.RemoveLowConfidenceMachines(
+        args.minimum_detection_method_count)
     if not bad_machine_list.bad_machines:
       continue
+    mixin_grouped_bad_machines.AddMixinData(mixin_name, bad_machine_list)
 
-    print(f'\nBad machines for {mixin_name}')
-    bot_ids = sorted(list(bad_machine_list.bad_machines.keys()))
-    for b in bot_ids:
-      reasons = bad_machine_list.bad_machines[b]
-      if len(reasons) < args.minimum_detection_method_count:
-        logging.debug(
-            'Bot %s skipped because it was only flagged by %d detection '
-            'method(s)', b, len(reasons))
-        continue
+  markdown = mixin_grouped_bad_machines.GenerateMarkdown()
+  if not markdown:
+    print('No bad machines detected')
+  else:
+    print(markdown)
 
-      print(f'  {b}')
-      for r in reasons:
-        print(f'    * {r}')
+  if args.bug_id:
+    buganizer.UpdateBug(args.bug_id, mixin_grouped_bad_machines,
+                        args.report_grace_period)
 
 
 if __name__ == '__main__':
diff --git a/content/test/gpu/run_pytype.py b/content/test/gpu/run_pytype.py
index 3df7c78..6aae2ab 100755
--- a/content/test/gpu/run_pytype.py
+++ b/content/test/gpu/run_pytype.py
@@ -22,6 +22,7 @@
     ('build', 'fuchsia', 'test'),
     ('build', 'util'),
     ('testing', ),
+    ('third_party', 'blink', 'tools'),
     ('third_party', 'catapult', 'common', 'py_utils'),
     ('third_party', 'catapult', 'devil'),
     ('third_party', 'catapult', 'telemetry'),
diff --git a/crypto/fake_apple_keychain_v2.mm b/crypto/fake_apple_keychain_v2.mm
index f8cf76d..0fa4ca0 100644
--- a/crypto/fake_apple_keychain_v2.mm
+++ b/crypto/fake_apple_keychain_v2.mm
@@ -184,6 +184,9 @@
   CFTypeRef query_application_tag =
       CFDictionaryGetValue(query, kSecAttrApplicationTag);
 
+  CFStringRef query_attr_service =
+      base::apple::GetValueFromDictionary<CFStringRef>(query, kSecAttrService);
+
   // Filter the items based on `query`.
   base::apple::ScopedCFTypeRef<CFMutableArrayRef> items(
       CFArrayCreateMutable(nullptr, items_.size(), &kCFTypeArrayCallBacks));
@@ -205,13 +208,19 @@
             item.get(), kSecAttrApplicationLabel);
     CFTypeRef item_application_tag =
         CFDictionaryGetValue(item.get(), kSecAttrApplicationTag);
+    CFStringRef item_attr_service =
+        base::apple::GetValueFromDictionary<CFStringRef>(item.get(),
+                                                         kSecAttrService);
     if ((query_label && (!item_label || !CFEqual(query_label, item_label))) ||
         (query_application_label &&
          (!item_application_label ||
           !CFEqual(query_application_label, item_application_label))) ||
         (query_application_tag &&
          (!item_application_tag ||
-          !CFEqual(query_application_tag, item_application_tag)))) {
+          !CFEqual(query_application_tag, item_application_tag))) ||
+        (query_attr_service &&
+         (!item_attr_service ||
+          !CFEqual(query_attr_service, item_attr_service)))) {
       continue;
     }
     if (match_all) {
diff --git a/device/bluetooth/floss/bluetooth_adapter_floss.cc b/device/bluetooth/floss/bluetooth_adapter_floss.cc
index 8f4f1a5..8e1ae2cb 100644
--- a/device/bluetooth/floss/bluetooth_adapter_floss.cc
+++ b/device/bluetooth/floss/bluetooth_adapter_floss.cc
@@ -164,8 +164,14 @@
   FlossDBusManager::Get()->GetManagerClient()->RemoveObserver(this);
   dbus_is_shutdown_ = true;
 
-  for (const auto& [key, scanner] : scanners_) {
-    scanner->OnRelease();
+  // Copy scanners_ to avoid iterating over it while it's being modified.
+  std::map<device::BluetoothUUID,
+           base::WeakPtr<BluetoothLowEnergyScanSessionFloss>>
+      scanners_copy(scanners_);
+  for (const auto& [_, scanner] : scanners_copy) {
+    if (scanner) {
+      scanner->OnRelease();
+    }
   }
   scanners_.clear();
 }
diff --git a/device/fido/cable/v2_handshake.cc b/device/fido/cable/v2_handshake.cc
index bed1fd6..bb88cae 100644
--- a/device/fido/cable/v2_handshake.cc
+++ b/device/fido/cable/v2_handshake.cc
@@ -17,6 +17,7 @@
 #include <type_traits>
 
 #include "base/base64url.h"
+#include "base/feature_list.h"
 #include "base/functional/overloaded.h"
 #include "base/numerics/byte_conversions.h"
 #include "base/numerics/safe_conversions.h"
@@ -30,6 +31,7 @@
 #include "components/device_event_log/device_event_log.h"
 #include "crypto/aead.h"
 #include "device/fido/cable/v2_constants.h"
+#include "device/fido/features.h"
 #include "device/fido/fido_constants.h"
 #include "device/fido/fido_parsing_utils.h"
 #include "third_party/boringssl/src/include/openssl/aes.h"
@@ -434,7 +436,8 @@
 
   qr_contents.emplace(3, static_cast<int64_t>(base::Time::Now().ToTimeT()));
 
-  qr_contents.emplace(4, true);  // client supports storing linking information.
+  qr_contents.emplace(
+      4, base::FeatureList::IsEnabled(device::kWebAuthnHybridLinking));
 
   qr_contents.emplace(5, RequestTypeToString(request_type));
 
diff --git a/device/fido/cable/v2_handshake_unittest.cc b/device/fido/cable/v2_handshake_unittest.cc
index 035019e..bafbb8c 100644
--- a/device/fido/cable/v2_handshake_unittest.cc
+++ b/device/fido/cable/v2_handshake_unittest.cc
@@ -14,19 +14,20 @@
 #include "base/containers/contains.h"
 #include "base/rand_util.h"
 #include "base/ranges/algorithm.h"
+#include "base/test/scoped_feature_list.h"
 #include "components/cbor/reader.h"
 #include "components/cbor/values.h"
 #include "components/cbor/writer.h"
 #include "crypto/random.h"
 #include "device/fido/cable/cable_discovery_data.h"
+#include "device/fido/features.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/boringssl/src/include/openssl/ec.h"
 #include "third_party/boringssl/src/include/openssl/ec_key.h"
 #include "third_party/boringssl/src/include/openssl/obj.h"
 #include "url/gurl.h"
 
-namespace device {
-namespace cablev2 {
+namespace device::cablev2 {
 
 namespace {
 
@@ -88,29 +89,35 @@
 }
 
 TEST(CableV2Encoding, QRs) {
-  std::array<uint8_t, kQRKeySize> qr_key;
-  crypto::RandBytes(qr_key);
-  std::string url = qr::Encode(qr_key, FidoRequestType::kMakeCredential);
-  const std::optional<qr::Components> decoded = qr::Parse(url);
-  ASSERT_TRUE(decoded.has_value()) << url;
-  static_assert(EXTENT(qr_key) >= EXTENT(decoded->secret), "");
-  EXPECT_EQ(memcmp(decoded->secret.data(),
-                   &qr_key[qr_key.size() - decoded->secret.size()],
-                   decoded->secret.size()),
-            0);
-  // There are two registered domains at the time of writing the test. That
-  // number should only grow over time.
-  EXPECT_GE(decoded->num_known_domains, 2u);
+  for (bool supports_linking : {false, true}) {
+    SCOPED_TRACE(supports_linking);
+    base::test::ScopedFeatureList scoped_feature_list;
+    scoped_feature_list.InitWithFeatureState(device::kWebAuthnHybridLinking,
+                                             supports_linking);
+    std::array<uint8_t, kQRKeySize> qr_key;
+    crypto::RandBytes(qr_key);
+    std::string url = qr::Encode(qr_key, FidoRequestType::kMakeCredential);
+    const std::optional<qr::Components> decoded = qr::Parse(url);
+    ASSERT_TRUE(decoded.has_value()) << url;
+    static_assert(EXTENT(qr_key) >= EXTENT(decoded->secret), "");
+    EXPECT_EQ(memcmp(decoded->secret.data(),
+                     &qr_key[qr_key.size() - decoded->secret.size()],
+                     decoded->secret.size()),
+              0);
+    // There are two registered domains at the time of writing the test. That
+    // number should only grow over time.
+    EXPECT_GE(decoded->num_known_domains, 2u);
 
-  // Chromium always sets this flag.
-  EXPECT_TRUE(decoded->supports_linking.value_or(false));
+    // Chromium always sets this flag.
+    EXPECT_EQ(decoded->supports_linking.value_or(false), supports_linking);
 
-  EXPECT_EQ(decoded->request_type,
-            RequestType(FidoRequestType::kMakeCredential));
+    EXPECT_EQ(decoded->request_type,
+              RequestType(FidoRequestType::kMakeCredential));
 
-  url[0] ^= 4;
-  EXPECT_FALSE(qr::Parse(url));
-  EXPECT_FALSE(qr::Parse("nonsense"));
+    url[0] ^= 4;
+    EXPECT_FALSE(qr::Parse(url));
+    EXPECT_FALSE(qr::Parse("nonsense"));
+  }
 }
 
 TEST(CableV2Encoding, KnownQRs) {
@@ -660,5 +667,5 @@
 }
 
 }  // namespace
-}  // namespace cablev2
-}  // namespace device
+
+}  // namespace device::cablev2
diff --git a/device/fido/enclave/icloud_recovery_key_mac.mm b/device/fido/enclave/icloud_recovery_key_mac.mm
index 05dfed2..88319b2 100644
--- a/device/fido/enclave/icloud_recovery_key_mac.mm
+++ b/device/fido/enclave/icloud_recovery_key_mac.mm
@@ -35,9 +35,12 @@
 using base::apple::CFToNSPtrCast;
 using base::apple::NSToCFPtrCast;
 
-// The kSecAttrServiceValue must match the value used in IdentityKit so that
-// these keys can be used as a recovery factor for folsom as well.
-constexpr char kAttrService[] = "com.google.common.folsom.cloud.private";
+// The kSecAttrServiceValue for new credentials must include the security
+// domain. However, keys created before M131 don't have it, so we need to query
+// without the security domain as well.
+constexpr char kAttrLegacyService[] = "com.google.common.folsom.cloud.private";
+constexpr char kAttrHwProtectedService[] =
+    "com.google.common.folsom.cloud.private.hw_protected";
 
 // The value for kSecAttrType for all folsom data on the keychain. This is to
 // ensure only Folsom data is returned from keychain queries, even when the
@@ -57,10 +60,11 @@
   return [NSData dataWithBytes:bytes.data() length:bytes.size()];
 }
 
-NSMutableDictionary* GetDefaultQuery(std::string_view keychain_access_group) {
+NSMutableDictionary* GetDefaultQuery(std::string_view keychain_access_group,
+                                     std::string_view service) {
   return [NSMutableDictionary dictionaryWithDictionary:@{
     CFToNSPtrCast(kSecAttrSynchronizable) : @YES,
-    CFToNSPtrCast(kSecAttrService) : base::SysUTF8ToNSString(kAttrService),
+    CFToNSPtrCast(kSecAttrService) : base::SysUTF8ToNSString(service),
     CFToNSPtrCast(kSecClass) : CFToNSPtrCast(kSecClassGenericPassword),
     CFToNSPtrCast(kSecAttrType) : @(kSecAttrTypeFolsom),
     CFToNSPtrCast(kSecAttrAccessGroup) :
@@ -70,6 +74,46 @@
   }];
 }
 
+std::vector<std::unique_ptr<trusted_vault::SecureBoxKeyPair>>
+RetrieveKeysInternal(std::string_view keychain_access_group,
+                     std::string_view service) {
+  NSDictionary* query = GetDefaultQuery(keychain_access_group, service);
+  [query setValuesForKeysWithDictionary:@{
+    CFToNSPtrCast(kSecMatchLimit) : CFToNSPtrCast(kSecMatchLimitAll),
+    CFToNSPtrCast(kSecReturnData) : @YES,
+    CFToNSPtrCast(kSecReturnRef) : @YES,
+    CFToNSPtrCast(kSecReturnAttributes) : @YES,
+  }];
+  base::apple::ScopedCFTypeRef<CFTypeRef> result;
+  OSStatus status = crypto::AppleKeychainV2::GetInstance().ItemCopyMatching(
+      NSToCFPtrCast(query), result.InitializeInto());
+  std::vector<std::unique_ptr<trusted_vault::SecureBoxKeyPair>> ret;
+  if (status == errSecItemNotFound) {
+    return ret;
+  }
+  if (status != errSecSuccess) {
+    FIDO_LOG(ERROR) << "Could not retrieve iCloud recovery key: " << status;
+    return ret;
+  }
+  CFArrayRef items = base::apple::CFCastStrict<CFArrayRef>(result.get());
+  ret.reserve(CFArrayGetCount(items));
+  for (CFIndex i = 0; i < CFArrayGetCount(items); ++i) {
+    CFDictionaryRef item = base::apple::CFCastStrict<CFDictionaryRef>(
+        CFArrayGetValueAtIndex(items, i));
+    CFDataRef key = base::apple::CFCastStrict<CFDataRef>(
+        CFDictionaryGetValue(item, kSecValueData));
+    std::unique_ptr<trusted_vault::SecureBoxKeyPair> key_pair =
+        trusted_vault::SecureBoxKeyPair::CreateByPrivateKeyImport(
+            base::apple::CFDataToSpan(key));
+    if (!key_pair) {
+      FIDO_LOG(ERROR) << "iCloud recovery key is corrupted, skipping";
+      continue;
+    }
+    ret.emplace_back(std::move(key_pair));
+  }
+  return ret;
+}
+
 }  // namespace
 
 ICloudRecoveryKey::ICloudRecoveryKey(
@@ -124,7 +168,8 @@
   std::unique_ptr<trusted_vault::SecureBoxKeyPair> key =
       trusted_vault::SecureBoxKeyPair::GenerateRandom();
 
-  NSMutableDictionary* attributes = GetDefaultQuery(keychain_access_group);
+  NSMutableDictionary* attributes =
+      GetDefaultQuery(keychain_access_group, kAttrHwProtectedService);
   [attributes setValuesForKeysWithDictionary:@{
     CFToNSPtrCast(kSecAttrAccount) : EncodePublicKey(key->public_key()),
     CFToNSPtrCast(kSecValueData) : EncodePrivateKey(key->private_key()),
@@ -142,39 +187,18 @@
 // static
 std::vector<std::unique_ptr<ICloudRecoveryKey>>
 ICloudRecoveryKey::RetrieveKeysSlowly(std::string_view keychain_access_group) {
-  NSDictionary* query = GetDefaultQuery(keychain_access_group);
-  [query setValuesForKeysWithDictionary:@{
-    CFToNSPtrCast(kSecMatchLimit) : CFToNSPtrCast(kSecMatchLimitAll),
-    CFToNSPtrCast(kSecReturnData) : @YES,
-    CFToNSPtrCast(kSecReturnRef) : @YES,
-    CFToNSPtrCast(kSecReturnAttributes) : @YES,
-  }];
-  base::apple::ScopedCFTypeRef<CFTypeRef> result;
-  OSStatus status = crypto::AppleKeychainV2::GetInstance().ItemCopyMatching(
-      NSToCFPtrCast(query), result.InitializeInto());
+  std::vector<std::unique_ptr<trusted_vault::SecureBoxKeyPair>> hw_keys =
+      RetrieveKeysInternal(keychain_access_group, kAttrHwProtectedService);
+  // Keys created before M131 use the "legacy" service tag.
+  std::vector<std::unique_ptr<trusted_vault::SecureBoxKeyPair>> legacy_keys =
+      RetrieveKeysInternal(keychain_access_group, kAttrLegacyService);
   std::vector<std::unique_ptr<ICloudRecoveryKey>> ret;
-  if (status == errSecItemNotFound) {
-    return ret;
+  ret.reserve(hw_keys.size() + legacy_keys.size());
+  for (auto& key : hw_keys) {
+    ret.emplace_back(new ICloudRecoveryKey(std::move(key)));
   }
-  if (status != errSecSuccess) {
-    FIDO_LOG(ERROR) << "Could not retrieve iCloud recovery key: " << status;
-    return ret;
-  }
-  CFArrayRef items = base::apple::CFCastStrict<CFArrayRef>(result.get());
-  ret.reserve(CFArrayGetCount(items));
-  for (CFIndex i = 0; i < CFArrayGetCount(items); ++i) {
-    CFDictionaryRef item = base::apple::CFCastStrict<CFDictionaryRef>(
-        CFArrayGetValueAtIndex(items, i));
-    CFDataRef key = base::apple::CFCastStrict<CFDataRef>(
-        CFDictionaryGetValue(item, kSecValueData));
-    std::unique_ptr<trusted_vault::SecureBoxKeyPair> key_pair =
-        trusted_vault::SecureBoxKeyPair::CreateByPrivateKeyImport(
-            base::apple::CFDataToSpan(key));
-    if (!key_pair) {
-      FIDO_LOG(ERROR) << "iCloud recovery key is corrupted, skipping";
-      continue;
-    }
-    ret.emplace_back(new ICloudRecoveryKey(std::move(key_pair)));
+  for (auto& key : legacy_keys) {
+    ret.emplace_back(new ICloudRecoveryKey(std::move(key)));
   }
   return ret;
 }
diff --git a/device/fido/enclave/icloud_recovery_key_mac_unittest.mm b/device/fido/enclave/icloud_recovery_key_mac_unittest.mm
index 03cac1c..4dda464f 100644
--- a/device/fido/enclave/icloud_recovery_key_mac_unittest.mm
+++ b/device/fido/enclave/icloud_recovery_key_mac_unittest.mm
@@ -11,9 +11,11 @@
 #include <memory>
 #include <vector>
 
+#include "base/apple/foundation_util.h"
 #include "base/apple/scoped_cftyperef.h"
 #include "base/functional/callback.h"
 #include "base/run_loop.h"
+#include "base/strings/sys_string_conversions.h"
 #include "base/test/bind.h"
 #include "base/test/task_environment.h"
 #include "components/trusted_vault/securebox.h"
@@ -114,6 +116,71 @@
   EXPECT_NE(key2it, keys->end());
 }
 
+// Verify that keys are stored using the new .hw_protected kSecAttrService, but
+// old keys without it can still be retrieved.
+TEST_F(ICloudRecoveryKeyTest, RetrieveWithLegacyAttributes) {
+  std::unique_ptr<ICloudRecoveryKey> key1 = CreateKey();
+  ASSERT_TRUE(key1);
+  ASSERT_TRUE(key1->key());
+
+  std::unique_ptr<ICloudRecoveryKey> key2 = CreateKey();
+  ASSERT_TRUE(key2);
+  ASSERT_TRUE(key2->key());
+
+  CFMutableDictionaryRef key1_dict = const_cast<CFMutableDictionaryRef>(
+      fake_keychain_.keychain()->items().at(0).get());
+  auto service = base::apple::GetValueFromDictionary<CFStringRef>(
+      key1_dict, kSecAttrService);
+  EXPECT_EQ(base::SysCFStringRefToUTF8(service),
+            "com.google.common.folsom.cloud.private.hw_protected");
+  CFDictionarySetValue(
+      key1_dict, kSecAttrService,
+      base::SysUTF8ToCFStringRef("com.google.common.folsom.cloud.private")
+          .release());
+
+  std::optional<std::vector<std::unique_ptr<ICloudRecoveryKey>>> keys;
+  base::RunLoop run_loop;
+  ICloudRecoveryKey::Retrieve(
+      base::BindLambdaForTesting(
+          [&](std::vector<std::unique_ptr<ICloudRecoveryKey>> ret) {
+            keys = std::move(ret);
+            run_loop.Quit();
+          }),
+      kKeychainAccessGroup);
+  run_loop.Run();
+
+  ASSERT_TRUE(keys);
+  EXPECT_EQ(keys->size(), 2u);
+}
+
+// Tests that keys belonging to other security domains are not retrieved.
+TEST_F(ICloudRecoveryKeyTest, IgnoreOtherSecurityDomains) {
+  std::unique_ptr<ICloudRecoveryKey> key1 = CreateKey();
+  ASSERT_TRUE(key1);
+  ASSERT_TRUE(key1->key());
+
+  CFMutableDictionaryRef key1_dict = const_cast<CFMutableDictionaryRef>(
+      fake_keychain_.keychain()->items().at(0).get());
+  CFDictionarySetValue(key1_dict, kSecAttrService,
+                       base::SysUTF8ToCFStringRef(
+                           "com.google.common.folsom.cloud.private.folsom")
+                           .release());
+
+  std::optional<std::vector<std::unique_ptr<ICloudRecoveryKey>>> keys;
+  base::RunLoop run_loop;
+  ICloudRecoveryKey::Retrieve(
+      base::BindLambdaForTesting(
+          [&](std::vector<std::unique_ptr<ICloudRecoveryKey>> ret) {
+            keys = std::move(ret);
+            run_loop.Quit();
+          }),
+      kKeychainAccessGroup);
+  run_loop.Run();
+
+  ASSERT_TRUE(keys);
+  EXPECT_TRUE(keys->empty());
+}
+
 TEST_F(ICloudRecoveryKeyTest, CreateKeychainError) {
   // Force a keychain error by setting the wrong access group.
   std::unique_ptr<ICloudRecoveryKey> keys;
diff --git a/device/fido/features.cc b/device/fido/features.cc
index b49a49e..576273a 100644
--- a/device/fido/features.cc
+++ b/device/fido/features.cc
@@ -156,4 +156,10 @@
              "WebAuthenticationiCloudKeychainPrf",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
+// This is a deprecation flag. It is now enabled by default, but we want to
+// disable it eventually.
+BASE_FEATURE(kWebAuthnHybridLinking,
+             "WebAuthenticationHybridLinking",
+             base::FEATURE_ENABLED_BY_DEFAULT);
+
 }  // namespace device
diff --git a/device/fido/features.h b/device/fido/features.h
index 628b7fe9..dacc533 100644
--- a/device/fido/features.h
+++ b/device/fido/features.h
@@ -128,6 +128,11 @@
 COMPONENT_EXPORT(DEVICE_FIDO)
 BASE_DECLARE_FEATURE(kWebAuthniCloudKeychainPrf);
 
+// Enables linking of hybrid devices to Chrome, both pre-linking (i.e. through
+// Sync) and through hybrid.
+COMPONENT_EXPORT(DEVICE_FIDO)
+BASE_DECLARE_FEATURE(kWebAuthnHybridLinking);
+
 }  // namespace device
 
 #endif  // DEVICE_FIDO_FEATURES_H_
diff --git a/docs/website b/docs/website
index f453501..37f01b6 160000
--- a/docs/website
+++ b/docs/website
@@ -1 +1 @@
-Subproject commit f4535018cb6d2aff37c4a414f8928ca055b639df
+Subproject commit 37f01b6847b3dc89474feeb57ee9b152b4d17761
diff --git a/extensions/browser/api/BUILD.gn b/extensions/browser/api/BUILD.gn
index 510feca6..fb7a524 100644
--- a/extensions/browser/api/BUILD.gn
+++ b/extensions/browser/api/BUILD.gn
@@ -31,6 +31,7 @@
   public_deps = [
     "//extensions/browser/api/alarms",
     "//extensions/browser/api/declarative_net_request",
+    "//extensions/browser/api/runtime",
     "//extensions/browser/api/test",
   ]
 
@@ -61,7 +62,6 @@
       "//extensions/browser/api/offscreen",
       "//extensions/browser/api/power",
       "//extensions/browser/api/printer_provider",
-      "//extensions/browser/api/runtime",
       "//extensions/browser/api/serial",
       "//extensions/browser/api/socket",
       "//extensions/browser/api/sockets_tcp",
diff --git a/extensions/browser/api/printer_provider/printer_provider_api.cc b/extensions/browser/api/printer_provider/printer_provider_api.cc
index 9743fdd..b12ffe8 100644
--- a/extensions/browser/api/printer_provider/printer_provider_api.cc
+++ b/extensions/browser/api/printer_provider/printer_provider_api.cc
@@ -806,9 +806,9 @@
 }  // namespace
 
 // static
-PrinterProviderAPI* PrinterProviderAPI::Create(
+std::unique_ptr<PrinterProviderAPI> PrinterProviderAPI::Create(
     content::BrowserContext* context) {
-  return new PrinterProviderAPIImpl(context);
+  return std::make_unique<PrinterProviderAPIImpl>(context);
 }
 
 // static
diff --git a/extensions/browser/api/printer_provider/printer_provider_api.h b/extensions/browser/api/printer_provider/printer_provider_api.h
index 5997c94b..41fd2ff 100644
--- a/extensions/browser/api/printer_provider/printer_provider_api.h
+++ b/extensions/browser/api/printer_provider/printer_provider_api.h
@@ -35,7 +35,8 @@
   using GetPrinterInfoCallback =
       base::OnceCallback<void(const base::Value::Dict printer_info)>;
 
-  static PrinterProviderAPI* Create(content::BrowserContext* context);
+  static std::unique_ptr<PrinterProviderAPI> Create(
+      content::BrowserContext* context);
 
   // Returns generic error string for print request.
   static std::string GetDefaultPrintError();
diff --git a/extensions/browser/api/printer_provider/printer_provider_api_factory.cc b/extensions/browser/api/printer_provider/printer_provider_api_factory.cc
index 391fdaf..d5464cda 100644
--- a/extensions/browser/api/printer_provider/printer_provider_api_factory.cc
+++ b/extensions/browser/api/printer_provider/printer_provider_api_factory.cc
@@ -43,7 +43,8 @@
 PrinterProviderAPIFactory::~PrinterProviderAPIFactory() {
 }
 
-KeyedService* PrinterProviderAPIFactory::BuildServiceInstanceFor(
+std::unique_ptr<KeyedService>
+PrinterProviderAPIFactory::BuildServiceInstanceForBrowserContext(
     content::BrowserContext* context) const {
   return PrinterProviderAPI::Create(context);
 }
diff --git a/extensions/browser/api/printer_provider/printer_provider_api_factory.h b/extensions/browser/api/printer_provider/printer_provider_api_factory.h
index 027c032..f4c7c188 100644
--- a/extensions/browser/api/printer_provider/printer_provider_api_factory.h
+++ b/extensions/browser/api/printer_provider/printer_provider_api_factory.h
@@ -38,7 +38,7 @@
   ~PrinterProviderAPIFactory() override;
 
   // BrowserContextKeyedServiceFactory implementation:
-  KeyedService* BuildServiceInstanceFor(
+  std::unique_ptr<KeyedService> BuildServiceInstanceForBrowserContext(
       content::BrowserContext* context) const override;
   content::BrowserContext* GetBrowserContextToUse(
       content::BrowserContext* context) const override;
diff --git a/extensions/browser/api/runtime/BUILD.gn b/extensions/browser/api/runtime/BUILD.gn
index ee6576c..ea4fe0bf 100644
--- a/extensions/browser/api/runtime/BUILD.gn
+++ b/extensions/browser/api/runtime/BUILD.gn
@@ -4,8 +4,8 @@
 
 import("//extensions/buildflags/buildflags.gni")
 
-assert(enable_extensions,
-       "Cannot depend on extensions because enable_extensions=false.")
+assert(enable_extensions_core,
+       "Cannot depend on extensions because extensions are disabled.")
 
 source_set("runtime") {
   sources = [
diff --git a/extensions/common/api/schema.gni b/extensions/common/api/schema.gni
index 73fa0ed..24fc71d 100644
--- a/extensions/common/api/schema.gni
+++ b/extensions/common/api/schema.gni
@@ -10,6 +10,7 @@
 # TODO(https://crbug.com/356905053): Continue moving more here.
 extensions_api_schema_files_ = [
   "alarms.idl",
+  "runtime.json",
   "test.json",
 ]
 
@@ -67,7 +68,6 @@
     "power.idl",
     "printer_provider.idl",
     "printer_provider_internal.idl",
-    "runtime.json",
     "serial.idl",
     "socket.idl",
     "sockets_tcp.idl",
diff --git a/gpu/BUILD.gn b/gpu/BUILD.gn
index 761f8d7..b2f9bd7 100644
--- a/gpu/BUILD.gn
+++ b/gpu/BUILD.gn
@@ -360,6 +360,7 @@
     frameworks = [ "IOSurface.framework" ]
     sources += [ "command_buffer/service/shared_image/iosurface_image_backing_factory_unittest.cc" ]
   } else if (is_win) {
+    libs += [ "d3d12.lib" ]
     deps += [
       "//third_party/microsoft_dxheaders:dxguids",
       "//ui/platform_window",
diff --git a/gpu/command_buffer/build_webgpu_cmd_buffer.py b/gpu/command_buffer/build_webgpu_cmd_buffer.py
index ca9748a..2049a68 100755
--- a/gpu/command_buffer/build_webgpu_cmd_buffer.py
+++ b/gpu/command_buffer/build_webgpu_cmd_buffer.py
@@ -73,10 +73,23 @@
     'type': 'PUTn',
     'count': 1,
   },
+  'AssociateMailboxForBuffer': {
+    'impl_func': False,
+    'client_test': False,
+    'internal': True,
+    'cmd_args': 'GLuint device_id, GLuint device_generation, GLuint id, '
+                'GLuint generation, uint64_t usage, const GLuint* mailbox',
+    'type': 'PUT',
+    'count': 4,
+  },
   'DissociateMailbox': {
     'impl_func': False,
     'client_test': False,
   },
+   'DissociateMailboxForBuffer': {
+    'impl_func': False,
+    'client_test': False,
+  },
   'DissociateMailboxForPresent': {
     'impl_func': False,
     'client_test': False,
diff --git a/gpu/command_buffer/client/webgpu_cmd_helper_autogen.h b/gpu/command_buffer/client/webgpu_cmd_helper_autogen.h
index 2d76b5a..e81bae3c 100644
--- a/gpu/command_buffer/client/webgpu_cmd_helper_autogen.h
+++ b/gpu/command_buffer/client/webgpu_cmd_helper_autogen.h
@@ -44,6 +44,22 @@
   }
 }
 
+void AssociateMailboxForBufferImmediate(GLuint device_id,
+                                        GLuint device_generation,
+                                        GLuint id,
+                                        GLuint generation,
+                                        uint64_t usage,
+                                        const GLuint* mailbox) {
+  const uint32_t size =
+      webgpu::cmds::AssociateMailboxForBufferImmediate::ComputeSize();
+  webgpu::cmds::AssociateMailboxForBufferImmediate* c =
+      GetImmediateCmdSpaceTotalSize<
+          webgpu::cmds::AssociateMailboxForBufferImmediate>(size);
+  if (c) {
+    c->Init(device_id, device_generation, id, generation, usage, mailbox);
+  }
+}
+
 void DissociateMailbox(GLuint texture_id, GLuint texture_generation) {
   webgpu::cmds::DissociateMailbox* c =
       GetCmdSpace<webgpu::cmds::DissociateMailbox>();
@@ -52,6 +68,14 @@
   }
 }
 
+void DissociateMailboxForBuffer(GLuint buffer_id, GLuint buffer_generation) {
+  webgpu::cmds::DissociateMailboxForBuffer* c =
+      GetCmdSpace<webgpu::cmds::DissociateMailboxForBuffer>();
+  if (c) {
+    c->Init(buffer_id, buffer_generation);
+  }
+}
+
 void DissociateMailboxForPresent(GLuint device_id,
                                  GLuint device_generation,
                                  GLuint texture_id,
diff --git a/gpu/command_buffer/client/webgpu_implementation.cc b/gpu/command_buffer/client/webgpu_implementation.cc
index 3ab2a6dd..2efe1324 100644
--- a/gpu/command_buffer/client/webgpu_implementation.cc
+++ b/gpu/command_buffer/client/webgpu_implementation.cc
@@ -375,6 +375,34 @@
 #endif
 }
 
+ReservedBuffer WebGPUImplementation::ReserveBuffer(
+    WGPUDevice device,
+    const WGPUBufferDescriptor* optionalDesc) {
+#if BUILDFLAG(USE_DAWN)
+  // Commit because we need to make sure messages that free a previously used
+  // buffer is seen first. ReserveBuffer may reuse an existing ID.
+  dawn_wire_->serializer()->Commit();
+
+  WGPUBufferDescriptor placeholderDesc;
+  if (optionalDesc == nullptr) {
+    placeholderDesc = {};  // Zero initialize.
+    optionalDesc = &placeholderDesc;
+  }
+
+  auto reserved =
+      dawn_wire_->wire_client()->ReserveBuffer(device, optionalDesc);
+  ReservedBuffer result;
+  result.buffer = reserved.buffer;
+  result.id = reserved.handle.id;
+  result.generation = reserved.handle.generation;
+  result.deviceId = reserved.deviceHandle.id;
+  result.deviceGeneration = reserved.deviceHandle.generation;
+  return result;
+#else
+  return {};
+#endif
+}
+
 ReservedTexture WebGPUImplementation::ReserveTexture(
     WGPUDevice device,
     const WGPUTextureDescriptor* optionalDesc) {
@@ -450,6 +478,30 @@
 #endif
 }
 
+void WebGPUImplementation::AssociateMailboxForBuffer(GLuint device_id,
+                                                     GLuint device_generation,
+                                                     GLuint buffer_id,
+                                                     GLuint buffer_generation,
+                                                     uint64_t usage,
+                                                     const Mailbox& mailbox) {
+#if BUILDFLAG(USE_DAWN)
+  // Commit previous Dawn commands as they may manipulate buffer object IDs
+  // and need to be resolved prior to the AssociateMailboxForBuffer command.
+  // Otherwise the service side might not know, for example that the previous
+  // buffer using that ID has been released.
+  dawn_wire_->serializer()->Commit();
+
+  // The command buffer transfer data in 4-byte "entries". So the array of data
+  // we pass must have a byte-length that's a multiple of 4.
+  constexpr size_t kEntrySize = 4u;
+  static_assert(sizeof(mailbox.name) % kEntrySize == 0u);
+
+  helper_->AssociateMailboxForBufferImmediate(
+      device_id, device_generation, buffer_id, buffer_generation, usage,
+      reinterpret_cast<const GLuint*>(mailbox.name));
+#endif
+}
+
 void WebGPUImplementation::DissociateMailbox(GLuint texture_id,
                                              GLuint texture_generation) {
 #if BUILDFLAG(USE_DAWN)
@@ -460,6 +512,17 @@
 #endif
 }
 
+void WebGPUImplementation::DissociateMailboxForBuffer(
+    GLuint buffer_id,
+    GLuint buffer_generation) {
+#if BUILDFLAG(USE_DAWN)
+  // Commit previous Dawn commands that might be rendering to the buffer, prior
+  // to Dissociating the shared image from that buffer.
+  dawn_wire_->serializer()->Commit();
+  helper_->DissociateMailboxForBuffer(buffer_id, buffer_generation);
+#endif
+}
+
 void WebGPUImplementation::DissociateMailboxForPresent(
     GLuint device_id,
     GLuint device_generation,
diff --git a/gpu/command_buffer/client/webgpu_implementation.h b/gpu/command_buffer/client/webgpu_implementation.h
index cb9e982..8a6e783 100644
--- a/gpu/command_buffer/client/webgpu_implementation.h
+++ b/gpu/command_buffer/client/webgpu_implementation.h
@@ -90,6 +90,13 @@
                         MailboxFlags flags,
                         const Mailbox& mailbox) override;
 
+  void AssociateMailboxForBuffer(GLuint device_id,
+                                 GLuint device_generation,
+                                 GLuint id,
+                                 GLuint generation,
+                                 uint64_t usage,
+                                 const Mailbox& mailbox) override;
+
   // ContextSupport implementation.
   void SetAggressivelyFreeResources(bool aggressively_free_resources) override;
   uint64_t ShareGroupTracingGUID() const override;
@@ -137,6 +144,9 @@
   bool EnsureAwaitingFlush() override;
   void FlushAwaitingCommands() override;
   scoped_refptr<APIChannel> GetAPIChannel() const override;
+  ReservedBuffer ReserveBuffer(
+      WGPUDevice device,
+      const WGPUBufferDescriptor* optionalDesc) override;
   ReservedTexture ReserveTexture(
       WGPUDevice device,
       const WGPUTextureDescriptor* optionalDesc = nullptr) override;
diff --git a/gpu/command_buffer/client/webgpu_implementation_autogen.h b/gpu/command_buffer/client/webgpu_implementation_autogen.h
index 41e94ee..2f00ad7 100644
--- a/gpu/command_buffer/client/webgpu_implementation_autogen.h
+++ b/gpu/command_buffer/client/webgpu_implementation_autogen.h
@@ -15,6 +15,9 @@
 
 void DissociateMailbox(GLuint texture_id, GLuint texture_generation) override;
 
+void DissociateMailboxForBuffer(GLuint buffer_id,
+                                GLuint buffer_generation) override;
+
 void DissociateMailboxForPresent(GLuint device_id,
                                  GLuint device_generation,
                                  GLuint texture_id,
diff --git a/gpu/command_buffer/client/webgpu_interface.h b/gpu/command_buffer/client/webgpu_interface.h
index 494c71c..f558681 100644
--- a/gpu/command_buffer/client/webgpu_interface.h
+++ b/gpu/command_buffer/client/webgpu_interface.h
@@ -21,6 +21,14 @@
 
 namespace webgpu {
 
+struct ReservedBuffer {
+  WGPUBuffer buffer;
+  uint32_t id;
+  uint32_t generation;
+  uint32_t deviceId;
+  uint32_t deviceGeneration;
+};
+
 struct ReservedTexture {
   WGPUTexture texture;
   uint32_t id;
@@ -66,6 +74,10 @@
   // Get a strong reference to the APIChannel backing the implementation.
   virtual scoped_refptr<APIChannel> GetAPIChannel() const = 0;
 
+  virtual ReservedBuffer ReserveBuffer(
+      WGPUDevice device,
+      const WGPUBufferDescriptor* optionalDesc = nullptr) = 0;
+
   virtual ReservedTexture ReserveTexture(
       WGPUDevice device,
       const WGPUTextureDescriptor* optionalDesc = nullptr) = 0;
@@ -142,6 +154,13 @@
                      nullptr, 0, WEBGPU_MAILBOX_NONE, mailbox);
   }
 
+  virtual void AssociateMailboxForBuffer(GLuint device_id,
+                                         GLuint device_generation,
+                                         GLuint id,
+                                         GLuint generation,
+                                         uint64_t usage,
+                                         const Mailbox& mailbox) = 0;
+
   void SetWebGPUExecutionContextToken(
       const blink::WebGPUExecutionContextToken& token) {
     uint64_t high = token.value().GetHighForSerialization();
diff --git a/gpu/command_buffer/client/webgpu_interface_autogen.h b/gpu/command_buffer/client/webgpu_interface_autogen.h
index 16efb82..6133e610 100644
--- a/gpu/command_buffer/client/webgpu_interface_autogen.h
+++ b/gpu/command_buffer/client/webgpu_interface_autogen.h
@@ -15,6 +15,8 @@
 
 virtual void DissociateMailbox(GLuint texture_id,
                                GLuint texture_generation) = 0;
+virtual void DissociateMailboxForBuffer(GLuint buffer_id,
+                                        GLuint buffer_generation) = 0;
 virtual void DissociateMailboxForPresent(GLuint device_id,
                                          GLuint device_generation,
                                          GLuint texture_id,
diff --git a/gpu/command_buffer/client/webgpu_interface_stub.cc b/gpu/command_buffer/client/webgpu_interface_stub.cc
index 95f40eb..fef03d2 100644
--- a/gpu/command_buffer/client/webgpu_interface_stub.cc
+++ b/gpu/command_buffer/client/webgpu_interface_stub.cc
@@ -50,6 +50,11 @@
   return {nullptr, 0, 0, 0, 0};
 }
 
+ReservedBuffer WebGPUInterfaceStub::ReserveBuffer(WGPUDevice device,
+                                                  const WGPUBufferDescriptor*) {
+  return {nullptr, 0, 0, 0, 0};
+}
+
 WGPUDevice WebGPUInterfaceStub::DeprecatedEnsureDefaultDeviceSync() {
   return nullptr;
 }
@@ -66,6 +71,13 @@
     MailboxFlags flags,
     const Mailbox& mailbox) {}
 
+void WebGPUInterfaceStub::AssociateMailboxForBuffer(GLuint device_id,
+                                                    GLuint device_generation,
+                                                    GLuint id,
+                                                    GLuint generation,
+                                                    uint64_t usage,
+                                                    const Mailbox& mailbox) {}
+
 // Include the auto-generated part of this class. We split this because
 // it means we can easily edit the non-auto generated parts right here in
 // this file instead of having to edit some template or the code generator.
diff --git a/gpu/command_buffer/client/webgpu_interface_stub.h b/gpu/command_buffer/client/webgpu_interface_stub.h
index de331e9..e5eee20 100644
--- a/gpu/command_buffer/client/webgpu_interface_stub.h
+++ b/gpu/command_buffer/client/webgpu_interface_stub.h
@@ -32,6 +32,10 @@
       WGPUDevice device,
       const WGPUTextureDescriptor* optionalDesc) override;
 
+  ReservedBuffer ReserveBuffer(
+      WGPUDevice device,
+      const WGPUBufferDescriptor* optionalDesc) override;
+
   WGPUDevice DeprecatedEnsureDefaultDeviceSync() override;
 
   void AssociateMailbox(GLuint device_id,
@@ -45,6 +49,13 @@
                         MailboxFlags flags,
                         const Mailbox& mailbox) override;
 
+  void AssociateMailboxForBuffer(GLuint device_id,
+                                 GLuint device_generation,
+                                 GLuint id,
+                                 GLuint generation,
+                                 uint64_t usage,
+                                 const Mailbox& mailbox) override;
+
 // Include the auto-generated part of this class. We split this because
 // it means we can easily edit the non-auto generated parts right here in
 // this file instead of having to edit some template or the code generator.
diff --git a/gpu/command_buffer/client/webgpu_interface_stub_autogen.h b/gpu/command_buffer/client/webgpu_interface_stub_autogen.h
index 893442d8cc..5e9a7c6 100644
--- a/gpu/command_buffer/client/webgpu_interface_stub_autogen.h
+++ b/gpu/command_buffer/client/webgpu_interface_stub_autogen.h
@@ -13,6 +13,8 @@
 #define GPU_COMMAND_BUFFER_CLIENT_WEBGPU_INTERFACE_STUB_AUTOGEN_H_
 
 void DissociateMailbox(GLuint texture_id, GLuint texture_generation) override;
+void DissociateMailboxForBuffer(GLuint buffer_id,
+                                GLuint buffer_generation) override;
 void DissociateMailboxForPresent(GLuint device_id,
                                  GLuint device_generation,
                                  GLuint texture_id,
diff --git a/gpu/command_buffer/client/webgpu_interface_stub_impl_autogen.h b/gpu/command_buffer/client/webgpu_interface_stub_impl_autogen.h
index 31377f5..2719fe4 100644
--- a/gpu/command_buffer/client/webgpu_interface_stub_impl_autogen.h
+++ b/gpu/command_buffer/client/webgpu_interface_stub_impl_autogen.h
@@ -14,6 +14,9 @@
 
 void WebGPUInterfaceStub::DissociateMailbox(GLuint /* texture_id */,
                                             GLuint /* texture_generation */) {}
+void WebGPUInterfaceStub::DissociateMailboxForBuffer(
+    GLuint /* buffer_id */,
+    GLuint /* buffer_generation */) {}
 void WebGPUInterfaceStub::DissociateMailboxForPresent(
     GLuint /* device_id */,
     GLuint /* device_generation */,
diff --git a/gpu/command_buffer/common/webgpu_cmd_format_autogen.h b/gpu/command_buffer/common/webgpu_cmd_format_autogen.h
index db1741d..7f6e8258 100644
--- a/gpu/command_buffer/common/webgpu_cmd_format_autogen.h
+++ b/gpu/command_buffer/common/webgpu_cmd_format_autogen.h
@@ -170,6 +170,79 @@
 static_assert(offsetof(AssociateMailboxImmediate, count) == 36,
               "offset of AssociateMailboxImmediate count should be 36");
 
+struct AssociateMailboxForBufferImmediate {
+  typedef AssociateMailboxForBufferImmediate ValueType;
+  static const CommandId kCmdId = kAssociateMailboxForBufferImmediate;
+  static const cmd::ArgFlags kArgFlags = cmd::kAtLeastN;
+  static const uint8_t cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3);
+
+  static uint32_t ComputeDataSize() {
+    return static_cast<uint32_t>(sizeof(GLuint) * 4);
+  }
+
+  static uint32_t ComputeSize() {
+    return static_cast<uint32_t>(sizeof(ValueType) + ComputeDataSize());
+  }
+
+  void SetHeader() { header.SetCmdByTotalSize<ValueType>(ComputeSize()); }
+
+  void Init(GLuint _device_id,
+            GLuint _device_generation,
+            GLuint _id,
+            GLuint _generation,
+            uint64_t _usage,
+            const GLuint* _mailbox) {
+    SetHeader();
+    device_id = _device_id;
+    device_generation = _device_generation;
+    id = _id;
+    generation = _generation;
+    usage = _usage;
+    memcpy(ImmediateDataAddress(this), _mailbox, ComputeDataSize());
+  }
+
+  void* Set(void* cmd,
+            GLuint _device_id,
+            GLuint _device_generation,
+            GLuint _id,
+            GLuint _generation,
+            uint64_t _usage,
+            const GLuint* _mailbox) {
+    static_cast<ValueType*>(cmd)->Init(_device_id, _device_generation, _id,
+                                       _generation, _usage, _mailbox);
+    const uint32_t size = ComputeSize();
+    return NextImmediateCmdAddressTotalSize<ValueType>(cmd, size);
+  }
+
+  gpu::CommandHeader header;
+  uint32_t device_id;
+  uint32_t device_generation;
+  uint32_t id;
+  uint32_t generation;
+  uint32_t usage;
+};
+
+static_assert(sizeof(AssociateMailboxForBufferImmediate) == 24,
+              "size of AssociateMailboxForBufferImmediate should be 24");
+static_assert(
+    offsetof(AssociateMailboxForBufferImmediate, header) == 0,
+    "offset of AssociateMailboxForBufferImmediate header should be 0");
+static_assert(
+    offsetof(AssociateMailboxForBufferImmediate, device_id) == 4,
+    "offset of AssociateMailboxForBufferImmediate device_id should be 4");
+static_assert(offsetof(AssociateMailboxForBufferImmediate, device_generation) ==
+                  8,
+              "offset of AssociateMailboxForBufferImmediate device_generation "
+              "should be 8");
+static_assert(offsetof(AssociateMailboxForBufferImmediate, id) == 12,
+              "offset of AssociateMailboxForBufferImmediate id should be 12");
+static_assert(
+    offsetof(AssociateMailboxForBufferImmediate, generation) == 16,
+    "offset of AssociateMailboxForBufferImmediate generation should be 16");
+static_assert(
+    offsetof(AssociateMailboxForBufferImmediate, usage) == 20,
+    "offset of AssociateMailboxForBufferImmediate usage should be 20");
+
 struct DissociateMailbox {
   typedef DissociateMailbox ValueType;
   static const CommandId kCmdId = kDissociateMailbox;
@@ -207,6 +280,44 @@
 static_assert(offsetof(DissociateMailbox, texture_generation) == 8,
               "offset of DissociateMailbox texture_generation should be 8");
 
+struct DissociateMailboxForBuffer {
+  typedef DissociateMailboxForBuffer ValueType;
+  static const CommandId kCmdId = kDissociateMailboxForBuffer;
+  static const cmd::ArgFlags kArgFlags = cmd::kFixed;
+  static const uint8_t cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3);
+
+  static uint32_t ComputeSize() {
+    return static_cast<uint32_t>(sizeof(ValueType));  // NOLINT
+  }
+
+  void SetHeader() { header.SetCmd<ValueType>(); }
+
+  void Init(GLuint _buffer_id, GLuint _buffer_generation) {
+    SetHeader();
+    buffer_id = _buffer_id;
+    buffer_generation = _buffer_generation;
+  }
+
+  void* Set(void* cmd, GLuint _buffer_id, GLuint _buffer_generation) {
+    static_cast<ValueType*>(cmd)->Init(_buffer_id, _buffer_generation);
+    return NextCmdAddress<ValueType>(cmd);
+  }
+
+  gpu::CommandHeader header;
+  uint32_t buffer_id;
+  uint32_t buffer_generation;
+};
+
+static_assert(sizeof(DissociateMailboxForBuffer) == 12,
+              "size of DissociateMailboxForBuffer should be 12");
+static_assert(offsetof(DissociateMailboxForBuffer, header) == 0,
+              "offset of DissociateMailboxForBuffer header should be 0");
+static_assert(offsetof(DissociateMailboxForBuffer, buffer_id) == 4,
+              "offset of DissociateMailboxForBuffer buffer_id should be 4");
+static_assert(
+    offsetof(DissociateMailboxForBuffer, buffer_generation) == 8,
+    "offset of DissociateMailboxForBuffer buffer_generation should be 8");
+
 struct DissociateMailboxForPresent {
   typedef DissociateMailboxForPresent ValueType;
   static const CommandId kCmdId = kDissociateMailboxForPresent;
diff --git a/gpu/command_buffer/common/webgpu_cmd_format_test_autogen.h b/gpu/command_buffer/common/webgpu_cmd_format_test_autogen.h
index fe839a94..f3a9f8ac 100644
--- a/gpu/command_buffer/common/webgpu_cmd_format_test_autogen.h
+++ b/gpu/command_buffer/common/webgpu_cmd_format_test_autogen.h
@@ -70,6 +70,34 @@
       next_cmd, sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data)));
 }
 
+TEST_F(WebGPUFormatTest, AssociateMailboxForBufferImmediate) {
+  const int kSomeBaseValueToTestWith = 51;
+  static GLuint data[] = {
+      static_cast<GLuint>(kSomeBaseValueToTestWith + 0),
+      static_cast<GLuint>(kSomeBaseValueToTestWith + 1),
+      static_cast<GLuint>(kSomeBaseValueToTestWith + 2),
+      static_cast<GLuint>(kSomeBaseValueToTestWith + 3),
+  };
+  cmds::AssociateMailboxForBufferImmediate& cmd =
+      *GetBufferAs<cmds::AssociateMailboxForBufferImmediate>();
+  void* next_cmd =
+      cmd.Set(&cmd, static_cast<GLuint>(11), static_cast<GLuint>(12),
+              static_cast<GLuint>(13), static_cast<GLuint>(14),
+              static_cast<uint64_t>(15), data);
+  EXPECT_EQ(
+      static_cast<uint32_t>(cmds::AssociateMailboxForBufferImmediate::kCmdId),
+      cmd.header.command);
+  EXPECT_EQ(sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data)),
+            cmd.header.size * 4u);
+  EXPECT_EQ(static_cast<GLuint>(11), cmd.device_id);
+  EXPECT_EQ(static_cast<GLuint>(12), cmd.device_generation);
+  EXPECT_EQ(static_cast<GLuint>(13), cmd.id);
+  EXPECT_EQ(static_cast<GLuint>(14), cmd.generation);
+  EXPECT_EQ(static_cast<uint64_t>(15), cmd.usage);
+  CheckBytesWrittenMatchesExpectedSize(
+      next_cmd, sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data)));
+}
+
 TEST_F(WebGPUFormatTest, DissociateMailbox) {
   cmds::DissociateMailbox& cmd = *GetBufferAs<cmds::DissociateMailbox>();
   void* next_cmd =
@@ -82,6 +110,19 @@
   CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd));
 }
 
+TEST_F(WebGPUFormatTest, DissociateMailboxForBuffer) {
+  cmds::DissociateMailboxForBuffer& cmd =
+      *GetBufferAs<cmds::DissociateMailboxForBuffer>();
+  void* next_cmd =
+      cmd.Set(&cmd, static_cast<GLuint>(11), static_cast<GLuint>(12));
+  EXPECT_EQ(static_cast<uint32_t>(cmds::DissociateMailboxForBuffer::kCmdId),
+            cmd.header.command);
+  EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u);
+  EXPECT_EQ(static_cast<GLuint>(11), cmd.buffer_id);
+  EXPECT_EQ(static_cast<GLuint>(12), cmd.buffer_generation);
+  CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd));
+}
+
 TEST_F(WebGPUFormatTest, DissociateMailboxForPresent) {
   cmds::DissociateMailboxForPresent& cmd =
       *GetBufferAs<cmds::DissociateMailboxForPresent>();
diff --git a/gpu/command_buffer/common/webgpu_cmd_ids_autogen.h b/gpu/command_buffer/common/webgpu_cmd_ids_autogen.h
index 1bb51f0..08b5443 100644
--- a/gpu/command_buffer/common/webgpu_cmd_ids_autogen.h
+++ b/gpu/command_buffer/common/webgpu_cmd_ids_autogen.h
@@ -11,12 +11,14 @@
 #ifndef GPU_COMMAND_BUFFER_COMMON_WEBGPU_CMD_IDS_AUTOGEN_H_
 #define GPU_COMMAND_BUFFER_COMMON_WEBGPU_CMD_IDS_AUTOGEN_H_
 
-#define WEBGPU_COMMAND_LIST(OP)                \
-  OP(DawnCommands)                   /* 256 */ \
-  OP(AssociateMailboxImmediate)      /* 257 */ \
-  OP(DissociateMailbox)              /* 258 */ \
-  OP(DissociateMailboxForPresent)    /* 259 */ \
-  OP(SetWebGPUExecutionContextToken) /* 260 */
+#define WEBGPU_COMMAND_LIST(OP)                    \
+  OP(DawnCommands)                       /* 256 */ \
+  OP(AssociateMailboxImmediate)          /* 257 */ \
+  OP(AssociateMailboxForBufferImmediate) /* 258 */ \
+  OP(DissociateMailbox)                  /* 259 */ \
+  OP(DissociateMailboxForBuffer)         /* 260 */ \
+  OP(DissociateMailboxForPresent)        /* 261 */ \
+  OP(SetWebGPUExecutionContextToken)     /* 262 */
 
 enum CommandId {
   kOneBeforeStartPoint =
diff --git a/gpu/command_buffer/service/webgpu_decoder_impl.cc b/gpu/command_buffer/service/webgpu_decoder_impl.cc
index 5f95759..201dc04 100644
--- a/gpu/command_buffer/service/webgpu_decoder_impl.cc
+++ b/gpu/command_buffer/service/webgpu_decoder_impl.cc
@@ -458,6 +458,14 @@
       wgpu::TextureUsage internal_usage,
       std::vector<wgpu::TextureFormat> view_formats);
 
+  class SharedBufferRepresentationAndAccess;
+
+  std::unique_ptr<SharedBufferRepresentationAndAccess>
+  AssociateMailboxDawnBuffer(const Mailbox& mailbox,
+                             const wgpu::Device& device,
+                             wgpu::BackendType backendType,
+                             wgpu::BufferUsage usage);
+
   // Device creation requires that an isolation key has been set for the
   // decoder. As a result, this callback also runs all queued device creation
   // calls that were requested and queued before the isolation key was ready.
@@ -971,6 +979,66 @@
                  std::unique_ptr<SharedImageRepresentationAndAccess>>
       associated_shared_image_map_;
 
+  // Helper class whose derived implementations holds a representation
+  // and its ScopedAccess, ensuring safe destruction order.
+  class SharedBufferRepresentationAndAccess {
+   public:
+    virtual ~SharedBufferRepresentationAndAccess() = default;
+    // Get an unowned reference to the wgpu::Buffer for the shared image.
+    virtual wgpu::Buffer buffer() const = 0;
+    virtual Mailbox mailbox() const = 0;
+  };
+
+  // Wraps a |DawnBufferRepresentation| as a wgpu::Buffer.
+  class SharedBufferRepresentationAndAccessDawn
+      : public SharedBufferRepresentationAndAccess {
+   public:
+    SharedBufferRepresentationAndAccessDawn(
+        std::unique_ptr<DawnBufferRepresentation> representation,
+        std::unique_ptr<DawnBufferRepresentation::ScopedAccess> access)
+        : representation_(std::move(representation)),
+          access_(std::move(access)) {}
+
+    wgpu::Buffer buffer() const override { return access_->buffer(); }
+    Mailbox mailbox() const override { return representation_->mailbox(); }
+
+   private:
+    std::unique_ptr<DawnBufferRepresentation> representation_;
+    std::unique_ptr<DawnBufferRepresentation::ScopedAccess> access_;
+  };
+
+  // Implementation of SharedBufferRepresentationAndAccess that yields an error
+  // buffer.
+  class ErrorSharedBufferRepresentationAndAccess
+      : public SharedBufferRepresentationAndAccess {
+   public:
+    ErrorSharedBufferRepresentationAndAccess(const wgpu::Device& device,
+                                             wgpu::BufferUsage usage,
+                                             const Mailbox& mailbox) {
+      // Note: the buffer descriptor doesn't matter since this buffer won't be
+      // used for reflection and all validation checks the error state of the
+      // buffer before the buffer attributes.
+      wgpu::BufferDescriptor buffer_desc = {};
+      buffer_desc.usage = usage;
+      buffer_ = device.CreateErrorBuffer(&buffer_desc);
+      mailbox_ = mailbox;
+    }
+    ~ErrorSharedBufferRepresentationAndAccess() override = default;
+
+    wgpu::Buffer buffer() const override { return buffer_.Get(); }
+    Mailbox mailbox() const override { return mailbox_; }
+
+   private:
+    wgpu::Buffer buffer_;
+    Mailbox mailbox_;
+  };
+
+  // Map from the <ID, generation> pair for a wire buffer to the shared buffer
+  // representation and access for it.
+  base::flat_map<std::tuple<uint32_t, uint32_t>,
+                 std::unique_ptr<SharedBufferRepresentationAndAccess>>
+      associated_shared_buffer_map_;
+
   // A container of devices that we've seen on the wire, and their associated
   // metadata. Not all of them may be valid, so it gets pruned when
   // iterating through it in PerformPollingWork.
@@ -1211,6 +1279,7 @@
   queued_request_device_calls_.clear();
 
   associated_shared_image_map_.clear();
+  associated_shared_buffer_map_.clear();
 
   // Destroy all known devices to ensure that any service-side objects holding
   // refs to these objects observe that the devices are lost and can drop their
@@ -1298,6 +1367,8 @@
 
       return !runtime_unsafe_features_.contains(info->name);
     }
+    case wgpu::FeatureName::SharedBufferMemoryD3D12Resource:
+      return safety_level_ == webgpu::SafetyLevel::kUnsafe;
     default:
       return false;
   }
@@ -2322,6 +2393,124 @@
   return error::kNoError;
 }
 
+std::unique_ptr<WebGPUDecoderImpl::SharedBufferRepresentationAndAccess>
+WebGPUDecoderImpl::AssociateMailboxDawnBuffer(const Mailbox& mailbox,
+                                              const wgpu::Device& device,
+                                              wgpu::BackendType backendType,
+                                              wgpu::BufferUsage usage) {
+  std::unique_ptr<DawnBufferRepresentation> shared_buffer =
+      shared_image_representation_factory_->ProduceDawnBuffer(mailbox, device,
+                                                              backendType);
+
+  if (!shared_buffer) {
+    DLOG(ERROR) << "AssociateMailboxDawnBuffer: Couldn't produce shared image";
+    return nullptr;
+  }
+
+  std::unique_ptr<DawnBufferRepresentation::ScopedAccess> scoped_access =
+      shared_buffer->BeginScopedAccess(usage);
+  if (!scoped_access) {
+    DLOG(ERROR)
+        << "AssociateMailboxDawnBuffer: Couldn't begin shared image access";
+    return nullptr;
+  }
+
+  return std::make_unique<SharedBufferRepresentationAndAccessDawn>(
+      std::move(shared_buffer), std::move(scoped_access));
+}
+
+error::Error WebGPUDecoderImpl::HandleAssociateMailboxForBufferImmediate(
+    uint32_t immediate_data_size,
+    const volatile void* cmd_data) {
+  const volatile webgpu::cmds::AssociateMailboxForBufferImmediate& c =
+      *static_cast<
+          const volatile webgpu::cmds::AssociateMailboxForBufferImmediate*>(
+          cmd_data);
+  uint32_t device_id = static_cast<uint32_t>(c.device_id);
+  uint32_t device_generation = static_cast<uint32_t>(c.device_generation);
+  uint32_t id = static_cast<uint32_t>(c.id);
+  uint32_t generation = static_cast<uint32_t>(c.generation);
+  wgpu::BufferUsage usage = static_cast<wgpu::BufferUsage>(c.usage);
+
+  if (sizeof(Mailbox) != immediate_data_size) {
+    return error::kOutOfBounds;
+  }
+
+  volatile const GLbyte* immediate_data =
+      gles2::GetImmediateDataAs<volatile const GLbyte*>(c, sizeof(Mailbox),
+                                                        immediate_data_size);
+  Mailbox mailbox = Mailbox::FromVolatile(
+      *reinterpret_cast<const volatile Mailbox*>(immediate_data));
+  DLOG_IF(ERROR, !mailbox.Verify())
+      << "AssociateMailboxForBuffer was passed an invalid mailbox";
+
+  wgpu::Device device = wire_server_->GetDevice(device_id, device_generation);
+  if (device == nullptr) {
+    return error::kInvalidArguments;
+  }
+
+  {
+    auto it = associated_shared_buffer_map_.find({id, generation});
+    if (it != associated_shared_buffer_map_.end()) {
+      DLOG(ERROR)
+          << "AssociateMailboxForBuffer to an already associated buffer.";
+      return error::kInvalidArguments;
+    }
+  }
+
+  std::unique_ptr<SharedBufferRepresentationAndAccess>
+      representation_and_access;
+  auto it = known_device_metadata_.find(device);
+  DCHECK(it != known_device_metadata_.end());
+  representation_and_access = AssociateMailboxDawnBuffer(
+      mailbox, device, it->second.backendType, usage);
+
+  if (!representation_and_access) {
+    // The WebGPU specification error model is that failure to create a buffer
+    // returns an error buffer instead. Follow this pattern here.
+    representation_and_access =
+        std::make_unique<ErrorSharedBufferRepresentationAndAccess>(
+            device, usage, mailbox);
+  }
+
+  // Inject the buffer in the dawn::wire::Server and remember which shared
+  // image it is associated with.
+  if (!wire_server_->InjectBuffer(representation_and_access->buffer().Get(),
+                                  {id, generation},
+                                  {device_id, device_generation})) {
+    DLOG(ERROR) << "AssociateMailboxForBuffer: Invalid buffer ID";
+    return error::kInvalidArguments;
+  }
+
+  auto insertion = associated_shared_buffer_map_.emplace(
+      std::tuple<uint32_t, uint32_t>(id, generation),
+      std::move(representation_and_access));
+
+  // InjectBuffer already validated that the (ID, generation) can't have been
+  // registered before.
+  DCHECK(insertion.second);
+  return error::kNoError;
+}
+
+error::Error WebGPUDecoderImpl::HandleDissociateMailboxForBuffer(
+    uint32_t immediate_data_size,
+    const volatile void* cmd_data) {
+  const volatile webgpu::cmds::DissociateMailboxForBuffer& c =
+      *static_cast<const volatile webgpu::cmds::DissociateMailboxForBuffer*>(
+          cmd_data);
+  uint32_t buffer_id = static_cast<uint32_t>(c.buffer_id);
+  uint32_t buffer_generation = static_cast<uint32_t>(c.buffer_generation);
+
+  auto it = associated_shared_buffer_map_.find({buffer_id, buffer_generation});
+  if (it == associated_shared_buffer_map_.end()) {
+    DLOG(ERROR) << "DissociateMailboxForBuffer: Invalid buffer ID";
+    return error::kInvalidArguments;
+  }
+
+  associated_shared_buffer_map_.erase(it);
+  return error::kNoError;
+}
+
 bool WebGPUDecoderImpl::ClearSharedImageWithSkia(const Mailbox& mailbox) {
   // Before using the shared context, ensure it is current if we're on GL.
   if (shared_context_state_->GrContextIsGL()) {
diff --git a/gpu/command_buffer/tests/webgpu_mailbox_unittest.cc b/gpu/command_buffer/tests/webgpu_mailbox_unittest.cc
index 0eba437..4a45af14 100644
--- a/gpu/command_buffer/tests/webgpu_mailbox_unittest.cc
+++ b/gpu/command_buffer/tests/webgpu_mailbox_unittest.cc
@@ -46,12 +46,12 @@
   mock_buffer_map_callback->Call(status, message);
 }
 
-struct WebGPUMailboxTestParams : WebGPUTest::Options {
+struct WebGPUMailboxTextureTestParams : WebGPUTest::Options {
   viz::SharedImageFormat format;
 };
 
 std::ostream& operator<<(std::ostream& os,
-                         const WebGPUMailboxTestParams& options) {
+                         const WebGPUMailboxTextureTestParams& options) {
   DCHECK(options.format == viz::SinglePlaneFormat::kRGBA_8888 ||
          options.format == viz::SinglePlaneFormat::kBGRA_8888 ||
          options.format == viz::SinglePlaneFormat::kRGBA_F16);
@@ -86,19 +86,44 @@
 
 }  // namespace
 
-class WebGPUMailboxTest
-    : public WebGPUTest,
-      public testing::WithParamInterface<WebGPUMailboxTestParams> {
- public:
-  static std::vector<WebGPUMailboxTestParams> TestParams() {
-    WebGPUMailboxTestParams options = {};
+class WebGPUMailboxTestBase : public WebGPUTest {
+ protected:
+  template <typename T>
+  static error::Error ExecuteCmd(webgpu::WebGPUDecoder* decoder, const T& cmd) {
+    static_assert(T::kArgFlags == cmd::kFixed,
+                  "T::kArgFlags should equal cmd::kFixed");
+    int entries_processed = 0;
+    return decoder->DoCommands(1, (const void*)&cmd,
+                               ComputeNumEntries(sizeof(cmd)),
+                               &entries_processed);
+  }
 
-    WebGPUMailboxTestParams fallback_options = {};
+  template <typename T>
+  static error::Error ExecuteImmediateCmd(webgpu::WebGPUDecoder* decoder,
+                                          const T& cmd,
+                                          size_t data_size) {
+    static_assert(T::kArgFlags == cmd::kAtLeastN,
+                  "T::kArgFlags should equal cmd::kAtLeastN");
+    int entries_processed = 0;
+    return decoder->DoCommands(1, (const void*)&cmd,
+                               ComputeNumEntries(sizeof(cmd) + data_size),
+                               &entries_processed);
+  }
+};
+
+class WebGPUMailboxTextureTest
+    : public WebGPUMailboxTestBase,
+      public testing::WithParamInterface<WebGPUMailboxTextureTestParams> {
+ public:
+  static std::vector<WebGPUMailboxTextureTestParams> TestParams() {
+    WebGPUMailboxTextureTestParams options = {};
+
+    WebGPUMailboxTextureTestParams fallback_options = {};
     fallback_options.force_fallback_adapter = true;
     // Unsafe WebGPU currently required for SwiftShader fallback.
     fallback_options.enable_unsafe_webgpu = true;
 
-    std::vector<WebGPUMailboxTestParams> params;
+    std::vector<WebGPUMailboxTextureTestParams> params;
 
     for (viz::SharedImageFormat format : {
 // TODO(crbug.com/40823053): Support "rgba8unorm" canvas context format on Mac
@@ -108,7 +133,7 @@
                viz::SinglePlaneFormat::kBGRA_8888,
                viz::SinglePlaneFormat::kRGBA_F16,
          }) {
-      WebGPUMailboxTestParams o = options;
+      WebGPUMailboxTextureTestParams o = options;
       o.format = format;
 #if BUILDFLAG(IS_LINUX)
       // Linux does not support creation of RGBA_F16 GpuMemoryBuffers, which
@@ -166,28 +191,6 @@
     std::array<WGPUTextureFormat, 2u> view_formats;
   };
 
-  template <typename T>
-  static error::Error ExecuteCmd(webgpu::WebGPUDecoder* decoder, const T& cmd) {
-    static_assert(T::kArgFlags == cmd::kFixed,
-                  "T::kArgFlags should equal cmd::kFixed");
-    int entries_processed = 0;
-    return decoder->DoCommands(1, (const void*)&cmd,
-                               ComputeNumEntries(sizeof(cmd)),
-                               &entries_processed);
-  }
-
-  template <typename T>
-  static error::Error ExecuteImmediateCmd(webgpu::WebGPUDecoder* decoder,
-                                          const T& cmd,
-                                          size_t data_size) {
-    static_assert(T::kArgFlags == cmd::kAtLeastN,
-                  "T::kArgFlags should equal cmd::kAtLeastN");
-    int entries_processed = 0;
-    return decoder->DoCommands(1, (const void*)&cmd,
-                               ComputeNumEntries(sizeof(cmd) + data_size),
-                               &entries_processed);
-  }
-
   enum class AccessType { Read, Write, ReadWrite };
 
   SharedImageUsageSet GetSharedImageUsage(AccessType access_type) {
@@ -278,7 +281,7 @@
   wgpu::Device device_;
 };
 
-TEST_P(WebGPUMailboxTest, AssociateMailboxCmd) {
+TEST_P(WebGPUMailboxTextureTest, AssociateMailboxCmd) {
   // Create the shared image
   SharedImageInterface* sii = GetSharedImageInterface();
   scoped_refptr<gpu::ClientSharedImage> shared_image =
@@ -483,7 +486,8 @@
 }
 
 // Test that AssociateMailbox with a bad mailbox produces an error texture.
-TEST_P(WebGPUMailboxTest, AssociateMailboxCmdBadMailboxMakesErrorTexture) {
+TEST_P(WebGPUMailboxTextureTest,
+       AssociateMailboxCmdBadMailboxMakesErrorTexture) {
   // Create the shared image
   SharedImageInterface* sii = GetSharedImageInterface();
   scoped_refptr<gpu::ClientSharedImage> shared_image =
@@ -523,7 +527,7 @@
                       texture.CreateView());
 }
 
-TEST_P(WebGPUMailboxTest, DissociateMailboxCmd) {
+TEST_P(WebGPUMailboxTextureTest, DissociateMailboxCmd) {
   // Create the shared image
   SharedImageInterface* sii = GetSharedImageInterface();
   scoped_refptr<gpu::ClientSharedImage> shared_image =
@@ -593,7 +597,7 @@
 // For simplicity of the test the image is shared between a Dawn device and
 // itself: we render to it using the Dawn device, then re-associate it to a
 // Dawn texture and read back the values that were written.
-TEST_P(WebGPUMailboxTest, WriteToMailboxThenReadFromIt) {
+TEST_P(WebGPUMailboxTextureTest, WriteToMailboxThenReadFromIt) {
   SKIP_TEST_IF(GetParam().format == viz::SinglePlaneFormat::kRGBA_F16);
 
   // Create the shared image
@@ -674,7 +678,8 @@
 
 // Test that passing write usages when associating a mailbox fails if
 // the SharedImage associated with the mailbox doesn't have WEBGPU_WRITE access.
-TEST_P(WebGPUMailboxTest, PassWriteUsagesWhenAssociatingReadOnlyMailbox) {
+TEST_P(WebGPUMailboxTextureTest,
+       PassWriteUsagesWhenAssociatingReadOnlyMailbox) {
   // Create the shared image.
   SharedImageInterface* sii = GetSharedImageInterface();
   scoped_refptr<gpu::ClientSharedImage> shared_image =
@@ -727,7 +732,7 @@
 
 // Test that passing internal write usages when associating a mailbox fails if
 // the SharedImage associated with the mailbox doesn't have WEBGPU_WRITE access.
-TEST_P(WebGPUMailboxTest,
+TEST_P(WebGPUMailboxTextureTest,
        PassInternalWriteUsagesWhenAssociatingReadOnlyMailbox) {
   // Create the shared image.
   SharedImageInterface* sii = GetSharedImageInterface();
@@ -781,7 +786,7 @@
 
 // Test that passing WEBGPU_MAILBOX_DISCARD when associating a mailbox fails if
 // the SharedImage associated with the mailbox doesn't have WEBGPU_WRITE access.
-TEST_P(WebGPUMailboxTest, PassDiscardWhenAssociatingReadOnlyMailbox) {
+TEST_P(WebGPUMailboxTextureTest, PassDiscardWhenAssociatingReadOnlyMailbox) {
   // Create the shared image.
   SharedImageInterface* sii = GetSharedImageInterface();
   scoped_refptr<gpu::ClientSharedImage> shared_image =
@@ -834,7 +839,7 @@
 
 // Test that passing WEBGPU_MAILBOX_DISCARD when associating a mailbox fails if
 // the client doesn't pass a usage supporting lazy clearing.
-TEST_P(WebGPUMailboxTest,
+TEST_P(WebGPUMailboxTextureTest,
        PassDiscardWhenAssociatingMailboxWithoutUsageSupportingClearing) {
   // Create the shared image.
   SharedImageInterface* sii = GetSharedImageInterface();
@@ -888,7 +893,7 @@
 
 // Test that an uninitialized writable shared image is lazily cleared by Dawn
 // when it is accessed with an internal write usage supporting lazy clearing.
-TEST_P(WebGPUMailboxTest,
+TEST_P(WebGPUMailboxTextureTest,
        ReadWritableUninitializedSharedImageWhenAccessedWithInternalWriteUsage) {
   // Create the shared image. Note that it is uncleared by default.
   SharedImageInterface* sii = GetSharedImageInterface();
@@ -995,7 +1000,7 @@
 
 // Test that an uninitialized writable shared image is lazily cleared by Dawn
 // when it is read if a usage supporting lazy clearing is passed.
-TEST_P(WebGPUMailboxTest,
+TEST_P(WebGPUMailboxTextureTest,
        ReadWritableUninitializedSharedImageWithUsageSupportingLazyClearing) {
   // Create the shared image.
   SharedImageInterface* sii = GetSharedImageInterface();
@@ -1087,7 +1092,7 @@
 // Test that an uninitialized writable shared image is lazily cleared by Dawn
 // when it is read if an internal usage supporting lazy clearing is passed.
 TEST_P(
-    WebGPUMailboxTest,
+    WebGPUMailboxTextureTest,
     ReadWritableUninitializedSharedImageWithInternalUsageSupportingLazyClearing) {
   // Create the shared image.
   SharedImageInterface* sii = GetSharedImageInterface();
@@ -1163,7 +1168,7 @@
 }
 
 // Tests that using a shared image aftr it is dissociated produces an error.
-TEST_P(WebGPUMailboxTest, ErrorWhenUsingTextureAfterDissociate) {
+TEST_P(WebGPUMailboxTextureTest, ErrorWhenUsingTextureAfterDissociate) {
   // Create the shared image.
   // NOTE: It's necessary to add WEBGPU_WRITE access as the created SharedImage
   // will be uncleared and hence require lazy clearing on access.
@@ -1241,7 +1246,7 @@
 // the move-assignment operator to be called. In this case the defaulted
 // move-assignment would first move `representation` then `access`. Causing
 // incorrect member destruction order for the move-to object.
-TEST_P(WebGPUMailboxTest, UseA_UseB_DestroyA_DestroyB) {
+TEST_P(WebGPUMailboxTextureTest, UseA_UseB_DestroyA_DestroyB) {
   // Create a the shared images.
   SharedImageInterface* sii = GetSharedImageInterface();
   scoped_refptr<gpu::ClientSharedImage> shared_image_a =
@@ -1286,7 +1291,7 @@
 // images was stored globally instead of per-device. This meant that of two
 // devices tried to create shared images with the same (id, generation) (which
 // is possible because they can be on different Dawn wires) they would conflict.
-TEST_P(WebGPUMailboxTest, AssociateOnTwoDevicesAtTheSameTime) {
+TEST_P(WebGPUMailboxTextureTest, AssociateOnTwoDevicesAtTheSameTime) {
   // Create a the shared images.
   SharedImageInterface* sii = GetSharedImageInterface();
   scoped_refptr<gpu::ClientSharedImage> shared_image_a =
@@ -1334,7 +1339,7 @@
 
 // Test that passing a descriptor to ReserveTexture produces a client-side
 // WGPUTexture that correctly reflects said descriptor.
-TEST_P(WebGPUMailboxTest, ReflectionOfDescriptor) {
+TEST_P(WebGPUMailboxTextureTest, ReflectionOfDescriptor) {
   // Check that reserving a texture with a full descriptor give the same data
   // back through reflection.
   wgpu::TextureDescriptor desc1 = {};
@@ -1413,7 +1418,7 @@
 // Associate/DissociateMailbox occurs, the operations do not fail. Some WebGPU
 // shared image backings rely on GL and need to be responsible for making the
 // context current.
-TEST_P(WebGPUMailboxTest, AssociateDissociateMailboxWhenNotCurrent) {
+TEST_P(WebGPUMailboxTextureTest, AssociateDissociateMailboxWhenNotCurrent) {
   // Create the shared image
   SharedImageInterface* sii = GetSharedImageInterface();
   scoped_refptr<gpu::ClientSharedImage> shared_image =
@@ -1507,9 +1512,343 @@
                      std::move(gl_surface1), std::move(gl_surface2)));
 }
 
-INSTANTIATE_TEST_SUITE_P(,
-                         WebGPUMailboxTest,
-                         ::testing::ValuesIn(WebGPUMailboxTest::TestParams()),
-                         ::testing::PrintToStringParamName());
+INSTANTIATE_TEST_SUITE_P(
+    ,
+    WebGPUMailboxTextureTest,
+    ::testing::ValuesIn(WebGPUMailboxTextureTest::TestParams()),
+    ::testing::PrintToStringParamName());
+
+class WebGPUMailboxBufferTest : public WebGPUMailboxTestBase {
+ public:
+  void SetUp() override {
+    SKIP_TEST_IF(!WebGPUSupported());
+    SKIP_TEST_IF(!WebGPUSharedImageSupported());
+    WebGPUTest::SetUp();
+
+    WebGPUTest::Options options = {};
+    options.enable_unsafe_webgpu = true;
+    Initialize(options);
+
+    wgpu::AdapterInfo info;
+    adapter_.GetInfo(&info);
+    // Buffer-backed SharedImages are only supported on D3D12 right now.
+    SKIP_TEST_IF(info.backendType != wgpu::BackendType::D3D12);
+
+    device_ = GetNewDevice(kRequiredFeatures);
+
+    mock_buffer_map_callback =
+        std::make_unique<testing::StrictMock<MockBufferMapCallback>>();
+
+    SharedImageInterface* sii = GetSharedImageInterface();
+    shared_image_ = sii->CreateSharedImage(
+        {viz::SharedImageFormat(),
+         {kBufferSize, 1},
+         gfx::ColorSpace(),
+         kTopLeft_GrSurfaceOrigin,
+         kUnknown_SkAlphaType,
+         gpu::SHARED_IMAGE_USAGE_WEBGPU_READ |
+             gpu::SHARED_IMAGE_USAGE_WEBGPU_WRITE |
+             gpu::SHARED_IMAGE_USAGE_WEBGPU_SHARED_BUFFER,
+         "TestLabel"},
+        kNullSurfaceHandle);
+  }
+
+  void TearDown() override {
+    mock_buffer_map_callback = nullptr;
+    // Wait for all operations to catch any validation or device lost errors.
+    PollUntilIdle();
+    device_ = nullptr;
+    WebGPUTest::TearDown();
+  }
+
+  struct AssociateMailboxForBufferCmdStorage {
+    webgpu::cmds::AssociateMailboxForBufferImmediate cmd;
+
+    // Immediate data is copied into the space immediately following `cmd`.
+    // Allocate space to hold 1 mailbox.
+    GLbyte data[GL_MAILBOX_SIZE_CHROMIUM];
+  };
+
+ protected:
+  std::vector<wgpu::FeatureName> kRequiredFeatures = {
+      wgpu::FeatureName::SharedBufferMemoryD3D12Resource};
+  const int kBufferSize = 4;
+  const uint32_t kBufferData = 0x12345678;
+  wgpu::Device device_;
+  scoped_refptr<gpu::ClientSharedImage> shared_image_;
+};
+
+// Test that AssociateMailboxForBuffer works as expected.
+TEST_F(WebGPUMailboxBufferTest, AssociateMailboxForBufferCmd) {
+  webgpu::ReservedBuffer reservation = webgpu()->ReserveBuffer(device_.Get());
+
+  GetGpuServiceHolder()->ScheduleGpuMainTask(base::BindOnce(
+      [](webgpu::WebGPUDecoder* decoder, webgpu::ReservedBuffer reservation,
+         scoped_refptr<gpu::ClientSharedImage> shared_image) {
+        const gpu::Mailbox& mailbox = shared_image->mailbox();
+
+        // Error case: device client id doesn't exist.
+        {
+          AssociateMailboxForBufferCmdStorage cmd;
+          cmd.cmd.Init(reservation.deviceId + 1, reservation.deviceGeneration,
+                       reservation.id, reservation.generation,
+                       WGPUBufferUsage_Storage,
+                       reinterpret_cast<const GLuint*>(&mailbox.name));
+          EXPECT_EQ(
+              error::kInvalidArguments,
+              ExecuteImmediateCmd(decoder, cmd.cmd, sizeof(mailbox.name)));
+        }
+
+        // Error case: device generation is invalid.
+        {
+          AssociateMailboxForBufferCmdStorage cmd;
+          cmd.cmd.Init(reservation.deviceId, reservation.deviceGeneration + 1,
+                       reservation.id, reservation.generation,
+                       WGPUBufferUsage_Storage,
+                       reinterpret_cast<const GLuint*>(&mailbox.name));
+          EXPECT_EQ(
+              error::kInvalidArguments,
+              ExecuteImmediateCmd(decoder, cmd.cmd, sizeof(mailbox.name)));
+        }
+
+        // Error case: buffer ID invalid for the wire server.
+        {
+          AssociateMailboxForBufferCmdStorage cmd;
+          cmd.cmd.Init(reservation.deviceId, reservation.deviceGeneration,
+                       reservation.id + 1, reservation.generation,
+                       WGPUBufferUsage_Storage,
+                       reinterpret_cast<const GLuint*>(&mailbox.name));
+          EXPECT_EQ(
+              error::kInvalidArguments,
+              ExecuteImmediateCmd(decoder, cmd.cmd, sizeof(mailbox.name)));
+        }
+
+        // Error case: packed data empty.
+        {
+          AssociateMailboxForBufferCmdStorage cmd;
+          cmd.cmd.Init(reservation.deviceId, reservation.deviceGeneration,
+                       reservation.id, reservation.generation,
+                       WGPUBufferUsage_Storage,
+                       reinterpret_cast<const GLuint*>(&mailbox.name));
+          EXPECT_EQ(error::kOutOfBounds,
+                    ExecuteImmediateCmd(decoder, cmd.cmd, 0u));
+        }
+
+        // Control case: test a successful call to AssociateMailboxForBuffer.
+        // The control case is not put first because it modifies the internal
+        // state of the Dawn wire server and would make calls with the same
+        // buffer ID and generation invalid.
+        {
+          AssociateMailboxForBufferCmdStorage cmd;
+          cmd.cmd.Init(reservation.deviceId, reservation.deviceGeneration,
+                       reservation.id, reservation.generation,
+                       WGPUBufferUsage_Storage,
+                       reinterpret_cast<const GLuint*>(&mailbox.name));
+          EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(decoder, cmd.cmd,
+                                                         sizeof(mailbox.name)));
+        }
+
+        // Error case: associated to an already associated buffer.
+        {
+          AssociateMailboxForBufferCmdStorage cmd;
+          cmd.cmd.Init(reservation.deviceId, reservation.deviceGeneration,
+                       reservation.id, reservation.generation,
+                       WGPUBufferUsage_Storage,
+                       reinterpret_cast<const GLuint*>(&mailbox.name));
+          EXPECT_EQ(
+              error::kInvalidArguments,
+              ExecuteImmediateCmd(decoder, cmd.cmd, sizeof(mailbox.name)));
+        }
+
+        // Dissociate the buffer from the control case to remove its reference.
+        {
+          webgpu::cmds::DissociateMailboxForBuffer cmd;
+          cmd.Init(reservation.id, reservation.generation);
+          EXPECT_EQ(error::kNoError, ExecuteCmd(decoder, cmd));
+        }
+      },
+      GetDecoder(), reservation, std::move(shared_image_)));
+
+  GetGpuServiceHolder()
+      ->gpu_main_thread_task_runner()
+      ->RunsTasksInCurrentSequence();
+}
+
+// Test that AssociateMailboxForBuffer with a bad mailbox produces an error
+// buffer.
+TEST_F(WebGPUMailboxBufferTest,
+       AssociateMailboxForBufferCmdBadMailboxMakesErrorBuffer) {
+  webgpu::ReservedBuffer reservation = webgpu()->ReserveBuffer(device_.Get());
+
+  GetGpuServiceHolder()->ScheduleGpuMainTask(base::BindOnce(
+      [](webgpu::WebGPUDecoder* decoder, webgpu::ReservedBuffer reservation,
+         scoped_refptr<gpu::ClientSharedImage> shared_image) {
+        // Calling AssociateMailboxForBuffer with an invalid Mailbox should
+        // return an error buffer.
+        {
+          gpu::Mailbox bad_mailbox;
+          AssociateMailboxForBufferCmdStorage cmd;
+          cmd.cmd.Init(reservation.deviceId, reservation.deviceGeneration,
+                       reservation.id, reservation.generation,
+                       WGPUBufferUsage_CopyDst,
+                       reinterpret_cast<const GLuint*>(&bad_mailbox.name));
+          EXPECT_EQ(
+              error::kNoError,
+              ExecuteImmediateCmd(decoder, cmd.cmd, sizeof(bad_mailbox.name)));
+        }
+      },
+      GetDecoder(), reservation, std::move(shared_image_)));
+
+  wgpu::Buffer buffer = wgpu::Buffer::Acquire(reservation.buffer);
+  wgpu::CommandEncoder encoder = device_.CreateCommandEncoder();
+  encoder.ClearBuffer(buffer, 0, kBufferSize);
+  // Expect an error when finishing encoding because the buffer is an error.
+  EXPECT_WEBGPU_ERROR(device_, wgpu::ErrorType::Validation,
+                      wgpu::CommandBuffer commands = encoder.Finish());
+}
+
+// Test that DissociateMailboxForBuffer works as expected.
+TEST_F(WebGPUMailboxBufferTest, DissociateMailboxForBufferCmd) {
+  webgpu::ReservedBuffer reservation = webgpu()->ReserveBuffer(device_.Get());
+
+  GetGpuServiceHolder()->ScheduleGpuMainTask(base::BindOnce(
+      [](webgpu::WebGPUDecoder* decoder, webgpu::ReservedBuffer reservation,
+         scoped_refptr<gpu::ClientSharedImage> shared_image) {
+        const gpu::Mailbox& mailbox = shared_image->mailbox();
+
+        // Associate a mailbox so we can later dissociate it.
+        {
+          AssociateMailboxForBufferCmdStorage cmd;
+          cmd.cmd.Init(reservation.deviceId, reservation.deviceGeneration,
+                       reservation.id, reservation.generation,
+                       WGPUBufferUsage_Storage,
+                       reinterpret_cast<const GLuint*>(&mailbox.name));
+          EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(decoder, cmd.cmd,
+                                                         sizeof(mailbox.name)));
+        }
+
+        // Error case: wrong buffer ID
+        {
+          webgpu::cmds::DissociateMailboxForBuffer cmd;
+          cmd.Init(reservation.id + 1, reservation.generation);
+          EXPECT_EQ(error::kInvalidArguments, ExecuteCmd(decoder, cmd));
+        }
+
+        // Error case: wrong buffer generation
+        {
+          webgpu::cmds::DissociateMailboxForBuffer cmd;
+          cmd.Init(reservation.id, reservation.generation + 1);
+          EXPECT_EQ(error::kInvalidArguments, ExecuteCmd(decoder, cmd));
+        }
+
+        // Success case
+        {
+          webgpu::cmds::DissociateMailboxForBuffer cmd;
+          cmd.Init(reservation.id, reservation.generation);
+          EXPECT_EQ(error::kNoError, ExecuteCmd(decoder, cmd));
+        }
+
+        // Error case: dissociate an already dissociated mailbox
+        {
+          webgpu::cmds::DissociateMailboxForBuffer cmd;
+          cmd.Init(reservation.id, reservation.generation);
+          EXPECT_EQ(error::kInvalidArguments, ExecuteCmd(decoder, cmd));
+        }
+      },
+      GetDecoder(), reservation, std::move(shared_image_)));
+
+  GetGpuServiceHolder()
+      ->gpu_main_thread_task_runner()
+      ->RunsTasksInCurrentSequence();
+}
+
+// Tests using Associate/DissociateMailbox to share a buffer with Dawn.
+TEST_F(WebGPUMailboxBufferTest, WriteToMailboxThenReadFromIt) {
+  webgpu::ReservedBuffer reservation = webgpu()->ReserveBuffer(device_.Get());
+
+  SharedImageInterface* sii = GetSharedImageInterface();
+  SyncToken mailbox_produced_token = sii->GenVerifiedSyncToken();
+  webgpu()->WaitSyncTokenCHROMIUM(mailbox_produced_token.GetConstData());
+
+  webgpu()->AssociateMailboxForBuffer(
+      reservation.deviceId, reservation.deviceGeneration, reservation.id,
+      reservation.generation,
+      WGPUBufferUsage_Storage | WGPUBufferUsage_CopySrc |
+          WGPUBufferUsage_CopyDst,
+      shared_image_->mailbox());
+  wgpu::Buffer mailbox_buffer = wgpu::Buffer::Acquire(reservation.buffer);
+
+  // Create an buffer and write data to it.
+  wgpu::BufferDescriptor data_buffer_desc;
+  data_buffer_desc.size = kBufferSize;
+  data_buffer_desc.usage =
+      wgpu::BufferUsage::CopyDst | wgpu::BufferUsage::CopySrc;
+  wgpu::Buffer data_buffer = device_.CreateBuffer(&data_buffer_desc);
+
+  wgpu::Queue queue = device_.GetQueue();
+  queue.WriteBuffer(data_buffer, 0, &kBufferData, kBufferSize);
+
+  // Create a readback buffer to store result data.
+  wgpu::BufferDescriptor readback_buffer_desc;
+  readback_buffer_desc.size = kBufferSize;
+  readback_buffer_desc.usage =
+      wgpu::BufferUsage::MapRead | wgpu::BufferUsage::CopyDst;
+  wgpu::Buffer readback_buffer = device_.CreateBuffer(&readback_buffer_desc);
+
+  // Copy data from the upload buffer to the mailbox buffer, then from the
+  // mailbox buffer to the readback buffer.
+  wgpu::CommandEncoder encoder = device_.CreateCommandEncoder();
+  encoder.CopyBufferToBuffer(data_buffer, 0, mailbox_buffer, 0, kBufferSize);
+  encoder.CopyBufferToBuffer(mailbox_buffer, 0, readback_buffer, 0,
+                             kBufferSize);
+  wgpu::CommandBuffer commands = encoder.Finish();
+  queue = device_.GetQueue();
+  queue.Submit(1, &commands);
+
+  webgpu()->DissociateMailboxForBuffer(reservation.id, reservation.generation);
+
+  // Map the readback buffer and check that it contains the correct value.
+  readback_buffer.MapAsync(wgpu::MapMode::Read, 0, 4,
+                           wgpu::CallbackMode::AllowSpontaneous,
+                           ToMockBufferMapCallback);
+  EXPECT_CALL(*mock_buffer_map_callback,
+              Call(wgpu::MapAsyncStatus::Success, nullptr))
+      .Times(1);
+
+  WaitForCompletion(device_);
+  const void* readback_data = readback_buffer.GetConstMappedRange();
+  EXPECT_EQ(kBufferData, *static_cast<const uint32_t*>(readback_data));
+}
+
+// Tests that using a mailbox buffer after it is dissociated produces an
+// error.
+TEST_F(WebGPUMailboxBufferTest, ErrorWhenUsingBufferAfterDissociate) {
+  webgpu::ReservedBuffer reservation = webgpu()->ReserveBuffer(device_.Get());
+
+  SharedImageInterface* sii = GetSharedImageInterface();
+  SyncToken mailbox_produced_token = sii->GenVerifiedSyncToken();
+  webgpu()->WaitSyncTokenCHROMIUM(mailbox_produced_token.GetConstData());
+
+  wgpu::Buffer mailbox_buffer = wgpu::Buffer::Acquire(reservation.buffer);
+
+  webgpu()->AssociateMailboxForBuffer(
+      reservation.deviceId, reservation.deviceGeneration, reservation.id,
+      reservation.generation,
+      WGPUBufferUsage_Storage | WGPUBufferUsage_CopySrc |
+          WGPUBufferUsage_CopyDst,
+      shared_image_->mailbox());
+  webgpu()->DissociateMailboxForBuffer(reservation.id, reservation.generation);
+
+  wgpu::CommandEncoder encoder = device_.CreateCommandEncoder();
+  encoder.ClearBuffer(mailbox_buffer, 0, kBufferSize);
+  wgpu::CommandBuffer commands = encoder.Finish();
+
+  // Wait so it's clear the validation error after this when we call Submit.
+  WaitForCompletion(device_);
+  EXPECT_WEBGPU_ERROR(device_, wgpu::ErrorType::Validation,
+                      device_.GetQueue().Submit(1, &commands));
+
+  WaitForCompletion(device_);
+}
 
 }  // namespace gpu
diff --git a/gpu/command_buffer/tests/webgpu_test.cc b/gpu/command_buffer/tests/webgpu_test.cc
index b8129747..d5c7f94 100644
--- a/gpu/command_buffer/tests/webgpu_test.cc
+++ b/gpu/command_buffer/tests/webgpu_test.cc
@@ -226,12 +226,16 @@
   context_->GetTaskRunner()->RunPendingTasks();
 }
 
-wgpu::Device WebGPUTest::GetNewDevice() {
+wgpu::Device WebGPUTest::GetNewDevice(
+    std::vector<wgpu::FeatureName> requiredFeatures) {
   wgpu::Device device;
   bool done = false;
 
   DCHECK(adapter_);
   wgpu::DeviceDescriptor device_desc = {};
+  device_desc.requiredFeatureCount = requiredFeatures.size();
+  device_desc.requiredFeatures = requiredFeatures.data();
+
   device_desc.SetDeviceLostCallback(
       wgpu::CallbackMode::AllowSpontaneous,
       [](const wgpu::Device&, wgpu::DeviceLostReason reason,
diff --git a/gpu/command_buffer/tests/webgpu_test.h b/gpu/command_buffer/tests/webgpu_test.h
index a89534c..30976bc 100644
--- a/gpu/command_buffer/tests/webgpu_test.h
+++ b/gpu/command_buffer/tests/webgpu_test.h
@@ -76,7 +76,8 @@
   void WaitForCompletion(wgpu::Device device);
   void PollUntilIdle();
 
-  wgpu::Device GetNewDevice();
+  wgpu::Device GetNewDevice(
+      std::vector<wgpu::FeatureName> requiredFeatures = {});
 
   viz::TestGpuServiceHolder* GetGpuServiceHolder() {
     return gpu_service_holder_.get();
diff --git a/gpu/command_buffer/webgpu_cmd_buffer_functions.txt b/gpu/command_buffer/webgpu_cmd_buffer_functions.txt
index 9d2bcab1..92aee8c 100644
--- a/gpu/command_buffer/webgpu_cmd_buffer_functions.txt
+++ b/gpu/command_buffer/webgpu_cmd_buffer_functions.txt
@@ -8,7 +8,9 @@
 // completely ignored.
 GL_APICALL void GL_APIENTRY wgDawnCommands (uint32_t trace_id_high, uint32_t trace_id_low, const char* commands, size_t size);
 GL_APICALL void GL_APIENTRY wgAssociateMailbox (GLuint device_id, GLuint device_generation, GLuint id, GLuint generation, uint64_t usage, uint64_t internal_usage, MailboxFlags flags, GLuint view_format_count, GLuint count, const GLuint* mailbox_and_view_formats);
+GL_APICALL void GL_APIENTRY wgAssociateMailboxForBuffer (GLuint device_id, GLuint device_generation, GLuint id, GLuint generation, uint64_t usage, const GLuint* mailbox);
 GL_APICALL void GL_APIENTRY wgDissociateMailbox (GLuint texture_id, GLuint texture_generation);
+GL_APICALL void GL_APIENTRY wgDissociateMailboxForBuffer (GLuint buffer_id, GLuint buffer_generation);
 GL_APICALL void GL_APIENTRY wgDissociateMailboxForPresent (GLuint device_id, GLuint device_generation, GLuint texture_id, GLuint texture_generation);
 
 // The WebGPUExecutionContextTokens are represented by two 64 bit uints, but the
diff --git a/infra/config/generated/builder-owners/bling-engprod@google.com.txt b/infra/config/generated/builder-owners/bling-engprod@google.com.txt
index 4272dc6d..a27674f0 100644
--- a/infra/config/generated/builder-owners/bling-engprod@google.com.txt
+++ b/infra/config/generated/builder-owners/bling-engprod@google.com.txt
@@ -3,6 +3,7 @@
 ci/Mac11 Tests
 ci/Mac12 Tests
 ci/ios-m1-simulator
+ci/ios-vm
 ci/mac-archive-rel
 ci/mac-arm64-archive-rel
 ci/mac-arm64-dbg
@@ -15,6 +16,7 @@
 ci/mac14-arm64-rel-tests
 ci/mac14-tests
 ci/mac14-tests-dbg
+try/ios-vm
 try/mac14-arm64-rel
 try/mac14-arm64-rel-compilator
 try/mac14-tests
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/android-cronet-arm64-gn2bp-dbg/properties.json b/infra/config/generated/builders/ci/android-cronet-arm64-gn2bp-dbg/properties.json
index d92ec4a..507f1b15 100644
--- a/infra/config/generated/builders/ci/android-cronet-arm64-gn2bp-dbg/properties.json
+++ b/infra/config/generated/builders/ci/android-cronet-arm64-gn2bp-dbg/properties.json
@@ -31,7 +31,8 @@
               },
               "legacy_gclient_config": {
                 "apply_configs": [
-                  "android"
+                  "android",
+                  "checkout_copybara"
                 ],
                 "config": "chromium"
               }
diff --git a/infra/config/generated/builders/ci/ios-vm/gn-args.json b/infra/config/generated/builders/ci/ios-vm/gn-args.json
new file mode 100644
index 0000000..a7da5ef
--- /dev/null
+++ b/infra/config/generated/builders/ci/ios-vm/gn-args.json
@@ -0,0 +1,13 @@
+{
+  "gn_args": {
+    "enable_run_ios_unittests_with_xctest": true,
+    "is_component_build": false,
+    "is_debug": true,
+    "symbol_level": 1,
+    "target_cpu": "arm64",
+    "target_environment": "simulator",
+    "target_os": "ios",
+    "use_remoteexec": true,
+    "use_siso": true
+  }
+}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/ios-vm/properties.json b/infra/config/generated/builders/ci/ios-vm/properties.json
new file mode 100644
index 0000000..57c829c
--- /dev/null
+++ b/infra/config/generated/builders/ci/ios-vm/properties.json
@@ -0,0 +1,75 @@
+{
+  "$build/chromium_tests_builder_config": {
+    "builder_config": {
+      "additional_exclusions": [
+        "infra/config/generated/builders/ci/ios-vm/gn-args.json"
+      ],
+      "builder_db": {
+        "entries": [
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "ios-vm",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "builder_group": "chromium.fyi",
+              "execution_mode": "COMPILE_AND_TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "mb",
+                  "mac_toolchain"
+                ],
+                "build_config": "Debug",
+                "config": "chromium",
+                "target_bits": 64,
+                "target_platform": "ios"
+              },
+              "legacy_gclient_config": {
+                "config": "ios"
+              }
+            }
+          }
+        ]
+      },
+      "builder_ids": [
+        {
+          "bucket": "ci",
+          "builder": "ios-vm",
+          "project": "chromium"
+        }
+      ],
+      "mirroring_builder_group_and_names": [
+        {
+          "builder": "ios-vm",
+          "group": "tryserver.chromium.mac"
+        }
+      ]
+    }
+  },
+  "$build/reclient": {
+    "instance": "rbe-chromium-trusted",
+    "metrics_project": "chromium-reclient-metrics",
+    "scandeps_server": true
+  },
+  "$build/siso": {
+    "configs": [
+      "builder"
+    ],
+    "enable_cloud_profiler": true,
+    "enable_cloud_trace": true,
+    "experiments": [],
+    "project": "rbe-chromium-trusted",
+    "remote_jobs": 250
+  },
+  "$recipe_engine/resultdb/test_presentation": {
+    "column_keys": [],
+    "grouping_keys": [
+      "status",
+      "v.test_suite"
+    ]
+  },
+  "builder_group": "chromium.fyi",
+  "recipe": "chromium",
+  "xcode_build_version": "16a242d"
+}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/ios-vm/shadow-properties.json b/infra/config/generated/builders/ci/ios-vm/shadow-properties.json
new file mode 100644
index 0000000..673c7c0
--- /dev/null
+++ b/infra/config/generated/builders/ci/ios-vm/shadow-properties.json
@@ -0,0 +1,17 @@
+{
+  "$build/reclient": {
+    "instance": "rbe-chromium-untrusted",
+    "metrics_project": "chromium-reclient-metrics",
+    "scandeps_server": true
+  },
+  "$build/siso": {
+    "configs": [
+      "builder"
+    ],
+    "enable_cloud_profiler": true,
+    "enable_cloud_trace": true,
+    "experiments": [],
+    "project": "rbe-chromium-untrusted",
+    "remote_jobs": 250
+  }
+}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/linux-angle-chromium-builder/targets/chromium.angle.json b/infra/config/generated/builders/ci/linux-angle-chromium-builder/targets/chromium.angle.json
index 0095e319..226b475 100644
--- a/infra/config/generated/builders/ci/linux-angle-chromium-builder/targets/chromium.angle.json
+++ b/infra/config/generated/builders/ci/linux-angle-chromium-builder/targets/chromium.angle.json
@@ -16,8 +16,8 @@
         "swarming": {
           "containment_type": "AUTO",
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -44,8 +44,8 @@
         "swarming": {
           "containment_type": "AUTO",
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -82,8 +82,8 @@
         "swarming": {
           "containment_type": "AUTO",
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "idempotent": false,
@@ -115,8 +115,8 @@
         "swarming": {
           "containment_type": "AUTO",
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "idempotent": false,
@@ -150,8 +150,8 @@
         "swarming": {
           "containment_type": "AUTO",
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "idempotent": false,
@@ -185,8 +185,8 @@
         "swarming": {
           "containment_type": "AUTO",
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "idempotent": false,
diff --git a/infra/config/generated/builders/ci/linux-angle-chromium-intel/targets/chromium.angle.json b/infra/config/generated/builders/ci/linux-angle-chromium-intel/targets/chromium.angle.json
index b66399c1..be429b84 100644
--- a/infra/config/generated/builders/ci/linux-angle-chromium-intel/targets/chromium.angle.json
+++ b/infra/config/generated/builders/ci/linux-angle-chromium-intel/targets/chromium.angle.json
@@ -15,8 +15,8 @@
         "swarming": {
           "containment_type": "AUTO",
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -43,8 +43,8 @@
         "swarming": {
           "containment_type": "AUTO",
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -81,8 +81,8 @@
         "swarming": {
           "containment_type": "AUTO",
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "idempotent": false,
@@ -114,8 +114,8 @@
         "swarming": {
           "containment_type": "AUTO",
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "idempotent": false,
@@ -149,8 +149,8 @@
         "swarming": {
           "containment_type": "AUTO",
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "idempotent": false,
@@ -184,8 +184,8 @@
         "swarming": {
           "containment_type": "AUTO",
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "idempotent": false,
diff --git a/infra/config/generated/builders/gn_args_locations.json b/infra/config/generated/builders/gn_args_locations.json
index d83227e..cefdf15 100644
--- a/infra/config/generated/builders/gn_args_locations.json
+++ b/infra/config/generated/builders/gn_args_locations.json
@@ -313,6 +313,7 @@
     "ios-blink-dbg-fyi": "ci/ios-blink-dbg-fyi/gn-args.json",
     "ios-fieldtrial-rel": "ci/ios-fieldtrial-rel/gn-args.json",
     "ios-m1-simulator": "ci/ios-m1-simulator/gn-args.json",
+    "ios-vm": "ci/ios-vm/gn-args.json",
     "ios-webkit-tot": "ci/ios-webkit-tot/gn-args.json",
     "ios-wpt-fyi-rel": "ci/ios-wpt-fyi-rel/gn-args.json",
     "ios17-beta-simulator": "ci/ios17-beta-simulator/gn-args.json",
@@ -873,6 +874,7 @@
     "ios-simulator-exp": "try/ios-simulator-exp/gn-args.json",
     "ios-simulator-full-configs": "try/ios-simulator-full-configs/gn-args.json",
     "ios-simulator-noncq": "try/ios-simulator-noncq/gn-args.json",
+    "ios-vm": "try/ios-vm/gn-args.json",
     "ios-wpt-fyi-rel": "try/ios-wpt-fyi-rel/gn-args.json",
     "ios17-beta-simulator": "try/ios17-beta-simulator/gn-args.json",
     "ios17-sdk-simulator": "try/ios17-sdk-simulator/gn-args.json",
diff --git a/infra/config/generated/builders/try/android-cronet-arm64-gn2bp-dbg/properties.json b/infra/config/generated/builders/try/android-cronet-arm64-gn2bp-dbg/properties.json
index 5c3b899..24075869 100644
--- a/infra/config/generated/builders/try/android-cronet-arm64-gn2bp-dbg/properties.json
+++ b/infra/config/generated/builders/try/android-cronet-arm64-gn2bp-dbg/properties.json
@@ -31,7 +31,8 @@
               },
               "legacy_gclient_config": {
                 "apply_configs": [
-                  "android"
+                  "android",
+                  "checkout_copybara"
                 ],
                 "config": "chromium"
               }
diff --git a/infra/config/generated/builders/try/ios-vm/gn-args.json b/infra/config/generated/builders/try/ios-vm/gn-args.json
new file mode 100644
index 0000000..a7da5ef
--- /dev/null
+++ b/infra/config/generated/builders/try/ios-vm/gn-args.json
@@ -0,0 +1,13 @@
+{
+  "gn_args": {
+    "enable_run_ios_unittests_with_xctest": true,
+    "is_component_build": false,
+    "is_debug": true,
+    "symbol_level": 1,
+    "target_cpu": "arm64",
+    "target_environment": "simulator",
+    "target_os": "ios",
+    "use_remoteexec": true,
+    "use_siso": true
+  }
+}
\ No newline at end of file
diff --git a/infra/config/generated/builders/try/ios-vm/properties.json b/infra/config/generated/builders/try/ios-vm/properties.json
new file mode 100644
index 0000000..0d6d5ad0
--- /dev/null
+++ b/infra/config/generated/builders/try/ios-vm/properties.json
@@ -0,0 +1,68 @@
+{
+  "$build/chromium_tests_builder_config": {
+    "builder_config": {
+      "additional_exclusions": [
+        "infra/config/generated/builders/try/ios-vm/gn-args.json"
+      ],
+      "builder_db": {
+        "entries": [
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "ios-vm",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "builder_group": "chromium.fyi",
+              "execution_mode": "COMPILE_AND_TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "mb",
+                  "mac_toolchain"
+                ],
+                "build_config": "Debug",
+                "config": "chromium",
+                "target_bits": 64,
+                "target_platform": "ios"
+              },
+              "legacy_gclient_config": {
+                "config": "ios"
+              }
+            }
+          }
+        ]
+      },
+      "builder_ids": [
+        {
+          "bucket": "ci",
+          "builder": "ios-vm",
+          "project": "chromium"
+        }
+      ]
+    }
+  },
+  "$build/reclient": {
+    "instance": "rbe-chromium-untrusted",
+    "metrics_project": "chromium-reclient-metrics",
+    "scandeps_server": true
+  },
+  "$build/siso": {
+    "configs": [
+      "builder"
+    ],
+    "enable_cloud_profiler": true,
+    "enable_cloud_trace": true,
+    "experiments": [],
+    "project": "rbe-chromium-untrusted"
+  },
+  "$recipe_engine/resultdb/test_presentation": {
+    "column_keys": [],
+    "grouping_keys": [
+      "status",
+      "v.test_suite"
+    ]
+  },
+  "builder_group": "tryserver.chromium.mac",
+  "recipe": "chromium_trybot",
+  "xcode_build_version": "16a242d"
+}
\ No newline at end of file
diff --git a/infra/config/generated/builders/try/linux-angle-chromium-try/targets/chromium.angle.json b/infra/config/generated/builders/try/linux-angle-chromium-try/targets/chromium.angle.json
index 0095e319..226b475 100644
--- a/infra/config/generated/builders/try/linux-angle-chromium-try/targets/chromium.angle.json
+++ b/infra/config/generated/builders/try/linux-angle-chromium-try/targets/chromium.angle.json
@@ -16,8 +16,8 @@
         "swarming": {
           "containment_type": "AUTO",
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -44,8 +44,8 @@
         "swarming": {
           "containment_type": "AUTO",
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -82,8 +82,8 @@
         "swarming": {
           "containment_type": "AUTO",
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "idempotent": false,
@@ -115,8 +115,8 @@
         "swarming": {
           "containment_type": "AUTO",
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "idempotent": false,
@@ -150,8 +150,8 @@
         "swarming": {
           "containment_type": "AUTO",
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "idempotent": false,
@@ -185,8 +185,8 @@
         "swarming": {
           "containment_type": "AUTO",
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "idempotent": false,
diff --git a/infra/config/generated/health-specs/health-specs.json b/infra/config/generated/health-specs/health-specs.json
index c2c7d888..fda5eb4f 100644
--- a/infra/config/generated/health-specs/health-specs.json
+++ b/infra/config/generated/health-specs/health-specs.json
@@ -9421,6 +9421,27 @@
           }
         ]
       },
+      "ios-vm": {
+        "contact_team_email": "bling-engprod@google.com",
+        "problem_specs": [
+          {
+            "name": "Unhealthy",
+            "period_days": 7,
+            "score": 5,
+            "thresholds": {
+              "_default": "_default"
+            }
+          },
+          {
+            "name": "Low Value",
+            "period_days": 90,
+            "score": 1,
+            "thresholds": {
+              "_default": "_default"
+            }
+          }
+        ]
+      },
       "ios-webkit-tot": {
         "problem_specs": [
           {
diff --git a/infra/config/generated/luci/commit-queue.cfg b/infra/config/generated/luci/commit-queue.cfg
index 7ea66ab..eb4a399 100644
--- a/infra/config/generated/luci/commit-queue.cfg
+++ b/infra/config/generated/luci/commit-queue.cfg
@@ -3739,6 +3739,10 @@
         mode_allowlist: "FULL_RUN"
       }
       builders {
+        name: "chromium/try/ios-vm"
+        includable_only: true
+      }
+      builders {
         name: "chromium/try/ios-wpt-fyi-rel"
         includable_only: true
       }
diff --git a/infra/config/generated/luci/cr-buildbucket.cfg b/infra/config/generated/luci/cr-buildbucket.cfg
index 83fb10d..6ce7250 100644
--- a/infra/config/generated/luci/cr-buildbucket.cfg
+++ b/infra/config/generated/luci/cr-buildbucket.cfg
@@ -44638,6 +44638,102 @@
       }
     }
     builders {
+      name: "ios-vm"
+      swarming_host: "chromium-swarm.appspot.com"
+      dimensions: "builderless:1"
+      dimensions: "cpu:arm64"
+      dimensions: "free_space:standard"
+      dimensions: "os:Mac-14"
+      dimensions: "pool:luci.chromium.ci"
+      exe {
+        cipd_package: "infra/chromium/bootstrapper/${platform}"
+        cipd_version: "latest"
+        cmd: "bootstrapper"
+      }
+      properties:
+        '{'
+        '  "$bootstrap/exe": {'
+        '    "exe": {'
+        '      "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
+        '      "cipd_version": "refs/heads/main",'
+        '      "cmd": ['
+        '        "luciexe"'
+        '      ]'
+        '    }'
+        '  },'
+        '  "$bootstrap/properties": {'
+        '    "properties_file": "infra/config/generated/builders/ci/ios-vm/properties.json",'
+        '    "shadow_properties_file": "infra/config/generated/builders/ci/ios-vm/shadow-properties.json",'
+        '    "top_level_project": {'
+        '      "ref": "refs/heads/main",'
+        '      "repo": {'
+        '        "host": "chromium.googlesource.com",'
+        '        "project": "chromium/src"'
+        '      }'
+        '    }'
+        '  },'
+        '  "builder_group": "chromium.fyi",'
+        '  "led_builder_is_bootstrapped": true,'
+        '  "recipe": "chromium"'
+        '}'
+      priority: 35
+      execution_timeout_secs: 36000
+      caches {
+        name: "xcode_ios_16a242d"
+        path: "xcode_ios_16a242d.app"
+      }
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+      experiments {
+        key: "chromium_swarming.expose_merge_script_failures"
+        value: 100
+      }
+      experiments {
+        key: "luci.recipes.use_python3"
+        value: 100
+      }
+      resultdb {
+        enable: true
+        bq_exports {
+          project: "chrome-luci-data"
+          dataset: "chromium"
+          table: "ci_test_results"
+          test_results {}
+        }
+        bq_exports {
+          project: "chrome-luci-data"
+          dataset: "chromium"
+          table: "gpu_ci_test_results"
+          test_results {
+            predicate {
+              test_id_regexp: "ninja://(chrome|content)/test:telemetry_gpu_integration_test[^/]*/.+"
+            }
+          }
+        }
+        bq_exports {
+          project: "chrome-luci-data"
+          dataset: "chromium"
+          table: "blink_web_tests_ci_test_results"
+          test_results {
+            predicate {
+              test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*_wpt_tests/.+)"
+            }
+          }
+        }
+        history_options {
+          use_invocation_timestamp: true
+        }
+      }
+      description_html: "iOS builder for running testing targets on Mac Virtual Machines<br/>This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/ios-vm\">ios-vm</a></li></ul>"
+      shadow_builder_adjustments {
+        service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
+        pool: "luci.chromium.try"
+        dimensions: "free_space:"
+        dimensions: "pool:luci.chromium.try"
+      }
+      contact_team_email: "bling-engprod@google.com"
+    }
+    builders {
       name: "ios-webkit-tot"
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:ios-webkit-tot"
@@ -89419,6 +89515,105 @@
       description_html: "<br>Builds the open-source version of Chrome for iOS as a simulator binary. Runs tests that are not included on CQ runs, but that we still want tested regularly.<br/><br/>This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/ios-simulator-noncq\">ios-simulator-noncq</a></li></ul>"
     }
     builders {
+      name: "ios-vm"
+      swarming_host: "chromium-swarm.appspot.com"
+      dimensions: "builderless:1"
+      dimensions: "cpu:arm64"
+      dimensions: "os:Mac-14"
+      dimensions: "pool:luci.chromium.try"
+      exe {
+        cipd_package: "infra/chromium/bootstrapper/${platform}"
+        cipd_version: "latest"
+        cmd: "bootstrapper"
+      }
+      properties:
+        '{'
+        '  "$bootstrap/exe": {'
+        '    "exe": {'
+        '      "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
+        '      "cipd_version": "refs/heads/main",'
+        '      "cmd": ['
+        '        "luciexe"'
+        '      ]'
+        '    }'
+        '  },'
+        '  "$bootstrap/properties": {'
+        '    "properties_file": "infra/config/generated/builders/try/ios-vm/properties.json",'
+        '    "top_level_project": {'
+        '      "ref": "refs/heads/main",'
+        '      "repo": {'
+        '        "host": "chromium.googlesource.com",'
+        '        "project": "chromium/src"'
+        '      }'
+        '    }'
+        '  },'
+        '  "builder_group": "tryserver.chromium.mac",'
+        '  "led_builder_is_bootstrapped": true,'
+        '  "recipe": "chromium_trybot"'
+        '}'
+      execution_timeout_secs: 14400
+      expiration_secs: 7200
+      grace_period {
+        seconds: 120
+      }
+      caches {
+        name: "xcode_ios_16a242d"
+        path: "xcode_ios_16a242d.app"
+      }
+      build_numbers: YES
+      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
+      experiments {
+        key: "chromium_swarming.expose_merge_script_failures"
+        value: 100
+      }
+      experiments {
+        key: "luci.buildbucket.canary_software"
+        value: 5
+      }
+      experiments {
+        key: "luci.recipes.use_python3"
+        value: 100
+      }
+      experiments {
+        key: "swarming.prpc.cli"
+        value: 100
+      }
+      resultdb {
+        enable: true
+        bq_exports {
+          project: "chrome-luci-data"
+          dataset: "chromium"
+          table: "try_test_results"
+          test_results {}
+        }
+        bq_exports {
+          project: "chrome-luci-data"
+          dataset: "chromium"
+          table: "gpu_try_test_results"
+          test_results {
+            predicate {
+              test_id_regexp: "ninja://(chrome|content)/test:telemetry_gpu_integration_test[^/]*/.+"
+            }
+          }
+        }
+        bq_exports {
+          project: "chrome-luci-data"
+          dataset: "chromium"
+          table: "blink_web_tests_try_test_results"
+          test_results {
+            predicate {
+              test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*_wpt_tests/.+)"
+            }
+          }
+        }
+        history_options {
+          use_invocation_timestamp: true
+        }
+      }
+      description_html: "<br>iOS builder for running testing targets on Mac Virtual Machines<br/><br/>This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/ios-vm\">ios-vm</a></li></ul>"
+      contact_team_email: "bling-engprod@google.com"
+    }
+    builders {
       name: "ios-wpt-fyi-rel"
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:ios-wpt-fyi-rel"
diff --git a/infra/config/generated/luci/luci-milo.cfg b/infra/config/generated/luci/luci-milo.cfg
index 4a76ff2..1fbc0b9 100644
--- a/infra/config/generated/luci/luci-milo.cfg
+++ b/infra/config/generated/luci/luci-milo.cfg
@@ -8063,11 +8063,6 @@
     short_name: "770"
   }
   builders {
-    name: "buildbucket/luci.chromium.ci/Dawn Linux x64 Experimental Release (Intel UHD 630)"
-    category: "ToT|Linux|Intel"
-    short_name: "exp"
-  }
-  builders {
     name: "buildbucket/luci.chromium.ci/Dawn Linux x64 Experimental Release (NVIDIA GTX 1660)"
     category: "ToT|Linux|Nvidia"
     short_name: "exp"
@@ -10024,6 +10019,11 @@
     short_name: "ios-blk"
   }
   builders {
+    name: "buildbucket/luci.chromium.ci/ios-vm"
+    category: "iOS"
+    short_name: "vm"
+  }
+  builders {
     name: "buildbucket/luci.chromium.ci/ios-webkit-tot"
     category: "iOS"
     short_name: "wk"
@@ -11257,11 +11257,6 @@
     short_name: "rel"
   }
   builders {
-    name: "buildbucket/luci.chromium.ci/Linux FYI Experimental Release (Intel UHD 630)"
-    category: "Linux|Intel"
-    short_name: "exp"
-  }
-  builders {
     name: "buildbucket/luci.chromium.ci/Linux FYI Release (Intel UHD 770)"
     category: "Linux|Intel"
     short_name: "770"
@@ -17390,6 +17385,9 @@
     name: "buildbucket/luci.chromium.try/ios-simulator-noncq"
   }
   builders {
+    name: "buildbucket/luci.chromium.try/ios-vm"
+  }
+  builders {
     name: "buildbucket/luci.chromium.try/ios-wpt-fyi-rel"
   }
   builders {
@@ -19213,6 +19211,9 @@
     name: "buildbucket/luci.chromium.try/ios-simulator-noncq"
   }
   builders {
+    name: "buildbucket/luci.chromium.try/ios-vm"
+  }
+  builders {
     name: "buildbucket/luci.chromium.try/ios-wpt-fyi-rel"
   }
   builders {
diff --git a/infra/config/generated/luci/luci-scheduler.cfg b/infra/config/generated/luci/luci-scheduler.cfg
index 76bbaa4..3ead99e 100644
--- a/infra/config/generated/luci/luci-scheduler.cfg
+++ b/infra/config/generated/luci/luci-scheduler.cfg
@@ -4692,6 +4692,16 @@
   }
 }
 job {
+  id: "ios-vm"
+  realm: "ci"
+  schedule: "0 */4 * * *"
+  buildbucket {
+    server: "cr-buildbucket.appspot.com"
+    bucket: "ci"
+    builder: "ios-vm"
+  }
+}
+job {
   id: "ios-webkit-tot"
   realm: "ci"
   schedule: "0 1-23/6 * * *"
diff --git a/infra/config/generated/testing/mixins.pyl b/infra/config/generated/testing/mixins.pyl
index a76a143..b33316f 100644
--- a/infra/config/generated/testing/mixins.pyl
+++ b/infra/config/generated/testing/mixins.pyl
@@ -560,8 +560,8 @@
     'fail_if_unused': False,
     'swarming': {
       'dimensions': {
-        'gpu': '8086:9bc5-20.0.8|8086:9bc5-23.2.1',
-        'os': 'Ubuntu-18.04.6|Ubuntu-22.04',
+        'gpu': '8086:9bc5-23.2.1',
+        'os': 'Ubuntu-22.04',
         'pool': 'chromium.tests.gpu',
       },
     },
@@ -878,6 +878,15 @@
       ],
     },
   },
+  'mac_vm': {
+    'swarming': {
+      'dimensions': {
+        'cpu': 'arm64-64-Apple_M1_(Virtual)',
+        'os': 'Mac-14',
+        'pool': 'chromium.tests.macvm',
+      },
+    },
+  },
   'no_gpu': {
     'fail_if_unused': False,
     'swarming': {
diff --git a/infra/config/generated/testing/test_suites.pyl b/infra/config/generated/testing/test_suites.pyl
index 2c22f5be..2eea757 100644
--- a/infra/config/generated/testing/test_suites.pyl
+++ b/infra/config/generated/testing/test_suites.pyl
@@ -4306,6 +4306,10 @@
       'ui_base_unittests': {},
     },
 
+    'ios_vm_tests': {
+      'base_unittests': {},
+    },
+
     'js_code_coverage_browser_tests_suite': {
       'js_code_coverage_browser_tests': {
         'test': 'browser_tests',
@@ -7207,6 +7211,14 @@
       },
     },
 
+    'ios_vm_tests_with_variants': {
+      'ios_vm_tests': {
+        'variants': [
+          'SIM_IPHONE_15_18_0',
+        ],
+      },
+    },
+
     'ios_webkit_tot_tests': {
       'ios_common_tests': {
         'variants': [
diff --git a/infra/config/subprojects/chromium/ci/chromium.android.star b/infra/config/subprojects/chromium/ci/chromium.android.star
index 80c3966..39ec53a 100644
--- a/infra/config/subprojects/chromium/ci/chromium.android.star
+++ b/infra/config/subprojects/chromium/ci/chromium.android.star
@@ -1591,7 +1591,10 @@
     builder_spec = builder_config.builder_spec(
         gclient_config = builder_config.gclient_config(
             config = "chromium",
-            apply_configs = ["android"],
+            apply_configs = [
+                "android",
+                "checkout_copybara",
+            ],
         ),
         chromium_config = builder_config.chromium_config(
             config = "android",
diff --git a/infra/config/subprojects/chromium/ci/chromium.dawn.star b/infra/config/subprojects/chromium/ci/chromium.dawn.star
index 4cc3df5..e4f9fe0a 100644
--- a/infra/config/subprojects/chromium/ci/chromium.dawn.star
+++ b/infra/config/subprojects/chromium/ci/chromium.dawn.star
@@ -721,10 +721,10 @@
         run_tests_serially = True,
     ),
     # Uncomment this entry when this experimental tester is actually in use.
-    console_view_entry = consoles.console_view_entry(
-        category = "ToT|Linux|Intel",
-        short_name = "exp",
-    ),
+    # console_view_entry = consoles.console_view_entry(
+    #     category = "ToT|Linux|Intel",
+    #     short_name = "exp",
+    # ),
     list_view = "chromium.gpu.experimental",
 )
 
diff --git a/infra/config/subprojects/chromium/ci/chromium.fyi.star b/infra/config/subprojects/chromium/ci/chromium.fyi.star
index 56a9243c..cbd64cff 100644
--- a/infra/config/subprojects/chromium/ci/chromium.fyi.star
+++ b/infra/config/subprojects/chromium/ci/chromium.fyi.star
@@ -1683,6 +1683,44 @@
 )
 
 fyi_ios_builder(
+    name = "ios-vm",
+    description_html = "iOS builder for running testing targets on Mac Virtual Machines",
+    schedule = "0 */4 * * *",  # every 4 hours
+    triggered_by = [],
+    builder_spec = builder_config.builder_spec(
+        gclient_config = builder_config.gclient_config(config = "ios"),
+        chromium_config = builder_config.chromium_config(
+            config = "chromium",
+            apply_configs = [
+                "mb",
+                "mac_toolchain",
+            ],
+            build_config = builder_config.build_config.DEBUG,
+            target_bits = 64,
+            target_platform = builder_config.target_platform.IOS,
+        ),
+    ),
+    gn_args = gn_args.config(
+        configs = [
+            "debug_static_builder",
+            "remoteexec",
+            "ios_simulator",
+            "arm64",
+            "xctest",
+        ],
+    ),
+    builderless = True,
+    os = os.MAC_DEFAULT,
+    cpu = cpu.ARM64,
+    console_view_entry = consoles.console_view_entry(
+        category = "iOS",
+        short_name = "vm",
+    ),
+    contact_team_email = "bling-engprod@google.com",
+    xcode = xcode.xcode_default,
+)
+
+fyi_ios_builder(
     name = "ios-webkit-tot",
     schedule = "0 1-23/6 * * *",
     triggered_by = [],
diff --git a/infra/config/subprojects/chromium/ci/chromium.gpu.fyi.star b/infra/config/subprojects/chromium/ci/chromium.gpu.fyi.star
index 0580d41c..c3084d7 100644
--- a/infra/config/subprojects/chromium/ci/chromium.gpu.fyi.star
+++ b/infra/config/subprojects/chromium/ci/chromium.gpu.fyi.star
@@ -1065,10 +1065,10 @@
         run_tests_serially = True,
     ),
     # Uncomment this entry when this experimental tester is actually in use.
-    console_view_entry = consoles.console_view_entry(
-        category = "Linux|Intel",
-        short_name = "exp",
-    ),
+    # console_view_entry = consoles.console_view_entry(
+    #     category = "Linux|Intel",
+    #     short_name = "exp",
+    # ),
     list_view = "chromium.gpu.experimental",
 )
 
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.mac.star b/infra/config/subprojects/chromium/try/tryserver.chromium.mac.star
index 669caa8..745ae74 100644
--- a/infra/config/subprojects/chromium/try/tryserver.chromium.mac.star
+++ b/infra/config/subprojects/chromium/try/tryserver.chromium.mac.star
@@ -697,6 +697,15 @@
 )
 
 ios_builder(
+    name = "ios-vm",
+    mirrors = ["ci/ios-vm"],
+    gn_args = "ci/ios-vm",
+    builderless = True,
+    cpu = cpu.ARM64,
+    contact_team_email = "bling-engprod@google.com",
+)
+
+ios_builder(
     name = "ios17-beta-simulator",
     mirrors = ["ci/ios17-beta-simulator"],
     gn_args = "ci/ios17-beta-simulator",
diff --git a/infra/config/targets/basic_suites.star b/infra/config/targets/basic_suites.star
index f38d3fd8..41f56a4 100644
--- a/infra/config/targets/basic_suites.star
+++ b/infra/config/targets/basic_suites.star
@@ -3570,6 +3570,13 @@
 # END tests which run on the GPU bots
 
 targets.legacy_basic_suite(
+    name = "ios_vm_tests",
+    tests = {
+        "base_unittests": targets.legacy_test_config(),
+    },
+)
+
+targets.legacy_basic_suite(
     name = "js_code_coverage_browser_tests_suite",
     tests = {
         "js_code_coverage_browser_tests": targets.legacy_test_config(
diff --git a/infra/config/targets/matrix_compound_suites.star b/infra/config/targets/matrix_compound_suites.star
index c5cdbf8..62fa413 100644
--- a/infra/config/targets/matrix_compound_suites.star
+++ b/infra/config/targets/matrix_compound_suites.star
@@ -940,6 +940,17 @@
 )
 
 targets.legacy_matrix_compound_suite(
+    name = "ios_vm_tests_with_variants",
+    basic_suites = {
+        "ios_vm_tests": targets.legacy_matrix_config(
+            variants = [
+                "SIM_IPHONE_15_18_0",
+            ],
+        ),
+    },
+)
+
+targets.legacy_matrix_compound_suite(
     name = "ios_webkit_tot_tests",
     basic_suites = {
         "ios_common_tests": targets.legacy_matrix_config(
diff --git a/infra/config/targets/mixins.star b/infra/config/targets/mixins.star
index 4d58cb4..66548be8 100644
--- a/infra/config/targets/mixins.star
+++ b/infra/config/targets/mixins.star
@@ -1132,8 +1132,8 @@
     generate_pyl_entry = targets.IGNORE_UNUSED,
     swarming = targets.swarming(
         dimensions = {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu",
         },
     ),
@@ -1214,6 +1214,17 @@
 )
 
 targets.mixin(
+    name = "mac_vm",
+    swarming = targets.swarming(
+        dimensions = {
+            "cpu": "arm64-64-Apple_M1_(Virtual)",
+            "os": "Mac-14",
+            "pool": "chromium.tests.macvm",
+        },
+    ),
+)
+
+targets.mixin(
     name = "mac_10.15",
     swarming = targets.swarming(
         dimensions = {
diff --git a/internal b/internal
index fc2956d..eee79ba 160000
--- a/internal
+++ b/internal
@@ -1 +1 @@
-Subproject commit fc2956d197ad6bed33be97f5d6a206d44bff4e24
+Subproject commit eee79ba48e89b7af44dc706f5c0220e43426e6e3
diff --git a/ios/chrome/app/strings/ios_chromium_strings.grd b/ios/chrome/app/strings/ios_chromium_strings.grd
index df2c604..50623b1 100644
--- a/ios/chrome/app/strings/ios_chromium_strings.grd
+++ b/ios/chrome/app/strings/ios_chromium_strings.grd
@@ -561,7 +561,7 @@
         You can open Lens here.
       </message>
       <message name="IDS_IOS_LOCATION_WHEN_IN_USE_USAGE_DESCRIPTION" desc="Specifies the reason for accessing the user's location information while the app is in use [Length: unlimited] [iOS only].">
-          Chromium shares your location with sites you allow.
+        Chromium shares your location with sites you allow.
       </message>
       <message name="IDS_IOS_LOCKDOWN_MODE_INFO_BUTTON_SUMMARY_FOR_IPAD" desc="iPad summary for lockdown mode info button">
         To disable Lockdown Mode in Chromium turn it off on your iPad.
@@ -573,28 +573,31 @@
         Your account does not work on Chromium. Please contact your domain administrator or use a regular Google Account to sign in.
       </message>
       <message name="IDS_IOS_MAGIC_STACK_TIP_CONTEXT_MENU_DESCRIPTION" desc="The description of the context menu for the Chrome Tips Magic Stack card.">
-      This card shows you suggestions on how to get the most out of Chromium.
+        This card shows you suggestions on how to get the most out of Chromium.
       </message>
       <message name="IDS_IOS_MAGIC_STACK_TIP_LENS_DEFAULT_TITLE" desc="The default title of the Lens tip for the Magic Stack.">
-      Search
+        Search
       </message>
       <message name="IDS_IOS_MAGIC_STACK_TIP_LENS_SHOP_TITLE" desc="The title of the use Lens for shopping tip for the Magic Stack.">
-      Shop
+        Shop
       </message>
       <message name="IDS_IOS_MAGIC_STACK_TIP_LENS_TRANSLATE_TITLE" desc="The title of the use Lens for translation tip for the Magic Stack.">
-      Translate
+        Translate
+      </message>
+      <message name="IDS_IOS_MAGIC_STACK_TIP_SAVE_PASSWORDS_TUTORIAL_STEP_2" desc="The second step of the Save Passwords tutorial for the Magic Stack.">
+        Chromium will offer to save your password.
       </message>
       <message name="IDS_IOS_MAGIC_STACK_TIP_SAVE_PASSWORD_TITLE" desc="The title of the Save Password tip for the Magic Stack.">
-      Save Your Passwords on Chromium
+        Save Your Passwords on Chromium
       </message>
       <message name="IDS_IOS_MAGIC_STACK_TIP_SAFE_BROWSING_TITLE" desc="The title of the Safe Browsing tip for the Magic Stack.">
-      Get Chromium's Strongest Security
+        Get Chromium's Strongest Security
       </message>
       <message name="IDS_IOS_MAGIC_STACK_TIP_SET_UP_COMPLETION_DESCRIPTION" desc="The description of the Set Up List completion for the Magic Stack.">
-      Check back here for more useful tips to get the most out of Chromium.
+        Check back here for more useful tips to get the most out of Chromium.
       </message>
       <message name="IDS_IOS_MAGIC_STACK_TIP_TITLE" desc="The name of the Chrome Tips Magic Stack.">
-      Chromium Tips
+        Chromium Tips
       </message>
       <message name="IDS_IOS_MANAGED_DISCONNECT_DIALOG_INFO_UNITY" desc="Message explaining that signing out of a managed account will clear all the Chromium data.[Length: 200em, may be line wrapped to multiple lines at run time.] [iOS only].">
         Because you're signing out of an account managed by <ph name="SIGNOUT_MANAGED_DOMAIN">$1<ex>google.com</ex></ph>, your Chromium data will be deleted from this device. Your data will remain in your Google Account.
diff --git a/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_MAGIC_STACK_TIP_SAVE_PASSWORDS_TUTORIAL_STEP_2.png.sha1 b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_MAGIC_STACK_TIP_SAVE_PASSWORDS_TUTORIAL_STEP_2.png.sha1
new file mode 100644
index 0000000..f94a31ed
--- /dev/null
+++ b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_MAGIC_STACK_TIP_SAVE_PASSWORDS_TUTORIAL_STEP_2.png.sha1
@@ -0,0 +1 @@
+15a27812d199d6e86ebb0bd5e91ce1506767c481
\ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_google_chrome_strings.grd b/ios/chrome/app/strings/ios_google_chrome_strings.grd
index 8e2597d..a99de6e 100644
--- a/ios/chrome/app/strings/ios_google_chrome_strings.grd
+++ b/ios/chrome/app/strings/ios_google_chrome_strings.grd
@@ -537,7 +537,7 @@
         Search in Chrome
       </message>
       <message name="IDS_IOS_INTENTS_SEARCH_IN_CHROME_TITLE" desc="Siri Shortcut for search in chrome title [iOS only].">
-          Search in Chrome
+        Search in Chrome
       </message>
       <message name="IDS_IOS_INTENTS_SEARCH_WITH_VOICE_DESCRIPTION" desc="Siri Shortcut description for searching with voice [iOS only]">
         Search with voice in Chrome.
@@ -561,7 +561,7 @@
         You can open Google Lens here.
       </message>
       <message name="IDS_IOS_LOCATION_WHEN_IN_USE_USAGE_DESCRIPTION" desc="Specifies the reason for accessing the user's location information while the app is in use [Length: unlimited] [iOS only].">
-          Chrome shares your location with sites you allow.
+        Chrome shares your location with sites you allow.
       </message>
       <message name="IDS_IOS_LOCKDOWN_MODE_INFO_BUTTON_SUMMARY_FOR_IPAD" desc="iPad summary for lockdown mode info button">
         To disable Lockdown Mode in Chrome turn it off on your iPad.
@@ -573,28 +573,31 @@
         Your account does not work on Google Chrome. Please contact your domain administrator or use a regular Google Account to sign in.
       </message>
       <message name="IDS_IOS_MAGIC_STACK_TIP_CONTEXT_MENU_DESCRIPTION" desc="The description of the context menu for the Chrome Tips Magic Stack card.">
-      This card shows you suggestions on how to get the most out of Chrome.
+        This card shows you suggestions on how to get the most out of Chrome.
       </message>
       <message name="IDS_IOS_MAGIC_STACK_TIP_LENS_DEFAULT_TITLE" desc="The default title of the Lens tip for the Magic Stack.">
-      Search with Google Lens
+        Search with Google Lens
       </message>
       <message name="IDS_IOS_MAGIC_STACK_TIP_LENS_SHOP_TITLE" desc="The title of the use Lens for shopping tip for the Magic Stack.">
-      Shop with Google Lens
+        Shop with Google Lens
       </message>
       <message name="IDS_IOS_MAGIC_STACK_TIP_LENS_TRANSLATE_TITLE" desc="The title of the use Lens for translation tip for the Magic Stack.">
-      Translate with Google Lens
+        Translate with Google Lens
+      </message>
+      <message name="IDS_IOS_MAGIC_STACK_TIP_SAVE_PASSWORDS_TUTORIAL_STEP_2" desc="The second step of the Save Passwords tutorial for the Magic Stack.">
+        Chrome will offer to save your password.
       </message>
       <message name="IDS_IOS_MAGIC_STACK_TIP_SAVE_PASSWORD_TITLE" desc="The title of the Save Password tip for the Magic Stack.">
-      Save Your Passwords on Chrome
+        Save Your Passwords on Chrome
       </message>
       <message name="IDS_IOS_MAGIC_STACK_TIP_SAFE_BROWSING_TITLE" desc="The title of the Safe Browsing tip for the Magic Stack.">
-      Get Chrome's Strongest Security
+        Get Chrome's Strongest Security
       </message>
       <message name="IDS_IOS_MAGIC_STACK_TIP_SET_UP_COMPLETION_DESCRIPTION" desc="The description of the Set Up List completion for the Magic Stack.">
-      Check back here for more useful tips to get the most out of Chrome.
+        Check back here for more useful tips to get the most out of Chrome.
       </message>
       <message name="IDS_IOS_MAGIC_STACK_TIP_TITLE" desc="The name of the Chrome Tips Magic Stack.">
-      Chrome Tips
+        Chrome Tips
       </message>
       <message name="IDS_IOS_MANAGED_DISCONNECT_DIALOG_INFO_UNITY" desc="Message explaining that signing out of a managed account will clear all the Chrome data. [Length: 200em, may be line wrapped to multiple lines at run time.] [iOS only].">
         Because you're signing out of an account managed by <ph name="SIGNOUT_MANAGED_DOMAIN">$1<ex>google.com</ex></ph>, your Chrome data will be deleted from this device. Your data will remain in your Google Account.
diff --git a/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_MAGIC_STACK_TIP_SAVE_PASSWORDS_TUTORIAL_STEP_2.png.sha1 b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_MAGIC_STACK_TIP_SAVE_PASSWORDS_TUTORIAL_STEP_2.png.sha1
new file mode 100644
index 0000000..f94a31ed
--- /dev/null
+++ b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_MAGIC_STACK_TIP_SAVE_PASSWORDS_TUTORIAL_STEP_2.png.sha1
@@ -0,0 +1 @@
+15a27812d199d6e86ebb0bd5e91ce1506767c481
\ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings.grd b/ios/chrome/app/strings/ios_strings.grd
index ebb0e0f..d42c594 100644
--- a/ios/chrome/app/strings/ios_strings.grd
+++ b/ios/chrome/app/strings/ios_strings.grd
@@ -2640,40 +2640,64 @@
         Turn On Notifications
       </message>
       <message name="IDS_IOS_MAGIC_STACK_TIP_ADDRESS_BAR_TITLE" desc="The title of the Address Bar Position tip for the Magic Stack.">
-      Choose Address Bar Position
+        Choose Address Bar Position
       </message>
       <message name="IDS_IOS_MAGIC_STACK_TIP_ADDRESS_BAR_DESCRIPTION" desc="The description of the Address Bar Position tip for the Magic Stack.">
-      Switch the position of your address bar for a customized experience.
+        Switch the position of your address bar for a customized experience.
       </message>
       <message name="IDS_IOS_MAGIC_STACK_TIP_AUTOFILL_PASSWORDS_TITLE" desc="The title of the Autofill Saved Passwords tip for the Magic Stack.">
-      Autofill Saved Passwords
+        Autofill Saved Passwords
       </message>
       <message name="IDS_IOS_MAGIC_STACK_TIP_AUTOFILL_PASSWORDS_DESCRIPTION" desc="The description of the Autofill Saved Passwords tip for the Magic Stack.">
-      Quickly sign in to sites and apps with your saved passwords.
+        Quickly sign in to sites and apps with your saved passwords.
+      </message>
+      <message name="IDS_IOS_MAGIC_STACK_TIP_AUTOFILL_PASSWORDS_TUTORIAL_STEP_1" desc="The first step of the Autofill Saved Passwords tutorial for the Magic Stack.">
+        On a site where you've saved a password, tap the sign-in password field.
+      </message>
+      <message name="IDS_IOS_MAGIC_STACK_TIP_AUTOFILL_PASSWORDS_TUTORIAL_STEP_2" desc="The second step of the Autofill Saved Passwords tutorial for the Magic Stack.">
+        Choose the password you want to use from the list that appears.
+      </message>
+      <message name="IDS_IOS_MAGIC_STACK_TIP_AUTOFILL_PASSWORDS_TUTORIAL_STEP_3" desc="The third step of the Autofill Saved Passwords tutorial for the Magic Stack.">
+        Tap "Use Password" to sign in securely.
       </message>
       <message name="IDS_IOS_MAGIC_STACK_TIP_CONTEXT_MENU_HIDE_CHROME_TIPS" desc="The description of the Hide Chrome Tips button located in the Chrome Tips Magic Stack context menu.">
-      Hide "<ph name= "Module_Name"><ex>Chrome Tips</ex>$1</ph>"
+        Hide "<ph name= "Module_Name"><ex>Chrome Tips</ex>$1</ph>"
       </message>
       <message name="IDS_IOS_MAGIC_STACK_TIP_CONTEXT_MENU_TURN_ON_NOTIFICATIONS" desc="The description of the Turn On Chrome Tips button located in the Chrome Tips Magic Stack context menu.">
-      Turn on notifications for <ph name= "Module_Name"><ex>Chrome Tips</ex>$1</ph>
+        Turn on notifications for <ph name= "Module_Name"><ex>Chrome Tips</ex>$1</ph>
+      </message>
+      <message name="IDS_IOS_MAGIC_STACK_TIP_GOT_IT" desc="Button label to dismiss a full-screen tip promo triggered via the Magic Stack.">
+        Got It
       </message>
       <message name="IDS_IOS_MAGIC_STACK_TIP_LENS_DEFAULT_DESCRIPTION" desc="The default description of the Lens tip for the Magic Stack.">
-      Shop, translate, and identify what you see with your camera or photos.
+        Shop, translate, and identify what you see with your camera or photos.
       </message>
       <message name="IDS_IOS_MAGIC_STACK_TIP_LENS_SHOP_DESCRIPTION" desc="The description of the use Lens for shopping tip for the Magic Stack.">
-      Shop what you see with your camera or photo gallery.
+        Shop what you see with your camera or photo gallery.
       </message>
       <message name="IDS_IOS_MAGIC_STACK_TIP_LENS_TRANSLATE_DESCRIPTION" desc="The description of the use Lens for translation tip for the Magic Stack.">
-      Translate text in your photos or your surroundings with your camera.
+        Translate text in your photos or your surroundings with your camera.
+      </message>
+      <message name="IDS_IOS_MAGIC_STACK_TIP_SAVE_PASSWORDS_TUTORIAL_STEP_1" desc="The first step of the Save Passwords tutorial for the Magic Stack.">
+        Sign in to a website.
+      </message>
+      <message name="IDS_IOS_MAGIC_STACK_TIP_SAVE_PASSWORDS_TUTORIAL_STEP_3" desc="The third step of the Save Passwords tutorial for the Magic Stack.">
+        Tap "Save" to easily access this password the next time you sign in.
       </message>
       <message name="IDS_IOS_MAGIC_STACK_TIP_SAVE_PASSWORD_DESCRIPTION" desc="The description of the Save Password tip for the Magic Stack.">
-      Save your passwords to easily sign in to sites and apps.
+        Save your passwords to easily sign in to sites and apps.
       </message>
       <message name="IDS_IOS_MAGIC_STACK_TIP_SAFE_BROWSING_DESCRIPTION" desc="The description of the Safe Browsing tip for the Magic Stack.">
-      Add an extra layer of protection against online threats.
+        Add an extra layer of protection against online threats.
       </message>
       <message name="IDS_IOS_MAGIC_STACK_TIP_SET_UP_COMPLETION_TITLE" desc="The title of the Set Up List completion for the Magic Stack.">
-      You're all set up
+        You're all set up
+      </message>
+      <message name="IDS_IOS_MAGIC_STACK_TIP_SHOW_ME_HOW" desc="Button label to show the tutorial for a Magic Stack tip.">
+        Show Me How
+      </message>
+      <message name="IDS_IOS_MAGIC_STACK_TIP_TUTORIAL_TITLE" desc="The title of the full-screen tutorial for a Magic Stack tip.">
+        How do I use this feature?
       </message>
       <message name="IDS_IOS_MANAGE_STORAGE_ALERT_TITLE" desc="Title of an alert presented when the user tries to select a destination for an upload, without sufficient storage space in the destination. [iOS only]">
         Your storage is full
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_MAGIC_STACK_TIP_AUTOFILL_PASSWORDS_TUTORIAL_STEP_1.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_MAGIC_STACK_TIP_AUTOFILL_PASSWORDS_TUTORIAL_STEP_1.png.sha1
new file mode 100644
index 0000000..09e5fa53
--- /dev/null
+++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_MAGIC_STACK_TIP_AUTOFILL_PASSWORDS_TUTORIAL_STEP_1.png.sha1
@@ -0,0 +1 @@
+6b6f74f358cc104e4a17c42a59a6e38fbb92223f
\ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_MAGIC_STACK_TIP_AUTOFILL_PASSWORDS_TUTORIAL_STEP_2.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_MAGIC_STACK_TIP_AUTOFILL_PASSWORDS_TUTORIAL_STEP_2.png.sha1
new file mode 100644
index 0000000..09e5fa53
--- /dev/null
+++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_MAGIC_STACK_TIP_AUTOFILL_PASSWORDS_TUTORIAL_STEP_2.png.sha1
@@ -0,0 +1 @@
+6b6f74f358cc104e4a17c42a59a6e38fbb92223f
\ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_MAGIC_STACK_TIP_AUTOFILL_PASSWORDS_TUTORIAL_STEP_3.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_MAGIC_STACK_TIP_AUTOFILL_PASSWORDS_TUTORIAL_STEP_3.png.sha1
new file mode 100644
index 0000000..09e5fa53
--- /dev/null
+++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_MAGIC_STACK_TIP_AUTOFILL_PASSWORDS_TUTORIAL_STEP_3.png.sha1
@@ -0,0 +1 @@
+6b6f74f358cc104e4a17c42a59a6e38fbb92223f
\ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_MAGIC_STACK_TIP_GOT_IT.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_MAGIC_STACK_TIP_GOT_IT.png.sha1
new file mode 100644
index 0000000..f56be61
--- /dev/null
+++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_MAGIC_STACK_TIP_GOT_IT.png.sha1
@@ -0,0 +1 @@
+8b1afcb09a7ec751efc6c28d71316357293babf8
\ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_MAGIC_STACK_TIP_SAVE_PASSWORDS_TUTORIAL_STEP_1.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_MAGIC_STACK_TIP_SAVE_PASSWORDS_TUTORIAL_STEP_1.png.sha1
new file mode 100644
index 0000000..1468242b
--- /dev/null
+++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_MAGIC_STACK_TIP_SAVE_PASSWORDS_TUTORIAL_STEP_1.png.sha1
@@ -0,0 +1 @@
+6f7a5fd1e54bca9f5f2d103809e3e3a8d412db7e
\ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_MAGIC_STACK_TIP_SAVE_PASSWORDS_TUTORIAL_STEP_3.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_MAGIC_STACK_TIP_SAVE_PASSWORDS_TUTORIAL_STEP_3.png.sha1
new file mode 100644
index 0000000..db04475b
--- /dev/null
+++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_MAGIC_STACK_TIP_SAVE_PASSWORDS_TUTORIAL_STEP_3.png.sha1
@@ -0,0 +1 @@
+c47d1f1e9d3a5225bdb3ee937de196a43c656c5f
\ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_MAGIC_STACK_TIP_SHOW_ME_HOW.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_MAGIC_STACK_TIP_SHOW_ME_HOW.png.sha1
new file mode 100644
index 0000000..a220906
--- /dev/null
+++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_MAGIC_STACK_TIP_SHOW_ME_HOW.png.sha1
@@ -0,0 +1 @@
+92ef2277042b51856f322f3fab594c89948d90e9
\ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_MAGIC_STACK_TIP_TUTORIAL_TITLE.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_MAGIC_STACK_TIP_TUTORIAL_TITLE.png.sha1
new file mode 100644
index 0000000..f4f403d
--- /dev/null
+++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_MAGIC_STACK_TIP_TUTORIAL_TITLE.png.sha1
@@ -0,0 +1 @@
+59cdeb1ef2f97e91faad2bfaa6f4a7821420425a
\ No newline at end of file
diff --git a/ios/chrome/browser/autofill/ui_bundled/manual_fill/password_view_controller_egtest.mm b/ios/chrome/browser/autofill/ui_bundled/manual_fill/password_view_controller_egtest.mm
index a447d36..d73488f 100644
--- a/ios/chrome/browser/autofill/ui_bundled/manual_fill/password_view_controller_egtest.mm
+++ b/ios/chrome/browser/autofill/ui_bundled/manual_fill/password_view_controller_egtest.mm
@@ -484,7 +484,8 @@
 }
 
 // Tests that the "Select Password..." action works in incognito mode.
-- (void)testSelectPasswordActionInIncognito {
+// TODO(crbug.com/363017975): Re-enable test
+- (void)DISABLED_testSelectPasswordActionInIncognito {
   // Open a tab in incognito.
   [ChromeEarlGrey openNewIncognitoTab];
   [self loadLoginPage];
diff --git a/ios/chrome/browser/flags/about_flags.mm b/ios/chrome/browser/flags/about_flags.mm
index c2540ed..fa67cf1 100644
--- a/ios/chrome/browser/flags/about_flags.mm
+++ b/ios/chrome/browser/flags/about_flags.mm
@@ -2055,7 +2055,13 @@
      flag_descriptions::kSegmentationPlatformTipsEphemeralCardDescription,
      flags_ui::kOsIos,
      FEATURE_VALUE_TYPE(segmentation_platform::features::
-                            kSegmentationPlatformTipsEphemeralCard)}};
+                            kSegmentationPlatformTipsEphemeralCard)},
+    {"ios-password-suggestion-bottom-sheet-v2",
+     flag_descriptions::kPasswordSuggestionBottomSheetV2Name,
+     flag_descriptions::kPasswordSuggestionBottomSheetV2Description,
+     flags_ui::kOsIos,
+     FEATURE_VALUE_TYPE(
+         password_manager::features::kIOSPasswordBottomSheetV2)}};
 
 bool SkipConditionalFeatureEntry(const flags_ui::FeatureEntry& entry) {
   return false;
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
index 241764b..ba815296 100644
--- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
+++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
@@ -144,6 +144,12 @@
     "When enabled, Autofill will attempt to find standalone CVC fields for VCN "
     "card on file when parsing forms.";
 
+const char kPasswordSuggestionBottomSheetV2Name[] =
+    "Enable the password suggestion bottom sheet V2";
+const char kPasswordSuggestionBottomSheetV2Description[] =
+    "When enabled, the V2 of the password suggestion bottom sheet will be "
+    "used.";
+
 const char kAutofillPruneSuggestionsName[] = "Autofill Prune Suggestions";
 const char kAutofillPruneSuggestionsDescription[] =
     "Further limits the number of suggestions in the Autofill dropdown.";
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
index 5da3a31..a09ada60 100644
--- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
+++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
@@ -115,6 +115,11 @@
 extern const char kAutofillParseVcnCardOnFileStandaloneCvcFieldsName[];
 extern const char kAutofillParseVcnCardOnFileStandaloneCvcFieldsDescription[];
 
+// Title and description for the flag that enables the password suggestion
+// bottom sheet V2.
+extern const char kPasswordSuggestionBottomSheetV2Name[];
+extern const char kPasswordSuggestionBottomSheetV2Description[];
+
 // Title and description for the flag that controls whether the maximum number
 // of Autofill suggestions shown is pruned.
 extern const char kAutofillPruneSuggestionsName[];
diff --git a/ios/chrome/browser/lens_overlay/coordinator/lens_omnibox_client.h b/ios/chrome/browser/lens_overlay/coordinator/lens_omnibox_client.h
index 5422f92..0ce95b4 100644
--- a/ios/chrome/browser/lens_overlay/coordinator/lens_omnibox_client.h
+++ b/ios/chrome/browser/lens_overlay/coordinator/lens_omnibox_client.h
@@ -39,6 +39,10 @@
     lens_overlay_suggest_inputs_ = suggest_inputs;
   }
 
+  void SetLensResultHasThumbnail(BOOL has_thumbnail) {
+    lens_result_has_thumbnail_ = has_thumbnail;
+  }
+
   // OmniboxClient.
   std::unique_ptr<AutocompleteProviderClient> CreateAutocompleteProviderClient()
       override;
@@ -103,6 +107,7 @@
   raw_ptr<feature_engagement::Tracker> engagement_tracker_;
   __weak id<LensWebProvider> web_provider_;
   __weak id<LensOmniboxClientDelegate> delegate_;
+  BOOL lens_result_has_thumbnail_;
   BOOL thumbnail_removed_in_session_;
   std::optional<lens::proto::LensOverlaySuggestInputs>
       lens_overlay_suggest_inputs_;
diff --git a/ios/chrome/browser/lens_overlay/coordinator/lens_omnibox_client.mm b/ios/chrome/browser/lens_overlay/coordinator/lens_omnibox_client.mm
index 39d5586..9de47c4 100644
--- a/ios/chrome/browser/lens_overlay/coordinator/lens_omnibox_client.mm
+++ b/ios/chrome/browser/lens_overlay/coordinator/lens_omnibox_client.mm
@@ -164,7 +164,10 @@
 
 metrics::OmniboxEventProto::PageClassification
 LensOmniboxClient::GetPageClassification(bool is_prefetch) const {
-  return metrics::OmniboxEventProto::LENS_SIDE_PANEL_SEARCHBOX;
+  if (lens_result_has_thumbnail_ && !thumbnail_removed_in_session_) {
+    return metrics::OmniboxEventProto::LENS_SIDE_PANEL_SEARCHBOX;
+  }
+  return metrics::OmniboxEventProto::SEARCH_SIDE_PANEL_SEARCHBOX;
 }
 
 security_state::SecurityLevel LensOmniboxClient::GetSecurityLevel() const {
diff --git a/ios/chrome/browser/lens_overlay/coordinator/lens_overlay_mediator.mm b/ios/chrome/browser/lens_overlay/coordinator/lens_overlay_mediator.mm
index 509d4f2..21ffd18 100644
--- a/ios/chrome/browser/lens_overlay/coordinator/lens_overlay_mediator.mm
+++ b/ios/chrome/browser/lens_overlay/coordinator/lens_overlay_mediator.mm
@@ -253,6 +253,7 @@
   }
   if (self.omniboxClient) {
     self.omniboxClient->SetLensOverlaySuggestInputs(std::nullopt);
+    self.omniboxClient->SetLensResultHasThumbnail(!result.isTextSelection);
   }
 }
 
diff --git a/ios/chrome/browser/omaha/model/BUILD.gn b/ios/chrome/browser/omaha/model/BUILD.gn
index 42429a36..6c634e6 100644
--- a/ios/chrome/browser/omaha/model/BUILD.gn
+++ b/ios/chrome/browser/omaha/model/BUILD.gn
@@ -44,6 +44,7 @@
     "//components/prefs",
     "//components/version_info",
     "//ios/chrome/browser/shared/model/application_context",
+    "//ios/chrome/browser/shared/public/features",
     "//ios/chrome/browser/upgrade/model:public",
     "//ios/chrome/common",
     "//ios/chrome/test:test_support",
diff --git a/ios/chrome/browser/omaha/model/omaha_service.h b/ios/chrome/browser/omaha/model/omaha_service.h
index 760ecf81..df198fe 100644
--- a/ios/chrome/browser/omaha/model/omaha_service.h
+++ b/ios/chrome/browser/omaha/model/omaha_service.h
@@ -5,6 +5,8 @@
 #ifndef IOS_CHROME_BROWSER_OMAHA_MODEL_OMAHA_SERVICE_H_
 #define IOS_CHROME_BROWSER_OMAHA_MODEL_OMAHA_SERVICE_H_
 
+#include <Foundation/Foundation.h>
+
 #include <memory>
 #include <string>
 
@@ -113,6 +115,7 @@
   FRIEND_TEST_ALL_PREFIXES(OmahaServiceTest, PingOutOfDateUpdatesUserDefaults);
   FRIEND_TEST_ALL_PREFIXES(OmahaServiceInternalTest,
                            PingMessageTestWithProfileData);
+  FRIEND_TEST_ALL_PREFIXES(OmahaServiceTest, ResyncTimerAfterSystemSuspend);
 
   // For the singleton:
   friend class base::NoDestructor<OmahaService>;
@@ -129,8 +132,9 @@
   void StartInternal(
       const scoped_refptr<base::SequencedTaskRunner> task_runner);
 
-  // Stops the service in preparation for browser shutdown.
-  void StopInternal();
+  // Resyncs the timer if device sleep has caused it to get out of
+  // sync with `next_tries_time_`.
+  void ResyncTimerIfNeeded();
 
   // URL loader completion callback.
   void OnURLLoadComplete(std::unique_ptr<std::string> response_body);
@@ -264,6 +268,11 @@
   // If a scheduled ping was canceled.
   bool scheduled_ping_canceled_ = false;
 
+  // An opaque handle to the applicationWillEnterForeground
+  // notification registration. Used to cancel the registration and to
+  // prevent registering multiple times.
+  id foreground_notification_registration_handle_;
+
   // Called to notify that upgrade is recommended.
   UpgradeRecommendedCallback upgrade_recommended_callback_;
 
diff --git a/ios/chrome/browser/omaha/model/omaha_service.mm b/ios/chrome/browser/omaha/model/omaha_service.mm
index d2223d56..e4aead2 100644
--- a/ios/chrome/browser/omaha/model/omaha_service.mm
+++ b/ios/chrome/browser/omaha/model/omaha_service.mm
@@ -4,7 +4,7 @@
 
 #import "ios/chrome/browser/omaha/model/omaha_service.h"
 
-#import <Foundation/Foundation.h>
+#import <UIKit/UIKit.h>
 
 #import <memory>
 #import <utility>
@@ -495,6 +495,11 @@
 OmahaService::~OmahaService() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
+  if (foreground_notification_registration_handle_) {
+    [[NSNotificationCenter defaultCenter]
+        removeObserver:foreground_notification_registration_handle_];
+  }
+
   for (auto& observer : observers_) {
     observer.ServiceWillShutdown(this);
   }
@@ -795,9 +800,55 @@
     timer_.Start(
         FROM_HERE, next_tries_time_ - now,
         base::BindOnce(&OmahaService::SendPing, base::Unretained(this)));
+    // Once the timer is started, register for
+    // applicationWillEnterForeground notifications.
+    if (!foreground_notification_registration_handle_ &&
+        base::FeatureList::IsEnabled(kOmahaResyncTimerOnForeground)) {
+      foreground_notification_registration_handle_ =
+          [[NSNotificationCenter defaultCenter]
+              addObserverForName:@"UIApplicationWillEnterForegroundNotification"
+                          object:nil
+                           queue:nil
+                      usingBlock:^(NSNotification* notification) {
+                        web::GetIOThreadTaskRunner({})->PostTask(
+                            FROM_HERE,
+                            base::BindOnce(&OmahaService::ResyncTimerIfNeeded,
+                                           base::Unretained(this)));
+                      }];
+    }
   }
 }
 
+// base::TimeTicks pauses when the device is asleep, which artifically
+// extends long-running timers. Mitigate this by resyncing timers to
+// the expected deadline.
+void OmahaService::ResyncTimerIfNeeded() {
+  DCHECK_CURRENTLY_ON(web::WebThread::IO);
+  CHECK(base::FeatureList::IsEnabled(kOmahaResyncTimerOnForeground),
+        base::NotFatalUntil::M134);
+
+  // If the timer isn't already running, nothing needs to be done.
+  if (!timer_.IsRunning()) {
+    return;
+  }
+
+  // If the deadline has already passed, fire the timer
+  // immediately. Note that this check uses wall clock time, so may
+  // fire early if the device's clock was changed, but sending extra
+  // pings is not harmful.
+  base::Time now = base::Time::Now();
+  if (next_tries_time_ <= now) {
+    timer_.FireNow();
+    return;
+  }
+
+  // The deadline is still in the future, but may not match what the
+  // timer is currently set to. Reset the timer with a new deadline.
+  CHECK(schedule_, base::NotFatalUntil::M134);
+  timer_.Start(FROM_HERE, next_tries_time_ - now,
+               base::BindOnce(&OmahaService::SendPing, base::Unretained(this)));
+}
+
 void OmahaService::PersistStates() {
   // As a workaround to crbug.com/1247282, dispatch back to the main thread.
   dispatch_async(dispatch_get_main_queue(), ^{
diff --git a/ios/chrome/browser/omaha/model/omaha_service_unittest.mm b/ios/chrome/browser/omaha/model/omaha_service_unittest.mm
index 0d0a92bd..757385ca 100644
--- a/ios/chrome/browser/omaha/model/omaha_service_unittest.mm
+++ b/ios/chrome/browser/omaha/model/omaha_service_unittest.mm
@@ -4,6 +4,7 @@
 
 #import "ios/chrome/browser/omaha/model/omaha_service.h"
 
+#import <UIKit/UIKit.h>
 #import <regex.h>
 #import <sys/types.h>
 
@@ -13,11 +14,14 @@
 #import "base/strings/stringprintf.h"
 #import "base/task/sequenced_task_runner.h"
 #import "base/test/ios/wait_util.h"
+#import "base/test/scoped_feature_list.h"
 #import "base/time/time.h"
+#import "base/time/time_override.h"
 #import "components/metrics/metrics_pref_names.h"
 #import "components/prefs/pref_registry_simple.h"
 #import "components/version_info/version_info.h"
 #import "ios/chrome/browser/shared/model/application_context/application_context.h"
+#import "ios/chrome/browser/shared/public/features/features.h"
 #import "ios/chrome/browser/upgrade/model/upgrade_constants.h"
 #import "ios/chrome/browser/upgrade/model/upgrade_recommended_details.h"
 #import "ios/chrome/common/channel_info.h"
@@ -38,6 +42,15 @@
 
 const int64_t kUnknownInstallDate = 2;
 
+base::Time GetTimeWithDelta(base::TimeDelta delta) {
+  static base::Time base = base::subtle::TimeNowIgnoringOverride();
+  return base + delta;
+}
+
+base::TimeTicks GetTimeTicksWithDelta(base::TimeDelta delta) {
+  static base::TimeTicks base = base::subtle::TimeTicksNowIgnoringOverride();
+  return base + delta;
+}
 }  // namespace
 
 class OmahaServiceTest : public PlatformTest {
@@ -105,6 +118,10 @@
     service->locale_lang_ = std::string();
   }
 
+  base::TimeDelta TimerRemainingTime(OmahaService* service) {
+    return service->timer_.desired_run_time() - base::TimeTicks::Now();
+  }
+
   std::string test_application_id() const {
     return ios::provider::GetOmahaApplicationId();
   }
@@ -832,3 +849,72 @@
   id1 = service.GetNextPingRequestId(OmahaService::USAGE_PING);
   ASSERT_NE(id1, service.GetNextPingRequestId(OmahaService::USAGE_PING));
 }
+
+TEST_F(OmahaServiceTest, ResyncTimerAfterSystemSuspend) {
+  base::test::ScopedFeatureList scoped_feature_list;
+  scoped_feature_list.InitAndEnableFeature(kOmahaResyncTimerOnForeground);
+
+  OmahaService service(true);
+  service.StartInternal(base::SequencedTaskRunner::GetCurrentDefault());
+  service.InitializeURLLoaderFactory(test_shared_url_loader_factory_);
+  CleanService(&service, std::string(version_info::GetVersionNumber()));
+
+  {
+    base::subtle::ScopedTimeClockOverrides clock_overrides(
+        []() { return GetTimeWithDelta(base::Hours(0)); },
+        []() { return GetTimeTicksWithDelta(base::Hours(0)); }, nullptr);
+
+    // Sending a successful ping will schedule another ping in the future.
+    service.SendPing();
+    auto* pending_request = test_url_loader_factory_.GetPendingRequest(0);
+    test_url_loader_factory_.SimulateResponseForPendingRequest(
+        pending_request->request.url.spec(), GetResponseSuccess());
+
+    EXPECT_GE(TimerRemainingTime(&service), base::Minutes(299));
+    EXPECT_EQ(service.last_sent_time_, base::Time::Now());
+  }
+
+  // Simulate two hours of system suspend time.
+  {
+    base::subtle::ScopedTimeClockOverrides clock_overrides(
+        []() { return GetTimeWithDelta(base::Hours(2)); },
+        []() { return GetTimeTicksWithDelta(base::Hours(0)); }, nullptr);
+
+    // Before the resync, the timer should still have ~5 hours of
+    // running time left.
+    EXPECT_GT(TimerRemainingTime(&service), base::Minutes(299));
+    EXPECT_LT(TimerRemainingTime(&service), base::Minutes(301));
+
+    // After the resync, there should be ~3 hours of running time
+    // left, since the wall clock advanced by 2 hours.
+    service.ResyncTimerIfNeeded();
+    EXPECT_GT(TimerRemainingTime(&service), base::Minutes(179));
+    EXPECT_LT(TimerRemainingTime(&service), base::Minutes(181));
+    EXPECT_NE(service.last_sent_time_, base::Time::Now());
+  }
+
+  // Simulate six hours of wall clock time, two hours of that suspended.
+  {
+    base::subtle::ScopedTimeClockOverrides clock_overrides(
+        []() { return GetTimeWithDelta(base::Hours(6)); },
+        []() { return GetTimeTicksWithDelta(base::Hours(2)); }, nullptr);
+
+    // Before the resync, the timer should still have ~1 hour of
+    // running time left.
+    EXPECT_GT(TimerRemainingTime(&service), base::Minutes(59));
+    EXPECT_LT(TimerRemainingTime(&service), base::Minutes(61));
+
+    // After the resync, the timer should fire.
+    service.ResyncTimerIfNeeded();
+    auto* pending_request = test_url_loader_factory_.GetPendingRequest(0);
+    test_url_loader_factory_.SimulateResponseForPendingRequest(
+        pending_request->request.url.spec(), GetResponseSuccess());
+
+    EXPECT_GT(TimerRemainingTime(&service), base::Minutes(299));
+    EXPECT_LT(TimerRemainingTime(&service), base::Minutes(301));
+    EXPECT_EQ(service.last_sent_time_, base::Time::Now());
+  }
+
+  // Spin the runloop to clear any pending tasks.
+  base::RunLoop().RunUntilIdle();
+}
diff --git a/ios/chrome/browser/providers/signin/chromium_trusted_vault.mm b/ios/chrome/browser/providers/signin/chromium_trusted_vault.mm
index f3228a16..c9901b7e 100644
--- a/ios/chrome/browser/providers/signin/chromium_trusted_vault.mm
+++ b/ios/chrome/browser/providers/signin/chromium_trusted_vault.mm
@@ -45,6 +45,12 @@
                       base::OnceCallback<void(bool)> completion) final;
   void GetPublicKeyForIdentity(id<SystemIdentity> identity,
                                GetPublicKeyCallback completion) final;
+  CancelDialogCallback UpdateGPMPinForAccount(
+      id<SystemIdentity> identity,
+      trusted_vault::SecurityDomainId security_domain_id,
+      UINavigationController* navigationController,
+      UIView* brandedNavigationItemTitleView,
+      UpdateGPMPinCompletionCallback completion) final;
 };
 
 void ChromiumTrustedVaultClientBackend::
@@ -104,6 +110,16 @@
   NOTREACHED();
 }
 
+TrustedVaultClientBackend::CancelDialogCallback
+ChromiumTrustedVaultClientBackend::UpdateGPMPinForAccount(
+    id<SystemIdentity> identity,
+    trusted_vault::SecurityDomainId security_domain_id,
+    UINavigationController* navigationController,
+    UIView* brandedNavigationItemTitleView,
+    UpdateGPMPinCompletionCallback completion) {
+  NOTREACHED_NORETURN();
+}
+
 }  // anonymous namespace
 
 std::unique_ptr<TrustedVaultClientBackend> CreateTrustedVaultClientBackend(
diff --git a/ios/chrome/browser/shared/public/features/features.h b/ios/chrome/browser/shared/public/features/features.h
index 14fcd8a..48d1234 100644
--- a/ios/chrome/browser/shared/public/features/features.h
+++ b/ios/chrome/browser/shared/public/features/features.h
@@ -874,4 +874,7 @@
 // Feature flag to assign each managed account to its own separate profile.
 BASE_DECLARE_FEATURE(kSeparateProfilesForManagedAccounts);
 
+// Feature to control resyncing the omaha ping timer on foregrounding.
+BASE_DECLARE_FEATURE(kOmahaResyncTimerOnForeground);
+
 #endif  // IOS_CHROME_BROWSER_SHARED_PUBLIC_FEATURES_FEATURES_H_
diff --git a/ios/chrome/browser/shared/public/features/features.mm b/ios/chrome/browser/shared/public/features/features.mm
index 9c0f7a8..bc1225d 100644
--- a/ios/chrome/browser/shared/public/features/features.mm
+++ b/ios/chrome/browser/shared/public/features/features.mm
@@ -1070,3 +1070,7 @@
 BASE_FEATURE(kSeparateProfilesForManagedAccounts,
              "SeparateProfilesForManagedAccounts",
              base::FEATURE_DISABLED_BY_DEFAULT);
+
+BASE_FEATURE(kOmahaResyncTimerOnForeground,
+             "OmahaResyncTimerOnForeground",
+             base::FEATURE_DISABLED_BY_DEFAULT);
diff --git a/ios/chrome/browser/signin/model/trusted_vault_client_backend.h b/ios/chrome/browser/signin/model/trusted_vault_client_backend.h
index bee8ddb..d9eb1f4 100644
--- a/ios/chrome/browser/signin/model/trusted_vault_client_backend.h
+++ b/ios/chrome/browser/signin/model/trusted_vault_client_backend.h
@@ -39,6 +39,8 @@
   using GetPublicKeyCallback = base::OnceCallback<void(const PublicKey&)>;
   using CancelDialogCallback =
       base::OnceCallback<void(BOOL animated, ProceduralBlock cancel_done)>;
+  using UpdateGPMPinCompletionCallback =
+      base::OnceCallback<void(NSError* error)>;
 
   // Callback used to verify local device registration and log the result to
   // UMA metrics. The argument represents the gaia ID subject to verification.
@@ -119,6 +121,19 @@
   virtual void GetPublicKeyForIdentity(id<SystemIdentity> identity,
                                        GetPublicKeyCallback callback) = 0;
 
+  // Starts the flow to change a GPM Pin for `identity`. This should only be
+  // used for hw_protected (passkeys) `security_domain_id` until further notice.
+  // The UI will be presented by the `navigationController` with a
+  // `brandedNavigationItemTitleView` on top. Once the flow is done,
+  // `completion` is called (unless the flow is cancelled).
+  // TODO(crbug.com/369153587): Make it pure virtual.
+  virtual CancelDialogCallback UpdateGPMPinForAccount(
+      id<SystemIdentity> identity,
+      trusted_vault::SecurityDomainId security_domain_id,
+      UINavigationController* navigationController,
+      UIView* brandedNavigationItemTitleView,
+      UpdateGPMPinCompletionCallback completion);
+
  protected:
   // Functions to notify observers.
   void NotifyKeysChanged(trusted_vault::SecurityDomainId security_domain_id);
diff --git a/ios/chrome/browser/signin/model/trusted_vault_client_backend.mm b/ios/chrome/browser/signin/model/trusted_vault_client_backend.mm
index 0c2f674..95d2cdb 100644
--- a/ios/chrome/browser/signin/model/trusted_vault_client_backend.mm
+++ b/ios/chrome/browser/signin/model/trusted_vault_client_backend.mm
@@ -24,6 +24,16 @@
       observer);
 }
 
+TrustedVaultClientBackend::CancelDialogCallback
+TrustedVaultClientBackend::UpdateGPMPinForAccount(
+    id<SystemIdentity> identity,
+    trusted_vault::SecurityDomainId security_domain_id,
+    UINavigationController* navigationController,
+    UIView* brandedNavigationItemTitleView,
+    UpdateGPMPinCompletionCallback completion) {
+  NOTREACHED_NORETURN();
+}
+
 void TrustedVaultClientBackend::NotifyKeysChanged(
     trusted_vault::SecurityDomainId security_domain_id) {
   auto it = observer_lists_per_security_domain_id_.find(security_domain_id);
diff --git a/ios/chrome/browser/ui/content_suggestions/tips/tips_module_view.mm b/ios/chrome/browser/ui/content_suggestions/tips/tips_module_view.mm
index 363f7c8..a102452 100644
--- a/ios/chrome/browser/ui/content_suggestions/tips/tips_module_view.mm
+++ b/ios/chrome/browser/ui/content_suggestions/tips/tips_module_view.mm
@@ -4,6 +4,7 @@
 
 #import "ios/chrome/browser/ui/content_suggestions/tips/tips_module_view.h"
 
+#import <optional>
 #import <string>
 
 #import "base/check.h"
@@ -84,16 +85,22 @@
   }
 }
 
-// Returns the `SymbolConfig` for the badge symbol of the given `tip`, or a
-// default-constructed `SymbolConfig` if the tip doesn't have a badge.
-SymbolConfig GetBadgeSymbolConfigForTip(TipIdentifier tip) {
+// Returns the `SymbolConfig` for the badge symbol of the given `tip`, or
+// `std::nullopt` if the tip doesn't have a badge.
+std::optional<SymbolConfig> GetBadgeSymbolConfigForTip(TipIdentifier tip) {
   switch (tip) {
-    case TipIdentifier::kLensShop:
-      return {base::SysNSStringToUTF8(kCartSymbol), true};
-    case TipIdentifier::kLensTranslate:
-      return {base::SysNSStringToUTF8(kLanguageSymbol), false};
+    case TipIdentifier::kLensShop: {
+      SymbolConfig result = {base::SysNSStringToUTF8(kCartSymbol), true};
+
+      return result;
+    }
+    case TipIdentifier::kLensTranslate: {
+      SymbolConfig result = {base::SysNSStringToUTF8(kLanguageSymbol), false};
+
+      return result;
+    }
     default:
-      NOTREACHED();
+      return std::nullopt;
   }
 }
 
@@ -164,7 +171,31 @@
 - (IconDetailView*)iconDetailView:(TipIdentifier)tip {
   SymbolConfig symbol = GetSymbolConfigForTip(tip);
 
-  SymbolConfig badgeSymbol = GetBadgeSymbolConfigForTip(tip);
+  std::optional<SymbolConfig> badgeSymbol = GetBadgeSymbolConfigForTip(tip);
+
+  if (badgeSymbol.has_value()) {
+    SymbolConfig badgeConfig = badgeSymbol.value();
+
+    IconDetailView* view = [[IconDetailView alloc]
+                  initWithTitle:[self titleText:tip]
+                    description:[self descriptionText:tip]
+                     layoutType:IconDetailViewLayoutType::kHero
+                     symbolName:base::SysUTF8ToNSString(symbol.name)
+             symbolColorPalette:[self symbolColorPalette:tip]
+          symbolBackgroundColor:[self symbolBackgroundColor:tip]
+              usesDefaultSymbol:symbol.is_default_symbol
+                  showCheckmark:NO
+                badgeSymbolName:base::SysUTF8ToNSString(badgeConfig.name)
+           badgeBackgroundColor:[self badgeBackgroundColor:tip]
+         badgeUsesDefaultSymbol:badgeConfig.is_default_symbol
+        accessibilityIdentifier:[self accessibilityIdentifier:tip]];
+
+    view.identifier = base::SysUTF8ToNSString(NameForTipIdentifier(tip));
+
+    view.tapDelegate = self;
+
+    return view;
+  }
 
   IconDetailView* view = [[IconDetailView alloc]
                 initWithTitle:[self titleText:tip]
@@ -175,9 +206,6 @@
         symbolBackgroundColor:[self symbolBackgroundColor:tip]
             usesDefaultSymbol:symbol.is_default_symbol
                 showCheckmark:NO
-              badgeSymbolName:base::SysUTF8ToNSString(badgeSymbol.name)
-         badgeBackgroundColor:[self badgeBackgroundColor:tip]
-       badgeUsesDefaultSymbol:badgeSymbol.is_default_symbol
       accessibilityIdentifier:[self accessibilityIdentifier:tip]];
 
   view.identifier = base::SysUTF8ToNSString(NameForTipIdentifier(tip));
diff --git a/ios/chrome/browser/web/model/BUILD.gn b/ios/chrome/browser/web/model/BUILD.gn
index 68e0826..ea92d2a 100644
--- a/ios/chrome/browser/web/model/BUILD.gn
+++ b/ios/chrome/browser/web/model/BUILD.gn
@@ -238,7 +238,9 @@
     "//build:blink_buildflags",
     "//components/autofill/core/common:features",
     "//components/autofill/ios/browser",
+    "//components/autofill/ios/common",
     "//components/autofill/ios/form_util:form_handler_feature",
+    "//components/autofill/ios/form_util:programmatic_form_submission_handler_feature",
     "//components/content_settings/core/browser",
     "//components/content_settings/core/browser:cookie_settings",
     "//components/crash/core/common:crash_key",
diff --git a/ios/chrome/browser/web/model/chrome_web_client.mm b/ios/chrome/browser/web/model/chrome_web_client.mm
index 1526c8e8..445628e 100644
--- a/ios/chrome/browser/web/model/chrome_web_client.mm
+++ b/ios/chrome/browser/web/model/chrome_web_client.mm
@@ -20,7 +20,9 @@
 #import "base/strings/sys_string_conversions.h"
 #import "components/autofill/ios/browser/autofill_java_script_feature.h"
 #import "components/autofill/ios/browser/suggestion_controller_java_script_feature.h"
+#import "components/autofill/ios/common/features.h"
 #import "components/autofill/ios/form_util/form_handlers_java_script_feature.h"
+#import "components/autofill/ios/form_util/programmatic_form_submission_handler_java_script_feature.h"
 #import "components/dom_distiller/core/url_constants.h"
 #import "components/google/core/common/google_util.h"
 #import "components/language/ios/browser/language_detection_java_script_feature.h"
@@ -339,6 +341,13 @@
 
   features.push_back(autofill::AutofillJavaScriptFeature::GetInstance());
   features.push_back(autofill::FormHandlersJavaScriptFeature::GetInstance());
+
+  if (base::FeatureList::IsEnabled(kAutofillIsolatedWorldForJavascriptIos)) {
+    features.push_back(
+        autofill::ProgrammaticFormSubmissionHandlerJavaScriptFeature::
+            GetInstance());
+  }
+
   features.push_back(
       autofill::SuggestionControllerJavaScriptFeature::GetInstance());
   features.push_back(AutofillBottomSheetJavaScriptFeature::GetInstance());
diff --git a/ios/chrome/browser/webui/ui_bundled/BUILD.gn b/ios/chrome/browser/webui/ui_bundled/BUILD.gn
index 5fcb521..6ec63134 100644
--- a/ios/chrome/browser/webui/ui_bundled/BUILD.gn
+++ b/ios/chrome/browser/webui/ui_bundled/BUILD.gn
@@ -115,8 +115,8 @@
     "chrome_web_ui_ios_controller_factory.h",
     "chrome_web_ui_ios_controller_factory.mm",
     "chrome_web_ui_provider.cc",
-    "omaha_ui.cc",
     "omaha_ui.h",
+    "omaha_ui.mm",
     "on_device_llm_internals_ui.h",
     "on_device_llm_internals_ui.mm",
     "signin_internals_ui_ios.cc",
diff --git a/ios/chrome/browser/webui/ui_bundled/omaha_ui.cc b/ios/chrome/browser/webui/ui_bundled/omaha_ui.mm
similarity index 82%
rename from ios/chrome/browser/webui/ui_bundled/omaha_ui.cc
rename to ios/chrome/browser/webui/ui_bundled/omaha_ui.mm
index 77898e72..dc599751 100644
--- a/ios/chrome/browser/webui/ui_bundled/omaha_ui.cc
+++ b/ios/chrome/browser/webui/ui_bundled/omaha_ui.mm
@@ -2,20 +2,20 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "ios/chrome/browser/webui/ui_bundled/omaha_ui.h"
+#import "ios/chrome/browser/webui/ui_bundled/omaha_ui.h"
 
-#include <memory>
+#import <memory>
 
-#include "base/functional/bind.h"
-#include "base/memory/weak_ptr.h"
-#include "base/values.h"
-#include "ios/chrome/browser/omaha/model/omaha_service.h"
-#include "ios/chrome/browser/shared/model/profile/profile_ios.h"
-#include "ios/chrome/browser/shared/model/url/chrome_url_constants.h"
-#include "ios/chrome/grit/ios_resources.h"
-#include "ios/web/public/webui/web_ui_ios.h"
-#include "ios/web/public/webui/web_ui_ios_data_source.h"
-#include "ios/web/public/webui/web_ui_ios_message_handler.h"
+#import "base/functional/bind.h"
+#import "base/memory/weak_ptr.h"
+#import "base/values.h"
+#import "ios/chrome/browser/omaha/model/omaha_service.h"
+#import "ios/chrome/browser/shared/model/profile/profile_ios.h"
+#import "ios/chrome/browser/shared/model/url/chrome_url_constants.h"
+#import "ios/chrome/grit/ios_resources.h"
+#import "ios/web/public/webui/web_ui_ios.h"
+#import "ios/web/public/webui/web_ui_ios_data_source.h"
+#import "ios/web/public/webui/web_ui_ios_message_handler.h"
 
 using web::WebUIIOSMessageHandler;
 
diff --git a/ios/chrome/test/providers/signin/fake_trusted_vault_client_backend.h b/ios/chrome/test/providers/signin/fake_trusted_vault_client_backend.h
index 9b10cc1..e9dac36 100644
--- a/ios/chrome/test/providers/signin/fake_trusted_vault_client_backend.h
+++ b/ios/chrome/test/providers/signin/fake_trusted_vault_client_backend.h
@@ -43,6 +43,12 @@
                       base::OnceCallback<void(bool)> completion) final;
   void GetPublicKeyForIdentity(id<SystemIdentity> identity,
                                GetPublicKeyCallback completion) final;
+  CancelDialogCallback UpdateGPMPinForAccount(
+      id<SystemIdentity> identity,
+      trusted_vault::SecurityDomainId security_domain_id,
+      UINavigationController* navigationController,
+      UIView* brandedNavigationItemTitleView,
+      UpdateGPMPinCompletionCallback completion) final;
 
   // Simulates user cancelling the reauth dialog.
   void SimulateUserCancel();
diff --git a/ios/chrome/test/providers/signin/fake_trusted_vault_client_backend.mm b/ios/chrome/test/providers/signin/fake_trusted_vault_client_backend.mm
index efbf477..0bf5df3 100644
--- a/ios/chrome/test/providers/signin/fake_trusted_vault_client_backend.mm
+++ b/ios/chrome/test/providers/signin/fake_trusted_vault_client_backend.mm
@@ -142,6 +142,18 @@
   // Do nothing.
 }
 
+FakeTrustedVaultClientBackend::CancelDialogCallback
+FakeTrustedVaultClientBackend::UpdateGPMPinForAccount(
+    id<SystemIdentity> identity,
+    trusted_vault::SecurityDomainId security_domain_id,
+    UINavigationController* navigationController,
+    UIView* brandedNavigationItemTitleView,
+    UpdateGPMPinCompletionCallback completion) {
+  // Do nothing.
+  return base::BindOnce(
+      [](bool animated, ProceduralBlock cancel_done_callback) {});
+}
+
 void FakeTrustedVaultClientBackend::SimulateUserCancel() {
   DCHECK(view_controller_);
   [view_controller_ simulateUserCancel];
diff --git a/ios/web_view/BUILD.gn b/ios/web_view/BUILD.gn
index 9dea369b..87d7a08 100644
--- a/ios/web_view/BUILD.gn
+++ b/ios/web_view/BUILD.gn
@@ -316,6 +316,7 @@
   "//components/autofill/ios/browser:util",
   "//components/autofill/ios/form_util",
   "//components/autofill/ios/form_util:form_handler_feature",
+  "//components/autofill/ios/form_util:programmatic_form_submission_handler_feature",
   "//components/browser_sync",
   "//components/component_updater",
   "//components/component_updater/installer_policies",
@@ -432,7 +433,10 @@
   sources += ios_web_view_sources
 
   public_deps = ios_web_view_deps
-  deps = [ "//components/version_info:channel" ]
+  deps = [
+    "//components/autofill/ios/common",
+    "//components/version_info:channel",
+  ]
   configs += [ ":config" ]
 }
 
diff --git a/ios/web_view/internal/web_view_web_client.mm b/ios/web_view/internal/web_view_web_client.mm
index 56eb3edf..8b3b767 100644
--- a/ios/web_view/internal/web_view_web_client.mm
+++ b/ios/web_view/internal/web_view_web_client.mm
@@ -15,7 +15,9 @@
 #import "base/strings/sys_string_conversions.h"
 #import "components/autofill/ios/browser/autofill_java_script_feature.h"
 #import "components/autofill/ios/browser/suggestion_controller_java_script_feature.h"
+#import "components/autofill/ios/common/features.h"
 #import "components/autofill/ios/form_util/form_handlers_java_script_feature.h"
+#import "components/autofill/ios/form_util/programmatic_form_submission_handler_java_script_feature.h"
 #import "components/language/ios/browser/language_detection_java_script_feature.h"
 #import "components/password_manager/ios/password_manager_java_script_feature.h"
 #import "components/security_interstitials/core/unsafe_resource.h"
@@ -94,7 +96,7 @@
 
 std::vector<web::JavaScriptFeature*> WebViewWebClient::GetJavaScriptFeatures(
     web::BrowserState* browser_state) const {
-  return {
+  std::vector<web::JavaScriptFeature*> features = {
       autofill::AutofillJavaScriptFeature::GetInstance(),
       autofill::FormHandlersJavaScriptFeature::GetInstance(),
       autofill::SuggestionControllerJavaScriptFeature::GetInstance(),
@@ -105,6 +107,14 @@
       translate::TranslateJavaScriptFeature::GetInstance(),
       WebViewMessageHandlerJavaScriptFeature::FromBrowserState(browser_state),
       WebViewScriptsJavaScriptFeature::FromBrowserState(browser_state)};
+
+  if (base::FeatureList::IsEnabled(kAutofillIsolatedWorldForJavascriptIos)) {
+    features.push_back(
+        autofill::ProgrammaticFormSubmissionHandlerJavaScriptFeature::
+            GetInstance());
+  }
+
+  return features;
 }
 
 void WebViewWebClient::PrepareErrorPage(
diff --git a/ios_internal b/ios_internal
index 98bfebd..f077b03 160000
--- a/ios_internal
+++ b/ios_internal
@@ -1 +1 @@
-Subproject commit 98bfebd811401f750d9692e455de80fe8553d1bd
+Subproject commit f077b0366edef70d7b2dc5d3e9697fab618efeac
diff --git a/media/cdm/BUILD.gn b/media/cdm/BUILD.gn
index 7125966..eb34eb5a 100644
--- a/media/cdm/BUILD.gn
+++ b/media/cdm/BUILD.gn
@@ -3,6 +3,7 @@
 # found in the LICENSE file.
 
 import("//media/media_options.gni")
+import("//testing/test.gni")
 
 source_set("cdm_api") {
   sources = [ "api/content_decryption_module.h" ]
@@ -257,3 +258,19 @@
     ]
   }
 }
+
+test("aes_decryptor_fuzztests") {
+  sources = [ "aes_decryptor_fuzztests.cc" ]
+
+  fuzztests = [
+    "AesDecryptorFuzzTests.CreateSessionDoesNotCrash",
+    "AesDecryptorFuzzTests.UpdateSessionDoesNotCrash",
+    "AesDecryptorFuzzTests.DecryptDoesNotCrash",
+  ]
+
+  deps = [
+    "//base/test:test_support",
+    "//media:test_support",
+    "//third_party/fuzztest:fuzztest_gtest_main",
+  ]
+}
diff --git a/media/cdm/aes_decryptor_fuzztests.cc b/media/cdm/aes_decryptor_fuzztests.cc
new file mode 100644
index 0000000..3a2828a3
--- /dev/null
+++ b/media/cdm/aes_decryptor_fuzztests.cc
@@ -0,0 +1,302 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <algorithm>
+#include <cstdint>
+#include <string>
+#include <vector>
+
+#include "base/functional/callback_helpers.h"
+#include "base/memory/scoped_refptr.h"
+#include "base/test/bind.h"
+#include "media/base/cdm_callback_promise.h"
+#include "media/base/cdm_promise.h"
+#include "media/base/content_decryption_module.h"
+#include "media/base/decoder_buffer.h"
+#include "media/base/decrypt_config.h"
+#include "media/base/subsample_entry.h"
+#include "media/cdm/aes_decryptor.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/fuzztest/src/fuzztest/fuzztest.h"
+
+namespace {
+
+// Data below is all taken from aes_decryptor_unittest.cc. The tests have a
+// better description of what is happening.
+
+const uint8_t webm_init_data[] = {
+    // base64 equivalent is AAECAw
+    0x00, 0x01, 0x02, 0x03};
+
+const uint8_t cenc_init_data[] = {
+    0x00, 0x00, 0x00, 0x44,                          // size = 68
+    0x70, 0x73, 0x73, 0x68,                          // 'pssh'
+    0x01,                                            // version
+    0x00, 0x00, 0x00,                                // flags
+    0x10, 0x77, 0xEF, 0xEC, 0xC0, 0xB2, 0x4D, 0x02,  // SystemID
+    0xAC, 0xE3, 0x3C, 0x1E, 0x52, 0xE2, 0xFB, 0x4B,
+    0x00, 0x00, 0x00, 0x02,                          // key count
+    0x7E, 0x57, 0x1D, 0x03, 0x7E, 0x57, 0x1D, 0x03,  // key1
+    0x7E, 0x57, 0x1D, 0x03, 0x7E, 0x57, 0x1D, 0x03,
+    0x7E, 0x57, 0x1D, 0x04, 0x7E, 0x57, 0x1D, 0x04,  // key2
+    0x7E, 0x57, 0x1D, 0x04, 0x7E, 0x57, 0x1D, 0x04,
+    0x00, 0x00, 0x00, 0x00  // datasize
+};
+
+const uint8_t keyids_init_data[] =
+    "{\"kids\":[\"AQI\",\"AQIDBA\",\"AQIDBAUGBwgJCgsMDQ4PEA\"]}";
+
+// 3 valid JWKs used as seeds to Update().
+const char kKeyAsJWK[] =
+    "{"
+    "  \"keys\": ["
+    "    {"
+    "      \"kty\": \"oct\","
+    "      \"alg\": \"A128KW\","
+    "      \"kid\": \"AAECAw\","
+    "      \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\""
+    "    }"
+    "  ],"
+    "  \"type\": \"temporary\""
+    "}";
+
+const char kKeyAlternateAsJWK[] =
+    "{"
+    "  \"keys\": ["
+    "    {"
+    "      \"kty\": \"oct\","
+    "      \"alg\": \"A128KW\","
+    "      \"kid\": \"AAECAw\","
+    "      \"k\": \"FBUWFxgZGhscHR4fICEiIw\""
+    "    }"
+    "  ]"
+    "}";
+
+const char kWrongKeyAsJWK[] =
+    "{"
+    "  \"keys\": ["
+    "    {"
+    "      \"kty\": \"oct\","
+    "      \"alg\": \"A128KW\","
+    "      \"kid\": \"AAECAw\","
+    "      \"k\": \"7u7u7u7u7u7u7u7u7u7u7g\""
+    "    }"
+    "  ]"
+    "}";
+
+const uint8_t kIv[] = {0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
+                       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+
+const media::SubsampleEntry kSubsampleEntriesNormal[] = {{2, 7},
+                                                         {3, 11},
+                                                         {1, 0}};
+
+// This is the string "Original subsample data." encrypted with key
+// 0x0405060708090a0b0c0d0e0f10111213 (base64 equivalent is
+// BAUGBwgJCgsMDQ4PEBESEw) and kIv but without any subsamples (thus all
+// encrypted).
+const uint8_t kEncryptedData[] = {
+    0x2f, 0x03, 0x09, 0xef, 0x71, 0xaf, 0x31, 0x16, 0xfa, 0x9d, 0x18, 0x43,
+    0x1e, 0x96, 0x71, 0xb5, 0xbf, 0xf5, 0x30, 0x53, 0x9a, 0x20, 0xdf, 0x95};
+
+}  // namespace
+
+// Create a session using |int_init_data_type| and |init_data|. First parameter
+// should be EmeInitDataType, but Fuzz tests currently don't support "enum
+// class", so using an int (1-3) instead. Test will check parsing of
+// |init_data|.
+void CreateSessionDoesNotCrash(int int_init_data_type,
+                               const std::vector<uint8_t>& init_data) {
+  media::EmeInitDataType init_data_type;
+  switch (int_init_data_type) {
+    case 1:
+      init_data_type = media::EmeInitDataType::WEBM;
+      break;
+    case 2:
+      init_data_type = media::EmeInitDataType::CENC;
+      break;
+    case 3:
+      init_data_type = media::EmeInitDataType::KEYIDS;
+      break;
+    default:
+      NOTREACHED();
+      return;
+  }
+
+  // Create an AesDecryptor. Ignore any messages that may be generated.
+  scoped_refptr<media::AesDecryptor> aes_decryptor =
+      new media::AesDecryptor(base::DoNothing(), base::DoNothing(),
+                              base::DoNothing(), base::DoNothing());
+
+  // Create a session. Ignore the result of the promise as most often it will be
+  // rejected due to an error. However, if a session was created, save the
+  // session_id so it can be closed.
+  std::string session_id;
+  auto create_promise =
+      std::make_unique<media::CdmCallbackPromise<std::string>>(
+          base::BindLambdaForTesting(
+              [&](const std::string& session) { session_id = session; }),
+          base::DoNothing());
+  aes_decryptor->CreateSessionAndGenerateRequest(
+      media::CdmSessionType::kTemporary, init_data_type, init_data,
+      std::move(create_promise));
+
+  // If a session was created, free up any session resources.
+  if (!session_id.empty()) {
+    auto close_promise = std::make_unique<media::CdmCallbackPromise<>>(
+        base::DoNothing(), base::DoNothing());
+    aes_decryptor->CloseSession(session_id, std::move(close_promise));
+  }
+}
+
+// Call Update() with |response|. As UpdateSession takes a JSON, passing
+// |response| as a string to make specifying seeds easier. Test will check
+// parsing of JWK.
+void UpdateSessionDoesNotCrash(const std::string& response) {
+  // Create an AesDecryptor. Ignore any messages that may be generated.
+  scoped_refptr<media::AesDecryptor> aes_decryptor =
+      new media::AesDecryptor(base::DoNothing(), base::DoNothing(),
+                              base::DoNothing(), base::DoNothing());
+
+  // Create a session. We need to keep track of the session_id as Update() needs
+  // a valid session_id. Use WEBM init_data as it's the simplest.
+  std::string session_id;
+  std::vector<uint8_t> key_id(std::begin(webm_init_data),
+                              std::end(webm_init_data));
+  auto create_promise =
+      std::make_unique<media::CdmCallbackPromise<std::string>>(
+          base::BindLambdaForTesting(
+              [&](const std::string& session) { session_id = session; }),
+          base::DoNothing());
+  aes_decryptor->CreateSessionAndGenerateRequest(
+      media::CdmSessionType::kTemporary, media::EmeInitDataType::WEBM, key_id,
+      std::move(create_promise));
+  EXPECT_GT(session_id.length(), 0ul);
+
+  // Now try UpdateSession with the fuzzed data. Don't bother checking the
+  // result of the promise, as most often it will be rejected.
+  std::vector<uint8_t> data(std::begin(response), std::end(response));
+  auto update_promise = std::make_unique<media::CdmCallbackPromise<>>(
+      base::DoNothing(), base::DoNothing());
+  aes_decryptor->UpdateSession(session_id, data, std::move(update_promise));
+
+  // Free up any session resources.
+  auto close_promise = std::make_unique<media::CdmCallbackPromise<>>(
+      base::DoNothing(), base::DoNothing());
+  aes_decryptor->CloseSession(session_id, std::move(close_promise));
+}
+
+// Decrypts |data| and checks that it succeeds without crashing. The data is
+// assumed to have |clear_bytes| in the clear followed by |encrypted_bytes| that
+// need to be decrypted, repeated up to the length of |data|. A new session is
+// created, and initialized with key AAECAw(base64). Decryption will produce
+// random data, but at least we can verify that it doesn't crash.
+void DecryptDoesNotCrash(std::size_t clear_bytes,
+                         std::size_t encrypted_bytes,
+                         const std::vector<uint8_t>& data) {
+  // Create an AesDecryptor. Ignore any messages that may be generated.
+  scoped_refptr<media::AesDecryptor> aes_decryptor =
+      new media::AesDecryptor(base::DoNothing(), base::DoNothing(),
+                              base::DoNothing(), base::DoNothing());
+
+  // Create a session. We need to keep track of the session_id as Update() needs
+  // a valid session_id.
+  std::string session_id;
+  std::vector<uint8_t> key_id(std::begin(webm_init_data),
+                              std::end(webm_init_data));
+  auto create_promise =
+      std::make_unique<media::CdmCallbackPromise<std::string>>(
+          base::BindLambdaForTesting(
+              [&](const std::string& session) { session_id = session; }),
+          base::DoNothing());
+  aes_decryptor->CreateSessionAndGenerateRequest(
+      media::CdmSessionType::kTemporary, media::EmeInitDataType::WEBM, key_id,
+      std::move(create_promise));
+  EXPECT_GT(session_id.length(), 0ul);
+
+  // Now UpdateSession with |kKeyAsJWK|. This uses key
+  // 0x0405060708090a0b0c0d0e0f10111213 to decrypt the data. Don't bother
+  // checking the result of the promise. (Using pop_back() to remove the \0 at
+  // the end of the string.)
+  std::vector<uint8_t> response(std::begin(kKeyAsJWK), std::end(kKeyAsJWK));
+  response.pop_back();
+  auto update_promise = std::make_unique<media::CdmCallbackPromise<>>(
+      base::DoNothing(), base::DoNothing());
+  aes_decryptor->UpdateSession(session_id, response, std::move(update_promise));
+
+  // Create the subsample array. Each subsample will have |clear_bytes| in the
+  // clear followed by |encrypted_bytes| that need to be decrypted, repeated up
+  // to the length of |data|. If one value is 0, use a single subsample for the
+  // whole buffer.
+  std::vector<media::SubsampleEntry> subsamples;
+  std::size_t length = data.size();
+  if (clear_bytes == 0ul) {
+    // Assume the whole buffer is encrypted.
+    subsamples.emplace_back(0ul, length);
+  } else if (encrypted_bytes == 0ul) {
+    // Assume the whole buffer is clear.
+    subsamples.emplace_back(length, 0ul);
+  } else {
+    while (length > 0ul) {
+      std::size_t clear = std::min(clear_bytes, length);
+      length -= clear;
+      std::size_t encrypted = std::min(encrypted_bytes, length);
+      length -= encrypted;
+      subsamples.emplace_back(clear, encrypted);
+    }
+  }
+
+  // Now attempt to decrypt the fuzzed data. Seed data should be properly
+  // encrypted buffer.
+  auto encrypted_buffer =
+      base::MakeRefCounted<media::DecoderBuffer>(data.size());
+  memcpy(encrypted_buffer->writable_data(), data.data(), data.size());
+  std::string key_id_string(std::begin(key_id), std::end(key_id));
+  std::string iv_string(std::begin(kIv), std::end(kIv));
+  encrypted_buffer->set_decrypt_config(media::DecryptConfig::CreateCencConfig(
+      key_id_string, iv_string, subsamples));
+  media::Decryptor::Status result;
+  aes_decryptor->Decrypt(
+      media::Decryptor::kVideo, encrypted_buffer,
+      base::BindLambdaForTesting(
+          [&](media::Decryptor::Status status,
+              scoped_refptr<media::DecoderBuffer>) { result = status; }));
+  // Decrypt should always succeed. Data will be random.
+  EXPECT_EQ(result, media::Decryptor::Status::kSuccess);
+
+  // Free up any session resources.
+  auto close_promise = std::make_unique<media::CdmCallbackPromise<>>(
+      base::DoNothing(), base::DoNothing());
+  aes_decryptor->CloseSession(session_id, std::move(close_promise));
+}
+
+// Note that most functions check that something is specified, so setting
+// MinSize to 1.
+
+// Seed data for CreateSession is valid WEBM, CENC, and KEYIDS init data.
+// No support for "enum class" EmeInitDataType, so using an int (1-3) instead.
+FUZZ_TEST(AesDecryptorFuzzTests, CreateSessionDoesNotCrash)
+    .WithDomains(fuzztest::InRange<int>(1, 3),
+                 fuzztest::Arbitrary<std::vector<uint8_t>>().WithMinSize(1))
+    .WithSeeds({{1, std::vector<uint8_t>(std::begin(webm_init_data),
+                                         std::end(webm_init_data))},
+                {2, std::vector<uint8_t>(std::begin(cenc_init_data),
+                                         std::end(cenc_init_data))},
+                {3, std::vector<uint8_t>(std::begin(keyids_init_data),
+                                         std::end(keyids_init_data))}});
+
+// Seed data for UpdateSession is valid JWK.
+FUZZ_TEST(AesDecryptorFuzzTests, UpdateSessionDoesNotCrash)
+    .WithDomains(fuzztest::Arbitrary<std::string>().WithMinSize(1))
+    .WithSeeds({kKeyAsJWK, kKeyAlternateAsJWK, kWrongKeyAsJWK});
+
+// Seed data for Decrypt is a fully encrypted data. First parameter is number of
+// clear bytes per subsample, second is number of encrypted bytes per subsample.
+FUZZ_TEST(AesDecryptorFuzzTests, DecryptDoesNotCrash)
+    .WithDomains(fuzztest::InRange<std::size_t>(0, 100),
+                 fuzztest::InRange<std::size_t>(0, 100),
+                 fuzztest::Arbitrary<std::vector<uint8_t>>().WithMinSize(1))
+    .WithSeeds({{0ul, sizeof(kEncryptedData),
+                 std::vector<uint8_t>(std::begin(kEncryptedData),
+                                      std::end(kEncryptedData))}});
diff --git a/media/gpu/mac/vt_video_encode_accelerator_mac.mm b/media/gpu/mac/vt_video_encode_accelerator_mac.mm
index fb1a03e..0a11eef 100644
--- a/media/gpu/mac/vt_video_encode_accelerator_mac.mm
+++ b/media/gpu/mac/vt_video_encode_accelerator_mac.mm
@@ -455,6 +455,11 @@
       }
       if (can_create_hardware_session[codec]) {
         supported_profiles.push_back(supported_profile);
+
+        SupportedProfile portrait_profile(supported_profile);
+        portrait_profile.max_resolution.Transpose();
+        portrait_profile.min_resolution.Transpose();
+        supported_profiles.push_back(portrait_profile);
       }
 
 #if SOFTWARE_ENCODING_SUPPORTED
@@ -465,6 +470,11 @@
       supported_profile.scalability_modes = always_supported_scalability_modes;
       supported_profile.is_software_codec = true;
       supported_profiles.push_back(supported_profile);
+
+      SupportedProfile portrait_profile(supported_profile);
+      portrait_profile.max_resolution.Transpose();
+      portrait_profile.min_resolution.Transpose();
+      supported_profiles.push_back(portrait_profile);
 #endif  // SOFTWARE_ENCODING_SUPPORTED
     }
   }
diff --git a/media/gpu/windows/media_foundation_video_encode_accelerator_win.h b/media/gpu/windows/media_foundation_video_encode_accelerator_win.h
index a767727..0b1a262 100644
--- a/media/gpu/windows/media_foundation_video_encode_accelerator_win.h
+++ b/media/gpu/windows/media_foundation_video_encode_accelerator_win.h
@@ -197,9 +197,7 @@
   // process all inputs, produce all outputs and tell us when it's done.
   void DrainEncoder();
 
-  // Check if |size| is supported. As max resolution is hard coded at this time,
-  // frame size larger than 1920x1088 will be rejected even it could be
-  // supported by hardware and driver.
+  // Check if |size| is supported.
   bool IsFrameSizeAllowed(gfx::Size size);
   // Update frame size without re-initializing the encoder.
   void UpdateFrameSize(const gfx::Size& size);
diff --git a/remoting/base/BUILD.gn b/remoting/base/BUILD.gn
index 2df1db68..d44fe2dd 100644
--- a/remoting/base/BUILD.gn
+++ b/remoting/base/BUILD.gn
@@ -147,6 +147,7 @@
     "//google_apis/common:request_util",
     "//remoting/proto:internal_structs",
     "//remoting/proto/google/internal/remoting/cloud/v1alpha:messages",
+    "//remoting/proto/google/remoting/cloud/v1:messages",
     "//remoting/proto/remoting/v1:cloud_proto",
     "//remoting/proto/remoting/v1:directory_proto",
     "//remoting/proto/remoting/v1:telemetry_messages",
diff --git a/remoting/base/cloud_service_client.cc b/remoting/base/cloud_service_client.cc
index d76a5a8..2b05e46c 100644
--- a/remoting/base/cloud_service_client.cc
+++ b/remoting/base/cloud_service_client.cc
@@ -18,6 +18,7 @@
 #include "remoting/proto/google/internal/remoting/cloud/v1alpha/remote_access_host.pb.h"
 #include "remoting/proto/google/internal/remoting/cloud/v1alpha/remote_access_service.pb.h"
 #include "remoting/proto/google/internal/remoting/cloud/v1alpha/session_authz_service.pb.h"
+#include "remoting/proto/google/remoting/cloud/v1/provisioning_service.pb.h"
 #include "remoting/proto/remoting/v1/cloud_messages.pb.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
 
@@ -266,16 +267,20 @@
             "Not implemented."
         })");
 
+// Legacy using statements.
 using LegacyProvisionGceInstanceRequest =
     remoting::apis::v1::ProvisionGceInstanceRequest;
 
+// Remoting Cloud API using statements.
+using ProvisionGceInstanceRequest =
+    google::remoting::cloud::v1::ProvisionGceInstanceRequest;
+
+// Remoting Cloud Private API using statements.
 using Empty = google::internal::remoting::cloud::v1alpha::Empty;
 using GenerateHostTokenRequest =
     google::internal::remoting::cloud::v1alpha::GenerateHostTokenRequest;
 using GenerateIceConfigRequest =
     google::internal::remoting::cloud::v1alpha::GenerateIceConfigRequest;
-using ProvisionGceInstanceRequest =
-    google::internal::remoting::cloud::v1alpha::ProvisionGceInstanceRequest;
 using ReauthorizeHostRequest =
     google::internal::remoting::cloud::v1alpha::ReauthorizeHostRequest;
 using RemoteAccessHost =
@@ -301,13 +306,20 @@
 
 CloudServiceClient::CloudServiceClient(
     const std::string& api_key,
-    OAuthTokenGetter* oauth_token_getter,
     scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory)
     : api_key_(api_key),
-      http_client_(ServiceUrls::GetInstance()->remoting_cloud_endpoint(),
-                   oauth_token_getter,
+      http_client_(ServiceUrls::GetInstance()->remoting_cloud_public_endpoint(),
+                   /*oauth_token_getter=*/nullptr,
                    url_loader_factory) {}
 
+CloudServiceClient::CloudServiceClient(
+    OAuthTokenGetter* oauth_token_getter,
+    scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory)
+    : http_client_(
+          ServiceUrls::GetInstance()->remoting_cloud_private_endpoint(),
+          oauth_token_getter,
+          url_loader_factory) {}
+
 CloudServiceClient::~CloudServiceClient() = default;
 
 void CloudServiceClient::LegacyProvisionGceInstance(
@@ -339,7 +351,7 @@
     const std::string& public_key,
     const std::optional<std::string>& existing_directory_id,
     ProvisionGceInstanceCallback callback) {
-  constexpr char path[] = "/v1alpha/access:provisionGceInstance";
+  constexpr char path[] = "/v1/provisioning:provisionGceInstance";
 
   auto request = std::make_unique<ProvisionGceInstanceRequest>();
   request->set_owner_email(owner_email);
diff --git a/remoting/base/cloud_service_client.h b/remoting/base/cloud_service_client.h
index 8663c9c..79ff39dc 100644
--- a/remoting/base/cloud_service_client.h
+++ b/remoting/base/cloud_service_client.h
@@ -15,12 +15,15 @@
 class Empty;
 class GenerateHostTokenResponse;
 class GenerateIceConfigResponse;
-class ProvisionGceInstanceResponse;
 class ReauthorizeHostResponse;
 class RemoteAccessHost;
 class VerifySessionTokenResponse;
 }  // namespace google::internal::remoting::cloud::v1alpha
 
+namespace google::remoting::cloud::v1 {
+class ProvisionGceInstanceResponse;
+}  // namespace google::remoting::cloud::v1
+
 namespace google::protobuf {
 class MessageLite;
 }  // namespace google::protobuf
@@ -53,8 +56,8 @@
       std::unique_ptr<apis::v1::ProvisionGceInstanceResponse>)>;
   using ProvisionGceInstanceCallback = base::OnceCallback<void(
       const ProtobufHttpStatus&,
-      std::unique_ptr<::google::internal::remoting::cloud::v1alpha::
-                          ProvisionGceInstanceResponse>)>;
+      std::unique_ptr<
+          ::google::remoting::cloud::v1::ProvisionGceInstanceResponse>)>;
   using ReauthorizeHostCallback = base::OnceCallback<void(
       const ProtobufHttpStatus&,
       std::unique_ptr<::google::internal::remoting::cloud::v1alpha::
@@ -75,8 +78,14 @@
   // legacy provisioning path.
   explicit CloudServiceClient(
       scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory);
+  // Used for creating a service client to call the Remoting Cloud API using
+  // the |api_key| provided.
   CloudServiceClient(
       const std::string& api_key,
+      scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory);
+  // Used for creating a service client to call the Remoting Cloud Private API
+  // using a scoped OAuth access token generated for the device robot account.
+  CloudServiceClient(
       OAuthTokenGetter* oauth_token_getter,
       scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory);
 
diff --git a/remoting/base/cloud_session_authz_service_client_factory.cc b/remoting/base/cloud_session_authz_service_client_factory.cc
index 1c50dab..6515b38 100644
--- a/remoting/base/cloud_session_authz_service_client_factory.cc
+++ b/remoting/base/cloud_session_authz_service_client_factory.cc
@@ -77,7 +77,7 @@
 CloudSessionAuthzServiceClient::CloudSessionAuthzServiceClient(
     OAuthTokenGetter* oauth_token_getter,
     scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory)
-    : client_(/*api_key=*/"", oauth_token_getter, url_loader_factory) {}
+    : client_(oauth_token_getter, url_loader_factory) {}
 
 CloudSessionAuthzServiceClient::~CloudSessionAuthzServiceClient() = default;
 
diff --git a/remoting/base/service_urls.cc b/remoting/base/service_urls.cc
index f815cbc..a3edeae 100644
--- a/remoting/base/service_urls.cc
+++ b/remoting/base/service_urls.cc
@@ -18,12 +18,16 @@
 // via cmd line switch).  Release builds will point to the prod environment.
 #if defined(NDEBUG)
 constexpr char kFtlServerEndpoint[] = "instantmessaging-pa.googleapis.com";
-constexpr char kRemotingCloudEndpoint[] = "remotingcloud-pa.googleapis.com";
+constexpr char kRemotingCloudPublicEndpoint[] = "remotingcloud.googleapis.com";
+constexpr char kRemotingCloudPrivateEndpoint[] =
+    "remotingcloud-pa.googleapis.com";
 constexpr char kRemotingServerEndpoint[] = "remotedesktop-pa.googleapis.com";
 #else
 constexpr char kFtlServerEndpoint[] =
     "tachyon-playground-autopush-grpc.sandbox.googleapis.com";
-constexpr char kRemotingCloudEndpoint[] =
+constexpr char kRemotingCloudPublicEndpoint[] =
+    "autopush-remotingcloud.sandbox.googleapis.com";
+constexpr char kRemotingCloudPrivateEndpoint[] =
     "autopush-remotingcloud-pa.sandbox.googleapis.com";
 constexpr char kRemotingServerEndpoint[] =
     "autopush-remotedesktop-pa.sandbox.googleapis.com";
@@ -32,7 +36,10 @@
 // Command line switches.
 #if !defined(NDEBUG)
 constexpr char kFtlServerEndpointSwitch[] = "ftl-server-endpoint";
-constexpr char kRemotingCloudEndpointSwitch[] = "remoting-cloud-endpoint";
+constexpr char kRemotingCloudPublicEndpointSwitch[] =
+    "remoting-cloud-public-endpoint";
+constexpr char kRemotingCloudPrivateEndpointSwitch[] =
+    "remoting-cloud-private-endpoint";
 constexpr char kRemotingServerEndpointSwitch[] = "remoting-server-endpoint";
 #endif  // !defined(NDEBUG)
 
@@ -40,7 +47,8 @@
 
 ServiceUrls::ServiceUrls()
     : ftl_server_endpoint_(kFtlServerEndpoint),
-      remoting_cloud_endpoint_(kRemotingCloudEndpoint),
+      remoting_cloud_public_endpoint_(kRemotingCloudPublicEndpoint),
+      remoting_cloud_private_endpoint_(kRemotingCloudPrivateEndpoint),
       remoting_server_endpoint_(kRemotingServerEndpoint) {
 #if BUILDFLAG(REMOTING_INTERNAL)
   remoting_corp_endpoint_ = internal::GetRemotingCorpApiUrl();
@@ -58,19 +66,24 @@
     } else {
       LOG(WARNING) << "CRD: Using autopush (non prod) FTL server";
     }
-    if (command_line->HasSwitch(kRemotingCloudEndpointSwitch)) {
-      remoting_cloud_endpoint_ =
-          command_line->GetSwitchValueASCII(kRemotingCloudEndpointSwitch);
-    } else {
-      LOG(WARNING) << "CRD: Using autopush (non prod) remoting cloud API";
-    }
     if (command_line->HasSwitch(kRemotingServerEndpointSwitch)) {
       remoting_server_endpoint_ =
           command_line->GetSwitchValueASCII(kRemotingServerEndpointSwitch);
     } else {
       LOG(WARNING) << "CRD: Using autopush (non prod) remoting server";
     }
-
+    if (command_line->HasSwitch(kRemotingCloudPublicEndpointSwitch)) {
+      remoting_cloud_public_endpoint_ =
+          command_line->GetSwitchValueASCII(kRemotingCloudPublicEndpointSwitch);
+    } else {
+      LOG(WARNING) << "CRD: Using Autopush Remoting Cloud API";
+    }
+    if (command_line->HasSwitch(kRemotingCloudPrivateEndpointSwitch)) {
+      remoting_cloud_private_endpoint_ = command_line->GetSwitchValueASCII(
+          kRemotingCloudPrivateEndpointSwitch);
+    } else {
+      LOG(WARNING) << "CRD: Using Autopush Remoting Cloud Private API";
+    }
 #if BUILDFLAG(REMOTING_INTERNAL)
     const char kRemotingCorpEndpointSwitch[] = "remoting-corp-endpoint";
     if (command_line->HasSwitch(kRemotingCorpEndpointSwitch)) {
diff --git a/remoting/base/service_urls.h b/remoting/base/service_urls.h
index e4ca8d6..1631d28 100644
--- a/remoting/base/service_urls.h
+++ b/remoting/base/service_urls.h
@@ -26,8 +26,12 @@
     return ftl_server_endpoint_;
   }
 
-  const std::string& remoting_cloud_endpoint() const {
-    return remoting_cloud_endpoint_;
+  const std::string& remoting_cloud_public_endpoint() const {
+    return remoting_cloud_public_endpoint_;
+  }
+
+  const std::string& remoting_cloud_private_endpoint() const {
+    return remoting_cloud_private_endpoint_;
   }
 
   const std::string& remoting_corp_endpoint() const {
@@ -45,8 +49,11 @@
   virtual ~ServiceUrls();
 
   std::string ftl_server_endpoint_;
-  std::string remoting_cloud_endpoint_;
+  std::string remoting_cloud_public_endpoint_;
+  std::string remoting_cloud_private_endpoint_;
   std::string remoting_corp_endpoint_;
+  // |remoting_server_endpoint_| is the default endpoint for any host which is
+  // not running on a Corp or Cloud machine.
   std::string remoting_server_endpoint_;
 };
 
diff --git a/remoting/host/cloud_heartbeat_service_client.cc b/remoting/host/cloud_heartbeat_service_client.cc
index 4f69719..5f39f98 100644
--- a/remoting/host/cloud_heartbeat_service_client.cc
+++ b/remoting/host/cloud_heartbeat_service_client.cc
@@ -32,7 +32,7 @@
     OAuthTokenGetter* oauth_token_getter,
     scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory)
     : directory_id_(directory_id),
-      client_(/*api_key=*/"", oauth_token_getter, url_loader_factory) {}
+      client_(oauth_token_getter, url_loader_factory) {}
 
 CloudHeartbeatServiceClient::~CloudHeartbeatServiceClient() = default;
 
diff --git a/remoting/host/setup/BUILD.gn b/remoting/host/setup/BUILD.gn
index cb916e5..2588441 100644
--- a/remoting/host/setup/BUILD.gn
+++ b/remoting/host/setup/BUILD.gn
@@ -141,6 +141,7 @@
     "//remoting/host/setup",
     "//remoting/host/setup:start_host_main_headers",
     "//remoting/proto/google/internal/remoting/cloud/v1alpha:messages",
+    "//remoting/proto/google/remoting/cloud/v1:messages",
     "//remoting/proto/remoting/v1:cloud_proto",
     "//services/network:network_service",
     "//services/network/public/cpp:cpp",
diff --git a/remoting/host/setup/cloud_host_starter.cc b/remoting/host/setup/cloud_host_starter.cc
index aa9332fe..3de8303 100644
--- a/remoting/host/setup/cloud_host_starter.cc
+++ b/remoting/host/setup/cloud_host_starter.cc
@@ -19,7 +19,7 @@
 #include "remoting/host/pin_hash.h"
 #include "remoting/host/setup/host_starter.h"
 #include "remoting/host/setup/host_starter_base.h"
-#include "remoting/proto/google/internal/remoting/cloud/v1alpha/remote_access_service.pb.h"
+#include "remoting/proto/google/remoting/cloud/v1/provisioning_service.pb.h"
 #include "remoting/proto/remoting/v1/cloud_messages.pb.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
 
@@ -30,7 +30,7 @@
 using LegacyProvisionGceInstanceResponse =
     apis::v1::ProvisionGceInstanceResponse;
 using ProvisionGceInstanceResponse =
-    ::google::internal::remoting::cloud::v1alpha::ProvisionGceInstanceResponse;
+    ::google::remoting::cloud::v1::ProvisionGceInstanceResponse;
 
 // A helper class which provisions a cloud machine for Chrome Remote Desktop.
 class CloudHostStarter : public HostStarterBase {
@@ -79,9 +79,7 @@
     scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory)
     : HostStarterBase(url_loader_factory),
       cloud_service_client_(
-          std::make_unique<CloudServiceClient>(api_key,
-                                               /*oauth_token_getter=*/nullptr,
-                                               url_loader_factory)) {
+          std::make_unique<CloudServiceClient>(api_key, url_loader_factory)) {
   params().api_key = api_key;
 }
 
diff --git a/remoting/proto/google/internal/remoting/cloud/v1alpha/remote_access_service.proto b/remoting/proto/google/internal/remoting/cloud/v1alpha/remote_access_service.proto
index 0ab908f..db789437 100644
--- a/remoting/proto/google/internal/remoting/cloud/v1alpha/remote_access_service.proto
+++ b/remoting/proto/google/internal/remoting/cloud/v1alpha/remote_access_service.proto
@@ -10,42 +10,6 @@
 
 import "field_mask.proto";
 import "remote_access_host.proto";
-import "service_account_info.proto";
-
-// Creates a new remote access host instance in the Directory.
-message ProvisionGceInstanceRequest {
-  // The email address of the user to associate the new remote access host
-  // instance with. This value is also used to determine if the user has
-  // permission to access the Instance remotely based on the GCP Project
-  // metadata associated with it.
-  string owner_email = 1;
-
-  // This value is used to provide the initial 'display_name' value which is
-  // shown in the website client UI.
-  string display_name = 2;
-
-  // Public key for the host. Must be a 2048-bit RSA key encoded with Base64.
-  bytes public_key = 3;
-
-  // Version of the start-host utility being used for provisioning.
-  string version = 4;
-
-  // An optional value which, if provided, is used to remove a previous host
-  // instance from the machine. Prior to deleting `existing_directory_id`, the
-  // backend will validate the other fields in the request and ensure
-  // `owner_email` owns the previous instance as well.
-  optional string existing_directory_id = 5;
-}
-
-// The response to a ProvisionGceInstanceRequest.
-message ProvisionGceInstanceResponse {
-  // The UUID of the new remote access host instance in the Directory.
-  string directory_id = 1;
-
-  // The email address and authorization_code for the service account created
-  // for the new remote access host instance.
-  ServiceAccountInfo service_account_info = 2;
-}
 
 // Updates the last seen timestamp for a remote access host.
 message SendHeartbeatRequest {
diff --git a/remoting/proto/google/internal/remoting/cloud/v1alpha/service_account_info.proto b/remoting/proto/google/internal/remoting/cloud/v1alpha/service_account_info.proto
index 1548ebf..637da55e 100644
--- a/remoting/proto/google/internal/remoting/cloud/v1alpha/service_account_info.proto
+++ b/remoting/proto/google/internal/remoting/cloud/v1alpha/service_account_info.proto
@@ -9,8 +9,6 @@
 package google.internal.remoting.cloud.v1alpha;
 
 // Represents a service account created for a remote access host instance.
-// This proto definition mirrors the message defined here:
-// cs/google/corp/remotedesktop/v1/service_account_info.proto
 message ServiceAccountInfo {
   // The email address of the remote access host service account.
   string email = 1;
diff --git a/remoting/proto/google/remoting/cloud/v1/BUILD.gn b/remoting/proto/google/remoting/cloud/v1/BUILD.gn
new file mode 100644
index 0000000..dbab00a
--- /dev/null
+++ b/remoting/proto/google/remoting/cloud/v1/BUILD.gn
@@ -0,0 +1,9 @@
+# Copyright 2024 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//third_party/protobuf/proto_library.gni")
+
+proto_library("messages") {
+  sources = [ "provisioning_service.proto" ]
+}
diff --git a/remoting/proto/google/remoting/cloud/v1/provisioning_service.proto b/remoting/proto/google/remoting/cloud/v1/provisioning_service.proto
new file mode 100644
index 0000000..4e828600
--- /dev/null
+++ b/remoting/proto/google/remoting/cloud/v1/provisioning_service.proto
@@ -0,0 +1,58 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+syntax = "proto3";
+
+option optimize_for = LITE_RUNTIME;
+
+package google.remoting.cloud.v1;
+
+// Creates a new remote access host instance in the Directory.
+message ProvisionGceInstanceRequest {
+  // The email address of the user to associate the new remote access host
+  // instance with. This value is also used to determine if the user has
+  // permission to access the Instance remotely based on the GCP Project
+  // metadata associated with it.
+  string owner_email = 1;
+
+  // This value is used to provide the initial 'display_name' value which is
+  // shown in the website client UI.
+  string display_name = 2;
+
+  // Public key for the host. Must be a 2048-bit RSA key encoded with Base64.
+  bytes public_key = 3;
+
+  // Version of the start-host utility being used for provisioning.
+  string version = 4;
+
+  // An optional value which, if provided, is used to remove a previous host
+  // instance from the machine. Prior to deleting `existing_directory_id`, the
+  // backend will validate the other fields in the request and ensure
+  // `owner_email` owns the previous instance as well.
+  optional string existing_directory_id = 5;
+}
+
+// Represents a service account created for a remote access host instance.
+message ServiceAccountInfo {
+  // The email address of the remote access host service account.
+  string email = 1;
+
+  // An OAuth authorization code generated for the remote access host service
+  // account. This code will be exchanged for an access and refresh token by the
+  // remote access host instance. The access token will be used for signaling
+  // and to communicate status back to the Chrome Remote Desktop backend.
+  // `authorization_code` has a limited lifetime (< 10 minutes) so it must be
+  // exchanged for a refresh token soon after it is received.
+  optional string authorization_code = 2;
+}
+
+// The response to a ProvisionGceInstanceRequest.
+message ProvisionGceInstanceResponse {
+  // The UUID of the new remote access host instance in the Directory.
+  string directory_id = 1;
+
+  // The email address and authorization_code for the service account created
+  // for the new remote access host instance.
+  ServiceAccountInfo service_account_info = 2;
+}
diff --git a/testing/buildbot/chromium.dawn.json b/testing/buildbot/chromium.dawn.json
index 4dd7d36..723ee99 100644
--- a/testing/buildbot/chromium.dawn.json
+++ b/testing/buildbot/chromium.dawn.json
@@ -1967,8 +1967,8 @@
         "name": "dawn_end2end_implicit_device_sync_tests",
         "swarming": {
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "hard_timeout": 1800,
@@ -1994,8 +1994,8 @@
         "name": "dawn_end2end_skip_validation_tests",
         "swarming": {
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "hard_timeout": 1800,
@@ -2020,8 +2020,8 @@
         "name": "dawn_end2end_tests",
         "swarming": {
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "hard_timeout": 1800,
@@ -2047,8 +2047,8 @@
         "name": "dawn_end2end_validation_layers_tests",
         "swarming": {
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "hard_timeout": 1800,
@@ -2074,8 +2074,8 @@
         "name": "dawn_end2end_wire_tests",
         "swarming": {
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "hard_timeout": 1800,
@@ -2099,8 +2099,8 @@
         "name": "gl_tests_passthrough",
         "swarming": {
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "hard_timeout": 1800,
@@ -2128,8 +2128,8 @@
         ],
         "swarming": {
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "hard_timeout": 1800,
@@ -2156,8 +2156,8 @@
         "name": "dawn_perf_tests",
         "swarming": {
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "hard_timeout": 1800,
@@ -2177,8 +2177,8 @@
         },
         "swarming": {
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "hard_timeout": 1800,
@@ -2208,8 +2208,8 @@
         },
         "swarming": {
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "hard_timeout": 1800,
@@ -2239,8 +2239,8 @@
         },
         "swarming": {
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "hard_timeout": 1800,
@@ -2275,8 +2275,8 @@
         },
         "swarming": {
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "hard_timeout": 1800,
@@ -2311,8 +2311,8 @@
         },
         "swarming": {
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "hard_timeout": 1800,
@@ -2349,8 +2349,8 @@
         },
         "swarming": {
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "hard_timeout": 1800,
@@ -2381,8 +2381,8 @@
         },
         "swarming": {
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "hard_timeout": 1800,
@@ -2412,8 +2412,8 @@
         },
         "swarming": {
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "hard_timeout": 1800,
@@ -2448,8 +2448,8 @@
         },
         "swarming": {
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "hard_timeout": 1800,
@@ -2488,8 +2488,8 @@
         },
         "swarming": {
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "hard_timeout": 1800,
@@ -3162,352 +3162,23 @@
     ]
   },
   "Dawn Linux x64 Experimental Release (Intel UHD 630)": {
-    "gtest_tests": [
-      {
-        "args": [
-          "--enable-implicit-device-sync",
-          "--use-gpu-in-tests",
-          "--exclusive-device-type-preference=discrete,integrated",
-          "--test-launcher-retry-limit=0",
-          "--test-launcher-batch-limit=512",
-          "--no-xvfb"
-        ],
-        "ci_only": true,
-        "merge": {
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "name": "dawn_end2end_implicit_device_sync_tests",
-        "swarming": {
-          "dimensions": {
-            "display_attached": "1",
-            "gpu": "8086:9bc5-23.2.1",
-            "os": "Ubuntu-22.04.5",
-            "pool": "chromium.tests.gpu"
-          },
-          "expiration": 21600,
-          "hard_timeout": 1800,
-          "io_timeout": 1800,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 2
-        },
-        "test": "dawn_end2end_tests",
-        "test_id_prefix": "ninja://third_party/dawn/src/dawn/tests:dawn_end2end_tests/"
-      },
-      {
-        "args": [
-          "--enable-toggles=skip_validation",
-          "--use-gpu-in-tests",
-          "--exclusive-device-type-preference=discrete,integrated",
-          "--test-launcher-retry-limit=0",
-          "--test-launcher-batch-limit=512",
-          "--no-xvfb"
-        ],
-        "merge": {
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "name": "dawn_end2end_skip_validation_tests",
-        "swarming": {
-          "dimensions": {
-            "display_attached": "1",
-            "gpu": "8086:9bc5-23.2.1",
-            "os": "Ubuntu-22.04.5",
-            "pool": "chromium.tests.gpu"
-          },
-          "expiration": 21600,
-          "hard_timeout": 1800,
-          "io_timeout": 1800,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 2
-        },
-        "test": "dawn_end2end_tests",
-        "test_id_prefix": "ninja://third_party/dawn/src/dawn/tests:dawn_end2end_tests/"
-      },
-      {
-        "args": [
-          "--use-gpu-in-tests",
-          "--exclusive-device-type-preference=discrete,integrated",
-          "--test-launcher-retry-limit=0",
-          "--test-launcher-batch-limit=512",
-          "--no-xvfb"
-        ],
-        "merge": {
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "name": "dawn_end2end_tests",
-        "swarming": {
-          "dimensions": {
-            "display_attached": "1",
-            "gpu": "8086:9bc5-23.2.1",
-            "os": "Ubuntu-22.04.5",
-            "pool": "chromium.tests.gpu"
-          },
-          "expiration": 21600,
-          "hard_timeout": 1800,
-          "io_timeout": 1800,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 2
-        },
-        "test": "dawn_end2end_tests",
-        "test_id_prefix": "ninja://third_party/dawn/src/dawn/tests:dawn_end2end_tests/"
-      },
-      {
-        "args": [
-          "--enable-backend-validation",
-          "--use-gpu-in-tests",
-          "--exclusive-device-type-preference=discrete,integrated",
-          "--test-launcher-retry-limit=0",
-          "--test-launcher-batch-limit=512",
-          "--no-xvfb"
-        ],
-        "merge": {
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "name": "dawn_end2end_validation_layers_tests",
-        "swarming": {
-          "dimensions": {
-            "display_attached": "1",
-            "gpu": "8086:9bc5-23.2.1",
-            "os": "Ubuntu-22.04.5",
-            "pool": "chromium.tests.gpu"
-          },
-          "expiration": 21600,
-          "hard_timeout": 1800,
-          "io_timeout": 1800,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 2
-        },
-        "test": "dawn_end2end_tests",
-        "test_id_prefix": "ninja://third_party/dawn/src/dawn/tests:dawn_end2end_tests/"
-      },
-      {
-        "args": [
-          "--use-wire",
-          "--use-gpu-in-tests",
-          "--exclusive-device-type-preference=discrete,integrated",
-          "--test-launcher-retry-limit=0",
-          "--test-launcher-batch-limit=512",
-          "--no-xvfb"
-        ],
-        "merge": {
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "name": "dawn_end2end_wire_tests",
-        "swarming": {
-          "dimensions": {
-            "display_attached": "1",
-            "gpu": "8086:9bc5-23.2.1",
-            "os": "Ubuntu-22.04.5",
-            "pool": "chromium.tests.gpu"
-          },
-          "expiration": 21600,
-          "hard_timeout": 1800,
-          "io_timeout": 1800,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 2
-        },
-        "test": "dawn_end2end_tests",
-        "test_id_prefix": "ninja://third_party/dawn/src/dawn/tests:dawn_end2end_tests/"
-      },
-      {
-        "args": [
-          "--use-cmd-decoder=passthrough",
-          "--use-gl=angle",
-          "--use-gpu-in-tests",
-          "--no-xvfb",
-          "--test-launcher-filter-file=../../testing/buildbot/filters/linux.uhd_630.gl_tests_passthrough.filter"
-        ],
-        "merge": {
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "name": "gl_tests_passthrough",
-        "swarming": {
-          "dimensions": {
-            "display_attached": "1",
-            "gpu": "8086:9bc5-23.2.1",
-            "os": "Ubuntu-22.04.5",
-            "pool": "chromium.tests.gpu"
-          },
-          "expiration": 21600,
-          "hard_timeout": 1800,
-          "io_timeout": 1800,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 2
-        },
-        "test": "gl_tests",
-        "test_id_prefix": "ninja://gpu:gl_tests/"
-      },
-      {
-        "args": [
-          "--use-gpu-in-tests",
-          "--no-xvfb",
-          "--git-revision=${got_revision}"
-        ],
-        "merge": {
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "name": "gl_unittests",
-        "precommit_args": [
-          "--gerrit-issue=${patch_issue}",
-          "--gerrit-patchset=${patch_set}",
-          "--buildbucket-id=${buildbucket_build_id}"
-        ],
-        "swarming": {
-          "dimensions": {
-            "display_attached": "1",
-            "gpu": "8086:9bc5-23.2.1",
-            "os": "Ubuntu-22.04.5",
-            "pool": "chromium.tests.gpu"
-          },
-          "expiration": 21600,
-          "hard_timeout": 1800,
-          "io_timeout": 1800,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "gl_unittests",
-        "test_id_prefix": "ninja://ui/gl:gl_unittests/"
-      }
-    ],
     "isolated_scripts": [
       {
         "args": [
-          "--override-steps=1",
-          "--gtest-benchmark-name=dawn_perf_tests",
-          "-v"
-        ],
-        "merge": {
-          "args": [
-            "--smoke-test-mode"
-          ],
-          "script": "//tools/perf/process_perf_results.py"
-        },
-        "name": "dawn_perf_tests",
-        "swarming": {
-          "dimensions": {
-            "display_attached": "1",
-            "gpu": "8086:9bc5-23.2.1",
-            "os": "Ubuntu-22.04.5",
-            "pool": "chromium.tests.gpu"
-          },
-          "expiration": 21600,
-          "hard_timeout": 1800,
-          "io_timeout": 1800,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "dawn_perf_tests",
-        "test_id_prefix": "ninja://third_party/dawn/src/dawn/tests:dawn_perf_tests/"
-      },
-      {
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "telemetry_gpu_unittests",
-        "resultdb": {
-          "enable": true
-        },
-        "swarming": {
-          "dimensions": {
-            "display_attached": "1",
-            "gpu": "8086:9bc5-23.2.1",
-            "os": "Ubuntu-22.04.5",
-            "pool": "chromium.tests.gpu"
-          },
-          "expiration": 21600,
-          "hard_timeout": 1800,
-          "idempotent": false,
-          "io_timeout": 1800,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "telemetry_gpu_unittests",
-        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_unittests/"
-      },
-      {
-        "args": [
-          "--flag-specific=webgpu",
-          "--initialize-webgpu-adapter-at-startup-timeout-ms=60000",
-          "--no-xvfb",
-          "--additional-driver-flag=--enable-features=Vulkan"
-        ],
-        "merge": {
-          "args": [
-            "--verbose"
-          ],
-          "script": "//third_party/blink/tools/merge_web_test_results.py"
-        },
-        "name": "webgpu_blink_web_tests",
-        "resultdb": {
-          "enable": true
-        },
-        "swarming": {
-          "dimensions": {
-            "display_attached": "1",
-            "gpu": "8086:9bc5-23.2.1",
-            "os": "Ubuntu-22.04.5",
-            "pool": "chromium.tests.gpu"
-          },
-          "expiration": 21600,
-          "hard_timeout": 1800,
-          "io_timeout": 1800,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "webgpu_blink_web_tests",
-        "test_id_prefix": "ninja://:webgpu_blink_web_tests/"
-      },
-      {
-        "args": [
-          "--flag-specific=webgpu-with-backend-validation",
-          "--timeout-ms=30000",
-          "--initialize-webgpu-adapter-at-startup-timeout-ms=60000",
-          "--no-xvfb",
-          "--additional-driver-flag=--enable-features=Vulkan"
-        ],
-        "merge": {
-          "args": [
-            "--verbose"
-          ],
-          "script": "//third_party/blink/tools/merge_web_test_results.py"
-        },
-        "name": "webgpu_blink_web_tests_with_backend_validation",
-        "resultdb": {
-          "enable": true
-        },
-        "swarming": {
-          "dimensions": {
-            "display_attached": "1",
-            "gpu": "8086:9bc5-23.2.1",
-            "os": "Ubuntu-22.04.5",
-            "pool": "chromium.tests.gpu"
-          },
-          "expiration": 21600,
-          "hard_timeout": 1800,
-          "io_timeout": 1800,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "webgpu_blink_web_tests",
-        "test_id_prefix": "ninja://:webgpu_blink_web_tests/"
-      },
-      {
-        "args": [
-          "webgpu_compat_cts",
+          "noop_sleep",
           "--show-stdout",
           "--browser=release",
           "--passthrough",
           "-v",
           "--stable-jobs",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --enable-features=WebGPUExperimentalFeatures --use-webgpu-adapter=opengles --use-angle=gl --force_high_performance_gpu",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
           "--enforce-browser-version",
-          "--jobs=4",
-          "--use-webgpu-power-preference=default-high-performance"
+          "--jobs=4"
         ],
-        "ci_only": true,
-        "experiment_percentage": 100,
         "merge": {
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "webgpu_cts_compat_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
+        "name": "noop_sleep_tests",
         "swarming": {
           "dimensions": {
             "display_attached": "1",
@@ -3519,234 +3190,8 @@
           "hard_timeout": 1800,
           "idempotent": false,
           "io_timeout": 1800,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 14
-        },
-        "test": "telemetry_gpu_integration_test",
-        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
-      },
-      {
-        "args": [
-          "webgpu_cts",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--stable-jobs",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --force_high_performance_gpu --enable-features=Vulkan",
-          "--enforce-browser-version",
-          "--jobs=4",
-          "--use-webgpu-power-preference=default-high-performance"
-        ],
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "webgpu_cts_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "display_attached": "1",
-            "gpu": "8086:9bc5-23.2.1",
-            "os": "Ubuntu-22.04.5",
-            "pool": "chromium.tests.gpu"
-          },
-          "expiration": 21600,
-          "hard_timeout": 1800,
-          "idempotent": false,
-          "io_timeout": 1800,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 14
-        },
-        "test": "telemetry_gpu_integration_test",
-        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
-      },
-      {
-        "args": [
-          "webgpu_cts",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--stable-jobs",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --force_high_performance_gpu --enable-features=Vulkan",
-          "--enforce-browser-version",
-          "--enable-dawn-backend-validation",
-          "--jobs=4",
-          "--use-webgpu-power-preference=default-high-performance"
-        ],
-        "ci_only": true,
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "webgpu_cts_with_validation_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "display_attached": "1",
-            "gpu": "8086:9bc5-23.2.1",
-            "os": "Ubuntu-22.04.5",
-            "pool": "chromium.tests.gpu"
-          },
-          "expiration": 21600,
-          "hard_timeout": 1800,
-          "idempotent": false,
-          "io_timeout": 1800,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 14
-        },
-        "test": "telemetry_gpu_integration_test",
-        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
-      },
-      {
-        "args": [
-          "--flag-specific=webgpu-swiftshader",
-          "--initialize-webgpu-adapter-at-startup-timeout-ms=60000",
-          "--no-xvfb",
-          "--additional-driver-flag=--enable-features=Vulkan"
-        ],
-        "merge": {
-          "args": [
-            "--verbose"
-          ],
-          "script": "//third_party/blink/tools/merge_web_test_results.py"
-        },
-        "name": "webgpu_swiftshader_blink_web_tests",
-        "resultdb": {
-          "enable": true
-        },
-        "swarming": {
-          "dimensions": {
-            "display_attached": "1",
-            "gpu": "8086:9bc5-23.2.1",
-            "os": "Ubuntu-22.04.5",
-            "pool": "chromium.tests.gpu"
-          },
-          "expiration": 21600,
-          "hard_timeout": 1800,
-          "io_timeout": 1800,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "webgpu_blink_web_tests",
-        "test_id_prefix": "ninja://:webgpu_blink_web_tests/"
-      },
-      {
-        "args": [
-          "--flag-specific=webgpu-swiftshader-with-backend-validation",
-          "--timeout-ms=30000",
-          "--initialize-webgpu-adapter-at-startup-timeout-ms=60000",
-          "--no-xvfb",
-          "--additional-driver-flag=--enable-features=Vulkan"
-        ],
-        "merge": {
-          "args": [
-            "--verbose"
-          ],
-          "script": "//third_party/blink/tools/merge_web_test_results.py"
-        },
-        "name": "webgpu_swiftshader_blink_web_tests_with_backend_validation",
-        "resultdb": {
-          "enable": true
-        },
-        "swarming": {
-          "dimensions": {
-            "display_attached": "1",
-            "gpu": "8086:9bc5-23.2.1",
-            "os": "Ubuntu-22.04.5",
-            "pool": "chromium.tests.gpu"
-          },
-          "expiration": 21600,
-          "hard_timeout": 1800,
-          "io_timeout": 1800,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "webgpu_blink_web_tests",
-        "test_id_prefix": "ninja://:webgpu_blink_web_tests/"
-      },
-      {
-        "args": [
-          "webgpu_cts",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--stable-jobs",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --force_high_performance_gpu --enable-features=Vulkan",
-          "--enforce-browser-version",
-          "--use-webgpu-adapter=swiftshader",
-          "--test-filter=*web_platform*",
-          "--jobs=4",
-          "--use-webgpu-power-preference=default-high-performance"
-        ],
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "webgpu_swiftshader_web_platform_cts_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "display_attached": "1",
-            "gpu": "8086:9bc5-23.2.1",
-            "os": "Ubuntu-22.04.5",
-            "pool": "chromium.tests.gpu"
-          },
-          "expiration": 21600,
-          "hard_timeout": 1800,
-          "idempotent": false,
-          "io_timeout": 1800,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 2
-        },
-        "test": "telemetry_gpu_integration_test",
-        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
-      },
-      {
-        "args": [
-          "webgpu_cts",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--stable-jobs",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --force_high_performance_gpu --enable-features=Vulkan",
-          "--enforce-browser-version",
-          "--use-webgpu-adapter=swiftshader",
-          "--test-filter=*web_platform*",
-          "--enable-dawn-backend-validation",
-          "--jobs=4",
-          "--use-webgpu-power-preference=default-high-performance"
-        ],
-        "ci_only": true,
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "webgpu_swiftshader_web_platform_cts_with_validation_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "display_attached": "1",
-            "gpu": "8086:9bc5-23.2.1",
-            "os": "Ubuntu-22.04.5",
-            "pool": "chromium.tests.gpu"
-          },
-          "expiration": 21600,
-          "hard_timeout": 1800,
-          "idempotent": false,
-          "io_timeout": 1800,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 2
-        },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
@@ -4449,8 +3894,8 @@
         "name": "dawn_end2end_implicit_device_sync_tests",
         "swarming": {
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "hard_timeout": 1800,
@@ -4476,8 +3921,8 @@
         "name": "dawn_end2end_skip_validation_tests",
         "swarming": {
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "hard_timeout": 1800,
@@ -4502,8 +3947,8 @@
         "name": "dawn_end2end_tests",
         "swarming": {
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "hard_timeout": 1800,
@@ -4529,8 +3974,8 @@
         "name": "dawn_end2end_validation_layers_tests",
         "swarming": {
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "hard_timeout": 1800,
@@ -4556,8 +4001,8 @@
         "name": "dawn_end2end_wire_tests",
         "swarming": {
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "hard_timeout": 1800,
@@ -4581,8 +4026,8 @@
         "name": "gl_tests_passthrough",
         "swarming": {
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "hard_timeout": 1800,
@@ -4610,8 +4055,8 @@
         ],
         "swarming": {
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "hard_timeout": 1800,
@@ -4638,8 +4083,8 @@
         "name": "dawn_perf_tests",
         "swarming": {
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "hard_timeout": 1800,
@@ -4659,8 +4104,8 @@
         },
         "swarming": {
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "hard_timeout": 1800,
@@ -4690,8 +4135,8 @@
         },
         "swarming": {
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "hard_timeout": 1800,
@@ -4721,8 +4166,8 @@
         },
         "swarming": {
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "hard_timeout": 1800,
@@ -4757,8 +4202,8 @@
         },
         "swarming": {
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "hard_timeout": 1800,
@@ -4793,8 +4238,8 @@
         },
         "swarming": {
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "hard_timeout": 1800,
@@ -4831,8 +4276,8 @@
         },
         "swarming": {
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "hard_timeout": 1800,
@@ -4863,8 +4308,8 @@
         },
         "swarming": {
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "hard_timeout": 1800,
@@ -4894,8 +4339,8 @@
         },
         "swarming": {
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "hard_timeout": 1800,
@@ -4930,8 +4375,8 @@
         },
         "swarming": {
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "hard_timeout": 1800,
@@ -4970,8 +4415,8 @@
         },
         "swarming": {
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "hard_timeout": 1800,
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json
index 6ff09b16..6d3878f3 100644
--- a/testing/buildbot/chromium.fyi.json
+++ b/testing/buildbot/chromium.fyi.json
@@ -15466,6 +15466,62 @@
       }
     ]
   },
+  "ios-vm": {
+    "additional_compile_targets": [
+      "all"
+    ],
+    "isolated_scripts": [
+      {
+        "args": [
+          "--platform",
+          "iPhone 15",
+          "--version",
+          "18.0",
+          "--out-dir",
+          "${ISOLATED_OUTDIR}",
+          "--xcode-build-version",
+          "16a242d",
+          "--xctest"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "base_unittests iPhone 15 18.0",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:a18b7d95d26f3c6bf9591978b19cf0ca8268ac7d"
+            }
+          ],
+          "dimensions": {
+            "cpu": "arm64-64-Apple_M1_(Virtual)",
+            "os": "Mac-14",
+            "pool": "chromium.tests.macvm"
+          },
+          "named_caches": [
+            {
+              "name": "runtime_ios_18_0",
+              "path": "Runtime-ios-18.0"
+            },
+            {
+              "name": "xcode_ios_16a242d",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "base_unittests",
+        "test_id_prefix": "ninja://base:base_unittests/",
+        "variant_id": "iPhone 15 18.0"
+      }
+    ]
+  },
   "ios-webkit-tot": {
     "isolated_scripts": [
       {
diff --git a/testing/buildbot/chromium.gpu.fyi.json b/testing/buildbot/chromium.gpu.fyi.json
index ca8c62dc..3db6859b 100644
--- a/testing/buildbot/chromium.gpu.fyi.json
+++ b/testing/buildbot/chromium.gpu.fyi.json
@@ -4366,260 +4366,10 @@
     ]
   },
   "Linux FYI Experimental Release (Intel UHD 630)": {
-    "gtest_tests": [
-      {
-        "args": [
-          "--no-xvfb"
-        ],
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "angle_unittests",
-        "swarming": {
-          "containment_type": "AUTO",
-          "dimensions": {
-            "display_attached": "1",
-            "gpu": "8086:9bc5-23.2.1",
-            "os": "Ubuntu-22.04.5",
-            "pool": "chromium.tests.gpu"
-          },
-          "expiration": 21600,
-          "hard_timeout": 1800,
-          "io_timeout": 1800,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "angle_unittests",
-        "test_id_prefix": "ninja://third_party/angle/src/tests:angle_unittests/",
-        "use_isolated_scripts_api": true
-      },
-      {
-        "args": [
-          "--use-cmd-decoder=passthrough",
-          "--use-gl=angle",
-          "--use-gpu-in-tests",
-          "--no-xvfb",
-          "--test-launcher-filter-file=../../testing/buildbot/filters/linux.uhd_630.gl_tests_passthrough.filter"
-        ],
-        "merge": {
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "name": "gl_tests_passthrough",
-        "swarming": {
-          "containment_type": "AUTO",
-          "dimensions": {
-            "display_attached": "1",
-            "gpu": "8086:9bc5-23.2.1",
-            "os": "Ubuntu-22.04.5",
-            "pool": "chromium.tests.gpu"
-          },
-          "expiration": 21600,
-          "hard_timeout": 1800,
-          "io_timeout": 1800,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 2
-        },
-        "test": "gl_tests",
-        "test_id_prefix": "ninja://gpu:gl_tests/"
-      },
-      {
-        "args": [
-          "--use-gpu-in-tests",
-          "--no-xvfb",
-          "--git-revision=${got_revision}"
-        ],
-        "merge": {
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "name": "gl_unittests",
-        "precommit_args": [
-          "--gerrit-issue=${patch_issue}",
-          "--gerrit-patchset=${patch_set}",
-          "--buildbucket-id=${buildbucket_build_id}"
-        ],
-        "swarming": {
-          "containment_type": "AUTO",
-          "dimensions": {
-            "display_attached": "1",
-            "gpu": "8086:9bc5-23.2.1",
-            "os": "Ubuntu-22.04.5",
-            "pool": "chromium.tests.gpu"
-          },
-          "expiration": 21600,
-          "hard_timeout": 1800,
-          "io_timeout": 1800,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "gl_unittests",
-        "test_id_prefix": "ninja://ui/gl:gl_unittests/"
-      },
-      {
-        "args": [
-          "--enable-gpu",
-          "--use-gpu-in-tests",
-          "--gtest_filter=*GpuMemoryBufferImplTest*",
-          "--no-xvfb"
-        ],
-        "merge": {
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "name": "gpu_memory_buffer_impl_tests",
-        "swarming": {
-          "containment_type": "AUTO",
-          "dimensions": {
-            "display_attached": "1",
-            "gpu": "8086:9bc5-23.2.1",
-            "os": "Ubuntu-22.04.5",
-            "pool": "chromium.tests.gpu"
-          },
-          "expiration": 21600,
-          "hard_timeout": 1800,
-          "io_timeout": 1800,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "gpu_unittests",
-        "test_id_prefix": "ninja://gpu:gpu_unittests/"
-      },
-      {
-        "args": [
-          "--enable-gpu",
-          "--test-launcher-bot-mode",
-          "--test-launcher-jobs=1",
-          "--gtest_filter=TabCaptureApiPixelTest.EndToEnd*",
-          "--no-xvfb"
-        ],
-        "merge": {
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "name": "tab_capture_end2end_tests",
-        "swarming": {
-          "containment_type": "AUTO",
-          "dimensions": {
-            "display_attached": "1",
-            "gpu": "8086:9bc5-23.2.1",
-            "os": "Ubuntu-22.04.5",
-            "pool": "chromium.tests.gpu"
-          },
-          "expiration": 21600,
-          "hard_timeout": 1800,
-          "io_timeout": 1800,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "browser_tests",
-        "test_id_prefix": "ninja://chrome/test:browser_tests/"
-      },
-      {
-        "args": [
-          "--use-gpu-in-tests",
-          "--no-xvfb"
-        ],
-        "merge": {
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "name": "vulkan_tests",
-        "swarming": {
-          "containment_type": "AUTO",
-          "dimensions": {
-            "display_attached": "1",
-            "gpu": "8086:9bc5-23.2.1",
-            "os": "Ubuntu-22.04.5",
-            "pool": "chromium.tests.gpu"
-          },
-          "expiration": 21600,
-          "hard_timeout": 1800,
-          "io_timeout": 1800,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "vulkan_tests",
-        "test_id_prefix": "ninja://gpu/vulkan:vulkan_tests/"
-      }
-    ],
     "isolated_scripts": [
       {
         "args": [
-          "context_lost",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--stable-jobs",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle",
-          "--enforce-browser-version",
-          "--jobs=4"
-        ],
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "context_lost_passthrough_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "containment_type": "AUTO",
-          "dimensions": {
-            "display_attached": "1",
-            "gpu": "8086:9bc5-23.2.1",
-            "os": "Ubuntu-22.04.5",
-            "pool": "chromium.tests.gpu"
-          },
-          "expiration": 21600,
-          "hard_timeout": 1800,
-          "idempotent": false,
-          "io_timeout": 1800,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "telemetry_gpu_integration_test",
-        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
-      },
-      {
-        "args": [
-          "expected_color",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--stable-jobs",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle",
-          "--enforce-browser-version",
-          "--git-revision=${got_revision}",
-          "--dont-restore-color-profile-after-test",
-          "--test-machine-name",
-          "${buildername}",
-          "--jobs=4"
-        ],
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "expected_color_pixel_passthrough_test",
-        "precommit_args": [
-          "--gerrit-issue=${patch_issue}",
-          "--gerrit-patchset=${patch_set}",
-          "--buildbucket-id=${buildbucket_build_id}"
-        ],
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "containment_type": "AUTO",
-          "dimensions": {
-            "display_attached": "1",
-            "gpu": "8086:9bc5-23.2.1",
-            "os": "Ubuntu-22.04.5",
-            "pool": "chromium.tests.gpu"
-          },
-          "expiration": 21600,
-          "hard_timeout": 1800,
-          "idempotent": false,
-          "io_timeout": 1800,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "telemetry_gpu_integration_test",
-        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
-      },
-      {
-        "args": [
-          "gpu_process",
+          "noop_sleep",
           "--show-stdout",
           "--browser=release",
           "--passthrough",
@@ -4632,11 +4382,7 @@
         "merge": {
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "gpu_process_launch_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
+        "name": "noop_sleep_tests",
         "swarming": {
           "containment_type": "AUTO",
           "dimensions": {
@@ -4653,284 +4399,6 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
-      },
-      {
-        "args": [
-          "hardware_accelerated_feature",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--stable-jobs",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
-          "--enforce-browser-version",
-          "--jobs=4"
-        ],
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "hardware_accelerated_feature_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "containment_type": "AUTO",
-          "dimensions": {
-            "display_attached": "1",
-            "gpu": "8086:9bc5-23.2.1",
-            "os": "Ubuntu-22.04.5",
-            "pool": "chromium.tests.gpu"
-          },
-          "expiration": 21600,
-          "hard_timeout": 1800,
-          "idempotent": false,
-          "io_timeout": 1800,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "telemetry_gpu_integration_test",
-        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
-      },
-      {
-        "args": [
-          "info_collection",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--stable-jobs",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --force_high_performance_gpu",
-          "--enforce-browser-version",
-          "--expected-vendor-id",
-          "8086",
-          "--expected-device-id",
-          "9bc5",
-          "--jobs=4"
-        ],
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "info_collection_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "containment_type": "AUTO",
-          "dimensions": {
-            "display_attached": "1",
-            "gpu": "8086:9bc5-23.2.1",
-            "os": "Ubuntu-22.04.5",
-            "pool": "chromium.tests.gpu"
-          },
-          "expiration": 21600,
-          "hard_timeout": 1800,
-          "idempotent": false,
-          "io_timeout": 1800,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "telemetry_gpu_integration_test",
-        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
-      },
-      {
-        "args": [
-          "pixel",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--stable-jobs",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle",
-          "--enforce-browser-version",
-          "--git-revision=${got_revision}",
-          "--dont-restore-color-profile-after-test",
-          "--test-machine-name",
-          "${buildername}",
-          "--jobs=4"
-        ],
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "pixel_skia_gold_passthrough_test",
-        "precommit_args": [
-          "--gerrit-issue=${patch_issue}",
-          "--gerrit-patchset=${patch_set}",
-          "--buildbucket-id=${buildbucket_build_id}"
-        ],
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "containment_type": "AUTO",
-          "dimensions": {
-            "display_attached": "1",
-            "gpu": "8086:9bc5-23.2.1",
-            "os": "Ubuntu-22.04.5",
-            "pool": "chromium.tests.gpu"
-          },
-          "expiration": 21600,
-          "hard_timeout": 1800,
-          "idempotent": false,
-          "io_timeout": 1800,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "telemetry_gpu_integration_test",
-        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
-      },
-      {
-        "args": [
-          "screenshot_sync",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--stable-jobs",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle",
-          "--enforce-browser-version",
-          "--dont-restore-color-profile-after-test",
-          "--jobs=4"
-        ],
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "screenshot_sync_passthrough_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "containment_type": "AUTO",
-          "dimensions": {
-            "display_attached": "1",
-            "gpu": "8086:9bc5-23.2.1",
-            "os": "Ubuntu-22.04.5",
-            "pool": "chromium.tests.gpu"
-          },
-          "expiration": 21600,
-          "hard_timeout": 1800,
-          "idempotent": false,
-          "io_timeout": 1800,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "telemetry_gpu_integration_test",
-        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
-      },
-      {
-        "args": [
-          "trace_test",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--stable-jobs",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
-          "--enforce-browser-version",
-          "--jobs=4"
-        ],
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "trace_test",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "containment_type": "AUTO",
-          "dimensions": {
-            "display_attached": "1",
-            "gpu": "8086:9bc5-23.2.1",
-            "os": "Ubuntu-22.04.5",
-            "pool": "chromium.tests.gpu"
-          },
-          "expiration": 21600,
-          "hard_timeout": 1800,
-          "idempotent": false,
-          "io_timeout": 1800,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "telemetry_gpu_integration_test",
-        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
-      },
-      {
-        "args": [
-          "webgl2_conformance",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--stable-jobs",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-gl=angle --use-angle=gl --use-cmd-decoder=passthrough --force_high_performance_gpu",
-          "--enforce-browser-version",
-          "--webgl-conformance-version=2.0.1",
-          "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl2_conformance_linux_runtimes.json",
-          "--jobs=4"
-        ],
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "webgl2_conformance_gl_passthrough_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "containment_type": "AUTO",
-          "dimensions": {
-            "display_attached": "1",
-            "gpu": "8086:9bc5-23.2.1",
-            "os": "Ubuntu-22.04.5",
-            "pool": "chromium.tests.gpu"
-          },
-          "expiration": 21600,
-          "hard_timeout": 1800,
-          "idempotent": false,
-          "io_timeout": 1800,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 5
-        },
-        "test": "telemetry_gpu_integration_test",
-        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
-      },
-      {
-        "args": [
-          "webgl1_conformance",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--stable-jobs",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-gl=angle --use-angle=gl --use-cmd-decoder=passthrough --force_high_performance_gpu",
-          "--enforce-browser-version",
-          "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl1_conformance_linux_runtimes.json",
-          "--jobs=4"
-        ],
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "webgl_conformance_gl_passthrough_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "containment_type": "AUTO",
-          "dimensions": {
-            "display_attached": "1",
-            "gpu": "8086:9bc5-23.2.1",
-            "os": "Ubuntu-22.04.5",
-            "pool": "chromium.tests.gpu"
-          },
-          "expiration": 21600,
-          "hard_timeout": 1800,
-          "idempotent": false,
-          "io_timeout": 1800,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 2
-        },
-        "test": "telemetry_gpu_integration_test",
-        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   },
@@ -6155,8 +5623,8 @@
         "swarming": {
           "containment_type": "AUTO",
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "hard_timeout": 1800,
@@ -6181,8 +5649,8 @@
         "swarming": {
           "containment_type": "AUTO",
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "hard_timeout": 1800,
@@ -6211,8 +5679,8 @@
         "swarming": {
           "containment_type": "AUTO",
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "hard_timeout": 1800,
@@ -6236,8 +5704,8 @@
         "swarming": {
           "containment_type": "AUTO",
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "hard_timeout": 1800,
@@ -6259,8 +5727,8 @@
         "swarming": {
           "containment_type": "AUTO",
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "hard_timeout": 1800,
@@ -6295,8 +5763,8 @@
         "swarming": {
           "containment_type": "AUTO",
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "hard_timeout": 1800,
@@ -6339,8 +5807,8 @@
         "swarming": {
           "containment_type": "AUTO",
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "hard_timeout": 1800,
@@ -6374,8 +5842,8 @@
         "swarming": {
           "containment_type": "AUTO",
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "hard_timeout": 1800,
@@ -6409,8 +5877,8 @@
         "swarming": {
           "containment_type": "AUTO",
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "hard_timeout": 1800,
@@ -6448,8 +5916,8 @@
         "swarming": {
           "containment_type": "AUTO",
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "hard_timeout": 1800,
@@ -6492,8 +5960,8 @@
         "swarming": {
           "containment_type": "AUTO",
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "hard_timeout": 1800,
@@ -6528,8 +5996,8 @@
         "swarming": {
           "containment_type": "AUTO",
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "hard_timeout": 1800,
@@ -6563,8 +6031,8 @@
         "swarming": {
           "containment_type": "AUTO",
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "hard_timeout": 1800,
@@ -6600,8 +6068,8 @@
         "swarming": {
           "containment_type": "AUTO",
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "hard_timeout": 1800,
@@ -6637,8 +6105,8 @@
         "swarming": {
           "containment_type": "AUTO",
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "hard_timeout": 1800,
@@ -7851,8 +7319,8 @@
         "swarming": {
           "containment_type": "AUTO",
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "hard_timeout": 1800,
@@ -7891,8 +7359,8 @@
         "swarming": {
           "containment_type": "AUTO",
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "hard_timeout": 1800,
@@ -7939,8 +7407,8 @@
         "swarming": {
           "containment_type": "AUTO",
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "hard_timeout": 1800,
@@ -7978,8 +7446,8 @@
         "swarming": {
           "containment_type": "AUTO",
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "hard_timeout": 1800,
@@ -8017,8 +7485,8 @@
         "swarming": {
           "containment_type": "AUTO",
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "hard_timeout": 1800,
@@ -8060,8 +7528,8 @@
         "swarming": {
           "containment_type": "AUTO",
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "hard_timeout": 1800,
@@ -8108,8 +7576,8 @@
         "swarming": {
           "containment_type": "AUTO",
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "hard_timeout": 1800,
@@ -8148,8 +7616,8 @@
         "swarming": {
           "containment_type": "AUTO",
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "hard_timeout": 1800,
@@ -8187,8 +7655,8 @@
         "swarming": {
           "containment_type": "AUTO",
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "hard_timeout": 1800,
@@ -8226,8 +7694,8 @@
         "swarming": {
           "containment_type": "AUTO",
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "hard_timeout": 1800,
@@ -8266,8 +7734,8 @@
         "swarming": {
           "containment_type": "AUTO",
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "hard_timeout": 1800,
diff --git a/testing/buildbot/mixins.pyl b/testing/buildbot/mixins.pyl
index a76a143..b33316f 100644
--- a/testing/buildbot/mixins.pyl
+++ b/testing/buildbot/mixins.pyl
@@ -560,8 +560,8 @@
     'fail_if_unused': False,
     'swarming': {
       'dimensions': {
-        'gpu': '8086:9bc5-20.0.8|8086:9bc5-23.2.1',
-        'os': 'Ubuntu-18.04.6|Ubuntu-22.04',
+        'gpu': '8086:9bc5-23.2.1',
+        'os': 'Ubuntu-22.04',
         'pool': 'chromium.tests.gpu',
       },
     },
@@ -878,6 +878,15 @@
       ],
     },
   },
+  'mac_vm': {
+    'swarming': {
+      'dimensions': {
+        'cpu': 'arm64-64-Apple_M1_(Virtual)',
+        'os': 'Mac-14',
+        'pool': 'chromium.tests.macvm',
+      },
+    },
+  },
   'no_gpu': {
     'fail_if_unused': False,
     'swarming': {
diff --git a/testing/buildbot/trybot_analyze_config.json b/testing/buildbot/trybot_analyze_config.json
index 935820d..00959260 100644
--- a/testing/buildbot/trybot_analyze_config.json
+++ b/testing/buildbot/trybot_analyze_config.json
@@ -49,7 +49,6 @@
       "components/test/data/.*",
       "components/version_ui/resources/.*(css|html|js)",
       "content/test/data/.*",
-      "content/test/gpu/.*",
       "extensions/test/data/.*",
       "media/test/data/.*",
       "mojo/tools/.*",
diff --git a/testing/buildbot/tryserver.chromium.linux.json b/testing/buildbot/tryserver.chromium.linux.json
index 62dca34..0f45c8d 100644
--- a/testing/buildbot/tryserver.chromium.linux.json
+++ b/testing/buildbot/tryserver.chromium.linux.json
@@ -185,8 +185,8 @@
         },
         "swarming": {
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "idempotent": false,
@@ -251,8 +251,8 @@
         },
         "swarming": {
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "idempotent": false,
@@ -317,8 +317,8 @@
         },
         "swarming": {
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "idempotent": false,
@@ -388,8 +388,8 @@
         },
         "swarming": {
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "idempotent": false,
@@ -458,8 +458,8 @@
         },
         "swarming": {
           "dimensions": {
-            "gpu": "8086:9bc5-20.0.8|8086:9bc5-23.2.1",
-            "os": "Ubuntu-18.04.6|Ubuntu-22.04",
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
             "pool": "chromium.tests.gpu"
           },
           "idempotent": false,
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl
index 779dd2c..b57be4b 100644
--- a/testing/buildbot/waterfalls.pyl
+++ b/testing/buildbot/waterfalls.pyl
@@ -1102,9 +1102,7 @@
         # should have the same test_suites as 'Dawn Linux x64 Release (Intel UHD
         # 630)'.
         'test_suites': {
-          'gpu_telemetry_tests': 'gpu_dawn_compat_telemetry_tests',
-          'gtest_tests': 'gpu_dawn_integration_gtests_passthrough',
-          'isolated_scripts': 'gpu_dawn_isolated_scripts',
+          'gpu_telemetry_tests': 'gpu_noop_sleep_telemetry_test',
         },
       },
       'Dawn Linux x64 Experimental Release (NVIDIA GTX 1660)': {
@@ -1997,6 +1995,22 @@
           'isolated_scripts': 'ios_m1_simulator_tests'
         },
       },
+      'ios-vm': {
+        'additional_compile_targets': [
+          'all',
+        ],
+        'mixins': [
+          'has_native_resultdb_integration',
+          'mac_vm',
+          'mac_toolchain',
+          'out_dir_arg',
+          'xcode_16_main',
+          'xctest',
+        ],
+        'test_suites': {
+          'isolated_scripts': 'ios_vm_tests_with_variants'
+        },
+      },
       'ios-webkit-tot': {
         'mixins': [
           'has_native_resultdb_integration',
@@ -2439,8 +2453,7 @@
         # only be running 'gpu_noop_sleep_telemetry_test'. Otherwise, this
         # should be running the same tests as 'Linux FYI Release (Intel UHD 630)'.
         'test_suites': {
-          'gtest_tests': 'gpu_fyi_linux_release_gtests',
-          'gpu_telemetry_tests': 'gpu_fyi_linux_release_telemetry_tests',
+          'gpu_telemetry_tests': 'gpu_noop_sleep_telemetry_test',
         },
       },
       'Linux FYI Experimental Release (NVIDIA)': {
diff --git a/third_party/angle b/third_party/angle
index 14b49533..a813854 160000
--- a/third_party/angle
+++ b/third_party/angle
@@ -1 +1 @@
-Subproject commit 14b495336c558046a1b5a8a34867ac875c5b3977
+Subproject commit a813854729f9a44991197c68c76748e27a49bbbf
diff --git a/third_party/blink/renderer/bindings/idl_in_core.gni b/third_party/blink/renderer/bindings/idl_in_core.gni
index 3bcd947..946abd18 100644
--- a/third_party/blink/renderer/bindings/idl_in_core.gni
+++ b/third_party/blink/renderer/bindings/idl_in_core.gni
@@ -165,7 +165,6 @@
   "//third_party/blink/renderer/core/dom/get_root_node_options.idl",
   "//third_party/blink/renderer/core/dom/global_event_handlers.idl",
   "//third_party/blink/renderer/core/dom/interest_invoker_element.idl",
-  "//third_party/blink/renderer/core/dom/invoker_element.idl",
   "//third_party/blink/renderer/core/dom/mutation_observer.idl",
   "//third_party/blink/renderer/core/dom/mutation_observer_init.idl",
   "//third_party/blink/renderer/core/dom/mutation_record.idl",
diff --git a/third_party/blink/renderer/core/BUILD.gn b/third_party/blink/renderer/core/BUILD.gn
index 2233bfae..0c89d57 100644
--- a/third_party/blink/renderer/core/BUILD.gn
+++ b/third_party/blink/renderer/core/BUILD.gn
@@ -20,7 +20,6 @@
 import("//third_party/blink/renderer/core/animation/build.gni")
 import("//third_party/blink/renderer/core/animation_frame/build.gni")
 import("//third_party/blink/renderer/core/annotation/build.gni")
-import("//third_party/blink/renderer/core/aom/build.gni")
 import("//third_party/blink/renderer/core/clipboard/build.gni")
 import("//third_party/blink/renderer/core/content_capture/build.gni")
 import("//third_party/blink/renderer/core/context_features/build.gni")
@@ -254,7 +253,6 @@
   sources +=
       rebase_path(blink_core_sources_animation_frame, "", "animation_frame")
   sources += rebase_path(blink_core_sources_annotation, "", "annotation")
-  sources += rebase_path(blink_core_sources_aom, "", "aom")
   sources += rebase_path(blink_core_sources_clipboard, "", "clipboard")
   sources +=
       rebase_path(blink_core_sources_content_capture, "", "content_capture")
diff --git a/third_party/blink/renderer/core/aom/DIR_METADATA b/third_party/blink/renderer/core/aom/DIR_METADATA
deleted file mode 100644
index 57c8f0a..0000000
--- a/third_party/blink/renderer/core/aom/DIR_METADATA
+++ /dev/null
@@ -1,7 +0,0 @@
-monorail: {
-  component: "Blink>Accessibility"
-}
-team_email: "chromium-accessibility@chromium.org"
-buganizer_public: {
-  component_id: 1456587
-}
diff --git a/third_party/blink/renderer/core/aom/OWNERS b/third_party/blink/renderer/core/aom/OWNERS
deleted file mode 100644
index 4e6cc130..0000000
--- a/third_party/blink/renderer/core/aom/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-file://third_party/blink/renderer/modules/accessibility/OWNERS
diff --git a/third_party/blink/renderer/core/aom/accessible_node.cc b/third_party/blink/renderer/core/aom/accessible_node.cc
deleted file mode 100644
index a57a64e..0000000
--- a/third_party/blink/renderer/core/aom/accessible_node.cc
+++ /dev/null
@@ -1,132 +0,0 @@
-// Copyright 2017 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "third_party/blink/renderer/core/aom/accessible_node.h"
-
-#include "base/ranges/algorithm.h"
-#include "third_party/blink/renderer/core/dom/element.h"
-#include "third_party/blink/renderer/core/dom/qualified_name.h"
-#include "third_party/blink/renderer/core/event_target_names.h"
-#include "third_party/blink/renderer/core/execution_context/execution_context.h"
-#include "third_party/blink/renderer/core/frame/local_frame_view.h"
-#include "third_party/blink/renderer/core/frame/settings.h"
-#include "third_party/blink/renderer/core/html/custom/element_internals.h"
-#include "third_party/blink/renderer/core/page/page.h"
-#include "third_party/blink/renderer/platform/runtime_enabled_features.h"
-#include "third_party/blink/renderer/platform/weborigin/security_origin.h"
-
-namespace blink {
-
-namespace {
-
-QualifiedName GetCorrespondingARIAAttribute(AOMRelationProperty property) {
-  switch (property) {
-    case AOMRelationProperty::kActiveDescendant:
-      return html_names::kAriaActivedescendantAttr;
-  }
-
-  NOTREACHED_IN_MIGRATION();
-  return g_null_name;
-}
-
-QualifiedName GetCorrespondingARIAAttribute(AOMRelationListProperty property) {
-  switch (property) {
-    case AOMRelationListProperty::kDescribedBy:
-      return html_names::kAriaDescribedbyAttr;
-    case AOMRelationListProperty::kDetails:
-      return html_names::kAriaDetailsAttr;
-    case AOMRelationListProperty::kControls:
-      return html_names::kAriaControlsAttr;
-    case AOMRelationListProperty::kErrorMessage:
-      return html_names::kAriaErrormessageAttr;
-    case AOMRelationListProperty::kFlowTo:
-      return html_names::kAriaFlowtoAttr;
-    case AOMRelationListProperty::kLabeledBy:
-      // Note that there are two allowed spellings of this attribute.
-      // Callers should check both.
-      return html_names::kAriaLabelledbyAttr;
-    case AOMRelationListProperty::kOwns:
-      return html_names::kAriaOwnsAttr;
-  }
-
-  NOTREACHED_IN_MIGRATION();
-  return g_null_name;
-}
-
-}  // namespace
-
-// static
-const AtomicString& AccessibleNode::GetElementOrInternalsARIAAttribute(
-    Element& element,
-    const QualifiedName& attribute) {
-  if (const AtomicString& attr_value = element.FastGetAttribute(attribute)) {
-    return attr_value;
-  }
-
-  if (!element.DidAttachInternals())
-    return g_null_atom;
-
-  return element.EnsureElementInternals().FastGetAttribute(attribute);
-}
-
-// static
-const AtomicString& AccessibleNode::GetPropertyOrARIAAttributeValue(
-    Element* element,
-    AOMRelationProperty property) {
-  if (!element)
-    return g_null_atom;
-  QualifiedName attribute = GetCorrespondingARIAAttribute(property);
-  const AtomicString& value =
-      GetElementOrInternalsARIAAttribute(*element, attribute);
-  return value.empty() ? g_null_atom : value;
-}
-
-Element* AccessibleNode::GetPropertyOrARIAAttribute(
-    Element* element,
-    AOMRelationProperty property) {
-  auto& value = GetPropertyOrARIAAttributeValue(element, property);
-  if (value == g_null_atom) {
-    return nullptr;
-  }
-  Element* value_element = element->GetTreeScope().getElementById(value);
-  if (!value_element) {
-    return nullptr;
-  }
-  return value_element->GetShadowReferenceTargetOrSelf(
-      GetCorrespondingARIAAttribute(property));
-}
-
-// static
-bool AccessibleNode::GetPropertyOrARIAAttribute(
-    Element* element,
-    AOMRelationListProperty property,
-    HeapVector<Member<Element>>& targets) {
-  if (!element)
-    return false;
-  QualifiedName attribute = GetCorrespondingARIAAttribute(property);
-  String value =
-      GetElementOrInternalsARIAAttribute(*element, attribute).GetString();
-  if (value.empty() && property == AOMRelationListProperty::kLabeledBy) {
-    value = GetElementOrInternalsARIAAttribute(*element,
-                                               html_names::kAriaLabeledbyAttr)
-                .GetString();
-  }
-  if (value.empty())
-    return false;
-
-  Vector<String> ids;
-  value.Split(' ', ids);
-  if (ids.empty())
-    return false;
-
-  TreeScope& scope = element->GetTreeScope();
-  for (const auto& id : ids) {
-    if (Element* id_element = scope.getElementById(AtomicString(id))) {
-      targets.push_back(id_element->GetShadowReferenceTargetOrSelf(attribute));
-    }
-  }
-  return true;
-}
-
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/aom/accessible_node.h b/third_party/blink/renderer/core/aom/accessible_node.h
deleted file mode 100644
index f6cd5cd1..0000000
--- a/third_party/blink/renderer/core/aom/accessible_node.h
+++ /dev/null
@@ -1,90 +0,0 @@
-// Copyright 2017 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_AOM_ACCESSIBLE_NODE_H_
-#define THIRD_PARTY_BLINK_RENDERER_CORE_AOM_ACCESSIBLE_NODE_H_
-
-#include <optional>
-
-#include "third_party/blink/renderer/core/core_export.h"
-#include "third_party/blink/renderer/core/dom/element_rare_data_field.h"
-#include "third_party/blink/renderer/core/dom/events/event_target.h"
-#include "third_party/blink/renderer/core/dom/qualified_name.h"
-#include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
-#include "third_party/blink/renderer/platform/wtf/text/atomic_string.h"
-#include "third_party/blink/renderer/platform/wtf/text/atomic_string_hash.h"
-
-namespace blink {
-
-class Element;
-class QualifiedName;
-
-// All of the properties of AccessibleNode that have type "string".
-enum class AOMStringProperty {
-  kAutocomplete,
-  kAriaBrailleLabel,
-  kAriaBrailleRoleDescription,
-  kChecked,
-  kColIndexText,
-  kCurrent,
-  kDescription,
-  kHasPopup,
-  kInvalid,
-  kKeyShortcuts,
-  kLabel,
-  kLive,
-  kOrientation,
-  kPlaceholder,
-  kPressed,
-  kRelevant,
-  kRole,
-  kRoleDescription,
-  kRowIndexText,
-  kSort,
-  kValueText,
-  kVirtualContent
-};
-
-enum class AOMRelationProperty {
-  kActiveDescendant,
-};
-
-enum class AOMRelationListProperty {
-  kDescribedBy,
-  kDetails,
-  kControls,
-  kErrorMessage,
-  kFlowTo,
-  kLabeledBy,
-  kOwns,
-};
-
-class AccessibleNode;
-
-class CORE_EXPORT AccessibleNode {
- public:
-  // Returns the value of the given string property if the
-  // Element has an AccessibleNode, otherwise returns the equivalent
-  // ARIA attribute.
-  static const AtomicString& GetPropertyOrARIAAttributeValue(
-      Element* element,
-      AOMRelationProperty property);
-
-  // Returns the equivalent ARIA attribute.
-  static Element* GetPropertyOrARIAAttribute(Element*, AOMRelationProperty);
-
-  // Returns true with the equivalent ARIA attribute or false if not present.
-  static bool GetPropertyOrARIAAttribute(Element*,
-                                         AOMRelationListProperty,
-                                         HeapVector<Member<Element>>&);
-
- private:
-  static const AtomicString& GetElementOrInternalsARIAAttribute(
-      Element& element,
-      const QualifiedName& attribute);
-};
-
-}  // namespace blink
-
-#endif  // THIRD_PARTY_BLINK_RENDERER_CORE_AOM_ACCESSIBLE_NODE_H_
diff --git a/third_party/blink/renderer/core/aom/build.gni b/third_party/blink/renderer/core/aom/build.gni
deleted file mode 100644
index b00130c..0000000
--- a/third_party/blink/renderer/core/aom/build.gni
+++ /dev/null
@@ -1,8 +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.
-
-blink_core_sources_aom = [
-  "accessible_node.cc",
-  "accessible_node.h",
-]
diff --git a/third_party/blink/renderer/core/css/properties/css_property_test.cc b/third_party/blink/renderer/core/css/properties/css_property_test.cc
index a0517c70..3f9a0d9 100644
--- a/third_party/blink/renderer/core/css/properties/css_property_test.cc
+++ b/third_party/blink/renderer/core/css/properties/css_property_test.cc
@@ -163,7 +163,6 @@
         initial_style, nullptr /* layout_object */,
         false /* allow_visited_style */, CSSValuePhase::kComputedValue);
     ASSERT_TRUE(initial_value);
-    String css_text = initial_value->CssText();
 
     // Parse the initial value using both the regular property, and the
     // accompanying 'visited' property.
diff --git a/third_party/blink/renderer/core/dom/element.cc b/third_party/blink/renderer/core/dom/element.cc
index c8eef7d7b..7a754a3 100644
--- a/third_party/blink/renderer/core/dom/element.cc
+++ b/third_party/blink/renderer/core/dom/element.cc
@@ -10550,7 +10550,7 @@
     return anchor;
   }
   if (const HTMLElement* html_element = DynamicTo<HTMLElement>(this)) {
-    if (Element* internal_anchor = html_element->internalImplicitAnchor()) {
+    if (Element* internal_anchor = html_element->implicitAnchor()) {
       return internal_anchor;
     }
   }
diff --git a/third_party/blink/renderer/core/dom/element.h b/third_party/blink/renderer/core/dom/element.h
index f9b2dcc..dbc7f870 100644
--- a/third_party/blink/renderer/core/dom/element.h
+++ b/third_party/blink/renderer/core/dom/element.h
@@ -224,7 +224,7 @@
   kRequestFullscreen,
   kExitFullscreen,
   // Audio/Video
-  kPlaypause,
+  kPlayPause,
   kPause,
   kPlay,
   kToggleMuted,
@@ -1029,7 +1029,8 @@
 
   // This allows customization of how Invoker Commands are handled, per element.
   // See: crbug.com/1490919, https://open-ui.org/components/invokers.explainer/
-  virtual bool IsValidCommand(HTMLElement& invoker, CommandEventType command) {
+  virtual bool IsValidBuiltinCommand(HTMLElement& invoker,
+                                     CommandEventType command) {
     return false;
   }
   virtual bool HandleCommandInternal(HTMLElement& invoker,
diff --git a/third_party/blink/renderer/core/dom/invoker_element.idl b/third_party/blink/renderer/core/dom/invoker_element.idl
deleted file mode 100644
index f7bf5d61..0000000
--- a/third_party/blink/renderer/core/dom/invoker_element.idl
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright 2022 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-[RuntimeEnabled=HTMLInvokeTargetAttribute]
-interface mixin InvokerElement {
-  [CEReactions,Reflect=commandfor] attribute Element? commandForElement;
-  [CEReactions,Reflect=command] attribute DOMString command;
-};
diff --git a/third_party/blink/renderer/core/dom/popover_data.h b/third_party/blink/renderer/core/dom/popover_data.h
index 61f419a4..a6b7bde 100644
--- a/third_party/blink/renderer/core/dom/popover_data.h
+++ b/third_party/blink/renderer/core/dom/popover_data.h
@@ -111,12 +111,8 @@
     hover_hide_task_ = std::move(task);
   }
 
-  HTMLElement* internalImplicitAnchor() const {
-    return internal_implicit_anchor_.Get();
-  }
-  void setInternalImplicitAnchor(HTMLElement* element) {
-    internal_implicit_anchor_ = element;
-  }
+  Element* implicitAnchor() const { return implicit_anchor_.Get(); }
+  void setImplicitAnchor(Element* element) { implicit_anchor_ = element; }
 
   CloseWatcher* closeWatcher() { return close_watcher_.Get(); }
   void setCloseWatcher(CloseWatcher* close_watcher) {
@@ -127,7 +123,7 @@
     visitor->Trace(invoker_);
     visitor->Trace(previously_focused_element_);
     visitor->Trace(hover_show_tasks_);
-    visitor->Trace(internal_implicit_anchor_);
+    visitor->Trace(implicit_anchor_);
     visitor->Trace(close_watcher_);
     ElementRareDataField::Trace(visitor);
   }
@@ -153,9 +149,9 @@
   // A task that hides the popover after a delay.
   TaskHandle hover_hide_task_;
 
-  // Used for builtin elements which want to set up an anchor relationship in
-  // C++ instead of CSS.
-  WeakMember<HTMLElement> internal_implicit_anchor_;
+  // Used to set up an anchor relationship separately from CSS `anchor`
+  // references.
+  WeakMember<Element> implicit_anchor_;
 
   Member<CloseWatcher> close_watcher_;
 };
diff --git a/third_party/blink/renderer/core/events/command_event.cc b/third_party/blink/renderer/core/events/command_event.cc
index 1f4d0c4..44d5678 100644
--- a/third_party/blink/renderer/core/events/command_event.cc
+++ b/third_party/blink/renderer/core/events/command_event.cc
@@ -16,8 +16,8 @@
                          const CommandEventInit* initializer)
     : Event(type, initializer) {
   DCHECK(RuntimeEnabledFeatures::HTMLInvokeTargetAttributeEnabled());
-  if (initializer->hasInvoker()) {
-    invoker_ = initializer->invoker();
+  if (initializer->hasSource()) {
+    source_ = initializer->source();
   }
 
   if (initializer->hasCommand()) {
@@ -26,30 +26,30 @@
 }
 
 CommandEvent::CommandEvent(const AtomicString& type,
-                         const String& command,
-                         Element* invoker)
+                           const String& command,
+                           Element* source)
     : Event(type, Bubbles::kNo, Cancelable::kYes, ComposedMode::kComposed),
-      invoker_(invoker) {
+      source_(source) {
   DCHECK(RuntimeEnabledFeatures::HTMLInvokeTargetAttributeEnabled());
   command_ = command;
 }
 
-Element* CommandEvent::invoker() const {
+Element* CommandEvent::source() const {
   auto* current = currentTarget();
-  Element* invoker = invoker_.Get();
-  if (!invoker) {
+  Element* source = source_.Get();
+  if (!source) {
     return nullptr;
   }
 
   if (current) {
-    return &current->ToNode()->GetTreeScope().Retarget(*invoker);
+    return &current->ToNode()->GetTreeScope().Retarget(*source);
   }
   DCHECK_EQ(eventPhase(), Event::PhaseType::kNone);
-  return invoker;
+  return source;
 }
 
 void CommandEvent::Trace(Visitor* visitor) const {
-  visitor->Trace(invoker_);
+  visitor->Trace(source_);
   Event::Trace(visitor);
 }
 
diff --git a/third_party/blink/renderer/core/events/command_event.h b/third_party/blink/renderer/core/events/command_event.h
index e440ecb2..fc5d56b 100644
--- a/third_party/blink/renderer/core/events/command_event.h
+++ b/third_party/blink/renderer/core/events/command_event.h
@@ -25,14 +25,14 @@
 
   static CommandEvent* Create(const AtomicString& type,
                               const AtomicString& command,
-                              Element* invoker) {
-    return MakeGarbageCollected<CommandEvent>(type, command, invoker);
+                              Element* source) {
+    return MakeGarbageCollected<CommandEvent>(type, command, source);
   }
 
   CommandEvent(const AtomicString& type, const CommandEventInit* initializer);
   CommandEvent(const AtomicString& type,
                const String& command,
-               Element* invoker);
+               Element* source);
 
   const AtomicString& InterfaceName() const override {
     return event_interface_names::kCommandEvent;
@@ -42,11 +42,11 @@
 
   const String& command() const { return command_; }
 
-  Element* invoker() const;
-  void SetInvoker(Element* invoker) { invoker_ = invoker; }
+  Element* source() const;
+  void SetSource(Element* source) { source_ = source; }
 
  private:
-  Member<Element> invoker_;
+  Member<Element> source_;
   String command_;
 };
 
diff --git a/third_party/blink/renderer/core/events/command_event.idl b/third_party/blink/renderer/core/events/command_event.idl
index 4f9eec6..451b378 100644
--- a/third_party/blink/renderer/core/events/command_event.idl
+++ b/third_party/blink/renderer/core/events/command_event.idl
@@ -7,11 +7,11 @@
     Exposed=Window
 ] interface CommandEvent : Event {
     constructor(DOMString type, optional CommandEventInit eventInitDict = {});
-    readonly attribute Element? invoker;
+    readonly attribute Element? source;
     readonly attribute DOMString command;
 };
 
 dictionary CommandEventInit : EventInit {
-    Element? invoker = null;
+    Element? source = null;
     DOMString command = "";
 };
diff --git a/third_party/blink/renderer/core/html/forms/html_button_element.cc b/third_party/blink/renderer/core/html/forms/html_button_element.cc
index 359aad4d..5ead0e9 100644
--- a/third_party/blink/renderer/core/html/forms/html_button_element.cc
+++ b/third_party/blink/renderer/core/html/forms/html_button_element.cc
@@ -32,6 +32,7 @@
 #include "third_party/blink/renderer/core/dom/flat_tree_traversal.h"
 #include "third_party/blink/renderer/core/dom/focus_params.h"
 #include "third_party/blink/renderer/core/dom/qualified_name.h"
+#include "third_party/blink/renderer/core/events/command_event.h"
 #include "third_party/blink/renderer/core/frame/web_feature.h"
 #include "third_party/blink/renderer/core/html/forms/form_data.h"
 #include "third_party/blink/renderer/core/html/forms/html_form_element.h"
@@ -131,6 +132,117 @@
   }
 }
 
+Element* HTMLButtonElement::commandForElement() {
+  if (!RuntimeEnabledFeatures::HTMLInvokeTargetAttributeEnabled()) {
+    return nullptr;
+  }
+
+  if (!IsInTreeScope() || IsDisabledFormControl() ||
+      (Form() && CanBeSuccessfulSubmitButton())) {
+    return nullptr;
+  }
+
+  return GetElementAttribute(html_names::kCommandforAttr);
+}
+
+AtomicString HTMLButtonElement::command() const {
+  CHECK(RuntimeEnabledFeatures::HTMLInvokeTargetAttributeEnabled());
+  const AtomicString& attribute_value =
+      FastGetAttribute(html_names::kCommandAttr);
+  if (attribute_value && !attribute_value.empty()) {
+    return attribute_value;
+  }
+  return g_empty_atom;
+}
+
+CommandEventType HTMLButtonElement::GetCommandEventType() const {
+  auto action = command();
+  DCHECK(!action.IsNull());
+
+  if (action.empty()) {
+    return CommandEventType::kNone;
+  }
+
+  // Custom Invoke Action
+  if (action.StartsWith("--")) {
+    return CommandEventType::kCustom;
+  }
+
+  // Popover Cases
+  if (EqualIgnoringASCIICase(action, keywords::kTogglePopover)) {
+    return CommandEventType::kTogglePopover;
+  }
+  if (EqualIgnoringASCIICase(action, keywords::kShowPopover)) {
+    return CommandEventType::kShowPopover;
+  }
+  if (EqualIgnoringASCIICase(action, keywords::kHidePopover)) {
+    return CommandEventType::kHidePopover;
+  }
+
+  // Dialog Cases
+  if (EqualIgnoringASCIICase(action, keywords::kClose)) {
+    return CommandEventType::kClose;
+  }
+  if (EqualIgnoringASCIICase(action, keywords::kShowModal)) {
+    return CommandEventType::kShowModal;
+  }
+
+  // V2 commands go below this point
+
+  if (!RuntimeEnabledFeatures::HTMLInvokeActionsV2Enabled()) {
+    return CommandEventType::kNone;
+  }
+
+  // Input/Select Cases
+  if (EqualIgnoringASCIICase(action, keywords::kShowPicker)) {
+    return CommandEventType::kShowPicker;
+  }
+
+  // Number Input Cases
+  if (EqualIgnoringASCIICase(action, keywords::kStepUp)) {
+    return CommandEventType::kStepUp;
+  }
+  if (EqualIgnoringASCIICase(action, keywords::kStepDown)) {
+    return CommandEventType::kStepDown;
+  }
+
+  // Fullscreen Cases
+  if (EqualIgnoringASCIICase(action, keywords::kToggleFullscreen)) {
+    return CommandEventType::kToggleFullscreen;
+  }
+  if (EqualIgnoringASCIICase(action, keywords::kRequestFullscreen)) {
+    return CommandEventType::kRequestFullscreen;
+  }
+  if (EqualIgnoringASCIICase(action, keywords::kExitFullscreen)) {
+    return CommandEventType::kExitFullscreen;
+  }
+
+  // Details cases
+  if (EqualIgnoringASCIICase(action, keywords::kToggle)) {
+    return CommandEventType::kToggle;
+  }
+  if (EqualIgnoringASCIICase(action, keywords::kOpen)) {
+    return CommandEventType::kOpen;
+  }
+  // CommandEventType::kClose handled above in Dialog
+
+  // Media cases
+  if (EqualIgnoringASCIICase(action, keywords::kPlayPause)) {
+    return CommandEventType::kPlayPause;
+  }
+  if (EqualIgnoringASCIICase(action, keywords::kPause)) {
+    return CommandEventType::kPause;
+  }
+  if (EqualIgnoringASCIICase(action, keywords::kPlay)) {
+    return CommandEventType::kPlay;
+  }
+  if (EqualIgnoringASCIICase(action, keywords::kToggleMuted)) {
+    return CommandEventType::kToggleMuted;
+  }
+
+  return CommandEventType::kNone;
+}
+
 void HTMLButtonElement::DefaultEventHandler(Event& event) {
   if (event.type() == event_type_names::kDOMActivate) {
     if (!IsDisabledFormControl()) {
@@ -144,6 +256,41 @@
         event.SetDefaultHandled();
         return;
       }
+      if (Form() && type_ != kButton && commandForElement()) {
+        AddConsoleMessage(
+            mojom::blink::ConsoleMessageSource::kOther,
+            mojom::blink::ConsoleMessageLevel::kWarning,
+            "commandfor is ignored on form buttons without type=button.");
+        return;
+      }
+    }
+
+    // Buttons with a commandfor will dispatch a CommandEvent on the
+    // invoker, and run HandleCommandInternal to perform default logic.
+    if (auto* command_target = commandForElement()) {
+      // commandfor & popovertarget shouldn't be combined, so warn.
+      if (FastHasAttribute(html_names::kPopovertargetAttr)) {
+        AddConsoleMessage(
+            mojom::blink::ConsoleMessageSource::kOther,
+            mojom::blink::ConsoleMessageLevel::kWarning,
+            "popovertarget is ignored on elements with commandfor.");
+      }
+
+      auto action = GetCommandEventType();
+      bool is_valid_builtin =
+          command_target->IsValidBuiltinCommand(*this, action);
+      bool should_dispatch =
+          is_valid_builtin || action == CommandEventType::kCustom;
+      if (should_dispatch) {
+        Event* commandEvent =
+            CommandEvent::Create(event_type_names::kCommand, command(), this);
+        command_target->DispatchEvent(*commandEvent);
+        if (is_valid_builtin && !commandEvent->defaultPrevented()) {
+          command_target->HandleCommandInternal(*this, action);
+        }
+      }
+
+      return;
     }
   }
 
diff --git a/third_party/blink/renderer/core/html/forms/html_button_element.h b/third_party/blink/renderer/core/html/forms/html_button_element.h
index ed855b79..157f598 100644
--- a/third_party/blink/renderer/core/html/forms/html_button_element.h
+++ b/third_party/blink/renderer/core/html/forms/html_button_element.h
@@ -49,6 +49,11 @@
   // child of a <select>.
   HTMLSelectElement* OwnerSelect() const;
 
+  // Invoker Commands (https://github.com/whatwg/html/pull/9841)
+  Element* commandForElement();
+  AtomicString command() const;
+  CommandEventType GetCommandEventType() const;
+
  private:
   // The type attribute of HTMLButtonElement is an enumerated attribute:
   // https://html.spec.whatwg.org/multipage/form-elements.html#attr-button-type
diff --git a/third_party/blink/renderer/core/html/forms/html_button_element.idl b/third_party/blink/renderer/core/html/forms/html_button_element.idl
index 2d9b1fb6..ae5a6b3 100644
--- a/third_party/blink/renderer/core/html/forms/html_button_element.idl
+++ b/third_party/blink/renderer/core/html/forms/html_button_element.idl
@@ -35,6 +35,10 @@
     [CEReactions, Reflect] attribute DOMString value;
     // FIXME: attribute HTMLMenuElement? menu;
 
+    // Command Invokers
+    [RuntimeEnabled=HTMLInvokeTargetAttribute, CEReactions, Reflect=commandfor] attribute Element? commandForElement;
+    [RuntimeEnabled=HTMLInvokeTargetAttribute, CEReactions, Reflect] attribute DOMString command;
+
     readonly attribute boolean willValidate;
     readonly attribute ValidityState validity;
     readonly attribute DOMString validationMessage;
@@ -46,5 +50,4 @@
 };
 
 HTMLButtonElement includes PopoverInvokerElement;
-HTMLButtonElement includes InvokerElement;
-HTMLButtonElement includes InterestInvokerElement;
\ No newline at end of file
+HTMLButtonElement includes InterestInvokerElement;
diff --git a/third_party/blink/renderer/core/html/forms/html_form_control_element.cc b/third_party/blink/renderer/core/html/forms/html_form_control_element.cc
index 374043d..7b71ba6 100644
--- a/third_party/blink/renderer/core/html/forms/html_form_control_element.cc
+++ b/third_party/blink/renderer/core/html/forms/html_form_control_element.cc
@@ -370,19 +370,6 @@
   return PopoverTargetElement{.popover = target_popover, .action = action};
 }
 
-Element* HTMLFormControlElement::commandForElement() {
-  if (!IsInTreeScope() || IsDisabledFormControl() ||
-      (Form() && IsSuccessfulSubmitButton())) {
-    return nullptr;
-  }
-
-  if (!RuntimeEnabledFeatures::HTMLInvokeTargetAttributeEnabled()) {
-    return nullptr;
-  }
-
-  return GetElementAttribute(html_names::kCommandforAttr);
-}
-
 Element* HTMLFormControlElement::interestTargetElement() {
   CHECK(RuntimeEnabledFeatures::HTMLInvokeTargetAttributeEnabled());
 
@@ -414,103 +401,6 @@
   setAttribute(html_names::kPopovertargetactionAttr, value);
 }
 
-AtomicString HTMLFormControlElement::command() const {
-  DCHECK(RuntimeEnabledFeatures::HTMLInvokeTargetAttributeEnabled());
-  const AtomicString& attribute_value =
-      FastGetAttribute(html_names::kCommandAttr);
-  if (attribute_value && !attribute_value.IsNull() &&
-      !attribute_value.empty()) {
-    return attribute_value;
-  }
-  return g_empty_atom;
-}
-
-CommandEventType HTMLFormControlElement::GetCommandEventType() const {
-  auto action = command();
-  if (action.empty()) {
-    return CommandEventType::kNone;
-  }
-
-  // Custom Invoke Action
-  if (action.Contains('-')) {
-    return CommandEventType::kCustom;
-  }
-
-  // Popover Cases
-  if (EqualIgnoringASCIICase(action, keywords::kTogglePopover)) {
-    return CommandEventType::kTogglePopover;
-  }
-  if (EqualIgnoringASCIICase(action, keywords::kShowPopover)) {
-    return CommandEventType::kShowPopover;
-  }
-  if (EqualIgnoringASCIICase(action, keywords::kHidePopover)) {
-    return CommandEventType::kHidePopover;
-  }
-
-  // Dialog Cases
-  if (EqualIgnoringASCIICase(action, keywords::kClose)) {
-    return CommandEventType::kClose;
-  }
-  if (EqualIgnoringASCIICase(action, keywords::kShowModal)) {
-    return CommandEventType::kShowModal;
-  }
-
-  // V2 InvokeActions Go Below this
-
-  if (!RuntimeEnabledFeatures::HTMLInvokeActionsV2Enabled()) {
-    return CommandEventType::kNone;
-  }
-
-  // Input/Select Cases
-  if (EqualIgnoringASCIICase(action, keywords::kShowPicker)) {
-    return CommandEventType::kShowPicker;
-  }
-
-  // Number Input Cases
-  if (EqualIgnoringASCIICase(action, keywords::kStepUp)) {
-    return CommandEventType::kStepUp;
-  }
-  if (EqualIgnoringASCIICase(action, keywords::kStepDown)) {
-    return CommandEventType::kStepDown;
-  }
-
-  // Fullscreen Cases
-  if (EqualIgnoringASCIICase(action, keywords::kToggleFullscreen)) {
-    return CommandEventType::kToggleFullscreen;
-  }
-  if (EqualIgnoringASCIICase(action, keywords::kRequestFullscreen)) {
-    return CommandEventType::kRequestFullscreen;
-  }
-  if (EqualIgnoringASCIICase(action, keywords::kExitFullscreen)) {
-    return CommandEventType::kExitFullscreen;
-  }
-
-  // Details cases
-  if (EqualIgnoringASCIICase(action, keywords::kToggle)) {
-    return CommandEventType::kToggle;
-  }
-  if (EqualIgnoringASCIICase(action, keywords::kOpen)) {
-    return CommandEventType::kOpen;
-  }
-  // CommandEventType::kClose handled above in Dialog
-
-  // Media cases
-  if (EqualIgnoringASCIICase(action, keywords::kPlaypause)) {
-    return CommandEventType::kPlaypause;
-  }
-  if (EqualIgnoringASCIICase(action, keywords::kPause)) {
-    return CommandEventType::kPause;
-  }
-  if (EqualIgnoringASCIICase(action, keywords::kPlay)) {
-    return CommandEventType::kPlay;
-  }
-  if (EqualIgnoringASCIICase(action, keywords::kToggleMuted)) {
-    return CommandEventType::kToggleMuted;
-  }
-
-  return CommandEventType::kNone;
-}
-
 AtomicString HTMLFormControlElement::interestAction() const {
   CHECK(RuntimeEnabledFeatures::HTMLInterestTargetAttributeEnabled());
   const AtomicString& attribute_value =
@@ -527,34 +417,14 @@
   // buttons.
   if (event.type() == event_type_names::kDOMActivate && IsInTreeScope() &&
       !IsDisabledFormControl() && (!Form() || !IsSuccessfulSubmitButton())) {
-    auto* command_target = commandForElement();
     auto popover = popoverTargetElement();
 
-    // invoketarget & popovertarget shouldn't be combined, so warn.
-    if (command_target && popover.popover) {
-      AddConsoleMessage(
-          mojom::blink::ConsoleMessageSource::kOther,
-          mojom::blink::ConsoleMessageLevel::kWarning,
-          "popovertarget is ignored on elements with invoketarget set.");
-    }
+    // CommandFor should have been handled in
+    // HTMLButtonElement::DefaultEventHandler
+    DCHECK(!IsA<HTMLButtonElement>(this) ||
+           !DynamicTo<HTMLButtonElement>(this)->commandForElement());
 
-    // Buttons with an invoketarget will dispatch an CommandEvent on the
-    // Invoker, and run HandleCommandInternal to perform default logic.
-    if (command_target) {
-      auto action = GetCommandEventType();
-      bool is_valid_builtin = command_target->IsValidCommand(*this, action);
-      bool should_dispatch =
-          is_valid_builtin || action == CommandEventType::kCustom;
-      if (should_dispatch) {
-        Event* commandEvent =
-            CommandEvent::Create(event_type_names::kCommand, command(), this);
-        command_target->DispatchEvent(*commandEvent);
-        if (is_valid_builtin && !commandEvent->defaultPrevented()) {
-          command_target->HandleCommandInternal(*this, action);
-        }
-      }
-
-    } else if (popover.popover) {
+    if (popover.popover) {
       // Buttons with a popovertarget will invoke popovers, which is the same
       // logic as an invoketarget with an appropriate command (e.g.
       // togglePopover), sans the `CommandEvent` dispatch. Calling
@@ -567,7 +437,6 @@
       // We must check to ensure the action is one of the available popover
       // invoker actions so that popovertargetaction cannot be set to something
       // like showModal.
-      CHECK(!command_target);
       auto trigger_support = SupportsPopoverTriggering();
       CHECK_NE(trigger_support, PopoverTriggerSupport::kNone);
       CHECK_NE(popover.action, PopoverTriggerAction::kNone);
@@ -593,7 +462,7 @@
           break;
       }
 
-      CHECK(popover.popover->IsValidCommand(*this, action));
+      CHECK(popover.popover->IsValidBuiltinCommand(*this, action));
       popover.popover->HandleCommandInternal(*this, action);
     }
   }
@@ -609,9 +478,13 @@
   if (!IsInTreeScope()) {
     return;
   }
-  if (commandForElement() ||
-      (RuntimeEnabledFeatures::HTMLInvokeTargetAttributeEnabled() &&
-       interestTargetElement())) {
+  if (auto* button = DynamicTo<HTMLButtonElement>(this)) {
+    if (button->commandForElement()) {
+      return;
+    }
+  }
+  if (RuntimeEnabledFeatures::HTMLInvokeTargetAttributeEnabled() &&
+      interestTargetElement()) {
     return;
   }
   auto target_info = popoverTargetElement();
diff --git a/third_party/blink/renderer/core/html/forms/html_form_control_element.h b/third_party/blink/renderer/core/html/forms/html_form_control_element.h
index e20eb6f..8c13666f 100644
--- a/third_party/blink/renderer/core/html/forms/html_form_control_element.h
+++ b/third_party/blink/renderer/core/html/forms/html_form_control_element.h
@@ -115,11 +115,6 @@
   AtomicString popoverTargetAction() const;
   void setPopoverTargetAction(const AtomicString& value);
 
-  Element* commandForElement();
-
-  AtomicString command() const;
-  CommandEventType GetCommandEventType() const;
-
   Element* interestTargetElement() override;
 
   AtomicString interestAction() const override;
diff --git a/third_party/blink/renderer/core/html/forms/html_input_element.cc b/third_party/blink/renderer/core/html/forms/html_input_element.cc
index 291d5026..3b7fc63 100644
--- a/third_party/blink/renderer/core/html/forms/html_input_element.cc
+++ b/third_party/blink/renderer/core/html/forms/html_input_element.cc
@@ -2376,9 +2376,9 @@
   input_type_view_->OpenPopupView();
 }
 
-bool HTMLInputElement::IsValidCommand(HTMLElement& invoker,
-                                      CommandEventType command) {
-  bool parent_is_valid = HTMLElement::IsValidCommand(invoker, command);
+bool HTMLInputElement::IsValidBuiltinCommand(HTMLElement& invoker,
+                                             CommandEventType command) {
+  bool parent_is_valid = HTMLElement::IsValidBuiltinCommand(invoker, command);
   if (!RuntimeEnabledFeatures::HTMLInvokeActionsV2Enabled() ||
       parent_is_valid) {
     return parent_is_valid;
@@ -2396,7 +2396,7 @@
 
 bool HTMLInputElement::HandleCommandInternal(HTMLElement& invoker,
                                              CommandEventType command) {
-  CHECK(IsValidCommand(invoker, command));
+  CHECK(IsValidBuiltinCommand(invoker, command));
 
   if (HTMLElement::HandleCommandInternal(invoker, command)) {
     return true;
diff --git a/third_party/blink/renderer/core/html/forms/html_input_element.h b/third_party/blink/renderer/core/html/forms/html_input_element.h
index bfb8ed13..3befd6a4 100644
--- a/third_party/blink/renderer/core/html/forms/html_input_element.h
+++ b/third_party/blink/renderer/core/html/forms/html_input_element.h
@@ -378,7 +378,8 @@
 
   ShadowRoot* EnsureShadowSubtree();
 
-  bool IsValidCommand(HTMLElement& invoker, CommandEventType command) override;
+  bool IsValidBuiltinCommand(HTMLElement& invoker,
+                             CommandEventType command) override;
   bool HandleCommandInternal(HTMLElement& invoker,
                              CommandEventType command) override;
 
diff --git a/third_party/blink/renderer/core/html/forms/html_input_element.idl b/third_party/blink/renderer/core/html/forms/html_input_element.idl
index 25711d47..0eea55e 100644
--- a/third_party/blink/renderer/core/html/forms/html_input_element.idl
+++ b/third_party/blink/renderer/core/html/forms/html_input_element.idl
@@ -113,5 +113,4 @@
 };
 
 HTMLInputElement includes PopoverInvokerElement;
-HTMLInputElement includes InvokerElement;
 HTMLInputElement includes InterestInvokerElement;
diff --git a/third_party/blink/renderer/core/html/forms/html_select_element.cc b/third_party/blink/renderer/core/html/forms/html_select_element.cc
index e9ef818..b8dadd8 100644
--- a/third_party/blink/renderer/core/html/forms/html_select_element.cc
+++ b/third_party/blink/renderer/core/html/forms/html_select_element.cc
@@ -1703,9 +1703,9 @@
   select_type_->ShowPicker();
 }
 
-bool HTMLSelectElement::IsValidCommand(HTMLElement& invoker,
-                                       CommandEventType command) {
-  bool parent_is_valid = HTMLElement::IsValidCommand(invoker, command);
+bool HTMLSelectElement::IsValidBuiltinCommand(HTMLElement& invoker,
+                                              CommandEventType command) {
+  bool parent_is_valid = HTMLElement::IsValidBuiltinCommand(invoker, command);
   if (!RuntimeEnabledFeatures::HTMLInvokeActionsV2Enabled()) {
     return parent_is_valid;
   }
@@ -1714,7 +1714,7 @@
 
 bool HTMLSelectElement::HandleCommandInternal(HTMLElement& invoker,
                                               CommandEventType command) {
-  CHECK(IsValidCommand(invoker, command));
+  CHECK(IsValidBuiltinCommand(invoker, command));
 
   if (HTMLElement::HandleCommandInternal(invoker, command)) {
     return true;
diff --git a/third_party/blink/renderer/core/html/forms/html_select_element.h b/third_party/blink/renderer/core/html/forms/html_select_element.h
index ea1fa5c..2adfc54 100644
--- a/third_party/blink/renderer/core/html/forms/html_select_element.h
+++ b/third_party/blink/renderer/core/html/forms/html_select_element.h
@@ -224,7 +224,8 @@
 
   bool IsRichlyEditableForAccessibility() const override { return false; }
 
-  bool IsValidCommand(HTMLElement& invoker, CommandEventType command) override;
+  bool IsValidBuiltinCommand(HTMLElement& invoker,
+                             CommandEventType command) override;
   bool HandleCommandInternal(HTMLElement& invoker,
                              CommandEventType command) override;
 
diff --git a/third_party/blink/renderer/core/html/forms/select_type.cc b/third_party/blink/renderer/core/html/forms/select_type.cc
index 084e6ffa..e2270c5 100644
--- a/third_party/blink/renderer/core/html/forms/select_type.cc
+++ b/third_party/blink/renderer/core/html/forms/select_type.cc
@@ -69,6 +69,7 @@
 #include "third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h"
 #include "third_party/blink/renderer/core/scroll/scroll_alignment.h"
 #include "third_party/blink/renderer/core/scroll/scroll_into_view_util.h"
+#include "third_party/blink/renderer/platform/runtime_enabled_features.h"
 #include "third_party/blink/renderer/platform/text/platform_locale.h"
 #include "ui/base/ui_base_features.h"
 
@@ -166,23 +167,6 @@
     }
   }
 
-  void ShowPopoverForSelectElement() {
-    if (popoverOpen()) {
-      // We can hit this case if focus is moved back to the select's invoker
-      // button and the user presses arrow keys which are supposed to show the
-      // picker.
-      return;
-    }
-    ShowPopoverInternal(/*invoker=*/nullptr, /*exception_state=*/nullptr);
-  }
-
-  void HidePopoverForSelectElement() {
-    HidePopoverInternal(
-        HidePopoverFocusBehavior::kFocusPreviousElement,
-        HidePopoverTransitionBehavior::kFireEventsAndWaitForTransitions,
-        /*exception_state=*/nullptr);
-  }
-
   InsertionNotificationRequest InsertedInto(ContainerNode& container) override {
     InsertionNotificationRequest return_value =
         HTMLDivElement::InsertedInto(container);
@@ -532,7 +516,9 @@
     popover_ = MakeGarbageCollected<PopoverElementForAppearanceBase>(doc);
     popover_->SetShadowPseudoId(shadow_element_names::kPickerSelect);
     popover_->setAttribute(html_names::kPopoverAttr, AtomicString("auto"));
-    popover_->SetInternalImplicitAnchor(select_);
+    if (!RuntimeEnabledFeatures::PopoverAnchorRelationshipsEnabled()) {
+      popover_->SetImplicitAnchor(select_);
+    }
     root.appendChild(popover_);
 
     popover_options_slot_ = MakeGarbageCollected<HTMLSlotElement>(doc);
@@ -545,7 +531,9 @@
             doc, select_);
     autofill_popover_->setAttribute(html_names::kPopoverAttr,
                                     keywords::kManual);
-    autofill_popover_->SetInternalImplicitAnchor(select_);
+    if (!RuntimeEnabledFeatures::PopoverAnchorRelationshipsEnabled()) {
+      autofill_popover_->SetImplicitAnchor(select_);
+    }
     autofill_popover_->SetShadowPseudoId(
         shadow_element_names::kSelectAutofillPreview);
     root.appendChild(autofill_popover_);
@@ -665,7 +653,7 @@
   }
 
   if (IsAppearanceBasePicker()) {
-    popover_->ShowPopoverForSelectElement();
+    popover_->ShowPopoverInternal(select_, /*exception_state=*/nullptr);
     return;
   }
 
@@ -736,7 +724,10 @@
 
 void MenuListSelectType::HidePopup() {
   if (IsAppearanceBasePicker()) {
-    popover_->HidePopoverForSelectElement();
+    popover_->HidePopoverInternal(
+        HidePopoverFocusBehavior::kFocusPreviousElement,
+        HidePopoverTransitionBehavior::kFireEventsAndWaitForTransitions,
+        /*exception_state=*/nullptr);
     return;
   }
   if (popup_)
@@ -853,7 +844,7 @@
   }
   if (IsAppearanceBaseButton()) {
     if (option) {
-      autofill_popover_->showPopover(ASSERT_NO_EXCEPTION);
+      autofill_popover_->ShowPopoverInternal(select_, &ASSERT_NO_EXCEPTION);
       autofill_popover_text_->setInnerText(option->label());
     } else {
       autofill_popover_text_->setInnerText(g_empty_string);
diff --git a/third_party/blink/renderer/core/html/html_attribute_names.json5 b/third_party/blink/renderer/core/html/html_attribute_names.json5
index 5a4a21a..eca3c967 100644
--- a/third_party/blink/renderer/core/html/html_attribute_names.json5
+++ b/third_party/blink/renderer/core/html/html_attribute_names.json5
@@ -351,6 +351,7 @@
     "topmargin",
     "translate",
     "truespeed",
+    "preciselocation",
     "privatetoken",
     "type",
     "usemap",
diff --git a/third_party/blink/renderer/core/html/html_details_element.cc b/third_party/blink/renderer/core/html/html_details_element.cc
index 90a2ea2..94114aef 100644
--- a/third_party/blink/renderer/core/html/html_details_element.cc
+++ b/third_party/blink/renderer/core/html/html_details_element.cc
@@ -352,9 +352,9 @@
   return details_to_open.size();
 }
 
-bool HTMLDetailsElement::IsValidCommand(HTMLElement& invoker,
-                                        CommandEventType command) {
-  bool parent_is_valid = HTMLElement::IsValidCommand(invoker, command);
+bool HTMLDetailsElement::IsValidBuiltinCommand(HTMLElement& invoker,
+                                               CommandEventType command) {
+  bool parent_is_valid = HTMLElement::IsValidBuiltinCommand(invoker, command);
   if (!RuntimeEnabledFeatures::HTMLInvokeActionsV2Enabled()) {
     return parent_is_valid;
   }
@@ -365,7 +365,7 @@
 
 bool HTMLDetailsElement::HandleCommandInternal(HTMLElement& invoker,
                                                CommandEventType command) {
-  CHECK(IsValidCommand(invoker, command));
+  CHECK(IsValidBuiltinCommand(invoker, command));
 
   if (HTMLElement::HandleCommandInternal(invoker, command)) {
     return true;
diff --git a/third_party/blink/renderer/core/html/html_details_element.h b/third_party/blink/renderer/core/html/html_details_element.h
index f6568cf..fd0bbae 100644
--- a/third_party/blink/renderer/core/html/html_details_element.h
+++ b/third_party/blink/renderer/core/html/html_details_element.h
@@ -48,7 +48,8 @@
   // setting the open attribute.
   static bool ExpandDetailsAncestors(const Node&);
 
-  bool IsValidCommand(HTMLElement& invoker, CommandEventType command) override;
+  bool IsValidBuiltinCommand(HTMLElement& invoker,
+                             CommandEventType command) override;
   bool HandleCommandInternal(HTMLElement& invoker,
                              CommandEventType command) override;
 
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 92c9443..a7d94cf 100644
--- a/third_party/blink/renderer/core/html/html_dialog_element.cc
+++ b/third_party/blink/renderer/core/html/html_dialog_element.cc
@@ -196,16 +196,16 @@
   }
 }
 
-bool HTMLDialogElement::IsValidCommand(HTMLElement& invoker,
-                                       CommandEventType command) {
-  return HTMLElement::IsValidCommand(invoker, command) ||
+bool HTMLDialogElement::IsValidBuiltinCommand(HTMLElement& invoker,
+                                              CommandEventType command) {
+  return HTMLElement::IsValidBuiltinCommand(invoker, command) ||
          command == CommandEventType::kShowModal ||
          command == CommandEventType::kClose;
 }
 
 bool HTMLDialogElement::HandleCommandInternal(HTMLElement& invoker,
                                               CommandEventType command) {
-  CHECK(IsValidCommand(invoker, command));
+  CHECK(IsValidBuiltinCommand(invoker, command));
 
   if (HTMLElement::HandleCommandInternal(invoker, command)) {
     return true;
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 97a9dad..a0195054 100644
--- a/third_party/blink/renderer/core/html/html_dialog_element.h
+++ b/third_party/blink/renderer/core/html/html_dialog_element.h
@@ -82,7 +82,8 @@
   // to stable with no issues.
   static void SetFocusForDialogLegacy(HTMLDialogElement* dialog);
 
-  bool IsValidCommand(HTMLElement& invoker, CommandEventType command) override;
+  bool IsValidBuiltinCommand(HTMLElement& invoker,
+                             CommandEventType command) override;
   bool HandleCommandInternal(HTMLElement& invoker,
                              CommandEventType command) override;
 
diff --git a/third_party/blink/renderer/core/html/html_element.cc b/third_party/blink/renderer/core/html/html_element.cc
index 668e6f274..ac755cc 100644
--- a/third_party/blink/renderer/core/html/html_element.cc
+++ b/third_party/blink/renderer/core/html/html_element.cc
@@ -1582,6 +1582,9 @@
   // Make the popover match `:popover-open` and remove `display:none` styling:
   GetPopoverData()->setVisibilityState(PopoverVisibilityState::kShowing);
   GetPopoverData()->setInvoker(invoker);
+  if (RuntimeEnabledFeatures::PopoverAnchorRelationshipsEnabled()) {
+    SetImplicitAnchor(invoker);
+  }
   PseudoStateChanged(CSSSelector::kPseudoPopoverOpen);
   CHECK(!original_document.AllOpenPopovers().Contains(this));
   original_document.AllOpenPopovers().insert(this);
@@ -1799,6 +1802,9 @@
 
   MarkPopoverInvokersDirty(*this);
   GetPopoverData()->setInvoker(nullptr);
+  if (RuntimeEnabledFeatures::PopoverAnchorRelationshipsEnabled()) {
+    SetImplicitAnchor(nullptr);
+  }
   // Events are only fired in the case that the popover is not being removed
   // from the document.
   if (transition_behavior ==
@@ -2023,7 +2029,9 @@
         if (!form_element) {
           return nullptr;
         }
-        auto* target_element = form_element->commandForElement();
+        auto* button_element = DynamicTo<HTMLButtonElement>(form_element);
+        auto* target_element =
+            button_element ? button_element->commandForElement() : nullptr;
 
         return target_element
                    ? DynamicTo<HTMLElement>(target_element)
@@ -2335,15 +2343,22 @@
   }
 }
 
-void HTMLElement::SetInternalImplicitAnchor(HTMLElement* element) {
-  CHECK(RuntimeEnabledFeatures::CustomizableSelectEnabled());
+void HTMLElement::SetImplicitAnchor(Element* element) {
+  CHECK(RuntimeEnabledFeatures::CustomizableSelectEnabled() ||
+        RuntimeEnabledFeatures::PopoverAnchorRelationshipsEnabled());
   CHECK(HasPopoverAttribute());
-  GetPopoverData()->setInternalImplicitAnchor(element);
+  if (auto* old_implicit_anchor =
+          GetPopoverData() ? GetPopoverData()->implicitAnchor() : nullptr) {
+    old_implicit_anchor->DecrementImplicitlyAnchoredElementCount();
+  }
+  GetPopoverData()->setImplicitAnchor(element);
+  if (element) {
+    element->IncrementImplicitlyAnchoredElementCount();
+  }
 }
 
-HTMLElement* HTMLElement::internalImplicitAnchor() const {
-  return GetPopoverData() ? GetPopoverData()->internalImplicitAnchor()
-                          : nullptr;
+Element* HTMLElement::implicitAnchor() const {
+  return GetPopoverData() ? GetPopoverData()->implicitAnchor() : nullptr;
 }
 
 bool HTMLElement::DispatchFocusEvent(
@@ -2354,9 +2369,9 @@
                                      source_capabilities);
 }
 
-bool HTMLElement::IsValidCommand(HTMLElement& invoker,
-                                 CommandEventType command) {
-  return Element::IsValidCommand(invoker, command) ||
+bool HTMLElement::IsValidBuiltinCommand(HTMLElement& invoker,
+                                        CommandEventType command) {
+  return Element::IsValidBuiltinCommand(invoker, command) ||
          command == CommandEventType::kTogglePopover ||
          command == CommandEventType::kHidePopover ||
          command == CommandEventType::kShowPopover ||
@@ -2368,7 +2383,7 @@
 
 bool HTMLElement::HandleCommandInternal(HTMLElement& invoker,
                                         CommandEventType command) {
-  CHECK(IsValidCommand(invoker, command));
+  CHECK(IsValidBuiltinCommand(invoker, command));
 
   if (Element::HandleCommandInternal(invoker, command)) {
     return true;
diff --git a/third_party/blink/renderer/core/html/html_element.h b/third_party/blink/renderer/core/html/html_element.h
index f3e26cb3d..ea6dd06 100644
--- a/third_party/blink/renderer/core/html/html_element.h
+++ b/third_party/blink/renderer/core/html/html_element.h
@@ -300,8 +300,8 @@
   void MaybeQueuePopoverHideEvent();
   static void HoveredElementChanged(Element* old_element, Element* new_element);
 
-  void SetInternalImplicitAnchor(HTMLElement* element);
-  HTMLElement* internalImplicitAnchor() const;
+  void SetImplicitAnchor(Element* element);
+  Element* implicitAnchor() const;
 
   bool DispatchFocusEvent(
       Element* old_focused_element,
@@ -319,7 +319,8 @@
   // for example a `<dialog popover>` should run `popover` invocation steps
   // before `<dialog>` invocation steps.
   // See: crbug.com/1490919, https://open-ui.org/components/invokers.explainer/
-  bool IsValidCommand(HTMLElement& invoker, CommandEventType command) override;
+  bool IsValidBuiltinCommand(HTMLElement& invoker,
+                             CommandEventType command) override;
   bool HandleCommandInternal(HTMLElement& invoker,
                              CommandEventType command) override;
 
diff --git a/third_party/blink/renderer/core/html/html_permission_element.cc b/third_party/blink/renderer/core/html/html_permission_element.cc
index 630093e..96202a3 100644
--- a/third_party/blink/renderer/core/html/html_permission_element.cc
+++ b/third_party/blink/renderer/core/html/html_permission_element.cc
@@ -138,7 +138,9 @@
 
 // Helper to get permission text resource ID for the given map which has only
 // one element.
-int GetMessageIDSinglePermission(PermissionName name, bool granted) {
+int GetMessageIDSinglePermission(PermissionName name,
+                                 bool granted,
+                                 bool is_precise_location) {
   if (name == PermissionName::VIDEO_CAPTURE) {
     return granted ? IDS_PERMISSION_REQUEST_CAMERA_ALLOWED
                    : IDS_PERMISSION_REQUEST_CAMERA;
@@ -150,6 +152,11 @@
   }
 
   if (name == PermissionName::GEOLOCATION) {
+    if (is_precise_location) {
+      // This element uses precise location.
+      return granted ? IDS_PERMISSION_REQUEST_PRECISE_GEOLOCATION_ALLOWED
+                     : IDS_PERMISSION_REQUEST_PRECISE_GEOLOCATION;
+    }
     return granted ? IDS_PERMISSION_REQUEST_GEOLOCATION_ALLOWED
                    : IDS_PERMISSION_REQUEST_GEOLOCATION;
   }
@@ -602,15 +609,10 @@
             String::Format("The permission type '%s' is not supported by the "
                            "permission element.",
                            GetType().Utf8().c_str()));
-        return;
-      case 1:
-        permission_text_span_->setInnerText(
-            GetLocale().QueryString(GetMessageIDSinglePermission(
-                permission_descriptors_[0]->name, /*granted=*/false)));
         break;
+      case 1:
       case 2:
-        permission_text_span_->setInnerText(
-            GetLocale().QueryString(IDS_PERMISSION_REQUEST_CAMERA_MICROPHONE));
+        UpdateText();
         break;
       default:
         NOTREACHED_IN_MIGRATION()
@@ -618,6 +620,17 @@
     }
   }
 
+  if (params.name == html_names::kPreciselocationAttr) {
+    // This attribute can only be set once, and can not be modified afterwards.
+    if (is_precise_location_) {
+      return;
+    }
+
+    is_precise_location_ = true;
+
+    UpdateText();
+  }
+
   HTMLElement::AttributeChanged(params);
 }
 
@@ -1170,13 +1183,29 @@
 }
 
 void HTMLPermissionElement::UpdateText() {
-  CHECK_GT(permission_status_map_.size(), 0U);
+  if (permission_status_map_.size() == 0U) {
+    // Use |permission_descriptors_| instead and assume a "not granted" state.
+    switch (permission_descriptors_.size()) {
+      case 1:
+        permission_text_span_->setInnerText(
+            GetLocale().QueryString(GetMessageIDSinglePermission(
+                permission_descriptors_[0]->name, /*granted=*/false,
+                is_precise_location_)));
+        break;
+      case 2:
+        permission_text_span_->setInnerText(
+            GetLocale().QueryString(IDS_PERMISSION_REQUEST_CAMERA_MICROPHONE));
+        break;
+    }
+    return;
+  }
+
   CHECK_LE(permission_status_map_.size(), 2u);
-  int message_id =
-      permission_status_map_.size() == 1
-          ? GetMessageIDSinglePermission(permission_status_map_.begin()->key,
-                                         permissions_granted_)
-          : GetMessageIDMultiplePermissions(permissions_granted_);
+  int message_id = permission_status_map_.size() == 1
+                       ? GetMessageIDSinglePermission(
+                             permission_status_map_.begin()->key,
+                             permissions_granted_, is_precise_location_)
+                       : GetMessageIDMultiplePermissions(permissions_granted_);
 
   CHECK(message_id);
   permission_text_span_->setInnerText(GetLocale().QueryString(message_id));
diff --git a/third_party/blink/renderer/core/html/html_permission_element.h b/third_party/blink/renderer/core/html/html_permission_element.h
index b3ab44d..3c5b2d6 100644
--- a/third_party/blink/renderer/core/html/html_permission_element.h
+++ b/third_party/blink/renderer/core/html/html_permission_element.h
@@ -127,6 +127,8 @@
                            DisableEnableClicking);
   FRIEND_TEST_ALL_PREFIXES(HTMLPemissionElementDispatchValidationEventTest,
                            DisableEnableClickingDifferentReasons);
+  FRIEND_TEST_ALL_PREFIXES(HTMLPemissionElementTestBase,
+                           SetPreciseLocationAttribute);
 
   enum class DisableReason {
     kUnknown,
@@ -480,6 +482,8 @@
 
   AtomicString type_;
 
+  bool is_precise_location_ = false;
+
   // Holds reasons for which clicking is currently disabled (if any). Each
   // entry will have an expiration time associated with it, which can be
   // |base::TimeTicks::Max()| if it's indefinite.
diff --git a/third_party/blink/renderer/core/html/html_permission_element_test.cc b/third_party/blink/renderer/core/html/html_permission_element_test.cc
index 1a9cf6d..2dd21d50 100644
--- a/third_party/blink/renderer/core/html/html_permission_element_test.cc
+++ b/third_party/blink/renderer/core/html/html_permission_element_test.cc
@@ -4,6 +4,8 @@
 
 #include "third_party/blink/renderer/core/html/html_permission_element.h"
 
+#include <optional>
+
 #include "base/run_loop.h"
 #include "base/test/run_until.h"
 #include "base/test/scoped_feature_list.h"
@@ -27,6 +29,7 @@
 #include "third_party/blink/renderer/platform/heap/garbage_collected.h"
 #include "third_party/blink/renderer/platform/testing/runtime_enabled_features_test_helpers.h"
 #include "third_party/blink/renderer/platform/testing/testing_platform_support.h"
+#include "third_party/blink/renderer/platform/wtf/text/atomic_string.h"
 
 namespace blink {
 
@@ -42,15 +45,17 @@
 
 namespace {
 
-constexpr char kCameraString[] = "Allow camera";
+constexpr char kCameraString[] = "Use camera";
 constexpr char kCameraAllowedString[] = "Camera allowed";
-constexpr char kMicrophoneString[] = "Allow microphone";
+constexpr char kMicrophoneString[] = "Use microphone";
 constexpr char kMicrophoneAllowedString[] = "Microphone allowed";
-constexpr char kGeolocationString[] = "Share location";
-constexpr char kGeolocationAllowedString[] = "Sharing location allowed";
-constexpr char kCameraMicrophoneString[] = "Allow microphone and camera";
+constexpr char kGeolocationString[] = "Use location";
+constexpr char kGeolocationAllowedString[] = "Location allowed";
+constexpr char kCameraMicrophoneString[] = "Use microphone and camera";
 constexpr char kCameraMicrophoneAllowedString[] =
     "Camera and microphone allowed";
+constexpr char kPreciseGeolocationString[] = "Use precise location";
+constexpr char kPreciseGeolocationAllowedString[] = "Precise location allowed";
 
 constexpr base::TimeDelta kDefaultTimeout = base::Milliseconds(500);
 constexpr base::TimeDelta kSmallTimeout = base::Milliseconds(50);
@@ -75,6 +80,10 @@
         return kCameraMicrophoneString;
       case IDS_PERMISSION_REQUEST_CAMERA_MICROPHONE_ALLOWED:
         return kCameraMicrophoneAllowedString;
+      case IDS_PERMISSION_REQUEST_PRECISE_GEOLOCATION:
+        return kPreciseGeolocationString;
+      case IDS_PERMISSION_REQUEST_PRECISE_GEOLOCATION_ALLOWED:
+        return kPreciseGeolocationAllowedString;
       default:
         break;
     }
@@ -120,6 +129,20 @@
   EXPECT_EQ(AtomicString("camera"), permission_element->GetType());
 }
 
+TEST_F(HTMLPemissionElementTestBase, SetPreciseLocationAttribute) {
+  auto* permission_element =
+      MakeGarbageCollected<HTMLPermissionElement>(GetDocument());
+
+  EXPECT_FALSE(permission_element->is_precise_location_);
+
+  permission_element->setAttribute(html_names::kPreciselocationAttr,
+                                   AtomicString(""));
+  EXPECT_TRUE(permission_element->is_precise_location_);
+
+  permission_element->removeAttribute(html_names::kPreciselocationAttr);
+  EXPECT_TRUE(permission_element->is_precise_location_);
+}
+
 TEST_F(HTMLPemissionElementTestBase, ParsePermissionDescriptorsFromType) {
   struct TestData {
     const char* type;
@@ -371,11 +394,17 @@
     return permission_service_.get();
   }
 
-  HTMLPermissionElement* CreatePermissionElement(const char* permission) {
+  HTMLPermissionElement* CreatePermissionElement(
+      const char* permission,
+      bool precise_location = false) {
     HTMLPermissionElement* permission_element =
         MakeGarbageCollected<HTMLPermissionElement>(GetDocument());
     permission_element->setAttribute(html_names::kTypeAttr,
                                      AtomicString(permission));
+    if (precise_location) {
+      permission_element->setAttribute(html_names::kPreciselocationAttr,
+                                       AtomicString(""));
+    }
     GetDocument().body()->AppendChild(permission_element);
     GetDocument().UpdateStyleAndLayout(DocumentUpdateReason::kTest);
     return permission_element;
@@ -459,15 +488,22 @@
   const struct {
     const char* type;
     String expected_text;
+    bool precise_location = false;
   } kTestData[] = {{"geolocation", kGeolocationString},
                    {"microphone", kMicrophoneString},
                    {"camera", kCameraString},
-                   {"camera microphone", kCameraMicrophoneString}};
+                   {"camera microphone", kCameraMicrophoneString},
+                   {"geolocation", kPreciseGeolocationString, true},
+                   {"geolocation", kGeolocationString, false}};
   for (const auto& data : kTestData) {
     auto* permission_element =
         MakeGarbageCollected<HTMLPermissionElement>(GetDocument());
     permission_element->setAttribute(html_names::kTypeAttr,
                                      AtomicString(data.type));
+    if (data.precise_location) {
+      permission_element->setAttribute(html_names::kPreciselocationAttr,
+                                       AtomicString(""));
+    }
     EXPECT_EQ(
         data.expected_text,
         permission_element->permission_text_span_for_testing()->innerText());
@@ -497,6 +533,7 @@
     const char* type;
     MojoPermissionStatus status;
     String expected_text;
+    bool precise_location = false;
   } kTestData[] = {
       {"geolocation", MojoPermissionStatus::ASK, kGeolocationString},
       {"microphone", MojoPermissionStatus::ASK, kMicrophoneString},
@@ -506,9 +543,21 @@
       {"camera", MojoPermissionStatus::DENIED, kCameraString},
       {"geolocation", MojoPermissionStatus::GRANTED, kGeolocationAllowedString},
       {"microphone", MojoPermissionStatus::GRANTED, kMicrophoneAllowedString},
-      {"camera", MojoPermissionStatus::GRANTED, kCameraAllowedString}};
+      {"camera", MojoPermissionStatus::GRANTED, kCameraAllowedString},
+      {"geolocation", MojoPermissionStatus::ASK, kPreciseGeolocationString,
+       true},
+      {"geolocation", MojoPermissionStatus::DENIED, kPreciseGeolocationString,
+       true},
+      {"geolocation", MojoPermissionStatus::GRANTED,
+       kPreciseGeolocationAllowedString, true},
+
+      // Only affects geolocation.
+      {"camera", MojoPermissionStatus::GRANTED, kCameraAllowedString, true},
+      {"microphone", MojoPermissionStatus::ASK, kMicrophoneString, true},
+  };
   for (const auto& data : kTestData) {
-    auto* permission_element = CreatePermissionElement(data.type);
+    auto* permission_element =
+        CreatePermissionElement(data.type, data.precise_location);
     permission_service()->set_initial_statuses({data.status});
     RegistrationWaiter(permission_element).Wait();
     EXPECT_EQ(
@@ -560,26 +609,35 @@
     PermissionName name;
     MojoPermissionStatus status;
     String expected_text;
-  } kTestData[] = {{"geolocation", PermissionName::GEOLOCATION,
-                    MojoPermissionStatus::ASK, kGeolocationString},
-                   {"microphone", PermissionName::AUDIO_CAPTURE,
-                    MojoPermissionStatus::ASK, kMicrophoneString},
-                   {"camera", PermissionName::VIDEO_CAPTURE,
-                    MojoPermissionStatus::ASK, kCameraString},
-                   {"geolocation", PermissionName::GEOLOCATION,
-                    MojoPermissionStatus::DENIED, kGeolocationString},
-                   {"microphone", PermissionName::AUDIO_CAPTURE,
-                    MojoPermissionStatus::DENIED, kMicrophoneString},
-                   {"camera", PermissionName::VIDEO_CAPTURE,
-                    MojoPermissionStatus::DENIED, kCameraString},
-                   {"geolocation", PermissionName::GEOLOCATION,
-                    MojoPermissionStatus::GRANTED, kGeolocationAllowedString},
-                   {"microphone", PermissionName::AUDIO_CAPTURE,
-                    MojoPermissionStatus::GRANTED, kMicrophoneAllowedString},
-                   {"camera", PermissionName::VIDEO_CAPTURE,
-                    MojoPermissionStatus::GRANTED, kCameraAllowedString}};
+    bool precise_location = false;
+  } kTestData[] = {
+      {"geolocation", PermissionName::GEOLOCATION, MojoPermissionStatus::ASK,
+       kGeolocationString},
+      {"microphone", PermissionName::AUDIO_CAPTURE, MojoPermissionStatus::ASK,
+       kMicrophoneString},
+      {"camera", PermissionName::VIDEO_CAPTURE, MojoPermissionStatus::ASK,
+       kCameraString},
+      {"geolocation", PermissionName::GEOLOCATION, MojoPermissionStatus::DENIED,
+       kGeolocationString},
+      {"microphone", PermissionName::AUDIO_CAPTURE,
+       MojoPermissionStatus::DENIED, kMicrophoneString},
+      {"camera", PermissionName::VIDEO_CAPTURE, MojoPermissionStatus::DENIED,
+       kCameraString},
+      {"geolocation", PermissionName::GEOLOCATION,
+       MojoPermissionStatus::GRANTED, kGeolocationAllowedString},
+      {"microphone", PermissionName::AUDIO_CAPTURE,
+       MojoPermissionStatus::GRANTED, kMicrophoneAllowedString},
+      {"camera", PermissionName::VIDEO_CAPTURE, MojoPermissionStatus::GRANTED,
+       kCameraAllowedString},
+      {"geolocation", PermissionName::GEOLOCATION, MojoPermissionStatus::ASK,
+       kPreciseGeolocationString, true},
+      {"geolocation", PermissionName::GEOLOCATION, MojoPermissionStatus::DENIED,
+       kPreciseGeolocationString, true},
+      {"geolocation", PermissionName::GEOLOCATION,
+       MojoPermissionStatus::GRANTED, kPreciseGeolocationAllowedString, true}};
   for (const auto& data : kTestData) {
-    auto* permission_element = CreatePermissionElement(data.type);
+    auto* permission_element =
+        CreatePermissionElement(data.type, data.precise_location);
     permission_service()->WaitForPermissionObserverAdded();
     permission_service()->NotifyPermissionStatusChange(data.name, data.status);
     EXPECT_EQ(
@@ -692,12 +750,18 @@
     return permission_service_.get();
   }
 
-  HTMLPermissionElement* CreatePermissionElement(Document& document,
-                                                 const char* permission) {
+  HTMLPermissionElement* CreatePermissionElement(
+      Document& document,
+      const char* permission,
+      std::optional<const char*> precise_location = std::nullopt) {
     HTMLPermissionElement* permission_element =
         MakeGarbageCollected<HTMLPermissionElement>(document);
     permission_element->setAttribute(html_names::kTypeAttr,
                                      AtomicString(permission));
+    if (precise_location.has_value()) {
+      permission_element->setAttribute(html_names::kPreciselocationAttr,
+                                       AtomicString(precise_location.value()));
+    }
     document.body()->AppendChild(permission_element);
     document.UpdateStyleAndLayout(DocumentUpdateReason::kTest);
     return permission_element;
diff --git a/third_party/blink/renderer/core/html/keywords.json5 b/third_party/blink/renderer/core/html/keywords.json5
index f0f5d4d..fb0624cc 100644
--- a/third_party/blink/renderer/core/html/keywords.json5
+++ b/third_party/blink/renderer/core/html/keywords.json5
@@ -67,34 +67,34 @@
     "static",
     "invisible",
 
-    // invokeaction attribute
+    // command attribute
     // https://open-ui.org/components/invokers.explainer/
     "auto",
     // invokeaction for popovers
-    "togglePopover",
-    "hidePopover",
-    "showPopover",
+    "toggle-popover",
+    "hide-popover",
+    "show-popover",
     // invokeaction for dialog
-    "showModal",
+    "show-modal",
     "close",
     // invokeaction for details
     "toggle",
     "close",
     "open",
     // invokeaction for input and select
-    "showPicker",
+    "show-picker",
     // invokeaction for number input
-    "stepUp",
-    "stepDown",
+    "step-up",
+    "step-down",
     // invokeaction for fullscreen
-    "toggleFullscreen",
-    "requestFullscreen",
-    "exitFullscreen",
+    "toggle-fullscreen",
+    "request-fullscreen",
+    "exit-fullscreen",
     // invokeaction for audio and video
-    "playpause",
+    "play-pause",
     "pause",
     "play",
-    "toggleMuted",
+    "toggle-muted",
 
     // loading attribute
     // https://github.com/scott-little/lazyload#ways-the-loading-attribute-can-be-used
diff --git a/third_party/blink/renderer/core/html/media/html_media_element.cc b/third_party/blink/renderer/core/html/media/html_media_element.cc
index 20cca993..0ba1a7a2 100644
--- a/third_party/blink/renderer/core/html/media/html_media_element.cc
+++ b/third_party/blink/renderer/core/html/media/html_media_element.cc
@@ -1432,14 +1432,14 @@
                           : GetDocument().GetFrame();
 }
 
-bool HTMLMediaElement::IsValidCommand(HTMLElement& invoker,
-                                      CommandEventType command) {
+bool HTMLMediaElement::IsValidBuiltinCommand(HTMLElement& invoker,
+                                             CommandEventType command) {
   if (!RuntimeEnabledFeatures::HTMLInvokeActionsV2Enabled()) {
-    return HTMLElement::IsValidCommand(invoker, command);
+    return HTMLElement::IsValidBuiltinCommand(invoker, command);
   }
 
-  return HTMLElement::IsValidCommand(invoker, command) ||
-         command == CommandEventType::kPlaypause ||
+  return HTMLElement::IsValidBuiltinCommand(invoker, command) ||
+         command == CommandEventType::kPlayPause ||
          command == CommandEventType::kPause ||
          command == CommandEventType::kPlay ||
          command == CommandEventType::kToggleMuted;
@@ -1447,7 +1447,7 @@
 
 bool HTMLMediaElement::HandleCommandInternal(HTMLElement& invoker,
                                              CommandEventType command) {
-  CHECK(IsValidCommand(invoker, command));
+  CHECK(IsValidBuiltinCommand(invoker, command));
 
   if (HTMLElement::HandleCommandInternal(invoker, command)) {
     return true;
@@ -1456,7 +1456,7 @@
   Document& document = GetDocument();
   LocalFrame* frame = document.GetFrame();
 
-  if (command == CommandEventType::kPlaypause) {
+  if (command == CommandEventType::kPlayPause) {
     if (paused_) {
       if (LocalFrame::HasTransientUserActivation(frame)) {
         Play();
diff --git a/third_party/blink/renderer/core/html/media/html_media_element.h b/third_party/blink/renderer/core/html/media/html_media_element.h
index 380f6f58d..1c4d4653 100644
--- a/third_party/blink/renderer/core/html/media/html_media_element.h
+++ b/third_party/blink/renderer/core/html/media/html_media_element.h
@@ -413,7 +413,8 @@
   // reason while in picture in picture mode.
   LocalFrame* LocalFrameForPlayer();
 
-  bool IsValidCommand(HTMLElement& invoker, CommandEventType command) override;
+  bool IsValidBuiltinCommand(HTMLElement& invoker,
+                             CommandEventType command) override;
   bool HandleCommandInternal(HTMLElement& invoker,
                              CommandEventType command) override;
 
diff --git a/third_party/blink/renderer/core/inspector/inspector_highlight.cc b/third_party/blink/renderer/core/inspector/inspector_highlight.cc
index 4e2de68c..c52e845a 100644
--- a/third_party/blink/renderer/core/inspector/inspector_highlight.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_highlight.cc
@@ -1838,7 +1838,6 @@
 void InspectorHighlight::VisitAndCollectDistanceInfo(
     PseudoId pseudo_id,
     LayoutObject* layout_object) {
-  protocol::DOM::PseudoType pseudo_type;
   if (pseudo_id == kPseudoIdNone)
     return;
   for (LayoutObject* child = layout_object->SlowFirstChild(); child;
diff --git a/third_party/blink/renderer/core/layout/multi_column_fragmentainer_group_test.cc b/third_party/blink/renderer/core/layout/multi_column_fragmentainer_group_test.cc
index cf2fed3..c62c8806 100644
--- a/third_party/blink/renderer/core/layout/multi_column_fragmentainer_group_test.cc
+++ b/third_party/blink/renderer/core/layout/multi_column_fragmentainer_group_test.cc
@@ -110,7 +110,6 @@
   for (int i = 0; i < 100; i++)
     builder.Append("line<br>");
   builder.Append("</div>");
-  String html;
   SetBodyInnerHTML(builder.ToString());
   const auto* multicol = GetLayoutObjectByElementId("multicol");
   ASSERT_TRUE(multicol);
@@ -141,7 +140,6 @@
   for (int i = 0; i < 1000; i++)
     builder.Append("<div><div><div>line</div></div></div>");
   builder.Append("</div>");
-  String html;
   SetBodyInnerHTML(builder.ToString());
   const auto* multicol = GetLayoutObjectByElementId("multicol");
   ASSERT_TRUE(multicol);
@@ -172,7 +170,6 @@
   for (int i = 0; i < 100; i++)
     builder.Append("line<br>");
   builder.Append("</div></div></div></div>");
-  String html;
   SetBodyInnerHTML(builder.ToString());
   const auto* multicol = GetLayoutObjectByElementId("multicol");
   ASSERT_TRUE(multicol);
diff --git a/third_party/blink/renderer/core/layout/scroll_anchor_test.cc b/third_party/blink/renderer/core/layout/scroll_anchor_test.cc
index 843c7653..6df999d 100644
--- a/third_party/blink/renderer/core/layout/scroll_anchor_test.cc
+++ b/third_party/blink/renderer/core/layout/scroll_anchor_test.cc
@@ -925,8 +925,7 @@
   SetHeight(GetDocument().getElementById(AtomicString("block1")), 200);
   EXPECT_EQ(LayoutViewport()->ScrollOffsetInt().y(), 200);
 
-  SerializedAnchor serialized =
-      GetScrollAnchor(LayoutViewport()).GetSerializedAnchor();
+  GetScrollAnchor(LayoutViewport()).GetSerializedAnchor();
   ValidateSerializedAnchor("html>body>code", LayoutPoint(0, 0));
 }
 
diff --git a/third_party/blink/renderer/core/testing/origin_trials_test.cc b/third_party/blink/renderer/core/testing/origin_trials_test.cc
index e9b13530..c0f3f335 100644
--- a/third_party/blink/renderer/core/testing/origin_trials_test.cc
+++ b/third_party/blink/renderer/core/testing/origin_trials_test.cc
@@ -16,7 +16,6 @@
 
 bool OriginTrialsTest::throwingAttribute(ScriptState* script_state,
                                          ExceptionState& exception_state) {
-  String error_message;
   if (!RuntimeEnabledFeatures::OriginTrialsSampleAPIEnabled(
           ExecutionContext::From(script_state))) {
     exception_state.ThrowDOMException(
diff --git a/third_party/blink/renderer/modules/accessibility/ax_image_map_link.cc b/third_party/blink/renderer/modules/accessibility/ax_image_map_link.cc
index ffbef70..17a0f89 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_image_map_link.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_image_map_link.cc
@@ -28,7 +28,6 @@
 
 #include "third_party/blink/renderer/modules/accessibility/ax_image_map_link.h"
 
-#include "third_party/blink/renderer/core/aom/accessible_node.h"
 #include "third_party/blink/renderer/core/dom/element_traversal.h"
 #include "third_party/blink/renderer/core/html/html_image_element.h"
 #include "third_party/blink/renderer/core/html/html_map_element.h"
diff --git a/third_party/blink/renderer/modules/accessibility/ax_node_object.cc b/third_party/blink/renderer/modules/accessibility/ax_node_object.cc
index 036d88a..3099105 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_node_object.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_node_object.cc
@@ -45,7 +45,6 @@
 #include "third_party/blink/public/mojom/frame/user_activation_notification_type.mojom-blink.h"
 #include "third_party/blink/public/strings/grit/blink_strings.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_image_bitmap_options.h"
-#include "third_party/blink/renderer/core/aom/accessible_node.h"
 #include "third_party/blink/renderer/core/css/counter_style_map.h"
 #include "third_party/blink/renderer/core/css/css_resolution_units.h"
 #include "third_party/blink/renderer/core/css/properties/longhands.h"
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object.cc b/third_party/blink/renderer/modules/accessibility/ax_object.cc
index 0b053c2e..1e9838c 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_object.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_object.cc
@@ -45,7 +45,6 @@
 #include "third_party/blink/public/mojom/scroll/scroll_into_view_params.mojom-blink.h"
 #include "third_party/blink/renderer/core/accessibility/ax_object_cache.h"
 #include "third_party/blink/renderer/core/accessibility/axid.h"
-#include "third_party/blink/renderer/core/aom/accessible_node.h"
 #include "third_party/blink/renderer/core/css/resolver/style_resolver.h"
 #include "third_party/blink/renderer/core/display_lock/display_lock_utilities.h"
 #include "third_party/blink/renderer/core/dom/dom_node_ids.h"
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc
index db1f4d5..9d33ceb 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc
@@ -43,7 +43,6 @@
 #include "third_party/blink/public/web/web_local_frame_client.h"
 #include "third_party/blink/public/web/web_plugin_container.h"
 #include "third_party/blink/renderer/core/accessibility/scoped_blink_ax_event_intent.h"
-#include "third_party/blink/renderer/core/aom/accessible_node.h"
 #include "third_party/blink/renderer/core/display_lock/display_lock_utilities.h"
 #include "third_party/blink/renderer/core/dom/document.h"
 #include "third_party/blink/renderer/core/dom/document_lifecycle.h"
diff --git a/third_party/blink/renderer/modules/accessibility/ax_progress_indicator.cc b/third_party/blink/renderer/modules/accessibility/ax_progress_indicator.cc
index edf41879..b0e2d3f 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_progress_indicator.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_progress_indicator.cc
@@ -20,7 +20,6 @@
 
 #include "third_party/blink/renderer/modules/accessibility/ax_progress_indicator.h"
 
-#include "third_party/blink/renderer/core/aom/accessible_node.h"
 #include "third_party/blink/renderer/core/html/html_progress_element.h"
 #include "third_party/blink/renderer/core/layout/layout_object.h"
 #include "third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h"
diff --git a/third_party/blink/renderer/modules/accessibility/ax_relation_cache.cc b/third_party/blink/renderer/modules/accessibility/ax_relation_cache.cc
index 0ab2606..c646c9b 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_relation_cache.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_relation_cache.cc
@@ -5,7 +5,6 @@
 #include "third_party/blink/renderer/modules/accessibility/ax_relation_cache.h"
 
 #include "base/memory/ptr_util.h"
-#include "third_party/blink/renderer/core/aom/accessible_node.h"
 #include "third_party/blink/renderer/core/dom/dom_node_ids.h"
 #include "third_party/blink/renderer/core/dom/shadow_including_tree_order_traversal.h"
 #include "third_party/blink/renderer/core/html/forms/html_label_element.h"
@@ -112,6 +111,9 @@
   }
   CheckElementWasProcessed(element);
 
+  // TODO(crbug.com/41469336): Track reverse relations set via explicitly
+  // set attr-elements on element or element internals.
+
   // Check aria-owns.
   Vector<AtomicString> owns_ids;
   IdsFromAttribute(element, owns_ids, html_names::kAriaOwnsAttr);
@@ -143,9 +145,8 @@
   }
 
   // Check aria-activedescendant.
-  if (auto activedescendant_id =
-          AccessibleNode::GetPropertyOrARIAAttributeValue(
-              &element, AOMRelationProperty::kActiveDescendant)) {
+  if (auto& activedescendant_id = AXObject::AriaAttribute(
+          element, html_names::kAriaActivedescendantAttr)) {
     DCHECK(id_attr_to_active_descendant_mapping_.Contains(activedescendant_id))
         << element << " with aria-activedescendant=" << activedescendant_id
         << " and DOMNodeId=" << DOMNodeIds::ExistingIdForNode(&element)
@@ -290,7 +291,8 @@
 }
 
 // Update reverse relation map, where relation_source is related to target_ids.
-// TODO Support when HasExplicitlySetAttrAssociatedElement() == true.
+// TODO(crbug.com/41469336): Track reverse relations set via explicitly set
+// attr-elements on element or element internals.
 void AXRelationCache::UpdateReverseRelations(
     HashMap<AtomicString, HashSet<DOMNodeId>>& id_attr_to_node_map,
     Node* relation_source,
@@ -308,6 +310,8 @@
                              GetTextRelationIds(relation_source));
 }
 
+// TODO(crbug.com/41469336): Track reverse relations set via explicitly set
+// attr-elements on element or element internals.
 void AXRelationCache::UpdateReverseTextRelations(
     Element& relation_source,
     const QualifiedName& attr_name) {
@@ -334,6 +338,8 @@
   }
 }
 
+// TODO(crbug.com/41469336): Track reverse relations set via explicitly set
+// attr-elements on element or element internals.
 void AXRelationCache::UpdateReverseTextRelations(
     Element& relation_source,
     const Vector<AtomicString>& target_ids) {
@@ -374,8 +380,8 @@
 
 void AXRelationCache::UpdateReverseActiveDescendantRelations(
     Element& relation_source) {
-  const AtomicString& id = AccessibleNode::GetPropertyOrARIAAttributeValue(
-      &relation_source, AOMRelationProperty::kActiveDescendant);
+  const AtomicString& id = AXObject::AriaAttribute(
+      relation_source, html_names::kAriaActivedescendantAttr);
   if (!id) {
     return;
   }
diff --git a/third_party/blink/renderer/modules/accessibility/inspector_accessibility_agent.cc b/third_party/blink/renderer/modules/accessibility/inspector_accessibility_agent.cc
index 117d679..6f2498a 100644
--- a/third_party/blink/renderer/modules/accessibility/inspector_accessibility_agent.cc
+++ b/third_party/blink/renderer/modules/accessibility/inspector_accessibility_agent.cc
@@ -7,7 +7,6 @@
 #include <memory>
 
 #include "third_party/blink/renderer/core/accessibility/ax_object_cache.h"
-#include "third_party/blink/renderer/core/aom/accessible_node.h"
 #include "third_party/blink/renderer/core/dom/dom_node_ids.h"
 #include "third_party/blink/renderer/core/dom/element.h"
 #include "third_party/blink/renderer/core/dom/flat_tree_traversal.h"
diff --git a/third_party/blink/tools/blinkpy/w3c/buganizer.py b/third_party/blink/tools/blinkpy/w3c/buganizer.py
index a82dd1f14..8b724aa 100644
--- a/third_party/blink/tools/blinkpy/w3c/buganizer.py
+++ b/third_party/blink/tools/blinkpy/w3c/buganizer.py
@@ -218,11 +218,17 @@
                 'error: %s', str(e))
             return {'error': str(e)}
 
-    def NewComment(self, issue_id: IssueID, comment: str):
+    def NewComment(self,
+                   issue_id: IssueID,
+                   comment: str,
+                   use_markdown: bool = False):
         """Makes a request to the issue tracker to add a comment."""
         new_comment_request = {'issueComment': {'comment': comment}}
+        if use_markdown:
+            new_comment_request['issueComment']['formattingMode'] = 'MARKDOWN'
         request = self._service.issues().modify(issueId=str(
-            self._ResolveID(issue_id)), body=new_comment_request)
+            self._ResolveID(issue_id)),
+                                                body=new_comment_request)
         try:
             return self._ExecuteRequest(request)
         except Exception as e:
diff --git a/third_party/blink/web_tests/VirtualTestSuites b/third_party/blink/web_tests/VirtualTestSuites
index af7d304..1da6937 100644
--- a/third_party/blink/web_tests/VirtualTestSuites
+++ b/third_party/blink/web_tests/VirtualTestSuites
@@ -1468,7 +1468,10 @@
     "prefix": "popover-anchor-relationships-disabled",
     "owners": ["masonf@chromium.org"],
     "platforms": ["Linux"],
-    "bases": ["external/wpt/html/semantics/popovers"],
+    "bases": [
+      "external/wpt/html/semantics/popovers",
+      "external/wpt/html/semantics/forms/the-select-element/customizable-select"
+    ],
     "args": ["--disable-blink-features=PopoverAnchorRelationships"],
     "expires": "Jun 1, 2025"
   },
diff --git a/third_party/blink/web_tests/external/wpt/css/css-anchor-position/popover-implicit-anchor.tentative.html b/third_party/blink/web_tests/external/wpt/css/css-anchor-position/popover-implicit-anchor.tentative.html
new file mode 100644
index 0000000..b6bba45
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-anchor-position/popover-implicit-anchor.tentative.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<title>Popover invokers form an implicit anchor reference</title>
+<link rel="author" href="mailto:masonf@chromium.org">
+<link rel="help" href="https://www.w3.org/TR/css-anchor-position-1/#implicit">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-actions.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/html/semantics/popovers/resources/popover-utils.js"></script>
+
+<button id=button popovertarget=popover>Button</button>
+<div popover id=popover>Popover</div>
+
+<style>
+#button {
+  position:relative;
+  top:100px;
+  left:100px;
+}
+#popover {
+  border:1px solid black;
+  inset: auto;
+  margin:0;
+  padding:0;
+  position-area: top left;
+}
+body { margin: 0; }
+</style>
+
+<script>
+promise_test(async (t) => {
+  assert_false(popover.matches(':popover-open'));
+  await clickOn(button);
+  assert_true(popover.matches(':popover-open'));
+  // Popover should be anchored to the button.
+  assert_equals(popover.offsetLeft + popover.offsetWidth, 100);
+  assert_equals(popover.offsetTop + popover.offsetHeight, 100);
+}, 'Popover invokers form an implicit anchor reference');
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-select-element/customizable-select/select-inside-top-layer.tentative.html b/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-select-element/customizable-select/select-inside-top-layer.tentative.html
new file mode 100644
index 0000000..6d70f3a
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-select-element/customizable-select/select-inside-top-layer.tentative.html
@@ -0,0 +1,92 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>appearance:base select nested inside top layer elements</title>
+<link rel=author href="mailto:masonf@chromium.org">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/resources/testdriver-actions.js"></script>
+<script src="../../../popovers/resources/popover-utils.js"></script>
+
+<div id=popover1 popover>popover1
+  <select id=select1>
+    <option>option</option>
+    <option>option
+      <div popover id=popover2>popover2</div>
+    </option>
+  </select>
+</div>
+
+<dialog id=dialog1>dialog1
+  <select id=select2>
+    <option>option</option>
+    <option>option
+      <dialog id=dialog2>dialog2</dialog>
+    </option>
+  </select>
+</dialog>
+
+<style>
+  select, ::picker(select) {
+    appearance: base-select;
+  }
+</style>
+
+<script>
+promise_test(async (t) => {
+  const popover = document.querySelector('#popover1');
+  const select = document.querySelector('#select1');
+  assert_true(!!popover && !!select,'precondition');
+  t.add_cleanup(() => popover.hidePopover());
+
+  popover.showPopover();
+  assert_true(popover.matches(':popover-open'));
+  await clickOn(select);
+  assert_true(select.matches(':open'),'the select should be showing');
+  assert_true(popover.matches(':popover-open'),'and the popover should also still be showing');
+},'select can be nested inside a popover');
+
+promise_test(async (t) => {
+  const popover1 = document.querySelector('#popover1');
+  const popover2 = document.querySelector('#popover2');
+  const select = document.querySelector('#select1');
+  assert_true(!!popover1 && !!popover2 && !!select,'precondition');
+  t.add_cleanup(() => popover1.hidePopover());
+
+  popover1.showPopover();
+  await clickOn(select);
+  popover2.showPopover();
+  assert_true(select.matches(':open'),'the select should be showing');
+  assert_true(popover1.matches(':popover-open'),'and the outer popover should also still be showing');
+  assert_true(popover2.matches(':popover-open'),'and the inner popover should also still be showing');
+},'a popover can be nested inside select');
+
+promise_test(async (t) => {
+  const dialog = document.querySelector('#dialog1');
+  const select = document.querySelector('#select2');
+  assert_true(!!dialog && !!select,'precondition');
+  t.add_cleanup(() => dialog.close());
+
+  dialog.showModal();
+  assert_true(dialog.matches('[open]:modal'));
+  await clickOn(select);
+  assert_true(select.matches(':open'),'the select should be showing');
+  assert_true(dialog.matches('[open]:modal'),'and the dialog should also still be showing');
+},'select can be nested inside a modal dialog');
+
+promise_test(async (t) => {
+  const dialog1 = document.querySelector('#dialog1');
+  const dialog2 = document.querySelector('#dialog2');
+  const select = document.querySelector('#select2');
+  assert_true(!!dialog1 && dialog2 && !!select,'precondition');
+  t.add_cleanup(() => {dialog1.close();dialog2.close()});
+
+  dialog1.showModal();
+  await clickOn(select);
+  dialog2.showModal();
+  assert_true(select.matches(':open'),'the select should be showing');
+  assert_true(dialog1.matches('[open]:modal'),'and the outer dialog should also still be showing');
+  assert_true(dialog2.matches('[open]:modal'),'and the inner dialog should also still be showing');
+},'a modal dialog can be nested inside select');
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/invokers/interesttarget-on-popover-behavior.tentative.html b/third_party/blink/web_tests/external/wpt/html/semantics/invokers/interesttarget-on-popover-behavior.tentative.html
index b930fc6..fd0a77b9 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/invokers/interesttarget-on-popover-behavior.tentative.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/invokers/interesttarget-on-popover-behavior.tentative.html
@@ -71,7 +71,7 @@
   promise_test(async function (t) {
     t.add_cleanup(reset);
     assert_false(interestee.matches(":popover-open"));
-    interestbutton.setAttribute("interestaction", "togglepopover");
+    interestbutton.setAttribute("interestaction", "toggle-popover");
     await hoverOver(interestbutton);
     assert_true(interestee.matches(":popover-open"));
   }, "hover interest invoking (as togglepopover) closed popover opens");
@@ -80,7 +80,7 @@
     t.add_cleanup(reset);
     interestee.showPopover();
     assert_true(interestee.matches(":popover-open"));
-    interestbutton.setAttribute("interestaction", "togglepopover");
+    interestbutton.setAttribute("interestaction", "toggle-popover");
     await hoverOver(interestbutton);
     assert_false(interestee.matches(":popover-open"));
   }, "hover interest invoking (as togglepopover) open popover closes");
@@ -88,7 +88,7 @@
   promise_test(async function (t) {
     t.add_cleanup(reset);
     assert_false(interestee.matches(":popover-open"));
-    interestbutton.setAttribute("interestaction", "togglepopover");
+    interestbutton.setAttribute("interestaction", "toggle-popover");
     interestbutton.focus();
     assert_true(interestee.matches(":popover-open"));
   }, "focus interest invoking (as togglepopover) closed popover opens");
@@ -97,7 +97,7 @@
     t.add_cleanup(reset);
     interestee.showPopover();
     assert_true(interestee.matches(":popover-open"));
-    interestbutton.setAttribute("interestaction", "togglepopover");
+    interestbutton.setAttribute("interestaction", "toggle-popover");
     interestbutton.focus();
     assert_false(interestee.matches(":popover-open"));
   }, "focus interest invoking (as togglepopover) open popover closes");
@@ -105,7 +105,7 @@
   promise_test(async function (t) {
     t.add_cleanup(reset);
     assert_false(interestee.matches(":popover-open"));
-    interestbutton.setAttribute("interestaction", "tOgGlEpOpOvEr");
+    interestbutton.setAttribute("interestaction", "tOgGlE-pOpOvEr");
     interestbutton.focus();
     assert_true(interestee.matches(":popover-open"));
   }, "interest invoking (as togglepopover - case insensitive) closed popover opens");
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/invokers/invokeevent-dispatch-shadow.tentative.html b/third_party/blink/web_tests/external/wpt/html/semantics/invokers/invokeevent-dispatch-shadow.tentative.html
index fb2a113..9d9b992 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/invokers/invokeevent-dispatch-shadow.tentative.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/invokers/invokeevent-dispatch-shadow.tentative.html
@@ -20,16 +20,16 @@
     const slot = shadow.appendChild(document.createElement("slot"));
     let childEvent = null;
     let childEventTarget = null;
-    let childEventInvoker = null;
+    let childEventSource = null;
     let hostEvent = null;
     let hostEventTarget = null;
-    let hostEventInvoker = null;
+    let hostEventSource = null;
     slot.addEventListener(
       "command",
       (e) => {
         childEvent = e;
         childEventTarget = e.target;
-        childEventInvoker = e.invoker;
+        childEventSource = e.source;
       },
       { once: true },
     );
@@ -38,13 +38,13 @@
       (e) => {
         hostEvent = e;
         hostEventTarget = e.target;
-        hostEventInvoker = e.invoker;
+        hostEventSource = e.source;
       },
       { once: true },
     );
     const event = new CommandEvent("command", {
       bubbles: true,
-      invoker: slot,
+      source: slot,
       composed: true,
     });
     slot.dispatchEvent(event);
@@ -55,9 +55,9 @@
       "target is child inside shadow boundary",
     );
     assert_equals(
-      childEventInvoker,
+      childEventSource,
       slot,
-      "invoker is child inside shadow boundary",
+      "source is child inside shadow boundary",
     );
     assert_equals(
       hostEvent,
@@ -70,11 +70,11 @@
       "target is retargeted to shadowroot host",
     );
     assert_equals(
-      hostEventInvoker,
+      hostEventSource,
       host,
-      "invoker is retargeted to shadowroot host",
+      "source is retargeted to shadowroot host",
     );
-  }, "CommandEvent propagates across shadow boundaries retargeting invoker");
+  }, "CommandEvent propagates across shadow boundaries retargeting source");
 
   test(function (t) {
     const host = document.createElement("div");
@@ -84,22 +84,22 @@
     const button = shadow.appendChild(document.createElement("button"));
     const invokee = host.appendChild(document.createElement("div"));
     button.commandForElement = invokee;
-    button.command = 'test-command';
+    button.command = '--test-command';
     let event = null;
     let eventTarget = null;
-    let eventInvoker = null;
+    let eventSource = null;
     invokee.addEventListener(
       "command",
       (e) => {
         event = e;
         eventTarget = e.target;
-        eventInvoker = e.invoker;
+        eventSource = e.source;
       },
       { once: true },
     );
     button.click();
     assert_true(event instanceof CommandEvent);
     assert_equals(eventTarget, invokee, "target is invokee");
-    assert_equals(eventInvoker, host, "invoker is host");
-  }, "cross shadow CommandEvent retargets invoker to host element");
+    assert_equals(eventSource, host, "source is host");
+  }, "cross shadow CommandEvent retargets source to host element");
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/invokers/invokeevent-interface.tentative.html b/third_party/blink/web_tests/external/wpt/html/semantics/invokers/invokeevent-interface.tentative.html
index 500c05f..cc2b5c9 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/invokers/invokeevent-interface.tentative.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/invokers/invokeevent-interface.tentative.html
@@ -21,9 +21,9 @@
 
   test(function () {
     const event = new CommandEvent("test");
-    assert_equals(event.invoker, null);
-    assert_readonly(event, "invoker", "readonly attribute value");
-  }, "invoker is readonly defaulting to null");
+    assert_equals(event.source, null);
+    assert_readonly(event, "source", "readonly attribute value");
+  }, "source is readonly defaulting to null");
 
   test(function () {
     const event = new CommandEvent("test", { command: "sAmPle" });
@@ -87,80 +87,80 @@
   }, "command set to an object with a toString function");
 
   test(function () {
-    const eventInit = { command: "sample", invoker: document.body };
+    const eventInit = { command: "sample", source: document.body };
     const event = new CommandEvent("test", eventInit);
     assert_equals(event.command, "sample");
-    assert_equals(event.invoker, document.body);
+    assert_equals(event.source, document.body);
   }, "CommandEventInit properties set value");
 
   test(function () {
     const eventInit = {
       command: "open",
-      invoker: document.getElementById("div"),
+      source: document.getElementById("div"),
     };
     const event = new CommandEvent("beforetoggle", eventInit);
     assert_equals(event.command, "open");
-    assert_equals(event.invoker, document.getElementById("div"));
+    assert_equals(event.source, document.getElementById("div"));
   }, "CommandEventInit properties set value 2");
 
   test(function () {
     const eventInit = {
       command: "closed",
-      invoker: document.getElementById("button"),
+      source: document.getElementById("button"),
     };
     const event = new CommandEvent("toggle", eventInit);
     assert_equals(event.command, "closed");
-    assert_equals(event.invoker, document.getElementById("button"));
+    assert_equals(event.source, document.getElementById("button"));
   }, "CommandEventInit properties set value 3");
 
   test(function () {
-    const event = new CommandEvent("test", { invoker: undefined });
-    assert_equals(event.invoker, null);
-  }, "invoker set to undefined");
+    const event = new CommandEvent("test", { source: undefined });
+    assert_equals(event.source, null);
+  }, "source set to undefined");
 
   test(function () {
-    const event = new CommandEvent("test", { invoker: null });
-    assert_equals(event.invoker, null);
-  }, "invoker set to null");
+    const event = new CommandEvent("test", { source: null });
+    assert_equals(event.source, null);
+  }, "source set to null");
 
   test(function () {
     assert_throws_js(
       TypeError,
       function () {
-        new CommandEvent("test", { invoker: false });
+        new CommandEvent("test", { source: false });
       },
-      "invoker is not an object",
+      "source is not an object",
     );
-  }, "invoker set to false");
+  }, "source set to false");
 
   test(function () {
     assert_throws_js(
       TypeError,
       function () {
-        const event = new CommandEvent("test", { invoker: true });
+        const event = new CommandEvent("test", { source: true });
       },
-      "invoker is not an object",
+      "source is not an object",
     );
-  }, "invoker set to true");
+  }, "source set to true");
 
   test(function () {
     assert_throws_js(
       TypeError,
       function () {
-        const event = new CommandEvent("test", { invoker: {} });
+        const event = new CommandEvent("test", { source: {} });
       },
-      "invoker is not an object",
+      "source is not an object",
     );
-  }, "invoker set to {}");
+  }, "source set to {}");
 
   test(function () {
     assert_throws_js(
       TypeError,
       function () {
-        const eventInit = { command: "closed", invoker: new XMLHttpRequest() };
+        const eventInit = { command: "closed", source: new XMLHttpRequest() };
         const event = new CommandEvent("toggle", eventInit);
       },
-      "invoker is not an Element",
+      "source is not an Element",
     );
-  }, "invoker set to non-Element EventTarget");
+  }, "source set to non-Element EventTarget");
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/invokers/invoketarget-button-event-dispatch.tentative.html b/third_party/blink/web_tests/external/wpt/html/semantics/invokers/invoketarget-button-event-dispatch.tentative.html
index c5dfe14..ef87062 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/invokers/invoketarget-button-event-dispatch.tentative.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/invokers/invoketarget-button-event-dispatch.tentative.html
@@ -11,7 +11,8 @@
 <script src="resources/invoker-utils.js"></script>
 
 <div id="invokee"></div>
-<button id="invokerbutton" commandfor="invokee" command="custom-command"></button>
+<button id="invokerbutton" commandfor="invokee" command="--custom-command"></button>
+<input type="button" id="invalidbutton" commandfor="invokee" command="--custom-command">
 <form id="aform"></form>
 
 <script>
@@ -19,7 +20,7 @@
 
   function resetState() {
     invokerbutton.setAttribute("commandfor", "invokee");
-    invokerbutton.setAttribute("command", "custom-command");
+    invokerbutton.setAttribute("command", "--custom-command");
     invokerbutton.removeAttribute("disabled");
     invokerbutton.removeAttribute("form");
     invokerbutton.removeAttribute("type");
@@ -34,13 +35,13 @@
     assert_equals(event.bubbles, false, "bubbles");
     assert_equals(event.composed, true, "composed");
     assert_equals(event.isTrusted, true, "isTrusted");
-    assert_equals(event.command, "custom-command", "command");
+    assert_equals(event.command, "--custom-command", "command");
     assert_equals(event.target, invokee, "target");
-    assert_equals(event.invoker, invokerbutton, "invoker");
+    assert_equals(event.source, invokerbutton, "invoker");
   }, "event dispatches on click");
 
   // valid custom invokeactions
-  ["-foo", "foo-", "cAsE-cArRiEs", "-", "-a-", "a-b", "---", "show-picker"].forEach(
+  ["--foo", "--foo-", "--cAsE-cArRiEs", "--", "--a-", "--a-b", "---", "--show-picker"].forEach(
     (command) => {
       promise_test(async function (t) {
         t.add_cleanup(resetState);
@@ -55,7 +56,7 @@
         assert_equals(event.isTrusted, true, "isTrusted");
         assert_equals(event.command, command, "command");
         assert_equals(event.target, invokee, "target");
-        assert_equals(event.invoker, invokerbutton, "invoker");
+        assert_equals(event.source, invokerbutton, "invoker");
       }, `setting custom command property to ${command} (must include dash) sets event command`);
 
       promise_test(async function (t) {
@@ -71,13 +72,13 @@
         assert_equals(event.isTrusted, true, "isTrusted");
         assert_equals(event.command, command, "command");
         assert_equals(event.target, invokee, "target");
-        assert_equals(event.invoker, invokerbutton, "invoker");
+        assert_equals(event.source, invokerbutton, "invoker");
       }, `setting custom command attribute to ${command} (must include dash) sets event command`);
     },
   );
 
   // invalid custom invokeactions
-  ["foo", "foobar", "foo bar", "em—dash", "hidedocument"].forEach((command) => {
+  ["-foo", "-foo-", "foo-bar", "-foo bar", "—-emdash", "hidedocument"].forEach((command) => {
     promise_test(async function (t) {
       t.add_cleanup(resetState);
       let event = null;
@@ -118,6 +119,13 @@
   }, "event does not dispatch if click:preventDefault is called");
 
   promise_test(async function (t) {
+    let event = null;
+    invokee.addEventListener("command", (e) => (event = e), { once: true });
+    await clickOn(invalidbutton);
+    assert_equals(event, null, "command should not have fired");
+  }, "event does not dispatch on input[type=button]");
+
+  promise_test(async function (t) {
     t.add_cleanup(resetState);
     let called = false;
     invokee.addEventListener("command", (e) => (called = true), { once: true });
@@ -155,12 +163,12 @@
     let event = null;
     svgInvokee.addEventListener("command", (e) => (event = e), { once: true });
     invokerbutton.setAttribute("commandfor", "svg-invokee");
-    invokerbutton.setAttribute("command", "custom-command");
+    invokerbutton.setAttribute("command", "--custom-command");
     assert_equals(invokerbutton.commandForElement, svgInvokee);
     await clickOn(invokerbutton);
     assert_not_equals(event, null, "event was called");
     assert_true(event instanceof CommandEvent, "event is CommandEvent");
-    assert_equals(event.invoker, invokerbutton, "event.invoker is set to right element");
+    assert_equals(event.source, invokerbutton, "event.invoker is set to right element");
     assert_equals(event.target, svgInvokee, "event.target is set to right element");
   }, "event dispatches if invokee is non-HTML Element");
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/invokers/invoketarget-fullscreen-behavior.tentative.html b/third_party/blink/web_tests/external/wpt/html/semantics/invokers/invoketarget-fullscreen-behavior.tentative.html
index 1210b86..bc7b6f4 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/invokers/invoketarget-fullscreen-behavior.tentative.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/invokers/invoketarget-fullscreen-behavior.tentative.html
@@ -17,27 +17,27 @@
 
 <script>
   async function resetState() {
-    invokerbutton.setAttribute("command", "toggleFullscreen");
+    invokerbutton.setAttribute("command", "toggle-fullscreen");
     if (document.fullscreenElement) await document.exitFullscreen();
   }
 
-  // toggleFullscreen
+  // toggle-fullscreen
 
   promise_test(async function (t) {
     t.add_cleanup(resetState);
     assert_false(invokee.matches(":fullscreen"));
-    invokerbutton.setAttribute("command", "toggleFullscreen");
+    invokerbutton.setAttribute("command", "toggle-fullscreen");
     await clickOn(invokerbutton);
     assert_true(invokee.matches(":fullscreen"));
-  }, "invoking div with toggleFullscreen action makes div fullscreen");
+  }, "invoking div with toggle-fullscreen action makes div fullscreen");
 
   promise_test(async function (t) {
     t.add_cleanup(resetState);
     assert_false(invokee.matches(":fullscreen"));
-    invokerbutton.setAttribute("command", "toggleFullscreen");
+    invokerbutton.setAttribute("command", "toggle-fullscreen");
     invokerbutton.click();
     assert_false(invokee.matches(":fullscreen"));
-  }, "invoking div with toggleFullscreen action (without user activation) is a no-op");
+  }, "invoking div with toggle-fullscreen action (without user activation) is a no-op");
 
   promise_test(async function (t) {
     t.add_cleanup(resetState);
@@ -45,40 +45,40 @@
       once: true,
     });
     assert_false(invokee.matches(":fullscreen"));
-    invokerbutton.setAttribute("command", "toggleFullscreen");
+    invokerbutton.setAttribute("command", "toggle-fullscreen");
     await clickOn(invokerbutton);
     assert_false(invokee.matches(":fullscreen"));
-  }, "invoking div with toggleFullscreen action and preventDefault is a no-op");
+  }, "invoking div with toggle-fullscreen action and preventDefault is a no-op");
 
   promise_test(async function (t) {
     t.add_cleanup(resetState);
-    invokerbutton.setAttribute("command", "toggleFullscreen");
+    invokerbutton.setAttribute("command", "toggle-fullscreen");
     await test_driver.bless('go fullscreen');
     await invokee.requestFullscreen();
     assert_true(invokee.matches(":fullscreen"));
     await clickOn(invokerbutton);
     assert_false(invokee.matches(":fullscreen"));
-  }, "invoking fullscreen div with toggleFullscreen action exits fullscreen");
+  }, "invoking fullscreen div with toggle-fullscreen action exits fullscreen");
 
   promise_test(async function (t) {
     t.add_cleanup(resetState);
-    invokerbutton.setAttribute("command", "tOgGlEFullscreen");
+    invokerbutton.setAttribute("command", "tOgGlE-Fullscreen");
     await test_driver.bless('go fullscreen');
     await invokee.requestFullscreen();
     assert_true(invokee.matches(":fullscreen"));
     await clickOn(invokerbutton);
     assert_false(invokee.matches(":fullscreen"));
-  }, "invoking fullscreen div with toggleFullscreen (case-insensitive) action exits fullscreen");
+  }, "invoking fullscreen div with toggle-fullscreen (case-insensitive) action exits fullscreen");
 
-  // requestFullscreen
+  // request-fullscreen
 
   promise_test(async function (t) {
     t.add_cleanup(resetState);
     assert_false(invokee.matches(":fullscreen"));
-    invokerbutton.setAttribute("command", "requestFullscreen");
+    invokerbutton.setAttribute("command", "request-fullscreen");
     await clickOn(invokerbutton);
     assert_true(invokee.matches(":fullscreen"));
-  }, "invoking div with requestFullscreen action makes div fullscreen");
+  }, "invoking div with request-fullscreen action makes div fullscreen");
 
   promise_test(async function (t) {
     t.add_cleanup(resetState);
@@ -86,52 +86,52 @@
       once: true,
     });
     assert_false(invokee.matches(":fullscreen"));
-    invokerbutton.setAttribute("command", "requestFullscreen");
+    invokerbutton.setAttribute("command", "request-fullscreen");
     await clickOn(invokerbutton);
     assert_false(invokee.matches(":fullscreen"));
-  }, "invoking div with requestFullscreen action and preventDefault is a no-op");
+  }, "invoking div with request-fullscreen action and preventDefault is a no-op");
 
   promise_test(async function (t) {
     t.add_cleanup(resetState);
-    invokerbutton.setAttribute("command", "requestFullscreen");
+    invokerbutton.setAttribute("command", "request-fullscreen");
     await test_driver.bless('go fullscreen');
     await invokee.requestFullscreen();
     assert_true(invokee.matches(":fullscreen"));
     await clickOn(invokerbutton);
     assert_true(invokee.matches(":fullscreen"));
-  }, "invoking fullscreen div with requestFullscreen action is a no-op");
+  }, "invoking fullscreen div with request-fullscreen action is a no-op");
 
   // exitFullscreen
 
   promise_test(async function (t) {
     t.add_cleanup(resetState);
     assert_false(invokee.matches(":fullscreen"));
-    invokerbutton.setAttribute("command", "exitFullscreen");
+    invokerbutton.setAttribute("command", "exit-fullscreen");
     await clickOn(invokerbutton);
     assert_false(invokee.matches(":fullscreen"));
-  }, "invoking div with exitFullscreen action is a no-op");
+  }, "invoking div with exit-fullscreen action is a no-op");
 
   promise_test(async function (t) {
     t.add_cleanup(resetState);
-    invokerbutton.setAttribute("command", "exitFullscreen");
+    invokerbutton.setAttribute("command", "exit-fullscreen");
     await test_driver.bless('go fullscreen');
     await invokee.requestFullscreen();
     assert_true(invokee.matches(":fullscreen"));
     await clickOn(invokerbutton);
     assert_false(invokee.matches(":fullscreen"));
-  }, "invoking fullscreen div with exitFullscreen action exits fullscreen");
+  }, "invoking fullscreen div with exit-fullscreen action exits fullscreen");
 
   promise_test(async function (t) {
     t.add_cleanup(resetState);
     invokee.addEventListener("command", (e) => e.preventDefault(), {
       once: true,
     });
-    invokerbutton.setAttribute("command", "exitFullscreen");
+    invokerbutton.setAttribute("command", "exit-fullscreen");
     await test_driver.bless('go fullscreen');
     await invokee.requestFullscreen();
     assert_true(invokee.matches(":fullscreen"));
     await clickOn(invokerbutton);
     assert_true(invokee.matches(":fullscreen"));
-  }, "invoking fullscreen div with exitFullscreen action and preventDefault is a no-op");
+  }, "invoking fullscreen div with exit-fullscreen action and preventDefault is a no-op");
 
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/invokers/invoketarget-on-audio-behavior.tentative.html b/third_party/blink/web_tests/external/wpt/html/semantics/invokers/invoketarget-on-audio-behavior.tentative.html
index 309a91e..77fb204 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/invokers/invoketarget-on-audio-behavior.tentative.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/invokers/invoketarget-on-audio-behavior.tentative.html
@@ -21,29 +21,29 @@
     invokee.muted = false;
   }
 
-  // playpause
+  // play-pause
 
   promise_test(async function (t) {
     t.add_cleanup(resetState);
     assert_true(invokee.paused);
-    invokerbutton.setAttribute("command", "playpause");
+    invokerbutton.setAttribute("command", "play-pause");
     await clickOn(invokerbutton);
     await new Promise((resolve) => {
       requestAnimationFrame(resolve);
     });
     assert_false(invokee.paused);
-  }, "invoking audio with playpause action makes audio play");
+  }, "invoking audio with play-pause action makes audio play");
 
   promise_test(async function (t) {
     t.add_cleanup(resetState);
     assert_true(invokee.paused);
-    invokerbutton.setAttribute("command", "playpause");
+    invokerbutton.setAttribute("command", "play-pause");
     invokerbutton.click();
     await new Promise((resolve) => {
       requestAnimationFrame(resolve);
     });
     assert_false(invokee.paused);
-  }, "invoking audio with playpause action (without user activation) is a no-op");
+  }, "invoking audio with play-pause action (without user activation) is a no-op");
 
   promise_test(async function (t) {
     t.add_cleanup(resetState);
@@ -51,26 +51,26 @@
       once: true,
     });
     assert_true(invokee.paused);
-    invokerbutton.setAttribute("command", "playpause");
+    invokerbutton.setAttribute("command", "play-pause");
     await clickOn(invokerbutton);
     await new Promise((resolve) => {
       requestAnimationFrame(resolve);
     });
     assert_true(invokee.paused);
-  }, "invoking audio with playpause action and preventDefault is a no-op");
+  }, "invoking audio with play-pause action and preventDefault is a no-op");
 
   promise_test(async function (t) {
     t.add_cleanup(resetState);
     await test_driver.bless("play audio");
     invokee.play();
     assert_false(invokee.paused);
-    invokerbutton.setAttribute("command", "playpause");
+    invokerbutton.setAttribute("command", "play-pause");
     await clickOn(invokerbutton);
     await new Promise((resolve) => {
       requestAnimationFrame(resolve);
     });
     assert_true(invokee.paused);
-  }, "invoking playing audio with playpause action pauses it");
+  }, "invoking playing audio with play-pause action pauses it");
 
   // play
 
@@ -168,13 +168,13 @@
   promise_test(async function (t) {
     t.add_cleanup(resetState);
     assert_false(invokee.muted);
-    invokerbutton.setAttribute("command", "toggleMuted");
+    invokerbutton.setAttribute("command", "toggle-muted");
     await clickOn(invokerbutton);
     await new Promise((resolve) => {
       requestAnimationFrame(resolve);
     });
     assert_true(invokee.muted);
-  }, "invoking audio with toggleMuted action mutes it");
+  }, "invoking audio with toggle-muted action mutes it");
 
   promise_test(async function (t) {
     t.add_cleanup(resetState);
@@ -182,23 +182,23 @@
       once: true,
     });
     assert_false(invokee.muted);
-    invokerbutton.setAttribute("command", "toggleMuted");
+    invokerbutton.setAttribute("command", "toggle-muted");
     await clickOn(invokerbutton);
     await new Promise((resolve) => {
       requestAnimationFrame(resolve);
     });
     assert_false(invokee.muted);
-  }, "invoking audio with toggleMuted action and preventDefault is a no-op");
+  }, "invoking audio with toggle-muted action and preventDefault is a no-op");
 
   promise_test(async function (t) {
     t.add_cleanup(resetState);
     invokee.muted = true;
     assert_true(invokee.muted);
-    invokerbutton.setAttribute("command", "toggleMuted");
+    invokerbutton.setAttribute("command", "toggle-muted");
     await clickOn(invokerbutton);
     await new Promise((resolve) => {
       requestAnimationFrame(resolve);
     });
     assert_false(invokee.muted);
-  }, "invoking muted audio with toggleMuted action unmutes it");
+  }, "invoking muted audio with toggle-muted action unmutes it");
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/invokers/invoketarget-on-audio-invalid-behavior.tentative.html b/third_party/blink/web_tests/external/wpt/html/semantics/invokers/invoketarget-on-audio-invalid-behavior.tentative.html
index 3e18478..5aee3ae 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/invokers/invoketarget-on-audio-invalid-behavior.tentative.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/invokers/invoketarget-on-audio-invalid-behavior.tentative.html
@@ -18,9 +18,10 @@
   [
     "",
     "foo-bar",
-    "showpopover",
-    "showmodal",
-    "showpicker",
+    "playpause",
+    "show-popover",
+    "show-modal",
+    "show-picker",
     "open",
     "close",
   ].forEach((action) => {
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/invokers/invoketarget-on-details-behavior.tentative.html b/third_party/blink/web_tests/external/wpt/html/semantics/invokers/invoketarget-on-details-behavior.tentative.html
index 4c4998cf..d5e8e97c 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/invokers/invoketarget-on-details-behavior.tentative.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/invokers/invoketarget-on-details-behavior.tentative.html
@@ -31,9 +31,9 @@
       async function (t) {
         t.add_cleanup(resetState);
         invokerbutton.command = command;
-        assert_false(invokee.matches("[open]"));
+        assert_false(invokee.matches("[open]"), "invokee does not match [open]");
         await clickOn(invokerbutton);
-        assert_true(invokee.matches("[open]"));
+        assert_true(invokee.matches("[open]"), "invokee matches [open]");
       },
       `invoking (as ${command}) closed details opens`,
     );
@@ -42,13 +42,13 @@
       async function (t) {
         t.add_cleanup(resetState);
         invokerbutton.command = command;
-        assert_false(invokee.matches("[open]"));
+        assert_false(invokee.matches("[open]"), "invokee does not match [open]");
         invokee.addEventListener("command", (e) => e.preventDefault(), {
           once: true,
         });
         await clickOn(invokerbutton);
         t.add_cleanup(() => invokee.removeAttribute("open"));
-        assert_false(invokee.matches("[open]"));
+        assert_false(invokee.matches("[open]"), "invokee still does not match [open]");
       },
       `invoking (as ${command}) closed details with preventDefault does not open`,
     );
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/invokers/invoketarget-on-details-invalid-behavior.tentative.html b/third_party/blink/web_tests/external/wpt/html/semantics/invokers/invoketarget-on-details-invalid-behavior.tentative.html
index 3a4e86e9..9acff71 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/invokers/invoketarget-on-details-invalid-behavior.tentative.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/invokers/invoketarget-on-details-invalid-behavior.tentative.html
@@ -23,12 +23,12 @@
   [
     "",
     "foo-bar",
-    "showpopover",
-    "showmodal",
-    "showpicker",
-    "hidepopover",
+    "show-popover",
+    "show-modal",
+    "show-picker",
+    "hide-popover",
     "hide",
-    "toggleopen",
+    "toggle-open",
   ].forEach((command) => {
     promise_test(async function (t) {
       t.add_cleanup(resetState);
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/invokers/invoketarget-on-dialog-behavior.tentative.html b/third_party/blink/web_tests/external/wpt/html/semantics/invokers/invoketarget-on-dialog-behavior.tentative.html
index 9cf1e53..4fca8a31 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/invokers/invoketarget-on-dialog-behavior.tentative.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/invokers/invoketarget-on-dialog-behavior.tentative.html
@@ -13,20 +13,20 @@
 <dialog id="invokee">
   <button id="containedinvoker" commandfor="invokee" command="close"></button>
 </dialog>
-<button id="invokerbutton" commandfor="invokee" command="showmodal"></button>
+<button id="invokerbutton" commandfor="invokee" command="show-modal"></button>
 
 <script>
   function resetState() {
     invokee.close();
     try { invokee.hidePopover(); } catch {}
     invokee.removeAttribute("popover");
-    invokerbutton.setAttribute("command", "showmodal");
+    invokerbutton.setAttribute("command", "show-modal");
     containedinvoker.setAttribute("command", "close");
   }
 
   // opening a dialog
 
-  ["showmodal", /* test case sensitivity */ "sHoWmOdAl"].forEach(
+  ["show-modal", /* test case sensitivity */ "sHoW-mOdAl"].forEach(
     (command) => {
       ["property", "attribute"].forEach((setType) => {
         promise_test(
@@ -211,22 +211,22 @@
     });
   });
 
-  // showmodal explicit behaviours
+  // show-modal explicit behaviours
 
   promise_test(async function (t) {
     t.add_cleanup(resetState);
-    containedinvoker.setAttribute("command", "showModal");
+    containedinvoker.setAttribute("command", "show-Modal");
     invokee.show();
     assert_true(invokee.open, "invokee.open");
     assert_false(invokee.matches(":modal"), "invokee :modal");
     await clickOn(containedinvoker);
     assert_true(invokee.open, "invokee.open");
     assert_false(invokee.matches(":modal"), "invokee :modal");
-  }, "invoking (as showmodal) open dialog is noop");
+  }, "invoking (as show-modal) open dialog is noop");
 
   promise_test(async function (t) {
     t.add_cleanup(resetState);
-    containedinvoker.setAttribute("command", "showmodal");
+    containedinvoker.setAttribute("command", "show-modal");
     invokee.showModal();
     assert_true(invokee.open, "invokee.open");
     assert_true(invokee.matches(":modal"), "invokee :modal");
@@ -240,18 +240,18 @@
     await clickOn(invokerbutton);
     assert_true(invokee.open, "invokee.open");
     assert_true(invokee.matches(":modal"), "invokee :modal");
-  }, "invoking (as showmodal) open modal, while changing command still a no-op");
+  }, "invoking (as show-modal) open modal, while changing command still a no-op");
 
   promise_test(async function (t) {
     t.add_cleanup(resetState);
-    invokerbutton.setAttribute("command", "showmodal");
+    invokerbutton.setAttribute("command", "show-modal");
     assert_false(invokee.open, "invokee.open");
     assert_false(invokee.matches(":modal"), "invokee :modal");
     invokee.setAttribute("popover", "auto");
     await clickOn(invokerbutton);
     assert_true(invokee.open, "invokee.open");
     assert_true(invokee.matches(":modal"), "invokee :modal");
-  }, "invoking (as showmodal) closed popover dialog opens as modal");
+  }, "invoking (as show-modal) closed popover dialog opens as modal");
 
   // close explicit behaviours
 
@@ -266,7 +266,7 @@
   }, "invoking (as close) already closed dialog is noop");
 
   // Open Popovers using Dialog actions
-  ["showmodal", "close"].forEach((command) => {
+  ["show-modal", "close"].forEach((command) => {
     ["manual", "auto"].forEach((popoverState) => {
       promise_test(
         async function (t) {
@@ -297,7 +297,7 @@
   });
 
   // Elements being disconnected during invoke steps
-  ["showmodal", "close"].forEach((command) => {
+  ["show-modal", "close"].forEach((command) => {
     promise_test(
       async function (t) {
         t.add_cleanup(() => {
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/invokers/invoketarget-on-dialog-invalid-behavior.tentative.html b/third_party/blink/web_tests/external/wpt/html/semantics/invokers/invoketarget-on-dialog-invalid-behavior.tentative.html
index 8ea5066..01ef53d 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/invokers/invoketarget-on-dialog-invalid-behavior.tentative.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/invokers/invoketarget-on-dialog-invalid-behavior.tentative.html
@@ -30,10 +30,11 @@
     "foo",
     "foo-bar",
     "auto",
-    "showpopover",
-    "hidepopover",
-    "togglepopover",
-    "showpicker",
+    "showmodal",
+    "show-popover",
+    "hide-popover",
+    "toggle-popover",
+    "show-picker",
   ].forEach((action) => {
     promise_test(async function (t) {
       t.add_cleanup(resetState);
@@ -87,7 +88,7 @@
   });
 
   // Open Popovers using Dialog actions
-  ["showmodal", "close"].forEach((action) => {
+  ["show-modal", "close"].forEach((action) => {
     ["manual", "auto"].forEach((popoverState) => {
       promise_test(
         async function (t) {
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/invokers/invoketarget-on-input-number.tentative.html b/third_party/blink/web_tests/external/wpt/html/semantics/invokers/invoketarget-on-input-number.tentative.html
index 6434231..c8d624d 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/invokers/invoketarget-on-input-number.tentative.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/invokers/invoketarget-on-input-number.tentative.html
@@ -18,61 +18,61 @@
     invokerbutton.removeAttribute('command');
   }
 
-  // stepUp
+  // step-up
 
   promise_test(async function (t) {
     t.add_cleanup(reset);
     assert_equals(invokee.valueAsNumber, 0);
-    invokerbutton.setAttribute("command", "stepup");
+    invokerbutton.setAttribute("command", "step-up");
     await clickOn(invokerbutton);
     assert_equals(invokee.valueAsNumber, 1);
-  }, "invoking number input with stepup action increments value");
+  }, "invoking number input with step-up action increments value");
 
   promise_test(async function (t) {
     t.add_cleanup(reset);
     assert_equals(invokee.valueAsNumber, 0);
-    invokerbutton.setAttribute("command", "sTePuP");
+    invokerbutton.setAttribute("command", "sTeP-uP");
     await clickOn(invokerbutton);
     assert_equals(invokee.valueAsNumber, 1);
-  }, "invoking number input with stepup action (case-insensitive) increments value");
+  }, "invoking number input with step-up action (case-insensitive) increments value");
 
   promise_test(async function (t) {
     t.add_cleanup(reset);
     assert_equals(invokee.valueAsNumber, 0);
-    invokerbutton.setAttribute("command", "stepup");
+    invokerbutton.setAttribute("command", "step-up");
     invokee.addEventListener("command", (e) => e.preventDefault(), {
       once: true,
     });
     await clickOn(invokerbutton);
     assert_equals(invokee.valueAsNumber, 0);
-  }, "invoking number input with stepup action and preventDefault does not increment value");
+  }, "invoking number input with step-up action and preventDefault does not increment value");
 
-  // stepDown
+  // step-down
 
   promise_test(async function (t) {
     t.add_cleanup(reset);
     assert_equals(invokee.valueAsNumber, 0);
-    invokerbutton.setAttribute("command", "stepdown");
+    invokerbutton.setAttribute("command", "step-down");
     await clickOn(invokerbutton);
     assert_equals(invokee.valueAsNumber, -1);
-  }, "invoking number input with stepdown action decrements value");
+  }, "invoking number input with step-down action decrements value");
 
   promise_test(async function (t) {
     t.add_cleanup(reset);
     assert_equals(invokee.valueAsNumber, 0);
-    invokerbutton.setAttribute("command", "sTePdOwN");
+    invokerbutton.setAttribute("command", "sTeP-dOwN");
     await clickOn(invokerbutton);
     assert_equals(invokee.valueAsNumber, -1);
-  }, "invoking number input with stepdown action (case-insensitive) decrements value");
+  }, "invoking number input with step-down action (case-insensitive) decrements value");
 
   promise_test(async function (t) {
     t.add_cleanup(reset);
     assert_equals(invokee.valueAsNumber, 0);
-    invokerbutton.setAttribute("command", "stepdown");
+    invokerbutton.setAttribute("command", "step-down");
     invokee.addEventListener("command", (e) => e.preventDefault(), {
       once: true,
     });
     await clickOn(invokerbutton);
     assert_equals(invokee.valueAsNumber, 0);
-  }, "invoking number input with stepdown action and preventDefault does not decrement value");
+  }, "invoking number input with step-down action and preventDefault does not decrement value");
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/invokers/invoketarget-on-popover-behavior.tentative.html b/third_party/blink/web_tests/external/wpt/html/semantics/invokers/invoketarget-on-popover-behavior.tentative.html
index c974b6f..7462ce6 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/invokers/invoketarget-on-popover-behavior.tentative.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/invokers/invoketarget-on-popover-behavior.tentative.html
@@ -11,16 +11,16 @@
 <script src="resources/invoker-utils.js"></script>
 
 <div id="invokee" popover>
-  <button id="containedinvoker" commandfor="invokee" command="hidepopover"></button>
+  <button id="containedinvoker" commandfor="invokee" command="hide-popover"></button>
 </div>
-<button id="invokerbutton" commandfor="invokee" command="togglepopover"></button>
+<button id="invokerbutton" commandfor="invokee" command="toggle-popover"></button>
 
 <script>
   function resetState() {
     invokerbutton.setAttribute("commandfor", "invokee");
-    invokerbutton.setAttribute("command", "togglepopover");
+    invokerbutton.setAttribute("command", "toggle-popover");
     containedinvoker.setAttribute("commandfor", "invokee");
-    containedinvoker.setAttribute("command", "closepopover");
+    containedinvoker.setAttribute("command", "hide-popover");
     try {
       invokee.hidePopover();
     } catch {}
@@ -29,7 +29,7 @@
 
   promise_test(async function (t) {
     assert_false(invokee.matches(":popover-open"));
-    invokee.addEventListener("command", (e) => { invokerbutton.setAttribute('command', 'hidepopover'); }, {
+    invokee.addEventListener("command", (e) => { invokerbutton.setAttribute('command', 'hide-popover'); }, {
       once: true,
     });
     await clickOn(invokerbutton);
@@ -39,11 +39,11 @@
 
   // Open actions
   [
-    "togglepopover",
-    "showpopover",
+    "toggle-popover",
+    "show-popover",
     /* test case sensitivity */
-    "tOgGlEpOpOvEr",
-    "sHoWpOpOvEr",
+    "tOgGlE-pOpOvEr",
+    "sHoW-pOpOvEr",
   ].forEach((command) => {
     promise_test(
       async function (t) {
@@ -73,11 +73,11 @@
 
   // Close actions
   [
-    "togglepopover",
-    "hidepopover",
+    "toggle-popover",
+    "hide-popover",
     /* test case sensitivity */
-    "tOgGlEpOpOvEr",
-    "hIdEpOpOvEr",
+    "tOgGlE-pOpOvEr",
+    "hIdE-pOpOvEr",
   ].forEach((command) => {
     promise_test(
       async function (t) {
@@ -134,22 +134,22 @@
     );
   });
 
-  // showpopover specific
+  // show-popover specific
   promise_test(async function (t) {
     t.add_cleanup(resetState);
-    invokerbutton.setAttribute("command", "showpopover");
+    invokerbutton.setAttribute("command", "show-popover");
     invokee.showPopover();
     assert_true(invokee.matches(":popover-open"));
     await clickOn(invokerbutton);
     assert_true(invokee.matches(":popover-open"));
-  }, "invoking (as showpopover) open popover is noop");
+  }, "invoking (as show-popover) open popover is noop");
 
-  // hidepopover specific
+  // hide-popover specific
   promise_test(async function (t) {
     t.add_cleanup(resetState);
-    invokerbutton.setAttribute("command", "hidepopover");
+    invokerbutton.setAttribute("command", "hide-popover");
     assert_false(invokee.matches(":popover-open"));
     await clickOn(invokerbutton);
     assert_false(invokee.matches(":popover-open"));
-  }, "invoking (as hidepopover) closed popover is noop");
+  }, "invoking (as hide-popover) closed popover is noop");
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/invokers/invoketarget-on-popover-invalid-behavior.tentative.html b/third_party/blink/web_tests/external/wpt/html/semantics/invokers/invoketarget-on-popover-invalid-behavior.tentative.html
index 3144226..91efd92 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/invokers/invoketarget-on-popover-invalid-behavior.tentative.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/invokers/invoketarget-on-popover-invalid-behavior.tentative.html
@@ -25,8 +25,8 @@
     invokee.setAttribute("popover", "");
   }
 
-  // invalid actions on showpopover
-  [null, "", "foo-bar", "showmodal", "showpicker", "open", "close"].forEach((command) => {
+  // invalid actions on show-popover
+  [null, "", "foo-bar", "showpopover", "show-modal", "show-picker", "open", "close"].forEach((command) => {
     promise_test(async function (t) {
       t.add_cleanup(resetState);
       invokerbutton.command = command;
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/invokers/invoketarget-on-video-behavior.tentative.html b/third_party/blink/web_tests/external/wpt/html/semantics/invokers/invoketarget-on-video-behavior.tentative.html
index e395281e..0812e7f 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/invokers/invoketarget-on-video-behavior.tentative.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/invokers/invoketarget-on-video-behavior.tentative.html
@@ -14,7 +14,7 @@
 <button id="invokerbutton" commandfor="invokee"></button>
 
 <script>
-  // playpause
+  // play-pause
 
   promise_test(async function (t) {
     t.add_cleanup(async () => {
@@ -24,13 +24,13 @@
       invokee.muted = false;
     });
     assert_true(invokee.paused);
-    invokerbutton.setAttribute("command", "playpause");
+    invokerbutton.setAttribute("command", "play-pause");
     await clickOn(invokerbutton);
     await new Promise((resolve) => {
       requestAnimationFrame(resolve);
     });
     assert_false(invokee.paused);
-  }, "invoking video with playpause action makes video play");
+  }, "invoking video with play-pause action makes video play");
 
   promise_test(async function (t) {
     t.add_cleanup(async () => {
@@ -43,13 +43,13 @@
       once: true,
     });
     assert_true(invokee.paused);
-    invokerbutton.setAttribute("command", "playpause");
+    invokerbutton.setAttribute("command", "play-pause");
     await clickOn(invokerbutton);
     await new Promise((resolve) => {
       requestAnimationFrame(resolve);
     });
     assert_true(invokee.paused);
-  }, "invoking video with playpause action and preventDefault is a no-op");
+  }, "invoking video with play-pause action and preventDefault is a no-op");
 
   promise_test(async function (t) {
     t.add_cleanup(async () => {
@@ -61,13 +61,13 @@
     await test_driver.bless("play video");
     invokee.play();
     assert_false(invokee.paused);
-    invokerbutton.setAttribute("command", "playpause");
+    invokerbutton.setAttribute("command", "play-pause");
     await clickOn(invokerbutton);
     await new Promise((resolve) => {
       requestAnimationFrame(resolve);
     });
     assert_true(invokee.paused);
-  }, "invoking playing video with playpause action pauses it");
+  }, "invoking playing video with play-pause action pauses it");
 
   // play
 
@@ -189,13 +189,13 @@
       invokee.muted = false;
     });
     assert_false(invokee.muted);
-    invokerbutton.setAttribute("command", "toggleMuted");
+    invokerbutton.setAttribute("command", "toggle-muted");
     await clickOn(invokerbutton);
     await new Promise((resolve) => {
       requestAnimationFrame(resolve);
     });
     assert_true(invokee.muted);
-  }, "invoking video with toggleMuted action mutes it");
+  }, "invoking video with toggle-muted action mutes it");
 
   promise_test(async function (t) {
     t.add_cleanup(async () => {
@@ -208,13 +208,13 @@
       once: true,
     });
     assert_false(invokee.muted);
-    invokerbutton.setAttribute("command", "toggleMuted");
+    invokerbutton.setAttribute("command", "toggle-muted");
     await clickOn(invokerbutton);
     await new Promise((resolve) => {
       requestAnimationFrame(resolve);
     });
     assert_false(invokee.muted);
-  }, "invoking video with toggleMuted action and preventDefault is a no-op");
+  }, "invoking video with toggle-muted action and preventDefault is a no-op");
 
   promise_test(async function (t) {
     t.add_cleanup(async () => {
@@ -225,11 +225,11 @@
     });
     invokee.muted = true;
     assert_true(invokee.muted);
-    invokerbutton.setAttribute("command", "toggleMuted");
+    invokerbutton.setAttribute("command", "toggle-muted");
     await clickOn(invokerbutton);
     await new Promise((resolve) => {
       requestAnimationFrame(resolve);
     });
     assert_false(invokee.muted);
-  }, "invoking muted video with toggleMuted action unmutes it");
+  }, "invoking muted video with toggle-muted action unmutes it");
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/interfaces/invokers.tentative.idl b/third_party/blink/web_tests/external/wpt/interfaces/invokers.tentative.idl
index 4724d7d..046a365 100644
--- a/third_party/blink/web_tests/external/wpt/interfaces/invokers.tentative.idl
+++ b/third_party/blink/web_tests/external/wpt/interfaces/invokers.tentative.idl
@@ -1,15 +1,15 @@
-interface mixin InvokerElement {
-  [CEReactions,Reflect=invoketarget] attribute Element? commandForElement;
-  [CEReactions,Reflect=invokeaction] attribute DOMString command;
+interface mixin CommandElement {
+  [CEReactions,Reflect=commandfor] attribute Element? commandForElement;
+  [CEReactions,Reflect=command] attribute DOMString command;
 };
 
 interface CommandEvent : Event {
     constructor(DOMString type, optional CommandEventInit eventInitDict = {});
-    readonly attribute Element? invoker;
+    readonly attribute Element? source;
     readonly attribute DOMString command;
 };
 
 dictionary CommandEventInit : EventInit {
-    Element? invoker = null;
+    Element? source = null;
     DOMString command = "";
 };
diff --git a/third_party/blink/web_tests/fast/html/semantics/invokers/invokeaction-auto-input.html b/third_party/blink/web_tests/fast/html/semantics/invokers/invokeaction-auto-input.html
index cd5fcb59..c71fc5a 100644
--- a/third_party/blink/web_tests/fast/html/semantics/invokers/invokeaction-auto-input.html
+++ b/third_party/blink/web_tests/fast/html/semantics/invokers/invokeaction-auto-input.html
@@ -14,7 +14,7 @@
   <input type="week">
   <input type="month">
 </div>
-<button id="invokerbutton" commandfor="invokee"></button>
+<button id="invokerbutton" commandfor="invokee" command="auto"></button>
 </body>
 <script>
 document.querySelectorAll('#tests>*').forEach(el => {
@@ -23,6 +23,6 @@
     t.add_cleanup(() => el.remove());
     await test_driver.click(invokerbutton);
     assert_equals(internals.pagePopupWindow, null, "Picker is closed.");
-  }, `invoking ${el.type} input with auto action shouldn\'t show picker`)
+  }, `invoking ${el.type} input with auto command shouldn\'t show picker`)
 })
 </script>
diff --git a/third_party/blink/web_tests/fast/html/semantics/invokers/invokeaction-auto-select.html b/third_party/blink/web_tests/fast/html/semantics/invokers/invokeaction-auto-select.html
index b2b2bc0..6a63e8d 100644
--- a/third_party/blink/web_tests/fast/html/semantics/invokers/invokeaction-auto-select.html
+++ b/third_party/blink/web_tests/fast/html/semantics/invokers/invokeaction-auto-select.html
@@ -9,12 +9,12 @@
 <select id="invokee">
   <option>1</option>
 </select>
-<button id="invokerbutton" commandfor="invokee"></button>
+<button id="invokerbutton" commandfor="invokee" command="auto"></button>
 </body>
 <script>
 promise_test(async (t) => {
   await test_driver.click(invokerbutton);
   assert_false(internals.isSelectPopupVisible(invokee), "Picker is closed.");
   invokee.remove();
-}, `invoking select with auto action shouldn\'t show picker`)
+}, `invoking select with auto command shouldn\'t show picker`)
 </script>
diff --git a/third_party/blink/web_tests/fast/html/semantics/invokers/invokeaction-showpicker-input.html b/third_party/blink/web_tests/fast/html/semantics/invokers/invokeaction-showpicker-input.html
index fe4a03f..afb7728b 100644
--- a/third_party/blink/web_tests/fast/html/semantics/invokers/invokeaction-showpicker-input.html
+++ b/third_party/blink/web_tests/fast/html/semantics/invokers/invokeaction-showpicker-input.html
@@ -14,7 +14,7 @@
   <input type="week">
   <input type="month">
 </div>
-<button id="invokerbutton" commandfor="invokee" command="showpicker"></button>
+<button id="invokerbutton" commandfor="invokee" command="show-picker"></button>
 </body>
 <script>
 document.querySelectorAll('#tests>*').forEach(el => {
@@ -26,6 +26,6 @@
       requestAnimationFrame(resolve);
     });
     assert_not_equals(internals.pagePopupWindow, null, "Picker is opened.");
-  }, `invoking ${el.type} input with showPicker action should show picker`)
+  }, `invoking ${el.type} input with showPicker command should show picker`)
 })
 </script>
diff --git a/third_party/blink/web_tests/fast/html/semantics/invokers/invokeaction-showpicker-select.html b/third_party/blink/web_tests/fast/html/semantics/invokers/invokeaction-showpicker-select.html
index 3be79ec..d5c6fd7d 100644
--- a/third_party/blink/web_tests/fast/html/semantics/invokers/invokeaction-showpicker-select.html
+++ b/third_party/blink/web_tests/fast/html/semantics/invokers/invokeaction-showpicker-select.html
@@ -9,7 +9,7 @@
 <select id="invokee">
   <option>1</option>
 </select>
-<button id="invokerbutton" commandfor="invokee" command="showpicker"></button>
+<button id="invokerbutton" commandfor="invokee" command="show-picker"></button>
 </body>
 <script>
 promise_test(async (t) => {
@@ -19,5 +19,5 @@
   });
   assert_true(internals.isSelectPopupVisible(invokee), "Picker is opened.");
   invokee.remove();
-}, `invoking select with showPicker action should show picker`)
+}, `invoking select with showPicker command should show picker`)
 </script>
diff --git a/third_party/blink/web_tests/fast/html/semantics/invokers/invokeaction-showpicker-synthetic-click-input.html b/third_party/blink/web_tests/fast/html/semantics/invokers/invokeaction-showpicker-synthetic-click-input.html
index 6d402ca..f51ee60 100644
--- a/third_party/blink/web_tests/fast/html/semantics/invokers/invokeaction-showpicker-synthetic-click-input.html
+++ b/third_party/blink/web_tests/fast/html/semantics/invokers/invokeaction-showpicker-synthetic-click-input.html
@@ -14,7 +14,7 @@
   <input type="week">
   <input type="month">
 </div>
-<button id="invokerbutton" commandfor="invokee" command="showPicker"></button>
+<button id="invokerbutton" commandfor="invokee" command="show-picker"></button>
 </body>
 <script>
 document.querySelectorAll('#tests>*').forEach(el => {
@@ -23,6 +23,6 @@
     t.add_cleanup(() => el.remove());
     invokerbutton.click();
     assert_equals(internals.pagePopupWindow, null, "Picker is closed.");
-  }, `invoking ${el.type} input with showPicker action (without user activation) shouldn\'t show picker`)
+  }, `invoking ${el.type} input with showPicker command (without user activation) shouldn\'t show picker`)
 })
 </script>
diff --git a/third_party/blink/web_tests/fast/html/semantics/invokers/invokeaction-showpicker-synthetic-click-select.html b/third_party/blink/web_tests/fast/html/semantics/invokers/invokeaction-showpicker-synthetic-click-select.html
index f33f086..9d2b7ab7 100644
--- a/third_party/blink/web_tests/fast/html/semantics/invokers/invokeaction-showpicker-synthetic-click-select.html
+++ b/third_party/blink/web_tests/fast/html/semantics/invokers/invokeaction-showpicker-synthetic-click-select.html
@@ -9,12 +9,12 @@
 <select id="invokee">
   <option>1</option>
 </select>
-<button id="invokerbutton" commandfor="invokee" command="showPicker"></button>
+<button id="invokerbutton" commandfor="invokee" command="show-picker"></button>
 </body>
 <script>
 promise_test(async (t) => {
   invokerbutton.click();
   assert_false(internals.isSelectPopupVisible(invokee), "Picker is closed.");
   invokee.remove();
-}, `invoking select with showPicker action (without user activation) shouldn\'t show picker`)
+}, `invoking select with showPicker command (without user activation) shouldn\'t show picker`)
 </script>
diff --git a/third_party/blink/web_tests/virtual/customizable-select-disabled/external/wpt/html/semantics/forms/the-select-element/customizable-select/select-inside-top-layer.tentative-expected.txt b/third_party/blink/web_tests/virtual/customizable-select-disabled/external/wpt/html/semantics/forms/the-select-element/customizable-select/select-inside-top-layer.tentative-expected.txt
new file mode 100644
index 0000000..75901bf
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/customizable-select-disabled/external/wpt/html/semantics/forms/the-select-element/customizable-select/select-inside-top-layer.tentative-expected.txt
@@ -0,0 +1,7 @@
+This is a testharness.js-based test.
+[FAIL] a popover can be nested inside select
+  assert_true: precondition expected true got false
+[FAIL] a modal dialog can be nested inside select
+  assert_true: precondition expected true got null
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/virtual/select-parser-relaxation/external/wpt/html/semantics/forms/the-select-element/customizable-select/select-inside-top-layer.tentative-expected.txt b/third_party/blink/web_tests/virtual/select-parser-relaxation/external/wpt/html/semantics/forms/the-select-element/customizable-select/select-inside-top-layer.tentative-expected.txt
new file mode 100644
index 0000000..289df244
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/select-parser-relaxation/external/wpt/html/semantics/forms/the-select-element/customizable-select/select-inside-top-layer.tentative-expected.txt
@@ -0,0 +1,7 @@
+This is a testharness.js-based test.
+[FAIL] a popover can be nested inside select
+  assert_true: and the outer popover should also still be showing expected true got false
+[FAIL] a modal dialog can be nested inside select
+  assert_true: the select should be showing expected true got false
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/webexposed/element-instance-property-listing-expected.txt b/third_party/blink/web_tests/webexposed/element-instance-property-listing-expected.txt
index 8c508714..be38febd 100644
--- a/third_party/blink/web_tests/webexposed/element-instance-property-listing-expected.txt
+++ b/third_party/blink/web_tests/webexposed/element-instance-property-listing-expected.txt
@@ -756,8 +756,6 @@
     property autocomplete
     property checkValidity
     property checked
-    property command
-    property commandForElement
     property defaultChecked
     property defaultValue
     property dirName
diff --git a/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt b/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt
index 5fb8e08..c42c1075 100644
--- a/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt
+++ b/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt
@@ -1467,7 +1467,7 @@
 interface CommandEvent : Event
     attribute @@toStringTag
     getter command
-    getter invoker
+    getter source
     method constructor
 interface Comment : CharacterData
     attribute @@toStringTag
@@ -4371,8 +4371,6 @@
     getter alt
     getter autocomplete
     getter checked
-    getter command
-    getter commandForElement
     getter defaultChecked
     getter defaultValue
     getter dirName
@@ -4435,8 +4433,6 @@
     setter alt
     setter autocomplete
     setter checked
-    setter command
-    setter commandForElement
     setter defaultChecked
     setter defaultValue
     setter dirName
diff --git a/third_party/blink/web_tests/wpt_internal/forms/file/invokeaction-showpicker-file-input.html b/third_party/blink/web_tests/wpt_internal/forms/file/invokeaction-showpicker-file-input.html
index caca66fb..b24806b 100644
--- a/third_party/blink/web_tests/wpt_internal/forms/file/invokeaction-showpicker-file-input.html
+++ b/third_party/blink/web_tests/wpt_internal/forms/file/invokeaction-showpicker-file-input.html
@@ -7,7 +7,7 @@
 <script src="/resources/testdriver-vendor.js"></script>
 <title>INPUT TYPE=FILE and commandfor</title>
 <input type="file" id="invokee">
-<button id="invokerbutton" commandfor="invokee" command="showpicker"></button>
+<button id="invokerbutton" commandfor="invokee" command="show-picker"></button>
 <script type="module">
 import {mockFileChooserFactory} from '../resources/mock-file-chooser.js';
 
diff --git a/third_party/chromium-variations b/third_party/chromium-variations
index fe52d1f4..a62da4c 160000
--- a/third_party/chromium-variations
+++ b/third_party/chromium-variations
@@ -1 +1 @@
-Subproject commit fe52d1f4152376771844d4efd7697758bfa520dd
+Subproject commit a62da4cbeb5393533721fa94c70fe751f507b298
diff --git a/third_party/crossbench b/third_party/crossbench
index 9f3b07f..5401449 160000
--- a/third_party/crossbench
+++ b/third_party/crossbench
@@ -1 +1 @@
-Subproject commit 9f3b07f3e4c95d5aa38c274cdd7b86ea83701e04
+Subproject commit 5401449e65e7385e37c6b7597fa33fed8701c3b3
diff --git a/third_party/depot_tools b/third_party/depot_tools
index a31b552..1e559a2 160000
--- a/third_party/depot_tools
+++ b/third_party/depot_tools
@@ -1 +1 @@
-Subproject commit a31b55235fa0e02cdd11e9e311a3da11fd53d473
+Subproject commit 1e559a28280c84348ccb49da57c8fbcfebe4b977
diff --git a/third_party/devtools-frontend-internal b/third_party/devtools-frontend-internal
index 231b318..744fbd3 160000
--- a/third_party/devtools-frontend-internal
+++ b/third_party/devtools-frontend-internal
@@ -1 +1 @@
-Subproject commit 231b3184749a697b31363c465183562a05f3fee4
+Subproject commit 744fbd396e751ce06f0f3b3c1dd9a80f08fc95b3
diff --git a/third_party/devtools-frontend/src b/third_party/devtools-frontend/src
index 428aec3..93f9c55 160000
--- a/third_party/devtools-frontend/src
+++ b/third_party/devtools-frontend/src
@@ -1 +1 @@
-Subproject commit 428aec3ab17de76eab176672f031bd3a99bdb97a
+Subproject commit 93f9c55dfb7831cca4d069535477a2c83b8db86a
diff --git a/third_party/eigen3/README.chromium b/third_party/eigen3/README.chromium
index 9cc641e3..ce1782c 100644
--- a/third_party/eigen3/README.chromium
+++ b/third_party/eigen3/README.chromium
@@ -1,8 +1,8 @@
 Name: Eigen
 Short Name: eigen3
 URL: https://gitlab.com/libeigen/eigen
-Version: 2d4c9b400cca33d2f5cf316efc7151236244edb1
-Date: 2024-10-03
+Version: 7eea0a9213e801ad9479a6499fd0330ec1db8693
+Date: 2024-10-10
 License: MPL 2
 License File: LICENSE
 Security Critical: Yes
diff --git a/third_party/eigen3/src b/third_party/eigen3/src
index 2d4c9b4..7eea0a9 160000
--- a/third_party/eigen3/src
+++ b/third_party/eigen3/src
@@ -1 +1 @@
-Subproject commit 2d4c9b400cca33d2f5cf316efc7151236244edb1
+Subproject commit 7eea0a9213e801ad9479a6499fd0330ec1db8693
diff --git a/third_party/openscreen/src b/third_party/openscreen/src
index ac12a98..4f27c4f 160000
--- a/third_party/openscreen/src
+++ b/third_party/openscreen/src
@@ -1 +1 @@
-Subproject commit ac12a98ad35af8c74c1ce806cb8b87ea5f91ec7c
+Subproject commit 4f27c4f1698522dfcea36dca948a13e2eaf4c26c
diff --git a/third_party/perfetto b/third_party/perfetto
index 84aa746..a5ac928 160000
--- a/third_party/perfetto
+++ b/third_party/perfetto
@@ -1 +1 @@
-Subproject commit 84aa7464783d04a2fdbd7ca063cbdae4dfe5a929
+Subproject commit a5ac928573c3140703d053efd91d30ccbfee4d8d
diff --git a/third_party/skia b/third_party/skia
index 18ed896..381de9e 160000
--- a/third_party/skia
+++ b/third_party/skia
@@ -1 +1 @@
-Subproject commit 18ed8969a0b39ec9db4c545a793d14792b53c0ab
+Subproject commit 381de9ead2a2f5bb8f1858a72c50b6cf842b9f10
diff --git a/third_party/spirv-headers/src b/third_party/spirv-headers/src
index a62b032..50bc4de 160000
--- a/third_party/spirv-headers/src
+++ b/third_party/spirv-headers/src
@@ -1 +1 @@
-Subproject commit a62b032007b2e7a69f24a195cbfbd0cf22d31bb0
+Subproject commit 50bc4debdc3eec5045edbeb8ce164090e29b91f3
diff --git a/third_party/spirv-tools/src b/third_party/spirv-tools/src
index 4310fd4..42b315c1 160000
--- a/third_party/spirv-tools/src
+++ b/third_party/spirv-tools/src
@@ -1 +1 @@
-Subproject commit 4310fd4edae21d711ab31f5183704ad320329419
+Subproject commit 42b315c15b1ff941b46bb3949c105e5386be8717
diff --git a/third_party/tflite/README.chromium b/third_party/tflite/README.chromium
index 8af95a88..a9d27b6 100644
--- a/third_party/tflite/README.chromium
+++ b/third_party/tflite/README.chromium
@@ -1,8 +1,8 @@
 Name: TensorFlow Lite
 Short Name: tflite
 URL: https://github.com/tensorflow/tensorflow
-Version: 8ff94d3cf1e5edc5586a98bd0cdab1601ff6924b
-Date: 2024-10-03
+Version: 10cacdd94b313773d29c07f48fbec232be56a478
+Date: 2024-10-10
 License: Apache 2.0
 License File: LICENSE
 Security Critical: Yes
diff --git a/third_party/tflite/src b/third_party/tflite/src
index 8ff94d3..10cacdd 160000
--- a/third_party/tflite/src
+++ b/third_party/tflite/src
@@ -1 +1 @@
-Subproject commit 8ff94d3cf1e5edc5586a98bd0cdab1601ff6924b
+Subproject commit 10cacdd94b313773d29c07f48fbec232be56a478
diff --git a/third_party/vulkan-deps b/third_party/vulkan-deps
index e8e61a2..73fd751 160000
--- a/third_party/vulkan-deps
+++ b/third_party/vulkan-deps
@@ -1 +1 @@
-Subproject commit e8e61a227e2c242ee71400cdfdfbe9eed7350dc2
+Subproject commit 73fd75175922012f21557239b7743a152ea7f1fd
diff --git a/third_party/vulkan-validation-layers/src b/third_party/vulkan-validation-layers/src
index 6103774..cbb4ab1 160000
--- a/third_party/vulkan-validation-layers/src
+++ b/third_party/vulkan-validation-layers/src
@@ -1 +1 @@
-Subproject commit 61037741e4d8ccdb8c7b761bc726ab87cc11496d
+Subproject commit cbb4ab171fc7cd0b636a76ee542e238a8734f4be
diff --git a/third_party/webgpu-cts/src b/third_party/webgpu-cts/src
index ab266c9..8a29164 160000
--- a/third_party/webgpu-cts/src
+++ b/third_party/webgpu-cts/src
@@ -1 +1 @@
-Subproject commit ab266c93548d2cff1d15ac1fe19ee7ee5f466793
+Subproject commit 8a2916436238386d6465ec2cab9735e65ad14070
diff --git a/third_party/xnnpack/BUILD.gn b/third_party/xnnpack/BUILD.gn
index 5fbcb8e..e623714 100644
--- a/third_party/xnnpack/BUILD.gn
+++ b/third_party/xnnpack/BUILD.gn
@@ -337,6 +337,7 @@
     ":qs8-gavgpool_sse2-no-sse3",
     ":qs8-gavgpool_sse4.1-no-sse4.2",
     ":qs8-gavgpool_x64",
+    ":qs8-packw_avx2-avxvnni-f16c-fma",
     ":qs8-packw_x64",
     ":qs8-qc8w-dwconv_avx-no-avx2-no-f16c-no-fma",
     ":qs8-qc8w-dwconv_f16c-fma-avx2",
@@ -364,6 +365,8 @@
     ":qs8-qc8w-igemm_sse2-no-sse3",
     ":qs8-qc8w-igemm_sse4.1-no-sse4.2",
     ":qs8-qc8w-igemm_x64",
+    ":qs8-qu8-packw_avx2-avxvnni-f16c-fma",
+    ":qs8-qu8-packw_x64",
     ":qs8-rdsum_f16c-fma-avx2",
     ":qs8-rdsum_f16c-fma-avx512f-avx512cd-avx512bw-avx512dq-avx512vl",
     ":qs8-rdsum_sse4.1-no-sse4.2",
@@ -821,6 +824,7 @@
     ":qs8-gavgpool_sse2-no-sse3_standalone",
     ":qs8-gavgpool_sse4.1-no-sse4.2_standalone",
     ":qs8-gavgpool_x64_standalone",
+    ":qs8-packw_avx2-avxvnni-f16c-fma_standalone",
     ":qs8-packw_x64_standalone",
     ":qs8-qc8w-dwconv_avx-no-avx2-no-f16c-no-fma_standalone",
     ":qs8-qc8w-dwconv_f16c-fma-avx2_standalone",
@@ -848,6 +852,8 @@
     ":qs8-qc8w-igemm_sse2-no-sse3_standalone",
     ":qs8-qc8w-igemm_sse4.1-no-sse4.2_standalone",
     ":qs8-qc8w-igemm_x64_standalone",
+    ":qs8-qu8-packw_avx2-avxvnni-f16c-fma_standalone",
+    ":qs8-qu8-packw_x64_standalone",
     ":qs8-rdsum_f16c-fma-avx2_standalone",
     ":qs8-rdsum_f16c-fma-avx512f-avx512cd-avx512bw-avx512dq-avx512vl_standalone",
     ":qs8-rdsum_sse4.1-no-sse4.2_standalone",
@@ -1162,6 +1168,7 @@
     ":qs8-qc8w-igemm_arch=armv8.2-a+fp16+dotprod",
     ":qs8-qc8w-igemm_arch=armv8.2-a+i8mm+fp16",
     ":qs8-qc8w-igemm_arm64",
+    ":qs8-qu8-packw_arm64",
     ":qs8-rdsum_arm64",
     ":qs8-rsum_arch=armv8.2-a+dotprod",
     ":qs8-rsum_arm64",
@@ -1353,6 +1360,7 @@
     ":qs8-qc8w-igemm_arch=armv8.2-a+fp16+dotprod_standalone",
     ":qs8-qc8w-igemm_arch=armv8.2-a+i8mm+fp16_standalone",
     ":qs8-qc8w-igemm_arm64_standalone",
+    ":qs8-qu8-packw_arm64_standalone",
     ":qs8-rdsum_arm64_standalone",
     ":qs8-rsum_arch=armv8.2-a+dotprod_standalone",
     ":qs8-rsum_arm64_standalone",
@@ -17732,12 +17740,72 @@
     }
   }
 
+  source_set("qs8-packw_avx2-avxvnni-f16c-fma") {
+    cflags = [
+      "-mavx2",
+      "-mavxvnni",
+      "-mf16c",
+      "-mfma",
+    ]
+
+    sources = [
+      "src/include/xnnpack.h",
+      "src/src/qs8-packw/gen/qs8-packw-x8c8-gemm-goi-avxvnni.c",
+    ]
+
+    configs -= [ "//build/config/compiler:chromium_code" ]
+    configs += [ "//build/config/compiler:no_chromium_code" ]
+    configs += [ "//build/config/sanitizers:cfi_icall_generalize_pointers" ]
+
+    deps = [
+      "//third_party/cpuinfo",
+      "//third_party/fp16",
+      "//third_party/fxdiv",
+      "//third_party/pthreadpool",
+    ]
+
+    public_configs = [ ":xnnpack_config" ]
+  }
+
+  # This is a target that cannot depend on //base.
+  source_set("qs8-packw_avx2-avxvnni-f16c-fma_standalone") {
+    cflags = [
+      "-mavx2",
+      "-mavxvnni",
+      "-mf16c",
+      "-mfma",
+    ]
+
+    sources = [
+      "src/include/xnnpack.h",
+      "src/src/qs8-packw/gen/qs8-packw-x8c8-gemm-goi-avxvnni.c",
+    ]
+
+    configs -= [ "//build/config/compiler:chromium_code" ]
+    configs += [ "//build/config/compiler:no_chromium_code" ]
+    configs += [ "//build/config/sanitizers:cfi_icall_generalize_pointers" ]
+
+    deps = [
+      "//third_party/cpuinfo",
+      "//third_party/fp16",
+      "//third_party/fxdiv",
+      "//third_party/pthreadpool:pthreadpool_standalone",
+    ]
+
+    public_configs = [ ":xnnpack_config" ]
+
+    if (!(is_android && use_order_profiling)) {
+      assert_no_deps = [ "//base" ]
+    }
+  }
+
   source_set("qs8-packw_x64") {
     cflags = []
 
     sources = [
       "src/include/xnnpack.h",
       "src/src/qs8-packw/gen/qs8-packw-x64c4-gemm-goi-scalar.c",
+      "src/src/qs8-packw/gen/qs8-packw-x8c8-gemm-goi-scalar.c",
     ]
 
     configs -= [ "//build/config/compiler:chromium_code" ]
@@ -17761,6 +17829,7 @@
     sources = [
       "src/include/xnnpack.h",
       "src/src/qs8-packw/gen/qs8-packw-x64c4-gemm-goi-scalar.c",
+      "src/src/qs8-packw/gen/qs8-packw-x8c8-gemm-goi-scalar.c",
     ]
 
     configs -= [ "//build/config/compiler:chromium_code" ]
@@ -19423,6 +19492,114 @@
     }
   }
 
+  source_set("qs8-qu8-packw_avx2-avxvnni-f16c-fma") {
+    cflags = [
+      "-mavx2",
+      "-mavxvnni",
+      "-mf16c",
+      "-mfma",
+    ]
+
+    sources = [
+      "src/include/xnnpack.h",
+      "src/src/qs8-qu8-packw/gen/qs8-qu8-packw-x8c8-gemm-goi-avxvnni.c",
+    ]
+
+    configs -= [ "//build/config/compiler:chromium_code" ]
+    configs += [ "//build/config/compiler:no_chromium_code" ]
+    configs += [ "//build/config/sanitizers:cfi_icall_generalize_pointers" ]
+
+    deps = [
+      "//third_party/cpuinfo",
+      "//third_party/fp16",
+      "//third_party/fxdiv",
+      "//third_party/pthreadpool",
+    ]
+
+    public_configs = [ ":xnnpack_config" ]
+  }
+
+  # This is a target that cannot depend on //base.
+  source_set("qs8-qu8-packw_avx2-avxvnni-f16c-fma_standalone") {
+    cflags = [
+      "-mavx2",
+      "-mavxvnni",
+      "-mf16c",
+      "-mfma",
+    ]
+
+    sources = [
+      "src/include/xnnpack.h",
+      "src/src/qs8-qu8-packw/gen/qs8-qu8-packw-x8c8-gemm-goi-avxvnni.c",
+    ]
+
+    configs -= [ "//build/config/compiler:chromium_code" ]
+    configs += [ "//build/config/compiler:no_chromium_code" ]
+    configs += [ "//build/config/sanitizers:cfi_icall_generalize_pointers" ]
+
+    deps = [
+      "//third_party/cpuinfo",
+      "//third_party/fp16",
+      "//third_party/fxdiv",
+      "//third_party/pthreadpool:pthreadpool_standalone",
+    ]
+
+    public_configs = [ ":xnnpack_config" ]
+
+    if (!(is_android && use_order_profiling)) {
+      assert_no_deps = [ "//base" ]
+    }
+  }
+
+  source_set("qs8-qu8-packw_x64") {
+    cflags = []
+
+    sources = [
+      "src/include/xnnpack.h",
+      "src/src/qs8-qu8-packw/gen/qs8-qu8-packw-x16c8-gemm-goi-scalar.c",
+    ]
+
+    configs -= [ "//build/config/compiler:chromium_code" ]
+    configs += [ "//build/config/compiler:no_chromium_code" ]
+    configs += [ "//build/config/sanitizers:cfi_icall_generalize_pointers" ]
+
+    deps = [
+      "//third_party/cpuinfo",
+      "//third_party/fp16",
+      "//third_party/fxdiv",
+      "//third_party/pthreadpool",
+    ]
+
+    public_configs = [ ":xnnpack_config" ]
+  }
+
+  # This is a target that cannot depend on //base.
+  source_set("qs8-qu8-packw_x64_standalone") {
+    cflags = []
+
+    sources = [
+      "src/include/xnnpack.h",
+      "src/src/qs8-qu8-packw/gen/qs8-qu8-packw-x16c8-gemm-goi-scalar.c",
+    ]
+
+    configs -= [ "//build/config/compiler:chromium_code" ]
+    configs += [ "//build/config/compiler:no_chromium_code" ]
+    configs += [ "//build/config/sanitizers:cfi_icall_generalize_pointers" ]
+
+    deps = [
+      "//third_party/cpuinfo",
+      "//third_party/fp16",
+      "//third_party/fxdiv",
+      "//third_party/pthreadpool:pthreadpool_standalone",
+    ]
+
+    public_configs = [ ":xnnpack_config" ]
+
+    if (!(is_android && use_order_profiling)) {
+      assert_no_deps = [ "//base" ]
+    }
+  }
+
   source_set("qs8-rdsum_f16c-fma-avx2") {
     cflags = [
       "-mavx2",
@@ -23603,7 +23780,7 @@
 
     sources = [
       "src/include/xnnpack.h",
-      "src/src/qu8-rsum/gen/qu8-rsum-avx2-u64.c",
+      "src/src/qu8-rsum/gen/qu8-rsum-avx2-u64-acc2.c",
     ]
 
     configs -= [ "//build/config/compiler:chromium_code" ]
@@ -23630,7 +23807,7 @@
 
     sources = [
       "src/include/xnnpack.h",
-      "src/src/qu8-rsum/gen/qu8-rsum-avx2-u64.c",
+      "src/src/qu8-rsum/gen/qu8-rsum-avx2-u64-acc2.c",
     ]
 
     configs -= [ "//build/config/compiler:chromium_code" ]
@@ -23659,7 +23836,7 @@
 
     sources = [
       "src/include/xnnpack.h",
-      "src/src/qu8-rsum/gen/qu8-rsum-sse2-u32.c",
+      "src/src/qu8-rsum/gen/qu8-rsum-sse2-u32-acc2.c",
     ]
 
     configs -= [ "//build/config/compiler:chromium_code" ]
@@ -23685,7 +23862,7 @@
 
     sources = [
       "src/include/xnnpack.h",
-      "src/src/qu8-rsum/gen/qu8-rsum-sse2-u32.c",
+      "src/src/qu8-rsum/gen/qu8-rsum-sse2-u32-acc2.c",
     ]
 
     configs -= [ "//build/config/compiler:chromium_code" ]
@@ -35884,7 +36061,7 @@
 
     sources = [
       "src/include/xnnpack.h",
-      "src/src/qp8-f32-qb4w-gemm/qp8-f32-qb4w-gemm-minmax-8x4c16s2-mstep2-neoni8mm.c",
+      "src/src/qp8-f32-qb4w-gemm/qp8-f32-qb4w-gemm-minmax-16x4c16s2-mstep4-neoni8mm.c",
     ]
 
     configs -= [ "//build/config/compiler:chromium_code" ]
@@ -35907,7 +36084,7 @@
 
     sources = [
       "src/include/xnnpack.h",
-      "src/src/qp8-f32-qb4w-gemm/qp8-f32-qb4w-gemm-minmax-8x4c16s2-mstep2-neoni8mm.c",
+      "src/src/qp8-f32-qb4w-gemm/qp8-f32-qb4w-gemm-minmax-16x4c16s2-mstep4-neoni8mm.c",
     ]
 
     configs -= [ "//build/config/compiler:chromium_code" ]
@@ -36309,6 +36486,7 @@
     sources = [
       "src/include/xnnpack.h",
       "src/src/qs8-packw/gen/qs8-packw-x64c4-gemm-goi-scalar.c",
+      "src/src/qs8-packw/gen/qs8-packw-x8c8-gemm-goi-scalar.c",
     ]
 
     configs -= [ "//build/config/compiler:chromium_code" ]
@@ -36332,6 +36510,7 @@
     sources = [
       "src/include/xnnpack.h",
       "src/src/qs8-packw/gen/qs8-packw-x64c4-gemm-goi-scalar.c",
+      "src/src/qs8-packw/gen/qs8-packw-x8c8-gemm-goi-scalar.c",
     ]
 
     configs -= [ "//build/config/compiler:chromium_code" ]
@@ -36915,6 +37094,55 @@
     }
   }
 
+  source_set("qs8-qu8-packw_arm64") {
+    cflags = []
+
+    sources = [
+      "src/include/xnnpack.h",
+      "src/src/qs8-qu8-packw/gen/qs8-qu8-packw-x16c8-gemm-goi-scalar.c",
+    ]
+
+    configs -= [ "//build/config/compiler:chromium_code" ]
+    configs += [ "//build/config/compiler:no_chromium_code" ]
+    configs += [ "//build/config/sanitizers:cfi_icall_generalize_pointers" ]
+
+    deps = [
+      "//third_party/cpuinfo",
+      "//third_party/fp16",
+      "//third_party/fxdiv",
+      "//third_party/pthreadpool",
+    ]
+
+    public_configs = [ ":xnnpack_config" ]
+  }
+
+  # This is a target that cannot depend on //base.
+  source_set("qs8-qu8-packw_arm64_standalone") {
+    cflags = []
+
+    sources = [
+      "src/include/xnnpack.h",
+      "src/src/qs8-qu8-packw/gen/qs8-qu8-packw-x16c8-gemm-goi-scalar.c",
+    ]
+
+    configs -= [ "//build/config/compiler:chromium_code" ]
+    configs += [ "//build/config/compiler:no_chromium_code" ]
+    configs += [ "//build/config/sanitizers:cfi_icall_generalize_pointers" ]
+
+    deps = [
+      "//third_party/cpuinfo",
+      "//third_party/fp16",
+      "//third_party/fxdiv",
+      "//third_party/pthreadpool:pthreadpool_standalone",
+    ]
+
+    public_configs = [ ":xnnpack_config" ]
+
+    if (!(is_android && use_order_profiling)) {
+      assert_no_deps = [ "//base" ]
+    }
+  }
+
   source_set("qs8-rdsum_arm64") {
     cflags = []
 
diff --git a/third_party/xnnpack/README.chromium b/third_party/xnnpack/README.chromium
index fa4085ef..a9990537 100644
--- a/third_party/xnnpack/README.chromium
+++ b/third_party/xnnpack/README.chromium
@@ -1,8 +1,8 @@
 Name: XNNPACK
 Short Name: xnnpack
 URL: https://github.com/google/xnnpack
-Version: 14ce5c47ebf2ff79e3dc2f1d319ad7b1793e1b21
-Date: 2024-10-07
+Version: d5d572e46ed3929fa3e67f6174192893943cf724
+Date: 2024-10-10
 License: BSD
 License File: src/LICENSE
 Security Critical: Yes
diff --git a/third_party/xnnpack/build_identifier.c b/third_party/xnnpack/build_identifier.c
index e8dbd63..19adf44f 100644
--- a/third_party/xnnpack/build_identifier.c
+++ b/third_party/xnnpack/build_identifier.c
@@ -7,933 +7,937 @@
 //   Generator: scripts/generate-build-identifier.py
 //
 // The following inputs were used to generate this file.
-// - src/packing.cc
+// - src/configs/hardware-config.c
 // - src/enums/allocation-type.c
 // - src/enums/datatype-strings.c
 // - src/enums/microkernel-type.c
 // - src/enums/node-type.c
 // - src/enums/operator-type.c
-// - src/log.c
-// - src/configs/hardware-config.c
-// - src/params.c
-// - src/memory.c
-// - src/mutex.c
-// - src/tables/exp2-k-over-64.c
-// - src/tables/exp2-k-over-2048.c
-// - src/tables/exp2minus-k-over-4.c
-// - src/tables/exp2minus-k-over-8.c
-// - src/tables/exp2minus-k-over-16.c
-// - src/tables/exp2minus-k-over-32.c
-// - src/tables/exp2minus-k-over-64.c
-// - src/tables/exp2minus-k-over-2048.c
-// - src/tables/vlog.c
-// - src/f16-f32-vcvt/gen/f16-f32-vcvt-scalar-u1.c
-// - src/f16-f32-vcvt/gen/f16-f32-vcvt-scalar-u4.c
-// - src/f16-qs8-vcvt/gen/f16-qs8-vcvt-scalar-imagic-u4.c
-// - src/f16-rminmax/gen/f16-rmax-scalar-u2-acc2.c
-// - src/f16-rminmax/gen/f16-rminmax-scalar-u2-acc2.c
-// - src/f32-argmaxpool/f32-argmaxpool-4x-scalar-c1.c
-// - src/f32-argmaxpool/f32-argmaxpool-9p8x-scalar-c1.c
-// - src/f32-argmaxpool/f32-argmaxpool-9x-scalar-c1.c
-// - src/f32-avgpool/f32-avgpool-9p8x-minmax-scalar-c1.c
-// - src/f32-avgpool/f32-avgpool-9x-minmax-scalar-c1.c
-// - src/f32-conv-hwc2chw/f32-conv-hwc2chw-3x3s2p1c3x4-scalar-1x1.c
-// - src/f32-dwconv/gen/f32-dwconv-2f2m2l4c1s1r-minmax-scalar-acc2.c
-// - src/f32-dwconv/gen/f32-dwconv-3p1c-minmax-scalar-acc2.c
-// - src/f32-dwconv/gen/f32-dwconv-3p1c-scalar-acc2.c
-// - src/f32-dwconv/gen/f32-dwconv-4p1c-minmax-scalar-acc2.c
-// - src/f32-dwconv/gen/f32-dwconv-4p1c-scalar-acc2.c
-// - src/f32-dwconv/gen/f32-dwconv-9p1c-minmax-scalar-acc2.c
-// - src/f32-dwconv/gen/f32-dwconv-9p1c-scalar-acc2.c
-// - src/f32-dwconv/gen/f32-dwconv-25p1c-minmax-scalar-acc2.c
-// - src/f32-dwconv/gen/f32-dwconv-25p1c-scalar-acc2.c
-// - src/f32-dwconv2d-chw/gen/f32-dwconv2d-chw-3x3p1-minmax-scalar-2x1-acc2.c
-// - src/f32-dwconv2d-chw/gen/f32-dwconv2d-chw-3x3p1-minmax-scalar-4x1.c
-// - src/f32-dwconv2d-chw/gen/f32-dwconv2d-chw-3x3s2p1-minmax-scalar-1x1-acc2.c
-// - src/f32-dwconv2d-chw/gen/f32-dwconv2d-chw-3x3s2p1-minmax-scalar-2x1-acc2.c
-// - src/f32-dwconv2d-chw/gen/f32-dwconv2d-chw-5x5p2-minmax-scalar-1x1-acc5.c
-// - src/f32-dwconv2d-chw/gen/f32-dwconv2d-chw-5x5p2-minmax-scalar-2x1-acc2.c
-// - src/f32-dwconv2d-chw/gen/f32-dwconv2d-chw-5x5s2p2-minmax-scalar-1x1-acc5.c
-// - src/f32-dwconv2d-chw/gen/f32-dwconv2d-chw-5x5s2p2-minmax-scalar-2x1-acc2.c
-// - src/f32-f16-vcvt/gen/f32-f16-vcvt-scalar-bitcast-u4.c
-// - src/f32-f16-vcvt/gen/f32-f16-vcvt-scalar-fabsf-u2.c
-// - src/f32-gavgpool-cw/f32-gavgpool-cw-scalar-u1.c
-// - src/f32-gavgpool/f32-gavgpool-7p7x-minmax-scalar-c1.c
-// - src/f32-gavgpool/f32-gavgpool-7x-minmax-scalar-c1.c
-// - src/f32-gemm/gen/f32-gemm-1x4-minmax-scalar.c
-// - src/f32-gemm/gen/f32-gemm-1x4-relu-scalar.c
-// - src/f32-gemm/gen/f32-gemm-1x4-scalar.c
-// - src/f32-gemm/gen/f32-gemm-2x4-minmax-scalar.c
-// - src/f32-gemm/gen/f32-gemm-2x4-relu-scalar.c
-// - src/f32-gemm/gen/f32-gemm-2x4-scalar.c
-// - src/f32-gemm/gen/f32-gemm-4x2-minmax-scalar.c
-// - src/f32-gemm/gen/f32-gemm-4x2-scalar.c
-// - src/f32-gemm/gen/f32-gemm-4x4-minmax-scalar.c
-// - src/f32-gemm/gen/f32-gemm-4x4-relu-scalar.c
-// - src/f32-gemm/gen/f32-gemm-4x4-scalar.c
-// - src/f32-ibilinear-chw/gen/f32-ibilinear-chw-scalar-p4.c
-// - src/f32-ibilinear/gen/f32-ibilinear-scalar-c2.c
-// - src/f32-igemm/gen/f32-igemm-1x4-minmax-scalar.c
-// - src/f32-igemm/gen/f32-igemm-1x4-relu-scalar.c
-// - src/f32-igemm/gen/f32-igemm-1x4-scalar.c
-// - src/f32-igemm/gen/f32-igemm-2x4-minmax-scalar.c
-// - src/f32-igemm/gen/f32-igemm-2x4-relu-scalar.c
-// - src/f32-igemm/gen/f32-igemm-2x4-scalar.c
-// - src/f32-igemm/gen/f32-igemm-4x2-minmax-scalar.c
-// - src/f32-igemm/gen/f32-igemm-4x2-scalar.c
-// - src/f32-igemm/gen/f32-igemm-4x4-minmax-scalar.c
-// - src/f32-igemm/gen/f32-igemm-4x4-relu-scalar.c
-// - src/f32-igemm/gen/f32-igemm-4x4-scalar.c
-// - src/f32-maxpool/f32-maxpool-9p8x-minmax-scalar-c1.c
-// - src/f32-pavgpool/f32-pavgpool-9p8x-minmax-scalar-c1.c
-// - src/f32-pavgpool/f32-pavgpool-9x-minmax-scalar-c1.c
-// - src/f32-prelu/gen/f32-prelu-scalar-2x4.c
-// - src/f32-qc4w-gemm/gen/f32-qc4w-gemm-1x4-minmax-scalar.c
-// - src/f32-qc4w-gemm/gen/f32-qc4w-gemm-4x4-minmax-scalar.c
-// - src/f32-qc8w-gemm/gen/f32-qc8w-gemm-1x4-minmax-scalar.c
-// - src/f32-qc8w-gemm/gen/f32-qc8w-gemm-4x4-minmax-scalar.c
-// - src/f32-qs8-vcvt/gen/f32-qs8-vcvt-scalar-imagic-u1.c
-// - src/f32-qs8-vcvt/gen/f32-qs8-vcvt-scalar-imagic-u4.c
-// - src/f32-qs8-vcvt/gen/f32-qs8-vcvt-scalar-lrintf-u4.c
-// - src/f32-qu8-vcvt/gen/f32-qu8-vcvt-scalar-imagic-u1.c
-// - src/f32-qu8-vcvt/gen/f32-qu8-vcvt-scalar-imagic-u4.c
-// - src/f32-qu8-vcvt/gen/f32-qu8-vcvt-scalar-lrintf-u4.c
-// - src/f32-raddstoreexpminusmax/gen/f32-raddstoreexpminusmax-scalar-rr2-p5-u4-acc2.c
-// - src/f32-rdsum/gen/f32-rdsum-7p7x-minmax-scalar.c
-// - src/f32-rminmax/gen/f32-rmax-scalar-u4-acc4.c
-// - src/f32-rminmax/gen/f32-rminmax-scalar-u4-acc4.c
-// - src/f32-rsum/gen/f32-rsum-scalar-u4-acc4.c
-// - src/f32-spmm/gen/f32-spmm-8x1-minmax-scalar.c
-// - src/f32-spmm/gen/f32-spmm-8x2-minmax-scalar.c
-// - src/f32-spmm/gen/f32-spmm-8x4-minmax-scalar.c
-// - src/f32-vbinary/gen/f32-vadd-scalar-u8.c
-// - src/f32-vbinary/gen/f32-vaddc-scalar-u8.c
-// - src/f32-vbinary/gen/f32-vdiv-scalar-u2.c
-// - src/f32-vbinary/gen/f32-vdivc-scalar-u2.c
-// - src/f32-vbinary/gen/f32-vmax-scalar-u8.c
-// - src/f32-vbinary/gen/f32-vmaxc-scalar-u8.c
-// - src/f32-vbinary/gen/f32-vmin-scalar-u8.c
-// - src/f32-vbinary/gen/f32-vminc-scalar-u8.c
-// - src/f32-vbinary/gen/f32-vmul-scalar-u8.c
-// - src/f32-vbinary/gen/f32-vmulc-scalar-u8.c
-// - src/f32-vbinary/gen/f32-vrdivc-scalar-u2.c
-// - src/f32-vbinary/gen/f32-vrsubc-scalar-u8.c
-// - src/f32-vbinary/gen/f32-vsqrdiff-scalar-u8.c
-// - src/f32-vbinary/gen/f32-vsqrdiffc-scalar-u8.c
-// - src/f32-vbinary/gen/f32-vsub-scalar-u8.c
-// - src/f32-vbinary/gen/f32-vsubc-scalar-u8.c
-// - src/f32-vclamp/gen/f32-vclamp-scalar-u4.c
-// - src/f32-vcmul/gen/f32-vcmul-scalar-u4.c
-// - src/f32-vcopysign/gen/f32-vcopysign-scalar.c
-// - src/f32-vcopysign/gen/f32-vcopysignc-scalar.c
-// - src/f32-vcopysign/gen/f32-vrcopysignc-scalar.c
-// - src/f32-velu/gen/f32-velu-scalar-rr2-lut16-p3-u2.c
-// - src/f32-velu/gen/f32-velu-scalar-rr2-lut16-p3-u4.c
-// - src/f32-vexp/gen/f32-vexp-scalar-exp.c
-// - src/f32-vgelu/gen/f32-vgelu-scalar-rational-12-10-div.c
-// - src/f32-vhswish/gen/f32-vhswish-scalar-u4.c
-// - src/f32-vlog/gen/f32-vlog-scalar-rational-3-3-div.c
-// - src/f32-vlrelu/gen/f32-vlrelu-scalar-u4.c
-// - src/f32-vmulcaddc/gen/f32-vmulcaddc-c1-minmax-scalar-2x.c
-// - src/f32-vrelu/gen/f32-vrelu-scalar-u8.c
-// - src/f32-vrnd/gen/f32-vrndd-scalar-libm-u1.c
-// - src/f32-vrnd/gen/f32-vrndd-scalar-libm-u4.c
-// - src/f32-vrnd/gen/f32-vrndne-scalar-libm-u1.c
-// - src/f32-vrnd/gen/f32-vrndne-scalar-libm-u4.c
-// - src/f32-vrnd/gen/f32-vrndu-scalar-libm-u1.c
-// - src/f32-vrnd/gen/f32-vrndu-scalar-libm-u4.c
-// - src/f32-vrnd/gen/f32-vrndz-scalar-libm-u1.c
-// - src/f32-vrnd/gen/f32-vrndz-scalar-libm-u4.c
-// - src/f32-vrsqrt/gen/f32-vrsqrt-scalar-rsqrt-u1.c
-// - src/f32-vrsqrt/gen/f32-vrsqrt-scalar-rsqrt-u4.c
-// - src/f32-vsigmoid/gen/f32-vsigmoid-scalar-rr2-lut64-p2-div-u2.c
-// - src/f32-vsqrt/gen/f32-vsqrt-scalar-sqrt-u1.c
-// - src/f32-vtanh/gen/f32-vtanh-scalar-rational-9-8-div.c
-// - src/f32-vunary/gen/f32-vabs-scalar.c
-// - src/f32-vunary/gen/f32-vneg-scalar.c
-// - src/f32-vunary/gen/f32-vsqr-scalar.c
-// - src/qd8-f32-qb4w-gemm/gen/qd8-f32-qb4w-gemm-1x4-minmax-scalar.c
-// - src/qd8-f32-qb4w-gemm/gen/qd8-f32-qb4w-gemm-4x4-minmax-scalar.c
-// - src/qd8-f32-qc4w-gemm/gen/qd8-f32-qc4w-gemm-1x4-minmax-scalar.c
-// - src/qd8-f32-qc4w-gemm/gen/qd8-f32-qc4w-gemm-4x4-minmax-scalar.c
-// - src/qd8-f32-qc8w-gemm/gen/qd8-f32-qc8w-gemm-1x2-minmax-scalar.c
-// - src/qd8-f32-qc8w-gemm/gen/qd8-f32-qc8w-gemm-1x4-minmax-scalar.c
-// - src/qd8-f32-qc8w-gemm/gen/qd8-f32-qc8w-gemm-2x2-minmax-scalar.c
-// - src/qd8-f32-qc8w-gemm/gen/qd8-f32-qc8w-gemm-4x4-minmax-scalar.c
-// - src/qd8-f32-qc8w-igemm/gen/qd8-f32-qc8w-igemm-1x2-minmax-scalar.c
-// - src/qd8-f32-qc8w-igemm/gen/qd8-f32-qc8w-igemm-1x4-minmax-scalar.c
-// - src/qd8-f32-qc8w-igemm/gen/qd8-f32-qc8w-igemm-2x2-minmax-scalar.c
-// - src/qd8-f32-qc8w-igemm/gen/qd8-f32-qc8w-igemm-4x4-minmax-scalar.c
-// - src/qs8-dwconv/gen/qs8-dwconv-9p1c-minmax-fp32-scalar-fmagic.c
-// - src/qs8-dwconv/gen/qs8-dwconv-9p2c-minmax-fp32-scalar-imagic.c
-// - src/qs8-dwconv/gen/qs8-dwconv-9p2c-minmax-fp32-scalar-lrintf.c
-// - src/qs8-dwconv/gen/qs8-dwconv-25p1c-minmax-fp32-scalar-fmagic.c
-// - src/qs8-dwconv/gen/qs8-dwconv-25p1c-minmax-fp32-scalar-imagic.c
-// - src/qs8-dwconv/gen/qs8-dwconv-25p2c-minmax-fp32-scalar-lrintf.c
-// - src/qs8-f32-vcvt/gen/qs8-f32-vcvt-scalar-u1.c
-// - src/qs8-f32-vcvt/gen/qs8-f32-vcvt-scalar-u4.c
-// - src/qs8-gavgpool/gen/qs8-gavgpool-7p7x-minmax-fp32-scalar-imagic-c1.c
-// - src/qs8-gavgpool/gen/qs8-gavgpool-7p7x-minmax-fp32-scalar-imagic-c4.c
-// - src/qs8-gavgpool/gen/qs8-gavgpool-7x-minmax-fp32-scalar-imagic-c1.c
-// - src/qs8-gavgpool/gen/qs8-gavgpool-7x-minmax-fp32-scalar-imagic-c4.c
-// - src/qs8-packw/gen/qs8-packw-x64c4-gemm-goi-scalar.c
-// - src/qs8-qc8w-dwconv/gen/qs8-qc8w-dwconv-3p1c-minmax-fp32-scalar-fmagic.c
-// - src/qs8-qc8w-dwconv/gen/qs8-qc8w-dwconv-3p2c-minmax-fp32-scalar-imagic.c
-// - src/qs8-qc8w-dwconv/gen/qs8-qc8w-dwconv-3p2c-minmax-fp32-scalar-lrintf.c
-// - src/qs8-qc8w-dwconv/gen/qs8-qc8w-dwconv-9p1c-minmax-fp32-scalar-fmagic.c
-// - src/qs8-qc8w-dwconv/gen/qs8-qc8w-dwconv-9p2c-minmax-fp32-scalar-imagic.c
-// - src/qs8-qc8w-dwconv/gen/qs8-qc8w-dwconv-9p2c-minmax-fp32-scalar-lrintf.c
-// - src/qs8-qc8w-dwconv/gen/qs8-qc8w-dwconv-25p1c-minmax-fp32-scalar-fmagic.c
-// - src/qs8-qc8w-dwconv/gen/qs8-qc8w-dwconv-25p1c-minmax-fp32-scalar-imagic.c
-// - src/qs8-qc8w-dwconv/gen/qs8-qc8w-dwconv-25p2c-minmax-fp32-scalar-lrintf.c
-// - src/qs8-qc8w-gemm/gen/qs8-qc8w-gemm-1x2-minmax-fp32-scalar-imagic.c
-// - src/qs8-qc8w-gemm/gen/qs8-qc8w-gemm-1x4-minmax-fp32-scalar-lrintf.c
-// - src/qs8-qc8w-gemm/gen/qs8-qc8w-gemm-2x2-minmax-fp32-scalar-imagic.c
-// - src/qs8-qc8w-gemm/gen/qs8-qc8w-gemm-3x4-minmax-fp32-scalar-lrintf.c
-// - src/qs8-qc8w-igemm/gen/qs8-qc8w-igemm-1x2-minmax-fp32-scalar-imagic.c
-// - src/qs8-qc8w-igemm/gen/qs8-qc8w-igemm-1x4-minmax-fp32-scalar-lrintf.c
-// - src/qs8-qc8w-igemm/gen/qs8-qc8w-igemm-2x2-minmax-fp32-scalar-imagic.c
-// - src/qs8-qc8w-igemm/gen/qs8-qc8w-igemm-3x4-minmax-fp32-scalar-lrintf.c
-// - src/qs8-rdsum/gen/qs8-rdsum-minmax-fp32-scalar-u1-acc1.c
-// - src/qs8-rsum/gen/qs8-rsum-scalar-u4.c
-// - src/qs8-vadd/gen/qs8-vadd-minmax-scalar-u1.c
-// - src/qs8-vadd/gen/qs8-vadd-minmax-scalar-u4.c
-// - src/qs8-vaddc/gen/qs8-vaddc-minmax-scalar-u1.c
-// - src/qs8-vaddc/gen/qs8-vaddc-minmax-scalar-u4.c
-// - src/qs8-vcvt/gen/qs8-vcvt-scalar-u1.c
-// - src/qs8-vcvt/gen/qs8-vcvt-scalar-u4.c
-// - src/qs8-vlrelu/gen/qs8-vlrelu-scalar-andxor-u4.c
-// - src/qs8-vlrelu/gen/qs8-vlrelu-scalar-select-u4.c
-// - src/qs8-vmul/gen/qs8-vmul-minmax-fp32-scalar-u4.c
-// - src/qs8-vmulc/gen/qs8-vmulc-minmax-fp32-scalar-u4.c
-// - src/qs16-qs8-vcvt/gen/qs16-qs8-vcvt-scalar-u4.c
-// - src/qu8-avgpool/qu8-avgpool-9p8x-minmax-fp32-scalar-imagic-c1.c
-// - src/qu8-avgpool/qu8-avgpool-9x-minmax-fp32-scalar-imagic-c1.c
-// - src/qu8-dwconv/gen/qu8-dwconv-9p1c-minmax-fp32-scalar-fmagic.c
-// - src/qu8-dwconv/gen/qu8-dwconv-9p2c-minmax-fp32-scalar-imagic.c
-// - src/qu8-dwconv/gen/qu8-dwconv-9p2c-minmax-fp32-scalar-lrintf.c
-// - src/qu8-dwconv/gen/qu8-dwconv-25p1c-minmax-fp32-scalar-fmagic.c
-// - src/qu8-dwconv/gen/qu8-dwconv-25p1c-minmax-fp32-scalar-imagic.c
-// - src/qu8-dwconv/gen/qu8-dwconv-25p2c-minmax-fp32-scalar-lrintf.c
-// - src/qu8-f32-vcvt/gen/qu8-f32-vcvt-scalar-u1.c
-// - src/qu8-f32-vcvt/gen/qu8-f32-vcvt-scalar-u4.c
-// - src/qu8-gavgpool/gen/qu8-gavgpool-7p7x-minmax-fp32-scalar-imagic-c1.c
-// - src/qu8-gavgpool/gen/qu8-gavgpool-7p7x-minmax-fp32-scalar-imagic-c4.c
-// - src/qu8-gavgpool/gen/qu8-gavgpool-7x-minmax-fp32-scalar-imagic-c1.c
-// - src/qu8-gavgpool/gen/qu8-gavgpool-7x-minmax-fp32-scalar-imagic-c4.c
-// - src/qu8-gemm/gen/qu8-gemm-1x2-minmax-fp32-scalar-imagic.c
-// - src/qu8-gemm/gen/qu8-gemm-1x4-minmax-fp32-scalar-lrintf.c
-// - src/qu8-gemm/gen/qu8-gemm-2x2-minmax-fp32-scalar-imagic.c
-// - src/qu8-gemm/gen/qu8-gemm-3x4-minmax-fp32-scalar-lrintf.c
-// - src/qu8-igemm/gen/qu8-igemm-1x2-minmax-fp32-scalar-imagic.c
-// - src/qu8-igemm/gen/qu8-igemm-1x4-minmax-fp32-scalar-lrintf.c
-// - src/qu8-igemm/gen/qu8-igemm-2x2-minmax-fp32-scalar-imagic.c
-// - src/qu8-igemm/gen/qu8-igemm-3x4-minmax-fp32-scalar-lrintf.c
-// - src/qu8-rdsum/gen/qu8-rdsum-scalar.c
-// - src/qu8-rsum/gen/qu8-rsum-scalar-u4.c
-// - src/qu8-vadd/gen/qu8-vadd-minmax-scalar-u1.c
-// - src/qu8-vadd/gen/qu8-vadd-minmax-scalar-u4.c
-// - src/qu8-vaddc/gen/qu8-vaddc-minmax-scalar-u1.c
-// - src/qu8-vaddc/gen/qu8-vaddc-minmax-scalar-u4.c
-// - src/qu8-vcvt/gen/qu8-vcvt-scalar-u1.c
-// - src/qu8-vcvt/gen/qu8-vcvt-scalar-u4.c
-// - src/qu8-vlrelu/gen/qu8-vlrelu-scalar-andxor-u4.c
-// - src/qu8-vlrelu/gen/qu8-vlrelu-scalar-select-u4.c
-// - src/qu8-vmul/gen/qu8-vmul-minmax-fp32-scalar-u4.c
-// - src/qu8-vmulc/gen/qu8-vmulc-minmax-fp32-scalar-u4.c
-// - src/s8-ibilinear/gen/s8-ibilinear-scalar-c1.c
-// - src/s8-maxpool/s8-maxpool-9p8x-minmax-scalar-c1.c
-// - src/s8-vclamp/s8-vclamp-scalar-u4.c
-// - src/s32-f32-vcvt/gen/s32-f32-vcvt-scalar.c
-// - src/s32-vmul/gen/s32-vmul-scalar.c
-// - src/s32-vmul/gen/s32-vmulc-scalar.c
-// - src/u8-ibilinear/gen/u8-ibilinear-scalar-c1.c
-// - src/u8-lut32norm/u8-lut32norm-scalar.c
-// - src/u8-maxpool/u8-maxpool-9p8x-minmax-scalar-c1.c
-// - src/u8-rmax/u8-rmax-scalar-u2.c
-// - src/u8-vclamp/u8-vclamp-scalar-u4.c
-// - src/u32-f32-vcvt/gen/u32-f32-vcvt-scalar.c
-// - src/x8-lut/gen/x8-lut-scalar-u4.c
-// - src/x8-packq/x8-packq-scalar-f32qp8-u1.c
-// - src/x8-packw/gen/x8-packw-x4-gemm-goi-scalar-u2.c
-// - src/x8-packw/gen/x8-packw-x8-gemm-goi-scalar-u2.c
-// - src/x8-packw/gen/x8-packw-x16-gemm-goi-scalar-u2.c
-// - src/x8-packw/gen/x8-packw-x32-gemm-goi-scalar-u2.c
-// - src/x8-transposec/gen/x8-transposec-2x4-scalar-int.c
-// - src/x8-zip/x8-zip-x2-scalar.c
-// - src/x8-zip/x8-zip-x3-scalar.c
-// - src/x8-zip/x8-zip-x4-scalar.c
-// - src/x8-zip/x8-zip-xm-scalar.c
-// - src/x16-packw/gen/x16-packw-x64-gemm-goi-scalar-int-u4.c
-// - src/x16-transposec/gen/x16-transposec-2x4-scalar-int.c
-// - src/x24-transposec/gen/x24-transposec-1x2-scalar.c
-// - src/x32-packw/gen/x32-packw-x2-gemm-goi-scalar-float-u4.c
-// - src/x32-packw/gen/x32-packw-x4-gemm-goi-scalar-float-u4.c
-// - src/x32-transposec/gen/x32-transposec-2x4-scalar-int.c
-// - src/x32-unpool/x32-unpool-scalar.c
-// - src/x32-zip/x32-zip-x2-scalar.c
-// - src/x32-zip/x32-zip-x3-scalar.c
-// - src/x32-zip/x32-zip-x4-scalar.c
-// - src/x32-zip/x32-zip-xm-scalar.c
-// - src/x64-transposec/gen/x64-transposec-4x2-scalar-int.c
-// - src/xx-copy/xx-copy-scalar-memcpy.c
-// - src/xx-fill/xx-fill-scalar-u16.c
-// - src/xx-pad/xx-pad-p4-scalar-u16.c
-// - src/xx-transposev/xx-transposev-1x1-scalar-memcpy.c
-// - src/f32-avgpool/f32-avgpool-9p8x-minmax-sse-c4.c
-// - src/f32-avgpool/f32-avgpool-9x-minmax-sse-c4.c
-// - src/f32-conv-hwc2chw/f32-conv-hwc2chw-3x3s2p1c3x4-sse-2x2.c
-// - src/f32-dwconv/gen/f32-dwconv-3p8c-minmax-sse.c
-// - src/f32-dwconv/gen/f32-dwconv-4p8c-minmax-sse.c
-// - src/f32-dwconv/gen/f32-dwconv-8f8m9l16c4s4r-minmax-sse.c
-// - src/f32-dwconv/gen/f32-dwconv-9p8c-minmax-sse.c
-// - src/f32-dwconv/gen/f32-dwconv-25p8c-minmax-sse.c
-// - src/f32-dwconv2d-chw/gen/f32-dwconv2d-chw-3x3p1-minmax-sse-2x4-acc2.c
-// - src/f32-dwconv2d-chw/gen/f32-dwconv2d-chw-3x3s2p1-minmax-sse-1x4-acc3.c
-// - src/f32-dwconv2d-chw/gen/f32-dwconv2d-chw-5x5p2-minmax-sse-4x4.c
-// - src/f32-dwconv2d-chw/gen/f32-dwconv2d-chw-5x5s2p2-minmax-sse-2x4.c
-// - src/f32-gavgpool-cw/f32-gavgpool-cw-sse-u4.c
-// - src/f32-gavgpool/f32-gavgpool-7p7x-minmax-sse-c4.c
-// - src/f32-gavgpool/f32-gavgpool-7x-minmax-sse-c4.c
-// - src/f32-gemm/gen/f32-gemm-1x8-minmax-sse-load1.c
-// - src/f32-gemm/gen/f32-gemm-4x2c4-minmax-sse.c
-// - src/f32-gemm/gen/f32-gemm-4x8-minmax-sse-load1.c
-// - src/f32-ibilinear-chw/gen/f32-ibilinear-chw-sse-p8.c
-// - src/f32-ibilinear/gen/f32-ibilinear-sse-c8.c
-// - src/f32-igemm/gen/f32-igemm-1x8-minmax-sse-load1.c
-// - src/f32-igemm/gen/f32-igemm-4x2c4-minmax-sse.c
-// - src/f32-igemm/gen/f32-igemm-4x8-minmax-sse-load1.c
-// - src/f32-maxpool/f32-maxpool-9p8x-minmax-sse-c4.c
-// - src/f32-pavgpool/f32-pavgpool-9p8x-minmax-sse-c4.c
-// - src/f32-pavgpool/f32-pavgpool-9x-minmax-sse-c4.c
-// - src/f32-rdsum/gen/f32-rdsum-7p7x-minmax-sse-c16.c
-// - src/f32-rminmax/gen/f32-rmax-sse-u16-acc4.c
-// - src/f32-rminmax/gen/f32-rminmax-sse-u16-acc4.c
-// - src/f32-rsum/gen/f32-rsum-sse-u16-acc4.c
-// - src/f32-spmm/gen/f32-spmm-32x1-minmax-sse.c
-// - src/f32-vbinary/gen/f32-vadd-sse-u8.c
-// - src/f32-vbinary/gen/f32-vaddc-sse-u8.c
-// - src/f32-vbinary/gen/f32-vdiv-sse-u8.c
-// - src/f32-vbinary/gen/f32-vdivc-sse-u8.c
-// - src/f32-vbinary/gen/f32-vmax-sse-u8.c
-// - src/f32-vbinary/gen/f32-vmaxc-sse-u8.c
-// - src/f32-vbinary/gen/f32-vmin-sse-u8.c
-// - src/f32-vbinary/gen/f32-vminc-sse-u8.c
-// - src/f32-vbinary/gen/f32-vmul-sse-u8.c
-// - src/f32-vbinary/gen/f32-vmulc-sse-u8.c
-// - src/f32-vbinary/gen/f32-vrdivc-sse-u8.c
-// - src/f32-vbinary/gen/f32-vrsubc-sse-u8.c
-// - src/f32-vbinary/gen/f32-vsqrdiff-sse-u8.c
-// - src/f32-vbinary/gen/f32-vsqrdiffc-sse-u8.c
-// - src/f32-vbinary/gen/f32-vsub-sse-u8.c
-// - src/f32-vbinary/gen/f32-vsubc-sse-u8.c
-// - src/f32-vclamp/gen/f32-vclamp-sse-u8.c
-// - src/f32-vcmul/gen/f32-vcmul-sse-u8.c
-// - src/f32-vhswish/gen/f32-vhswish-sse-u8.c
-// - src/f32-vlrelu/gen/f32-vlrelu-sse-u8.c
-// - src/f32-vmulcaddc/gen/f32-vmulcaddc-c4-minmax-sse-2x.c
-// - src/f32-vrsqrt/gen/f32-vrsqrt-sse-rsqrt-u8.c
-// - src/f32-vsqrt/gen/f32-vsqrt-sse-rsqrt-u12.c
-// - src/x32-transposec/x32-transposec-4x4-sse.c
-// - src/f16-f32-vcvt/gen/f16-f32-vcvt-sse2-int16-u32.c
-// - src/f16-vunary/gen/f16-vabs-sse2-u16.c
-// - src/f16-vunary/gen/f16-vneg-sse2-u16.c
-// - src/f32-argmaxpool/f32-argmaxpool-4x-sse2-c4.c
-// - src/f32-argmaxpool/f32-argmaxpool-9p8x-sse2-c4.c
-// - src/f32-argmaxpool/f32-argmaxpool-9x-sse2-c4.c
-// - src/f32-f16-vcvt/gen/f32-f16-vcvt-sse2-u16.c
-// - src/f32-prelu/gen/f32-prelu-sse2-2x8.c
-// - src/f32-qs8-vcvt/gen/f32-qs8-vcvt-sse2-u32.c
-// - src/f32-qu8-vcvt/gen/f32-qu8-vcvt-sse2-u32.c
-// - src/f32-raddstoreexpminusmax/gen/f32-raddstoreexpminusmax-sse2-rr2-p5-u16-acc2.c
-// - src/f32-vcopysign/gen/f32-vcopysign-sse2.c
-// - src/f32-vcopysign/gen/f32-vcopysignc-sse2.c
-// - src/f32-vcopysign/gen/f32-vrcopysignc-sse2.c
-// - src/f32-velu/gen/f32-velu-sse2-rr2-lut16-p3-u12.c
-// - src/f32-vgelu/gen/f32-vgelu-sse2-rational-12-10-div.c
-// - src/f32-vlog/gen/f32-vlog-sse2-rational-3-3-div.c
-// - src/f32-vrnd/gen/f32-vrndd-sse2-u8.c
-// - src/f32-vrnd/gen/f32-vrndne-sse2-u8.c
-// - src/f32-vrnd/gen/f32-vrndu-sse2-u8.c
-// - src/f32-vrnd/gen/f32-vrndz-sse2-u8.c
-// - src/f32-vsigmoid/gen/f32-vsigmoid-sse2-rr2-lut64-p2-div-u8.c
-// - src/f32-vtanh/gen/f32-vtanh-sse2-rational-9-8-div.c
-// - src/f32-vunary/gen/f32-vabs-sse2.c
-// - src/f32-vunary/gen/f32-vneg-sse2.c
-// - src/f32-vunary/gen/f32-vsqr-sse2.c
-// - src/qd8-f32-qb4w-gemm/gen/qd8-f32-qb4w-gemm-1x4c8-minmax-sse2-ld128.c
-// - src/qd8-f32-qb4w-gemm/gen/qd8-f32-qb4w-gemm-4x4c8-minmax-sse2-ld128.c
-// - src/qd8-f32-qc4w-gemm/gen/qd8-f32-qc4w-gemm-1x4c8-minmax-sse2-ld128.c
-// - src/qd8-f32-qc4w-gemm/gen/qd8-f32-qc4w-gemm-4x4c8-minmax-sse2-ld128.c
-// - src/qd8-f32-qc8w-gemm/gen/qd8-f32-qc8w-gemm-1x4c8-minmax-sse2-ld64.c
-// - src/qd8-f32-qc8w-gemm/gen/qd8-f32-qc8w-gemm-4x4c8-minmax-sse2-ld64.c
-// - src/qd8-f32-qc8w-igemm/gen/qd8-f32-qc8w-igemm-1x4c8-minmax-sse2-ld64.c
-// - src/qd8-f32-qc8w-igemm/gen/qd8-f32-qc8w-igemm-4x4c8-minmax-sse2-ld64.c
-// - src/qs8-dwconv/gen/qs8-dwconv-9p8c-minmax-fp32-sse2-mul16-add16.c
-// - src/qs8-dwconv/gen/qs8-dwconv-25p8c-minmax-fp32-sse2-mul16-add16.c
-// - src/qs8-f32-vcvt/gen/qs8-f32-vcvt-sse2-u32.c
-// - src/qs8-gavgpool/gen/qs8-gavgpool-7p7x-minmax-fp32-sse2-c8.c
-// - src/qs8-gavgpool/gen/qs8-gavgpool-7x-minmax-fp32-sse2-c8.c
-// - src/qs8-qc8w-dwconv/gen/qs8-qc8w-dwconv-3p8c-minmax-fp32-sse2-mul16.c
-// - src/qs8-qc8w-dwconv/gen/qs8-qc8w-dwconv-9p8c-minmax-fp32-sse2-mul16.c
-// - src/qs8-qc8w-dwconv/gen/qs8-qc8w-dwconv-25p8c-minmax-fp32-sse2-mul16.c
-// - src/qs8-qc8w-gemm/gen/qs8-qc8w-gemm-1x4c8-minmax-fp32-sse2-ld64.c
-// - src/qs8-qc8w-gemm/gen/qs8-qc8w-gemm-3x4c8-minmax-fp32-sse2-ld64.c
-// - src/qs8-qc8w-igemm/gen/qs8-qc8w-igemm-1x4c8-minmax-fp32-sse2-ld64.c
-// - src/qs8-qc8w-igemm/gen/qs8-qc8w-igemm-3x4c8-minmax-fp32-sse2-ld64.c
-// - src/qs8-vadd/gen/qs8-vadd-minmax-sse2-mul16-ld64-u8.c
-// - src/qs8-vaddc/gen/qs8-vaddc-minmax-sse2-mul16-ld64-u8.c
-// - src/qs8-vcvt/gen/qs8-vcvt-sse2-u32.c
-// - src/qs8-vlrelu/gen/qs8-vlrelu-sse2-u32.c
-// - src/qs8-vmul/gen/qs8-vmul-minmax-fp32-sse2-mul16-ld64-u8.c
-// - src/qs8-vmulc/gen/qs8-vmulc-minmax-fp32-sse2-mul16-ld64-u8.c
-// - src/qs16-qs8-vcvt/gen/qs16-qs8-vcvt-sse2-u16.c
-// - src/qu8-avgpool/qu8-avgpool-9p8x-minmax-fp32-sse2-c8.c
-// - src/qu8-avgpool/qu8-avgpool-9x-minmax-fp32-sse2-c8.c
-// - src/qu8-dwconv/gen/qu8-dwconv-9p8c-minmax-fp32-sse2-mul16.c
-// - src/qu8-dwconv/gen/qu8-dwconv-25p8c-minmax-fp32-sse2-mul16.c
-// - src/qu8-f32-vcvt/gen/qu8-f32-vcvt-sse2-u32.c
-// - src/qu8-gavgpool/gen/qu8-gavgpool-7p7x-minmax-fp32-sse2-c8.c
-// - src/qu8-gavgpool/gen/qu8-gavgpool-7x-minmax-fp32-sse2-c8.c
-// - src/qu8-gemm/gen/qu8-gemm-1x4c8-minmax-fp32-sse2-ld64.c
-// - src/qu8-gemm/gen/qu8-gemm-3x4c8-minmax-fp32-sse2-ld64.c
-// - src/qu8-igemm/gen/qu8-igemm-1x4c8-minmax-fp32-sse2-ld64.c
-// - src/qu8-igemm/gen/qu8-igemm-3x4c8-minmax-fp32-sse2-ld64.c
-// - src/qu8-rsum/gen/qu8-rsum-sse2-u32.c
-// - src/qu8-vadd/gen/qu8-vadd-minmax-sse2-mul16-ld64-u8.c
-// - src/qu8-vaddc/gen/qu8-vaddc-minmax-sse2-mul16-ld64-u8.c
-// - src/qu8-vcvt/gen/qu8-vcvt-sse2-u32.c
-// - src/qu8-vlrelu/gen/qu8-vlrelu-sse2-u32.c
-// - src/qu8-vmul/gen/qu8-vmul-minmax-fp32-sse2-mul16-ld64-u8.c
-// - src/qu8-vmulc/gen/qu8-vmulc-minmax-fp32-sse2-mul16-ld64-u8.c
-// - src/s8-ibilinear/gen/s8-ibilinear-sse2-c8.c
-// - src/s8-maxpool/s8-maxpool-9p8x-minmax-sse2-c16.c
-// - src/s8-vclamp/s8-vclamp-sse2-u64.c
-// - src/u8-ibilinear/gen/u8-ibilinear-sse2-c8.c
-// - src/u8-maxpool/u8-maxpool-9p8x-minmax-sse2-c16.c
-// - src/u8-rmax/u8-rmax-sse2-u16.c
-// - src/u8-vclamp/u8-vclamp-sse2-u64.c
-// - src/x8-transposec/gen/x8-transposec-16x16-reuse-mov-sse2.c
-// - src/x8-zip/x8-zip-x2-sse2.c
-// - src/x8-zip/x8-zip-x3-sse2.c
-// - src/x8-zip/x8-zip-x4-sse2.c
-// - src/x8-zip/x8-zip-xm-sse2.c
-// - src/x16-transposec/gen/x16-transposec-8x8-reuse-multi-sse2.c
-// - src/x32-packw/gen/x32-packw-x2c4-gemm-goi-sse2-u4.c
-// - src/x32-packw/gen/x32-packw-x8-gemm-goi-sse2-u4.c
-// - src/x32-unpool/x32-unpool-sse2.c
-// - src/x32-zip/x32-zip-x2-sse2.c
-// - src/x32-zip/x32-zip-x3-sse2.c
-// - src/x32-zip/x32-zip-x4-sse2.c
-// - src/x32-zip/x32-zip-xm-sse2.c
-// - src/x64-transposec/gen/x64-transposec-2x2-multi-mov-sse2.c
-// - src/xx-fill/xx-fill-sse2-u64.c
-// - src/xx-pad/xx-pad-p16-sse2-u16.c
-// - src/f32-dwconv2d-chw/gen/f32-dwconv2d-chw-3x3p1-minmax-ssse3-2x4-acc2.c
-// - src/qd8-f32-qc4w-gemm/gen/qd8-f32-qc4w-gemm-1x4c8-minmax-ssse3-madd.c
-// - src/qd8-f32-qc4w-gemm/gen/qd8-f32-qc4w-gemm-4x4c8-minmax-ssse3-madd.c
-// - src/qs8-rsum/gen/qs8-rsum-ssse3-u32-acc2.c
-// - src/qs8-vcvt/gen/qs8-vcvt-ssse3-u32.c
-// - src/qs8-vlrelu/gen/qs8-vlrelu-ssse3-u32.c
-// - src/qs16-qs8-vcvt/gen/qs16-qs8-vcvt-ssse3-u16.c
-// - src/qu8-rdsum/gen/qu8-rdsum-7p7x-ssse3-c64.c
-// - src/qu8-vcvt/gen/qu8-vcvt-ssse3-u32.c
-// - src/qu8-vlrelu/gen/qu8-vlrelu-ssse3-u32.c
-// - src/x24-transposec/x24-transposec-4x4-ssse3.c
-// - src/f16-f32-vcvt/gen/f16-f32-vcvt-sse41-int16-u16.c
-// - src/f32-f16-vcvt/gen/f32-f16-vcvt-sse41-u8.c
-// - src/f32-prelu/gen/f32-prelu-sse41-2x8.c
-// - src/f32-qc4w-gemm/gen/f32-qc4w-gemm-1x8-minmax-sse41-dup.c
-// - src/f32-qc4w-gemm/gen/f32-qc4w-gemm-4x8-minmax-sse41-dup.c
-// - src/f32-qc8w-gemm/gen/f32-qc8w-gemm-1x8-minmax-sse41-dup.c
-// - src/f32-qc8w-gemm/gen/f32-qc8w-gemm-4x8-minmax-sse41-dup.c
-// - src/f32-qs8-vcvt/gen/f32-qs8-vcvt-sse41-u32.c
-// - src/f32-vlrelu/gen/f32-vlrelu-sse41-u8.c
-// - src/f32-vrnd/gen/f32-vrndd-sse41-u8.c
-// - src/f32-vrnd/gen/f32-vrndne-sse41-u8.c
-// - src/f32-vrnd/gen/f32-vrndu-sse41-u8.c
-// - src/f32-vrnd/gen/f32-vrndz-sse41-u8.c
-// - src/f32-vsigmoid/gen/f32-vsigmoid-sse41-rr2-lut64-p2-div-u8.c
-// - src/qd8-f32-qb4w-gemm/gen/qd8-f32-qb4w-gemm-1x4c8-minmax-sse41-ld128.c
-// - src/qd8-f32-qb4w-gemm/gen/qd8-f32-qb4w-gemm-3x4c8-minmax-sse41-ld128.c
-// - src/qd8-f32-qc8w-gemm/gen/qd8-f32-qc8w-gemm-1x4c8-minmax-sse41-ld64.c
-// - src/qd8-f32-qc8w-gemm/gen/qd8-f32-qc8w-gemm-4x4c8-minmax-sse41-ld64.c
-// - src/qd8-f32-qc8w-igemm/gen/qd8-f32-qc8w-igemm-1x4c8-minmax-sse41-ld64.c
-// - src/qd8-f32-qc8w-igemm/gen/qd8-f32-qc8w-igemm-4x4c8-minmax-sse41-ld64.c
-// - src/qs8-dwconv/gen/qs8-dwconv-9p8c-minmax-fp32-sse41-mul16-add16.c
-// - src/qs8-dwconv/gen/qs8-dwconv-25p8c-minmax-fp32-sse41-mul16-add16.c
-// - src/qs8-f32-vcvt/gen/qs8-f32-vcvt-sse41-u16.c
-// - src/qs8-gavgpool/gen/qs8-gavgpool-7p7x-minmax-fp32-sse41-c8.c
-// - src/qs8-gavgpool/gen/qs8-gavgpool-7x-minmax-fp32-sse41-c8.c
-// - src/qs8-qc8w-dwconv/gen/qs8-qc8w-dwconv-3p8c-minmax-fp32-sse41-mul16.c
-// - src/qs8-qc8w-dwconv/gen/qs8-qc8w-dwconv-9p8c-minmax-fp32-sse41-mul16.c
-// - src/qs8-qc8w-dwconv/gen/qs8-qc8w-dwconv-25p8c-minmax-fp32-sse41-mul16.c
-// - src/qs8-qc8w-gemm/gen/qs8-qc8w-gemm-1x4c8-minmax-fp32-sse41-ld64.c
-// - src/qs8-qc8w-gemm/gen/qs8-qc8w-gemm-3x4c8-minmax-fp32-sse41-ld64.c
-// - src/qs8-qc8w-igemm/gen/qs8-qc8w-igemm-1x4c8-minmax-fp32-sse41-ld64.c
-// - src/qs8-qc8w-igemm/gen/qs8-qc8w-igemm-3x4c8-minmax-fp32-sse41-ld64.c
-// - src/qs8-rdsum/gen/qs8-rdsum-7p7x-minmax-fp32-sse41-c64.c
-// - src/qs8-vadd/gen/qs8-vadd-minmax-sse41-mul16-ld64-u8.c
-// - src/qs8-vaddc/gen/qs8-vaddc-minmax-sse41-mul16-ld64-u8.c
-// - src/qs8-vcvt/gen/qs8-vcvt-sse41-u32.c
-// - src/qs8-vlrelu/gen/qs8-vlrelu-sse41-u32.c
-// - src/qs8-vmul/gen/qs8-vmul-minmax-fp32-sse41-mul16-ld64-u16.c
-// - src/qs8-vmulc/gen/qs8-vmulc-minmax-fp32-sse41-mul16-ld64-u16.c
-// - src/qs16-qs8-vcvt/gen/qs16-qs8-vcvt-sse41-u16.c
-// - src/qu8-dwconv/gen/qu8-dwconv-9p8c-minmax-fp32-sse41-mul16.c
-// - src/qu8-dwconv/gen/qu8-dwconv-25p8c-minmax-fp32-sse41-mul16.c
-// - src/qu8-f32-vcvt/gen/qu8-f32-vcvt-sse41-u16.c
-// - src/qu8-gavgpool/gen/qu8-gavgpool-7p7x-minmax-fp32-sse41-c8.c
-// - src/qu8-gavgpool/gen/qu8-gavgpool-7x-minmax-fp32-sse41-c8.c
-// - src/qu8-gemm/gen/qu8-gemm-1x4c8-minmax-fp32-sse41-ld64.c
-// - src/qu8-gemm/gen/qu8-gemm-3x4c8-minmax-fp32-sse41-ld64.c
-// - src/qu8-igemm/gen/qu8-igemm-1x4c8-minmax-fp32-sse41-ld64.c
-// - src/qu8-igemm/gen/qu8-igemm-3x4c8-minmax-fp32-sse41-ld64.c
-// - src/qu8-vadd/gen/qu8-vadd-minmax-sse41-mul16-ld64-u8.c
-// - src/qu8-vaddc/gen/qu8-vaddc-minmax-sse41-mul16-ld64-u8.c
-// - src/qu8-vcvt/gen/qu8-vcvt-sse41-u32.c
-// - src/qu8-vlrelu/gen/qu8-vlrelu-sse41-u32.c
-// - src/qu8-vmul/gen/qu8-vmul-minmax-fp32-sse41-mul16-ld64-u16.c
-// - src/qu8-vmulc/gen/qu8-vmulc-minmax-fp32-sse41-mul16-ld64-u16.c
-// - src/s8-ibilinear/gen/s8-ibilinear-sse41-c16.c
-// - src/s8-maxpool/s8-maxpool-9p8x-minmax-sse41-c16.c
-// - src/s8-vclamp/s8-vclamp-sse41-u64.c
-// - src/s32-vmul/gen/s32-vmul-sse41.c
-// - src/s32-vmul/gen/s32-vmulc-sse41.c
-// - src/u8-ibilinear/gen/u8-ibilinear-sse41-c16.c
-// - src/f16-f32-vcvt/gen/f16-f32-vcvt-avx-int16-u16.c
-// - src/f32-dwconv/gen/f32-dwconv-3p16c-minmax-avx.c
-// - src/f32-dwconv/gen/f32-dwconv-4p16c-minmax-avx.c
-// - src/f32-dwconv/gen/f32-dwconv-6f6m7l8c8s4r-minmax-avx.c
-// - src/f32-dwconv/gen/f32-dwconv-9p16c-minmax-avx.c
-// - src/f32-dwconv/gen/f32-dwconv-25p8c-minmax-avx.c
-// - src/f32-f16-vcvt/gen/f32-f16-vcvt-avx-u24.c
-// - src/f32-gemm/gen/f32-gemm-1x16-minmax-avx-broadcast.c
-// - src/f32-gemm/gen/f32-gemm-5x16-minmax-avx-broadcast.c
-// - src/f32-igemm/gen/f32-igemm-1x16-minmax-avx-broadcast.c
-// - src/f32-igemm/gen/f32-igemm-5x16-minmax-avx-broadcast.c
-// - src/f32-prelu/gen/f32-prelu-avx-2x16.c
-// - src/f32-qc4w-gemm/gen/f32-qc4w-gemm-1x16-minmax-avx-broadcast.c
-// - src/f32-qc4w-gemm/gen/f32-qc4w-gemm-3x16-minmax-avx-broadcast.c
-// - src/f32-qc8w-gemm/gen/f32-qc8w-gemm-1x16-minmax-avx-broadcast.c
-// - src/f32-qc8w-gemm/gen/f32-qc8w-gemm-5x16-minmax-avx-broadcast.c
-// - src/f32-qs8-vcvt/gen/f32-qs8-vcvt-avx-u32.c
-// - src/f32-qu8-vcvt/gen/f32-qu8-vcvt-avx-u32.c
-// - src/f32-rdsum/gen/f32-rdsum-7p7x-minmax-avx-c32.c
-// - src/f32-rminmax/gen/f32-rmax-avx-u32-acc4.c
-// - src/f32-rminmax/gen/f32-rminmax-avx-u32-acc4.c
-// - src/f32-rsum/gen/f32-rsum-avx-u32-acc4.c
-// - src/f32-vbinary/gen/f32-vadd-avx-u16.c
-// - src/f32-vbinary/gen/f32-vaddc-avx-u16.c
-// - src/f32-vbinary/gen/f32-vdiv-avx-u16.c
-// - src/f32-vbinary/gen/f32-vdivc-avx-u16.c
-// - src/f32-vbinary/gen/f32-vmax-avx-u16.c
-// - src/f32-vbinary/gen/f32-vmaxc-avx-u16.c
-// - src/f32-vbinary/gen/f32-vmin-avx-u16.c
-// - src/f32-vbinary/gen/f32-vminc-avx-u16.c
-// - src/f32-vbinary/gen/f32-vmul-avx-u16.c
-// - src/f32-vbinary/gen/f32-vmulc-avx-u16.c
-// - src/f32-vbinary/gen/f32-vrdivc-avx-u16.c
-// - src/f32-vbinary/gen/f32-vrsubc-avx-u16.c
-// - src/f32-vbinary/gen/f32-vsqrdiff-avx-u16.c
-// - src/f32-vbinary/gen/f32-vsqrdiffc-avx-u16.c
-// - src/f32-vbinary/gen/f32-vsub-avx-u16.c
-// - src/f32-vbinary/gen/f32-vsubc-avx-u16.c
-// - src/f32-vclamp/gen/f32-vclamp-avx-u16.c
-// - src/f32-vcopysign/gen/f32-vcopysign-avx.c
-// - src/f32-vcopysign/gen/f32-vcopysignc-avx.c
-// - src/f32-vcopysign/gen/f32-vrcopysignc-avx.c
-// - src/f32-velu/gen/f32-velu-avx-rr2-lut4-p4-perm-u32.c
-// - src/f32-vgelu/gen/f32-vgelu-avx-rational-12-10-div.c
-// - src/f32-vhswish/gen/f32-vhswish-avx-u16.c
-// - src/f32-vlrelu/gen/f32-vlrelu-avx-u16.c
-// - src/f32-vrnd/gen/f32-vrndd-avx-u16.c
-// - src/f32-vrnd/gen/f32-vrndne-avx-u16.c
-// - src/f32-vrnd/gen/f32-vrndu-avx-u16.c
-// - src/f32-vrnd/gen/f32-vrndz-avx-u16.c
-// - src/f32-vrsqrt/gen/f32-vrsqrt-avx-rsqrt-u16.c
-// - src/f32-vsigmoid/gen/f32-vsigmoid-avx-rr2-p5-nr2-u40.c
-// - src/f32-vsqrt/gen/f32-vsqrt-avx-rsqrt-u16.c
-// - src/f32-vtanh/gen/f32-vtanh-avx-rational-9-8-div.c
-// - src/f32-vunary/gen/f32-vabs-avx.c
-// - src/f32-vunary/gen/f32-vneg-avx.c
-// - src/f32-vunary/gen/f32-vsqr-avx.c
-// - src/qd8-f32-qb4w-gemm/gen/qd8-f32-qb4w-gemm-1x4c8-minmax-avx-ld128.c
-// - src/qd8-f32-qb4w-gemm/gen/qd8-f32-qb4w-gemm-4x4c8-minmax-avx-ld128.c
-// - src/qs8-dwconv/gen/qs8-dwconv-9p16c-minmax-fp32-avx-mul16-add16.c
-// - src/qs8-dwconv/gen/qs8-dwconv-25p16c-minmax-fp32-avx-mul16-add16.c
-// - src/qs8-f32-vcvt/gen/qs8-f32-vcvt-avx-u32.c
-// - src/qs8-qc8w-dwconv/gen/qs8-qc8w-dwconv-3p16c-minmax-fp32-avx-mul16-add16.c
-// - src/qs8-qc8w-dwconv/gen/qs8-qc8w-dwconv-9p16c-minmax-fp32-avx-mul16-add16.c
-// - src/qs8-qc8w-dwconv/gen/qs8-qc8w-dwconv-25p16c-minmax-fp32-avx-mul16-add16.c
-// - src/qs8-qc8w-gemm/gen/qs8-qc8w-gemm-1x4c8-minmax-fp32-avx-ld128.c
-// - src/qs8-qc8w-gemm/gen/qs8-qc8w-gemm-2x4c8-minmax-fp32-avx-ld128.c
-// - src/qs8-qc8w-igemm/gen/qs8-qc8w-igemm-1x4c8-minmax-fp32-avx-ld128.c
-// - src/qs8-qc8w-igemm/gen/qs8-qc8w-igemm-2x4c8-minmax-fp32-avx-ld128.c
-// - src/qs8-vadd/gen/qs8-vadd-minmax-avx-mul32-ld32-u8.c
-// - src/qs8-vaddc/gen/qs8-vaddc-minmax-avx-mul32-ld32-u8.c
-// - src/qs8-vcvt/gen/qs8-vcvt-avx-u32.c
-// - src/qs8-vlrelu/gen/qs8-vlrelu-avx-u32.c
-// - src/qs8-vmul/gen/qs8-vmul-minmax-fp32-avx-mul16-ld64-u16.c
-// - src/qs8-vmulc/gen/qs8-vmulc-minmax-fp32-avx-mul16-ld64-u16.c
-// - src/qs16-qs8-vcvt/gen/qs16-qs8-vcvt-avx-u16.c
-// - src/qu8-dwconv/gen/qu8-dwconv-9p16c-minmax-fp32-avx-mul16.c
-// - src/qu8-dwconv/gen/qu8-dwconv-25p16c-minmax-fp32-avx-mul16.c
-// - src/qu8-f32-vcvt/gen/qu8-f32-vcvt-avx-u32.c
-// - src/qu8-gemm/gen/qu8-gemm-1x4c8-minmax-fp32-avx-ld128.c
-// - src/qu8-gemm/gen/qu8-gemm-2x4c8-minmax-fp32-avx-ld128.c
-// - src/qu8-igemm/gen/qu8-igemm-1x4c8-minmax-fp32-avx-ld128.c
-// - src/qu8-igemm/gen/qu8-igemm-2x4c8-minmax-fp32-avx-ld128.c
-// - src/qu8-vadd/gen/qu8-vadd-minmax-avx-mul32-ld32-u8.c
-// - src/qu8-vaddc/gen/qu8-vaddc-minmax-avx-mul32-ld32-u8.c
-// - src/qu8-vcvt/gen/qu8-vcvt-avx-u32.c
-// - src/qu8-vlrelu/gen/qu8-vlrelu-avx-u32.c
-// - src/qu8-vmul/gen/qu8-vmul-minmax-fp32-avx-mul16-ld64-u16.c
-// - src/qu8-vmulc/gen/qu8-vmulc-minmax-fp32-avx-mul16-ld64-u16.c
-// - src/x8-lut/gen/x8-lut-avx-u64.c
-// - src/x32-packw/gen/x32-packw-x16-gemm-goi-avx-u4.c
-// - src/x32-packw/gen/x32-packw-x16s4-gemm-goi-avx-u4.c
-// - src/x32-transposec/gen/x32-transposec-8x8-reuse-multi-avx.c
-// - src/x64-transposec/gen/x64-transposec-4x4-reuse-multi-avx.c
-// - src/qd8-f16-qc4w-gemm/gen/qd8-f16-qc4w-gemm-1x8c8-minmax-avxvnni-prfm.c
-// - src/qd8-f16-qc4w-gemm/gen/qd8-f16-qc4w-gemm-5x8c8-minmax-avxvnni-prfm.c
-// - src/qd8-f16-qc8w-gemm/gen/qd8-f16-qc8w-gemm-1x8c8-minmax-avxvnni-prfm.c
-// - src/qd8-f16-qc8w-gemm/gen/qd8-f16-qc8w-gemm-5x8c8-minmax-avxvnni-prfm.c
-// - src/qd8-f16-qc8w-igemm/gen/qd8-f16-qc8w-igemm-1x8c8-minmax-avxvnni-prfm.c
-// - src/qd8-f16-qc8w-igemm/gen/qd8-f16-qc8w-igemm-5x8c8-minmax-avxvnni-prfm.c
-// - src/qd8-f32-qc4w-gemm/gen/qd8-f32-qc4w-gemm-1x8c8-minmax-avxvnni-prfm.c
-// - src/qd8-f32-qc4w-gemm/gen/qd8-f32-qc4w-gemm-5x8c8-minmax-avxvnni-prfm.c
-// - src/qd8-f32-qc8w-gemm/gen/qd8-f32-qc8w-gemm-1x8c8-minmax-avxvnni-prfm.c
-// - src/qd8-f32-qc8w-gemm/gen/qd8-f32-qc8w-gemm-5x8c8-minmax-avxvnni-prfm.c
-// - src/qd8-f32-qc8w-igemm/gen/qd8-f32-qc8w-igemm-1x8c8-minmax-avxvnni-prfm.c
-// - src/qd8-f32-qc8w-igemm/gen/qd8-f32-qc8w-igemm-5x8c8-minmax-avxvnni-prfm.c
-// - src/qs8-qc8w-gemm/gen/qs8-qc8w-gemm-1x8c8-minmax-fp32-avxvnni-prfm.c
-// - src/qs8-qc8w-gemm/gen/qs8-qc8w-gemm-5x8c8-minmax-fp32-avxvnni-prfm.c
-// - src/qs8-qc8w-igemm/gen/qs8-qc8w-igemm-1x8c8-minmax-fp32-avxvnni-prfm.c
-// - src/qs8-qc8w-igemm/gen/qs8-qc8w-igemm-5x8c8-minmax-fp32-avxvnni-prfm.c
-// - src/qs8-rsum/gen/qs8-rsum-avxvnni-u128-acc2.c
-// - src/qs8-qc8w-gemm/gen/qs8-qc8w-gemm-1x8c8-minmax-fp32-avxvnniint8-prfm.c
-// - src/qs8-qc8w-gemm/gen/qs8-qc8w-gemm-5x8c8-minmax-fp32-avxvnniint8-prfm.c
-// - src/qs8-qc8w-igemm/gen/qs8-qc8w-igemm-1x8c8-minmax-fp32-avxvnniint8-prfm.c
-// - src/qs8-qc8w-igemm/gen/qs8-qc8w-igemm-5x8c8-minmax-fp32-avxvnniint8-prfm.c
 // - src/f16-avgpool/f16-avgpool-9p8x-minmax-f16c-c8.c
 // - src/f16-avgpool/f16-avgpool-9x-minmax-f16c-c8.c
+// - src/f16-dwconv/gen/f16-dwconv-25p8c-minmax-fma3-acc2.c
+// - src/f16-dwconv/gen/f16-dwconv-3p16c-minmax-fma3.c
+// - src/f16-dwconv/gen/f16-dwconv-4p16c-minmax-fma3.c
+// - src/f16-dwconv/gen/f16-dwconv-9p16c-minmax-fma3.c
+// - src/f16-f32-vcvt/gen/f16-f32-vcvt-avx-int16-u16.c
+// - src/f16-f32-vcvt/gen/f16-f32-vcvt-avx512skx-u16.c
 // - src/f16-f32-vcvt/gen/f16-f32-vcvt-f16c-u16.c
+// - src/f16-f32-vcvt/gen/f16-f32-vcvt-scalar-u1.c
+// - src/f16-f32-vcvt/gen/f16-f32-vcvt-scalar-u4.c
+// - src/f16-f32-vcvt/gen/f16-f32-vcvt-sse2-int16-u32.c
+// - src/f16-f32-vcvt/gen/f16-f32-vcvt-sse41-int16-u16.c
+// - src/f16-f32acc-gemm/gen/f16-f32acc-gemm-1x16-minmax-avx2-broadcast.c
+// - src/f16-f32acc-gemm/gen/f16-f32acc-gemm-4x16-minmax-avx2-broadcast.c
+// - src/f16-f32acc-igemm/gen/f16-f32acc-igemm-1x16-minmax-avx2-broadcast.c
+// - src/f16-f32acc-igemm/gen/f16-f32acc-igemm-4x16-minmax-avx2-broadcast.c
+// - src/f16-f32acc-rdsum/gen/f16-f32acc-rdsum-7p7x-avx512skx-c64.c
 // - src/f16-f32acc-rdsum/gen/f16-f32acc-rdsum-7p7x-f16c-c32.c
+// - src/f16-f32acc-rsum/gen/f16-f32acc-rsum-avx512skx-u64-acc4.c
 // - src/f16-f32acc-rsum/gen/f16-f32acc-rsum-f16c-u32-acc4.c
 // - src/f16-gavgpool/gen/f16-gavgpool-7p7x-minmax-f16c-c8.c
 // - src/f16-gavgpool/gen/f16-gavgpool-7x-minmax-f16c-c8.c
+// - src/f16-gemm/gen/f16-gemm-1x64-minmax-avx512fp16-broadcast.c
+// - src/f16-gemm/gen/f16-gemm-7x64-minmax-avx512fp16-broadcast.c
+// - src/f16-ibilinear/gen/f16-ibilinear-fma3-c8.c
+// - src/f16-igemm/gen/f16-igemm-1x64-minmax-avx512fp16-broadcast.c
+// - src/f16-igemm/gen/f16-igemm-7x64-minmax-avx512fp16-broadcast.c
 // - src/f16-maxpool/f16-maxpool-9p8x-minmax-f16c-c8.c
+// - src/f16-pavgpool/f16-pavgpool-9p8x-minmax-avx2-c8.c
+// - src/f16-pavgpool/f16-pavgpool-9x-minmax-avx2-c8.c
 // - src/f16-prelu/gen/f16-prelu-f16c-2x16.c
+// - src/f16-qs8-vcvt/gen/f16-qs8-vcvt-scalar-imagic-u4.c
+// - src/f16-raddstoreexpminusmax/gen/f16-raddstoreexpminusmax-avx2-rr1-p2-u32.c
 // - src/f16-rminmax/f16-rmax-f16c-u32.c
+// - src/f16-rminmax/gen/f16-rmax-avx512fp16-u128-acc4.c
+// - src/f16-rminmax/gen/f16-rmax-avx512skx-u64-acc4.c
+// - src/f16-rminmax/gen/f16-rmax-scalar-u2-acc2.c
+// - src/f16-rminmax/gen/f16-rminmax-avx512fp16-u128-acc4.c
+// - src/f16-rminmax/gen/f16-rminmax-avx512skx-u64-acc4.c
+// - src/f16-rminmax/gen/f16-rminmax-scalar-u2-acc2.c
+// - src/f16-vbinary/gen/f16-vadd-avx512fp16-u64.c
 // - src/f16-vbinary/gen/f16-vadd-f16c-u16.c
+// - src/f16-vbinary/gen/f16-vaddc-avx512fp16-u64.c
 // - src/f16-vbinary/gen/f16-vaddc-f16c-u16.c
+// - src/f16-vbinary/gen/f16-vdiv-avx512fp16-u64.c
 // - src/f16-vbinary/gen/f16-vdiv-f16c-u8.c
+// - src/f16-vbinary/gen/f16-vdivc-avx512fp16-u64.c
 // - src/f16-vbinary/gen/f16-vdivc-f16c-u8.c
+// - src/f16-vbinary/gen/f16-vmax-avx512fp16-u64.c
 // - src/f16-vbinary/gen/f16-vmax-f16c-u16.c
+// - src/f16-vbinary/gen/f16-vmaxc-avx512fp16-u64.c
 // - src/f16-vbinary/gen/f16-vmaxc-f16c-u16.c
+// - src/f16-vbinary/gen/f16-vmin-avx512fp16-u64.c
 // - src/f16-vbinary/gen/f16-vmin-f16c-u16.c
+// - src/f16-vbinary/gen/f16-vminc-avx512fp16-u64.c
 // - src/f16-vbinary/gen/f16-vminc-f16c-u16.c
+// - src/f16-vbinary/gen/f16-vmul-avx512fp16-u64.c
 // - src/f16-vbinary/gen/f16-vmul-f16c-u16.c
+// - src/f16-vbinary/gen/f16-vmulc-avx512fp16-u64.c
 // - src/f16-vbinary/gen/f16-vmulc-f16c-u16.c
+// - src/f16-vbinary/gen/f16-vrdivc-avx512fp16-u64.c
 // - src/f16-vbinary/gen/f16-vrdivc-f16c-u8.c
+// - src/f16-vbinary/gen/f16-vrsubc-avx512fp16-u64.c
 // - src/f16-vbinary/gen/f16-vrsubc-f16c-u16.c
+// - src/f16-vbinary/gen/f16-vsqrdiff-avx512fp16-u64.c
 // - src/f16-vbinary/gen/f16-vsqrdiff-f16c-u16.c
+// - src/f16-vbinary/gen/f16-vsqrdiffc-avx512fp16-u64.c
 // - src/f16-vbinary/gen/f16-vsqrdiffc-f16c-u16.c
+// - src/f16-vbinary/gen/f16-vsub-avx512fp16-u64.c
 // - src/f16-vbinary/gen/f16-vsub-f16c-u16.c
+// - src/f16-vbinary/gen/f16-vsubc-avx512fp16-u64.c
 // - src/f16-vbinary/gen/f16-vsubc-f16c-u16.c
 // - src/f16-vclamp/gen/f16-vclamp-f16c-u16.c
+// - src/f16-velu/gen/f16-velu-avx2-rr1-p3-u16.c
 // - src/f16-vhswish/gen/f16-vhswish-f16c-u16.c
 // - src/f16-vlrelu/gen/f16-vlrelu-f16c-u16.c
+// - src/f16-vmulcaddc/gen/f16-vmulcaddc-c8-minmax-fma3-2x.c
 // - src/f16-vrnd/gen/f16-vrndd-f16c-u16.c
 // - src/f16-vrnd/gen/f16-vrndne-f16c-u16.c
 // - src/f16-vrnd/gen/f16-vrndu-f16c-u16.c
 // - src/f16-vrnd/gen/f16-vrndz-f16c-u16.c
 // - src/f16-vrsqrt/gen/f16-vrsqrt-f16c-rsqrt-u32.c
+// - src/f16-vsigmoid/gen/f16-vsigmoid-avx2-rr1-p2-rcp-u32.c
 // - src/f16-vsqrt/gen/f16-vsqrt-f16c-rsqrt-u32.c
 // - src/f16-vtanh/gen/f16-vtanh-f16c-expm1minus-rr1-p3h2ts-rcp-u72.c
-// - src/f16-vunary/gen/f16-vsqr-f16c-u16.c
-// - src/f32-f16-vcvt/gen/f32-f16-vcvt-f16c-u16.c
-// - src/f16-dwconv/gen/f16-dwconv-3p16c-minmax-fma3.c
-// - src/f16-dwconv/gen/f16-dwconv-4p16c-minmax-fma3.c
-// - src/f16-dwconv/gen/f16-dwconv-9p16c-minmax-fma3.c
-// - src/f16-dwconv/gen/f16-dwconv-25p8c-minmax-fma3-acc2.c
-// - src/f16-ibilinear/gen/f16-ibilinear-fma3-c8.c
-// - src/f16-vmulcaddc/gen/f16-vmulcaddc-c8-minmax-fma3-2x.c
 // - src/f16-vtanh/gen/f16-vtanh-fma3-polynomial-p19h9t2-u32.c
-// - src/f32-dwconv/gen/f32-dwconv-3p16c-minmax-fma3.c
-// - src/f32-dwconv/gen/f32-dwconv-4p16c-minmax-fma3.c
-// - src/f32-dwconv/gen/f32-dwconv-5f5m5l8c8s4r-minmax-fma3.c
-// - src/f32-dwconv/gen/f32-dwconv-9p16c-minmax-fma3.c
+// - src/f16-vunary/gen/f16-vabs-sse2-u16.c
+// - src/f16-vunary/gen/f16-vneg-sse2-u16.c
+// - src/f16-vunary/gen/f16-vsqr-f16c-u16.c
+// - src/f32-argmaxpool/f32-argmaxpool-4x-scalar-c1.c
+// - src/f32-argmaxpool/f32-argmaxpool-4x-sse2-c4.c
+// - src/f32-argmaxpool/f32-argmaxpool-9p8x-scalar-c1.c
+// - src/f32-argmaxpool/f32-argmaxpool-9p8x-sse2-c4.c
+// - src/f32-argmaxpool/f32-argmaxpool-9x-scalar-c1.c
+// - src/f32-argmaxpool/f32-argmaxpool-9x-sse2-c4.c
+// - src/f32-avgpool/f32-avgpool-9p8x-minmax-scalar-c1.c
+// - src/f32-avgpool/f32-avgpool-9p8x-minmax-sse-c4.c
+// - src/f32-avgpool/f32-avgpool-9x-minmax-scalar-c1.c
+// - src/f32-avgpool/f32-avgpool-9x-minmax-sse-c4.c
+// - src/f32-conv-hwc2chw/f32-conv-hwc2chw-3x3s2p1c3x4-scalar-1x1.c
+// - src/f32-conv-hwc2chw/f32-conv-hwc2chw-3x3s2p1c3x4-sse-2x2.c
+// - src/f32-dwconv/gen/f32-dwconv-25p16c-minmax-avx512f.c
+// - src/f32-dwconv/gen/f32-dwconv-25p1c-minmax-scalar-acc2.c
+// - src/f32-dwconv/gen/f32-dwconv-25p1c-scalar-acc2.c
+// - src/f32-dwconv/gen/f32-dwconv-25p8c-minmax-avx.c
 // - src/f32-dwconv/gen/f32-dwconv-25p8c-minmax-fma3.c
+// - src/f32-dwconv/gen/f32-dwconv-25p8c-minmax-sse.c
+// - src/f32-dwconv/gen/f32-dwconv-2f2m2l4c1s1r-minmax-scalar-acc2.c
+// - src/f32-dwconv/gen/f32-dwconv-3p16c-minmax-avx.c
+// - src/f32-dwconv/gen/f32-dwconv-3p16c-minmax-avx512f.c
+// - src/f32-dwconv/gen/f32-dwconv-3p16c-minmax-fma3.c
+// - src/f32-dwconv/gen/f32-dwconv-3p1c-minmax-scalar-acc2.c
+// - src/f32-dwconv/gen/f32-dwconv-3p1c-scalar-acc2.c
+// - src/f32-dwconv/gen/f32-dwconv-3p8c-minmax-sse.c
+// - src/f32-dwconv/gen/f32-dwconv-4p16c-minmax-avx.c
+// - src/f32-dwconv/gen/f32-dwconv-4p16c-minmax-avx512f.c
+// - src/f32-dwconv/gen/f32-dwconv-4p16c-minmax-fma3.c
+// - src/f32-dwconv/gen/f32-dwconv-4p1c-minmax-scalar-acc2.c
+// - src/f32-dwconv/gen/f32-dwconv-4p1c-scalar-acc2.c
+// - src/f32-dwconv/gen/f32-dwconv-4p8c-minmax-sse.c
+// - src/f32-dwconv/gen/f32-dwconv-5f5m5l32c16s1r-minmax-avx512f.c
+// - src/f32-dwconv/gen/f32-dwconv-5f5m5l8c8s4r-minmax-fma3.c
+// - src/f32-dwconv/gen/f32-dwconv-6f6m7l8c8s4r-minmax-avx.c
+// - src/f32-dwconv/gen/f32-dwconv-8f8m9l16c4s4r-minmax-sse.c
+// - src/f32-dwconv/gen/f32-dwconv-9p16c-minmax-avx.c
+// - src/f32-dwconv/gen/f32-dwconv-9p16c-minmax-avx512f.c
+// - src/f32-dwconv/gen/f32-dwconv-9p16c-minmax-fma3.c
+// - src/f32-dwconv/gen/f32-dwconv-9p1c-minmax-scalar-acc2.c
+// - src/f32-dwconv/gen/f32-dwconv-9p1c-scalar-acc2.c
+// - src/f32-dwconv/gen/f32-dwconv-9p8c-minmax-sse.c
+// - src/f32-dwconv2d-chw/gen/f32-dwconv2d-chw-3x3p1-minmax-scalar-2x1-acc2.c
+// - src/f32-dwconv2d-chw/gen/f32-dwconv2d-chw-3x3p1-minmax-scalar-4x1.c
+// - src/f32-dwconv2d-chw/gen/f32-dwconv2d-chw-3x3p1-minmax-sse-2x4-acc2.c
+// - src/f32-dwconv2d-chw/gen/f32-dwconv2d-chw-3x3p1-minmax-ssse3-2x4-acc2.c
+// - src/f32-dwconv2d-chw/gen/f32-dwconv2d-chw-3x3s2p1-minmax-scalar-1x1-acc2.c
+// - src/f32-dwconv2d-chw/gen/f32-dwconv2d-chw-3x3s2p1-minmax-scalar-2x1-acc2.c
+// - src/f32-dwconv2d-chw/gen/f32-dwconv2d-chw-3x3s2p1-minmax-sse-1x4-acc3.c
+// - src/f32-dwconv2d-chw/gen/f32-dwconv2d-chw-5x5p2-minmax-scalar-1x1-acc5.c
+// - src/f32-dwconv2d-chw/gen/f32-dwconv2d-chw-5x5p2-minmax-scalar-2x1-acc2.c
+// - src/f32-dwconv2d-chw/gen/f32-dwconv2d-chw-5x5p2-minmax-sse-4x4.c
+// - src/f32-dwconv2d-chw/gen/f32-dwconv2d-chw-5x5s2p2-minmax-scalar-1x1-acc5.c
+// - src/f32-dwconv2d-chw/gen/f32-dwconv2d-chw-5x5s2p2-minmax-scalar-2x1-acc2.c
+// - src/f32-dwconv2d-chw/gen/f32-dwconv2d-chw-5x5s2p2-minmax-sse-2x4.c
+// - src/f32-f16-vcvt/gen/f32-f16-vcvt-avx-u24.c
+// - src/f32-f16-vcvt/gen/f32-f16-vcvt-avx512skx-u16.c
+// - src/f32-f16-vcvt/gen/f32-f16-vcvt-f16c-u16.c
+// - src/f32-f16-vcvt/gen/f32-f16-vcvt-scalar-bitcast-u4.c
+// - src/f32-f16-vcvt/gen/f32-f16-vcvt-scalar-fabsf-u2.c
+// - src/f32-f16-vcvt/gen/f32-f16-vcvt-sse2-u16.c
+// - src/f32-f16-vcvt/gen/f32-f16-vcvt-sse41-u8.c
+// - src/f32-gavgpool-cw/f32-gavgpool-cw-scalar-u1.c
+// - src/f32-gavgpool-cw/f32-gavgpool-cw-sse-u4.c
+// - src/f32-gavgpool/f32-gavgpool-7p7x-minmax-scalar-c1.c
+// - src/f32-gavgpool/f32-gavgpool-7p7x-minmax-sse-c4.c
+// - src/f32-gavgpool/f32-gavgpool-7x-minmax-scalar-c1.c
+// - src/f32-gavgpool/f32-gavgpool-7x-minmax-sse-c4.c
+// - src/f32-gemm/gen/f32-gemm-1x16-minmax-avx-broadcast.c
+// - src/f32-gemm/gen/f32-gemm-1x16-minmax-avx512f-broadcast.c
 // - src/f32-gemm/gen/f32-gemm-1x16-minmax-fma3-broadcast.c
 // - src/f32-gemm/gen/f32-gemm-1x16s4-minmax-fma3-broadcast.c
+// - src/f32-gemm/gen/f32-gemm-1x4-minmax-scalar.c
+// - src/f32-gemm/gen/f32-gemm-1x4-relu-scalar.c
+// - src/f32-gemm/gen/f32-gemm-1x4-scalar.c
+// - src/f32-gemm/gen/f32-gemm-1x8-minmax-sse-load1.c
+// - src/f32-gemm/gen/f32-gemm-2x4-minmax-scalar.c
+// - src/f32-gemm/gen/f32-gemm-2x4-relu-scalar.c
+// - src/f32-gemm/gen/f32-gemm-2x4-scalar.c
 // - src/f32-gemm/gen/f32-gemm-4x16s4-minmax-fma3-broadcast.c
+// - src/f32-gemm/gen/f32-gemm-4x2-minmax-scalar.c
+// - src/f32-gemm/gen/f32-gemm-4x2-scalar.c
+// - src/f32-gemm/gen/f32-gemm-4x2c4-minmax-sse.c
+// - src/f32-gemm/gen/f32-gemm-4x4-minmax-scalar.c
+// - src/f32-gemm/gen/f32-gemm-4x4-relu-scalar.c
+// - src/f32-gemm/gen/f32-gemm-4x4-scalar.c
+// - src/f32-gemm/gen/f32-gemm-4x8-minmax-sse-load1.c
+// - src/f32-gemm/gen/f32-gemm-5x16-minmax-avx-broadcast.c
 // - src/f32-gemm/gen/f32-gemm-5x16-minmax-fma3-broadcast.c
+// - src/f32-gemm/gen/f32-gemm-7x16-minmax-avx512f-broadcast.c
+// - src/f32-ibilinear-chw/gen/f32-ibilinear-chw-scalar-p4.c
+// - src/f32-ibilinear-chw/gen/f32-ibilinear-chw-sse-p8.c
+// - src/f32-ibilinear/gen/f32-ibilinear-scalar-c2.c
+// - src/f32-ibilinear/gen/f32-ibilinear-sse-c8.c
+// - src/f32-igemm/gen/f32-igemm-1x16-minmax-avx-broadcast.c
+// - src/f32-igemm/gen/f32-igemm-1x16-minmax-avx512f-broadcast.c
 // - src/f32-igemm/gen/f32-igemm-1x16-minmax-fma3-broadcast.c
 // - src/f32-igemm/gen/f32-igemm-1x16s4-minmax-fma3-broadcast.c
+// - src/f32-igemm/gen/f32-igemm-1x4-minmax-scalar.c
+// - src/f32-igemm/gen/f32-igemm-1x4-relu-scalar.c
+// - src/f32-igemm/gen/f32-igemm-1x4-scalar.c
+// - src/f32-igemm/gen/f32-igemm-1x8-minmax-sse-load1.c
+// - src/f32-igemm/gen/f32-igemm-2x4-minmax-scalar.c
+// - src/f32-igemm/gen/f32-igemm-2x4-relu-scalar.c
+// - src/f32-igemm/gen/f32-igemm-2x4-scalar.c
 // - src/f32-igemm/gen/f32-igemm-4x16s4-minmax-fma3-broadcast.c
+// - src/f32-igemm/gen/f32-igemm-4x2-minmax-scalar.c
+// - src/f32-igemm/gen/f32-igemm-4x2-scalar.c
+// - src/f32-igemm/gen/f32-igemm-4x2c4-minmax-sse.c
+// - src/f32-igemm/gen/f32-igemm-4x4-minmax-scalar.c
+// - src/f32-igemm/gen/f32-igemm-4x4-relu-scalar.c
+// - src/f32-igemm/gen/f32-igemm-4x4-scalar.c
+// - src/f32-igemm/gen/f32-igemm-4x8-minmax-sse-load1.c
+// - src/f32-igemm/gen/f32-igemm-5x16-minmax-avx-broadcast.c
 // - src/f32-igemm/gen/f32-igemm-5x16-minmax-fma3-broadcast-prfm.c
-// - src/f32-qc4w-gemm/gen/f32-qc4w-gemm-1x16-minmax-fma3-broadcast.c
-// - src/f32-qc4w-gemm/gen/f32-qc4w-gemm-3x16-minmax-fma3-broadcast.c
-// - src/f32-qc8w-gemm/gen/f32-qc8w-gemm-1x16-minmax-fma3-broadcast.c
-// - src/f32-qc8w-gemm/gen/f32-qc8w-gemm-5x16-minmax-fma3-broadcast.c
-// - src/f32-vcmul/gen/f32-vcmul-fma3-u16.c
-// - src/f32-vgelu/gen/f32-vgelu-fma3-rational-12-10-div.c
-// - src/f32-vhswish/gen/f32-vhswish-fma3-u16.c
-// - src/f32-vlog/gen/f32-vlog-fma3-rational-3-3-div.c
-// - src/f32-vrsqrt/gen/f32-vrsqrt-fma3-rsqrt-u16.c
-// - src/f32-vsqrt/gen/f32-vsqrt-fma3-rsqrt-u16.c
-// - src/f32-vtanh/gen/f32-vtanh-fma3-rational-9-8-div.c
-// - src/f16-f32acc-gemm/gen/f16-f32acc-gemm-1x16-minmax-avx2-broadcast.c
-// - src/f16-f32acc-gemm/gen/f16-f32acc-gemm-4x16-minmax-avx2-broadcast.c
-// - src/f16-f32acc-igemm/gen/f16-f32acc-igemm-1x16-minmax-avx2-broadcast.c
-// - src/f16-f32acc-igemm/gen/f16-f32acc-igemm-4x16-minmax-avx2-broadcast.c
-// - src/f16-pavgpool/f16-pavgpool-9p8x-minmax-avx2-c8.c
-// - src/f16-pavgpool/f16-pavgpool-9x-minmax-avx2-c8.c
-// - src/f16-raddstoreexpminusmax/gen/f16-raddstoreexpminusmax-avx2-rr1-p2-u32.c
-// - src/f16-velu/gen/f16-velu-avx2-rr1-p3-u16.c
-// - src/f16-vsigmoid/gen/f16-vsigmoid-avx2-rr1-p2-rcp-u32.c
+// - src/f32-igemm/gen/f32-igemm-7x16-minmax-avx512f-broadcast.c
+// - src/f32-maxpool/f32-maxpool-9p8x-minmax-scalar-c1.c
+// - src/f32-maxpool/f32-maxpool-9p8x-minmax-sse-c4.c
+// - src/f32-pavgpool/f32-pavgpool-9p8x-minmax-scalar-c1.c
+// - src/f32-pavgpool/f32-pavgpool-9p8x-minmax-sse-c4.c
+// - src/f32-pavgpool/f32-pavgpool-9x-minmax-scalar-c1.c
+// - src/f32-pavgpool/f32-pavgpool-9x-minmax-sse-c4.c
+// - src/f32-prelu/gen/f32-prelu-avx-2x16.c
+// - src/f32-prelu/gen/f32-prelu-avx512f-2x16.c
+// - src/f32-prelu/gen/f32-prelu-scalar-2x4.c
+// - src/f32-prelu/gen/f32-prelu-sse2-2x8.c
+// - src/f32-prelu/gen/f32-prelu-sse41-2x8.c
+// - src/f32-qc4w-gemm/gen/f32-qc4w-gemm-1x16-minmax-avx-broadcast.c
 // - src/f32-qc4w-gemm/gen/f32-qc4w-gemm-1x16-minmax-avx2-broadcast.c
+// - src/f32-qc4w-gemm/gen/f32-qc4w-gemm-1x16-minmax-fma3-broadcast.c
+// - src/f32-qc4w-gemm/gen/f32-qc4w-gemm-1x4-minmax-scalar.c
+// - src/f32-qc4w-gemm/gen/f32-qc4w-gemm-1x8-minmax-sse41-dup.c
+// - src/f32-qc4w-gemm/gen/f32-qc4w-gemm-3x16-minmax-avx-broadcast.c
 // - src/f32-qc4w-gemm/gen/f32-qc4w-gemm-3x16-minmax-avx2-broadcast.c
+// - src/f32-qc4w-gemm/gen/f32-qc4w-gemm-3x16-minmax-fma3-broadcast.c
+// - src/f32-qc4w-gemm/gen/f32-qc4w-gemm-4x4-minmax-scalar.c
+// - src/f32-qc4w-gemm/gen/f32-qc4w-gemm-4x8-minmax-sse41-dup.c
+// - src/f32-qc8w-gemm/gen/f32-qc4w-gemm-1x32-minmax-avx512skx-broadcast.c
+// - src/f32-qc8w-gemm/gen/f32-qc4w-gemm-7x32-minmax-avx512skx-broadcast.c
+// - src/f32-qc8w-gemm/gen/f32-qc8w-gemm-1x16-minmax-avx-broadcast.c
 // - src/f32-qc8w-gemm/gen/f32-qc8w-gemm-1x16-minmax-avx2-broadcast.c
+// - src/f32-qc8w-gemm/gen/f32-qc8w-gemm-1x16-minmax-fma3-broadcast.c
+// - src/f32-qc8w-gemm/gen/f32-qc8w-gemm-1x32-minmax-avx512skx-broadcast.c
+// - src/f32-qc8w-gemm/gen/f32-qc8w-gemm-1x4-minmax-scalar.c
+// - src/f32-qc8w-gemm/gen/f32-qc8w-gemm-1x8-minmax-sse41-dup.c
+// - src/f32-qc8w-gemm/gen/f32-qc8w-gemm-4x4-minmax-scalar.c
+// - src/f32-qc8w-gemm/gen/f32-qc8w-gemm-4x8-minmax-sse41-dup.c
+// - src/f32-qc8w-gemm/gen/f32-qc8w-gemm-5x16-minmax-avx-broadcast.c
 // - src/f32-qc8w-gemm/gen/f32-qc8w-gemm-5x16-minmax-avx2-broadcast.c
+// - src/f32-qc8w-gemm/gen/f32-qc8w-gemm-5x16-minmax-fma3-broadcast.c
+// - src/f32-qc8w-gemm/gen/f32-qc8w-gemm-7x32-minmax-avx512skx-broadcast.c
+// - src/f32-qs8-vcvt/gen/f32-qs8-vcvt-avx-u32.c
 // - src/f32-qs8-vcvt/gen/f32-qs8-vcvt-avx2-u64.c
+// - src/f32-qs8-vcvt/gen/f32-qs8-vcvt-avx512skx-u128.c
+// - src/f32-qs8-vcvt/gen/f32-qs8-vcvt-scalar-imagic-u1.c
+// - src/f32-qs8-vcvt/gen/f32-qs8-vcvt-scalar-imagic-u4.c
+// - src/f32-qs8-vcvt/gen/f32-qs8-vcvt-scalar-lrintf-u4.c
+// - src/f32-qs8-vcvt/gen/f32-qs8-vcvt-sse2-u32.c
+// - src/f32-qs8-vcvt/gen/f32-qs8-vcvt-sse41-u32.c
+// - src/f32-qu8-vcvt/gen/f32-qu8-vcvt-avx-u32.c
 // - src/f32-qu8-vcvt/gen/f32-qu8-vcvt-avx2-u64.c
+// - src/f32-qu8-vcvt/gen/f32-qu8-vcvt-avx512skx-u128.c
+// - src/f32-qu8-vcvt/gen/f32-qu8-vcvt-scalar-imagic-u1.c
+// - src/f32-qu8-vcvt/gen/f32-qu8-vcvt-scalar-imagic-u4.c
+// - src/f32-qu8-vcvt/gen/f32-qu8-vcvt-scalar-lrintf-u4.c
+// - src/f32-qu8-vcvt/gen/f32-qu8-vcvt-sse2-u32.c
 // - src/f32-raddstoreexpminusmax/gen/f32-raddstoreexpminusmax-avx2-rr2-p5-u32-acc2.c
+// - src/f32-raddstoreexpminusmax/gen/f32-raddstoreexpminusmax-avx256skx-rr2-p5-u32-acc2.c
+// - src/f32-raddstoreexpminusmax/gen/f32-raddstoreexpminusmax-avx512f-rr2-p5-u64-acc2.c
+// - src/f32-raddstoreexpminusmax/gen/f32-raddstoreexpminusmax-scalar-rr2-p5-u4-acc2.c
+// - src/f32-raddstoreexpminusmax/gen/f32-raddstoreexpminusmax-sse2-rr2-p5-u16-acc2.c
+// - src/f32-rdsum/gen/f32-rdsum-7p7x-minmax-avx-c32.c
+// - src/f32-rdsum/gen/f32-rdsum-7p7x-minmax-avx512f-c64.c
+// - src/f32-rdsum/gen/f32-rdsum-7p7x-minmax-scalar.c
+// - src/f32-rdsum/gen/f32-rdsum-7p7x-minmax-sse-c16.c
+// - src/f32-rminmax/gen/f32-rmax-avx-u32-acc4.c
+// - src/f32-rminmax/gen/f32-rmax-avx512f-u64-acc4.c
+// - src/f32-rminmax/gen/f32-rmax-scalar-u4-acc4.c
+// - src/f32-rminmax/gen/f32-rmax-sse-u16-acc4.c
+// - src/f32-rminmax/gen/f32-rminmax-avx-u32-acc4.c
+// - src/f32-rminmax/gen/f32-rminmax-avx512f-u64-acc4.c
+// - src/f32-rminmax/gen/f32-rminmax-scalar-u4-acc4.c
+// - src/f32-rminmax/gen/f32-rminmax-sse-u16-acc4.c
+// - src/f32-rsum/gen/f32-rsum-avx-u32-acc4.c
+// - src/f32-rsum/gen/f32-rsum-avx512f-u64-acc4.c
+// - src/f32-rsum/gen/f32-rsum-scalar-u4-acc4.c
+// - src/f32-rsum/gen/f32-rsum-sse-u16-acc4.c
+// - src/f32-spmm/gen/f32-spmm-32x1-minmax-sse.c
+// - src/f32-spmm/gen/f32-spmm-8x1-minmax-scalar.c
+// - src/f32-spmm/gen/f32-spmm-8x2-minmax-scalar.c
+// - src/f32-spmm/gen/f32-spmm-8x4-minmax-scalar.c
+// - src/f32-vbinary/gen/f32-vadd-avx-u16.c
+// - src/f32-vbinary/gen/f32-vadd-avx512f-u32.c
+// - src/f32-vbinary/gen/f32-vadd-scalar-u8.c
+// - src/f32-vbinary/gen/f32-vadd-sse-u8.c
+// - src/f32-vbinary/gen/f32-vaddc-avx-u16.c
+// - src/f32-vbinary/gen/f32-vaddc-avx512f-u32.c
+// - src/f32-vbinary/gen/f32-vaddc-scalar-u8.c
+// - src/f32-vbinary/gen/f32-vaddc-sse-u8.c
+// - src/f32-vbinary/gen/f32-vdiv-avx-u16.c
+// - src/f32-vbinary/gen/f32-vdiv-avx512f-u32.c
+// - src/f32-vbinary/gen/f32-vdiv-scalar-u2.c
+// - src/f32-vbinary/gen/f32-vdiv-sse-u8.c
+// - src/f32-vbinary/gen/f32-vdivc-avx-u16.c
+// - src/f32-vbinary/gen/f32-vdivc-avx512f-u32.c
+// - src/f32-vbinary/gen/f32-vdivc-scalar-u2.c
+// - src/f32-vbinary/gen/f32-vdivc-sse-u8.c
+// - src/f32-vbinary/gen/f32-vmax-avx-u16.c
+// - src/f32-vbinary/gen/f32-vmax-avx512f-u32.c
+// - src/f32-vbinary/gen/f32-vmax-scalar-u8.c
+// - src/f32-vbinary/gen/f32-vmax-sse-u8.c
+// - src/f32-vbinary/gen/f32-vmaxc-avx-u16.c
+// - src/f32-vbinary/gen/f32-vmaxc-avx512f-u32.c
+// - src/f32-vbinary/gen/f32-vmaxc-scalar-u8.c
+// - src/f32-vbinary/gen/f32-vmaxc-sse-u8.c
+// - src/f32-vbinary/gen/f32-vmin-avx-u16.c
+// - src/f32-vbinary/gen/f32-vmin-avx512f-u32.c
+// - src/f32-vbinary/gen/f32-vmin-scalar-u8.c
+// - src/f32-vbinary/gen/f32-vmin-sse-u8.c
+// - src/f32-vbinary/gen/f32-vminc-avx-u16.c
+// - src/f32-vbinary/gen/f32-vminc-avx512f-u32.c
+// - src/f32-vbinary/gen/f32-vminc-scalar-u8.c
+// - src/f32-vbinary/gen/f32-vminc-sse-u8.c
+// - src/f32-vbinary/gen/f32-vmul-avx-u16.c
+// - src/f32-vbinary/gen/f32-vmul-avx512f-u32.c
+// - src/f32-vbinary/gen/f32-vmul-scalar-u8.c
+// - src/f32-vbinary/gen/f32-vmul-sse-u8.c
+// - src/f32-vbinary/gen/f32-vmulc-avx-u16.c
+// - src/f32-vbinary/gen/f32-vmulc-avx512f-u32.c
+// - src/f32-vbinary/gen/f32-vmulc-scalar-u8.c
+// - src/f32-vbinary/gen/f32-vmulc-sse-u8.c
+// - src/f32-vbinary/gen/f32-vrdivc-avx-u16.c
+// - src/f32-vbinary/gen/f32-vrdivc-avx512f-u32.c
+// - src/f32-vbinary/gen/f32-vrdivc-scalar-u2.c
+// - src/f32-vbinary/gen/f32-vrdivc-sse-u8.c
+// - src/f32-vbinary/gen/f32-vrsubc-avx-u16.c
+// - src/f32-vbinary/gen/f32-vrsubc-avx512f-u32.c
+// - src/f32-vbinary/gen/f32-vrsubc-scalar-u8.c
+// - src/f32-vbinary/gen/f32-vrsubc-sse-u8.c
+// - src/f32-vbinary/gen/f32-vsqrdiff-avx-u16.c
+// - src/f32-vbinary/gen/f32-vsqrdiff-avx512f-u32.c
+// - src/f32-vbinary/gen/f32-vsqrdiff-scalar-u8.c
+// - src/f32-vbinary/gen/f32-vsqrdiff-sse-u8.c
+// - src/f32-vbinary/gen/f32-vsqrdiffc-avx-u16.c
+// - src/f32-vbinary/gen/f32-vsqrdiffc-avx512f-u32.c
+// - src/f32-vbinary/gen/f32-vsqrdiffc-scalar-u8.c
+// - src/f32-vbinary/gen/f32-vsqrdiffc-sse-u8.c
+// - src/f32-vbinary/gen/f32-vsub-avx-u16.c
+// - src/f32-vbinary/gen/f32-vsub-avx512f-u32.c
+// - src/f32-vbinary/gen/f32-vsub-scalar-u8.c
+// - src/f32-vbinary/gen/f32-vsub-sse-u8.c
+// - src/f32-vbinary/gen/f32-vsubc-avx-u16.c
+// - src/f32-vbinary/gen/f32-vsubc-avx512f-u32.c
+// - src/f32-vbinary/gen/f32-vsubc-scalar-u8.c
+// - src/f32-vbinary/gen/f32-vsubc-sse-u8.c
+// - src/f32-vclamp/gen/f32-vclamp-avx-u16.c
+// - src/f32-vclamp/gen/f32-vclamp-avx512f-u16.c
+// - src/f32-vclamp/gen/f32-vclamp-scalar-u4.c
+// - src/f32-vclamp/gen/f32-vclamp-sse-u8.c
+// - src/f32-vcmul/gen/f32-vcmul-avx512f-u32.c
+// - src/f32-vcmul/gen/f32-vcmul-fma3-u16.c
+// - src/f32-vcmul/gen/f32-vcmul-scalar-u4.c
+// - src/f32-vcmul/gen/f32-vcmul-sse-u8.c
+// - src/f32-vcopysign/gen/f32-vcopysign-avx.c
+// - src/f32-vcopysign/gen/f32-vcopysign-avx512f.c
+// - src/f32-vcopysign/gen/f32-vcopysign-scalar.c
+// - src/f32-vcopysign/gen/f32-vcopysign-sse2.c
+// - src/f32-vcopysign/gen/f32-vcopysignc-avx.c
+// - src/f32-vcopysign/gen/f32-vcopysignc-avx512f.c
+// - src/f32-vcopysign/gen/f32-vcopysignc-scalar.c
+// - src/f32-vcopysign/gen/f32-vcopysignc-sse2.c
+// - src/f32-vcopysign/gen/f32-vrcopysignc-avx.c
+// - src/f32-vcopysign/gen/f32-vrcopysignc-avx512f.c
+// - src/f32-vcopysign/gen/f32-vrcopysignc-scalar.c
+// - src/f32-vcopysign/gen/f32-vrcopysignc-sse2.c
+// - src/f32-velu/gen/f32-velu-avx-rr2-lut4-p4-perm-u32.c
 // - src/f32-velu/gen/f32-velu-avx2-rr1-lut4-p4-perm-u56.c
+// - src/f32-velu/gen/f32-velu-avx512f-rr1-p6-u128.c
+// - src/f32-velu/gen/f32-velu-scalar-rr2-lut16-p3-u2.c
+// - src/f32-velu/gen/f32-velu-scalar-rr2-lut16-p3-u4.c
+// - src/f32-velu/gen/f32-velu-sse2-rr2-lut16-p3-u12.c
+// - src/f32-vexp/gen/f32-vexp-scalar-exp.c
+// - src/f32-vgelu/gen/f32-vgelu-avx-rational-12-10-div.c
+// - src/f32-vgelu/gen/f32-vgelu-avx512f-rational-12-10-nr.c
+// - src/f32-vgelu/gen/f32-vgelu-fma3-rational-12-10-div.c
+// - src/f32-vgelu/gen/f32-vgelu-scalar-rational-12-10-div.c
+// - src/f32-vgelu/gen/f32-vgelu-sse2-rational-12-10-div.c
+// - src/f32-vhswish/gen/f32-vhswish-avx-u16.c
+// - src/f32-vhswish/gen/f32-vhswish-avx512f-u16.c
+// - src/f32-vhswish/gen/f32-vhswish-fma3-u16.c
+// - src/f32-vhswish/gen/f32-vhswish-scalar-u4.c
+// - src/f32-vhswish/gen/f32-vhswish-sse-u8.c
 // - src/f32-vlog/gen/f32-vlog-avx2-rational-3-3-div.c
+// - src/f32-vlog/gen/f32-vlog-avx512f-rational-3-3-div.c
+// - src/f32-vlog/gen/f32-vlog-fma3-rational-3-3-div.c
+// - src/f32-vlog/gen/f32-vlog-scalar-rational-3-3-div.c
+// - src/f32-vlog/gen/f32-vlog-sse2-rational-3-3-div.c
+// - src/f32-vlrelu/gen/f32-vlrelu-avx-u16.c
+// - src/f32-vlrelu/gen/f32-vlrelu-avx512f-u16.c
+// - src/f32-vlrelu/gen/f32-vlrelu-scalar-u4.c
+// - src/f32-vlrelu/gen/f32-vlrelu-sse-u8.c
+// - src/f32-vlrelu/gen/f32-vlrelu-sse41-u8.c
+// - src/f32-vmulcaddc/gen/f32-vmulcaddc-c1-minmax-scalar-2x.c
+// - src/f32-vmulcaddc/gen/f32-vmulcaddc-c4-minmax-sse-2x.c
+// - src/f32-vrelu/gen/f32-vrelu-scalar-u8.c
+// - src/f32-vrnd/gen/f32-vrndd-avx-u16.c
+// - src/f32-vrnd/gen/f32-vrndd-avx512f-u16.c
+// - src/f32-vrnd/gen/f32-vrndd-scalar-libm-u1.c
+// - src/f32-vrnd/gen/f32-vrndd-scalar-libm-u4.c
+// - src/f32-vrnd/gen/f32-vrndd-sse2-u8.c
+// - src/f32-vrnd/gen/f32-vrndd-sse41-u8.c
+// - src/f32-vrnd/gen/f32-vrndne-avx-u16.c
+// - src/f32-vrnd/gen/f32-vrndne-avx512f-u16.c
+// - src/f32-vrnd/gen/f32-vrndne-scalar-libm-u1.c
+// - src/f32-vrnd/gen/f32-vrndne-scalar-libm-u4.c
+// - src/f32-vrnd/gen/f32-vrndne-sse2-u8.c
+// - src/f32-vrnd/gen/f32-vrndne-sse41-u8.c
+// - src/f32-vrnd/gen/f32-vrndu-avx-u16.c
+// - src/f32-vrnd/gen/f32-vrndu-avx512f-u16.c
+// - src/f32-vrnd/gen/f32-vrndu-scalar-libm-u1.c
+// - src/f32-vrnd/gen/f32-vrndu-scalar-libm-u4.c
+// - src/f32-vrnd/gen/f32-vrndu-sse2-u8.c
+// - src/f32-vrnd/gen/f32-vrndu-sse41-u8.c
+// - src/f32-vrnd/gen/f32-vrndz-avx-u16.c
+// - src/f32-vrnd/gen/f32-vrndz-avx512f-u16.c
+// - src/f32-vrnd/gen/f32-vrndz-scalar-libm-u1.c
+// - src/f32-vrnd/gen/f32-vrndz-scalar-libm-u4.c
+// - src/f32-vrnd/gen/f32-vrndz-sse2-u8.c
+// - src/f32-vrnd/gen/f32-vrndz-sse41-u8.c
+// - src/f32-vrsqrt/gen/f32-vrsqrt-avx-rsqrt-u16.c
+// - src/f32-vrsqrt/gen/f32-vrsqrt-avx512f-rsqrt-u32.c
+// - src/f32-vrsqrt/gen/f32-vrsqrt-fma3-rsqrt-u16.c
+// - src/f32-vrsqrt/gen/f32-vrsqrt-scalar-rsqrt-u1.c
+// - src/f32-vrsqrt/gen/f32-vrsqrt-scalar-rsqrt-u4.c
+// - src/f32-vrsqrt/gen/f32-vrsqrt-sse-rsqrt-u8.c
+// - src/f32-vsigmoid/gen/f32-vsigmoid-avx-rr2-p5-nr2-u40.c
 // - src/f32-vsigmoid/gen/f32-vsigmoid-avx2-rr1-p5-div-u40.c
+// - src/f32-vsigmoid/gen/f32-vsigmoid-avx512f-rr2-lut32-p2-perm2-scalef-div-u64.c
+// - src/f32-vsigmoid/gen/f32-vsigmoid-scalar-rr2-lut64-p2-div-u2.c
+// - src/f32-vsigmoid/gen/f32-vsigmoid-sse2-rr2-lut64-p2-div-u8.c
+// - src/f32-vsigmoid/gen/f32-vsigmoid-sse41-rr2-lut64-p2-div-u8.c
+// - src/f32-vsqrt/gen/f32-vsqrt-avx-rsqrt-u16.c
+// - src/f32-vsqrt/gen/f32-vsqrt-avx512f-rsqrt-u16.c
+// - src/f32-vsqrt/gen/f32-vsqrt-fma3-rsqrt-u16.c
+// - src/f32-vsqrt/gen/f32-vsqrt-scalar-sqrt-u1.c
+// - src/f32-vsqrt/gen/f32-vsqrt-sse-rsqrt-u12.c
+// - src/f32-vtanh/gen/f32-vtanh-avx-rational-9-8-div.c
+// - src/f32-vtanh/gen/f32-vtanh-avx512f-rational-9-8-nr.c
+// - src/f32-vtanh/gen/f32-vtanh-fma3-rational-9-8-div.c
+// - src/f32-vtanh/gen/f32-vtanh-scalar-rational-9-8-div.c
+// - src/f32-vtanh/gen/f32-vtanh-sse2-rational-9-8-div.c
+// - src/f32-vunary/gen/f32-vabs-avx.c
+// - src/f32-vunary/gen/f32-vabs-avx512f.c
+// - src/f32-vunary/gen/f32-vabs-scalar.c
+// - src/f32-vunary/gen/f32-vabs-sse2.c
+// - src/f32-vunary/gen/f32-vneg-avx.c
+// - src/f32-vunary/gen/f32-vneg-avx512f.c
+// - src/f32-vunary/gen/f32-vneg-scalar.c
+// - src/f32-vunary/gen/f32-vneg-sse2.c
+// - src/f32-vunary/gen/f32-vsqr-avx.c
+// - src/f32-vunary/gen/f32-vsqr-avx512f.c
+// - src/f32-vunary/gen/f32-vsqr-scalar.c
+// - src/f32-vunary/gen/f32-vsqr-sse2.c
+// - src/log.c
+// - src/memory.c
+// - src/mutex.c
+// - src/packing.cc
+// - src/params.c
 // - src/qd8-f16-qb4w-gemm/gen/qd8-f16-qb4w-gemm-1x8c8-minmax-avx2.c
 // - src/qd8-f16-qb4w-gemm/gen/qd8-f16-qb4w-gemm-3x8c8-minmax-avx2.c
 // - src/qd8-f16-qc4w-gemm/gen/qd8-f16-qc4w-gemm-1x8c8-minmax-avx2-madd-prfm.c
+// - src/qd8-f16-qc4w-gemm/gen/qd8-f16-qc4w-gemm-1x8c8-minmax-avx256skx-madd-prfm.c
+// - src/qd8-f16-qc4w-gemm/gen/qd8-f16-qc4w-gemm-1x8c8-minmax-avx256vnni.c
+// - src/qd8-f16-qc4w-gemm/gen/qd8-f16-qc4w-gemm-1x8c8-minmax-avxvnni-prfm.c
 // - src/qd8-f16-qc4w-gemm/gen/qd8-f16-qc4w-gemm-4x8c8-minmax-avx2-madd-prfm.c
+// - src/qd8-f16-qc4w-gemm/gen/qd8-f16-qc4w-gemm-5x8c8-minmax-avxvnni-prfm.c
+// - src/qd8-f16-qc4w-gemm/gen/qd8-f16-qc4w-gemm-8x8c8-minmax-avx256skx-madd-prfm.c
+// - src/qd8-f16-qc4w-gemm/gen/qd8-f16-qc4w-gemm-8x8c8-minmax-avx256vnni.c
+// - src/qd8-f16-qc8w-gemm/gen/qd8-f16-qc8w-gemm-16x64c4-minmax-avx512amx.c
+// - src/qd8-f16-qc8w-gemm/gen/qd8-f16-qc8w-gemm-1x64c4-minmax-avx512amx.c
 // - src/qd8-f16-qc8w-gemm/gen/qd8-f16-qc8w-gemm-1x8c8-minmax-avx2.c
+// - src/qd8-f16-qc8w-gemm/gen/qd8-f16-qc8w-gemm-1x8c8-minmax-avx256skx.c
+// - src/qd8-f16-qc8w-gemm/gen/qd8-f16-qc8w-gemm-1x8c8-minmax-avx256vnni.c
+// - src/qd8-f16-qc8w-gemm/gen/qd8-f16-qc8w-gemm-1x8c8-minmax-avxvnni-prfm.c
 // - src/qd8-f16-qc8w-gemm/gen/qd8-f16-qc8w-gemm-3x8c8-minmax-avx2.c
+// - src/qd8-f16-qc8w-gemm/gen/qd8-f16-qc8w-gemm-5x8c8-minmax-avx256skx.c
+// - src/qd8-f16-qc8w-gemm/gen/qd8-f16-qc8w-gemm-5x8c8-minmax-avxvnni-prfm.c
+// - src/qd8-f16-qc8w-gemm/gen/qd8-f16-qc8w-gemm-8x8c8-minmax-avx256vnni.c
+// - src/qd8-f16-qc8w-igemm/gen/qd8-f16-qc8w-igemm-16x64c4-minmax-avx512amx.c
+// - src/qd8-f16-qc8w-igemm/gen/qd8-f16-qc8w-igemm-1x64c4-minmax-avx512amx.c
 // - src/qd8-f16-qc8w-igemm/gen/qd8-f16-qc8w-igemm-1x8c8-minmax-avx2.c
+// - src/qd8-f16-qc8w-igemm/gen/qd8-f16-qc8w-igemm-1x8c8-minmax-avx256skx.c
+// - src/qd8-f16-qc8w-igemm/gen/qd8-f16-qc8w-igemm-1x8c8-minmax-avx256vnni.c
+// - src/qd8-f16-qc8w-igemm/gen/qd8-f16-qc8w-igemm-1x8c8-minmax-avxvnni-prfm.c
 // - src/qd8-f16-qc8w-igemm/gen/qd8-f16-qc8w-igemm-3x8c8-minmax-avx2.c
+// - src/qd8-f16-qc8w-igemm/gen/qd8-f16-qc8w-igemm-5x8c8-minmax-avx256skx.c
+// - src/qd8-f16-qc8w-igemm/gen/qd8-f16-qc8w-igemm-5x8c8-minmax-avxvnni-prfm.c
+// - src/qd8-f16-qc8w-igemm/gen/qd8-f16-qc8w-igemm-8x8c8-minmax-avx256vnni.c
+// - src/qd8-f32-qb4w-gemm/gen/qd8-f32-qb4w-gemm-14x16c8-minmax-avx512vnnigfni-prfm.c
+// - src/qd8-f32-qb4w-gemm/gen/qd8-f32-qb4w-gemm-1x16c8-minmax-avx512vnni-prfm.c
+// - src/qd8-f32-qb4w-gemm/gen/qd8-f32-qb4w-gemm-1x16c8-minmax-avx512vnnigfni-prfm.c
+// - src/qd8-f32-qb4w-gemm/gen/qd8-f32-qb4w-gemm-1x4-minmax-scalar.c
+// - src/qd8-f32-qb4w-gemm/gen/qd8-f32-qb4w-gemm-1x4c8-minmax-avx-ld128.c
+// - src/qd8-f32-qb4w-gemm/gen/qd8-f32-qb4w-gemm-1x4c8-minmax-sse2-ld128.c
+// - src/qd8-f32-qb4w-gemm/gen/qd8-f32-qb4w-gemm-1x4c8-minmax-sse41-ld128.c
 // - src/qd8-f32-qb4w-gemm/gen/qd8-f32-qb4w-gemm-1x8c8-minmax-avx2.c
+// - src/qd8-f32-qb4w-gemm/gen/qd8-f32-qb4w-gemm-3x4c8-minmax-sse41-ld128.c
 // - src/qd8-f32-qb4w-gemm/gen/qd8-f32-qb4w-gemm-3x8c8-minmax-avx2.c
-// - src/qd8-f32-qc4w-gemm/gen/qd8-f32-qc4w-gemm-1x8c8-minmax-avx2-madd-prfm.c
-// - src/qd8-f32-qc4w-gemm/gen/qd8-f32-qc4w-gemm-4x8c8-minmax-avx2-madd-prfm.c
-// - src/qd8-f32-qc8w-gemm/gen/qd8-f32-qc8w-gemm-1x8c8-minmax-avx2.c
-// - src/qd8-f32-qc8w-gemm/gen/qd8-f32-qc8w-gemm-4x8c8-minmax-avx2.c
-// - src/qd8-f32-qc8w-igemm/gen/qd8-f32-qc8w-igemm-1x8c8-minmax-avx2.c
-// - src/qd8-f32-qc8w-igemm/gen/qd8-f32-qc8w-igemm-4x8c8-minmax-avx2.c
-// - src/qs8-dwconv/gen/qs8-dwconv-9p16c-minmax-fp32-avx2-mul32.c
-// - src/qs8-dwconv/gen/qs8-dwconv-25p16c-minmax-fp32-avx2-mul32.c
-// - src/qs8-f16-vcvt/gen/qs8-f16-vcvt-avx2-u16.c
-// - src/qs8-f32-vcvt/gen/qs8-f32-vcvt-avx2-u16.c
-// - src/qs8-qc8w-dwconv/gen/qs8-qc8w-dwconv-3p16c-minmax-fp32-avx2-mul32.c
-// - src/qs8-qc8w-dwconv/gen/qs8-qc8w-dwconv-9p16c-minmax-fp32-avx2-mul32.c
-// - src/qs8-qc8w-dwconv/gen/qs8-qc8w-dwconv-25p16c-minmax-fp32-avx2-mul32.c
-// - src/qs8-qc8w-gemm/gen/qs8-qc8w-gemm-1x8c8-minmax-fp32-avx2.c
-// - src/qs8-qc8w-gemm/gen/qs8-qc8w-gemm-3x8c8-minmax-fp32-avx2.c
-// - src/qs8-qc8w-igemm/gen/qs8-qc8w-igemm-1x8c8-minmax-fp32-avx2.c
-// - src/qs8-qc8w-igemm/gen/qs8-qc8w-igemm-3x8c8-minmax-fp32-avx2.c
-// - src/qs8-rdsum/gen/qs8-rdsum-7p7x-minmax-fp32-avx2-c64.c
-// - src/qs8-rsum/gen/qs8-rsum-avx2-u64-acc2.c
-// - src/qs8-vadd/gen/qs8-vadd-minmax-avx2-mul32-ld64-u16.c
-// - src/qs8-vaddc/gen/qs8-vaddc-minmax-avx2-mul32-ld64-u16.c
-// - src/qs8-vcvt/gen/qs8-vcvt-avx2-u32.c
-// - src/qs8-vlrelu/gen/qs8-vlrelu-avx2-u32.c
-// - src/qu8-dwconv/gen/qu8-dwconv-9p16c-minmax-fp32-avx2-mul32.c
-// - src/qu8-dwconv/gen/qu8-dwconv-25p16c-minmax-fp32-avx2-mul32.c
-// - src/qu8-f32-vcvt/gen/qu8-f32-vcvt-avx2-u16.c
-// - src/qu8-gemm/gen/qu8-gemm-1x8c8-minmax-fp32-avx2.c
-// - src/qu8-gemm/gen/qu8-gemm-3x8c8-minmax-fp32-avx2.c
-// - src/qu8-igemm/gen/qu8-igemm-1x8c8-minmax-fp32-avx2.c
-// - src/qu8-igemm/gen/qu8-igemm-3x8c8-minmax-fp32-avx2.c
-// - src/qu8-rsum/gen/qu8-rsum-avx2-u64.c
-// - src/qu8-vadd/gen/qu8-vadd-minmax-avx2-mul32-ld64-u16.c
-// - src/qu8-vaddc/gen/qu8-vaddc-minmax-avx2-mul32-ld64-u16.c
-// - src/qu8-vcvt/gen/qu8-vcvt-avx2-u32.c
-// - src/qu8-vlrelu/gen/qu8-vlrelu-avx2-u32.c
-// - src/s32-f32-vcvt/gen/s32-f32-vcvt-avx2.c
-// - src/s32-vmul/gen/s32-vmul-avx2.c
-// - src/s32-vmul/gen/s32-vmulc-avx2.c
-// - src/u32-f32-vcvt/gen/u32-f32-vcvt-avx2.c
-// - src/x8-lut/gen/x8-lut-avx2-u128.c
-// - src/x8-transposec/gen/x8-transposec-32x32-reuse-switch-avx2.c
-// - src/x16-packw/gen/x16-packw-x16-gemm-goi-avx2-u16-prfm.c
-// - src/x16-transposec/gen/x16-transposec-16x16-reuse-switch-avx2.c
-// - src/f32-dwconv/gen/f32-dwconv-3p16c-minmax-avx512f.c
-// - src/f32-dwconv/gen/f32-dwconv-4p16c-minmax-avx512f.c
-// - src/f32-dwconv/gen/f32-dwconv-5f5m5l32c16s1r-minmax-avx512f.c
-// - src/f32-dwconv/gen/f32-dwconv-9p16c-minmax-avx512f.c
-// - src/f32-dwconv/gen/f32-dwconv-25p16c-minmax-avx512f.c
-// - src/f32-gemm/gen/f32-gemm-1x16-minmax-avx512f-broadcast.c
-// - src/f32-gemm/gen/f32-gemm-7x16-minmax-avx512f-broadcast.c
-// - src/f32-igemm/gen/f32-igemm-1x16-minmax-avx512f-broadcast.c
-// - src/f32-igemm/gen/f32-igemm-7x16-minmax-avx512f-broadcast.c
-// - src/f32-prelu/gen/f32-prelu-avx512f-2x16.c
-// - src/f32-raddstoreexpminusmax/gen/f32-raddstoreexpminusmax-avx512f-rr2-p5-u64-acc2.c
-// - src/f32-rdsum/gen/f32-rdsum-7p7x-minmax-avx512f-c64.c
-// - src/f32-rminmax/gen/f32-rmax-avx512f-u64-acc4.c
-// - src/f32-rminmax/gen/f32-rminmax-avx512f-u64-acc4.c
-// - src/f32-rsum/gen/f32-rsum-avx512f-u64-acc4.c
-// - src/f32-vbinary/gen/f32-vadd-avx512f-u32.c
-// - src/f32-vbinary/gen/f32-vaddc-avx512f-u32.c
-// - src/f32-vbinary/gen/f32-vdiv-avx512f-u32.c
-// - src/f32-vbinary/gen/f32-vdivc-avx512f-u32.c
-// - src/f32-vbinary/gen/f32-vmax-avx512f-u32.c
-// - src/f32-vbinary/gen/f32-vmaxc-avx512f-u32.c
-// - src/f32-vbinary/gen/f32-vmin-avx512f-u32.c
-// - src/f32-vbinary/gen/f32-vminc-avx512f-u32.c
-// - src/f32-vbinary/gen/f32-vmul-avx512f-u32.c
-// - src/f32-vbinary/gen/f32-vmulc-avx512f-u32.c
-// - src/f32-vbinary/gen/f32-vrdivc-avx512f-u32.c
-// - src/f32-vbinary/gen/f32-vrsubc-avx512f-u32.c
-// - src/f32-vbinary/gen/f32-vsqrdiff-avx512f-u32.c
-// - src/f32-vbinary/gen/f32-vsqrdiffc-avx512f-u32.c
-// - src/f32-vbinary/gen/f32-vsub-avx512f-u32.c
-// - src/f32-vbinary/gen/f32-vsubc-avx512f-u32.c
-// - src/f32-vclamp/gen/f32-vclamp-avx512f-u16.c
-// - src/f32-vcmul/gen/f32-vcmul-avx512f-u32.c
-// - src/f32-vcopysign/gen/f32-vcopysign-avx512f.c
-// - src/f32-vcopysign/gen/f32-vcopysignc-avx512f.c
-// - src/f32-vcopysign/gen/f32-vrcopysignc-avx512f.c
-// - src/f32-velu/gen/f32-velu-avx512f-rr1-p6-u128.c
-// - src/f32-vgelu/gen/f32-vgelu-avx512f-rational-12-10-nr.c
-// - src/f32-vhswish/gen/f32-vhswish-avx512f-u16.c
-// - src/f32-vlog/gen/f32-vlog-avx512f-rational-3-3-div.c
-// - src/f32-vlrelu/gen/f32-vlrelu-avx512f-u16.c
-// - src/f32-vrnd/gen/f32-vrndd-avx512f-u16.c
-// - src/f32-vrnd/gen/f32-vrndne-avx512f-u16.c
-// - src/f32-vrnd/gen/f32-vrndu-avx512f-u16.c
-// - src/f32-vrnd/gen/f32-vrndz-avx512f-u16.c
-// - src/f32-vrsqrt/gen/f32-vrsqrt-avx512f-rsqrt-u32.c
-// - src/f32-vsigmoid/gen/f32-vsigmoid-avx512f-rr2-lut32-p2-perm2-scalef-div-u64.c
-// - src/f32-vsqrt/gen/f32-vsqrt-avx512f-rsqrt-u16.c
-// - src/f32-vtanh/gen/f32-vtanh-avx512f-rational-9-8-nr.c
-// - src/f32-vunary/gen/f32-vabs-avx512f.c
-// - src/f32-vunary/gen/f32-vneg-avx512f.c
-// - src/f32-vunary/gen/f32-vsqr-avx512f.c
-// - src/s32-f32-vcvt/gen/s32-f32-vcvt-avx512f.c
-// - src/s32-vmul/gen/s32-vmul-avx512f.c
-// - src/s32-vmul/gen/s32-vmulc-avx512f.c
-// - src/u32-f32-vcvt/gen/u32-f32-vcvt-avx512f.c
-// - src/x32-packw/gen/x32-packw-x16-gemm-goi-avx512f-u4-prfm.c
-// - src/f16-f32-vcvt/gen/f16-f32-vcvt-avx512skx-u16.c
-// - src/f16-f32acc-rdsum/gen/f16-f32acc-rdsum-7p7x-avx512skx-c64.c
-// - src/f16-f32acc-rsum/gen/f16-f32acc-rsum-avx512skx-u64-acc4.c
-// - src/f16-rminmax/gen/f16-rmax-avx512skx-u64-acc4.c
-// - src/f16-rminmax/gen/f16-rminmax-avx512skx-u64-acc4.c
-// - src/f32-f16-vcvt/gen/f32-f16-vcvt-avx512skx-u16.c
-// - src/f32-qc8w-gemm/gen/f32-qc4w-gemm-1x32-minmax-avx512skx-broadcast.c
-// - src/f32-qc8w-gemm/gen/f32-qc4w-gemm-7x32-minmax-avx512skx-broadcast.c
-// - src/f32-qc8w-gemm/gen/f32-qc8w-gemm-1x32-minmax-avx512skx-broadcast.c
-// - src/f32-qc8w-gemm/gen/f32-qc8w-gemm-7x32-minmax-avx512skx-broadcast.c
-// - src/f32-qs8-vcvt/gen/f32-qs8-vcvt-avx512skx-u128.c
-// - src/f32-qu8-vcvt/gen/f32-qu8-vcvt-avx512skx-u128.c
+// - src/qd8-f32-qb4w-gemm/gen/qd8-f32-qb4w-gemm-4x4-minmax-scalar.c
+// - src/qd8-f32-qb4w-gemm/gen/qd8-f32-qb4w-gemm-4x4c8-minmax-avx-ld128.c
+// - src/qd8-f32-qb4w-gemm/gen/qd8-f32-qb4w-gemm-4x4c8-minmax-sse2-ld128.c
+// - src/qd8-f32-qb4w-gemm/gen/qd8-f32-qb4w-gemm-8x16c8-minmax-avx512vnni-prfm.c
+// - src/qd8-f32-qc4w-gemm/gen/qd8-f32-qc4w-gemm-14x16c8-minmax-avx512vnnigfni-prfm.c
+// - src/qd8-f32-qc4w-gemm/gen/qd8-f32-qc4w-gemm-16x64c4-minmax-avx512amx.c
 // - src/qd8-f32-qc4w-gemm/gen/qd8-f32-qc4w-gemm-1x16c8-minmax-avx512skx-madd-prfm.c
+// - src/qd8-f32-qc4w-gemm/gen/qd8-f32-qc4w-gemm-1x16c8-minmax-avx512vnni-prfm.c
+// - src/qd8-f32-qc4w-gemm/gen/qd8-f32-qc4w-gemm-1x16c8-minmax-avx512vnnigfni-prfm.c
+// - src/qd8-f32-qc4w-gemm/gen/qd8-f32-qc4w-gemm-1x4-minmax-scalar.c
+// - src/qd8-f32-qc4w-gemm/gen/qd8-f32-qc4w-gemm-1x4c8-minmax-sse2-ld128.c
+// - src/qd8-f32-qc4w-gemm/gen/qd8-f32-qc4w-gemm-1x4c8-minmax-ssse3-madd.c
+// - src/qd8-f32-qc4w-gemm/gen/qd8-f32-qc4w-gemm-1x64c4-minmax-avx512amx.c
+// - src/qd8-f32-qc4w-gemm/gen/qd8-f32-qc4w-gemm-1x8c8-minmax-avx2-madd-prfm.c
+// - src/qd8-f32-qc4w-gemm/gen/qd8-f32-qc4w-gemm-1x8c8-minmax-avx256skx-madd-prfm.c
+// - src/qd8-f32-qc4w-gemm/gen/qd8-f32-qc4w-gemm-1x8c8-minmax-avxvnni-prfm.c
+// - src/qd8-f32-qc4w-gemm/gen/qd8-f32-qc4w-gemm-4x4-minmax-scalar.c
+// - src/qd8-f32-qc4w-gemm/gen/qd8-f32-qc4w-gemm-4x4c8-minmax-sse2-ld128.c
+// - src/qd8-f32-qc4w-gemm/gen/qd8-f32-qc4w-gemm-4x4c8-minmax-ssse3-madd.c
+// - src/qd8-f32-qc4w-gemm/gen/qd8-f32-qc4w-gemm-4x8c8-minmax-avx2-madd-prfm.c
+// - src/qd8-f32-qc4w-gemm/gen/qd8-f32-qc4w-gemm-5x8c8-minmax-avxvnni-prfm.c
 // - src/qd8-f32-qc4w-gemm/gen/qd8-f32-qc4w-gemm-8x16c8-minmax-avx512skx-madd-prfm.c
+// - src/qd8-f32-qc4w-gemm/gen/qd8-f32-qc4w-gemm-8x16c8-minmax-avx512vnni-prfm.c
+// - src/qd8-f32-qc4w-gemm/gen/qd8-f32-qc4w-gemm-8x8c8-minmax-avx256skx-madd-prfm.c
+// - src/qd8-f32-qc8w-gemm/gen/qd8-f32-qc8w-gemm-10x16c8-minmax-avx512vnni-prfm.c
+// - src/qd8-f32-qc8w-gemm/gen/qd8-f32-qc8w-gemm-16x64c4-minmax-avx512amx.c
 // - src/qd8-f32-qc8w-gemm/gen/qd8-f32-qc8w-gemm-1x16c8-minmax-avx512skx-prfm.c
+// - src/qd8-f32-qc8w-gemm/gen/qd8-f32-qc8w-gemm-1x16c8-minmax-avx512vnni-prfm.c
+// - src/qd8-f32-qc8w-gemm/gen/qd8-f32-qc8w-gemm-1x2-minmax-scalar.c
+// - src/qd8-f32-qc8w-gemm/gen/qd8-f32-qc8w-gemm-1x4-minmax-scalar.c
+// - src/qd8-f32-qc8w-gemm/gen/qd8-f32-qc8w-gemm-1x4c8-minmax-sse2-ld64.c
+// - src/qd8-f32-qc8w-gemm/gen/qd8-f32-qc8w-gemm-1x4c8-minmax-sse41-ld64.c
+// - src/qd8-f32-qc8w-gemm/gen/qd8-f32-qc8w-gemm-1x64c4-minmax-avx512amx.c
+// - src/qd8-f32-qc8w-gemm/gen/qd8-f32-qc8w-gemm-1x8c8-minmax-avx2.c
+// - src/qd8-f32-qc8w-gemm/gen/qd8-f32-qc8w-gemm-1x8c8-minmax-avx256skx.c
+// - src/qd8-f32-qc8w-gemm/gen/qd8-f32-qc8w-gemm-1x8c8-minmax-avxvnni-prfm.c
+// - src/qd8-f32-qc8w-gemm/gen/qd8-f32-qc8w-gemm-2x2-minmax-scalar.c
+// - src/qd8-f32-qc8w-gemm/gen/qd8-f32-qc8w-gemm-4x4-minmax-scalar.c
+// - src/qd8-f32-qc8w-gemm/gen/qd8-f32-qc8w-gemm-4x4c8-minmax-sse2-ld64.c
+// - src/qd8-f32-qc8w-gemm/gen/qd8-f32-qc8w-gemm-4x4c8-minmax-sse41-ld64.c
+// - src/qd8-f32-qc8w-gemm/gen/qd8-f32-qc8w-gemm-4x8c8-minmax-avx2.c
+// - src/qd8-f32-qc8w-gemm/gen/qd8-f32-qc8w-gemm-5x8c8-minmax-avxvnni-prfm.c
 // - src/qd8-f32-qc8w-gemm/gen/qd8-f32-qc8w-gemm-8x16c8-minmax-avx512skx-prfm.c
+// - src/qd8-f32-qc8w-gemm/gen/qd8-f32-qc8w-gemm-8x8c8-minmax-avx256skx.c
+// - src/qd8-f32-qc8w-igemm/gen/qd8-f32-qc8w-igemm-10x16c8-minmax-avx512vnni-prfm.c
+// - src/qd8-f32-qc8w-igemm/gen/qd8-f32-qc8w-igemm-16x64c4-minmax-avx512amx.c
 // - src/qd8-f32-qc8w-igemm/gen/qd8-f32-qc8w-igemm-1x16c8-minmax-avx512skx-prfm.c
+// - src/qd8-f32-qc8w-igemm/gen/qd8-f32-qc8w-igemm-1x16c8-minmax-avx512vnni-prfm.c
+// - src/qd8-f32-qc8w-igemm/gen/qd8-f32-qc8w-igemm-1x2-minmax-scalar.c
+// - src/qd8-f32-qc8w-igemm/gen/qd8-f32-qc8w-igemm-1x4-minmax-scalar.c
+// - src/qd8-f32-qc8w-igemm/gen/qd8-f32-qc8w-igemm-1x4c8-minmax-sse2-ld64.c
+// - src/qd8-f32-qc8w-igemm/gen/qd8-f32-qc8w-igemm-1x4c8-minmax-sse41-ld64.c
+// - src/qd8-f32-qc8w-igemm/gen/qd8-f32-qc8w-igemm-1x64c4-minmax-avx512amx.c
+// - src/qd8-f32-qc8w-igemm/gen/qd8-f32-qc8w-igemm-1x8c8-minmax-avx2.c
+// - src/qd8-f32-qc8w-igemm/gen/qd8-f32-qc8w-igemm-1x8c8-minmax-avx256skx.c
+// - src/qd8-f32-qc8w-igemm/gen/qd8-f32-qc8w-igemm-1x8c8-minmax-avxvnni-prfm.c
+// - src/qd8-f32-qc8w-igemm/gen/qd8-f32-qc8w-igemm-2x2-minmax-scalar.c
+// - src/qd8-f32-qc8w-igemm/gen/qd8-f32-qc8w-igemm-4x4-minmax-scalar.c
+// - src/qd8-f32-qc8w-igemm/gen/qd8-f32-qc8w-igemm-4x4c8-minmax-sse2-ld64.c
+// - src/qd8-f32-qc8w-igemm/gen/qd8-f32-qc8w-igemm-4x4c8-minmax-sse41-ld64.c
+// - src/qd8-f32-qc8w-igemm/gen/qd8-f32-qc8w-igemm-4x8c8-minmax-avx2.c
+// - src/qd8-f32-qc8w-igemm/gen/qd8-f32-qc8w-igemm-5x8c8-minmax-avxvnni-prfm.c
 // - src/qd8-f32-qc8w-igemm/gen/qd8-f32-qc8w-igemm-8x16c8-minmax-avx512skx-prfm.c
-// - src/qs8-dwconv/gen/qs8-dwconv-9p32c-minmax-fp32-avx512skx-mul32.c
+// - src/qd8-f32-qc8w-igemm/gen/qd8-f32-qc8w-igemm-8x8c8-minmax-avx256skx.c
+// - src/qs16-qs8-vcvt/gen/qs16-qs8-vcvt-avx-u16.c
+// - src/qs16-qs8-vcvt/gen/qs16-qs8-vcvt-scalar-u4.c
+// - src/qs16-qs8-vcvt/gen/qs16-qs8-vcvt-sse2-u16.c
+// - src/qs16-qs8-vcvt/gen/qs16-qs8-vcvt-sse41-u16.c
+// - src/qs16-qs8-vcvt/gen/qs16-qs8-vcvt-ssse3-u16.c
+// - src/qs8-dwconv/gen/qs8-dwconv-25p16c-minmax-fp32-avx-mul16-add16.c
+// - src/qs8-dwconv/gen/qs8-dwconv-25p16c-minmax-fp32-avx2-mul32.c
+// - src/qs8-dwconv/gen/qs8-dwconv-25p1c-minmax-fp32-scalar-fmagic.c
+// - src/qs8-dwconv/gen/qs8-dwconv-25p1c-minmax-fp32-scalar-imagic.c
+// - src/qs8-dwconv/gen/qs8-dwconv-25p2c-minmax-fp32-scalar-lrintf.c
 // - src/qs8-dwconv/gen/qs8-dwconv-25p32c-minmax-fp32-avx512skx-mul32.c
+// - src/qs8-dwconv/gen/qs8-dwconv-25p8c-minmax-fp32-sse2-mul16-add16.c
+// - src/qs8-dwconv/gen/qs8-dwconv-25p8c-minmax-fp32-sse41-mul16-add16.c
+// - src/qs8-dwconv/gen/qs8-dwconv-9p16c-minmax-fp32-avx-mul16-add16.c
+// - src/qs8-dwconv/gen/qs8-dwconv-9p16c-minmax-fp32-avx2-mul32.c
+// - src/qs8-dwconv/gen/qs8-dwconv-9p1c-minmax-fp32-scalar-fmagic.c
+// - src/qs8-dwconv/gen/qs8-dwconv-9p2c-minmax-fp32-scalar-imagic.c
+// - src/qs8-dwconv/gen/qs8-dwconv-9p2c-minmax-fp32-scalar-lrintf.c
+// - src/qs8-dwconv/gen/qs8-dwconv-9p32c-minmax-fp32-avx512skx-mul32.c
+// - src/qs8-dwconv/gen/qs8-dwconv-9p8c-minmax-fp32-sse2-mul16-add16.c
+// - src/qs8-dwconv/gen/qs8-dwconv-9p8c-minmax-fp32-sse41-mul16-add16.c
+// - src/qs8-f16-vcvt/gen/qs8-f16-vcvt-avx2-u16.c
+// - src/qs8-f32-vcvt/gen/qs8-f32-vcvt-avx-u32.c
+// - src/qs8-f32-vcvt/gen/qs8-f32-vcvt-avx2-u16.c
 // - src/qs8-f32-vcvt/gen/qs8-f32-vcvt-avx512skx-u32.c
-// - src/qs8-qc8w-dwconv/gen/qs8-qc8w-dwconv-3p32c-minmax-fp32-avx512skx-mul32.c
-// - src/qs8-qc8w-dwconv/gen/qs8-qc8w-dwconv-9p32c-minmax-fp32-avx512skx-mul32.c
+// - src/qs8-f32-vcvt/gen/qs8-f32-vcvt-scalar-u1.c
+// - src/qs8-f32-vcvt/gen/qs8-f32-vcvt-scalar-u4.c
+// - src/qs8-f32-vcvt/gen/qs8-f32-vcvt-sse2-u32.c
+// - src/qs8-f32-vcvt/gen/qs8-f32-vcvt-sse41-u16.c
+// - src/qs8-gavgpool/gen/qs8-gavgpool-7p7x-minmax-fp32-scalar-imagic-c1.c
+// - src/qs8-gavgpool/gen/qs8-gavgpool-7p7x-minmax-fp32-scalar-imagic-c4.c
+// - src/qs8-gavgpool/gen/qs8-gavgpool-7p7x-minmax-fp32-sse2-c8.c
+// - src/qs8-gavgpool/gen/qs8-gavgpool-7p7x-minmax-fp32-sse41-c8.c
+// - src/qs8-gavgpool/gen/qs8-gavgpool-7x-minmax-fp32-scalar-imagic-c1.c
+// - src/qs8-gavgpool/gen/qs8-gavgpool-7x-minmax-fp32-scalar-imagic-c4.c
+// - src/qs8-gavgpool/gen/qs8-gavgpool-7x-minmax-fp32-sse2-c8.c
+// - src/qs8-gavgpool/gen/qs8-gavgpool-7x-minmax-fp32-sse41-c8.c
+// - src/qs8-packw/gen/qs8-packw-x64c4-gemm-goi-scalar.c
+// - src/qs8-packw/gen/qs8-packw-x8c8-gemm-goi-avxvnni.c
+// - src/qs8-packw/gen/qs8-packw-x8c8-gemm-goi-scalar.c
+// - src/qs8-qc8w-dwconv/gen/qs8-qc8w-dwconv-25p16c-minmax-fp32-avx-mul16-add16.c
+// - src/qs8-qc8w-dwconv/gen/qs8-qc8w-dwconv-25p16c-minmax-fp32-avx2-mul32.c
+// - src/qs8-qc8w-dwconv/gen/qs8-qc8w-dwconv-25p1c-minmax-fp32-scalar-fmagic.c
+// - src/qs8-qc8w-dwconv/gen/qs8-qc8w-dwconv-25p1c-minmax-fp32-scalar-imagic.c
+// - src/qs8-qc8w-dwconv/gen/qs8-qc8w-dwconv-25p2c-minmax-fp32-scalar-lrintf.c
 // - src/qs8-qc8w-dwconv/gen/qs8-qc8w-dwconv-25p32c-minmax-fp32-avx512skx-mul32.c
+// - src/qs8-qc8w-dwconv/gen/qs8-qc8w-dwconv-25p8c-minmax-fp32-sse2-mul16.c
+// - src/qs8-qc8w-dwconv/gen/qs8-qc8w-dwconv-25p8c-minmax-fp32-sse41-mul16.c
+// - src/qs8-qc8w-dwconv/gen/qs8-qc8w-dwconv-3p16c-minmax-fp32-avx-mul16-add16.c
+// - src/qs8-qc8w-dwconv/gen/qs8-qc8w-dwconv-3p16c-minmax-fp32-avx2-mul32.c
+// - src/qs8-qc8w-dwconv/gen/qs8-qc8w-dwconv-3p1c-minmax-fp32-scalar-fmagic.c
+// - src/qs8-qc8w-dwconv/gen/qs8-qc8w-dwconv-3p2c-minmax-fp32-scalar-imagic.c
+// - src/qs8-qc8w-dwconv/gen/qs8-qc8w-dwconv-3p2c-minmax-fp32-scalar-lrintf.c
+// - src/qs8-qc8w-dwconv/gen/qs8-qc8w-dwconv-3p32c-minmax-fp32-avx512skx-mul32.c
+// - src/qs8-qc8w-dwconv/gen/qs8-qc8w-dwconv-3p8c-minmax-fp32-sse2-mul16.c
+// - src/qs8-qc8w-dwconv/gen/qs8-qc8w-dwconv-3p8c-minmax-fp32-sse41-mul16.c
+// - src/qs8-qc8w-dwconv/gen/qs8-qc8w-dwconv-9p16c-minmax-fp32-avx-mul16-add16.c
+// - src/qs8-qc8w-dwconv/gen/qs8-qc8w-dwconv-9p16c-minmax-fp32-avx2-mul32.c
+// - src/qs8-qc8w-dwconv/gen/qs8-qc8w-dwconv-9p1c-minmax-fp32-scalar-fmagic.c
+// - src/qs8-qc8w-dwconv/gen/qs8-qc8w-dwconv-9p2c-minmax-fp32-scalar-imagic.c
+// - src/qs8-qc8w-dwconv/gen/qs8-qc8w-dwconv-9p2c-minmax-fp32-scalar-lrintf.c
+// - src/qs8-qc8w-dwconv/gen/qs8-qc8w-dwconv-9p32c-minmax-fp32-avx512skx-mul32.c
+// - src/qs8-qc8w-dwconv/gen/qs8-qc8w-dwconv-9p8c-minmax-fp32-sse2-mul16.c
+// - src/qs8-qc8w-dwconv/gen/qs8-qc8w-dwconv-9p8c-minmax-fp32-sse41-mul16.c
+// - src/qs8-qc8w-gemm/gen/qs8-qc8w-gemm-16x64c4-minmax-fp32-avx512amx.c
 // - src/qs8-qc8w-gemm/gen/qs8-qc8w-gemm-1x16c8-minmax-fp32-avx512skx-prfm.c
+// - src/qs8-qc8w-gemm/gen/qs8-qc8w-gemm-1x16c8-minmax-fp32-avx512vnni-prfm.c
+// - src/qs8-qc8w-gemm/gen/qs8-qc8w-gemm-1x2-minmax-fp32-scalar-imagic.c
+// - src/qs8-qc8w-gemm/gen/qs8-qc8w-gemm-1x4-minmax-fp32-scalar-lrintf.c
+// - src/qs8-qc8w-gemm/gen/qs8-qc8w-gemm-1x4c8-minmax-fp32-avx-ld128.c
+// - src/qs8-qc8w-gemm/gen/qs8-qc8w-gemm-1x4c8-minmax-fp32-sse2-ld64.c
+// - src/qs8-qc8w-gemm/gen/qs8-qc8w-gemm-1x4c8-minmax-fp32-sse41-ld64.c
+// - src/qs8-qc8w-gemm/gen/qs8-qc8w-gemm-1x64c4-minmax-fp32-avx512amx.c
+// - src/qs8-qc8w-gemm/gen/qs8-qc8w-gemm-1x8c8-minmax-fp32-avx2.c
+// - src/qs8-qc8w-gemm/gen/qs8-qc8w-gemm-1x8c8-minmax-fp32-avx256skx.c
+// - src/qs8-qc8w-gemm/gen/qs8-qc8w-gemm-1x8c8-minmax-fp32-avxvnni-prfm.c
+// - src/qs8-qc8w-gemm/gen/qs8-qc8w-gemm-1x8c8-minmax-fp32-avxvnniint8-prfm.c
+// - src/qs8-qc8w-gemm/gen/qs8-qc8w-gemm-2x2-minmax-fp32-scalar-imagic.c
+// - src/qs8-qc8w-gemm/gen/qs8-qc8w-gemm-2x4c8-minmax-fp32-avx-ld128.c
+// - src/qs8-qc8w-gemm/gen/qs8-qc8w-gemm-3x4-minmax-fp32-scalar-lrintf.c
+// - src/qs8-qc8w-gemm/gen/qs8-qc8w-gemm-3x4c8-minmax-fp32-sse2-ld64.c
+// - src/qs8-qc8w-gemm/gen/qs8-qc8w-gemm-3x4c8-minmax-fp32-sse41-ld64.c
+// - src/qs8-qc8w-gemm/gen/qs8-qc8w-gemm-3x8c8-minmax-fp32-avx2.c
+// - src/qs8-qc8w-gemm/gen/qs8-qc8w-gemm-4x8c8-minmax-fp32-avx256skx.c
+// - src/qs8-qc8w-gemm/gen/qs8-qc8w-gemm-5x8c8-minmax-fp32-avxvnni-prfm.c
+// - src/qs8-qc8w-gemm/gen/qs8-qc8w-gemm-5x8c8-minmax-fp32-avxvnniint8-prfm.c
 // - src/qs8-qc8w-gemm/gen/qs8-qc8w-gemm-7x16c8-minmax-fp32-avx512skx-prfm.c
+// - src/qs8-qc8w-gemm/gen/qs8-qc8w-gemm-7x16c8-minmax-fp32-avx512vnni-prfm.c
+// - src/qs8-qc8w-igemm/gen/qs8-qc8w-igemm-16x64c4-minmax-fp32-avx512amx.c
+// - src/qs8-qc8w-igemm/gen/qs8-qc8w-igemm-1x16c8-minmax-avx512vnni-prfm.c
 // - src/qs8-qc8w-igemm/gen/qs8-qc8w-igemm-1x16c8-minmax-fp32-avx512skx-prfm.c
+// - src/qs8-qc8w-igemm/gen/qs8-qc8w-igemm-1x2-minmax-fp32-scalar-imagic.c
+// - src/qs8-qc8w-igemm/gen/qs8-qc8w-igemm-1x4-minmax-fp32-scalar-lrintf.c
+// - src/qs8-qc8w-igemm/gen/qs8-qc8w-igemm-1x4c8-minmax-fp32-avx-ld128.c
+// - src/qs8-qc8w-igemm/gen/qs8-qc8w-igemm-1x4c8-minmax-fp32-sse2-ld64.c
+// - src/qs8-qc8w-igemm/gen/qs8-qc8w-igemm-1x4c8-minmax-fp32-sse41-ld64.c
+// - src/qs8-qc8w-igemm/gen/qs8-qc8w-igemm-1x64c4-minmax-fp32-avx512amx.c
+// - src/qs8-qc8w-igemm/gen/qs8-qc8w-igemm-1x8c8-minmax-fp32-avx2.c
+// - src/qs8-qc8w-igemm/gen/qs8-qc8w-igemm-1x8c8-minmax-fp32-avx256skx.c
+// - src/qs8-qc8w-igemm/gen/qs8-qc8w-igemm-1x8c8-minmax-fp32-avxvnni-prfm.c
+// - src/qs8-qc8w-igemm/gen/qs8-qc8w-igemm-1x8c8-minmax-fp32-avxvnniint8-prfm.c
+// - src/qs8-qc8w-igemm/gen/qs8-qc8w-igemm-2x2-minmax-fp32-scalar-imagic.c
+// - src/qs8-qc8w-igemm/gen/qs8-qc8w-igemm-2x4c8-minmax-fp32-avx-ld128.c
+// - src/qs8-qc8w-igemm/gen/qs8-qc8w-igemm-3x4-minmax-fp32-scalar-lrintf.c
+// - src/qs8-qc8w-igemm/gen/qs8-qc8w-igemm-3x4c8-minmax-fp32-sse2-ld64.c
+// - src/qs8-qc8w-igemm/gen/qs8-qc8w-igemm-3x4c8-minmax-fp32-sse41-ld64.c
+// - src/qs8-qc8w-igemm/gen/qs8-qc8w-igemm-3x8c8-minmax-fp32-avx2.c
+// - src/qs8-qc8w-igemm/gen/qs8-qc8w-igemm-4x8c8-minmax-fp32-avx256skx.c
+// - src/qs8-qc8w-igemm/gen/qs8-qc8w-igemm-5x8c8-minmax-fp32-avxvnni-prfm.c
+// - src/qs8-qc8w-igemm/gen/qs8-qc8w-igemm-5x8c8-minmax-fp32-avxvnniint8-prfm.c
+// - src/qs8-qc8w-igemm/gen/qs8-qc8w-igemm-7x16c8-minmax-avx512vnni-prfm.c
 // - src/qs8-qc8w-igemm/gen/qs8-qc8w-igemm-7x16c8-minmax-fp32-avx512skx-prfm.c
+// - src/qs8-qu8-packw/gen/qs8-qu8-packw-x16c8-gemm-goi-scalar.c
+// - src/qs8-qu8-packw/gen/qs8-qu8-packw-x8c8-gemm-goi-avxvnni.c
+// - src/qs8-rdsum/gen/qs8-rdsum-7p7x-minmax-fp32-avx2-c64.c
 // - src/qs8-rdsum/gen/qs8-rdsum-7p7x-minmax-fp32-avx512skx-c64.c
+// - src/qs8-rdsum/gen/qs8-rdsum-7p7x-minmax-fp32-sse41-c64.c
+// - src/qs8-rdsum/gen/qs8-rdsum-minmax-fp32-scalar-u1-acc1.c
+// - src/qs8-rsum/gen/qs8-rsum-avx2-u64-acc2.c
+// - src/qs8-rsum/gen/qs8-rsum-avx256skx-u64-acc2.c
 // - src/qs8-rsum/gen/qs8-rsum-avx512skx-u128-acc2.c
+// - src/qs8-rsum/gen/qs8-rsum-avx512vnni-u128-acc2.c
+// - src/qs8-rsum/gen/qs8-rsum-avxvnni-u128-acc2.c
+// - src/qs8-rsum/gen/qs8-rsum-scalar-u4.c
+// - src/qs8-rsum/gen/qs8-rsum-ssse3-u32-acc2.c
+// - src/qs8-vadd/gen/qs8-vadd-minmax-avx-mul32-ld32-u8.c
+// - src/qs8-vadd/gen/qs8-vadd-minmax-avx2-mul32-ld64-u16.c
 // - src/qs8-vadd/gen/qs8-vadd-minmax-avx512skx-mul32-ld128-u16.c
+// - src/qs8-vadd/gen/qs8-vadd-minmax-scalar-u1.c
+// - src/qs8-vadd/gen/qs8-vadd-minmax-scalar-u4.c
+// - src/qs8-vadd/gen/qs8-vadd-minmax-sse2-mul16-ld64-u8.c
+// - src/qs8-vadd/gen/qs8-vadd-minmax-sse41-mul16-ld64-u8.c
+// - src/qs8-vaddc/gen/qs8-vaddc-minmax-avx-mul32-ld32-u8.c
+// - src/qs8-vaddc/gen/qs8-vaddc-minmax-avx2-mul32-ld64-u16.c
 // - src/qs8-vaddc/gen/qs8-vaddc-minmax-avx512skx-mul32-ld128-u16.c
-// - src/qu8-dwconv/gen/qu8-dwconv-9p32c-minmax-fp32-avx512skx-mul32.c
+// - src/qs8-vaddc/gen/qs8-vaddc-minmax-scalar-u1.c
+// - src/qs8-vaddc/gen/qs8-vaddc-minmax-scalar-u4.c
+// - src/qs8-vaddc/gen/qs8-vaddc-minmax-sse2-mul16-ld64-u8.c
+// - src/qs8-vaddc/gen/qs8-vaddc-minmax-sse41-mul16-ld64-u8.c
+// - src/qs8-vcvt/gen/qs8-vcvt-avx-u32.c
+// - src/qs8-vcvt/gen/qs8-vcvt-avx2-u32.c
+// - src/qs8-vcvt/gen/qs8-vcvt-scalar-u1.c
+// - src/qs8-vcvt/gen/qs8-vcvt-scalar-u4.c
+// - src/qs8-vcvt/gen/qs8-vcvt-sse2-u32.c
+// - src/qs8-vcvt/gen/qs8-vcvt-sse41-u32.c
+// - src/qs8-vcvt/gen/qs8-vcvt-ssse3-u32.c
+// - src/qs8-vlrelu/gen/qs8-vlrelu-avx-u32.c
+// - src/qs8-vlrelu/gen/qs8-vlrelu-avx2-u32.c
+// - src/qs8-vlrelu/gen/qs8-vlrelu-scalar-andxor-u4.c
+// - src/qs8-vlrelu/gen/qs8-vlrelu-scalar-select-u4.c
+// - src/qs8-vlrelu/gen/qs8-vlrelu-sse2-u32.c
+// - src/qs8-vlrelu/gen/qs8-vlrelu-sse41-u32.c
+// - src/qs8-vlrelu/gen/qs8-vlrelu-ssse3-u32.c
+// - src/qs8-vmul/gen/qs8-vmul-minmax-fp32-avx-mul16-ld64-u16.c
+// - src/qs8-vmul/gen/qs8-vmul-minmax-fp32-scalar-u4.c
+// - src/qs8-vmul/gen/qs8-vmul-minmax-fp32-sse2-mul16-ld64-u8.c
+// - src/qs8-vmul/gen/qs8-vmul-minmax-fp32-sse41-mul16-ld64-u16.c
+// - src/qs8-vmulc/gen/qs8-vmulc-minmax-fp32-avx-mul16-ld64-u16.c
+// - src/qs8-vmulc/gen/qs8-vmulc-minmax-fp32-scalar-u4.c
+// - src/qs8-vmulc/gen/qs8-vmulc-minmax-fp32-sse2-mul16-ld64-u8.c
+// - src/qs8-vmulc/gen/qs8-vmulc-minmax-fp32-sse41-mul16-ld64-u16.c
+// - src/qu8-avgpool/qu8-avgpool-9p8x-minmax-fp32-scalar-imagic-c1.c
+// - src/qu8-avgpool/qu8-avgpool-9p8x-minmax-fp32-sse2-c8.c
+// - src/qu8-avgpool/qu8-avgpool-9x-minmax-fp32-scalar-imagic-c1.c
+// - src/qu8-avgpool/qu8-avgpool-9x-minmax-fp32-sse2-c8.c
+// - src/qu8-dwconv/gen/qu8-dwconv-25p16c-minmax-fp32-avx-mul16.c
+// - src/qu8-dwconv/gen/qu8-dwconv-25p16c-minmax-fp32-avx2-mul32.c
+// - src/qu8-dwconv/gen/qu8-dwconv-25p1c-minmax-fp32-scalar-fmagic.c
+// - src/qu8-dwconv/gen/qu8-dwconv-25p1c-minmax-fp32-scalar-imagic.c
+// - src/qu8-dwconv/gen/qu8-dwconv-25p2c-minmax-fp32-scalar-lrintf.c
 // - src/qu8-dwconv/gen/qu8-dwconv-25p32c-minmax-fp32-avx512skx-mul32.c
+// - src/qu8-dwconv/gen/qu8-dwconv-25p8c-minmax-fp32-sse2-mul16.c
+// - src/qu8-dwconv/gen/qu8-dwconv-25p8c-minmax-fp32-sse41-mul16.c
+// - src/qu8-dwconv/gen/qu8-dwconv-9p16c-minmax-fp32-avx-mul16.c
+// - src/qu8-dwconv/gen/qu8-dwconv-9p16c-minmax-fp32-avx2-mul32.c
+// - src/qu8-dwconv/gen/qu8-dwconv-9p1c-minmax-fp32-scalar-fmagic.c
+// - src/qu8-dwconv/gen/qu8-dwconv-9p2c-minmax-fp32-scalar-imagic.c
+// - src/qu8-dwconv/gen/qu8-dwconv-9p2c-minmax-fp32-scalar-lrintf.c
+// - src/qu8-dwconv/gen/qu8-dwconv-9p32c-minmax-fp32-avx512skx-mul32.c
+// - src/qu8-dwconv/gen/qu8-dwconv-9p8c-minmax-fp32-sse2-mul16.c
+// - src/qu8-dwconv/gen/qu8-dwconv-9p8c-minmax-fp32-sse41-mul16.c
+// - src/qu8-f32-vcvt/gen/qu8-f32-vcvt-avx-u32.c
+// - src/qu8-f32-vcvt/gen/qu8-f32-vcvt-avx2-u16.c
 // - src/qu8-f32-vcvt/gen/qu8-f32-vcvt-avx512skx-u32.c
+// - src/qu8-f32-vcvt/gen/qu8-f32-vcvt-scalar-u1.c
+// - src/qu8-f32-vcvt/gen/qu8-f32-vcvt-scalar-u4.c
+// - src/qu8-f32-vcvt/gen/qu8-f32-vcvt-sse2-u32.c
+// - src/qu8-f32-vcvt/gen/qu8-f32-vcvt-sse41-u16.c
+// - src/qu8-gavgpool/gen/qu8-gavgpool-7p7x-minmax-fp32-scalar-imagic-c1.c
+// - src/qu8-gavgpool/gen/qu8-gavgpool-7p7x-minmax-fp32-scalar-imagic-c4.c
+// - src/qu8-gavgpool/gen/qu8-gavgpool-7p7x-minmax-fp32-sse2-c8.c
+// - src/qu8-gavgpool/gen/qu8-gavgpool-7p7x-minmax-fp32-sse41-c8.c
+// - src/qu8-gavgpool/gen/qu8-gavgpool-7x-minmax-fp32-scalar-imagic-c1.c
+// - src/qu8-gavgpool/gen/qu8-gavgpool-7x-minmax-fp32-scalar-imagic-c4.c
+// - src/qu8-gavgpool/gen/qu8-gavgpool-7x-minmax-fp32-sse2-c8.c
+// - src/qu8-gavgpool/gen/qu8-gavgpool-7x-minmax-fp32-sse41-c8.c
 // - src/qu8-gemm/gen/qu8-gemm-1x16c8-minmax-fp32-avx512skx-prfm.c
+// - src/qu8-gemm/gen/qu8-gemm-1x2-minmax-fp32-scalar-imagic.c
+// - src/qu8-gemm/gen/qu8-gemm-1x4-minmax-fp32-scalar-lrintf.c
+// - src/qu8-gemm/gen/qu8-gemm-1x4c8-minmax-fp32-avx-ld128.c
+// - src/qu8-gemm/gen/qu8-gemm-1x4c8-minmax-fp32-sse2-ld64.c
+// - src/qu8-gemm/gen/qu8-gemm-1x4c8-minmax-fp32-sse41-ld64.c
+// - src/qu8-gemm/gen/qu8-gemm-1x8c8-minmax-fp32-avx2.c
+// - src/qu8-gemm/gen/qu8-gemm-2x2-minmax-fp32-scalar-imagic.c
+// - src/qu8-gemm/gen/qu8-gemm-2x4c8-minmax-fp32-avx-ld128.c
+// - src/qu8-gemm/gen/qu8-gemm-3x4-minmax-fp32-scalar-lrintf.c
+// - src/qu8-gemm/gen/qu8-gemm-3x4c8-minmax-fp32-sse2-ld64.c
+// - src/qu8-gemm/gen/qu8-gemm-3x4c8-minmax-fp32-sse41-ld64.c
+// - src/qu8-gemm/gen/qu8-gemm-3x8c8-minmax-fp32-avx2.c
 // - src/qu8-gemm/gen/qu8-gemm-7x16c8-minmax-fp32-avx512skx-prfm.c
 // - src/qu8-igemm/gen/qu8-igemm-1x16c8-minmax-fp32-avx512skx-prfm.c
+// - src/qu8-igemm/gen/qu8-igemm-1x2-minmax-fp32-scalar-imagic.c
+// - src/qu8-igemm/gen/qu8-igemm-1x4-minmax-fp32-scalar-lrintf.c
+// - src/qu8-igemm/gen/qu8-igemm-1x4c8-minmax-fp32-avx-ld128.c
+// - src/qu8-igemm/gen/qu8-igemm-1x4c8-minmax-fp32-sse2-ld64.c
+// - src/qu8-igemm/gen/qu8-igemm-1x4c8-minmax-fp32-sse41-ld64.c
+// - src/qu8-igemm/gen/qu8-igemm-1x8c8-minmax-fp32-avx2.c
+// - src/qu8-igemm/gen/qu8-igemm-2x2-minmax-fp32-scalar-imagic.c
+// - src/qu8-igemm/gen/qu8-igemm-2x4c8-minmax-fp32-avx-ld128.c
+// - src/qu8-igemm/gen/qu8-igemm-3x4-minmax-fp32-scalar-lrintf.c
+// - src/qu8-igemm/gen/qu8-igemm-3x4c8-minmax-fp32-sse2-ld64.c
+// - src/qu8-igemm/gen/qu8-igemm-3x4c8-minmax-fp32-sse41-ld64.c
+// - src/qu8-igemm/gen/qu8-igemm-3x8c8-minmax-fp32-avx2.c
 // - src/qu8-igemm/gen/qu8-igemm-7x16c8-minmax-fp32-avx512skx-prfm.c
+// - src/qu8-rdsum/gen/qu8-rdsum-7p7x-ssse3-c64.c
+// - src/qu8-rdsum/gen/qu8-rdsum-scalar.c
+// - src/qu8-rsum/gen/qu8-rsum-avx2-u64-acc2.c
+// - src/qu8-rsum/gen/qu8-rsum-scalar-u4.c
+// - src/qu8-rsum/gen/qu8-rsum-sse2-u32-acc2.c
+// - src/qu8-vadd/gen/qu8-vadd-minmax-avx-mul32-ld32-u8.c
+// - src/qu8-vadd/gen/qu8-vadd-minmax-avx2-mul32-ld64-u16.c
 // - src/qu8-vadd/gen/qu8-vadd-minmax-avx512skx-mul32-ld128-u16.c
+// - src/qu8-vadd/gen/qu8-vadd-minmax-scalar-u1.c
+// - src/qu8-vadd/gen/qu8-vadd-minmax-scalar-u4.c
+// - src/qu8-vadd/gen/qu8-vadd-minmax-sse2-mul16-ld64-u8.c
+// - src/qu8-vadd/gen/qu8-vadd-minmax-sse41-mul16-ld64-u8.c
+// - src/qu8-vaddc/gen/qu8-vaddc-minmax-avx-mul32-ld32-u8.c
+// - src/qu8-vaddc/gen/qu8-vaddc-minmax-avx2-mul32-ld64-u16.c
 // - src/qu8-vaddc/gen/qu8-vaddc-minmax-avx512skx-mul32-ld128-u16.c
+// - src/qu8-vaddc/gen/qu8-vaddc-minmax-scalar-u1.c
+// - src/qu8-vaddc/gen/qu8-vaddc-minmax-scalar-u4.c
+// - src/qu8-vaddc/gen/qu8-vaddc-minmax-sse2-mul16-ld64-u8.c
+// - src/qu8-vaddc/gen/qu8-vaddc-minmax-sse41-mul16-ld64-u8.c
+// - src/qu8-vcvt/gen/qu8-vcvt-avx-u32.c
+// - src/qu8-vcvt/gen/qu8-vcvt-avx2-u32.c
+// - src/qu8-vcvt/gen/qu8-vcvt-scalar-u1.c
+// - src/qu8-vcvt/gen/qu8-vcvt-scalar-u4.c
+// - src/qu8-vcvt/gen/qu8-vcvt-sse2-u32.c
+// - src/qu8-vcvt/gen/qu8-vcvt-sse41-u32.c
+// - src/qu8-vcvt/gen/qu8-vcvt-ssse3-u32.c
+// - src/qu8-vlrelu/gen/qu8-vlrelu-avx-u32.c
+// - src/qu8-vlrelu/gen/qu8-vlrelu-avx2-u32.c
+// - src/qu8-vlrelu/gen/qu8-vlrelu-scalar-andxor-u4.c
+// - src/qu8-vlrelu/gen/qu8-vlrelu-scalar-select-u4.c
+// - src/qu8-vlrelu/gen/qu8-vlrelu-sse2-u32.c
+// - src/qu8-vlrelu/gen/qu8-vlrelu-sse41-u32.c
+// - src/qu8-vlrelu/gen/qu8-vlrelu-ssse3-u32.c
+// - src/qu8-vmul/gen/qu8-vmul-minmax-fp32-avx-mul16-ld64-u16.c
+// - src/qu8-vmul/gen/qu8-vmul-minmax-fp32-scalar-u4.c
+// - src/qu8-vmul/gen/qu8-vmul-minmax-fp32-sse2-mul16-ld64-u8.c
+// - src/qu8-vmul/gen/qu8-vmul-minmax-fp32-sse41-mul16-ld64-u16.c
+// - src/qu8-vmulc/gen/qu8-vmulc-minmax-fp32-avx-mul16-ld64-u16.c
+// - src/qu8-vmulc/gen/qu8-vmulc-minmax-fp32-scalar-u4.c
+// - src/qu8-vmulc/gen/qu8-vmulc-minmax-fp32-sse2-mul16-ld64-u8.c
+// - src/qu8-vmulc/gen/qu8-vmulc-minmax-fp32-sse41-mul16-ld64-u16.c
+// - src/s32-f32-vcvt/gen/s32-f32-vcvt-avx2.c
+// - src/s32-f32-vcvt/gen/s32-f32-vcvt-avx512f.c
+// - src/s32-f32-vcvt/gen/s32-f32-vcvt-scalar.c
+// - src/s32-vmul/gen/s32-vmul-avx2.c
+// - src/s32-vmul/gen/s32-vmul-avx512f.c
+// - src/s32-vmul/gen/s32-vmul-scalar.c
+// - src/s32-vmul/gen/s32-vmul-sse41.c
+// - src/s32-vmul/gen/s32-vmulc-avx2.c
+// - src/s32-vmul/gen/s32-vmulc-avx512f.c
+// - src/s32-vmul/gen/s32-vmulc-scalar.c
+// - src/s32-vmul/gen/s32-vmulc-sse41.c
+// - src/s8-ibilinear/gen/s8-ibilinear-scalar-c1.c
+// - src/s8-ibilinear/gen/s8-ibilinear-sse2-c8.c
+// - src/s8-ibilinear/gen/s8-ibilinear-sse41-c16.c
+// - src/s8-maxpool/s8-maxpool-9p8x-minmax-scalar-c1.c
+// - src/s8-maxpool/s8-maxpool-9p8x-minmax-sse2-c16.c
+// - src/s8-maxpool/s8-maxpool-9p8x-minmax-sse41-c16.c
+// - src/s8-vclamp/s8-vclamp-scalar-u4.c
+// - src/s8-vclamp/s8-vclamp-sse2-u64.c
+// - src/s8-vclamp/s8-vclamp-sse41-u64.c
+// - src/tables/exp2-k-over-2048.c
+// - src/tables/exp2-k-over-64.c
+// - src/tables/exp2minus-k-over-16.c
+// - src/tables/exp2minus-k-over-2048.c
+// - src/tables/exp2minus-k-over-32.c
+// - src/tables/exp2minus-k-over-4.c
+// - src/tables/exp2minus-k-over-64.c
+// - src/tables/exp2minus-k-over-8.c
+// - src/tables/vlog.c
+// - src/u32-f32-vcvt/gen/u32-f32-vcvt-avx2.c
+// - src/u32-f32-vcvt/gen/u32-f32-vcvt-avx512f.c
+// - src/u32-f32-vcvt/gen/u32-f32-vcvt-scalar.c
+// - src/u8-ibilinear/gen/u8-ibilinear-scalar-c1.c
+// - src/u8-ibilinear/gen/u8-ibilinear-sse2-c8.c
+// - src/u8-ibilinear/gen/u8-ibilinear-sse41-c16.c
+// - src/u8-lut32norm/u8-lut32norm-scalar.c
+// - src/u8-maxpool/u8-maxpool-9p8x-minmax-scalar-c1.c
+// - src/u8-maxpool/u8-maxpool-9p8x-minmax-sse2-c16.c
+// - src/u8-rmax/u8-rmax-scalar-u2.c
+// - src/u8-rmax/u8-rmax-sse2-u16.c
+// - src/u8-vclamp/u8-vclamp-scalar-u4.c
+// - src/u8-vclamp/u8-vclamp-sse2-u64.c
+// - src/x16-packw/gen/x16-packw-x16-gemm-goi-avx2-u16-prfm.c
+// - src/x16-packw/gen/x16-packw-x64-gemm-goi-scalar-int-u4.c
+// - src/x16-transposec/gen/x16-transposec-16x16-reuse-switch-avx2.c
+// - src/x16-transposec/gen/x16-transposec-2x4-scalar-int.c
+// - src/x16-transposec/gen/x16-transposec-8x8-reuse-multi-sse2.c
+// - src/x24-transposec/gen/x24-transposec-1x2-scalar.c
+// - src/x24-transposec/x24-transposec-4x4-ssse3.c
+// - src/x32-packw/gen/x32-packw-x16-gemm-goi-avx-u4.c
+// - src/x32-packw/gen/x32-packw-x16-gemm-goi-avx512f-u4-prfm.c
+// - src/x32-packw/gen/x32-packw-x16s4-gemm-goi-avx-u4.c
+// - src/x32-packw/gen/x32-packw-x2-gemm-goi-scalar-float-u4.c
+// - src/x32-packw/gen/x32-packw-x2c4-gemm-goi-sse2-u4.c
+// - src/x32-packw/gen/x32-packw-x4-gemm-goi-scalar-float-u4.c
+// - src/x32-packw/gen/x32-packw-x8-gemm-goi-sse2-u4.c
+// - src/x32-transposec/gen/x32-transposec-2x4-scalar-int.c
+// - src/x32-transposec/gen/x32-transposec-8x8-reuse-multi-avx.c
+// - src/x32-transposec/x32-transposec-4x4-sse.c
+// - src/x32-unpool/x32-unpool-scalar.c
+// - src/x32-unpool/x32-unpool-sse2.c
+// - src/x32-zip/x32-zip-x2-scalar.c
+// - src/x32-zip/x32-zip-x2-sse2.c
+// - src/x32-zip/x32-zip-x3-scalar.c
+// - src/x32-zip/x32-zip-x3-sse2.c
+// - src/x32-zip/x32-zip-x4-scalar.c
+// - src/x32-zip/x32-zip-x4-sse2.c
+// - src/x32-zip/x32-zip-xm-scalar.c
+// - src/x32-zip/x32-zip-xm-sse2.c
+// - src/x64-transposec/gen/x64-transposec-2x2-multi-mov-sse2.c
+// - src/x64-transposec/gen/x64-transposec-4x2-scalar-int.c
+// - src/x64-transposec/gen/x64-transposec-4x4-reuse-multi-avx.c
+// - src/x8-lut/gen/x8-lut-avx-u64.c
+// - src/x8-lut/gen/x8-lut-avx2-u128.c
 // - src/x8-lut/gen/x8-lut-avx512skx-vpshufb-u64.c
-// - src/f32-raddstoreexpminusmax/gen/f32-raddstoreexpminusmax-avx256skx-rr2-p5-u32-acc2.c
-// - src/qd8-f16-qc4w-gemm/gen/qd8-f16-qc4w-gemm-1x8c8-minmax-avx256skx-madd-prfm.c
-// - src/qd8-f16-qc4w-gemm/gen/qd8-f16-qc4w-gemm-8x8c8-minmax-avx256skx-madd-prfm.c
-// - src/qd8-f16-qc8w-gemm/gen/qd8-f16-qc8w-gemm-1x8c8-minmax-avx256skx.c
-// - src/qd8-f16-qc8w-gemm/gen/qd8-f16-qc8w-gemm-5x8c8-minmax-avx256skx.c
-// - src/qd8-f16-qc8w-igemm/gen/qd8-f16-qc8w-igemm-1x8c8-minmax-avx256skx.c
-// - src/qd8-f16-qc8w-igemm/gen/qd8-f16-qc8w-igemm-5x8c8-minmax-avx256skx.c
-// - src/qd8-f32-qc4w-gemm/gen/qd8-f32-qc4w-gemm-1x8c8-minmax-avx256skx-madd-prfm.c
-// - src/qd8-f32-qc4w-gemm/gen/qd8-f32-qc4w-gemm-8x8c8-minmax-avx256skx-madd-prfm.c
-// - src/qd8-f32-qc8w-gemm/gen/qd8-f32-qc8w-gemm-1x8c8-minmax-avx256skx.c
-// - src/qd8-f32-qc8w-gemm/gen/qd8-f32-qc8w-gemm-8x8c8-minmax-avx256skx.c
-// - src/qd8-f32-qc8w-igemm/gen/qd8-f32-qc8w-igemm-1x8c8-minmax-avx256skx.c
-// - src/qd8-f32-qc8w-igemm/gen/qd8-f32-qc8w-igemm-8x8c8-minmax-avx256skx.c
-// - src/qs8-qc8w-gemm/gen/qs8-qc8w-gemm-1x8c8-minmax-fp32-avx256skx.c
-// - src/qs8-qc8w-gemm/gen/qs8-qc8w-gemm-4x8c8-minmax-fp32-avx256skx.c
-// - src/qs8-qc8w-igemm/gen/qs8-qc8w-igemm-1x8c8-minmax-fp32-avx256skx.c
-// - src/qs8-qc8w-igemm/gen/qs8-qc8w-igemm-4x8c8-minmax-fp32-avx256skx.c
-// - src/qs8-rsum/gen/qs8-rsum-avx256skx-u64-acc2.c
 // - src/x8-lut/gen/x8-lut-avx512vbmi-vpermx2b-u128.c
-// - src/qd8-f32-qb4w-gemm/gen/qd8-f32-qb4w-gemm-1x16c8-minmax-avx512vnni-prfm.c
-// - src/qd8-f32-qb4w-gemm/gen/qd8-f32-qb4w-gemm-8x16c8-minmax-avx512vnni-prfm.c
-// - src/qd8-f32-qc4w-gemm/gen/qd8-f32-qc4w-gemm-1x16c8-minmax-avx512vnni-prfm.c
-// - src/qd8-f32-qc4w-gemm/gen/qd8-f32-qc4w-gemm-8x16c8-minmax-avx512vnni-prfm.c
-// - src/qd8-f32-qc8w-gemm/gen/qd8-f32-qc8w-gemm-1x16c8-minmax-avx512vnni-prfm.c
-// - src/qd8-f32-qc8w-gemm/gen/qd8-f32-qc8w-gemm-10x16c8-minmax-avx512vnni-prfm.c
-// - src/qd8-f32-qc8w-igemm/gen/qd8-f32-qc8w-igemm-1x16c8-minmax-avx512vnni-prfm.c
-// - src/qd8-f32-qc8w-igemm/gen/qd8-f32-qc8w-igemm-10x16c8-minmax-avx512vnni-prfm.c
-// - src/qs8-qc8w-gemm/gen/qs8-qc8w-gemm-1x16c8-minmax-fp32-avx512vnni-prfm.c
-// - src/qs8-qc8w-gemm/gen/qs8-qc8w-gemm-7x16c8-minmax-fp32-avx512vnni-prfm.c
-// - src/qs8-qc8w-igemm/gen/qs8-qc8w-igemm-1x16c8-minmax-avx512vnni-prfm.c
-// - src/qs8-qc8w-igemm/gen/qs8-qc8w-igemm-7x16c8-minmax-avx512vnni-prfm.c
-// - src/qs8-rsum/gen/qs8-rsum-avx512vnni-u128-acc2.c
-// - src/qd8-f16-qc4w-gemm/gen/qd8-f16-qc4w-gemm-1x8c8-minmax-avx256vnni.c
-// - src/qd8-f16-qc4w-gemm/gen/qd8-f16-qc4w-gemm-8x8c8-minmax-avx256vnni.c
-// - src/qd8-f16-qc8w-gemm/gen/qd8-f16-qc8w-gemm-1x8c8-minmax-avx256vnni.c
-// - src/qd8-f16-qc8w-gemm/gen/qd8-f16-qc8w-gemm-8x8c8-minmax-avx256vnni.c
-// - src/qd8-f16-qc8w-igemm/gen/qd8-f16-qc8w-igemm-1x8c8-minmax-avx256vnni.c
-// - src/qd8-f16-qc8w-igemm/gen/qd8-f16-qc8w-igemm-8x8c8-minmax-avx256vnni.c
-// - src/qd8-f32-qb4w-gemm/gen/qd8-f32-qb4w-gemm-1x16c8-minmax-avx512vnnigfni-prfm.c
-// - src/qd8-f32-qb4w-gemm/gen/qd8-f32-qb4w-gemm-14x16c8-minmax-avx512vnnigfni-prfm.c
-// - src/qd8-f32-qc4w-gemm/gen/qd8-f32-qc4w-gemm-1x16c8-minmax-avx512vnnigfni-prfm.c
-// - src/qd8-f32-qc4w-gemm/gen/qd8-f32-qc4w-gemm-14x16c8-minmax-avx512vnnigfni-prfm.c
-// - src/qd8-f16-qc8w-gemm/gen/qd8-f16-qc8w-gemm-1x64c4-minmax-avx512amx.c
-// - src/qd8-f16-qc8w-gemm/gen/qd8-f16-qc8w-gemm-16x64c4-minmax-avx512amx.c
-// - src/qd8-f16-qc8w-igemm/gen/qd8-f16-qc8w-igemm-1x64c4-minmax-avx512amx.c
-// - src/qd8-f16-qc8w-igemm/gen/qd8-f16-qc8w-igemm-16x64c4-minmax-avx512amx.c
-// - src/qd8-f32-qc4w-gemm/gen/qd8-f32-qc4w-gemm-1x64c4-minmax-avx512amx.c
-// - src/qd8-f32-qc4w-gemm/gen/qd8-f32-qc4w-gemm-16x64c4-minmax-avx512amx.c
-// - src/qd8-f32-qc8w-gemm/gen/qd8-f32-qc8w-gemm-1x64c4-minmax-avx512amx.c
-// - src/qd8-f32-qc8w-gemm/gen/qd8-f32-qc8w-gemm-16x64c4-minmax-avx512amx.c
-// - src/qd8-f32-qc8w-igemm/gen/qd8-f32-qc8w-igemm-1x64c4-minmax-avx512amx.c
-// - src/qd8-f32-qc8w-igemm/gen/qd8-f32-qc8w-igemm-16x64c4-minmax-avx512amx.c
-// - src/qs8-qc8w-gemm/gen/qs8-qc8w-gemm-1x64c4-minmax-fp32-avx512amx.c
-// - src/qs8-qc8w-gemm/gen/qs8-qc8w-gemm-16x64c4-minmax-fp32-avx512amx.c
-// - src/qs8-qc8w-igemm/gen/qs8-qc8w-igemm-1x64c4-minmax-fp32-avx512amx.c
-// - src/qs8-qc8w-igemm/gen/qs8-qc8w-igemm-16x64c4-minmax-fp32-avx512amx.c
-// - src/f16-gemm/gen/f16-gemm-1x64-minmax-avx512fp16-broadcast.c
-// - src/f16-gemm/gen/f16-gemm-7x64-minmax-avx512fp16-broadcast.c
-// - src/f16-igemm/gen/f16-igemm-1x64-minmax-avx512fp16-broadcast.c
-// - src/f16-igemm/gen/f16-igemm-7x64-minmax-avx512fp16-broadcast.c
-// - src/f16-rminmax/gen/f16-rmax-avx512fp16-u128-acc4.c
-// - src/f16-rminmax/gen/f16-rminmax-avx512fp16-u128-acc4.c
-// - src/f16-vbinary/gen/f16-vadd-avx512fp16-u64.c
-// - src/f16-vbinary/gen/f16-vaddc-avx512fp16-u64.c
-// - src/f16-vbinary/gen/f16-vdiv-avx512fp16-u64.c
-// - src/f16-vbinary/gen/f16-vdivc-avx512fp16-u64.c
-// - src/f16-vbinary/gen/f16-vmax-avx512fp16-u64.c
-// - src/f16-vbinary/gen/f16-vmaxc-avx512fp16-u64.c
-// - src/f16-vbinary/gen/f16-vmin-avx512fp16-u64.c
-// - src/f16-vbinary/gen/f16-vminc-avx512fp16-u64.c
-// - src/f16-vbinary/gen/f16-vmul-avx512fp16-u64.c
-// - src/f16-vbinary/gen/f16-vmulc-avx512fp16-u64.c
-// - src/f16-vbinary/gen/f16-vrdivc-avx512fp16-u64.c
-// - src/f16-vbinary/gen/f16-vrsubc-avx512fp16-u64.c
-// - src/f16-vbinary/gen/f16-vsqrdiff-avx512fp16-u64.c
-// - src/f16-vbinary/gen/f16-vsqrdiffc-avx512fp16-u64.c
-// - src/f16-vbinary/gen/f16-vsub-avx512fp16-u64.c
-// - src/f16-vbinary/gen/f16-vsubc-avx512fp16-u64.c
+// - src/x8-lut/gen/x8-lut-scalar-u4.c
+// - src/x8-packq/x8-packq-scalar-f32qp8-u1.c
+// - src/x8-packw/gen/x8-packw-x16-gemm-goi-scalar-u2.c
+// - src/x8-packw/gen/x8-packw-x32-gemm-goi-scalar-u2.c
+// - src/x8-packw/gen/x8-packw-x4-gemm-goi-scalar-u2.c
+// - src/x8-packw/gen/x8-packw-x8-gemm-goi-scalar-u2.c
+// - src/x8-transposec/gen/x8-transposec-16x16-reuse-mov-sse2.c
+// - src/x8-transposec/gen/x8-transposec-2x4-scalar-int.c
+// - src/x8-transposec/gen/x8-transposec-32x32-reuse-switch-avx2.c
+// - src/x8-zip/x8-zip-x2-scalar.c
+// - src/x8-zip/x8-zip-x2-sse2.c
+// - src/x8-zip/x8-zip-x3-scalar.c
+// - src/x8-zip/x8-zip-x3-sse2.c
+// - src/x8-zip/x8-zip-x4-scalar.c
+// - src/x8-zip/x8-zip-x4-sse2.c
+// - src/x8-zip/x8-zip-xm-scalar.c
+// - src/x8-zip/x8-zip-xm-sse2.c
+// - src/xx-copy/xx-copy-scalar-memcpy.c
+// - src/xx-fill/xx-fill-scalar-u16.c
+// - src/xx-fill/xx-fill-sse2-u64.c
+// - src/xx-pad/xx-pad-p16-sse2-u16.c
+// - src/xx-pad/xx-pad-p4-scalar-u16.c
+// - src/xx-transposev/xx-transposev-1x1-scalar-memcpy.c
 
 #include <stdbool.h>
 #include <stdint.h>
@@ -941,10 +945,10 @@
 #include <string.h>
 
 static const uint8_t xnn_build_identifier[] = {
-   26, 200,  95,  74, 177, 251,   1, 176,
-  100, 208,  41, 128,  56, 244,  93,  38,
-  126,  33, 176,   0,  27, 165,  71, 157,
-  235, 115,  91, 122, 180, 231,  78, 202
+  247,  90,  76, 115, 211, 211,  92,  31,
+  127, 224, 149, 140,  61, 105,  88, 193,
+  108,  38, 248, 118, 196, 127,  84, 227,
+   16,  82, 191,  61,  98,  97, 221,   2
 };
 
 size_t xnn_experimental_get_build_identifier_size() {
diff --git a/third_party/xnnpack/src b/third_party/xnnpack/src
index 14ce5c4..d5d572e 160000
--- a/third_party/xnnpack/src
+++ b/third_party/xnnpack/src
@@ -1 +1 @@
-Subproject commit 14ce5c47ebf2ff79e3dc2f1d319ad7b1793e1b21
+Subproject commit d5d572e46ed3929fa3e67f6174192893943cf724
diff --git a/tools/gritsettings/resource_ids.spec b/tools/gritsettings/resource_ids.spec
index ad2eadf..4d19f869 100644
--- a/tools/gritsettings/resource_ids.spec
+++ b/tools/gritsettings/resource_ids.spec
@@ -91,14 +91,14 @@
   # END chrome/app section.
 
   # START chrome/browser section.
-  "chrome/browser/dev_ui_browser_resources.grd": {
+  "chrome/browser/browser_resources.grd": {
     # Big alignment at start of section.
     "META": {"align": 100},
     "includes": [2200],
+    "structures": [2220],
   },
-  "chrome/browser/browser_resources.grd": {
-    "includes": [2220],
-    "structures": [2240],
+  "chrome/browser/dev_ui_browser_resources.grd": {
+    "includes": [2240],
   },
   "chrome/browser/nearby_sharing/internal/nearby_share_internal_icons.grd": {
     "includes": [2260],
@@ -113,630 +113,536 @@
   "chrome/browser/recent_tabs/internal/android/java/strings/android_restore_tabs_strings.grd": {
     "messages": [2340],
   },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/accessibility/resources.grd": {
-    "META": {"sizes": {"includes": [10],}},
-    "includes": [2360],
+  "chrome/browser/resources/app_icon/app_icon_resources.grd": {
+    "structures": [2360],
   },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/feedback/resources.grd": {
-    "META": {"sizes": {"includes": [30],}},
-    "includes": [2380],
+  "chrome/browser/resources/chromeos/app_icon/app_icon_resources.grd": {
+    "structures": [2380],
   },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/feed_internals/resources.grd": {
-    "META": {"sizes": {"includes": [10],}},
-    "includes": [2400],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/app_service_internals/resources.grd": {
-    "META": {"sizes": {"includes": [5],}},
-    "includes": [2420],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/bookmarks/resources.grd": {
-    "META": {"sizes": {"includes": [50],}},
-    "includes": [2440],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/browser_switch/resources.grd": {
-    "META": {"sizes": {"includes": [10],}},
-    "includes": [2460],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/certificate_viewer/resources.grd": {
-    "META": {"sizes": {"includes": [5],}},
-    "includes": [2480],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/add_supervision/resources.grd": {
-    "META": {"sizes": {"includes": [10],}},
-    "includes": [2500],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/app_install/resources.grd": {
-    "META": {"sizes": {"includes": [5]}},
-    "includes": [2520],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/arc_account_picker/resources.grd": {
-    "META": {"sizes": {"includes": [10],}},
-    "includes": [2540],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/assistant_optin/assistant_optin_resources.grd": {
-    "META": {"sizes": {"includes": [80]}},
-    "includes": [2560],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/cloud_upload/resources.grd": {
-    "META": {"sizes": {"includes": [50]}},
-    "includes": [2580],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/desk_api/resources.grd": {
-    "META": {"sizes": {"includes": [10],}},
-    "includes": [2600],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/edu_coexistence/resources.grd": {
-    "META": {"sizes": {"includes": [20],}},
-    "includes": [2620],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/gaia_action_buttons/resources.grd": {
-    "META": {"sizes": {"includes": [10],}},
-    "includes": [2640],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/emoji_picker/resources.grd": {
-    "META": {"sizes": {"includes": [60]}},
-    "includes": [2660],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/kerberos/resources.grd": {
-    "META": {"sizes": {"includes": [5],}},
-    "includes": [2680],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/launcher_internals/resources.grd": {
-    "META": {"sizes": {"includes": [50]}},
-    "includes": [2700],
-  },
-   "chrome/browser/resources/chromeos/mako/resources.grd": {
+  "chrome/browser/resources/chromeos/mako/resources.grd": {
     "META": {"sizes": {"includes": [150]}},
-    "includes": [2720],
+    "includes": [2400],
   },
   "chrome/browser/resources/chromeos/seal/resources.grd": {
     "META": {"sizes": {"includes": [50]}},
-    "includes": [2740],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/parent_access/resources.grd": {
-    "META": {"sizes": {"includes": [50],}},
-    "includes": [2760],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/remote_maintenance_curtain/resources.grd": {
-    "META": {"sizes": {"includes": [10]}},
-    "includes": [2780],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/sensor_info/resources.grd": {
-    "META": {"sizes": {"includes": [50]}},
-    "includes": [2800],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/supervision/resources.grd": {
-    "META": {"sizes": {"includes": [10],}},
-    "includes": [2820],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/predictors/resources.grd": {
-    "META": {"sizes": {"includes": [5],}},
-    "includes": [2840],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/profile_internals/resources.grd": {
-    "META": {"sizes": {"includes": [10],}},
-    "includes": [2860],
-  },
-  "chrome/browser/resources/app_icon/app_icon_resources.grd": {
-    "structures": [2880],
-  },
-  "chrome/browser/resources/chromeos/app_icon/app_icon_resources.grd": {
-    "structures": [2900],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/login/resources.grd": {
-    "META": {"sizes": {"includes": [320],}},
-    "includes": [2920],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/lock_screen_reauth/resources.grd": {
-    "META": {"sizes": {"includes": [30]}},
-    "includes": [2940],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/multidevice_internals/resources.grd": {
-    "META": {"sizes": {"includes": [35]}},
-    "includes": [2960],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/multidevice_setup/multidevice_setup_resources.grd": {
-    "META": {"sizes": {"includes": [10]}},
-    "includes": [2980],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/notification_tester/resources.grd": {
-    "META": {"sizes": {"includes": [5]}},
-    "includes": [3000],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/password_change/resources.grd": {
-    "META": {"sizes": {"includes": [30]}},
-    "includes": [3020],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/vc_tray_tester/resources.grd": {
-    "META": {"sizes": {"includes": [5]}},
-    "includes": [3040],
+    "includes": [2420],
   },
   "chrome/browser/resources/component_extension_resources.grd": {
-    "includes": [3060],
-    "structures": [3080],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/access_code_cast/resources.grd": {
-    "META": {"sizes": {"includes": [50]}},
-    "includes": [3100],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/commerce/product_specifications/resources.grd": {
-    "META": {"sizes": {"includes": [50]}},
-    "includes": [3120],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/compose/resources.grd": {
-    "META": {"sizes": {"includes": [15]}},
-    "includes": [3140],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/connectors_internals/resources.grd": {
-    "META": {"sizes": {"includes": [15]}},
-    "includes": [3160],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/data_sharing_internals/resources.grd": {
-    "META": {"sizes": {"includes": [5]}},
-    "includes": [3180],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/device_log/resources.grd": {
-    "META": {"sizes": {"includes": [5],}},
-    "includes": [3200],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/discards/resources.grd": {
-    "META": {"sizes": {"includes": [20],}},
-    "includes": [3220],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/dlp_internals/resources.grd": {
-    "META": {"sizes": {"includes": [15]}},
-    "includes": [3240],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/downloads/resources.grd": {
-    "META": {"sizes": {"includes": [50],}},
-    "includes": [3260],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/engagement/resources.grd": {
-    "META": {"sizes": {"includes": [5],}},
-    "includes": [3280],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/extensions/resources.grd": {
-    "META": {"sizes": {"includes": [120],}},
-    "includes": [3300],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/history/resources.grd": {
-    "META": {"sizes": {"includes": [40]}},
-    "includes": [3320],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/identity_internals/resources.grd": {
-    "META": {"sizes": {"includes": [10]}},
-    "includes": [3340],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/internals/resources.grd": {
-    "META": {"sizes": {"includes": [20]}},
-    "includes": [3360],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/intro/resources.grd": {
-    "META": {"sizes": {"includes": [20],}},
-    "includes": [3380],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/location_internals/resources.grd": {
-    "META": {"sizes": {"includes": [10],}},
-    "includes": [3400],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/management/resources.grd": {
-    "META": {"sizes": {"includes": [10]}},
-    "includes": [3420],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/memory_internals/resources.grd": {
-    "META": {"sizes": {"includes": [5]}},
-    "includes": [3440],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/new_tab_page_instant/resources.grd": {
-    "META": {"sizes": {"includes": [10]}},
-    "includes": [3460],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/nearby_internals/resources.grd": {
-    "META": {"sizes": {"includes": [40]}},
-    "includes": [3480],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/nearby_share/resources.grd": {
-    "META": {"sizes": {"includes": [100]}},
-    "includes": [3500],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/media_router/cast_feedback/resources.grd": {
-    "META": {"sizes": {"includes": [10],}},
-    "includes": [3520],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/media_router/internals/resources.grd": {
-    "META": {"sizes": {"includes": [10]}},
-    "includes": [3540],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/new_tab_page/resources.grd": {
-    "META": {"sizes": {"includes": [200]}},
-    "includes": [3560],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/new_tab_page_third_party/resources.grd": {
-    "META": {"sizes": {"includes": [10]}},
-    "includes": [3580],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/omnibox_popup/resources.grd": {
-    "META": {"sizes": {"includes": [50]}},
-    "includes": [3600],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/password_manager/resources.grd": {
-    "META": {"sizes": {"includes": [200]}},
-    "includes": [3620],
-  },
-  "chrome/browser/resources/preinstalled_web_apps/resources.grd": {
-    "includes": [3640],
+    "includes": [2440],
+    "structures": [2460],
   },
   "chrome/browser/resources/office_web_app/resources.grd": {
-    "includes": [3660],
+    "includes": [2480],
   },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/pdf/resources.grd": {
-    "META": {"sizes": {"includes": [200]}},
-    "includes": [3680],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/print_preview/resources.grd": {
-    "META": {"sizes": {"includes": [500],}},
-    "includes": [3700],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/privacy_sandbox/resources.grd": {
-    "META": {"sizes": {"includes": [50],}},
-    "includes": [3720],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/sandbox_internals/resources.grd": {
-    "META": {"sizes": {"includes": [5],}},
-    "includes": [3740],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/segmentation_internals/resources.grd": {
-    "META": {"sizes": {"includes": [10]}},
-    "includes": [3760],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/side_panel/bookmarks/resources.grd": {
-    "META": {"sizes": {"includes": [45],}},
-    "includes": [3780],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/side_panel/commerce/resources.grd": {
-    "META": {"sizes": {"includes": [20],}},
-    "includes": [3800],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/side_panel/companion/resources.grd": {
-    "META": {"sizes": {"includes": [10],}},
-    "includes": [3820],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/side_panel/customize_chrome/resources.grd": {
-    "META": {"sizes": {"includes": [80],}},
-    "includes": [3840],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/side_panel/history_clusters/resources.grd": {
-    "META": {"sizes": {"includes": [5],}},
-    "includes": [3860],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/side_panel/read_anything/resources.grd": {
-    "META": {"sizes": {"includes": [50],}},
-    "includes": [3880],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/side_panel/reading_list/resources.grd": {
-    "META": {"sizes": {"includes": [15],}},
-    "includes": [3900],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/side_panel/shared/resources.grd": {
-    "META": {"sizes": {"includes": [15],}},
-    "includes": [3920],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/ash/extended_updates/resources.grd": {
-    "META": {"sizes": {"includes": [20]}},
-    "includes": [3960],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/ash/inline_login/resources.grd": {
-    "META": {"sizes": {"includes": [20]}},
-    "includes": [3980],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/ash/settings/resources.grd": {
-    "META": {"sizes": {"includes": [1000],}},
-    "includes": [4000],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/search_engine_choice/resources.grd": {
-    "META": {"sizes": {"includes": [20]}},
-    "includes": [4020],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/settings/resources.grd": {
-    "META": {"sizes": {"includes": [500],}},
-    "includes": [4040],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/settings_shared/resources.grd": {
-    "META": {"sizes": {"includes": [50],}},
-    "includes": [4060],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/signin/batch_upload/resources.grd": {
-    "META": {"sizes": {"includes": [10]}},
-    "includes": [4070],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/signin/profile_picker/resources.grd": {
-    "META": {"sizes": {"includes": [50],}},
-    "includes": [4080],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/signin/resources.grd": {
-    "META": {"sizes": {"includes": [90],}},
-    "includes": [4100],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/support_tool/resources.grd": {
-    "META": {"sizes": {"includes": [30]}},
-    "includes": [4120],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/tab_search/resources.grd": {
-    "META": {"sizes": {"includes": [90]}},
-    "includes": [4140],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/tab_strip/resources.grd": {
-    "META": {"sizes": {"includes": [30]}},
-    "includes": [4160],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/welcome/resources.grd": {
-    "META": {"sizes": {"includes": [80]}},
-    "includes": [4180],
+  "chrome/browser/resources/preinstalled_web_apps/resources.grd": {
+    "includes": [2500],
   },
   "chrome/browser/test_dummy/internal/android/resources/resources.grd": {
-    "includes": [4200],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/webui_gallery/resources.grd": {
-    "META": {"sizes": {"includes": [90]}},
-    "includes": [4220],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/web_app_internals/resources.grd": {
-    "META": {"sizes": {"includes": [10]}},
-    "includes": [4240],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/whats_new/resources.grd": {
-    "META": {"sizes": {"includes": [10]}},
-    "includes": [4260],
+    "includes": [2520],
   },
   # END chrome/browser section.
 
   # START chrome/ WebUI resources section
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/browsing_topics/resources.grd": {
-    "META": {"sizes": {"includes": [10]}},
-    "includes": [4280],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/bluetooth_internals/resources.grd": {
-    "META": {"sizes": {"includes": [50],}},
-    "includes": [4300],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/audio/resources.grd": {
-    "META": {"sizes": {"includes": [30]}},
-    "includes": [4320],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/bluetooth_pairing_dialog/resources.grd": {
-    "META": {"sizes": {"includes": [10],}},
-    "includes": [4340],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/borealis_installer/resources.grd": {
-    "META": {"sizes": {"includes": [20],}},
-    "includes": [4360],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/healthd_internals/resources.grd": {
-    "META": {"sizes": {"includes": [50]}},
-    "includes": [4380],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/internet_config_dialog/resources.grd": {
-    "META": {"sizes": {"includes": [10],}},
-    "includes": [4400],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/internet_detail_dialog/resources.grd": {
-    "META": {"sizes": {"includes": [10],}},
-    "includes": [4420],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/network_ui/resources.grd": {
-    "META": {"sizes": {"includes": [20]}},
-    "includes": [4440],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/set_time_dialog/resources.grd": {
-    "META": {"sizes": {"includes": [5]}},
-    "includes": [4460],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/skyvault/resources.grd": {
-    "META": {"sizes": {"includes": [10]}},
-    "includes": [4470],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/components/commerce/core/internals/resources/resources.grd": {
-    "META": {"sizes": {"includes": [10]}},
-    "includes": [4480],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/components/flags_ui/resources/resources.grd": {
-    "META": {"sizes": {"includes": [10]}},
-    "includes": [4500],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/components/history_clusters/history_clusters_internals/resources/resources.grd": {
-    "META": {"sizes": {"includes": [10]}},
-    "includes": [4520],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/components/download/resources/download_internals/resources.grd": {
-    "META": {"sizes": {"includes": [10]}},
-    "includes": [4540],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/components/optimization_guide/optimization_guide_internals/resources/resources.grd": {
-    "META": {"sizes": {"includes": [10]}},
-    "includes": [4560],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/components/policy/resources/webui/resources.grd": {
-    "META": {"sizes": {"includes": [30]}},
-    "includes": [4580],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/components/version_ui/resources/resources.grd": {
-    "META": {"sizes": {"includes": [5]}},
-    "includes": [4600],
-  },
   "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/about_sys/resources.grd": {
-    "META": {"sizes": {"includes": [10]}},
-    "includes": [4620],
+    # Big alignment at start of section.
+    "META": {"align": 100, "sizes": {"includes": [10]}},
+    "includes": [2700],
   },
-  "<(SHARED_INTERMEDIATE_DIR)/components/ukm/debug/resources.grd": {
-    "META": {"sizes": {"includes": [5]}},
-    "includes": [4640],
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/access_code_cast/resources.grd": {
+    "META": {"sizes": {"includes": [50]}},
+    "includes": [2720],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/accessibility/resources.grd": {
+    "META": {"sizes": {"includes": [10],}},
+    "includes": [2740],
   },
   "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/app_home/resources.grd": {
     "META": {"sizes": {"includes": [20]}},
-    "includes": [4660],
+    "includes": [2760],
   },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/components/resources.grd": {
-    "META": {"sizes": {"includes": [5]}},
-    "includes": [4680],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/gaia_auth_host/resources.grd": {
-    "META": {"sizes": {"includes": [20],}},
-    "includes": [4700],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/invalidations/resources.grd": {
-    "META": {"sizes": {"includes": [10],}},
-    "includes": [4720],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/media/resources.grd": {
-    "META": {"sizes": {"includes": [20],}},
-    "includes": [4740],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/net_internals/resources.grd": {
-    "META": {"sizes": {"includes": [20]}},
-    "includes": [4760],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/omnibox/resources.grd": {
-    "META": {"sizes": {"includes": [30]}},
-    "includes": [4780],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/suggest_internals/resources.grd": {
-    "META": {"sizes": {"includes": [10]}},
-    "includes": [4800],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/quota_internals/quota_internals_resources.grd": {
-    "META": {"sizes": {"includes": [20]}},
-    "includes": [4820],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/usb_internals/resources.grd": {
-    "META": {"sizes": {"includes": [20]}},
-    "includes": [4860],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/webapks/resources.grd": {
-    "META": {"sizes": {"includes": [10]}},
-    "includes": [4880],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/webui_js_error/resources.grd": {
-   "META": {"sizes": {"includes": [10],}},
-   "includes": [4900],
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/app_service_internals/resources.grd": {
+    "META": {"sizes": {"includes": [5],}},
+    "includes": [2780],
   },
   "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/app_settings/resources.grd": {
     "META": {"sizes": {"includes": [45]}},
-    "includes": [4920],
+    "includes": [2800],
   },
-  "<(SHARED_INTERMEDIATE_DIR)/components/sync/service/resources/resources.grd": {
-   "META": {"sizes": {"includes": [30],}},
-    "includes": [4940],
-  },
-  "components/resources/dev_ui_components_resources.grd": {
-    "includes": [4960],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/content/browser/resources/private_aggregation/resources.grd": {
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/ash/extended_updates/resources.grd": {
     "META": {"sizes": {"includes": [20]}},
-    "includes": [4980],
+    "includes": [2820],
   },
-  "<(SHARED_INTERMEDIATE_DIR)/content/browser/resources/attribution_reporting/resources.grd": {
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/ash/inline_login/resources.grd": {
     "META": {"sizes": {"includes": [20]}},
-    "includes": [5000],
+    "includes": [2840],
   },
-  "<(SHARED_INTERMEDIATE_DIR)/content/browser/resources/gpu/resources.grd": {
-    "META": {"sizes": {"includes": [20]}},
-    "includes": [5020],
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/ash/settings/resources.grd": {
+    "META": {"sizes": {"includes": [1000],}},
+    "includes": [2860],
   },
-  "<(SHARED_INTERMEDIATE_DIR)/content/browser/resources/histograms/resources.grd": {
-    "META": {"sizes": {"includes": [5]}},
-    "includes": [5040],
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/bluetooth_internals/resources.grd": {
+    "META": {"sizes": {"includes": [50],}},
+    "includes": [2880],
   },
-  "<(SHARED_INTERMEDIATE_DIR)/content/browser/resources/indexed_db/resources.grd": {
-    "META": {"sizes": {"includes": [20]}},
-    "includes": [5060],
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/bookmarks/resources.grd": {
+    "META": {"sizes": {"includes": [50],}},
+    "includes": [2900],
   },
-  "<(SHARED_INTERMEDIATE_DIR)/content/browser/resources/media/resources.grd": {
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/browser_switch/resources.grd": {
     "META": {"sizes": {"includes": [10],}},
-    "includes": [5080],
+    "includes": [2920],
   },
-  "<(SHARED_INTERMEDIATE_DIR)/content/browser/resources/net/resources.grd": {
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/browsing_topics/resources.grd": {
+    "META": {"sizes": {"includes": [10]}},
+    "includes": [2940],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/certificate_viewer/resources.grd": {
     "META": {"sizes": {"includes": [5],}},
-    "includes": [5100],
+    "includes": [2960],
   },
-  "<(SHARED_INTERMEDIATE_DIR)/content/browser/resources/process/resources.grd": {
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/add_supervision/resources.grd": {
     "META": {"sizes": {"includes": [10],}},
-    "includes": [5120],
+    "includes": [2980],
   },
-  "<(SHARED_INTERMEDIATE_DIR)/content/browser/resources/service_worker/resources.grd": {
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/app_install/resources.grd": {
+    "META": {"sizes": {"includes": [5]}},
+    "includes": [3000],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/arc_account_picker/resources.grd": {
     "META": {"sizes": {"includes": [10],}},
-    "includes": [5140],
+    "includes": [3020],
   },
-  "<(SHARED_INTERMEDIATE_DIR)/content/browser/resources/quota/resources.grd": {
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/assistant_optin/assistant_optin_resources.grd": {
+    "META": {"sizes": {"includes": [80]}},
+    "includes": [3040],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/audio/resources.grd": {
+    "META": {"sizes": {"includes": [30]}},
+    "includes": [3060],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/bluetooth_pairing_dialog/resources.grd": {
     "META": {"sizes": {"includes": [10],}},
-    "includes": [5160],
+    "includes": [3080],
   },
-  "<(SHARED_INTERMEDIATE_DIR)/content/browser/resources/traces_internals/resources.grd": {
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/borealis_installer/resources.grd": {
     "META": {"sizes": {"includes": [20],}},
-    "includes": [5180],
+    "includes": [3100],
   },
-  "<(SHARED_INTERMEDIATE_DIR)/content/browser/resources/webxr_internals/resources.grd": {
-    "META": {"sizes": {"includes": [20,],}},
-    "includes": [5200],
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/cloud_upload/resources.grd": {
+    "META": {"sizes": {"includes": [50]}},
+    "includes": [3120],
   },
-  "<(SHARED_INTERMEDIATE_DIR)/content/browser/webrtc/resources/resources.grd": {
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/desk_api/resources.grd": {
+    "META": {"sizes": {"includes": [10],}},
+    "includes": [3140],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/edu_coexistence/resources.grd": {
     "META": {"sizes": {"includes": [20],}},
-    "includes": [5220],
+    "includes": [3160],
   },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/feed/resources.grd": {
-    "META": {"sizes": {"includes": [20]}},
-    "includes": [5240],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/manage_mirrorsync/resources.grd": {
-    "META": {"sizes": {"includes": [10]}},
-    "includes": [5260],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/inline_login/resources.grd": {
-    "META": {"sizes": {"includes": [10]}},
-    "includes": [5280],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/components/metrics/debug/resources.grd": {
-    "META": {"sizes": {"includes": [15]}},
-    "includes": [5300],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/lens/resources.grd": {
-    "META": {"sizes": {"includes": [10]}},
-    "includes": [5320],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/lens/overlay/resources.grd": {
-    "META": {"sizes": {"includes": [70]}},
-    "includes": [5340],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/lens/overlay/search_bubble/resources.grd": {
-    "META": {"sizes": {"includes": [20]}},
-    "includes": [5360],
-  },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/lens/shared/resources.grd": {
-    "META": {"sizes": {"includes": [10]}},
-    "includes": [5370],
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/emoji_picker/resources.grd": {
+    "META": {"sizes": {"includes": [60]}},
+    "includes": [3180],
   },
   "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/enterprise_reporting/resources.grd": {
     "META": {"sizes": {"includes": [20]}},
-    "includes": [5380],
+    "includes": [3200],
   },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/hats/resources.grd": {
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/gaia_action_buttons/resources.grd": {
+    "META": {"sizes": {"includes": [10],}},
+    "includes": [3220],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/healthd_internals/resources.grd": {
+    "META": {"sizes": {"includes": [50]}},
+    "includes": [3240],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/internet_config_dialog/resources.grd": {
+    "META": {"sizes": {"includes": [10],}},
+    "includes": [3260],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/internet_detail_dialog/resources.grd": {
+    "META": {"sizes": {"includes": [10],}},
+    "includes": [3280],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/kerberos/resources.grd": {
+    "META": {"sizes": {"includes": [5],}},
+    "includes": [3300],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/launcher_internals/resources.grd": {
+    "META": {"sizes": {"includes": [50]}},
+    "includes": [3320],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/lock_screen_reauth/resources.grd": {
+    "META": {"sizes": {"includes": [30]}},
+    "includes": [3340],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/login/resources.grd": {
+    "META": {"sizes": {"includes": [320],}},
+    "includes": [3360],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/manage_mirrorsync/resources.grd": {
     "META": {"sizes": {"includes": [10]}},
-    "includes": [5400],
+    "includes": [3380],
   },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/on_device_internals/resources.grd": {
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/multidevice_internals/resources.grd": {
+    "META": {"sizes": {"includes": [35]}},
+    "includes": [3400],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/multidevice_setup/multidevice_setup_resources.grd": {
+    "META": {"sizes": {"includes": [10]}},
+    "includes": [3420],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/nearby_internals/resources.grd": {
+    "META": {"sizes": {"includes": [40]}},
+    "includes": [3460],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/nearby_share/resources.grd": {
+    "META": {"sizes": {"includes": [100]}},
+    "includes": [3480],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/network_ui/resources.grd": {
     "META": {"sizes": {"includes": [20]}},
-    "includes": [5420],
+    "includes": [3500],
   },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/privacy_sandbox/internals/resources.grd": {
-   "META": {"sizes": {"includes": [80],}},
-    "includes": [5440],
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/notification_tester/resources.grd": {
+    "META": {"sizes": {"includes": [5]}},
+    "includes": [3520],
   },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/key_value_pair_viewer_shared/resources.grd": {
-   "META": {"sizes": {"includes": [10]}},
-    "includes": [5460],
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/parent_access/resources.grd": {
+    "META": {"sizes": {"includes": [50],}},
+    "includes": [3540],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/password_change/resources.grd": {
+    "META": {"sizes": {"includes": [30]}},
+    "includes": [3560],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/remote_maintenance_curtain/resources.grd": {
+    "META": {"sizes": {"includes": [10]}},
+    "includes": [3580],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/sensor_info/resources.grd": {
+    "META": {"sizes": {"includes": [50]}},
+    "includes": [3600],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/set_time_dialog/resources.grd": {
+    "META": {"sizes": {"includes": [5]}},
+    "includes": [3620],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/skyvault/resources.grd": {
+    "META": {"sizes": {"includes": [10]}},
+    "includes": [3640],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/supervision/resources.grd": {
+    "META": {"sizes": {"includes": [10],}},
+    "includes": [3660],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/vc_tray_tester/resources.grd": {
+    "META": {"sizes": {"includes": [5]}},
+    "includes": [3680],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/commerce/product_specifications/resources.grd": {
+    "META": {"sizes": {"includes": [50]}},
+    "includes": [3700],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/components/resources.grd": {
+    "META": {"sizes": {"includes": [5]}},
+    "includes": [3720],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/compose/resources.grd": {
+    "META": {"sizes": {"includes": [15]}},
+    "includes": [3740],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/connectors_internals/resources.grd": {
+    "META": {"sizes": {"includes": [15]}},
+    "includes": [3760],
   },
   "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/data_sharing/resources.grd": {
    "META": {"sizes": {"includes": [20]}},
-    "includes": [5480],
+    "includes": [3780],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/data_sharing_internals/resources.grd": {
+    "META": {"sizes": {"includes": [5]}},
+    "includes": [3800],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/device_log/resources.grd": {
+    "META": {"sizes": {"includes": [5],}},
+    "includes": [3820],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/discards/resources.grd": {
+    "META": {"sizes": {"includes": [20],}},
+    "includes": [3840],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/dlp_internals/resources.grd": {
+    "META": {"sizes": {"includes": [15]}},
+    "includes": [3860],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/downloads/resources.grd": {
+    "META": {"sizes": {"includes": [50],}},
+    "includes": [3880],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/engagement/resources.grd": {
+    "META": {"sizes": {"includes": [5],}},
+    "includes": [3900],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/extensions/resources.grd": {
+    "META": {"sizes": {"includes": [120],}},
+    "includes": [3920],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/feed/resources.grd": {
+    "META": {"sizes": {"includes": [20]}},
+    "includes": [3940],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/feed_internals/resources.grd": {
+    "META": {"sizes": {"includes": [10],}},
+    "includes": [3960],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/feedback/resources.grd": {
+    "META": {"sizes": {"includes": [30],}},
+    "includes": [3980],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/gaia_auth_host/resources.grd": {
+    "META": {"sizes": {"includes": [20],}},
+    "includes": [4000],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/hats/resources.grd": {
+    "META": {"sizes": {"includes": [10]}},
+    "includes": [4020],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/history/resources.grd": {
+    "META": {"sizes": {"includes": [40]}},
+    "includes": [4040],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/identity_internals/resources.grd": {
+    "META": {"sizes": {"includes": [10]}},
+    "includes": [4060],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/inline_login/resources.grd": {
+    "META": {"sizes": {"includes": [10]}},
+    "includes": [4080],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/invalidations/resources.grd": {
+    "META": {"sizes": {"includes": [10],}},
+    "includes": [4100],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/internals/resources.grd": {
+    "META": {"sizes": {"includes": [20]}},
+    "includes": [4120],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/intro/resources.grd": {
+    "META": {"sizes": {"includes": [20],}},
+    "includes": [4140],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/key_value_pair_viewer_shared/resources.grd": {
+   "META": {"sizes": {"includes": [10]}},
+    "includes": [4160],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/lens/overlay/resources.grd": {
+    "META": {"sizes": {"includes": [70]}},
+    "includes": [4180],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/lens/overlay/search_bubble/resources.grd": {
+    "META": {"sizes": {"includes": [20]}},
+    "includes": [4200],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/lens/resources.grd": {
+    "META": {"sizes": {"includes": [10]}},
+    "includes": [4220],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/lens/shared/resources.grd": {
+    "META": {"sizes": {"includes": [10]}},
+    "includes": [4240],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/location_internals/resources.grd": {
+    "META": {"sizes": {"includes": [10],}},
+    "includes": [4260],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/management/resources.grd": {
+    "META": {"sizes": {"includes": [10]}},
+    "includes": [4280],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/media/resources.grd": {
+    "META": {"sizes": {"includes": [20],}},
+    "includes": [4300],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/media_router/cast_feedback/resources.grd": {
+    "META": {"sizes": {"includes": [10],}},
+    "includes": [4320],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/media_router/internals/resources.grd": {
+    "META": {"sizes": {"includes": [10]}},
+    "includes": [4340],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/memory_internals/resources.grd": {
+    "META": {"sizes": {"includes": [5]}},
+    "includes": [4360],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/net_internals/resources.grd": {
+    "META": {"sizes": {"includes": [20]}},
+    "includes": [4380],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/new_tab_page/resources.grd": {
+    "META": {"sizes": {"includes": [200]}},
+    "includes": [4400],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/new_tab_page_instant/resources.grd": {
+    "META": {"sizes": {"includes": [10]}},
+    "includes": [4420],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/new_tab_page_third_party/resources.grd": {
+    "META": {"sizes": {"includes": [10]}},
+    "includes": [4440],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/omnibox/resources.grd": {
+    "META": {"sizes": {"includes": [30]}},
+    "includes": [4460],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/omnibox_popup/resources.grd": {
+    "META": {"sizes": {"includes": [50]}},
+    "includes": [4480],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/on_device_internals/resources.grd": {
+    "META": {"sizes": {"includes": [20]}},
+    "includes": [4500],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/password_manager/resources.grd": {
+    "META": {"sizes": {"includes": [200]}},
+    "includes": [4520],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/pdf/resources.grd": {
+    "META": {"sizes": {"includes": [200]}},
+    "includes": [4540],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/predictors/resources.grd": {
+    "META": {"sizes": {"includes": [5],}},
+    "includes": [4560],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/print_preview/resources.grd": {
+    "META": {"sizes": {"includes": [500],}},
+    "includes": [4580],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/privacy_sandbox/internals/resources.grd": {
+   "META": {"sizes": {"includes": [80],}},
+    "includes": [4600],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/privacy_sandbox/resources.grd": {
+    "META": {"sizes": {"includes": [50],}},
+    "includes": [4620],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/profile_internals/resources.grd": {
+    "META": {"sizes": {"includes": [10],}},
+    "includes": [4640],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/quota_internals/quota_internals_resources.grd": {
+    "META": {"sizes": {"includes": [20]}},
+    "includes": [4660],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/sandbox_internals/resources.grd": {
+    "META": {"sizes": {"includes": [5],}},
+    "includes": [4680],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/search_engine_choice/resources.grd": {
+    "META": {"sizes": {"includes": [20]}},
+    "includes": [4700],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/segmentation_internals/resources.grd": {
+    "META": {"sizes": {"includes": [10]}},
+    "includes": [4720],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/settings/resources.grd": {
+    "META": {"sizes": {"includes": [500],}},
+    "includes": [4740],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/settings_shared/resources.grd": {
+    "META": {"sizes": {"includes": [50],}},
+    "includes": [4760],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/side_panel/bookmarks/resources.grd": {
+    "META": {"sizes": {"includes": [45],}},
+    "includes": [4780],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/side_panel/commerce/resources.grd": {
+    "META": {"sizes": {"includes": [20],}},
+    "includes": [4800],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/side_panel/companion/resources.grd": {
+    "META": {"sizes": {"includes": [10],}},
+    "includes": [4820],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/side_panel/customize_chrome/resources.grd": {
+    "META": {"sizes": {"includes": [80],}},
+    "includes": [4840],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/side_panel/history_clusters/resources.grd": {
+    "META": {"sizes": {"includes": [5],}},
+    "includes": [4860],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/side_panel/read_anything/resources.grd": {
+    "META": {"sizes": {"includes": [50],}},
+    "includes": [4880],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/side_panel/reading_list/resources.grd": {
+    "META": {"sizes": {"includes": [15],}},
+    "includes": [4900],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/side_panel/shared/resources.grd": {
+    "META": {"sizes": {"includes": [15],}},
+    "includes": [4920],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/signin/batch_upload/resources.grd": {
+    "META": {"sizes": {"includes": [10]}},
+    "includes": [4940],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/signin/profile_picker/resources.grd": {
+    "META": {"sizes": {"includes": [50],}},
+    "includes": [4960],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/signin/resources.grd": {
+    "META": {"sizes": {"includes": [90],}},
+    "includes": [4980],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/suggest_internals/resources.grd": {
+    "META": {"sizes": {"includes": [10]}},
+    "includes": [5000],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/support_tool/resources.grd": {
+    "META": {"sizes": {"includes": [30]}},
+    "includes": [5020],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/tab_search/resources.grd": {
+    "META": {"sizes": {"includes": [90]}},
+    "includes": [5040],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/tab_strip/resources.grd": {
+    "META": {"sizes": {"includes": [30]}},
+    "includes": [5060],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/usb_internals/resources.grd": {
+    "META": {"sizes": {"includes": [20]}},
+    "includes": [5080],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/web_app_internals/resources.grd": {
+    "META": {"sizes": {"includes": [10]}},
+    "includes": [5100],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/webapks/resources.grd": {
+    "META": {"sizes": {"includes": [10]}},
+    "includes": [5120],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/webui_gallery/resources.grd": {
+    "META": {"sizes": {"includes": [90]}},
+    "includes": [5140],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/webui_js_error/resources.grd": {
+   "META": {"sizes": {"includes": [10],}},
+   "includes": [5160],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/welcome/resources.grd": {
+    "META": {"sizes": {"includes": [80]}},
+    "includes": [5180],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/whats_new/resources.grd": {
+    "META": {"sizes": {"includes": [10]}},
+    "includes": [5200],
   },
   # END chrome/ WebUI resources section
 
@@ -1061,10 +967,53 @@
   "components/resources/components_scaled_resources.grd": {
     "structures": [7240],
   },
+  "components/resources/dev_ui_components_resources.grd": {
+    "includes": [7260],
+  },
   "components/search_engine_descriptions_strings.grd": {
-    "messages": [7260],
+    "messages": [7280],
   },
 
+  "<(SHARED_INTERMEDIATE_DIR)/components/commerce/core/internals/resources/resources.grd": {
+    "META": {"sizes": {"includes": [10]}},
+    "includes": [7300],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/components/download/resources/download_internals/resources.grd": {
+    "META": {"sizes": {"includes": [10]}},
+    "includes": [7320],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/components/flags_ui/resources/resources.grd": {
+    "META": {"sizes": {"includes": [10]}},
+    "includes": [7340],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/components/history_clusters/history_clusters_internals/resources/resources.grd": {
+    "META": {"sizes": {"includes": [10]}},
+    "includes": [7360],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/components/metrics/debug/resources.grd": {
+    "META": {"sizes": {"includes": [15]}},
+    "includes": [7380],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/components/optimization_guide/optimization_guide_internals/resources/resources.grd": {
+    "META": {"sizes": {"includes": [10]}},
+    "includes": [7400],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/components/policy/resources/webui/resources.grd": {
+    "META": {"sizes": {"includes": [30]}},
+    "includes": [7420],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/components/ukm/debug/resources.grd": {
+    "META": {"sizes": {"includes": [5]}},
+    "includes": [7440],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/components/version_ui/resources/resources.grd": {
+    "META": {"sizes": {"includes": [5]}},
+    "includes": [7460],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/components/sync/service/resources/resources.grd": {
+   "META": {"sizes": {"includes": [30],}},
+    "includes": [7480],
+  },
   # END components/ section.
 
   # START ios/ section.
@@ -1145,10 +1094,10 @@
   },
   "ios_internal/chrome/app/ios_internal_chromium_strings.grd": {
     "META": {"join": 2},
-    "messages": [7280],
+    "messages": [7600],
   },
   "ios_internal/chrome/app/ios_internal_google_chrome_strings.grd": {
-    "messages": [7280],
+    "messages": [7620],
   },
   # END ios_internal/ section.
 
@@ -1156,19 +1105,71 @@
   "content/content_resources.grd": {
     # Big alignment at start of section.
     "META": {"join": 2, "align": 100},
-    "includes": [7300],
+    "includes": [8000],
   },
   "content/shell/shell_resources.grd": {
-    "includes": [7320],
+    "includes": [8020],
   },
   "content/test/web_ui_mojo_test_resources.grd": {
-    "includes": [7340],
+    "includes": [8040],
   },
 
-  # This file is generated during the build.
+  # These files are generated during the build.
+  "<(SHARED_INTERMEDIATE_DIR)/content/browser/resources/private_aggregation/resources.grd": {
+    "META": {"sizes": {"includes": [20]}},
+    "includes": [8060],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/content/browser/resources/gpu/resources.grd": {
+    "META": {"sizes": {"includes": [20]}},
+    "includes": [8080],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/content/browser/resources/histograms/resources.grd": {
+    "META": {"sizes": {"includes": [5]}},
+    "includes": [8100],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/content/browser/resources/indexed_db/resources.grd": {
+    "META": {"sizes": {"includes": [20]}},
+    "includes": [8120],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/content/browser/resources/media/resources.grd": {
+    "META": {"sizes": {"includes": [10],}},
+    "includes": [8140],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/content/browser/resources/net/resources.grd": {
+    "META": {"sizes": {"includes": [5],}},
+    "includes": [8160],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/content/browser/resources/process/resources.grd": {
+    "META": {"sizes": {"includes": [10],}},
+    "includes": [8180],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/content/browser/resources/service_worker/resources.grd": {
+    "META": {"sizes": {"includes": [10],}},
+    "includes": [8200],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/content/browser/resources/quota/resources.grd": {
+    "META": {"sizes": {"includes": [10],}},
+    "includes": [8220],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/content/browser/resources/traces_internals/resources.grd": {
+    "META": {"sizes": {"includes": [20],}},
+    "includes": [8240],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/content/browser/resources/webxr_internals/resources.grd": {
+    "META": {"sizes": {"includes": [20,],}},
+    "includes": [8260],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/content/browser/resources/attribution_reporting/resources.grd": {
+    "META": {"sizes": {"includes": [20]}},
+    "includes": [8280],
+  },
   "<(SHARED_INTERMEDIATE_DIR)/content/browser/tracing/tracing_resources.grd": {
     "META": {"sizes": {"includes": [20],}},
-    "includes": [7360],
+    "includes": [8300],
+  },
+  "<(SHARED_INTERMEDIATE_DIR)/content/browser/webrtc/resources/resources.grd": {
+    "META": {"sizes": {"includes": [20],}},
+    "includes": [8320],
   },
   # END content/ section.
 
@@ -1177,177 +1178,177 @@
   "ash/ash_strings.grd": {
     # Big alignment at start of section.
     "META": {"align": 100},
-    "messages": [7400],
+    "messages": [9000],
   },
   # TODO(b/207518736): Input overlay resources will be changed to proto soon,
   # thus not rushing to update it for now.
   "ash/components/arc/input_overlay/resources/input_overlay_resources.grd": {
     # Big alignment at start of section.
-    "includes": [7410],
+    "includes": [9010],
   },
   "<(SHARED_INTERMEDIATE_DIR)/ash/webui/os_feedback_ui/resources/resources.grd": {
     "META": {"sizes": {"includes": [50],}},
-    "includes": [7420],
+    "includes": [9020],
   },
   "<(SHARED_INTERMEDIATE_DIR)/ash/webui/os_feedback_ui/untrusted_resources/resources.grd": {
     "META": {"sizes": {"includes": [50],}},
-    "includes": [7440],
+    "includes": [9040],
   },
   "<(SHARED_INTERMEDIATE_DIR)/ash/webui/firmware_update_ui/resources/resources.grd": {
     "META": {"sizes": {"includes": [200],}},
-    "includes": [7460],
+    "includes": [9060],
   },
   "<(SHARED_INTERMEDIATE_DIR)/ash/webui/shortcut_customization_ui/resources/resources.grd": {
     "META": {"sizes": {"includes": [200],}},
-    "includes": [7480],
+    "includes": [9080],
   },
   "<(SHARED_INTERMEDIATE_DIR)/ash/webui/shimless_rma/resources/resources.grd": {
     "META": {"sizes": {"includes": [100],}},
-    "includes": [7500],
+    "includes": [9100],
   },
   "ash/keyboard/ui/keyboard_resources.grd": {
-    "includes": [7520],
+    "includes": [9120],
   },
   "ash/login/resources/login_resources.grd": {
-    "structures": [7540],
+    "structures": [9140],
   },
   "ash/public/cpp/resources/ash_public_unscaled_resources.grd": {
-    "includes": [7560],
-    "structures": [7580],
+    "includes": [9160],
+    "structures": [9180],
   },
   "ash/system/mahi/resources/mahi_resources.grd": {
-    "structures":[7600],
+    "structures":[9200],
   },
   "ash/system/video_conference/resources/vc_resources.grd": {
-    "structures":[7620],
+    "structures":[9220],
   },
   "base/tracing/protos/resources.grd": {
-    "includes": [7640],
+    "includes": [9240],
   },
   "chromecast/app/resources/chromecast_settings.grd": {
-    "messages": [7660],
+    "messages": [9260],
   },
   "chromecast/app/resources/shell_resources.grd": {
-    "includes": [7680],
+    "includes": [9280],
   },
   "chromecast/renderer/resources/extensions_renderer_resources.grd": {
-    "includes": [7700],
+    "includes": [9300],
   },
 
   "device/bluetooth/bluetooth_strings.grd": {
-    "messages": [7720],
+    "messages": [9320],
   },
 
   "device/fido/fido_strings.grd": {
-    "messages": [7740],
+    "messages": [9340],
   },
 
   "extensions/browser/resources/extensions_browser_resources.grd": {
-    "structures": [7760],
+    "structures": [9360],
   },
   "extensions/extensions_resources.grd": {
-    "includes": [7780],
+    "includes": [9380],
   },
   "extensions/renderer/resources/extensions_renderer_resources.grd": {
-    "includes": [7800],
-    "structures": [7820],
+    "includes": [9400],
+    "structures": [9420],
   },
   "extensions/shell/app_shell_resources.grd": {
-    "includes": [7840],
+    "includes": [9440],
   },
   "extensions/strings/extensions_strings.grd": {
-    "messages": [7860],
+    "messages": [9460],
   },
 
   "mojo/public/js/mojo_bindings_resources.grd": {
-    "includes": [7880],
+    "includes": [9480],
   },
 
   "net/base/net_resources.grd": {
-    "includes": [7900],
+    "includes": [9500],
   },
 
   "remoting/resources/remoting_strings.grd": {
-    "messages": [7920],
+    "messages": [9520],
   },
 
   "services/services_strings.grd": {
-    "messages": [7940],
+    "messages": [9540],
   },
   "third_party/blink/public/blink_image_resources.grd": {
-    "structures": [7960],
+    "structures": [9560],
   },
   "third_party/blink/public/blink_resources.grd": {
-    "includes": [7980],
-  },
-  "third_party/blink/renderer/modules/media_controls/resources/media_controls_resources.grd": {
-    "includes": [8000],
-    "structures": [8020],
+    "includes": [9580],
   },
   "third_party/blink/public/strings/blink_strings.grd": {
-    "messages": [8060],
+    "messages": [9600],
+  },
+  "third_party/blink/renderer/modules/media_controls/resources/media_controls_resources.grd": {
+    "includes": [9640],
+    "structures": [9640],
   },
   "third_party/libaddressinput/chromium/address_input_strings.grd": {
-    "messages": [8080],
+    "messages": [9680],
   },
 
   "ui/base/test/ui_base_test_resources.grd": {
-    "messages": [8100],
+    "messages": [9700],
   },
   "ui/chromeos/resources/ui_chromeos_resources.grd": {
-    "structures": [8120],
+    "structures": [9720],
   },
   "<(SHARED_INTERMEDIATE_DIR)/ui/chromeos/styles/cros_typography_resources.grd": {
     "META": {"sizes": {"includes": [5],}},
-    "includes": [8140],
+    "includes": [9740],
   },
   "ui/chromeos/ui_chromeos_strings.grd": {
-    "messages": [8160],
+    "messages": [9760],
   },
   "<(SHARED_INTERMEDIATE_DIR)/ui/file_manager/file_manager_gen_resources.grd": {
     "META": {"sizes": {"includes": [2000]}},
-    "includes": [8180],
+    "includes": [9780],
   },
   "ui/file_manager/file_manager_resources.grd": {
-    "includes": [8200],
+    "includes": [9800],
   },
   "ui/resources/ui_resources.grd": {
-    "structures": [8220],
+    "structures": [9820],
   },
   "ui/resources/ui_unscaled_resources.grd": {
-    "includes": [8240],
+    "includes": [9840],
   },
   "ui/strings/app_locale_settings.grd": {
-    "messages": [8260],
+    "messages": [9860],
   },
   "ui/strings/auto_image_annotation_strings.grd": {
-    "messages": [8270],
+    "messages": [9870],
   },
   "ui/strings/ax_strings.grd": {
-    "messages": [8280],
+    "messages": [9880],
   },
   "ui/strings/ui_strings.grd": {
-    "messages": [8300],
+    "messages": [9900],
   },
   "ui/views/examples/views_examples_resources.grd": {
-    "messages": [8320],
+    "messages": [9920],
   },
   "ui/views/resources/views_resources.grd": {
-    "structures": [8340],
+    "structures": [9940],
   },
   "ui/webui/examples/resources/webui_examples_resources.grd": {
-    "messages": [8360],
+    "messages": [9960],
   },
   "<(SHARED_INTERMEDIATE_DIR)/ui/webui/examples/resources/browser/resources.grd": {
     "META": {"sizes": {"includes": [10]}},
-    "includes": [8380],
+    "includes": [9980],
   },
   "<(SHARED_INTERMEDIATE_DIR)/ui/webui/resources/webui_resources.grd": {
     "META": {"sizes": {"includes": [1100]}},
-    "includes": [8400],
+    "includes": [10000],
   },
   "weblayer/weblayer_resources.grd": {
-    "includes": [8420],
+    "includes": [10020],
   },
 
   # This file is generated during the build.
@@ -1356,13 +1357,13 @@
     # In debug build, devtools frontend sources are not bundled and therefore
     # includes a lot of individual resources
     "META": {"sizes": {"includes": [4000],}},
-    "includes": [8440],
+    "includes": [10040],
   },
 
   # This file is generated during the build.
   "<(SHARED_INTERMEDIATE_DIR)/resources/inspector_overlay/inspector_overlay_resources.grd": {
     "META": {"sizes": {"includes": [50],}},
-    "includes": [8460],
+    "includes": [10060],
   },
 
   # END "everything else" section.
diff --git a/tools/metrics/histograms/metadata/arc/enums.xml b/tools/metrics/histograms/metadata/arc/enums.xml
index b52a84b..2a5b703 100644
--- a/tools/metrics/histograms/metadata/arc/enums.xml
+++ b/tools/metrics/histograms/metadata/arc/enums.xml
@@ -721,6 +721,14 @@
   <int value="4" label="The migration has finished"/>
 </enum>
 
+<enum name="ArcVmRemovableMediaUnmountResult">
+  <summary>Defines the result of unmounting removable media on ARC.</summary>
+  <int value="0" label="Success"/>
+  <int value="1" label="Failed - mojo timeout"/>
+  <int value="2" label="Failed - ARC-side error"/>
+  <int value="3" label="Failed - mojo instance not found"/>
+</enum>
+
 <enum name="ArcWallpaperApi">
   <summary>Defines the Wallpaper APIs called from Android.</summary>
   <int value="0" label="Set"/>
diff --git a/tools/metrics/histograms/metadata/arc/histograms.xml b/tools/metrics/histograms/metadata/arc/histograms.xml
index 8a2083a..6c2cca2 100644
--- a/tools/metrics/histograms/metadata/arc/histograms.xml
+++ b/tools/metrics/histograms/metadata/arc/histograms.xml
@@ -2746,6 +2746,26 @@
   </summary>
 </histogram>
 
+<histogram name="Arc.VmRemovableMediaUnmount.Duration" units="ms"
+    expires_after="2025-07-01">
+  <owner>momohatt@google.com</owner>
+  <owner>arc-storage@google.com</owner>
+  <summary>
+    The time taken for ARCVM to drop any references to a removable media before
+    unmounting it on the host side. Not recorded for ARC++ container.
+  </summary>
+</histogram>
+
+<histogram name="Arc.VmRemovableMediaUnmount.Result"
+    enum="ArcVmRemovableMediaUnmountResult" expires_after="2025-07-01">
+  <owner>momohatt@google.com</owner>
+  <owner>arc-storage@google.com</owner>
+  <summary>
+    The result of the attempt to drop ARCVM-side references to a removable media
+    before unmounting it on the host side. Not recorded for ARC++ container.
+  </summary>
+</histogram>
+
 <histogram name="Arc.VpnServiceBuilderCompatApisCounter"
     enum="VpnServiceBuilderCompatApisList" expires_after="2024-09-11">
   <owner>mhasank@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/ash/histograms.xml b/tools/metrics/histograms/metadata/ash/histograms.xml
index 73fb038..4e9654b 100644
--- a/tools/metrics/histograms/metadata/ash/histograms.xml
+++ b/tools/metrics/histograms/metadata/ash/histograms.xml
@@ -1056,6 +1056,16 @@
   </summary>
 </histogram>
 
+<histogram name="Ash.Birch.Coral.ClusterCount" units="count"
+    expires_after="2025-10-10">
+  <owner>yulunwu@chromium.org</owner>
+  <owner>cros-coral@google.com</owner>
+  <summary>
+    The number of coral items shown in the birch bar when the user enters
+    overview.
+  </summary>
+</histogram>
+
 <histogram name="Ash.Birch.Latency{Type}" units="ms" expires_after="2025-02-10">
   <owner>jamescook@chromium.org</owner>
   <owner>chromeos-launcher@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/attribution_reporting/histograms.xml b/tools/metrics/histograms/metadata/attribution_reporting/histograms.xml
index d460969c..6d10a47 100644
--- a/tools/metrics/histograms/metadata/attribution_reporting/histograms.xml
+++ b/tools/metrics/histograms/metadata/attribution_reporting/histograms.xml
@@ -42,7 +42,7 @@
 
 <histogram name="Conversions.AggregatableDebugReport.ProcessResult"
     enum="ConversionAggregatableDebugReportProcessResult"
-    expires_after="2024-11-29">
+    expires_after="2025-04-10">
   <owner>linnan@chromium.org</owner>
   <owner>measurement-api-dev+metrics@google.com</owner>
   <summary>
@@ -55,7 +55,7 @@
 <histogram
     name="Conversions.AggregatableDebugReporting.SourceRegistrationError"
     enum="ConversionAggregatableDebugReportingRegistrationError"
-    expires_after="2024-11-23">
+    expires_after="2025-04-10">
   <owner>linnan@chromium.org</owner>
   <owner>measurement-api-dev+metrics@google.com</owner>
   <summary>
@@ -68,7 +68,7 @@
 <histogram
     name="Conversions.AggregatableDebugReporting.TriggerRegistrationError"
     enum="ConversionAggregatableDebugReportingRegistrationError"
-    expires_after="2024-11-23">
+    expires_after="2025-04-10">
   <owner>linnan@chromium.org</owner>
   <owner>measurement-api-dev+metrics@google.com</owner>
   <summary>
@@ -90,7 +90,7 @@
 </histogram>
 
 <histogram name="Conversions.AggregatableKeysPerSource" units="keys"
-    expires_after="2024-11-17">
+    expires_after="2025-04-10">
   <owner>linnan@chromium.org</owner>
   <owner>johnidel@chromium.org</owner>
   <owner>measurement-api-dev+metrics@google.com</owner>
@@ -1180,7 +1180,7 @@
 </histogram>
 
 <histogram name="Conversions.SourceDestinationLimitResult"
-    enum="AttributionSourceDestinationLimitResult" expires_after="2024-11-20">
+    enum="AttributionSourceDestinationLimitResult" expires_after="2025-04-10">
   <owner>linnan@chromium.org</owner>
   <owner>measurement-api-dev+metrics@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/mac/histograms.xml b/tools/metrics/histograms/metadata/mac/histograms.xml
index 793c099..1c985ba 100644
--- a/tools/metrics/histograms/metadata/mac/histograms.xml
+++ b/tools/metrics/histograms/metadata/mac/histograms.xml
@@ -94,6 +94,58 @@
   </summary>
 </histogram>
 
+<histogram name="Mac.Fullscreen.LocationBarViewScreenY" units="px"
+    expires_after="2024-12-31">
+  <owner>kerenzhu@chromium.org</owner>
+  <owner>lgrey@chromium.org</owner>
+  <summary>
+    Records the location bar's screen Y coordinate when the omnibox popup is
+    shown while the browser is in fullscreen mode.
+
+    This histogram is for debugging crbug.com/365733574, that bubbles are
+    misplaced in mac fullscreen.
+  </summary>
+</histogram>
+
+<histogram name="Mac.Fullscreen.OmniboxPopupTargetScreenY" units="px"
+    expires_after="2024-12-31">
+  <owner>kerenzhu@chromium.org</owner>
+  <owner>lgrey@chromium.org</owner>
+  <summary>
+    Records the target Y coordinate of the omnibox popup when it is shown while
+    the browser is in fullscreen mode.
+
+    This histogram is for debugging crbug.com/365733574, that bubbles are
+    misplaced in mac fullscreen.
+  </summary>
+</histogram>
+
+<histogram name="Mac.Fullscreen.OverlayNSWindowScreenY" units="px"
+    expires_after="2024-12-31">
+  <owner>kerenzhu@chromium.org</owner>
+  <owner>lgrey@chromium.org</owner>
+  <summary>
+    Records the overlay NSWindow's screen Y coordinate when the omnibox popup is
+    shown while the browser is in fullscreen mode.
+
+    This histogram is for debugging crbug.com/365733574, that bubbles are
+    misplaced in mac fullscreen.
+  </summary>
+</histogram>
+
+<histogram name="Mac.Fullscreen.OverlayWidgetScreenY" units="px"
+    expires_after="2024-12-31">
+  <owner>kerenzhu@chromium.org</owner>
+  <owner>lgrey@chromium.org</owner>
+  <summary>
+    Records the overlay widget's screen Y coordinate when the omnibox popup is
+    shown while the browser is in fullscreen mode.
+
+    This histogram is for debugging crbug.com/365733574, that bubbles are
+    misplaced in mac fullscreen.
+  </summary>
+</histogram>
+
 <histogram name="Mac.LaunchApplicationResult" enum="MacLaunchApplicationResult"
     expires_after="2025-01-26">
   <owner>mek@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/network/enums.xml b/tools/metrics/histograms/metadata/network/enums.xml
index 4001af38..439cc50 100644
--- a/tools/metrics/histograms/metadata/network/enums.xml
+++ b/tools/metrics/histograms/metadata/network/enums.xml
@@ -658,9 +658,12 @@
   <int value="1" label="The request did not match the MDL"/>
   <int value="2" label="The EnableIpProtectionProxy feature is not enabled"/>
   <int value="3" label="The IP Protection setting is disabled"/>
-  <int value="4" label="Had proxy list, but no tokens for the current geo"/>
-  <int value="5" label="Had tokens for the current geo, but no proxy list"/>
-  <int value="6" label="Had neither proxy list nor tokens for the current geo"/>
+  <int value="4" label="Proxy List is unavailable"/>
+  <int value="5"
+      label="Proxy List is available but tokens have never been available"/>
+  <int value="6"
+      label="Proxy List is available but tokens in the cache have been
+             exhausted"/>
   <int value="7" label="The request was resolved to the IP Protection proxies"/>
 </enum>
 
diff --git a/tools/metrics/histograms/metadata/network/histograms.xml b/tools/metrics/histograms/metadata/network/histograms.xml
index d08cb376..d869337 100644
--- a/tools/metrics/histograms/metadata/network/histograms.xml
+++ b/tools/metrics/histograms/metadata/network/histograms.xml
@@ -4943,6 +4943,12 @@
     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.
+
+    Note: This metric can be emitted as boolean failure even if there are tokens
+    available in the cache. Without an available proxy list, it cannot be
+    assumed that tokens within the caches are available for the current geo.
+    Thus, this metric can only be emitted as a success when there is a proxy
+    list available.
   </summary>
 </histogram>
 
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json
index 2390c6fe..1674773f 100644
--- a/tools/perf/core/perfetto_binary_roller/binary_deps.json
+++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -5,8 +5,8 @@
             "full_remote_path": "perfetto-luci-artifacts/v48.0/linux-arm64/trace_processor_shell"
         },
         "win": {
-            "hash": "d773b63c2a2d1dfc21a68eb01f29a5fdaa27e79f",
-            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/90886fdbe7808105fe78938c79fae144036a6cb9/trace_processor_shell.exe"
+            "hash": "20502c37e7e58d89ac767cb9714d5ac29417cac5",
+            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/84aa7464783d04a2fdbd7ca063cbdae4dfe5a929/trace_processor_shell.exe"
         },
         "linux_arm": {
             "hash": "4d3563daba1d1c5828eb15aaa8a80a2b8d572eaa",
@@ -17,12 +17,12 @@
             "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/mac/881ad50c05049ca13d4b34e4f92f4167de5ac52a/trace_processor_shell"
         },
         "mac_arm64": {
-            "hash": "26f0454cd9ce598df45774b37e8388aff94c71d5",
-            "full_remote_path": "perfetto-luci-artifacts/8dbbb197b8140ed2d8a21cde294966fb48b0d05c/mac-arm64/trace_processor_shell"
+            "hash": "0199eebd0b634230ec5b80d3d9384c0ba44d2abd",
+            "full_remote_path": "perfetto-luci-artifacts/v48.0/mac-arm64/trace_processor_shell"
         },
         "linux": {
-            "hash": "b1eb847c130daf22b0299de95204b6d6480e54a6",
-            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/90886fdbe7808105fe78938c79fae144036a6cb9/trace_processor_shell"
+            "hash": "eabb858fc26d3b68ccb60c685fe1b5b5823a4974",
+            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/84aa7464783d04a2fdbd7ca063cbdae4dfe5a929/trace_processor_shell"
         }
     },
     "power_profile.sql": {
diff --git a/tools/rust/build_rust.py b/tools/rust/build_rust.py
index 487ee2f4..38efa353 100755
--- a/tools/rust/build_rust.py
+++ b/tools/rust/build_rust.py
@@ -617,11 +617,9 @@
         '8c7a7e346be4cdf13e77ab4acbfb5ade819a4e60',
     ])
 
-    # TODO(b/363219692): Remove once
-    # https://github.com/rust-lang/rust/pull/129894 or a similar fix has been
-    # merged.
+    # TODO: Remove once we roll past this revision.
     GitCherryPick(RUST_SRC_DIR, 'https://github.com/rust-lang/rust.git',
-                  'f20103f9f3e35dad241dd81cd3ae9eb2dafb3f44')
+                  'edb669350a59ce48586152cf87b1d1f2841cea62')
 
     print('Finished applying cherry-picks.')
 
diff --git a/tools/traffic_annotation/summary/annotations.xml b/tools/traffic_annotation/summary/annotations.xml
index 050e34ff..ccb0ade 100644
--- a/tools/traffic_annotation/summary/annotations.xml
+++ b/tools/traffic_annotation/summary/annotations.xml
@@ -355,7 +355,7 @@
  <item id="fenced_frame_reporting_beacon" added_in_milestone="110" content_hash_code="03fd07f7" os_list="linux,windows,android,chromeos" file_path="content/browser/fenced_frame/fenced_frame_reporter.cc" />
  <item id="password_sync_token_fetcher" added_in_milestone="110" content_hash_code="0268c983" os_list="chromeos" file_path="chrome/browser/ash/login/saml/password_sync_token_fetcher.cc" />
  <item id="projector_xhr_loader" added_in_milestone="110" content_hash_code="07e102c2" os_list="chromeos" file_path="ash/webui/projector_app/projector_xhr_sender.cc" />
- <item id="cloud_speech_recognition" added_in_milestone="110" content_hash_code="00d56fd8" os_list="linux,windows,chromeos" file_path="components/live_caption/live_translate_controller.cc" />
+ <item id="cloud_speech_recognition" added_in_milestone="110" content_hash_code="06a45563" os_list="linux,windows,chromeos" file_path="components/live_caption/translation_dispatcher.cc" />
  <item id="bruschetta_installer_download" added_in_milestone="110" content_hash_code="073f0263" os_list="chromeos" file_path="chrome/browser/ash/bruschetta/bruschetta_download.cc" />
  <item id="quick_start_session_auth_requester" added_in_milestone="110" content_hash_code="08353e70" os_list="chromeos" file_path="chrome/browser/ash/login/oobe_quick_start/second_device_auth_broker.cc" />
  <item id="network_diagnostics_routines" added_in_milestone="110" content_hash_code="0007b237" os_list="chromeos" file_path="chrome/browser/ash/net/network_diagnostics/http_request_manager.cc" />
diff --git a/ui/ozone/platform/wayland/gpu/gbm_surfaceless_wayland.cc b/ui/ozone/platform/wayland/gpu/gbm_surfaceless_wayland.cc
index acb4a60..f4d4d37 100644
--- a/ui/ozone/platform/wayland/gpu/gbm_surfaceless_wayland.cc
+++ b/ui/ozone/platform/wayland/gpu/gbm_surfaceless_wayland.cc
@@ -152,8 +152,7 @@
   if (!image) {
     // Only solid color overlays can be non-backed.
     if (!overlay_plane_data.is_solid_color) {
-      LOG(WARNING) << "Only solid color overlay planes are allowed to be "
-                      "scheduled without backing.";
+      LOG(ERROR) << "Missing buffer for overlay that is not solid color.";
       frame->schedule_planes_succeeded = false;
       return false;
     }
diff --git a/ui/ozone/platform/wayland/gpu/wayland_surface_factory.cc b/ui/ozone/platform/wayland/gpu/wayland_surface_factory.cc
index 29065a8..a402e7b 100644
--- a/ui/ozone/platform/wayland/gpu/wayland_surface_factory.cc
+++ b/ui/ozone/platform/wayland/gpu/wayland_surface_factory.cc
@@ -238,6 +238,9 @@
 std::unique_ptr<gpu::VulkanImplementation>
 WaylandSurfaceFactory::CreateVulkanImplementation(bool use_swiftshader,
                                                   bool allow_protected_memory) {
+  LOG_IF(ERROR, !use_swiftshader)
+      << "'--ozone-platform=wayland' is not compatible with Vulkan. "
+         "Consider switching to '--ozone-platform=x11' or disabling Vulkan";
   return std::make_unique<VulkanImplementationWayland>(use_swiftshader);
 }
 #endif