diff --git a/DEPS b/DEPS
index 762abd0..3ccd7e0 100644
--- a/DEPS
+++ b/DEPS
@@ -144,6 +144,9 @@
   # tools/clang/OWNERS before depending on it.
   'checkout_clang_libs': 'use_rust',
 
+  # Fetch clangd into the same bin/ directory as our clang binary.
+  'checkout_clangd': False,
+
   # Fetch prebuilt and prepackaged Bazel binary/executable. Bazel is currently
   # only needed by `chromium/src/tools/rust/build_crubit.py` and therefore
   # shouldn't be used outside of Chromium Rust Experiments project.
@@ -301,7 +304,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
-  'v8_revision': '2f039eda0b2450272839969e78234cbf99c43a6b',
+  'v8_revision': 'a15821edd7c6f3b89725f3c029b3b73ee5521217',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ANGLE
   # and whatever else without interference from each other.
@@ -309,7 +312,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
-  'swiftshader_revision': '67f88061d2d4fc1e35ce0fbba605a12f3ed7dec9',
+  'swiftshader_revision': 'de53701a121d5c488f7ff3ccbd348dc3e76ad101',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling PDFium
   # and whatever else without interference from each other.
@@ -324,7 +327,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Fuchsia sdk
   # and whatever else without interference from each other.
-  'fuchsia_version': 'version:9.20220824.1.1',
+  'fuchsia_version': 'version:9.20220824.2.1',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling google-toolbox-for-mac
   # and whatever else without interference from each other.
@@ -344,7 +347,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling NaCl
   # and whatever else without interference from each other.
-  'nacl_revision': 'f6af67465fe5c66137f61d3f92e1ed63fac2f87b',
+  'nacl_revision': 'fc84d07f7489f43b99db71ae2d417afba2e8c81f',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling freetype
   # and whatever else without interference from each other.
@@ -368,7 +371,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling catapult
   # and whatever else without interference from each other.
-  'catapult_revision': '9bfc1aede5c2b3c736e89ae1af93660807a16654',
+  'catapult_revision': '5571576cd66841e89180820e062e6b93c4d11c63',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libFuzzer
   # and whatever else without interference from each other.
@@ -412,7 +415,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'dawn_revision': 'cd8f4994249f89bcd762a5ba5eb8626c50f42f10',
+  'dawn_revision': '202362f47db4f81df9dcee8d97a4fef295cf4579',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -440,7 +443,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling nearby
   # and whatever else without interference from each other.
-  'nearby_revision': '01a4daffd286651c408572e0096448d83f1e51f6',
+  'nearby_revision': '6b692c120dcdf34b44d82dc58397ad0f42db1b96',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling securemessage
   # and whatever else without interference from each other.
@@ -456,7 +459,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'libcxxabi_revision':    '3dc2f80d342002ebd8ddf12fb15db460a54dae6c',
+  'libcxxabi_revision':    '48afced8aa251c4fb338fb906d70c1da6703d05d',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -480,7 +483,7 @@
 
   # If you change this, also update the libc++ revision in
   # //buildtools/deps_revisions.gni.
-  'libcxx_revision':       'f30089a416b02dda7b0ee0bdeaa5d608cdd3034a',
+  'libcxx_revision':       '60c266d87cfd8cd7c9a541ea7095ee44a235a3ec',
 
   # GN CIPD package version.
   'gn_version': 'git_revision:0bcd37bd2b83f1a9ee17088037ebdfe6eab6d31a',
@@ -862,7 +865,7 @@
       'packages': [
         {
           'package': 'chromium/rts/model/linux-amd64',
-          'version': 'gGBgt6h50Y-ZcDT7c5-gsoQ5Mqx9JaQBkUY43R1OciwC',
+          'version': '7eU7i-Vr9L92x3du01674VzQoCm_N_v50FHo-9FpIyIC',
         },
       ],
       'dep_type': 'cipd',
@@ -873,7 +876,7 @@
       'packages': [
         {
           'package': 'chromium/rts/model/mac-amd64',
-          'version': '4C-Sl7-k4kuYkCcNirpr3GC3eLSPhSRWypYPDIFdYKMC',
+          'version': '8qeeU6LuQhAJ8B-ByrB_kPIPLhSfqkiIl_kDyTt-thUC',
         },
       ],
       'dep_type': 'cipd',
@@ -884,7 +887,7 @@
       'packages': [
         {
           'package': 'chromium/rts/model/windows-amd64',
-          'version': 'iFc7Jphqj1q21ZnpzyDyBM9PiiNwr9vgtgD4seOAHTUC',
+          'version': 'OIpjzGBsh27JH-OBESqtB6RsIbMhBHEqZisrUKiLXOAC',
         },
       ],
       'dep_type': 'cipd',
@@ -1556,7 +1559,7 @@
     Var('chromium_git') + '/external/github.com/cisco/openh264' + '@' + 'fac04ceb3e966f613ed17e98178e9d690280bba6',
 
   'src/third_party/openscreen/src':
-    Var('chromium_git') + '/openscreen' + '@' + '3042d1b93e5793e2d8db167ae76e7ae6ec786725',
+    Var('chromium_git') + '/openscreen' + '@' + '5528ecf4e6e10cdd5cfc3551dc443c9d403debe8',
 
   'src/third_party/openxr/src': {
     'url': Var('chromium_git') + '/external/github.com/KhronosGroup/OpenXR-SDK' + '@' + 'bf21ccb1007bb531b45d9978919a56ea5059c245',
@@ -1704,7 +1707,7 @@
       'dep_type': 'cipd',
   },
 
-  'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@188a44aaa198bba5bf09109fa98a5ad30d67ef92',
+  'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@bc2e8177d3ca2a079932d11ab82cab79ac931730',
 
   'src/third_party/vulkan_memory_allocator':
     Var('chromium_git') + '/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git' + '@' + 'ebe84bec02c041d28f902da0214bf442743fc907',
@@ -1740,7 +1743,7 @@
     Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + '44e4c8770158c505b03ee7feafa4859d083b0912',
 
   'src/third_party/webgpu-cts/src':
-    Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '119ed996526be390dc70fc92aae1e8b729b30896',
+    Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '7ecbc03b24dc0975fd6e49fc385bae6957e89c5b',
 
   'src/third_party/webrtc':
     Var('webrtc_git') + '/src.git' + '@' + 'a7dcd29c1f503673e92576b1876db15b8e92e4ed',
@@ -1816,7 +1819,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@6ecd2e1a1c478400350a44c9264e4a1f2aa121cc',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@0d33bf0ae30943312ec8003244d972352589c892',
     'condition': 'checkout_src_internal',
   },
 
@@ -3901,6 +3904,15 @@
                '--package=clang-libs'],
   },
   {
+    # This is also supposed to support the same set of platforms as 'clang'
+    # above. LLVM ToT support isn't provided at the moment.
+    'name': 'clangd',
+    'pattern': '.',
+    'condition': 'checkout_clangd',
+    'action': ['python3', 'src/tools/clang/scripts/update.py',
+               '--package=clangd'],
+  },
+  {
     # Build experimental in-tree Rust toolchain. Must run after clang_libs or
     # clang_tot hook. This should only be run on bots. Syncing clang-libs above
     # and passing `--use-final-llvm-build-dir` links rustc against the LLVM libs
diff --git a/android_webview/system_webview_apk_tmpl.gni b/android_webview/system_webview_apk_tmpl.gni
index e5a4ef1..cad1c5d 100644
--- a/android_webview/system_webview_apk_tmpl.gni
+++ b/android_webview/system_webview_apk_tmpl.gni
@@ -272,11 +272,8 @@
       if (!defined(proguard_configs)) {
         proguard_configs = []
       }
-      proguard_configs += [
-        "//android_webview/nonembedded/java/proguard.flags",
-        "//base/android/proguard/chromium_apk.flags",
-        "//base/android/proguard/chromium_code.flags",
-      ]
+      proguard_configs +=
+          [ "//android_webview/nonembedded/java/proguard.flags" ]
       png_to_webp = true
     }
 
diff --git a/ash/BUILD.gn b/ash/BUILD.gn
index 241a0b5..aeff250f 100644
--- a/ash/BUILD.gn
+++ b/ash/BUILD.gn
@@ -536,6 +536,8 @@
     "glanceables/glanceables_weather_view.h",
     "glanceables/glanceables_welcome_label.cc",
     "glanceables/glanceables_welcome_label.h",
+    "glanceables/glanceables_window_hider.cc",
+    "glanceables/glanceables_window_hider.h",
     "high_contrast/high_contrast_controller.cc",
     "high_contrast/high_contrast_controller.h",
     "highlighter/highlighter_controller.cc",
diff --git a/ash/app_list/views/search_box_view.cc b/ash/app_list/views/search_box_view.cc
index 1675fa1..3a74e3d 100644
--- a/ash/app_list/views/search_box_view.cc
+++ b/ash/app_list/views/search_box_view.cc
@@ -876,15 +876,8 @@
 }
 
 void SearchBoxView::UpdateTextColor() {
-  if (is_app_list_bubble_) {
-    // Bubble launcher uses standard text colors (light-on-dark by default).
-    search_box()->SetTextColor(
-        GetColorProvider()->GetColor(cros_tokens::kTextColorPrimary));
-  } else {
-    // Fullscreen launcher uses dark-on-light text by default.
-    search_box()->SetTextColor(
-        GetColorProvider()->GetColor(cros_tokens::kColorPrimaryInverted));
-  }
+  search_box()->SetTextColor(
+      GetColorProvider()->GetColor(cros_tokens::kTextColorPrimary));
 }
 
 void SearchBoxView::UpdatePlaceholderTextAndAccessibleName() {
diff --git a/ash/app_list/views/search_box_view_unittest.cc b/ash/app_list/views/search_box_view_unittest.cc
index ba26a65..a439d61 100644
--- a/ash/app_list/views/search_box_view_unittest.cc
+++ b/ash/app_list/views/search_box_view_unittest.cc
@@ -317,15 +317,9 @@
                          testing::Values(false));
 
 TEST_P(SearchBoxViewTest, SearchBoxTextUsesAppListSearchBoxTextColor) {
-  if (IsProductivityLauncherEnabled()) {
-    // Text should be the primary light color when productivity launcher is
-    // used.
-    EXPECT_EQ(view()->search_box()->GetTextColor(), gfx::kGoogleGrey900);
-  } else {
-    EXPECT_EQ(view()->search_box()->GetTextColor(),
-              AppListColorProvider::Get()->GetSearchBoxTextColor(
-                  kDeprecatedSearchBoxTextDefaultColor));
-  }
+  // With darklight mode enabled by default, search box text color should be the
+  // same with and without productivity launcher enabled.
+  EXPECT_EQ(view()->search_box()->GetTextColor(), gfx::kGoogleGrey900);
 }
 
 // Tests that the close button is invisible by default.
diff --git a/ash/components/arc/mojom/app.mojom b/ash/components/arc/mojom/app.mojom
index 1901a34..c686e5a 100644
--- a/ash/components/arc/mojom/app.mojom
+++ b/ash/components/arc/mojom/app.mojom
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
-// Next MinVersion: 53
+// Next MinVersion: 54
 
 module arc.mojom;
 
@@ -304,6 +304,21 @@
     TIMEOUT = 9,
 };
 
+// Names and values match the CATEGORY_ constants on
+// android.content.pm.ApplicationInfo.
+enum AppCategory {
+  kUndefined = -1,
+  kGame = 0,
+  kAudio = 1,
+  kVideo = 2,
+  kImage = 3,
+  kSocial = 4,
+  kNews = 5,
+  kMaps = 6,
+  kProductivity = 7,
+  kAccessibility = 8,
+};
+
 // Next method ID: 19
 // Deprecated method IDs: 1
 interface AppHost {
@@ -390,7 +405,7 @@
 };
 
 // TODO(lhchavez): Migrate all request/response messages to Mojo.
-// Next method ID: 40
+// Next method ID: 42
 // Deprecated method IDs: 0, 1, 2, 3, 4, 9, 12, 13, 15, 17, 18, 19, 22
 interface AppInstance {
   // Establishes full-duplex communication with the host.
@@ -545,4 +560,11 @@
   // it isn't available in the user's store.
   [MinVersion=43] IsInstallable@34(string package_name) =>
       (bool is_installable);
+
+  // Returns the app category of the given package. Corresponds to |category|
+  // field on android.content.pm.ApplicationInfo.
+  // Returns kUndefined if the package is not found or if the package does not
+  // declare an app category.
+  [MinVersion=53] GetAppCategory@41(string package_name) =>
+      (AppCategory category);
 };
diff --git a/ash/components/arc/test/fake_app_instance.cc b/ash/components/arc/test/fake_app_instance.cc
index 58505fe..06c949e 100644
--- a/ash/components/arc/test/fake_app_instance.cc
+++ b/ash/components/arc/test/fake_app_instance.cc
@@ -505,6 +505,15 @@
   std::move(callback).Run(is_installable_);
 }
 
+void FakeAppInstance::GetAppCategory(const std::string& package_name,
+                                     GetAppCategoryCallback callback) {
+  auto itr = pkg_name_to_app_category_.find(package_name);
+  auto category = mojom::AppCategory::kUndefined;
+
+  if (itr != pkg_name_to_app_category_.end()) category = itr->second;
+  std::move(callback).Run(category);
+}
+
 void FakeAppInstance::LaunchIntentWithWindowInfo(
     const std::string& intent_uri,
     arc::mojom::WindowInfoPtr window_info) {
diff --git a/ash/components/arc/test/fake_app_instance.h b/ash/components/arc/test/fake_app_instance.h
index df6bb84..8efbdfe 100644
--- a/ash/components/arc/test/fake_app_instance.h
+++ b/ash/components/arc/test/fake_app_instance.h
@@ -175,6 +175,8 @@
   void RequestAssistStructure(RequestAssistStructureCallback callback) override;
   void IsInstallable(const std::string& package_name,
                      IsInstallableCallback callback) override;
+  void GetAppCategory(const std::string& package_name,
+                      GetAppCategoryCallback callback) override;
 
   // Methods to reply messages.
   void SendRefreshAppList(const std::vector<mojom::AppInfoPtr>& apps);
@@ -263,6 +265,11 @@
     is_installable_ = is_installable;
   }
 
+  void set_app_category_of_pkg(
+      std::string_view pkg_name, mojom::AppCategory category) {
+    pkg_name_to_app_category_[std::string(pkg_name)] = category;
+  }
+
  private:
   using TaskIdToInfo = std::map<int32_t, std::unique_ptr<Request>>;
 
@@ -300,6 +307,8 @@
       IconResponseType::ICON_RESPONSE_SEND_GOOD;
   // Keeps latest generated icons per icon dimension.
   std::map<int, std::string> icon_responses_;
+  // Stores information for serving GetAppCategory calls.
+  std::map<std::string, mojom::AppCategory> pkg_name_to_app_category_;
 
   bool is_installable_ = false;
 
diff --git a/ash/components/settings/cros_settings_names.cc b/ash/components/settings/cros_settings_names.cc
index 6ad2eefa2..8c3c2d53 100644
--- a/ash/components/settings/cros_settings_names.cc
+++ b/ash/components/settings/cros_settings_names.cc
@@ -273,6 +273,10 @@
 const char kReportDeviceAudioStatusCheckingRateMs[] =
     "cros.telemetry_reporting.report_device_audio_status_checking_rate_ms";
 
+// How frequently the audio data are checked for events.
+const char kReportDeviceSignalStrengthEventDrivenTelemetry[] =
+    "cros.telemetry_reporting.report_signal_strength_event_driven_telemetry";
+
 // This policy should not appear in the protobuf ever but is used internally to
 // signal that we are running in a "safe-mode" for policy recovery.
 const char kPolicyMissingMitigationMode[] =
diff --git a/ash/components/settings/cros_settings_names.h b/ash/components/settings/cros_settings_names.h
index 28308e3e..e75584e 100644
--- a/ash/components/settings/cros_settings_names.h
+++ b/ash/components/settings/cros_settings_names.h
@@ -142,6 +142,8 @@
 extern const char kReportDeviceNetworkTelemetryEventCheckingRateMs[];
 COMPONENT_EXPORT(ASH_SETTINGS)
 extern const char kReportDeviceAudioStatusCheckingRateMs[];
+COMPONENT_EXPORT(ASH_SETTINGS)
+extern const char kReportDeviceSignalStrengthEventDrivenTelemetry[];
 
 COMPONENT_EXPORT(ASH_SETTINGS) extern const char kHeartbeatEnabled[];
 COMPONENT_EXPORT(ASH_SETTINGS) extern const char kHeartbeatFrequency[];
diff --git a/ash/constants/ash_features.cc b/ash/constants/ash_features.cc
index 507d5735..5dd013d 100644
--- a/ash/constants/ash_features.cc
+++ b/ash/constants/ash_features.cc
@@ -1728,7 +1728,7 @@
 // on ChromeOS.
 const base::Feature kDeviceActiveClientMonthlyCheckMembership{
     "DeviceActiveClientMonthlyCheckMembership",
-    base::FEATURE_ENABLED_BY_DEFAULT};
+    base::FEATURE_DISABLED_BY_DEFAULT};
 
 // Enables or disables forced reboots when DeviceScheduledReboot policy is set.
 const base::Feature kDeviceForceScheduledReboot{
diff --git a/ash/glanceables/glanceables_controller.cc b/ash/glanceables/glanceables_controller.cc
index 1493a3b..50342a8 100644
--- a/ash/glanceables/glanceables_controller.cc
+++ b/ash/glanceables/glanceables_controller.cc
@@ -10,6 +10,7 @@
 #include "ash/ambient/ambient_weather_controller.h"
 #include "ash/glanceables/glanceables_delegate.h"
 #include "ash/glanceables/glanceables_view.h"
+#include "ash/glanceables/glanceables_window_hider.h"
 #include "ash/public/cpp/shell_window_ids.h"
 #include "ash/shell.h"
 #include "ash/wm/desks/desks_util.h"
@@ -56,7 +57,8 @@
 }
 
 void GlanceablesController::ShowFromOverview() {
-  // TODO(crbug.com/1353119): Hide or minimize all open windows.
+  // Hide any open windows.
+  window_hider_ = std::make_unique<GlanceablesWindowHider>();
   CreateUi();
   FetchData();
 }
@@ -91,6 +93,7 @@
 void GlanceablesController::DestroyUi() {
   widget_.reset();
   view_ = nullptr;
+  window_hider_.reset();  // Show hidden windows.
 }
 
 void GlanceablesController::RestoreSession() {
diff --git a/ash/glanceables/glanceables_controller.h b/ash/glanceables/glanceables_controller.h
index cca3024..24387a9 100644
--- a/ash/glanceables/glanceables_controller.h
+++ b/ash/glanceables/glanceables_controller.h
@@ -18,6 +18,7 @@
 
 class GlanceablesDelegate;
 class GlanceablesView;
+class GlanceablesWindowHider;
 
 // Controls the "welcome back" glanceables screen shown on login.
 class ASH_EXPORT GlanceablesController : public wm::ActivationChangeObserver {
@@ -62,6 +63,9 @@
   std::unique_ptr<GlanceablesDelegate> delegate_;
   std::unique_ptr<views::Widget> widget_;
   GlanceablesView* view_ = nullptr;
+
+  // Hides windows while glanceables are showing.
+  std::unique_ptr<GlanceablesWindowHider> window_hider_;
 };
 
 }  // namespace ash
diff --git a/ash/glanceables/glanceables_unittests.cc b/ash/glanceables/glanceables_unittests.cc
index 2628664..02cad48 100644
--- a/ash/glanceables/glanceables_unittests.cc
+++ b/ash/glanceables/glanceables_unittests.cc
@@ -21,6 +21,7 @@
 #include "ash/wm/desks/desks_bar_view.h"
 #include "ash/wm/desks/desks_test_util.h"
 #include "ash/wm/overview/overview_controller.h"
+#include "ash/wm/window_state.h"
 #include "base/test/scoped_feature_list.h"
 #include "ui/events/test/test_event.h"
 #include "ui/gfx/image/image_unittest_util.h"
@@ -206,4 +207,58 @@
   EXPECT_FALSE(Shell::Get()->overview_controller()->InOverviewSession());
 }
 
+TEST_F(GlanceablesTest, ShowFromOverviewHidesAppWindows) {
+  // Create windows, back to front.
+  std::unique_ptr<aura::Window> back_window = CreateAppWindow();
+  std::unique_ptr<aura::Window> middle_window = CreateAppWindow();
+  std::unique_ptr<aura::Window> minimized_window = CreateAppWindow();
+  WindowState::Get(minimized_window.get())->Minimize();
+  std::unique_ptr<aura::Window> front_window = CreateAppWindow();
+
+  controller_->ShowFromOverview();
+
+  // All windows are minimized.
+  EXPECT_TRUE(WindowState::Get(back_window.get())->IsMinimized());
+  EXPECT_TRUE(WindowState::Get(middle_window.get())->IsMinimized());
+  EXPECT_TRUE(WindowState::Get(minimized_window.get())->IsMinimized());
+  EXPECT_TRUE(WindowState::Get(front_window.get())->IsMinimized());
+
+  // Destroy the middle window.
+  middle_window.reset();
+
+  // Hide glanceables.
+  controller_->DestroyUi();
+
+  // Front and back windows are restored.
+  EXPECT_TRUE(WindowState::Get(back_window.get())->IsNormalStateType());
+  EXPECT_TRUE(WindowState::Get(front_window.get())->IsNormalStateType());
+
+  // The originally minimized window is still minimized.
+  EXPECT_TRUE(WindowState::Get(minimized_window.get())->IsMinimized());
+
+  // The front window is still frontmost (at the end of the child list).
+  EXPECT_EQ(front_window->parent()->children().back(), front_window.get());
+}
+
+TEST_F(GlanceablesTest, UnminimizingOneWindowRestoresAllWindows) {
+  std::unique_ptr<aura::Window> back_window = CreateAppWindow();
+  std::unique_ptr<aura::Window> front_window = CreateAppWindow();
+
+  controller_->ShowFromOverview();
+
+  EXPECT_TRUE(WindowState::Get(back_window.get())->IsMinimized());
+  EXPECT_TRUE(WindowState::Get(front_window.get())->IsMinimized());
+
+  // Restore and activate the front window.
+  WindowState::Get(front_window.get())->Unminimize();
+  WindowState::Get(front_window.get())->Activate();
+
+  // Window activation closed glanceables.
+  EXPECT_FALSE(controller_->IsShowing());
+
+  // Both windows are restored.
+  EXPECT_TRUE(WindowState::Get(back_window.get())->IsNormalStateType());
+  EXPECT_TRUE(WindowState::Get(front_window.get())->IsNormalStateType());
+}
+
 }  // namespace ash
diff --git a/ash/glanceables/glanceables_window_hider.cc b/ash/glanceables/glanceables_window_hider.cc
new file mode 100644
index 0000000..049d747
--- /dev/null
+++ b/ash/glanceables/glanceables_window_hider.cc
@@ -0,0 +1,55 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ash/glanceables/glanceables_window_hider.h"
+
+#include "ash/shell.h"
+#include "ash/wm/mru_window_tracker.h"
+#include "ash/wm/window_state.h"
+#include "base/containers/adapters.h"
+#include "base/containers/cxx20_erase_vector.h"
+
+namespace ash {
+
+GlanceablesWindowHider::GlanceablesWindowHider() {
+  std::vector<aura::Window*> windows =
+      Shell::Get()->mru_window_tracker()->BuildWindowListIgnoreModal(
+          kActiveDesk);
+
+  // Process the windows from back to front, so that minimizing the windows
+  // doesn't change the stacking order.
+  for (aura::Window* window : base::Reversed(windows)) {
+    WindowState* window_state = WindowState::Get(window);
+
+    // Ignore windows that are already minimized.
+    if (window_state->IsMinimized())
+      continue;
+
+    window->AddObserver(this);
+    windows_.push_back(window);
+
+    window_state->Minimize();
+  }
+}
+
+GlanceablesWindowHider::~GlanceablesWindowHider() {
+  // `windows_` is stored back-to-front, so unminimizing in order will restore
+  // the stacking order.
+  for (aura::Window* window : windows_) {
+    window->RemoveObserver(this);
+    WindowState* window_state = WindowState::Get(window);
+    // Window might not be minimized if the user manually restored it.
+    if (window_state->IsMinimized()) {
+      window_state->Unminimize();
+    }
+  }
+}
+
+void GlanceablesWindowHider::OnWindowDestroying(aura::Window* window) {
+  // aura::Window removes observers on window destruction, so no need to remove
+  // the observer here.
+  base::Erase(windows_, window);
+}
+
+}  // namespace ash
diff --git a/ash/glanceables/glanceables_window_hider.h b/ash/glanceables/glanceables_window_hider.h
new file mode 100644
index 0000000..03dcdec
--- /dev/null
+++ b/ash/glanceables/glanceables_window_hider.h
@@ -0,0 +1,35 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef ASH_GLANCEABLES_GLANCEABLES_WINDOW_HIDER_H_
+#define ASH_GLANCEABLES_GLANCEABLES_WINDOW_HIDER_H_
+
+#include <vector>
+
+#include "ash/ash_export.h"
+#include "ui/aura/window_observer.h"
+
+namespace ash {
+
+// Scoped object that hides all windows in the MRU list when created. Restores
+// all the windows when deallocated. Implements aura::WindowObserver to detect
+// when windows are destroyed while hidden.
+class ASH_EXPORT GlanceablesWindowHider : public aura::WindowObserver {
+ public:
+  GlanceablesWindowHider();
+  GlanceablesWindowHider(const GlanceablesWindowHider&) = delete;
+  GlanceablesWindowHider& operator=(const GlanceablesWindowHider&) = delete;
+  ~GlanceablesWindowHider() override;
+
+  // aura::WindowObserver:
+  void OnWindowDestroying(aura::Window* window) override;
+
+ private:
+  // Windows are stored in stacking order, lowest window in front.
+  std::vector<aura::Window*> windows_;
+};
+
+}  // namespace ash
+
+#endif  // ASH_GLANCEABLES_GLANCEABLES_WINDOW_HIDER_H_
diff --git a/ash/public/cpp/feature_discovery_duration_reporter.h b/ash/public/cpp/feature_discovery_duration_reporter.h
index 5db4a3b..2382aba 100644
--- a/ash/public/cpp/feature_discovery_duration_reporter.h
+++ b/ash/public/cpp/feature_discovery_duration_reporter.h
@@ -12,7 +12,7 @@
 
 namespace feature_discovery {
 enum class TrackableFeature;
-};  // namespace feature_discovery
+}  // namespace feature_discovery
 
 // A singleton class that records feature discovery duration when the following
 // conditions are met:
diff --git a/ash/public/cpp/test/mock_in_session_auth_token_provider.cc b/ash/public/cpp/test/mock_in_session_auth_token_provider.cc
index c9daf096..5ff8b22 100644
--- a/ash/public/cpp/test/mock_in_session_auth_token_provider.cc
+++ b/ash/public/cpp/test/mock_in_session_auth_token_provider.cc
@@ -10,4 +10,4 @@
 
 MockInSessionAuthTokenProvider::~MockInSessionAuthTokenProvider() = default;
 
-};  // namespace ash
+}  // namespace ash
diff --git a/ash/rgb_keyboard/rgb_keyboard_manager_unittest.cc b/ash/rgb_keyboard/rgb_keyboard_manager_unittest.cc
index f1d8cf4..fc67f4c4d 100644
--- a/ash/rgb_keyboard/rgb_keyboard_manager_unittest.cc
+++ b/ash/rgb_keyboard/rgb_keyboard_manager_unittest.cc
@@ -46,7 +46,7 @@
     manager_.reset();
     RgbkbdClient::Shutdown();
     ime_controller_.reset();
-  };
+  }
 
  protected:
   void InitializeManagerWithCapability(
diff --git a/ash/search_box/search_box_view_base.cc b/ash/search_box/search_box_view_base.cc
index d61c873..3f25d2e 100644
--- a/ash/search_box/search_box_view_base.cc
+++ b/ash/search_box/search_box_view_base.cc
@@ -249,7 +249,7 @@
     size.Enlarge(insets.width(), insets.height());
     size.SetToMax(gfx::Size(0, 0));
     return size;
-  };
+  }
 
   void OnFocus() override {
     search_box_view_->OnSearchBoxFocusedChanged();
diff --git a/ash/shelf/shelf_view.cc b/ash/shelf/shelf_view.cc
index a26ea44a..62ddb90 100644
--- a/ash/shelf/shelf_view.cc
+++ b/ash/shelf/shelf_view.cc
@@ -922,8 +922,6 @@
   const int button_spacing = ShelfConfig::Get()->button_spacing();
   UpdateSeparatorIndex();
 
-  const int hotseat_size = shelf_->hotseat_widget()->GetHotseatSize();
-
   // Don't show the separator if it isn't needed, or would appear after all
   // visible items.
   separator_->SetVisible(separator_index_.has_value() &&
@@ -976,22 +974,6 @@
     } else {
       view_model_->set_ideal_bounds(i, gfx::Rect(x, y, 0, 0));
     }
-
-    if (i == separator_index_) {
-      // Place the separator halfway between the two icons it separates,
-      // vertically centered.
-      int half_space = button_spacing / 2;
-      int secondary_offset = (hotseat_size - kSeparatorSize) / 2;
-      x -= shelf()->PrimaryAxisValue(half_space, 0);
-      y -= shelf()->PrimaryAxisValue(0, half_space);
-      separator_->SetBounds(
-          x + shelf()->PrimaryAxisValue(0, secondary_offset),
-          y + shelf()->PrimaryAxisValue(secondary_offset, 0),
-          shelf()->PrimaryAxisValue(kSeparatorThickness, kSeparatorSize),
-          shelf()->PrimaryAxisValue(kSeparatorSize, kSeparatorThickness));
-      x += shelf()->PrimaryAxisValue(half_space, 0);
-      y += shelf()->PrimaryAxisValue(0, half_space);
-    }
   }
 }
 
@@ -1372,6 +1354,7 @@
 
   CalculateIdealBounds();
   views::ViewModelUtils::SetViewBoundsToIdealBounds(*view_model_);
+  UpdateSeparatorBounds(/*animate=*/false);
   UpdateVisibleShelfItemBoundsUnion();
 }
 
@@ -1403,9 +1386,42 @@
     // padding of the first gets properly transferred to the new first item.
     view->SetBorder(nullptr);
   }
+
+  UpdateSeparatorBounds(/*animate=*/true);
   UpdateVisibleShelfItemBoundsUnion();
 }
 
+void ShelfView::UpdateSeparatorBounds(bool animate) {
+  if (!separator_index_.has_value() ||
+      separator_index_ >= view_model_->view_size()) {
+    return;
+  }
+
+  gfx::Rect icon_bounds_beside_separator =
+      view_model_->ideal_bounds(separator_index_.value());
+
+  // Calculate the position value on the secondary axis.
+  int secondary_offset =
+      (shelf_->hotseat_widget()->GetHotseatSize() - kSeparatorSize) / 2;
+
+  int separator_x =
+      shelf()->PrimaryAxisValue(icon_bounds_beside_separator.right() +
+                                    ShelfConfig::Get()->button_spacing() / 2,
+                                secondary_offset);
+  int separator_y = shelf()->PrimaryAxisValue(
+      secondary_offset, icon_bounds_beside_separator.bottom() +
+                            ShelfConfig::Get()->button_spacing() / 2);
+  gfx::Rect separator_bounds(
+      separator_x, separator_y,
+      shelf()->PrimaryAxisValue(kSeparatorThickness, kSeparatorSize),
+      shelf()->PrimaryAxisValue(kSeparatorSize, kSeparatorThickness));
+
+  if (animate)
+    bounds_animator_->AnimateViewTo(separator_, separator_bounds);
+  else
+    separator_->SetBoundsRect(separator_bounds);
+}
+
 void ShelfView::FadeIn(views::View* view) {
   view->SetVisible(true);
   view->layer()->SetOpacity(0);
@@ -1573,10 +1589,13 @@
     int ideal_bound_position = shelf()->PrimaryAxisValue(
         ideal_bound_center.x(), ideal_bound_center.y());
 
+    RelativePosition old_relative_position =
+        drag_view_relative_to_ideal_bounds_;
     drag_view_relative_to_ideal_bounds_ =
         drag_view_position < ideal_bound_position ? RelativePosition::kLeft
                                                   : RelativePosition::kRight;
-    if (target_index == current_item_index) {
+    if (target_index == current_item_index &&
+        old_relative_position != drag_view_relative_to_ideal_bounds_) {
       AnimateToIdealBounds();
       NotifyAccessibilityEvent(ax::mojom::Event::kChildrenChanged,
                                true /* send_native_event */);
diff --git a/ash/shelf/shelf_view.h b/ash/shelf/shelf_view.h
index dd58b8b..d2f6cafb 100644
--- a/ash/shelf/shelf_view.h
+++ b/ash/shelf/shelf_view.h
@@ -378,6 +378,10 @@
   // Animates the bounds of each view to its ideal bounds.
   void AnimateToIdealBounds();
 
+  // Animates the separator to its ideal bounds if `animate` is true, or sets
+  // the bounds directly otherwise.
+  void UpdateSeparatorBounds(bool animate);
+
   // Fades |view| from an opacity of 0 to 1. This is when adding a new item.
   void FadeIn(views::View* view);
 
diff --git a/ash/system/accessibility/dictation_bubble_controller.cc b/ash/system/accessibility/dictation_bubble_controller.cc
index a3cbec6..a14c2bf 100644
--- a/ash/system/accessibility/dictation_bubble_controller.cc
+++ b/ash/system/accessibility/dictation_bubble_controller.cc
@@ -65,6 +65,9 @@
 }
 
 void DictationBubbleController::OnViewIsDeleting(views::View* observed_view) {
+  if (observed_view != dictation_bubble_view_)
+    return;
+  dictation_bubble_view_->views::View::RemoveObserver(this);
   dictation_bubble_view_ = nullptr;
   widget_ = nullptr;
 }
diff --git a/ash/system/ime_menu/ime_menu_tray.cc b/ash/system/ime_menu/ime_menu_tray.cc
index b8c194e3..6870523 100644
--- a/ash/system/ime_menu/ime_menu_tray.cc
+++ b/ash/system/ime_menu/ime_menu_tray.cc
@@ -210,6 +210,7 @@
     const int kImeKeysetUmaBoundary = 4;
     UMA_HISTOGRAM_ENUMERATION("InputMethod.ImeMenu.EmojiHandwritingVoiceButton",
                               keyset, kImeKeysetUmaBoundary);
+
     // The |keyset| will be used for drawing input view keyset in IME
     // extensions. ImeMenuTray::ShowKeyboardWithKeyset() will deal with
     // the |keyset| string to generate the right input view url.
@@ -232,8 +233,10 @@
 
     if (show_emoji) {
       emoji_button_ = new SystemMenuButton(
-          base::BindRepeating(&ui::ShowEmojiPanel), kImeMenuEmoticonIcon,
-          IDS_ASH_STATUS_TRAY_IME_EMOJI);
+          base::BindRepeating(&ImeButtonsView::KeysetButtonPressed,
+                              base::Unretained(this),
+                              input_method::ImeKeyset::kEmoji),
+          kImeMenuEmoticonIcon, IDS_ASH_STATUS_TRAY_IME_EMOJI);
       emoji_button_->SetID(kEmojiButtonId);
       AddChildView(emoji_button_);
     }
@@ -396,10 +399,16 @@
 void ImeMenuTray::ShowKeyboardWithKeyset(input_method::ImeKeyset keyset) {
   CloseBubble();
 
-  Shell::Get()
-      ->keyboard_controller()
-      ->virtual_keyboard_controller()
-      ->ForceShowKeyboardWithKeyset(keyset);
+  // Show emoji in the same way as other means of opening and showing emoji
+  // for laptop and tablet mode.
+  if (keyset == input_method::ImeKeyset::kEmoji) {
+    ui::ShowEmojiPanel();
+  } else {
+    Shell::Get()
+        ->keyboard_controller()
+        ->virtual_keyboard_controller()
+        ->ForceShowKeyboardWithKeyset(keyset);
+  }
 }
 
 bool ImeMenuTray::ShouldShowBottomButtons() {
diff --git a/ash/system/ime_menu/ime_menu_tray_unittest.cc b/ash/system/ime_menu/ime_menu_tray_unittest.cc
index bfccce6..bdedc53b 100644
--- a/ash/system/ime_menu/ime_menu_tray_unittest.cc
+++ b/ash/system/ime_menu/ime_menu_tray_unittest.cc
@@ -381,6 +381,9 @@
   ASSERT_TRUE(emoji_button);
   emoji_button->OnGestureEvent(&tap);
 
+  // The menu should be hidden.
+  EXPECT_FALSE(IsBubbleShown());
+
   // The callback should have been called.
   EXPECT_EQ(callCount, 1);
 
diff --git a/ash/system/keyboard_brightness/keyboard_backlight_color_controller.h b/ash/system/keyboard_brightness/keyboard_backlight_color_controller.h
index 5062fd3..88e5ad98 100644
--- a/ash/system/keyboard_brightness/keyboard_backlight_color_controller.h
+++ b/ash/system/keyboard_brightness/keyboard_backlight_color_controller.h
@@ -56,7 +56,7 @@
   KeyboardBacklightColorNudgeController*
   keyboard_backlight_color_nudge_controller() {
     return keyboard_backlight_color_nudge_controller_.get();
-  };
+  }
 
  private:
   friend class KeyboardBacklightColorControllerTest;
diff --git a/ash/system/network/fake_network_list_mobile_header_view.cc b/ash/system/network/fake_network_list_mobile_header_view.cc
index 8bdd951..c9b7b338 100644
--- a/ash/system/network/fake_network_list_mobile_header_view.cc
+++ b/ash/system/network/fake_network_list_mobile_header_view.cc
@@ -21,13 +21,13 @@
   is_toggle_enabled_ = enabled;
   is_toggle_on_ = is_on;
   set_toggle_state_count_++;
-};
+}
 
 void FakeNetworkListMobileHeaderView::SetAddESimButtonState(bool enabled,
                                                             bool visible) {
   is_add_esim_enabled_ = enabled;
   is_add_esim_visible_ = visible;
   set_add_esim_button_state_count_++;
-};
+}
 
-}  // namespace ash
\ No newline at end of file
+}  // namespace ash
diff --git a/ash/system/network/fake_network_list_wifi_header_view.cc b/ash/system/network/fake_network_list_wifi_header_view.cc
index 61c20af..d1098bb 100644
--- a/ash/system/network/fake_network_list_wifi_header_view.cc
+++ b/ash/system/network/fake_network_list_wifi_header_view.cc
@@ -21,13 +21,13 @@
   is_toggle_enabled_ = enabled;
   is_toggle_on_ = is_on;
   set_toggle_state_count_++;
-};
+}
 
 void FakeNetworkListWifiHeaderView::SetJoinWifiButtonState(bool enabled,
                                                            bool visible) {
   is_join_wifi_enabled_ = enabled;
   is_join_wifi_visible_ = visible;
   set_join_wifi_button_state_count_++;
-};
+}
 
-}  // namespace ash
\ No newline at end of file
+}  // namespace ash
diff --git a/ash/system/network/network_detailed_network_view_unittest.cc b/ash/system/network/network_detailed_network_view_unittest.cc
index 438779f..57df90f5 100644
--- a/ash/system/network/network_detailed_network_view_unittest.cc
+++ b/ash/system/network/network_detailed_network_view_unittest.cc
@@ -66,18 +66,18 @@
       const NetworkStatePropertiesPtr& network) override {
     network_list_item_selected_count_++;
     last_network_list_item_selected_ = mojo::Clone(network);
-  };
+  }
 
   // NetworkDetailedNetworkView::Delegate:
   void OnWifiToggleClicked(bool new_state) override {
     on_wifi_toggle_clicked_count_++;
     last_wifi_toggle_state_ = new_state;
-  };
+  }
 
   void OnMobileToggleClicked(bool new_state) override {
     on_mobile_toggle_clicked_count_++;
     last_mobile_toggle_state_ = new_state;
-  };
+  }
 
   const NetworkStatePropertiesPtr& last_network_list_item_selected() const {
     return last_network_list_item_selected_;
diff --git a/ash/system/network/network_list_mobile_header_view_impl.cc b/ash/system/network/network_list_mobile_header_view_impl.cc
index 91f5a6a..27098b84 100644
--- a/ash/system/network/network_list_mobile_header_view_impl.cc
+++ b/ash/system/network/network_list_mobile_header_view_impl.cc
@@ -86,7 +86,7 @@
   add_esim_button_ = add_esim_button.get();
   container()->AddViewAt(TriView::Container::END, add_esim_button.release(),
                          /*index=*/0);
-};
+}
 
 void NetworkListMobileHeaderViewImpl::OnToggleToggled(bool is_on) {
   delegate()->OnMobileToggleClicked(is_on);
@@ -115,4 +115,4 @@
       l10n_util::GetStringUTF16(GetAddESimTooltipMessageId()));
 }
 
-}  // namespace ash
\ No newline at end of file
+}  // namespace ash
diff --git a/ash/system/network/network_list_network_header_view.h b/ash/system/network/network_list_network_header_view.h
index f68bb1e..a1a75a8 100644
--- a/ash/system/network/network_list_network_header_view.h
+++ b/ash/system/network/network_list_network_header_view.h
@@ -48,7 +48,7 @@
   // enabled/disable their respective technology.
   virtual void OnToggleToggled(bool is_on);
 
-  Delegate* delegate() const { return delegate_; };
+  Delegate* delegate() const { return delegate_; }
 
   TrayNetworkStateModel* model() { return model_; }
 
diff --git a/ash/system/network/network_list_view_controller_impl.cc b/ash/system/network/network_list_view_controller_impl.cc
index 1ed619c..9bc7763 100644
--- a/ash/system/network/network_list_view_controller_impl.cc
+++ b/ash/system/network/network_list_view_controller_impl.cc
@@ -149,7 +149,7 @@
 
 void NetworkListViewControllerImpl::GlobalPolicyChanged() {
   UpdateMobileSection();
-};
+}
 
 void NetworkListViewControllerImpl::OnPropertiesUpdated(
     BluetoothSystemPropertiesPtr properties) {
diff --git a/ash/system/network/network_list_wifi_header_view_impl.cc b/ash/system/network/network_list_wifi_header_view_impl.cc
index b38be945..8e609b4 100644
--- a/ash/system/network/network_list_wifi_header_view_impl.cc
+++ b/ash/system/network/network_list_wifi_header_view_impl.cc
@@ -48,7 +48,7 @@
   join_wifi_button_ = join_wifi_button.get();
   container()->AddViewAt(TriView::Container::END, join_wifi_button.release(),
                          /*index=*/0);
-};
+}
 
 void NetworkListWifiHeaderViewImpl::SetToggleState(bool enabled,
                                                    bool is_on,
@@ -78,4 +78,4 @@
   join_wifi_button_->SetVisible(visible);
 }
 
-}  // namespace ash
\ No newline at end of file
+}  // namespace ash
diff --git a/ash/system/privacy_hub/camera_privacy_switch_controller.cc b/ash/system/privacy_hub/camera_privacy_switch_controller.cc
index fe991ec..ad7ffe8 100644
--- a/ash/system/privacy_hub/camera_privacy_switch_controller.cc
+++ b/ash/system/privacy_hub/camera_privacy_switch_controller.cc
@@ -83,7 +83,7 @@
 
   return allowed ? CameraSWPrivacySwitchSetting::kEnabled
                  : CameraSWPrivacySwitchSetting::kDisabled;
-};
+}
 
 void CameraPrivacySwitchController::SetCameraPrivacySwitchAPIForTest(
     std::unique_ptr<CameraPrivacySwitchAPI> switch_api) {
diff --git a/ash/system/unified/deferred_update_dialog.cc b/ash/system/unified/deferred_update_dialog.cc
index 6e08c79..9ece616f 100644
--- a/ash/system/unified/deferred_update_dialog.cc
+++ b/ash/system/unified/deferred_update_dialog.cc
@@ -48,7 +48,7 @@
               base::BindOnce(&DeferredUpdateDialog::OnContinueWithoutUpdate,
                              base::Unretained(dialog_)),
               l10n_util::GetStringUTF16(cancel_text))
-          .AddBodyText(ui::DialogModelLabel(
+          .AddParagraph(ui::DialogModelLabel(
               l10n_util::GetStringUTF16(IDS_DEFERRED_UPDATE_DIALOG_TEXT)))
           .AddCheckbox(kAutoUpdateCheckboxId,
                        ui::DialogModelLabel(l10n_util::GetStringUTF16(
@@ -113,4 +113,4 @@
   dialog_ = nullptr;
 }
 
-}  // namespace ash
\ No newline at end of file
+}  // namespace ash
diff --git a/ash/webui/diagnostics_ui/backend/session_log_handler_unittest.cc b/ash/webui/diagnostics_ui/backend/session_log_handler_unittest.cc
index 2c3991b1..138087e 100644
--- a/ash/webui/diagnostics_ui/backend/session_log_handler_unittest.cc
+++ b/ash/webui/diagnostics_ui/backend/session_log_handler_unittest.cc
@@ -21,8 +21,6 @@
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/files/scoped_temp_dir.h"
-#include "base/memory/ptr_util.h"
-#include "base/strings/strcat.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
 #include "base/test/bind.h"
@@ -43,8 +41,7 @@
 #include "ash/test/ash_test_suite.h"
 #include "ui/base/resource/resource_bundle.h"
 
-namespace ash {
-namespace diagnostics {
+namespace ash::diagnostics {
 namespace {
 
 constexpr char kHandlerFunctionName[] = "handlerFunctionName";
@@ -176,9 +173,7 @@
   SessionLogHandlerTest()
       : NoSessionAshTestBase(
             base::test::TaskEnvironment::TimeSource::MOCK_TIME),
-        task_runner_(new base::TestSimpleTaskRunner()),
-        web_ui_(),
-        session_log_handler_() {}
+        task_runner_(new base::TestSimpleTaskRunner()) {}
   ~SessionLogHandlerTest() override = default;
 
   void SetUp() override {
@@ -236,8 +231,10 @@
   testing::NiceMock<ash::MockHoldingSpaceClient> holding_space_client_;
 };
 
-// Flaky; see crbug.com/1336726
-TEST_F(SessionLogHandlerTest, DISABLED_SaveSessionLog) {
+TEST_F(SessionLogHandlerTest, SaveSessionLog) {
+  // Run until idle to finish necessary setup.
+  task_environment()->RunUntilIdle();
+
   base::RunLoop run_loop;
   // Populate routine log
   routine_log_->LogRoutineStarted(mojom::RoutineType::kCpuStress);
@@ -447,5 +444,4 @@
   EXPECT_NO_FATAL_FAILURE(task_runner_->RunUntilIdle());
 }
 
-}  // namespace diagnostics
-}  // namespace ash
+}  // namespace ash::diagnostics
diff --git a/ash/webui/os_feedback_ui/backend/feedback_service_provider.cc b/ash/webui/os_feedback_ui/backend/feedback_service_provider.cc
index 30ffef8..1c9bd8a 100644
--- a/ash/webui/os_feedback_ui/backend/feedback_service_provider.cc
+++ b/ash/webui/os_feedback_ui/backend/feedback_service_provider.cc
@@ -22,15 +22,43 @@
 using ::ash::os_feedback_ui::mojom::ReportPtr;
 using ::ash::os_feedback_ui::mojom::SendReportStatus;
 
+void EmitTimeOnEachPageMetrics(
+    bool feedback_sent,
+    const base::Time app_open_timestamp_,
+    const base::Time share_data_page_open_timestamp_,
+    const base::Time share_data_page_close_timestamp_) {
+  if (feedback_sent) {
+    const base::TimeDelta search_page_open_duration =
+        share_data_page_open_timestamp_ - app_open_timestamp_;
+    const base::TimeDelta share_data_page_open_duration =
+        share_data_page_close_timestamp_ - share_data_page_open_timestamp_;
+    const base::TimeDelta confirmation_page_open_duration =
+        base::Time::Now() - share_data_page_close_timestamp_;
+
+    os_feedback_ui::metrics::EmitFeedbackAppTimeOnSearchPage(
+        search_page_open_duration);
+    os_feedback_ui::metrics::EmitFeedbackAppTimeOnShareDataPage(
+        share_data_page_open_duration);
+    os_feedback_ui::metrics::EmitFeedbackAppTimeOnConfirmationPage(
+        confirmation_page_open_duration);
+  }
+}
+
 FeedbackServiceProvider::FeedbackServiceProvider(
     std::unique_ptr<OsFeedbackDelegate> feedback_delegate)
     : feedback_delegate_(std::move(feedback_delegate)) {
-  open_timestamp_ = base::Time::Now();
+  app_open_timestamp_ = base::Time::Now();
+  feedback_sent = false;
 }
 
 FeedbackServiceProvider::~FeedbackServiceProvider() {
-  const base::TimeDelta time_open = base::Time::Now() - open_timestamp_;
-  ash::os_feedback_ui::metrics::EmitFeedbackAppOpenDuration(time_open);
+  const base::TimeDelta app_open_duration =
+      base::Time::Now() - app_open_timestamp_;
+  os_feedback_ui::metrics::EmitFeedbackAppOpenDuration(app_open_duration);
+
+  EmitTimeOnEachPageMetrics(feedback_sent, app_open_timestamp_,
+                            share_data_page_open_timestamp_,
+                            share_data_page_close_timestamp_);
 }
 
 void FeedbackServiceProvider::GetFeedbackContext(
@@ -50,6 +78,8 @@
 void FeedbackServiceProvider::SendReport(ReportPtr report,
                                          SendReportCallback callback) {
   feedback_delegate_->SendReport(std::move(report), std::move(callback));
+  share_data_page_close_timestamp_ = base::Time::Now();
+  feedback_sent = true;
 }
 
 void FeedbackServiceProvider::OpenDiagnosticsApp() {
@@ -74,6 +104,14 @@
 
 void FeedbackServiceProvider::RecordPostSubmitAction(
     os_feedback_ui::mojom::FeedbackAppPostSubmitAction action) {
+  if (action ==
+      os_feedback_ui::mojom::FeedbackAppPostSubmitAction::kSendNewReport) {
+    EmitTimeOnEachPageMetrics(feedback_sent, app_open_timestamp_,
+                              share_data_page_open_timestamp_,
+                              share_data_page_close_timestamp_);
+    feedback_sent = false;
+    app_open_timestamp_ = base::Time::Now();
+  }
   os_feedback_ui::metrics::EmitFeedbackAppPostSubmitAction(action);
 }
 
@@ -87,6 +125,17 @@
   os_feedback_ui::metrics::EmitFeedbackAppExitPath(exit_path);
 }
 
+void FeedbackServiceProvider::RecordHelpContentOutcome(
+    os_feedback_ui::mojom::FeedbackAppHelpContentOutcome outcome) {
+  if (outcome == os_feedback_ui::mojom::FeedbackAppHelpContentOutcome::
+                     kContinueHelpContentClicked ||
+      outcome == os_feedback_ui::mojom::FeedbackAppHelpContentOutcome::
+                     kContinueNoHelpContentClicked) {
+    share_data_page_open_timestamp_ = base::Time::Now();
+  }
+  os_feedback_ui::metrics::EmitFeedbackAppHelpContentOutcome(outcome);
+}
+
 void FeedbackServiceProvider::BindInterface(
     mojo::PendingReceiver<os_feedback_ui::mojom::FeedbackServiceProvider>
         receiver) {
diff --git a/ash/webui/os_feedback_ui/backend/feedback_service_provider.h b/ash/webui/os_feedback_ui/backend/feedback_service_provider.h
index 0488fcb..989f2205 100644
--- a/ash/webui/os_feedback_ui/backend/feedback_service_provider.h
+++ b/ash/webui/os_feedback_ui/backend/feedback_service_provider.h
@@ -44,6 +44,8 @@
       os_feedback_ui::mojom::FeedbackAppPreSubmitAction action) override;
   void RecordExitPath(
       os_feedback_ui::mojom::FeedbackAppExitPath exit_path) override;
+  void RecordHelpContentOutcome(
+      os_feedback_ui::mojom::FeedbackAppHelpContentOutcome outcome) override;
 
   void BindInterface(
       mojo::PendingReceiver<os_feedback_ui::mojom::FeedbackServiceProvider>
@@ -55,7 +57,10 @@
       this};
   // Timestamp of when the app was opened. Used to calculate a duration for
   // metrics.
-  base::Time open_timestamp_;
+  base::Time app_open_timestamp_;
+  base::Time share_data_page_open_timestamp_;
+  base::Time share_data_page_close_timestamp_;
+  bool feedback_sent;
   base::WeakPtrFactory<FeedbackServiceProvider> weak_ptr_factory_{this};
 };
 
diff --git a/ash/webui/os_feedback_ui/backend/histogram_util.cc b/ash/webui/os_feedback_ui/backend/histogram_util.cc
index cb84b1e3..b7e7bb76 100644
--- a/ash/webui/os_feedback_ui/backend/histogram_util.cc
+++ b/ash/webui/os_feedback_ui/backend/histogram_util.cc
@@ -11,6 +11,22 @@
   base::UmaHistogramLongTimes100(kFeedbackAppOpenDuration, time_elapsed);
 }
 
+void EmitFeedbackAppTimeOnSearchPage(const base::TimeDelta& time_elapsed) {
+  base::UmaHistogramLongTimes100(kFeedbackAppTimeOnPageSearchPage,
+                                 time_elapsed);
+}
+
+void EmitFeedbackAppTimeOnShareDataPage(const base::TimeDelta& time_elapsed) {
+  base::UmaHistogramLongTimes100(kFeedbackAppTimeOnPageShareDataPage,
+                                 time_elapsed);
+}
+
+void EmitFeedbackAppTimeOnConfirmationPage(
+    const base::TimeDelta& time_elapsed) {
+  base::UmaHistogramLongTimes100(kFeedbackAppTimeOnPageConfirmationPage,
+                                 time_elapsed);
+}
+
 void EmitFeedbackAppPostSubmitAction(
     mojom::FeedbackAppPostSubmitAction action) {
   base::UmaHistogramEnumeration(kFeedbackAppPostSubmitAction, action);
@@ -72,4 +88,9 @@
   base::UmaHistogramEnumeration(kFeedbackAppExitPath, exit_path);
 }
 
+void EmitFeedbackAppHelpContentOutcome(
+    mojom::FeedbackAppHelpContentOutcome outcome) {
+  base::UmaHistogramEnumeration(kFeedbackAppHelpContentOutcome, outcome);
+}
+
 }  // namespace ash::os_feedback_ui::metrics
diff --git a/ash/webui/os_feedback_ui/backend/histogram_util.h b/ash/webui/os_feedback_ui/backend/histogram_util.h
index 5a5012c3..559ccb4 100644
--- a/ash/webui/os_feedback_ui/backend/histogram_util.h
+++ b/ash/webui/os_feedback_ui/backend/histogram_util.h
@@ -38,6 +38,14 @@
 constexpr char kFeedbackAppDescriptionLength[] =
     "Feedback.ChromeOSApp.DescriptionLength";
 constexpr char kFeedbackAppExitPath[] = "Feedback.ChromeOSApp.ExitPath";
+constexpr char kFeedbackAppHelpContentOutcome[] =
+    "Feedback.ChromeOSApp.HelpContentOutcome";
+constexpr char kFeedbackAppTimeOnPageSearchPage[] =
+    "Feedback.ChromeOSApp.TimeOnPage.SearchPage";
+constexpr char kFeedbackAppTimeOnPageShareDataPage[] =
+    "Feedback.ChromeOSApp.TimeOnPage.ShareDataPage";
+constexpr char kFeedbackAppTimeOnPageConfirmationPage[] =
+    "Feedback.ChromeOSApp.TimeOnPage.ConfirmationPage";
 
 // The enums below are used in histograms, do not remove/renumber entries. If
 // you're adding to any of these enums, update the corresponding enum listing in
@@ -72,6 +80,15 @@
 
 void EmitFeedbackAppExitPath(mojom::FeedbackAppExitPath exit_path);
 
+void EmitFeedbackAppHelpContentOutcome(
+    mojom::FeedbackAppHelpContentOutcome outcome);
+
+void EmitFeedbackAppTimeOnSearchPage(const base::TimeDelta& time_elapsed);
+
+void EmitFeedbackAppTimeOnShareDataPage(const base::TimeDelta& time_elapsed);
+
+void EmitFeedbackAppTimeOnConfirmationPage(const base::TimeDelta& time_elapsed);
+
 }  // namespace ash::os_feedback_ui::metrics
 
 #endif  // ASH_WEBUI_OS_FEEDBACK_UI_BACKEND_HISTOGRAM_UTIL_H_
\ No newline at end of file
diff --git a/ash/webui/os_feedback_ui/mojom/os_feedback_ui.mojom b/ash/webui/os_feedback_ui/mojom/os_feedback_ui.mojom
index 5fbccfd..f5f62d6 100644
--- a/ash/webui/os_feedback_ui/mojom/os_feedback_ui.mojom
+++ b/ash/webui/os_feedback_ui/mojom/os_feedback_ui.mojom
@@ -184,6 +184,22 @@
   kSuccessNoHelpContentClicked
 };
 
+// The outcome of checking help contents.
+enum FeedbackAppHelpContentOutcome {
+  // User click continue after clicking the help content.
+  kContinueHelpContentClicked,
+  // User click continue without clicking any help content.
+  kContinueNoHelpContentClicked,
+  // User click continue and no result is found in the search.
+  kContinueNoResultFound,
+  // User quit feedback app after clicking the help content.
+  kQuitHelpContentClicked,
+  // User quit feedback app without clicking any help content.
+  kQuitNoHelpContentClicked,
+  // User quit feedback app and no result is found in the search.
+  kQuitNoResultFound,
+};
+
 // Provides services needed by the feedback UI to display data and send reports.
 // Implemented in the browser process and called by the Feedback SWA
 // (a renderer process).
@@ -214,4 +230,6 @@
   RecordPreSubmitAction(FeedbackAppPreSubmitAction action);
   // Record metrics of users' exit paths of feedback app.
   RecordExitPath(FeedbackAppExitPath exit_path);
+  // Record the outcome of clicking and viewing the help content.
+  RecordHelpContentOutcome(FeedbackAppHelpContentOutcome outcome);
 };
diff --git a/ash/webui/os_feedback_ui/resources/fake_feedback_service_provider.js b/ash/webui/os_feedback_ui/resources/fake_feedback_service_provider.js
index a3c2b62f..539daaa8 100644
--- a/ash/webui/os_feedback_ui/resources/fake_feedback_service_provider.js
+++ b/ash/webui/os_feedback_ui/resources/fake_feedback_service_provider.js
@@ -3,8 +3,9 @@
 // found in the LICENSE file.
 
 import {FakeMethodResolver} from 'chrome://resources/ash/common/fake_method_resolver.js';
+import {assert} from 'chrome://resources/js/assert.m.js';
 
-import {FeedbackAppExitPath, FeedbackAppPostSubmitAction, FeedbackAppPreSubmitAction, FeedbackContext, FeedbackServiceProviderInterface, Report, SendReportStatus} from './feedback_types.js';
+import {FeedbackAppExitPath, FeedbackAppHelpContentOutcome, FeedbackAppPostSubmitAction, FeedbackAppPreSubmitAction, FeedbackContext, FeedbackServiceProviderInterface, Report, SendReportStatus} from './feedback_types.js';
 
 /**
  * @fileoverview
@@ -54,6 +55,9 @@
     /** @type {?FeedbackAppExitPath} */
     this.exitPath_ = null;
 
+    /** @type {?FeedbackAppHelpContentOutcome} */
+    this.helpContentOutcome_ = null;
+
     /** @type {Map<FeedbackAppPreSubmitAction, number>} */
     this.preSubmitActionMap_ = new Map();
   }
@@ -253,4 +257,20 @@
     this.preSubmitActionMap_.set(
         action, this.preSubmitActionMap_.get(action) + 1 || 1);
   }
+
+  /**
+   * @param {?FeedbackAppHelpContentOutcome} outcome
+   * @return {boolean}
+   */
+  isHelpContentOutcomeMetricEmitted(outcome) {
+    return this.helpContentOutcome_ === outcome;
+  }
+
+  /**
+   * @param {?FeedbackAppHelpContentOutcome} outcome
+   */
+  recordHelpContentOutcome(outcome) {
+    assert(this.helpContentOutcome_ === null);
+    this.helpContentOutcome_ = outcome;
+  }
 }
diff --git a/ash/webui/os_feedback_ui/resources/feedback_flow.js b/ash/webui/os_feedback_ui/resources/feedback_flow.js
index 93df50f..f78242c92 100644
--- a/ash/webui/os_feedback_ui/resources/feedback_flow.js
+++ b/ash/webui/os_feedback_ui/resources/feedback_flow.js
@@ -11,7 +11,7 @@
 import {stringToMojoString16} from 'chrome://resources/ash/common/mojo_utils.js';
 import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
-import {FeedbackAppExitPath, FeedbackAppPreSubmitAction, FeedbackContext, FeedbackServiceProviderInterface, Report, SendReportStatus} from './feedback_types.js';
+import {FeedbackAppExitPath, FeedbackAppHelpContentOutcome, FeedbackAppPreSubmitAction, FeedbackContext, FeedbackServiceProviderInterface, Report, SendReportStatus} from './feedback_types.js';
 import {getFeedbackServiceProvider} from './mojo_interface_provider.js';
 
 /**
@@ -114,6 +114,13 @@
      * @private
      */
     this.helpContentClicked_ = false;
+
+    /**
+     * To avoid helpContentOutcome metric emit more than one time.
+     * @type {boolean}
+     * @private
+     */
+    this.helpContentOutcomeMetricEmitted_ = false;
   }
 
   ready() {
@@ -146,6 +153,12 @@
           this.recordExitPath_(
               FeedbackAppExitPath.kQuitSearchPageHelpContentClicked,
               FeedbackAppExitPath.kQuitSearchPageNoHelpContentClicked);
+          if (!this.helpContentOutcomeMetricEmitted_) {
+            this.recordHelpContentOutcome_(
+                FeedbackAppHelpContentOutcome.kQuitHelpContentClicked,
+                FeedbackAppHelpContentOutcome.kQuitNoHelpContentClicked);
+            this.helpContentOutcomeMetricEmitted_ = true;
+          }
           break;
         case FeedbackFlowState.SHARE_DATA:
           this.recordExitPath_(
@@ -208,6 +221,13 @@
         this.currentState_ = FeedbackFlowState.SHARE_DATA;
         this.description_ = event.detail.description;
         this.fetchScreenshot_();
+        // TODO(longbowei): Handle NoResultFound case.
+        if (!this.helpContentOutcomeMetricEmitted_) {
+          this.recordHelpContentOutcome_(
+              FeedbackAppHelpContentOutcome.kContinueHelpContentClicked,
+              FeedbackAppHelpContentOutcome.kContinueNoHelpContentClicked);
+          this.helpContentOutcomeMetricEmitted_ = true;
+        }
         break;
       case FeedbackFlowState.SHARE_DATA:
         /** @type {!Report} */
@@ -244,6 +264,9 @@
         const shareDataPage = this.shadowRoot.querySelector('share-data-page');
         shareDataPage.reEnableSendReportButton();
 
+        // Re-enable helpContentOutcomeMetric to be emitted in search page.
+        this.helpContentOutcomeMetricEmitted_ = false;
+
         this.navigateToSearchPage_();
         break;
       default:
@@ -258,6 +281,20 @@
   }
 
   /**
+   * @param {!FeedbackAppHelpContentOutcome} outcomeHelpContentClicked
+   * @param {!FeedbackAppHelpContentOutcome} outcomeNoHelpContentClicked
+   * @private
+   */
+  recordHelpContentOutcome_(
+      outcomeHelpContentClicked, outcomeNoHelpContentClicked) {
+    this.helpContentClicked_ ?
+        this.feedbackServiceProvider_.recordHelpContentOutcome(
+            outcomeHelpContentClicked) :
+        this.feedbackServiceProvider_.recordHelpContentOutcome(
+            outcomeNoHelpContentClicked);
+  }
+
+  /**
    * @param {!FeedbackAppExitPath} pathHelpContentClicked
    * @param {!FeedbackAppExitPath} pathNoHelpContentClicked
    * @private
diff --git a/ash/webui/os_feedback_ui/resources/feedback_types.js b/ash/webui/os_feedback_ui/resources/feedback_types.js
index ae354c79..a93d4f7 100644
--- a/ash/webui/os_feedback_ui/resources/feedback_types.js
+++ b/ash/webui/os_feedback_ui/resources/feedback_types.js
@@ -99,6 +99,13 @@
 export const FeedbackAppExitPath = ash.osFeedbackUi.mojom.FeedbackAppExitPath;
 
 /**
+ * Type alias for FeedbackAppHelpContentOutcome.
+ * @typedef {ash.osFeedbackUi.mojom.FeedbackAppHelpContentOutcome}
+ */
+export const FeedbackAppHelpContentOutcome =
+    ash.osFeedbackUi.mojom.FeedbackAppHelpContentOutcome;
+
+/**
  * Type alias for SendReportStatus.
  * @typedef {ash.osFeedbackUi.mojom.SendReportStatus}
  */
diff --git a/ash/webui/projector_app/annotator_message_handler.cc b/ash/webui/projector_app/annotator_message_handler.cc
index 9c797590..51c32f9 100644
--- a/ash/webui/projector_app/annotator_message_handler.cc
+++ b/ash/webui/projector_app/annotator_message_handler.cc
@@ -22,7 +22,7 @@
 
 AnnotatorMessageHandler::~AnnotatorMessageHandler() {
   ProjectorAppClient::Get()->ResetAnnotatorMessageHandler(this);
-};
+}
 
 void AnnotatorMessageHandler::RegisterMessages() {
   web_ui()->RegisterMessageCallback(
diff --git a/ash/webui/shortcut_customization_ui/.gitignore b/ash/webui/shortcut_customization_ui/.gitignore
new file mode 100644
index 0000000..79f93fdd
--- /dev/null
+++ b/ash/webui/shortcut_customization_ui/.gitignore
@@ -0,0 +1,2 @@
+# Generated from ash/webui/personalization_app/tools/gen_tsconfig.py
+tsconfig.json
\ No newline at end of file
diff --git a/ash/webui/shortcut_customization_ui/resources/BUILD.gn b/ash/webui/shortcut_customization_ui/resources/BUILD.gn
index 3cb4a2d..99e8d7e 100644
--- a/ash/webui/shortcut_customization_ui/resources/BUILD.gn
+++ b/ash/webui/shortcut_customization_ui/resources/BUILD.gn
@@ -16,10 +16,10 @@
 
 non_web_component_files = [
   "accelerator_lookup_manager.ts",
-  "fake_data.js",
-  "fake_shortcut_provider.js",
-  "mojo_interface_provider.js",
-  "shortcut_types.js",
+  "fake_data.ts",
+  "fake_shortcut_provider.ts",
+  "mojo_interface_provider.ts",
+  "shortcut_types.ts",
 ]
 
 web_component_files = [
diff --git a/ash/webui/shortcut_customization_ui/resources/accelerator_view.ts b/ash/webui/shortcut_customization_ui/resources/accelerator_view.ts
index 4607f93..9539ba0f 100644
--- a/ash/webui/shortcut_customization_ui/resources/accelerator_view.ts
+++ b/ash/webui/shortcut_customization_ui/resources/accelerator_view.ts
@@ -11,7 +11,7 @@
 import {getTemplate} from './accelerator_view.html.js';
 import {getShortcutProvider} from './mojo_interface_provider.js';
 import {ModifierKeyCodes} from './shortcut_input.js';
-import {AcceleratorConfigResult, AcceleratorInfo, AcceleratorKeys, AcceleratorSource, AcceleratorState, AcceleratorType, ShortcutProviderInterface} from './shortcut_types.js';
+import {AcceleratorConfigResult, AcceleratorInfo, AcceleratorKeys, AcceleratorSource, AcceleratorState, AcceleratorType, Modifier, ShortcutProviderInterface} from './shortcut_types.js';
 
 export interface AcceleratorViewElement {
   $: {
@@ -19,17 +19,6 @@
   };
 }
 
-/**
- * Modifier values are based off of ui::Accelerator. Must be kept in sync with
- * ui::Accelerator and ui::KeyEvent.
- */
-export enum Modifier {
-  SHIFT = 1 << 1,
-  CONTROL = 1 << 2,
-  ALT = 1 << 3,
-  COMMAND = 1 << 4,
-}
-
 enum KeyState {
   NOT_SELECTED = 'not-selected',
   MODIFIER = 'modifier-selected',
diff --git a/ash/webui/shortcut_customization_ui/resources/fake_data.js b/ash/webui/shortcut_customization_ui/resources/fake_data.ts
similarity index 84%
rename from ash/webui/shortcut_customization_ui/resources/fake_data.js
rename to ash/webui/shortcut_customization_ui/resources/fake_data.ts
index 4ec7822..5e73e0d 100644
--- a/ash/webui/shortcut_customization_ui/resources/fake_data.js
+++ b/ash/webui/shortcut_customization_ui/resources/fake_data.ts
@@ -2,11 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {Modifier} from './accelerator_view.js';
-import {AcceleratorConfig, AcceleratorInfo, AcceleratorKeys, AcceleratorSource, AcceleratorState, AcceleratorType, LayoutInfoList, LayoutStyle} from './shortcut_types.js';
+import {AcceleratorConfig, AcceleratorSource, AcceleratorState, AcceleratorType, LayoutInfoList, LayoutStyle, Modifier} from './shortcut_types.js';
 
-/* @type {!Map<number, string>} */
-export const fakeActionNames = new Map([
+export const fakeActionNames: Map<number, string> = new Map([
   [0, 'Snap Window Left'],
   [1, 'Snap Window Right'],
   [2, 'New Desk'],
@@ -14,21 +12,18 @@
   [1001, 'New Tab'],
 ]);
 
-/* @type {!Map<number, string>} */
-export const fakeCategories = new Map([
+export const fakeCategories: Map<number, string> = new Map([
   [0, 'Chrome OS'],
   [1, 'Browser'],
 ]);
 
-/* @type {!Map<number, string>} */
-export const fakeSubCategories = new Map([
+export const fakeSubCategories: Map<number, string> = new Map([
   [0, 'Window Management'],
   [1, 'Virtual Desks'],
   [2, 'Tabs'],
 ]);
 
-/* @type {!AcceleratorConfig} */
-export const fakeAcceleratorConfig = new Map([
+export const fakeAcceleratorConfig: AcceleratorConfig = new Map([
   [
     AcceleratorSource.ASH,
     new Map([
@@ -111,8 +106,7 @@
   ],
 ]);
 
-/* @type {!LayoutInfoList} */
-export const fakeLayoutInfo = [
+export const fakeLayoutInfo: LayoutInfoList = [
   {
     category: 0,      // Chrome OS.
     sub_category: 0,  // Window Management.
diff --git a/ash/webui/shortcut_customization_ui/resources/fake_shortcut_provider.js b/ash/webui/shortcut_customization_ui/resources/fake_shortcut_provider.ts
similarity index 63%
rename from ash/webui/shortcut_customization_ui/resources/fake_shortcut_provider.js
rename to ash/webui/shortcut_customization_ui/resources/fake_shortcut_provider.ts
index 67f43c7..2095971 100644
--- a/ash/webui/shortcut_customization_ui/resources/fake_shortcut_provider.js
+++ b/ash/webui/shortcut_customization_ui/resources/fake_shortcut_provider.ts
@@ -4,15 +4,16 @@
 
 import {FakeMethodResolver} from 'chrome://resources/ash/common/fake_method_resolver.js';
 
-import {AcceleratorConfig, AcceleratorConfigResult, AcceleratorKeys, AcceleratorSource, LayoutInfoList, ShortcutProviderInterface} from './shortcut_types.js';
+import {AcceleratorConfig, AcceleratorConfigResult, AcceleratorSource, LayoutInfoList, ShortcutProviderInterface} from './shortcut_types.js';
 
 /**
  * @fileoverview
  * Implements a fake version of the FakeShortcutProvider mojo interface.
  */
 
-/** @implements {ShortcutProviderInterface} */
-export class FakeShortcutProvider {
+export class FakeShortcutProvider implements ShortcutProviderInterface {
+  private methods_: FakeMethodResolver;
+
   constructor() {
     this.methods_ = new FakeMethodResolver();
 
@@ -27,78 +28,48 @@
     this.methods_.register('restoreActionDefaults');
   }
 
-  /**
-   * @return {!Promise<!AcceleratorConfig>}
-   */
-  getAllAcceleratorConfig() {
+  getAllAcceleratorConfig(): Promise<AcceleratorConfig> {
     return this.methods_.resolveMethod('getAllAcceleratorConfig');
   }
 
-  /**
-   * @return {!Promise<!LayoutInfoList>}
-   */
-  getLayoutInfo() {
+  getLayoutInfo(): Promise<LayoutInfoList> {
     return this.methods_.resolveMethod('getLayoutInfo');
   }
 
-  /**
-   * @param {!AcceleratorSource} source
-   * @return {!Promise<boolean>}
-   */
-  isMutable(source) {
+  isMutable(source: AcceleratorSource): Promise<boolean> {
     this.methods_.setResult('isMutable', source !== AcceleratorSource.BROWSER);
     return this.methods_.resolveMethod('isMutable');
   }
 
-  /**
-   * @param {AcceleratorSource} source
-   * @param {number} action
-   * @param {!AcceleratorKeys} accelerator
-   */
-  addUserAccelerator(source, action, accelerator) {
+  addUserAccelerator(): Promise<AcceleratorConfigResult> {
     // Always return kSuccess in this fake.
     this.methods_.setResult(
         'addUserAccelerator', AcceleratorConfigResult.SUCCESS);
     return this.methods_.resolveMethod('addUserAccelerator');
   }
 
-  /**
-   * @param {AcceleratorSource} source
-   * @param {number} action
-   * @param {!AcceleratorKeys} oldAccelerator
-   * @param {!AcceleratorKeys} newAccelerator
-   */
-  replaceAccelerator(source, action, oldAccelerator, newAccelerator) {
+  replaceAccelerator(): Promise<AcceleratorConfigResult> {
     // Always return kSuccess in this fake.
     this.methods_.setResult(
         'replaceAccelerator', AcceleratorConfigResult.SUCCESS);
     return this.methods_.resolveMethod('replaceAccelerator');
   }
 
-  /**
-   * @param {!AcceleratorSource} source
-   * @param {number} action
-   * @param {!AcceleratorKeys} accelerator
-   */
-  removeAccelerator(source, action, accelerator) {
+  removeAccelerator(): Promise<AcceleratorConfigResult> {
     // Always return kSuccess in this fake.
     this.methods_.setResult(
         'removeAccelerator', AcceleratorConfigResult.SUCCESS);
     return this.methods_.resolveMethod('removeAccelerator');
   }
 
-  restoreAllDefaults() {
+  restoreAllDefaults(): Promise<AcceleratorConfigResult> {
     // Always return kSuccess in this fake.
     this.methods_.setResult(
         'restoreAllDefaults', AcceleratorConfigResult.SUCCESS);
     return this.methods_.resolveMethod('restoreAllDefaults');
   }
 
-  /**
-   * @param {!AcceleratorSource} source
-   * @param {number} action
-   */
-  restoreActionDefaults(source, action) {
+  restoreActionDefaults(): Promise<AcceleratorConfigResult> {
     // Always return kSuccess in this fake.
     this.methods_.setResult(
         'restoreActionDefaults', AcceleratorConfigResult.SUCCESS);
@@ -108,18 +79,16 @@
   /**
    * Sets the value that will be returned when calling
    * getAllAcceleratorConfig().
-   * @param {!AcceleratorConfig} config
    */
-  setFakeAcceleratorConfig(config) {
+  setFakeAcceleratorConfig(config: AcceleratorConfig) {
     this.methods_.setResult('getAllAcceleratorConfig', config);
   }
 
   /**
    * Sets the value that will be returned when calling
    * getLayoutInfo().
-   * @param {!LayoutInfoList} layout
    */
-  setFakeLayoutInfo(layout) {
+  setFakeLayoutInfo(layout: LayoutInfoList) {
     this.methods_.setResult('getLayoutInfo', layout);
   }
 }
diff --git a/ash/webui/shortcut_customization_ui/resources/mojo_interface_provider.js b/ash/webui/shortcut_customization_ui/resources/mojo_interface_provider.ts
similarity index 77%
rename from ash/webui/shortcut_customization_ui/resources/mojo_interface_provider.js
rename to ash/webui/shortcut_customization_ui/resources/mojo_interface_provider.ts
index f6cabf9..808012d 100644
--- a/ash/webui/shortcut_customization_ui/resources/mojo_interface_provider.js
+++ b/ash/webui/shortcut_customization_ui/resources/mojo_interface_provider.ts
@@ -2,7 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {assert} from 'chrome://resources/js/assert.m.js';
+import {assert} from 'chrome://resources/js/assert_ts.js';
+
 import {fakeAcceleratorConfig, fakeLayoutInfo} from './fake_data.js';
 import {FakeShortcutProvider} from './fake_shortcut_provider.js';
 import {ShortcutProviderInterface} from './shortcut_types.js';
@@ -13,15 +14,10 @@
  * to override them with test/fake implementations.
  */
 
-/**
- * @type {?ShortcutProviderInterface}
- */
-let shortcutProvider = null;
+let shortcutProvider: ShortcutProviderInterface|null = null;
 
-/**
- * @param {!ShortcutProviderInterface} testProvider
- */
-export function setShortcutProviderForTesting(testProvider) {
+export function setShortcutProviderForTesting(
+    testProvider: ShortcutProviderInterface) {
   shortcutProvider = testProvider;
 }
 
@@ -43,10 +39,7 @@
   setShortcutProviderForTesting(provider);
 }
 
-/**
- * @return {!ShortcutProviderInterface}
- */
-export function getShortcutProvider() {
+export function getShortcutProvider(): ShortcutProviderInterface {
   if (!shortcutProvider) {
     // TODO(zentaro): Instantiate a real mojo interface here.
     setupFakeShortcutProvider();
diff --git a/ash/webui/shortcut_customization_ui/resources/shortcut_types.js b/ash/webui/shortcut_customization_ui/resources/shortcut_types.js
deleted file mode 100644
index bd07a23..0000000
--- a/ash/webui/shortcut_customization_ui/resources/shortcut_types.js
+++ /dev/null
@@ -1,156 +0,0 @@
-// Copyright 2021 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-/**
- * @fileoverview
- * Type aliases for the mojo API.
- *
- * TODO(zentaro): When the fake API is replaced by mojo these can be
- * re-aliased to the corresponding mojo types, or replaced by them.
- */
-
-/**
- * Modifier values are based off of ui::Accelerator. Must be kept in sync with
- * ui::Accelerator and ui::KeyEvent.
- *
- * @enum {number}
- */
-export const Modifier = {
-  SHIFT: 1 << 1,
-  CONTROL: 1 << 2,
-  ALT: 1 << 3,
-  COMMAND: 1 << 4,
-};
-
-/**
- * Enumeration of accelerator sources.
- * @enum {number}
- */
-export const AcceleratorSource = {
-  ASH: 0,
-  EVENT_REWRITER: 1,
-  BROWSER: 2,
-  ANDROID: 3,
-};
-
-/**
- * Enumeration of accelerator types.
- * @enum {number}
- */
-export const AcceleratorType = {
-  DEFAULT: 0,
-  USER_DEFINED: 1,
-  DEPRECATED: 2,
-  DEVELOPER: 3,
-  DEBUG: 4,
-};
-
-/**
- * Enumeration of accelerator states.
- * @enum {number}
- */
-export const AcceleratorState = {
-  ENABLED: 0,
-  DISABLED_BY_CONFLICT: 1,
-  DISABLED_BY_USER: 2,
-};
-
-/**
- * Enumeration of accelerator config results from adding/replacing/removing an
- * accelerator.
- * @enum {number}
- */
-export const AcceleratorConfigResult = {
-  SUCCESS: 0,
-  ACTION_LOCKED: 1,
-  ACCELERATOR_LOCKED: 2,
-  CONFLICT: 3,
-  NOT_FOUND: 4,
-  DUPLICATE: 5,
-};
-
-/**
- * Type alias for AcceleratorKeys.
- * @typedef {{
- *   modifiers: number,
- *   key: number,
- *   key_display: string,
- * }}
- */
-export let AcceleratorKeys;
-
-/**
- * Type alias for AcceleratorInfo.
- * @typedef {{
- *   accelerator: !AcceleratorKeys,
- *   type: !AcceleratorType,
- *   state: !AcceleratorState,
- *   locked: boolean,
- * }}
- */
-export let AcceleratorInfo;
-
-/**
- * Type alias for AcceleratorConfig. This is a two level map, with the top
- * level identifying the source of the shortcuts, and second level the integer
- * id for the action with the leaf value being a list of Accelerator Info.
- * @typedef {!Map<!AcceleratorSource, !Map<number, !Array<!AcceleratorInfo>>>}
- */
-export let AcceleratorConfig;
-
-/**
- * Enumeration of layout styles.
- * @enum {number}
- */
-export const LayoutStyle = {
-  DEFAULT: 0,
-};
-
-/**
- * Type alias for LayoutInfo. This describes one row (corresponding to an
- * AcceleratorRow) within the layout hierarchy. The category, sub-category,
- * and description are resource ID's that resolve to localized strings.
- *
- * The category provides grouping for the left navigation panel, and the
- * sub-category provides grouping for a section within a page.
- *
- * The source and action provide a lookup key into AcceleratorConfig
- * to determine the list of accelerators.
- *
- * The layout_style is an enum that allows for customization for special
- * cases. In most cases this will be kDefault.
- * @typedef {{
- *   category: number,
- *   sub_category: number,
- *   description: number,
- *   layout_style: !LayoutStyle,
- *   source: !AcceleratorSource,
- *   action: number,
- * }}
- */
-export let LayoutInfo;
-
-/**
- * Type alias for an array of LayoutItem.
- * @typedef {!Array<!LayoutInfo>}
- */
-export let LayoutInfoList;
-
-/**
- * Type alias for the ShortcutProviderInterface.
- * TODO(zentaro): Replace with a real mojo type when implemented.
- * @typedef {{
- *   getAllAcceleratorConfig: !function(): !Promise<!AcceleratorConfig>,
- *   getLayoutInfo: !function(): !Promise<LayoutInfoList>,
- *   isMutable: !function(!AcceleratorSource): !Promise<boolean>,
- *   removeAccelerator: !function(!AcceleratorSource, number, !AcceleratorKeys):
- *     !Promise<!AcceleratorConfigResult>,
- *   replaceAccelerator: !function(
- *     !AcceleratorSource, number, !AcceleratorKeys, !AcceleratorKeys
- *   ): !Promise<!AcceleratorConfigResult>,
- *   addUserAccelerator: !function(!AcceleratorSource, number,
- *     !AcceleratorKeys): !Promise<!AcceleratorConfigResult>,
- * }}
- */
-export let ShortcutProviderInterface;
diff --git a/ash/webui/shortcut_customization_ui/resources/shortcut_types.ts b/ash/webui/shortcut_customization_ui/resources/shortcut_types.ts
new file mode 100644
index 0000000..bb71be1
--- /dev/null
+++ b/ash/webui/shortcut_customization_ui/resources/shortcut_types.ts
@@ -0,0 +1,131 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview
+ * Type aliases for the mojo API.
+ *
+ * TODO(zentaro): When the fake API is replaced by mojo these can be
+ * re-aliased to the corresponding mojo types, or replaced by them.
+ */
+
+/**
+ * Modifier values are based off of ui::Accelerator. Must be kept in sync with
+ * ui::Accelerator and ui::KeyEvent.
+ */
+export enum Modifier {
+  SHIFT = 1 << 1,
+  CONTROL = 1 << 2,
+  ALT = 1 << 3,
+  COMMAND = 1 << 4,
+}
+
+/** Enumeration of accelerator sources. */
+export enum AcceleratorSource {
+  ASH,
+  EVENT_REWRITER,
+  BROWSER,
+  ANDROID,
+}
+
+/** Enumeration of accelerator types. */
+export enum AcceleratorType {
+  DEFAULT,
+  USER_DEFINED,
+  DEPRECATED,
+  DEVELOPER,
+  DEBUG,
+}
+
+/** Enumeration of accelerator states. */
+export enum AcceleratorState {
+  ENABLED,
+  DISABLED_BY_CONFLICT,
+  DISABLED_BY_USER,
+}
+
+/**
+ * Enumeration of accelerator config results from adding/replacing/removing an
+ * accelerator.
+ */
+export enum AcceleratorConfigResult {
+  SUCCESS,
+  ACTION_LOCKED,
+  ACCELERATOR_LOCKED,
+  CONFLICT,
+  NOT_FOUND,
+  DUPLICATE,
+}
+
+export interface AcceleratorKeys {
+  modifiers: number;
+  key: number;
+  key_display: string;
+}
+
+export interface AcceleratorInfo {
+  accelerator: AcceleratorKeys;
+  type: AcceleratorType;
+  state: AcceleratorState;
+  locked: boolean;
+}
+
+/**
+ * Type alias for AcceleratorConfig. This is a two level map, with the top
+ * level identifying the source of the shortcuts, and second level the integer
+ * id for the action with the leaf value being a list of Accelerator Info.
+ */
+export type AcceleratorConfig =
+    Map<AcceleratorSource, Map<number, AcceleratorInfo[]>>;
+
+/** Enumeration of layout styles.*/
+export enum LayoutStyle {
+  DEFAULT
+}
+
+/**
+ * Type alias for LayoutInfo. This describes one row (corresponding to an
+ * AcceleratorRow) within the layout hierarchy. The category, sub-category,
+ * and description are resource ID's that resolve to localized strings.
+ *
+ * The category provides grouping for the left navigation panel, and the
+ * sub-category provides grouping for a section within a page.
+ *
+ * The source and action provide a lookup key into AcceleratorConfig
+ * to determine the list of accelerators.
+ *
+ * The layout_style is an enum that allows for customization for special
+ * cases. In most cases this will be kDefault.
+ */
+export interface LayoutInfo {
+  category: number;
+  sub_category: number;
+  description: number;
+  layout_style: LayoutStyle;
+  source: AcceleratorSource;
+  action: number;
+}
+
+/** Type alias for an array of LayoutItem. */
+export type LayoutInfoList = LayoutInfo[];
+
+/**
+ * Type alias for the ShortcutProviderInterface.
+ * TODO(zentaro): Replace with a real mojo type when implemented.
+ */
+export interface ShortcutProviderInterface {
+  getAllAcceleratorConfig(): Promise<AcceleratorConfig>;
+  getLayoutInfo(): Promise<LayoutInfoList>;
+  isMutable(source: AcceleratorSource): Promise<boolean>;
+  removeAccelerator(
+      source: AcceleratorSource, action: number,
+      accelerator: AcceleratorKeys): Promise<AcceleratorConfigResult>;
+  replaceAccelerator(
+      source: AcceleratorSource, action: number,
+      oldAccelerator: AcceleratorKeys,
+      newAccelerator: AcceleratorKeys): Promise<AcceleratorConfigResult>;
+  addUserAccelerator(
+      source: AcceleratorSource, action: number,
+      accelerator: AcceleratorKeys): Promise<AcceleratorConfigResult>;
+}
diff --git a/ash/wm/README.md b/ash/wm/README.md
index 4feef80..9bf1542 100644
--- a/ash/wm/README.md
+++ b/ash/wm/README.md
@@ -45,7 +45,7 @@
 #include "ash/wm/window_state.h"
 
 WindowState* window_state = WindowState::Get(window);
-WMEvent wm_event(WM_EVENT_SNAP_PRIMARY);
+WindowSnapWMEvent wm_event(WM_EVENT_SNAP_PRIMARY);
 window_state->OnWMEvent(&wm_event);
 // WindowState will compute the animation and target bounds and animate the
 // window to the left half.
diff --git a/ash/wm/default_state.cc b/ash/wm/default_state.cc
index d552852..63ef4581 100644
--- a/ash/wm/default_state.cc
+++ b/ash/wm/default_state.cc
@@ -470,13 +470,13 @@
   if (state_type_ == WindowStateType::kFloated) {
     DCHECK_EQ(next_state_type, WindowStateType::kFloated);
     // Add window to float container.
-    float_controller->Float(window);
+    float_controller->FloatImpl(window);
   }
 
   // Unfloat floated window when exiting float state to another state.
   if (previous_state_type == WindowStateType::kFloated) {
     // Remove float window from float container.
-    float_controller->Unfloat(window);
+    float_controller->UnfloatImpl(window);
   }
 
   // Don't update the window if the window is detached from parent.
diff --git a/ash/wm/float/float_controller.cc b/ash/wm/float/float_controller.cc
index 3bb075b..06cb267 100644
--- a/ash/wm/float/float_controller.cc
+++ b/ash/wm/float/float_controller.cc
@@ -8,6 +8,7 @@
 #include <vector>
 
 #include "ash/constants/ash_features.h"
+#include "ash/display/screen_orientation_controller.h"
 #include "ash/public/cpp/shell_window_ids.h"
 #include "ash/shell.h"
 #include "ash/wm/desks/desks_util.h"
@@ -109,7 +110,7 @@
     UpdateWindowBoundsForTablet(floated_window_);
   }
 
-  void MaybeUntuckWindow() { scoped_window_tucker_.reset(); };
+  void MaybeUntuckWindow() { scoped_window_tucker_.reset(); }
 
   // aura::WindowObserver:
   void OnWindowDestroying(aura::Window* window) override {
@@ -360,7 +361,40 @@
   window_state->OnWMEvent(&toggle_event);
 }
 
-void FloatController::Float(aura::Window* window) {
+void FloatController::FloatForTablet(aura::Window* window,
+                                     chromeos::WindowStateType old_state_type) {
+  DCHECK(Shell::Get()->tablet_mode_controller()->InTabletMode());
+
+  FloatImpl(window);
+
+  if (!chromeos::IsSnappedWindowStateType(old_state_type))
+    return;
+
+  // TODO(sammiequon): Verify that this works for all orientations.
+  // Update magnetism so that the float window is roughly in the same location
+  // as it was when it was snapped.
+  const bool left_or_top =
+      old_state_type == chromeos::WindowStateType::kPrimarySnapped;
+  const bool landscape = IsCurrentScreenOrientationLandscape();
+  MagnetismCorner magnetism_corner;
+  if (!left_or_top) {
+    // Bottom or right snapped.
+    magnetism_corner = MagnetismCorner::kBottomRight;
+  } else if (landscape) {
+    // Left snapped.
+    magnetism_corner = MagnetismCorner::kBottomLeft;
+  } else {
+    DCHECK(left_or_top && !landscape);
+    // Top snapped.
+    magnetism_corner = MagnetismCorner::kTopRight;
+  }
+
+  auto* floated_window_info = MaybeGetFloatedWindowInfo(window);
+  DCHECK(floated_window_info);
+  floated_window_info->set_magnetism_corner(magnetism_corner);
+}
+
+void FloatController::FloatImpl(aura::Window* window) {
   if (floated_window_info_map_.contains(window))
     return;
 
@@ -380,7 +414,7 @@
     display_observer_.emplace(this);
 }
 
-void FloatController::Unfloat(aura::Window* window) {
+void FloatController::UnfloatImpl(aura::Window* window) {
   auto* floated_window_info = MaybeGetFloatedWindowInfo(window);
   if (!floated_window_info)
     return;
diff --git a/ash/wm/float/float_controller.h b/ash/wm/float/float_controller.h
index 577181b2..2c45d24 100644
--- a/ash/wm/float/float_controller.h
+++ b/ash/wm/float/float_controller.h
@@ -11,6 +11,7 @@
 #include "ash/public/cpp/tablet_mode_observer.h"
 #include "ash/wm/tablet_mode/tablet_mode_controller.h"
 #include "base/scoped_observation.h"
+#include "chromeos/ui/base/window_state_type.h"
 #include "chromeos/ui/frame/multitask_menu/float_controller_base.h"
 #include "ui/aura/window.h"
 #include "ui/aura/window_observer.h"
@@ -88,12 +89,15 @@
   friend class TabletModeWindowState;
   friend class WindowFloatTest;
 
-  // Floats/Unfloats `window`.
-  // Only one floating window is allowed per desk, floating a new window on the
-  // same desk or moving a floated window to that desk will unfloat the other
-  // floated window (if any).
-  void Float(aura::Window* window);
-  void Unfloat(aura::Window* window);
+  // Calls `FloatImpl()` and additionally updates the magnetism if needed.
+  void FloatForTablet(aura::Window* window,
+                      chromeos::WindowStateType old_state_type);
+
+  // Floats/Unfloats `window`. Only one floating window is allowed per desk,
+  // floating a new window on the same desk or moving a floated window to that
+  // desk will unfloat the other floated window (if any).
+  void FloatImpl(aura::Window* window);
+  void UnfloatImpl(aura::Window* window);
 
   // Unfloats `floated_window` from the desk it belongs to.
   void ResetFloatedWindow(aura::Window* floated_window);
diff --git a/ash/wm/float/float_controller_unittest.cc b/ash/wm/float/float_controller_unittest.cc
index e3db859..d6beff3 100644
--- a/ash/wm/float/float_controller_unittest.cc
+++ b/ash/wm/float/float_controller_unittest.cc
@@ -13,6 +13,7 @@
 #include "ash/screen_util.h"
 #include "ash/shell.h"
 #include "ash/test/ash_test_base.h"
+#include "ash/wm/overview/overview_controller.h"
 #include "ash/wm/overview/overview_test_util.h"
 #include "ash/wm/splitview/split_view_metrics_controller.h"
 #include "ash/wm/tablet_mode/tablet_mode_controller.h"
@@ -460,4 +461,69 @@
                   .Contains(window->bounds()));
 }
 
+using TabletWindowFloatSplitviewTest = TabletWindowFloatTest;
+
+// Tests the expected behaviour when a window is floated when there are snapped
+// windows on each side.
+TEST_F(TabletWindowFloatSplitviewTest, BothSnappedToFloat) {
+  Shell::Get()->tablet_mode_controller()->SetEnabledForTest(true);
+
+  // Create two windows and snap one on each side.
+  auto left_window = CreateAppWindow();
+  const WindowSnapWMEvent snap_left(WM_EVENT_SNAP_PRIMARY);
+  WindowState::Get(left_window.get())->OnWMEvent(&snap_left);
+
+  auto right_window = CreateAppWindow();
+  const WindowSnapWMEvent snap_right(WM_EVENT_SNAP_SECONDARY);
+  WindowState::Get(right_window.get())->OnWMEvent(&snap_right);
+
+  auto* split_view_controller =
+      SplitViewController::Get(Shell::GetPrimaryRootWindow());
+  ASSERT_TRUE(split_view_controller->BothSnapped());
+
+  // Float the left window. Verify that it is floated, the right window becomes
+  // maximized and that we are no longer in splitview.
+  wm::ActivateWindow(left_window.get());
+  PressAndReleaseKey(ui::VKEY_F, ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN);
+  EXPECT_TRUE(WindowState::Get(left_window.get())->IsFloated());
+  EXPECT_TRUE(WindowState::Get(right_window.get())->IsMaximized());
+  EXPECT_FALSE(split_view_controller->InSplitViewMode());
+}
+
+// Tests the expected behaviour when a window is floated then snapped.
+TEST_F(TabletWindowFloatSplitviewTest, FloatToSnapped) {
+  Shell::Get()->tablet_mode_controller()->SetEnabledForTest(true);
+
+  std::unique_ptr<aura::Window> window = CreateFloatedWindow();
+
+  auto* split_view_controller =
+      SplitViewController::Get(Shell::GetPrimaryRootWindow());
+
+  // If there are no other windows, expect to enter overview. The hotseat will
+  // extended and users can pick a second app from there.
+  const WindowSnapWMEvent snap_left(WM_EVENT_SNAP_PRIMARY);
+  WindowState::Get(window.get())->OnWMEvent(&snap_left);
+  ASSERT_TRUE(Shell::Get()->overview_controller()->InOverviewSession());
+  ASSERT_TRUE(split_view_controller->InSplitViewMode());
+
+  // Float the window so we can snap it again. Assert that we are still in
+  // overview, but no longer in splitview.
+  PressAndReleaseKey(ui::VKEY_F, ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN);
+  ASSERT_TRUE(WindowState::Get(window.get())->IsFloated());
+  ASSERT_TRUE(Shell::Get()->overview_controller()->InOverviewSession());
+  ASSERT_FALSE(split_view_controller->InSplitViewMode());
+
+  // Create a second window.
+  auto other_window = CreateAppWindow();
+  wm::ActivateWindow(window.get());
+
+  // Tests that when we snap `window` now, `other_window` will get snapped to
+  // the opposite side.
+  WindowState::Get(window.get())->OnWMEvent(&snap_left);
+  EXPECT_FALSE(Shell::Get()->overview_controller()->InOverviewSession());
+  EXPECT_TRUE(split_view_controller->BothSnapped());
+  EXPECT_EQ(split_view_controller->left_window(), window.get());
+  EXPECT_EQ(split_view_controller->right_window(), other_window.get());
+}
+
 }  // namespace ash
diff --git a/ash/wm/splitview/split_view_controller.cc b/ash/wm/splitview/split_view_controller.cc
index cb9d1067..0278478 100644
--- a/ash/wm/splitview/split_view_controller.cc
+++ b/ash/wm/splitview/split_view_controller.cc
@@ -647,7 +647,8 @@
     if (WindowState::Get(window)->GetStateType() ==
         GetStateTypeFromSnapPosition(snap_position)) {
       split_view_controller_->AttachSnappingWindow(window, snap_position);
-      split_view_controller_->OnWindowSnapped(window);
+      split_view_controller_->OnWindowSnapped(window,
+                                              /*previous_state=*/absl::nullopt);
     } else {
       to_be_snapped_windows_[snap_position] = window;
       WindowState::Get(window)->AddObserver(this);
@@ -1676,7 +1677,7 @@
     if (state_ == State::kNoSnap &&
         split_view_type_ == SplitViewType::kTabletType &&
         old_type != WindowStateType::kMinimized &&
-        !window_state->window()->transform().IsIdentity()) {
+        !window->transform().IsIdentity()) {
       // For the divider spawn animation, at the end of the delay, the divider
       // shall be visually aligned with an edge of |window|. This effect will
       // be more easily achieved after |window| has been snapped and the
@@ -1684,7 +1685,7 @@
       // flag to indicate that the divider spawn animation should be done.
       do_divider_spawn_animation = true;
     }
-    OnWindowSnapped(window_state->window());
+    OnWindowSnapped(window, old_type);
     if (do_divider_spawn_animation)
       DoSplitDividerSpawnAnimation(window);
   } else if (window_state->IsNormalStateType() || window_state->IsMaximized() ||
@@ -1697,9 +1698,12 @@
     EndSplitView();
     Shell::Get()->overview_controller()->EndOverview(
         OverviewEndAction::kSplitView);
+  } else if (window_state->IsFloated()) {
+    OnSnappedWindowDetached(window, WindowDetachedReason::kWindowFloated);
+
+    // TODO(crbug.com/1351562): Consider ending overview here.
   } else if (window_state->IsMinimized()) {
-    OnSnappedWindowDetached(window_state->window(),
-                            WindowDetachedReason::kWindowMinimized);
+    OnSnappedWindowDetached(window, WindowDetachedReason::kWindowMinimized);
 
     if (!InSplitViewMode()) {
       // We have different behaviors for a minimized window: in tablet splitview
@@ -1708,7 +1712,7 @@
       // clamshell splitview mode, we respect the minimization of the window
       // and end overview instead.
       if (split_view_type_ == SplitViewType::kTabletType) {
-        InsertWindowToOverview(window_state->window());
+        InsertWindowToOverview(window);
       } else {
         Shell::Get()->overview_controller()->EndOverview(
             OverviewEndAction::kSplitView);
@@ -2354,7 +2358,9 @@
                                           : work_area_bounds.height();
 }
 
-void SplitViewController::OnWindowSnapped(aura::Window* window) {
+void SplitViewController::OnWindowSnapped(
+    aura::Window* window,
+    absl::optional<chromeos::WindowStateType> previous_state) {
   RestoreTransformIfApplicable(window);
   UpdateStateAndNotifyObservers();
   UpdateWindowStackingAfterSnap(window);
@@ -2367,6 +2373,30 @@
     wm::ActivateWindow(window);
   }
 
+  // In tablet mode, if the window was previously floated, and there is another
+  // non-minimized window, do not enter overview but instead snap that window to
+  // the opposite side.
+  if (previous_state &&
+      *previous_state == chromeos::WindowStateType::kFloated &&
+      Shell::Get()->tablet_mode_controller()->InTabletMode()) {
+    auto mru_windows =
+        Shell::Get()->mru_window_tracker()->BuildWindowForCycleList(
+            kActiveDesk);
+    for (aura::Window* mru_window : mru_windows) {
+      auto* window_state = WindowState::Get(mru_window);
+      if (mru_window != window && !window_state->IsMinimized() &&
+          window_state->CanSnap()) {
+        const SnapPosition snap_position =
+            GetPositionOfSnappedWindow(window) == LEFT ? RIGHT : LEFT;
+        WindowSnapWMEvent event(snap_position == LEFT
+                                    ? WM_EVENT_SNAP_PRIMARY
+                                    : WM_EVENT_SNAP_SECONDARY);
+        WindowState::Get(mru_window)->OnWMEvent(&event);
+        return;
+      }
+    }
+  }
+
   // If in tablet split view, make sure overview is opened on the other side of
   // the split if there is only one snapped window in split screen.
   auto* overview_controller = Shell::Get()->overview_controller();
@@ -2382,13 +2412,16 @@
                                                   WindowDetachedReason reason) {
   const bool is_window_destroyed =
       reason == WindowDetachedReason::kWindowDestroyed;
+  const SnapPosition position_of_snapped_window =
+      GetPositionOfSnappedWindow(window);
+
   // Detach it from splitview first if the window is to be destroyed to prevent
   // unnecessary bounds/state update to it when ending splitview resizing. For
   // the window that is not going to be destroyed, we still need its bounds and
   // state to be updated to match the updated divider position before detaching
   // it from splitview.
   if (is_window_destroyed)
-    StopObserving(GetPositionOfSnappedWindow(window));
+    StopObserving(position_of_snapped_window);
 
   // Stop resizing if one of the snapped window is detached from split
   // view.
@@ -2401,7 +2434,7 @@
   }
 
   if (!is_window_destroyed)
-    StopObserving(GetPositionOfSnappedWindow(window));
+    StopObserving(position_of_snapped_window);
 
   if (!left_window_ && !right_window_) {
     // If there is no snapped window at this moment, ends split view mode. Note
@@ -2410,8 +2443,22 @@
     EndSplitView(reason == WindowDetachedReason::kWindowDragged
                      ? EndReason::kWindowDragStarted
                      : EndReason::kNormal);
+
+    // TODO(crbug.com/1351562): Consider not allowing one snapped window to be
+    // floated. Then this should be a DCHECK.
   } else {
     DCHECK_EQ(split_view_type_, SplitViewType::kTabletType);
+
+    if (reason == WindowDetachedReason::kWindowFloated &&
+        Shell::Get()->tablet_mode_controller()->InTabletMode()) {
+      // Maximize the other window, which will end split view.
+      aura::Window* other_window =
+          GetSnappedWindow(position_of_snapped_window == LEFT ? RIGHT : LEFT);
+      WMEvent event(WM_EVENT_MAXIMIZE);
+      WindowState::Get(other_window)->OnWMEvent(&event);
+      return;
+    }
+
     // If there is still one snapped window after minimizing/closing one snapped
     // window, update its snap state and open overview window grid.
     default_snap_position_ = left_window_ ? LEFT : RIGHT;
diff --git a/ash/wm/splitview/split_view_controller.h b/ash/wm/splitview/split_view_controller.h
index 7baf2d5..86d4abd 100644
--- a/ash/wm/splitview/split_view_controller.h
+++ b/ash/wm/splitview/split_view_controller.h
@@ -388,6 +388,7 @@
     kWindowMinimized,
     kWindowDestroyed,
     kWindowDragged,
+    kWindowFloated,
   };
 
   // These functions return |left_window_| and |right_window_|, swapped in
@@ -459,8 +460,12 @@
 
   // Called after a to-be-snapped window |window| got snapped. It updates the
   // split view states and notifies observers about the change. It also restore
-  // the snapped window's transform if it's not identity and activate it.
-  void OnWindowSnapped(aura::Window* window);
+  // the snapped window's transform if it's not identity and activate it. If
+  // `previous_state` is given and it is a floated window, attempt to snap the
+  // next MRU window if possible.
+  void OnWindowSnapped(
+      aura::Window* window,
+      absl::optional<chromeos::WindowStateType> previous_state);
 
   // If there are two snapped windows, closing/minimizing/tab-dragging one of
   // them will open overview window grid on the closed/minimized/tab-dragged
diff --git a/ash/wm/tablet_mode/tablet_mode_window_state.cc b/ash/wm/tablet_mode/tablet_mode_window_state.cc
index ecc5bc33..dc8e348 100644
--- a/ash/wm/tablet_mode/tablet_mode_window_state.cc
+++ b/ash/wm/tablet_mode/tablet_mode_window_state.cc
@@ -291,9 +291,10 @@
                    true /* animated */);
       break;
     case WM_EVENT_PIN:
-      if (!Shell::Get()->screen_pinning_controller()->IsPinned())
+      if (!Shell::Get()->screen_pinning_controller()->IsPinned()) {
         UpdateWindow(window_state, WindowStateType::kPinned,
                      true /* animated */);
+      }
       break;
     case WM_EVENT_PIP:
       if (!window_state->IsPip()) {
@@ -301,9 +302,10 @@
       }
       break;
     case WM_EVENT_TRUSTED_PIN:
-      if (!Shell::Get()->screen_pinning_controller()->IsPinned())
+      if (!Shell::Get()->screen_pinning_controller()->IsPinned()) {
         UpdateWindow(window_state, WindowStateType::kTrustedPinned,
                      true /* animated */);
+      }
       break;
     case WM_EVENT_TOGGLE_MAXIMIZE_CAPTION:
     case WM_EVENT_TOGGLE_VERTICAL_MAXIMIZE:
@@ -457,13 +459,14 @@
 void TabletModeWindowState::UpdateWindow(WindowState* window_state,
                                          WindowStateType target_state,
                                          bool animated) {
+  aura::Window* window = window_state->window();
+
   DCHECK(target_state == WindowStateType::kMinimized ||
          target_state == WindowStateType::kMaximized ||
          target_state == WindowStateType::kPinned ||
          target_state == WindowStateType::kTrustedPinned ||
          (target_state == WindowStateType::kNormal &&
-          (!window_state->CanMaximize() ||
-           !!wm::GetTransientParent(window_state->window()))) ||
+          (!window_state->CanMaximize() || !!wm::GetTransientParent(window))) ||
          target_state == WindowStateType::kFullscreen ||
          target_state == WindowStateType::kPrimarySnapped ||
          target_state == WindowStateType::kSecondarySnapped ||
@@ -483,46 +486,42 @@
   window_state->NotifyPreStateTypeChange(old_state_type);
 
   if (target_state == WindowStateType::kFloated)
-    Shell::Get()->float_controller()->Float(window_state->window());
+    Shell::Get()->float_controller()->FloatForTablet(window, old_state_type);
 
   // Unfloat floated window when exiting float state to another state.
   if (old_state_type == WindowStateType::kFloated)
-    Shell::Get()->float_controller()->Unfloat(window_state->window());
+    Shell::Get()->float_controller()->UnfloatImpl(window);
 
   if (target_state == WindowStateType::kMinimized) {
     wm::SetWindowVisibilityAnimationType(
-        window_state->window(), WINDOW_VISIBILITY_ANIMATION_TYPE_MINIMIZE);
-    window_state->window()->Hide();
+        window, WINDOW_VISIBILITY_ANIMATION_TYPE_MINIMIZE);
+    window->Hide();
     if (window_state->IsActive())
       window_state->Deactivate();
   } else {
     UpdateBounds(window_state, animated);
   }
 
-  if ((window_state->window()->layer()->GetTargetVisibility() ||
+  if ((window->layer()->GetTargetVisibility() ||
        old_state_type == WindowStateType::kMinimized) &&
-      !window_state->window()->layer()->visible()) {
+      !window->layer()->visible()) {
     // The layer may be hidden if the window was previously minimized. Make
     // sure it's visible.
-    window_state->window()->Show();
+    window->Show();
   }
 
   window_state->NotifyPostStateTypeChange(old_state_type);
 
-  if (old_state_type == WindowStateType::kPinned ||
-      target_state == WindowStateType::kPinned ||
-      old_state_type == WindowStateType::kTrustedPinned ||
-      target_state == WindowStateType::kTrustedPinned) {
-    Shell::Get()->screen_pinning_controller()->SetPinnedWindow(
-        window_state->window());
+  if (chromeos::IsPinnedWindowStateType(old_state_type) ||
+      chromeos::IsPinnedWindowStateType(target_state)) {
+    Shell::Get()->screen_pinning_controller()->SetPinnedWindow(window);
   }
 }
 
 WindowStateType TabletModeWindowState::GetSnappedWindowStateType(
     WindowState* window_state,
     WindowStateType target_state) {
-  DCHECK(target_state == WindowStateType::kPrimarySnapped ||
-         target_state == WindowStateType::kSecondarySnapped);
+  DCHECK(chromeos::IsSnappedWindowStateType(target_state));
   return SplitViewController::Get(Shell::GetPrimaryRootWindow())
                  ->CanSnapWindow(window_state->window())
              ? target_state
diff --git a/base/BUILD.gn b/base/BUILD.gn
index bbaeacc6..a70160c 100644
--- a/base/BUILD.gn
+++ b/base/BUILD.gn
@@ -4298,6 +4298,11 @@
     annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
 
     resources_package = "org.chromium.base"
+
+    proguard_configs = [
+      "android/proguard/chromium_apk.flags",
+      "android/proguard/chromium_code.flags",
+    ]
   }
 
   android_aidl("base_java_aidl") {
diff --git a/base/process/process_metrics.cc b/base/process/process_metrics.cc
index f747b1d..5a0e276 100644
--- a/base/process/process_metrics.cc
+++ b/base/process/process_metrics.cc
@@ -100,8 +100,8 @@
 }
 
 #if !BUILDFLAG(IS_FREEBSD) || !BUILDFLAG(IS_POSIX)
-double ProcessMetrics::GetPlatformIndependentCPUUsage() {
-  TimeDelta cumulative_cpu = GetCumulativeCPUUsage();
+double ProcessMetrics::GetPlatformIndependentCPUUsage(
+    TimeDelta cumulative_cpu) {
   TimeTicks time = TimeTicks::Now();
 
   if (last_cumulative_cpu_.is_zero()) {
@@ -122,11 +122,14 @@
 
   return 100.0 * cpu_time_delta / time_delta;
 }
+
+double ProcessMetrics::GetPlatformIndependentCPUUsage() {
+  return GetPlatformIndependentCPUUsage(GetCumulativeCPUUsage());
+}
 #endif
 
 #if BUILDFLAG(IS_WIN)
-double ProcessMetrics::GetPreciseCPUUsage() {
-  TimeDelta cumulative_cpu = GetPreciseCumulativeCPUUsage();
+double ProcessMetrics::GetPreciseCPUUsage(TimeDelta cumulative_cpu) {
   TimeTicks time = TimeTicks::Now();
 
   if (last_precise_cumulative_cpu_.is_zero()) {
@@ -147,6 +150,10 @@
 
   return 100.0 * cpu_time_delta / time_delta;
 }
+
+double ProcessMetrics::GetPreciseCPUUsage() {
+  return GetPreciseCPUUsage(GetPreciseCumulativeCPUUsage());
+}
 #endif  // BUILDFLAG(IS_WIN)
 
 #if BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || \
diff --git a/base/process/process_metrics.h b/base/process/process_metrics.h
index 34675dd0..14d38f0 100644
--- a/base/process/process_metrics.h
+++ b/base/process/process_metrics.h
@@ -114,17 +114,22 @@
 #endif
 
   // Returns the percentage of time spent executing, across all threads of the
-  // process, in the interval since the last time the method was called. Since
-  // this considers the total execution time across all threads in a process,
-  // the result can easily exceed 100% in multi-thread processes running on
-  // multi-core systems. In general the result is therefore a value in the
-  // range 0% to SysInfo::NumberOfProcessors() * 100%.
+  // process, in the interval since the last time the method was called, using
+  // the current |cumulative_cpu|. Since this considers the total execution time
+  // across all threads in a process, the result can easily exceed 100% in
+  // multi-thread processes running on multi-core systems. In general the result
+  // is therefore a value in the range 0% to
+  // SysInfo::NumberOfProcessors() * 100%.
   //
   // To obtain the percentage of total available CPU resources consumed by this
   // process over the interval, the caller must divide by NumberOfProcessors().
   //
   // Since this API measures usage over an interval, it will return zero on the
   // first call, and an actual value only on the second and subsequent calls.
+  [[nodiscard]] double GetPlatformIndependentCPUUsage(TimeDelta cumulative_cpu);
+
+  // Same as the above, but automatically calls GetCumulativeCPUUsage() to
+  // determine the current cumulative CPU.
   [[nodiscard]] double GetPlatformIndependentCPUUsage();
 
   // Returns the cumulative CPU usage across all threads of the process since
@@ -139,10 +144,15 @@
   // and that they can replace the old implementation.
 
   // Returns the percentage of time spent executing, across all threads of the
-  // process, in the interval since the last time the method was called.
+  // process, in the interval since the last time the method was called, using
+  // the current |cumulative_cpu|.
   //
   // Same as GetPlatformIndependentCPUUSage() but implemented using
   // `QueryProcessCycleTime` for higher precision.
+  [[nodiscard]] double GetPreciseCPUUsage(TimeDelta cumulative_cpu);
+
+  // Same as the above, but automatically calls GetPreciseCumulativeCPUUsage()
+  // to determine the current cumulative CPU.
   [[nodiscard]] double GetPreciseCPUUsage();
 
   // Returns the cumulative CPU usage across all threads of the process since
diff --git a/base/test/gtest_util.h b/base/test/gtest_util.h
index faa6935..a08dad2 100644
--- a/base/test/gtest_util.h
+++ b/base/test/gtest_util.h
@@ -10,6 +10,7 @@
 #include <vector>
 
 #include "base/check.h"
+#include "base/debug/debugging_buildflags.h"
 #include "build/build_config.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -19,8 +20,13 @@
 // dcheck builds as DCHECKs are intended to catch things that should never
 // happen and as such executing the statement results in undefined behavior
 // (|statement| is compiled in unsupported configurations nonetheless).
+// DCHECK_IS_CONFIGURABLE is excluded from DCHECK_DEATH because it's non-FATAL
+// by default and there are no known tests that configure a FATAL level. If this
+// gets used from FATAL contexts under DCHECK_IS_CONFIGURABLE this may need to
+// be updated to look at LOGGING_DCHECK's current severity level.
 // Death tests misbehave on Android.
-#if DCHECK_IS_ON() && defined(GTEST_HAS_DEATH_TEST) && !BUILDFLAG(IS_ANDROID)
+#if DCHECK_IS_ON() && defined(GTEST_HAS_DEATH_TEST) && \
+    !BUILDFLAG(DCHECK_IS_CONFIGURABLE) && !BUILDFLAG(IS_ANDROID)
 
 // EXPECT/ASSERT_DCHECK_DEATH tests verify that a DCHECK is hit ("Check failed"
 // is part of the error message). Optionally you may specify part of the message
@@ -31,7 +37,6 @@
 #define ASSERT_DCHECK_DEATH_WITH(statement, msg) ASSERT_DEATH(statement, msg)
 
 #else
-// DCHECK_IS_ON() && defined(GTEST_HAS_DEATH_TEST) && !BUILDFLAG(IS_ANDROID)
 
 #define EXPECT_DCHECK_DEATH(statement) \
   GTEST_UNSUPPORTED_DEATH_TEST(statement, "Check failed", )
@@ -42,8 +47,8 @@
 #define ASSERT_DCHECK_DEATH_WITH(statement, msg) \
   GTEST_UNSUPPORTED_DEATH_TEST(statement, msg, return )
 
-#endif
-// DCHECK_IS_ON() && defined(GTEST_HAS_DEATH_TEST) && !BUILDFLAG(IS_ANDROID)
+#endif  // DCHECK_IS_ON() && defined(GTEST_HAS_DEATH_TEST) &&
+        // !BUILDFLAG(DCHECK_IS_CONFIGURABLE) && !BUILDFLAG(IS_ANDROID)
 
 // As above, but for CHECK().
 #if defined(GTEST_HAS_DEATH_TEST) && !BUILDFLAG(IS_ANDROID)
diff --git a/base/types/OWNERS b/base/types/OWNERS
index 192ba64..9172b53 100644
--- a/base/types/OWNERS
+++ b/base/types/OWNERS
@@ -1,2 +1 @@
 lukasza@chromium.org
-mpawlowski@opera.com
diff --git a/build/android/pylib/local/emulator/avd.py b/build/android/pylib/local/emulator/avd.py
index ae69c591..c8f0d0e6 100644
--- a/build/android/pylib/local/emulator/avd.py
+++ b/build/android/pylib/local/emulator/avd.py
@@ -33,6 +33,10 @@
 COMMON_CIPD_ROOT = os.path.join(constants.DIR_SOURCE_ROOT, '.android_emulator')
 
 _ALL_PACKAGES = object()
+
+# These files are used as backing files for corresponding qcow2 images.
+_BACKING_FILES = ('system.img', 'vendor.img')
+
 _DEFAULT_AVDMANAGER_PATH = os.path.join(
     constants.ANDROID_SDK_ROOT, 'cmdline-tools', 'latest', 'bin', 'avdmanager')
 # Default to a 480dp mdpi screen (a relatively large phone).
@@ -246,6 +250,8 @@
         COMMON_CIPD_ROOT, self._config.emulator_package.dest_path)
     self._emulator_path = os.path.join(self._emulator_sdk_root, 'emulator',
                                        'emulator')
+    self._qemu_img_path = os.path.join(self._emulator_sdk_root, 'emulator',
+                                       'qemu-img')
 
     self._initialized = False
     self._initializer_lock = threading.Lock()
@@ -267,6 +273,12 @@
     return os.path.join(self._avd_home, '%s.avd' % self._config.avd_name)
 
   @property
+  def _system_image_dir(self):
+    return os.path.join(COMMON_CIPD_ROOT,
+                        self._config.system_image_package.dest_path,
+                        *self._config.system_image_name.split(';'))
+
+  @property
   def _config_ini_path(self):
     return os.path.join(self._avd_dir, 'config.ini')
 
@@ -555,6 +567,33 @@
     self._InstallCipdPackages(packages=packages)
     self._MakeWriteable()
     self._UpdateConfigs()
+    self._RebaseQcow2Images()
+
+  def _RebaseQcow2Images(self):
+    """Rebase the paths in qcow2 images.
+
+    qcow2 files may exists in avd directory which have hard-coded paths to the
+    backing files, e.g., system.img, vendor.img. Such paths need to be rebased
+    if the avd is moved to a different directory in order to boot successfully.
+    """
+    for f in _BACKING_FILES:
+      qcow2_image_path = os.path.join(self._avd_dir, '%s.qcow2' % f)
+      if not os.path.exists(qcow2_image_path):
+        continue
+      backing_file_path = os.path.join(self._system_image_dir, f)
+      logging.info('Rebasing the qcow2 image %r with the backing file %r',
+                   qcow2_image_path, backing_file_path)
+      cmd_helper.RunCmd([
+          self._qemu_img_path,
+          'rebase',
+          '-u',
+          '-f',
+          'qcow2',
+          '-b',
+          # The path to backing file must be relative to the qcow2 image.
+          os.path.relpath(backing_file_path, os.path.dirname(qcow2_image_path)),
+          qcow2_image_path,
+      ])
 
   def _IterVersionedCipdPackages(self, packages):
     pkgs_by_dir = collections.defaultdict(list)
diff --git a/build/toolchain/apple/toolchain.gni b/build/toolchain/apple/toolchain.gni
index f52efc73..edbad45 100644
--- a/build/toolchain/apple/toolchain.gni
+++ b/build/toolchain/apple/toolchain.gni
@@ -15,6 +15,7 @@
 import("//build/toolchain/goma.gni")
 import("//build/toolchain/rbe.gni")
 import("//build/toolchain/toolchain.gni")
+import("//build_overrides/build.gni")
 
 assert((target_os == "ios" && host_os == "mac") || host_os != "win")
 
@@ -26,10 +27,20 @@
   # for official builds, and "false" for all other builds.
   swift_whole_module_optimization = -1
 
-  # if unspecified, will use the toolchain downloaded via deps.
+  # If unspecified, will use the toolchain downloaded via deps.
   swift_toolchain_path = ""
 }
 
+if (swift_toolchain_path == "" && build_with_chromium) {
+  # Version of the hermetic compiler. Needs to be updated when a new version
+  # of the compiler is rolled to ensure that all outputs are regenerated.
+  swiftc_version = "llvm:d5f117e38620783-swift:3a67c1adc57fc80"
+
+  # Use the hermetic swift toolchain.
+  swift_toolchain_path =
+      rebase_path("//third_party/swift-toolchain/", root_build_dir)
+}
+
 if (swift_whole_module_optimization == -1) {
   swift_whole_module_optimization = is_official_build
 }
@@ -544,12 +555,6 @@
       tool("swift") {
         _tool = rebase_path("//build/toolchain/ios/swiftc.py", root_build_dir)
 
-        if (swift_toolchain_path == "") {
-          swift_toolchain_default =
-              rebase_path("//third_party/swift-toolchain/", root_build_dir)
-          swift_toolchain_path = swift_toolchain_default
-        }
-
         depfile = "{{target_out_dir}}/{{module_name}}.d"
         depsformat = "gcc"
 
@@ -564,13 +569,16 @@
           "{{target_gen_dir}}/{{module_name}}.swiftsourceinfo",
         ]
 
+        # Additional flags passed to the wrapper script but that are only
+        # set conditionally.
+        _extra_flags = ""
+
         if (swift_whole_module_optimization) {
-          _extra_flags = "-whole-module-optimization"
+          _extra_flags += " -whole-module-optimization"
           _objects_dir = "{{target_out_dir}}"
 
           outputs += [ "$_objects_dir/{{module_name}}.o" ]
         } else {
-          _extra_flags = ""
           _objects_dir = "{{target_out_dir}}/{{label_name}}"
 
           partial_outputs = [ "$_objects_dir/{{source_name_part}}.o" ]
@@ -612,6 +620,23 @@
         _pch_output_dir = "{{target_out_dir}}/{{module_name}}:pch/"
         outputs += [ _pch_output_dir ]
 
+        # The swift compiler maintains a global cache of the modules found.
+        # This cache contains files that depends on the compiler version
+        # but the default value for this directory is independent of the
+        # compiler version. This can result in errors where the compiler
+        # complaints that the cached files where generated with a different
+        # version of the compiler and cannot be loaded.
+        #
+        # If using the hermetic swiftc compiler, override the path to point
+        # to a path that depends on the version of the compiler. This has
+        # the beneficial side-effect of forcing ninja to consider all the
+        # outputs of the compiler as dirty when a new version of the compiler
+        # is rolled.
+        if (defined(swiftc_version)) {
+          _module_cache_path = "{{root_out_dir}}/$swiftc_version/ModuleCache"
+          _extra_flags += " -module-cache-path '$_module_cache_path'"
+        }
+
         command =
             "$_env_vars $python_path $_tool -module-name {{module_name}} " +
             "-root-dir " + rebase_path("//", root_build_dir) + " " +
@@ -621,7 +646,7 @@
             "-depfile {{target_out_dir}}/{{module_name}}.d " +
             "-depfile-filter {{target_gen_dir}}/{{module_name}}.swiftmodule " +
             "-bridge-header {{bridge_header}} $_extra_flags " +
-            "-swift-toolchain-path $swift_toolchain_path" + " " +
+            "-swift-toolchain-path $swift_toolchain_path " +
             "{{swiftflags}} {{include_dirs}} {{module_dirs}} {{inputs}}"
       }
     }
diff --git a/build/toolchain/ios/swiftc.py b/build/toolchain/ios/swiftc.py
index 10e7f0f..9fabd0a 100644
--- a/build/toolchain/ios/swiftc.py
+++ b/build/toolchain/ios/swiftc.py
@@ -113,6 +113,14 @@
         '-enable-cxx-interop',
     ])
 
+  if settings.module_cache_path:
+    if not os.path.exists(settings.module_cache_path):
+      os.makedirs(settings.module_cache_path)
+    extra_args.extend([
+        '-module-cache-path',
+        os.path.abspath(settings.module_cache_path),
+    ])
+
   # Allow an alternative Swift toolchain (such as ToT or a newer version)
   # by utilizing `xcrun`. If an alternative is not present in either
   # /Library/Developer/Toolchains or ~/Library/Developer/Toolchains, this
@@ -209,6 +217,8 @@
   parser.add_argument('-pch-output-dir',
                       help='path to directory where .pch files are saved')
   parser.add_argument('-module-path', help='path to the generated module file')
+  parser.add_argument('-module-cache-path',
+                      help='path to the clang module cache')
   parser.add_argument('-header-path', help='path to the generated header file')
   parser.add_argument('-bridge-header',
                       help='path to the Objective-C bridge header')
diff --git a/buildtools/deps_revisions.gni b/buildtools/deps_revisions.gni
index 5bdd046..8c41409 100644
--- a/buildtools/deps_revisions.gni
+++ b/buildtools/deps_revisions.gni
@@ -5,5 +5,5 @@
 declare_args() {
   # Used to cause full rebuilds on libc++ rolls. This should be kept in sync
   # with the libcxx_revision vars in //DEPS.
-  libcxx_revision = "f30089a416b02dda7b0ee0bdeaa5d608cdd3034a"
+  libcxx_revision = "60c266d87cfd8cd7c9a541ea7095ee44a235a3ec"
 }
diff --git a/chrome/android/chrome_java_resources.gni b/chrome/android/chrome_java_resources.gni
index e550f10..422b540 100644
--- a/chrome/android/chrome_java_resources.gni
+++ b/chrome/android/chrome_java_resources.gni
@@ -55,7 +55,6 @@
   "java/res/drawable-hdpi/incognito_splash.png",
   "java/res/drawable-hdpi/infobar_chrome.png",
   "java/res/drawable-hdpi/infobar_mobile_friendly.png",
-  "java/res/drawable-hdpi/infobar_restore.png",
   "java/res/drawable-hdpi/infobar_translate.png",
   "java/res/drawable-hdpi/location_bar_incognito_badge.png",
   "java/res/drawable-hdpi/menu_update.png",
@@ -125,7 +124,6 @@
   "java/res/drawable-mdpi/incognito_splash.png",
   "java/res/drawable-mdpi/infobar_chrome.png",
   "java/res/drawable-mdpi/infobar_mobile_friendly.png",
-  "java/res/drawable-mdpi/infobar_restore.png",
   "java/res/drawable-mdpi/infobar_translate.png",
   "java/res/drawable-mdpi/location_bar_incognito_badge.png",
   "java/res/drawable-mdpi/menu_update.png",
@@ -207,7 +205,6 @@
   "java/res/drawable-xhdpi/incognito_splash.png",
   "java/res/drawable-xhdpi/infobar_chrome.png",
   "java/res/drawable-xhdpi/infobar_mobile_friendly.png",
-  "java/res/drawable-xhdpi/infobar_restore.png",
   "java/res/drawable-xhdpi/infobar_translate.png",
   "java/res/drawable-xhdpi/location_bar_incognito_badge.png",
   "java/res/drawable-xhdpi/menu_update.png",
@@ -271,7 +268,6 @@
   "java/res/drawable-xxhdpi/incognito_splash.png",
   "java/res/drawable-xxhdpi/infobar_chrome.png",
   "java/res/drawable-xxhdpi/infobar_mobile_friendly.png",
-  "java/res/drawable-xxhdpi/infobar_restore.png",
   "java/res/drawable-xxhdpi/infobar_translate.png",
   "java/res/drawable-xxhdpi/location_bar_incognito_badge.png",
   "java/res/drawable-xxhdpi/menu_update.png",
@@ -333,7 +329,6 @@
   "java/res/drawable-xxxhdpi/incognito_splash.png",
   "java/res/drawable-xxxhdpi/infobar_chrome.png",
   "java/res/drawable-xxxhdpi/infobar_mobile_friendly.png",
-  "java/res/drawable-xxxhdpi/infobar_restore.png",
   "java/res/drawable-xxxhdpi/infobar_translate.png",
   "java/res/drawable-xxxhdpi/location_bar_incognito_badge.png",
   "java/res/drawable-xxxhdpi/menu_update.png",
diff --git a/chrome/android/chrome_public_apk_tmpl.gni b/chrome/android/chrome_public_apk_tmpl.gni
index f55b7dd..fb2490a 100644
--- a/chrome/android/chrome_public_apk_tmpl.gni
+++ b/chrome/android/chrome_public_apk_tmpl.gni
@@ -289,11 +289,7 @@
       if (!defined(proguard_configs)) {
         proguard_configs = []
       }
-      proguard_configs += [
-        "//chrome/android/proguard/main.flags",
-        "//base/android/proguard/chromium_apk.flags",
-        "//base/android/proguard/chromium_code.flags",
-      ]
+      proguard_configs += [ "//chrome/android/proguard/main.flags" ]
     }
 
     if (use_chromium_linker) {
diff --git a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurface.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurface.java
index 2b34399..a84d1d3 100644
--- a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurface.java
+++ b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurface.java
@@ -35,6 +35,16 @@
     void destroy();
 
     /**
+     * Show the Start surface homepage. Used only when refactor is enabled.
+     */
+    void show(boolean animate);
+
+    /**
+     * Hide the Start surface homepage. Used only when refactor is enabled.
+     */
+    void hide(boolean animate);
+
+    /**
      * Called when the Start surface is hidden. It hides TasksSurfaces which are created when the
      * Start surface is enabled.
      */
diff --git a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinator.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinator.java
index ea79e28..c583803 100644
--- a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinator.java
+++ b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinator.java
@@ -354,6 +354,18 @@
     }
 
     @Override
+    public void show(boolean animate) {
+        getCarouselOrSingleTabListDelegate().prepareTabSwitcherView();
+        mStartSurfaceMediator.show(animate);
+    }
+
+    @Override
+    public void hide(boolean animate) {
+        hideTabSwitcherView(false);
+        onHide();
+    }
+
+    @Override
     public void addHeaderOffsetChangeListener(
             AppBarLayout.OnOffsetChangedListener onOffsetChangedListener) {
         // TODO (crbug.com/1113852): Add a header offset change listener for incognito homepage.
diff --git a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceHomeLayout.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceHomeLayout.java
index 441b052..40ed807 100644
--- a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceHomeLayout.java
+++ b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceHomeLayout.java
@@ -34,12 +34,12 @@
     private static final String TRACE_DONE_HIDING_START_SURFACE =
             "StartSurfaceHomeLayout.DoneHiding";
 
-    private final SceneLayer mSceneLayer;
     private final StartSurface mStartSurface;
 
     private boolean mIsShown;
     private boolean mIsInitialized;
     private Animator mBackgroundTabAnimation;
+    private SceneLayer mSceneLayer;
 
     /**
      * The {@link Layout} is not usable until sizeChanged is called. This is convenient this way so
@@ -52,26 +52,36 @@
     public StartSurfaceHomeLayout(Context context, LayoutUpdateHost updateHost,
             LayoutRenderHost renderHost, StartSurface startSurface) {
         super(context, updateHost, renderHost);
-        mSceneLayer = new SceneLayer();
         mStartSurface = startSurface;
+        mStartSurface.setOnTabSelectingListener(this::onTabSelecting);
     }
 
     @Override
     public void onFinishNativeInitialization() {
         if (mIsInitialized) return;
-
         mIsInitialized = true;
+        ensureSceneLayerCreated();
         mStartSurface.initWithNative();
     }
 
     @Override
+    protected void updateLayout(long time, long dt) {
+        ensureSceneLayerCreated();
+        super.updateLayout(time, dt);
+    }
+
+    @Override
     public void destroy() {}
 
     @Override
     public void show(long time, boolean animate) {
         try (TraceEvent e = TraceEvent.scoped(TRACE_SHOW_START_SURFACE)) {
             super.show(time, animate);
-            // TODO(crbug.com/1315676): Call StartSurface#show here.
+
+            // Lazy initialization if needed.
+            mStartSurface.initialize();
+            mStartSurface.show(animate);
+
             mIsShown = true;
         }
     }
@@ -80,8 +90,8 @@
     public void startHiding(int nextTabId, boolean hintAtTabSelection) {
         try (TraceEvent e = TraceEvent.scoped(TRACE_HIDE_START_SURFACE)) {
             super.startHiding(nextTabId, hintAtTabSelection);
-            // TODO(crbug.com/1315676): Call StartSurface#hide here.
             mIsShown = false;
+            mStartSurface.hide(false);
         }
     }
 
@@ -142,4 +152,9 @@
     public int getLayoutType() {
         return LayoutType.START_SURFACE;
     }
+
+    private void ensureSceneLayerCreated() {
+        if (mSceneLayer != null) return;
+        mSceneLayer = new SceneLayer();
+    }
 }
diff --git a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java
index 64bc8e3..22e73ed 100644
--- a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java
+++ b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java
@@ -398,6 +398,83 @@
         mFeedVisibilityPrefOnStartUp = prefService.getBoolean(Pref.ARTICLES_LIST_VISIBLE);
     }
 
+    /**
+     * Show Start Surface home view. Note: this should be called only when refactor flag is enabled.
+     * @param animate Whether to play an entry animation.
+     */
+    void show(boolean animate) {
+        assert ReturnToChromeUtil.isStartSurfaceEnabled(mContext)
+                && ReturnToChromeUtil.isTabSwitcherOnlyRefactorEnabled(mContext);
+
+        // This null check is for testing.
+        if (mPropertyModel == null) return;
+
+        // TODO(crbug.com/1347089): When entering the Start surface by tapping back button or other
+        // back gestures, we shouldn't reset the scrolling position. Maybe we could add a boolean
+        // |mResetPosition| and set it as false only when this method is called because of back
+        // actions.
+        mPropertyModel.set(RESET_TASK_SURFACE_HEADER_SCROLL_POSITION, true);
+        mPropertyModel.set(RESET_FEED_SURFACE_SCROLL_POSITION, true);
+        StartSurfaceUserData.getInstance().saveFeedInstanceState(null);
+
+        mIsIncognito = mTabModelSelector.isIncognitoSelected();
+        mPropertyModel.set(IS_INCOGNITO, mIsIncognito);
+        setMVTilesVisibility(!mIsIncognito);
+        setTabCarouselVisibility(getNormalTabCount() > 0 && !mIsIncognito);
+        setExploreSurfaceVisibility(!mIsIncognito && mExploreSurfaceCoordinatorFactory != null);
+        // TODO(qinmin): show query tiles when flag is enabled.
+        setQueryTilesVisibility(false);
+        setFakeBoxVisibility(!mIsIncognito);
+        setTopToolbarPlaceholderHeight(getPixelSize(R.dimen.control_container_height)
+                + getPixelSize(R.dimen.start_surface_fake_search_box_top_margin));
+        // Set the top margin to the top controls min height (indicator height if it's shown)
+        // since the toolbar height as extra margin is handled by top toolbar placeholder.
+        setTopMargin(mBrowserControlsStateProvider.getTopControlsMinHeight());
+        // Only pad single pane home page since tabs grid has already been padding for the
+        // bottom bar.
+        setBottomMargin(mBrowserControlsStateProvider.getBottomControlsHeight());
+        setIncognitoModeDescriptionVisibility(
+                mIsIncognito && (mTabModelSelector.getModel(true).getCount() <= 0));
+
+        // Make sure ExploreSurfaceCoordinator is built before the explore surface is showing
+        // by default.
+        if (mPropertyModel.get(IS_EXPLORE_SURFACE_VISIBLE)
+                && mPropertyModel.get(EXPLORE_SURFACE_COORDINATOR) == null
+                && !mActivityStateChecker.isFinishingOrDestroyed()
+                && mExploreSurfaceCoordinatorFactory != null) {
+            createAndSetExploreSurfaceCoordinator();
+        }
+
+        // TODO(crbug.com/1347089): Remove this property key since overview should always be visible
+        // when show() is called.
+        mPropertyModel.set(IS_SHOWING_OVERVIEW, true);
+
+        if (mNormalTabModel != null) {
+            mNormalTabModel.addObserver(mNormalTabModelObserver);
+        } else {
+            mPendingObserver = true;
+        }
+
+        mTabModelSelector.addObserver(mTabModelSelectorObserver);
+
+        if (mBrowserControlsObserver != null) {
+            mBrowserControlsStateProvider.addObserver(mBrowserControlsObserver);
+        }
+
+        if (mOmniboxStub != null) {
+            mOmniboxStub.addUrlFocusChangeListener(mUrlFocusChangeListener);
+        }
+
+        // This should only be called for single or carousel tab switcher.
+        mController.showTabSwitcherView(animate);
+
+        // TODO(crbug.com/1347089): Record
+        // mJankTracker.finishTrackingScenario(START_SURFACE_HOMEPAGE) when layout changes, maybe in
+        // LayoutManager.
+        RecordUserAction.record("StartSurface.Shown");
+        RecordUserAction.record("StartSurface.SinglePane.Home");
+    }
+
     void setSecondaryTasksSurfacePropertyModel(PropertyModel propertyModel) {
         mSecondaryTasksSurfacePropertyModel = propertyModel;
         mSecondaryTasksSurfacePropertyModel.set(IS_INCOGNITO, mIsIncognito);
@@ -741,7 +818,7 @@
                                 || mPreviousStartSurfaceState == StartSurfaceState.NOT_SHOWN));
     }
 
-    // Implements TabSwitcher.OverviewModeObserver.
+    // Implements TabSwitcher.TabSwitcherViewObserver.
     @Override
     public void startedShowing() {
         for (TabSwitcherViewObserver observer : mObservers) {
diff --git a/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/TabSwitcherAndStartSurfaceLayoutPerfTest.java b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/TabSwitcherAndStartSurfaceLayoutPerfTest.java
index 2b43a4c..0d1ede6d 100644
--- a/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/TabSwitcherAndStartSurfaceLayoutPerfTest.java
+++ b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/TabSwitcherAndStartSurfaceLayoutPerfTest.java
@@ -100,7 +100,7 @@
     @Before
     public void setUp() {
         mTestServer = EmbeddedTestServer.createAndStartServer(InstrumentationRegistry.getContext());
-        mActivityTestRule.startMainActivityFromLauncher();
+        mActivityTestRule.startMainActivityWithURL(NTP_URL);
 
         Layout layout = mActivityTestRule.getActivity().getLayoutManager().getOverviewLayout();
         assertTrue(layout instanceof TabSwitcherAndStartSurfaceLayout);
diff --git a/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/TabSwitcherAndStartSurfaceLayoutTest.java b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/TabSwitcherAndStartSurfaceLayoutTest.java
index 22c6b9a..587d7ece 100644
--- a/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/TabSwitcherAndStartSurfaceLayoutTest.java
+++ b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/TabSwitcherAndStartSurfaceLayoutTest.java
@@ -200,7 +200,7 @@
         AccessibilityChecks.enable();
         mTestServer = EmbeddedTestServer.createAndStartServer(InstrumentationRegistry.getContext());
         // After setUp, Chrome is launched and has one NTP.
-        mActivityTestRule.startMainActivityFromLauncher();
+        mActivityTestRule.startMainActivityWithURL(NTP_URL);
 
         Layout layout = mActivityTestRule.getActivity().getLayoutManager().getOverviewLayout();
         assertTrue(layout instanceof TabSwitcherAndStartSurfaceLayout);
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiTest.java
index dd42a88b..4bb5ffa9 100644
--- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiTest.java
+++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiTest.java
@@ -74,6 +74,7 @@
 import org.chromium.components.browser_ui.bottomsheet.BottomSheetController.SheetState;
 import org.chromium.components.browser_ui.bottomsheet.BottomSheetTestSupport;
 import org.chromium.components.browser_ui.bottomsheet.TestBottomSheetContent;
+import org.chromium.components.embedder_support.util.UrlConstants;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
 import org.chromium.ui.test.util.UiRestriction;
 
@@ -105,7 +106,7 @@
 
     @Before
     public void setUp() {
-        mActivityTestRule.startMainActivityFromLauncher();
+        mActivityTestRule.startMainActivityWithURL(UrlConstants.NTP_URL);
         Layout layout = mActivityTestRule.getActivity().getLayoutManager().getOverviewLayout();
         assertTrue(layout instanceof TabSwitcherAndStartSurfaceLayout);
         CriteriaHelper.pollUiThread(
diff --git a/chrome/android/java/res/drawable-hdpi/infobar_restore.png b/chrome/android/java/res/drawable-hdpi/infobar_restore.png
deleted file mode 100644
index f80affe..0000000
--- a/chrome/android/java/res/drawable-hdpi/infobar_restore.png
+++ /dev/null
Binary files differ
diff --git a/chrome/android/java/res/drawable-mdpi/infobar_restore.png b/chrome/android/java/res/drawable-mdpi/infobar_restore.png
deleted file mode 100644
index a46acb6..0000000
--- a/chrome/android/java/res/drawable-mdpi/infobar_restore.png
+++ /dev/null
Binary files differ
diff --git a/chrome/android/java/res/drawable-xhdpi/infobar_restore.png b/chrome/android/java/res/drawable-xhdpi/infobar_restore.png
deleted file mode 100644
index acf0257f..0000000
--- a/chrome/android/java/res/drawable-xhdpi/infobar_restore.png
+++ /dev/null
Binary files differ
diff --git a/chrome/android/java/res/drawable-xxhdpi/infobar_restore.png b/chrome/android/java/res/drawable-xxhdpi/infobar_restore.png
deleted file mode 100644
index 64e1758..0000000
--- a/chrome/android/java/res/drawable-xxhdpi/infobar_restore.png
+++ /dev/null
Binary files differ
diff --git a/chrome/android/java/res/drawable-xxxhdpi/infobar_restore.png b/chrome/android/java/res/drawable-xxxhdpi/infobar_restore.png
deleted file mode 100644
index 329eebe38..0000000
--- a/chrome/android/java/res/drawable-xxxhdpi/infobar_restore.png
+++ /dev/null
Binary files differ
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
index 084502f5..31f1535 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
@@ -2843,7 +2843,9 @@
 
     @Override
     public boolean isInOverviewMode() {
-        return mLayoutManager != null && mLayoutManager.isLayoutVisible(LayoutType.TAB_SWITCHER);
+        return mLayoutManager != null
+                && (mLayoutManager.isLayoutVisible(LayoutType.TAB_SWITCHER)
+                        || mLayoutManager.isLayoutVisible(LayoutType.START_SURFACE));
     }
 
     @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java
index 81494f4..71880ab 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java
@@ -83,7 +83,6 @@
 import org.chromium.components.embedder_support.util.UrlConstants;
 import org.chromium.components.embedder_support.util.UrlUtilities;
 import org.chromium.components.power_bookmarks.PowerBookmarkMeta;
-import org.chromium.components.power_bookmarks.PowerBookmarkType;
 import org.chromium.components.webapk.lib.client.WebApkValidator;
 import org.chromium.components.webapps.AppBannerManager;
 import org.chromium.components.webapps.WebappsUtils;
@@ -1168,8 +1167,7 @@
 
         PowerBookmarkMeta existingBookmarkMeta = PowerBookmarkUtils.getBookmarkBookmarkMetaForTab(
                 mBookmarkBridgeSupplier.get(), currentTab);
-        if (existingBookmarkMeta != null
-                && existingBookmarkMeta.getType() != PowerBookmarkType.SHOPPING) {
+        if (existingBookmarkMeta != null && !existingBookmarkMeta.hasShoppingSpecifics()) {
             startPriceTrackingMenuItem.setVisible(false);
             stopPriceTrackingMenuItem.setVisible(false);
             return;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkBridge.java
index 7d6858bebb..e32d3f81a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkBridge.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkBridge.java
@@ -693,7 +693,7 @@
         // IDs.
         for (BookmarkId product : products) {
             PowerBookmarkMeta meta = getPowerBookmarkMeta(product);
-            if (meta.getType() != PowerBookmarkType.SHOPPING) continue;
+            if (!meta.hasShoppingSpecifics()) continue;
 
             ShoppingSpecifics specifics = meta.getShoppingSpecifics();
             if (offerIdMap.contains(specifics.getOfferId())
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkItemsAdapter.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkItemsAdapter.java
index 1a276eb..04972c3b 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkItemsAdapter.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkItemsAdapter.java
@@ -46,7 +46,6 @@
 import org.chromium.components.image_fetcher.ImageFetcherConfig;
 import org.chromium.components.image_fetcher.ImageFetcherFactory;
 import org.chromium.components.power_bookmarks.PowerBookmarkMeta;
-import org.chromium.components.power_bookmarks.PowerBookmarkType;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -161,7 +160,7 @@
     private void filterForPriceTrackingCategory(List<BookmarkId> bookmarks) {
         for (int i = bookmarks.size() - 1; i >= 0; i--) {
             PowerBookmarkMeta meta = mDelegate.getModel().getPowerBookmarkMeta(bookmarks.get(i));
-            if (meta == null || meta.getType() != PowerBookmarkType.SHOPPING
+            if (meta == null || !meta.hasShoppingSpecifics()
                     || !meta.getShoppingSpecifics().getIsPriceTracked()) {
                 bookmarks.remove(i);
                 continue;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkListEntry.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkListEntry.java
index d8bf28ee..4d6931c2 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkListEntry.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkListEntry.java
@@ -11,7 +11,6 @@
 
 import org.chromium.chrome.browser.bookmarks.BookmarkBridge.BookmarkItem;
 import org.chromium.components.power_bookmarks.PowerBookmarkMeta;
-import org.chromium.components.power_bookmarks.PowerBookmarkType;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -77,7 +76,7 @@
             @Nonnull BookmarkItem bookmarkItem, @Nullable PowerBookmarkMeta meta) {
         @ViewType
         int viewType = bookmarkItem.isFolder() ? ViewType.FOLDER : ViewType.BOOKMARK;
-        if (meta != null && meta.getType() == PowerBookmarkType.SHOPPING) {
+        if (meta != null && meta.hasShoppingSpecifics()) {
             viewType = ViewType.SHOPPING_POWER_BOOKMARK;
         }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSaveFlowMediator.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSaveFlowMediator.java
index 99265f7..6017827 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSaveFlowMediator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSaveFlowMediator.java
@@ -24,7 +24,6 @@
 import org.chromium.components.bookmarks.BookmarkId;
 import org.chromium.components.feature_engagement.EventConstants;
 import org.chromium.components.power_bookmarks.PowerBookmarkMeta;
-import org.chromium.components.power_bookmarks.PowerBookmarkType;
 import org.chromium.ui.modelutil.PropertyModel;
 
 /** Controls the bookmarks save-flow. */
@@ -125,7 +124,7 @@
             BookmarkId bookmarkId, @Nullable PowerBookmarkMeta meta, boolean fromExplicitTrackUi) {
         if (meta == null) return;
 
-        if (meta.getType() == PowerBookmarkType.SHOPPING) {
+        if (meta.hasShoppingSpecifics()) {
             setPriceTrackingNotificationUiEnabled(true);
             setPriceTrackingIconForEnabledState(false);
             mPropertyModel.set(BookmarkSaveFlowProperties.NOTIFICATION_SWITCH_VISIBLE, true);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/PowerBookmarkUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/PowerBookmarkUtils.java
index e5a547a..eccee53 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/PowerBookmarkUtils.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/PowerBookmarkUtils.java
@@ -114,7 +114,7 @@
             PowerBookmarkMeta meta = bookmarkBridge.getPowerBookmarkMeta(productId);
 
             // Return any of the bookmarks with the given cluster id are price-tracked.
-            if (meta != null && meta.getType() == PowerBookmarkType.SHOPPING
+            if (meta != null && meta.hasShoppingSpecifics()
                     && meta.getShoppingSpecifics().getIsPriceTracked()) {
                 return true;
             }
@@ -161,7 +161,7 @@
 
         bookmarkBridge.finishLoadingBookmarkModel(() -> {
             PowerBookmarkMeta meta = bookmarkBridge.getPowerBookmarkMeta(bookmarkId);
-            if (meta == null || meta.getType() != PowerBookmarkType.SHOPPING) return;
+            if (meta == null || !meta.hasShoppingSpecifics()) return;
 
             CommerceSubscription subscription =
                     createCommerceSubscriptionForPowerBookmarkMeta(meta);
@@ -308,7 +308,7 @@
     /** @return Whether the price tracking flag is set in the bookmark's meta. */
     public static boolean isBookmarkPriceTracked(BookmarkModel model, BookmarkId id) {
         PowerBookmarkMeta meta = model.getPowerBookmarkMeta(id);
-        if (meta == null || meta.getType() != PowerBookmarkType.SHOPPING) return false;
+        if (meta == null || !meta.hasShoppingSpecifics()) return false;
 
         return meta.getShoppingSpecifics().getIsPriceTracked();
     }
@@ -321,7 +321,7 @@
 
         for (BookmarkId product : products) {
             PowerBookmarkMeta meta = bookmarkBridge.getPowerBookmarkMeta(product);
-            if (meta == null || meta.getType() != PowerBookmarkType.SHOPPING) continue;
+            if (meta == null || !meta.hasShoppingSpecifics()) continue;
 
             Long productClusterId = meta.getShoppingSpecifics().getProductClusterId();
             if (productClusterId.equals(clusterId)) {
@@ -335,7 +335,7 @@
     private static void setPriceTrackingEnabledInMetadata(@NonNull BookmarkBridge bookmarkBridge,
             @Nullable BookmarkId bookmarkId, boolean enabled) {
         PowerBookmarkMeta meta = bookmarkBridge.getPowerBookmarkMeta(bookmarkId);
-        if (meta == null || meta.getType() != PowerBookmarkType.SHOPPING) return;
+        if (meta == null || !meta.hasShoppingSpecifics()) return;
 
         bookmarkBridge.setPowerBookmarkMeta(bookmarkId,
                 PowerBookmarkMeta.newBuilder(meta)
@@ -434,7 +434,7 @@
         // with the ones that the subscription manager thinks are tracked.
         for (BookmarkId product : products) {
             PowerBookmarkMeta meta = bookmarkBridge.getPowerBookmarkMeta(product);
-            if (meta.getType() != PowerBookmarkType.SHOPPING) continue;
+            if (!meta.hasShoppingSpecifics()) continue;
 
             ShoppingSpecifics specifics = meta.getShoppingSpecifics();
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/BaseCustomTabRootUiCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/BaseCustomTabRootUiCoordinator.java
index af4b81724..87dd644 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/BaseCustomTabRootUiCoordinator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/BaseCustomTabRootUiCoordinator.java
@@ -272,8 +272,7 @@
     @Override
     protected Rect getAppRectInWindow() {
         // This is necessary if app handler cannot rely on the popup window that ensures the menu
-        // will not be clipped off the screen, which can happen if Window#FLAGS_LAYOUT_NO_LIMITS
-        // is set to allow the app to be drawn outside the screen in partial CCT.
+        // will not be clipped off the screen, which can happen in partial CCT.
         if (mIntentDataProvider.get().isPartialHeightCustomTab()) {
             View coord = mActivity.findViewById(R.id.coordinator);
             int[] location = new int[2];
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryManager.java b/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryManager.java
index c5f990c..8458833 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryManager.java
@@ -408,7 +408,6 @@
             return true;
         } else if (item.getItemId() == R.id.selection_mode_open_in_new_tab) {
             openItemsInNewTabs(mSelectionDelegate.getSelectedItemsAsList(), false);
-            mSelectionDelegate.clearSelection();
             return true;
         } else if (item.getItemId() == R.id.selection_mode_copy_link) {
             recordUserActionWithOptionalSearch("CopyLink");
@@ -421,7 +420,6 @@
             return true;
         } else if (item.getItemId() == R.id.selection_mode_open_in_incognito) {
             openItemsInNewTabs(mSelectionDelegate.getSelectedItemsAsList(), true);
-            mSelectionDelegate.clearSelection();
             return true;
         } else if (item.getItemId() == R.id.selection_mode_delete_menu_id) {
             recordUserActionWithOptionalSearch("RemoveSelected");
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsDelegateAndroidImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsDelegateAndroidImpl.java
index 95d24b0..0860d0b 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsDelegateAndroidImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsDelegateAndroidImpl.java
@@ -249,9 +249,6 @@
 
     @Override
     public void rendererResponsive() {
-        if (mTab.getWebContents() != null) {
-            TabWebContentsDelegateAndroidImplJni.get().onRendererResponsive(mTab.getWebContents());
-        }
         mTab.handleRendererResponsiveStateChanged(true);
         mDelegate.rendererResponsive();
     }
@@ -390,7 +387,6 @@
     @NativeMethods
     interface Natives {
         void onRendererUnresponsive(WebContents webContents);
-        void onRendererResponsive(WebContents webContents);
         void showFramebustBlockInfoBar(WebContents webContents, String url);
     }
 }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/NavigateTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/NavigateTest.java
index ea2c8a2..ab2aac3 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/NavigateTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/NavigateTest.java
@@ -46,6 +46,7 @@
 import org.chromium.chrome.test.util.ChromeTabUtils;
 import org.chromium.chrome.test.util.OmniboxTestUtils;
 import org.chromium.chrome.test.util.browser.TabLoadObserver;
+import org.chromium.components.embedder_support.util.UrlConstants;
 import org.chromium.content_public.browser.LoadUrlParams;
 import org.chromium.content_public.browser.test.util.DOMUtils;
 import org.chromium.content_public.browser.test.util.JavaScriptUtils;
@@ -81,7 +82,7 @@
 
     @Before
     public void setUp() {
-        mActivityTestRule.startMainActivityFromLauncher();
+        mActivityTestRule.startMainActivityWithURL(UrlConstants.NTP_URL);
         mTestServer = EmbeddedTestServer.createAndStartHTTPSServer(
                 InstrumentationRegistry.getContext(), ServerCertificate.CERT_OK);
         mOmnibox = new OmniboxTestUtils(mActivityTestRule.getActivity());
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/app/bookmarks/BookmarkTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/app/bookmarks/BookmarkTest.java
index f6fe8066e..ffe5a64c 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/app/bookmarks/BookmarkTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/app/bookmarks/BookmarkTest.java
@@ -115,7 +115,6 @@
 import org.chromium.components.browser_ui.widget.selectable_list.SelectableListToolbar.ViewType;
 import org.chromium.components.embedder_support.util.UrlConstants;
 import org.chromium.components.power_bookmarks.PowerBookmarkMeta;
-import org.chromium.components.power_bookmarks.PowerBookmarkType;
 import org.chromium.components.power_bookmarks.ShoppingSpecifics;
 import org.chromium.components.profile_metrics.BrowserProfileType;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
@@ -2226,11 +2225,8 @@
     public void testShoppingDataPresentButFeatureDisabled()
             throws InterruptedException, ExecutionException {
         BookmarkId id = addBookmark(TEST_PAGE_TITLE_GOOGLE, mTestPage);
-        PowerBookmarkMeta.Builder meta =
-                PowerBookmarkMeta.newBuilder()
-                        .setType(PowerBookmarkType.SHOPPING)
-                        .setShoppingSpecifics(
-                                ShoppingSpecifics.newBuilder().setProductClusterId(1234L).build());
+        PowerBookmarkMeta.Builder meta = PowerBookmarkMeta.newBuilder().setShoppingSpecifics(
+                ShoppingSpecifics.newBuilder().setProductClusterId(1234L).build());
         TestThreadUtils.runOnUiThreadBlocking(
                 () -> { mBookmarkModel.setPowerBookmarkMeta(id, meta.build()); });
         BookmarkPromoHeader.forcePromoStateForTests(SyncPromoState.NO_PROMO);
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/app/bookmarks/OWNERS b/chrome/android/javatests/src/org/chromium/chrome/browser/app/bookmarks/OWNERS
new file mode 100644
index 0000000..50bb1fa7b
--- /dev/null
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/app/bookmarks/OWNERS
@@ -0,0 +1 @@
+file://chrome/android/java/src/org/chromium/chrome/browser/bookmarks/OWNERS
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkBridgeTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkBridgeTest.java
index 3bd001d..aba5aa0 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkBridgeTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkBridgeTest.java
@@ -31,7 +31,6 @@
 import org.chromium.components.bookmarks.BookmarkId;
 import org.chromium.components.bookmarks.BookmarkType;
 import org.chromium.components.power_bookmarks.PowerBookmarkMeta;
-import org.chromium.components.power_bookmarks.PowerBookmarkType;
 import org.chromium.components.power_bookmarks.ShoppingSpecifics;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
 import org.chromium.url.GURL;
@@ -386,10 +385,8 @@
         long offerId = 12345L;
         ShoppingSpecifics specifics =
                 ShoppingSpecifics.newBuilder().setIsPriceTracked(true).setOfferId(offerId).build();
-        PowerBookmarkMeta meta = PowerBookmarkMeta.newBuilder()
-                                         .setType(PowerBookmarkType.SHOPPING)
-                                         .setShoppingSpecifics(specifics)
-                                         .build();
+        PowerBookmarkMeta meta =
+                PowerBookmarkMeta.newBuilder().setShoppingSpecifics(specifics).build();
         mBookmarkBridge.setPowerBookmarkMeta(bookmark, meta);
 
         // Check that the price is tracked prior to sending an unsubscribe event.
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkSaveFlowTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkSaveFlowTest.java
index 70a233ae..d199041 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkSaveFlowTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkSaveFlowTest.java
@@ -48,7 +48,6 @@
 import org.chromium.components.browser_ui.bottomsheet.BottomSheetController;
 import org.chromium.components.browser_ui.bottomsheet.BottomSheetTestSupport;
 import org.chromium.components.power_bookmarks.PowerBookmarkMeta;
-import org.chromium.components.power_bookmarks.PowerBookmarkType;
 import org.chromium.components.power_bookmarks.ShoppingSpecifics;
 import org.chromium.content_public.browser.test.util.ClickUtils;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
@@ -166,12 +165,8 @@
     public void testBookmarkSaveFlow_WithShoppingListItem() throws IOException {
         TestThreadUtils.runOnUiThreadBlockingNoException(() -> {
             BookmarkId id = addBookmark("Test bookmark", new GURL("http://a.com"));
-            PowerBookmarkMeta.Builder meta =
-                    PowerBookmarkMeta.newBuilder()
-                            .setType(PowerBookmarkType.SHOPPING)
-                            .setShoppingSpecifics(ShoppingSpecifics.newBuilder()
-                                                          .setProductClusterId(1234L)
-                                                          .build());
+            PowerBookmarkMeta.Builder meta = PowerBookmarkMeta.newBuilder().setShoppingSpecifics(
+                    ShoppingSpecifics.newBuilder().setProductClusterId(1234L).build());
             mBookmarkBridge.setPowerBookmarkMeta(id, meta.build());
             mBookmarkSaveFlowCoordinator.show(id, /*fromHeuristicEntryPoint=*/false,
                     /*wasBookmarkMoved=*/false, meta.build());
@@ -188,12 +183,8 @@
             throws IOException {
         TestThreadUtils.runOnUiThreadBlockingNoException(() -> {
             BookmarkId id = addBookmark("Test bookmark", new GURL("http://a.com"));
-            PowerBookmarkMeta.Builder meta =
-                    PowerBookmarkMeta.newBuilder()
-                            .setType(PowerBookmarkType.SHOPPING)
-                            .setShoppingSpecifics(ShoppingSpecifics.newBuilder()
-                                                          .setProductClusterId(1234L)
-                                                          .build());
+            PowerBookmarkMeta.Builder meta = PowerBookmarkMeta.newBuilder().setShoppingSpecifics(
+                    ShoppingSpecifics.newBuilder().setProductClusterId(1234L).build());
             mBookmarkBridge.setPowerBookmarkMeta(id, meta.build());
             mBookmarkSaveFlowCoordinator.show(
                     id, /*fromHeuristicEntryPoint=*/true, /*wasBookmarkMoved=*/false, meta.build());
@@ -210,11 +201,8 @@
             throws IOException {
         TestThreadUtils.runOnUiThreadBlockingNoException(() -> {
             BookmarkId id = addBookmark("Test bookmark", new GURL("http://a.com"));
-            PowerBookmarkMeta.Builder meta =
-                    PowerBookmarkMeta.newBuilder()
-                            .setType(PowerBookmarkType.SHOPPING)
-                            .setShoppingSpecifics(
-                                    ShoppingSpecifics.newBuilder().setProductClusterId(1234L));
+            PowerBookmarkMeta.Builder meta = PowerBookmarkMeta.newBuilder().setShoppingSpecifics(
+                    ShoppingSpecifics.newBuilder().setProductClusterId(1234L));
             mBookmarkBridge.setPowerBookmarkMeta(id, meta.build());
             mBookmarkSaveFlowCoordinator.show(id, /*fromHeuristicEntryPoint=*/false,
                     /*wasBookmarkMoved=*/false, meta.build());
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/PowerBookmarkUtilsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/PowerBookmarkUtilsTest.java
index 137ad2782..b78d5d9 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/PowerBookmarkUtilsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/PowerBookmarkUtilsTest.java
@@ -204,10 +204,8 @@
                         .setCountryCode("us")
                         .setCurrentPrice(ProductPrice.newBuilder().setAmountMicros(100).build())
                         .build();
-        PowerBookmarkMeta meta = PowerBookmarkMeta.newBuilder()
-                                         .setType(PowerBookmarkType.SHOPPING)
-                                         .setShoppingSpecifics(specifics)
-                                         .build();
+        PowerBookmarkMeta meta =
+                PowerBookmarkMeta.newBuilder().setShoppingSpecifics(specifics).build();
         CommerceSubscription subscription =
                 PowerBookmarkUtils.createCommerceSubscriptionForPowerBookmarkMeta(meta);
 
@@ -242,10 +240,7 @@
                         .setIsPriceTracked(isPriceTracked)
                         .setProductClusterId(UnsignedLongs.parseUnsignedLong(clusterId))
                         .build();
-        return PowerBookmarkMeta.newBuilder()
-                .setType(PowerBookmarkType.SHOPPING)
-                .setShoppingSpecifics(specifics)
-                .build();
+        return PowerBookmarkMeta.newBuilder().setShoppingSpecifics(specifics).build();
     }
 
     /**
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/infobar/InfoBarTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/infobar/InfoBarTest.java
index 21fb06d4..fb1e184 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/infobar/InfoBarTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/infobar/InfoBarTest.java
@@ -9,7 +9,6 @@
 
 import androidx.test.filters.MediumTest;
 
-import org.hamcrest.Matchers;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
@@ -18,13 +17,11 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
-import org.chromium.base.CommandLine;
 import org.chromium.base.ContextUtils;
 import org.chromium.base.task.PostTask;
 import org.chromium.base.test.util.AdvancedMockContext;
 import org.chromium.base.test.util.Batch;
 import org.chromium.base.test.util.CommandLineFlags;
-import org.chromium.base.test.util.Criteria;
 import org.chromium.base.test.util.CriteriaHelper;
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.FlakyTest;
@@ -34,7 +31,6 @@
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.profiles.Profile;
-import org.chromium.chrome.browser.tab.SadTab;
 import org.chromium.chrome.browser.tab.TabTestUtils;
 import org.chromium.chrome.browser.tab.TabWebContentsDelegateAndroid;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
@@ -42,7 +38,6 @@
 import org.chromium.chrome.test.batch.BlankCTATabInitialStateRule;
 import org.chromium.chrome.test.util.InfoBarTestAnimationListener;
 import org.chromium.chrome.test.util.InfoBarUtil;
-import org.chromium.chrome.test.util.InfoBarUtil.InfoBarMatcher;
 import org.chromium.chrome.test.util.browser.Features.DisableFeatures;
 import org.chromium.chrome.test.util.browser.LocationSettingsTestUtil;
 import org.chromium.components.infobars.InfoBar;
@@ -283,83 +278,6 @@
     }
 
     /**
-     * Verifies the unresponsive renderer notification creates an InfoBar.
-     */
-    @Test
-    @MediumTest
-    @Feature({"Browser", "Main"})
-    public void testInfoBarForHungRenderer() throws TimeoutException {
-        sActivityTestRule.loadUrl(HELLO_WORLD_URL);
-
-        // Fake an unresponsive renderer signal.
-        PostTask.runOrPostTask(UiThreadTaskTraits.DEFAULT, () -> {
-            CommandLine.getInstance().appendSwitch(ChromeSwitches.ENABLE_HUNG_RENDERER_INFOBAR);
-            getTabWebContentsDelegate().rendererUnresponsive();
-        });
-        mListener.addInfoBarAnimationFinished("InfoBar not added");
-
-        CriteriaHelper.pollUiThread(() -> {
-            final List<InfoBar> infoBars = sActivityTestRule.getInfoBars();
-            InfoBarMatcher matcher =
-                    new InfoBarMatcher(InfoBarIdentifier.HUNG_RENDERER_INFOBAR_DELEGATE_ANDROID);
-            Criteria.checkThat(infoBars, Matchers.hasItem(matcher));
-
-            // Make sure it has Kill/Wait buttons.
-            Assert.assertTrue(InfoBarUtil.hasPrimaryButton(matcher.mLastMatch));
-            Assert.assertTrue(InfoBarUtil.hasSecondaryButton(matcher.mLastMatch));
-        });
-
-        // Fake a responsive renderer signal.
-        PostTask.runOrPostTask(UiThreadTaskTraits.DEFAULT,
-                () -> { getTabWebContentsDelegate().rendererResponsive(); });
-        mListener.removeInfoBarAnimationFinished("InfoBar not removed.");
-
-        CriteriaHelper.pollUiThread(() -> {
-            final List<InfoBar> infoBars = sActivityTestRule.getInfoBars();
-            InfoBarMatcher matcher =
-                    new InfoBarMatcher(InfoBarIdentifier.HUNG_RENDERER_INFOBAR_DELEGATE_ANDROID);
-            Criteria.checkThat(infoBars, Matchers.not(Matchers.hasItem(matcher)));
-        });
-    }
-
-    /**
-     * Verifies the hung renderer InfoBar can kill the hung renderer.
-     */
-    @Test
-    @MediumTest
-    @Feature({"Browser", "Main"})
-    public void testInfoBarForHungRendererCanKillRenderer() throws TimeoutException {
-        sActivityTestRule.loadUrl(HELLO_WORLD_URL);
-
-        // Fake an unresponsive renderer signal.
-        PostTask.runOrPostTask(UiThreadTaskTraits.DEFAULT, () -> {
-            CommandLine.getInstance().appendSwitch(ChromeSwitches.ENABLE_HUNG_RENDERER_INFOBAR);
-            getTabWebContentsDelegate().rendererUnresponsive();
-        });
-        mListener.addInfoBarAnimationFinished("InfoBar not added");
-
-        CriteriaHelper.pollUiThread(() -> {
-            final List<InfoBar> infoBars = sActivityTestRule.getInfoBars();
-            InfoBarMatcher matcher =
-                    new InfoBarMatcher(InfoBarIdentifier.HUNG_RENDERER_INFOBAR_DELEGATE_ANDROID);
-            Criteria.checkThat(infoBars, Matchers.hasItem(matcher));
-
-            // Make sure it has Kill/Wait buttons.
-            Assert.assertTrue(InfoBarUtil.hasPrimaryButton(matcher.mLastMatch));
-            Assert.assertTrue(InfoBarUtil.hasSecondaryButton(matcher.mLastMatch));
-
-            // Activate the Kill button.
-            InfoBarUtil.clickPrimaryButton(matcher.mLastMatch);
-        });
-
-        // The renderer should have been killed and the InfoBar removed.
-        mListener.removeInfoBarAnimationFinished("InfoBar not removed.");
-        CriteriaHelper.pollUiThread(() -> {
-            return SadTab.isShowing(sActivityTestRule.getActivity().getActivityTab());
-        }, MAX_TIMEOUT, CHECK_INTERVAL);
-    }
-
-    /**
      * Verify InfoBarContainers swap the WebContents they are monitoring properly.
      */
     @Test
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/metrics/StartupLoadingMetricsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/metrics/StartupLoadingMetricsTest.java
index a62edc6..76d4f4e 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/metrics/StartupLoadingMetricsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/metrics/StartupLoadingMetricsTest.java
@@ -33,6 +33,7 @@
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
 import org.chromium.chrome.test.util.ChromeApplicationTestUtils;
 import org.chromium.chrome.test.util.ChromeTabUtils;
+import org.chromium.components.embedder_support.util.UrlConstants;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
 import org.chromium.net.test.EmbeddedTestServer;
 
@@ -180,7 +181,7 @@
     @LargeTest
     public void testNTPNotRecorded() throws Exception {
         runAndWaitForPageLoadMetricsRecorded(
-                () -> mTabbedActivityTestRule.startMainActivityFromLauncher());
+                () -> mTabbedActivityTestRule.startMainActivityWithURL(UrlConstants.NTP_URL));
         assertHistogramsRecorded(0, TABBED_SUFFIX);
         loadUrlAndWaitForPageLoadMetricsRecorded(mTabbedActivityTestRule, mTestPage2);
         assertHistogramsRecorded(0, TABBED_SUFFIX);
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/notifications/NotificationTestRule.java b/chrome/android/javatests/src/org/chromium/chrome/browser/notifications/NotificationTestRule.java
index 7617344..90206f9 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/notifications/NotificationTestRule.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/notifications/NotificationTestRule.java
@@ -18,6 +18,7 @@
 import org.chromium.components.browser_ui.site_settings.PermissionInfo;
 import org.chromium.components.content_settings.ContentSettingValues;
 import org.chromium.components.content_settings.ContentSettingsType;
+import org.chromium.components.embedder_support.util.UrlConstants;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
 
 import java.util.List;
@@ -41,7 +42,7 @@
         // The NotificationPlatformBridge must be overriden prior to the browser process starting.
         mMockNotificationManager = new MockNotificationManagerProxy();
         NotificationPlatformBridge.overrideNotificationManagerForTesting(mMockNotificationManager);
-        startMainActivityFromLauncher();
+        startMainActivityWithURL(UrlConstants.NTP_URL);
     }
 
     private void tearDown() {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/NewTabPageNavigationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/NewTabPageNavigationTest.java
index ab169e43..2c5a9e8 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/NewTabPageNavigationTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/NewTabPageNavigationTest.java
@@ -43,7 +43,7 @@
     @Before
     public void setUp() {
         mHomepageTestRule.useChromeNTPForTest();
-        mActivityTestRule.startMainActivityWithURL(null);
+        mActivityTestRule.startMainActivityWithURL(UrlConstants.NTP_URL);
         mTestServer = EmbeddedTestServer.createAndStartServer(InstrumentationRegistry.getContext());
     }
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/PageInfoViewDarkModeTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/PageInfoViewDarkModeTest.java
index 465345f1..c50a624 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/PageInfoViewDarkModeTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/PageInfoViewDarkModeTest.java
@@ -23,6 +23,7 @@
 import org.junit.runner.RunWith;
 
 import org.chromium.base.test.util.CommandLineFlags;
+import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.app.ChromeActivity;
@@ -116,6 +117,7 @@
     @Test
     @MediumTest
     @Feature({"RenderTest"})
+    @DisabledTest(message = "https://crbug.com/1356279")
     public void testShowOnSecureWebsiteDark() throws IOException {
         loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(sSimpleHtml));
         mRenderTestRule.render(getPageInfoView(), "PageInfo_SecureWebsiteDark");
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ssl/CaptivePortalTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/ssl/CaptivePortalTest.java
index ce5e797..a71c9f3 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/ssl/CaptivePortalTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/ssl/CaptivePortalTest.java
@@ -28,6 +28,7 @@
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
 import org.chromium.chrome.test.util.ChromeTabUtils;
 import org.chromium.chrome.test.util.browser.TabTitleObserver;
+import org.chromium.components.embedder_support.util.UrlConstants;
 import org.chromium.components.security_interstitials.CaptivePortalHelper;
 import org.chromium.net.X509Util;
 import org.chromium.net.test.EmbeddedTestServer;
@@ -88,7 +89,7 @@
 
     @Before
     public void setUp() {
-        mActivityTestRule.startMainActivityFromLauncher();
+        mActivityTestRule.startMainActivityWithURL(UrlConstants.NTP_URL);
         mServer = EmbeddedTestServer.createAndStartHTTPSServer(
                 InstrumentationRegistry.getContext(), ServerCertificate.CERT_MISMATCHED_NAME);
 
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateUnitTest.java
index 938645738..1034245 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateUnitTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateUnitTest.java
@@ -764,7 +764,6 @@
         doReturn(mock(BookmarkId.class)).when(mBookmarkBridge).getUserBookmarkIdForTab(any());
         PowerBookmarkMeta meta =
                 PowerBookmarkMeta.newBuilder()
-                        .setType(PowerBookmarkType.SHOPPING)
                         .setShoppingSpecifics(
                                 ShoppingSpecifics.newBuilder().setIsPriceTracked(false).build())
                         .build();
@@ -788,7 +787,6 @@
         doReturn(null).when(mBookmarkBridge).getUserBookmarkIdForTab(any());
         PowerBookmarkMeta meta =
                 PowerBookmarkMeta.newBuilder()
-                        .setType(PowerBookmarkType.SHOPPING)
                         .setShoppingSpecifics(
                                 ShoppingSpecifics.newBuilder().setIsPriceTracked(false).build())
                         .build();
@@ -804,29 +802,6 @@
     }
 
     @Test
-    public void enablePriceTrackingItemRow_BadType() {
-        setShoppingListItemRowEnabled(true);
-        PowerBookmarkUtils.setPriceTrackingEligibleForTesting(true);
-        doReturn(true).when(mBookmarkBridge).isEditBookmarksEnabled();
-
-        doReturn(mock(BookmarkId.class)).when(mBookmarkBridge).getUserBookmarkIdForTab(any());
-        PowerBookmarkMeta meta =
-                PowerBookmarkMeta.newBuilder()
-                        .setType(PowerBookmarkType.UNSPECIFIED)
-                        .setShoppingSpecifics(
-                                ShoppingSpecifics.newBuilder().setIsPriceTracked(false).build())
-                        .build();
-        doReturn(meta).when(mBookmarkBridge).getPowerBookmarkMeta(any());
-
-        MenuItem startPriceTrackingMenuItem = mock(MenuItem.class);
-        MenuItem stopPriceTrackingMenuItem = mock(MenuItem.class);
-        mAppMenuPropertiesDelegate.updatePriceTrackingMenuItemRow(
-                startPriceTrackingMenuItem, stopPriceTrackingMenuItem, mTab);
-        verify(startPriceTrackingMenuItem).setVisible(false);
-        verify(stopPriceTrackingMenuItem).setVisible(false);
-    }
-
-    @Test
     public void enablePriceTrackingItemRow_PriceTrackingEnabled() {
         setShoppingListItemRowEnabled(true);
         PowerBookmarkUtils.setPriceTrackingEligibleForTesting(true);
@@ -845,7 +820,6 @@
                 .getAvailableProductInfoForUrl(any());
         PowerBookmarkMeta meta =
                 PowerBookmarkMeta.newBuilder()
-                        .setType(PowerBookmarkType.SHOPPING)
                         .setShoppingSpecifics(ShoppingSpecifics.newBuilder()
                                                       .setIsPriceTracked(true)
                                                       .setProductClusterId(clusterId)
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarMediatorUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarMediatorUnitTest.java
index 8c2a904..d5d97bb 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarMediatorUnitTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarMediatorUnitTest.java
@@ -504,7 +504,8 @@
                         -> mIdentityDiscController.getForStartSurface(
                                 mMediator.getOverviewModeStateForTesting(),
                                 mMediator.getLayoutTypeForTesting()),
-                shouldShowTabSwitcherButtonOnHomepage, isTabGroupsAndroidContinuationEnabled,
+                shouldShowTabSwitcherButtonOnHomepage, /*isTabToGtsFadeAnimationEnabled=*/false,
+                isTabGroupsAndroidContinuationEnabled,
                 ()
                         -> false,
                 /*profileSupplier=*/null, /*logoClickedCallback=*/null,
diff --git a/chrome/android/webapk/libs/runtime_library/BUILD.gn b/chrome/android/webapk/libs/runtime_library/BUILD.gn
index 74b9eede..4391302 100644
--- a/chrome/android/webapk/libs/runtime_library/BUILD.gn
+++ b/chrome/android/webapk/libs/runtime_library/BUILD.gn
@@ -52,11 +52,7 @@
 dist_dex("webapk_runtime_library") {
   deps = [ ":runtime_library_for_assets_java" ]
   proguard_enabled = true
-  proguard_configs = [
-    "runtime_library.proguard.flags",
-    "//base/android/proguard/chromium_code.flags",
-    "//base/android/proguard/chromium_apk.flags",
-  ]
+  proguard_configs = [ "runtime_library.proguard.flags" ]
   output = "$target_out_dir/$runtime_library_dex_asset_name"
 }
 
diff --git a/chrome/android/webapk/shell_apk/BUILD.gn b/chrome/android/webapk/shell_apk/BUILD.gn
index c32987c..e2c665d7 100644
--- a/chrome/android/webapk/shell_apk/BUILD.gn
+++ b/chrome/android/webapk/shell_apk/BUILD.gn
@@ -285,8 +285,6 @@
       proguard_configs = [
         "//chrome/android/webapk/shell_apk/proguard.flags",
         "//chrome/android/proguard/main.flags",
-        "//base/android/proguard/chromium_apk.flags",
-        "//base/android/proguard/chromium_code.flags",
       ]
     }
   }
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index 127ebf0..09c50e7 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -4996,10 +4996,10 @@
           Allow <ph name="EXTENSIONS_REQUESTING_ACCESS_COUNT">$1<ex>3</ex></ph>?
         </message>
         <message name="IDS_EXTENSIONS_REQUEST_ACCESS_BUTTON_TOOLTIP_SINGLE_EXTENSION" desc="The tooltip text of the request access button that appears on the toolbar when an extension requests access to the site">
-          <ph name="EXTENSIONS_REQUESTING_ACCESS">$1<ex>Extension A</ex></ph> is requesting to read and change <ph name="ORIGIN">$2<ex>google.com</ex></ph>
+          Click to allow <ph name="EXTENSIONS_REQUESTING_ACCESS">$1<ex>Extension A</ex></ph> to read and change <ph name="ORIGIN">$2<ex>google.com</ex></ph>:
         </message>
         <message name="IDS_EXTENSIONS_REQUEST_ACCESS_BUTTON_TOOLTIP_MULTIPLE_EXTENSIONS" desc="The tooltip text of the request access button that appears on the toolbar when an extension requests access to the site">
-          Requesting to read and change <ph name="ORIGIN">$1<ex>google.com</ex></ph>:
+          Click to allow these extensions to read and change <ph name="ORIGIN">$1<ex>google.com</ex></ph>:
         </message>
         <message name="IDS_EXTENSIONS_REQUEST_ACCESS_BUBBLE_SINGLE_EXTENSION_TITLE" desc="The title of the request access bubble to tell the user to accept the bubble to always run the extension on the site.">
           Always allow "<ph name="EXTENSION_NAME">$1<ex>Gmail Checker</ex></ph>" to run on <ph name="ORIGIN">$2<ex>google.com</ex></ph>?
@@ -7522,15 +7522,9 @@
         =1 {You can wait for it to become responsive or exit the page.}
         other {You can wait for them to become responsive or exit the pages.}}
       </message>
-      <message name="IDS_BROWSER_HANGMONITOR_RENDERER_INFOBAR" desc="The text of the infobar notifying the user that the renderer is unresponsive.">
-        The page has become unresponsive. You can wait for it to become responsive or close it.
-      </message>
       <message name="IDS_BROWSER_HANGMONITOR_IFRAME_TITLE" desc="The text of a row of the 'Hung Page' dialog when a page is not hung but contains an iframe that is hung.">
         <ph name="HUNG_IFRAME_URL">$1<ex>google.com</ex></ph>, in <ph name="PAGE_TITLE">$2<ex>YouTube</ex></ph>.
       </message>
-      <message name="IDS_BROWSER_HANGMONITOR_RENDERER_INFOBAR_END" desc="The label of the 'close' button for the hung renderer infobar">
-        Close
-      </message>
       <message name="IDS_BROWSER_HANGMONITOR_RENDERER_WAIT" desc="The label of the 'wait' button, which exits the dialog without doing anything and continues to wait for the page to become responsive.">
         Wait
       </message>
@@ -10300,6 +10294,9 @@
 
       <!-- Translate Bubble -->
       <if expr="toolkit_views">
+      <message name="IDS_PARTIAL_TRANSLATE_BUBBLE_WAITING_TITLE" desc="Title text for the partial translate bubble when waiting for translation to be completed.">
+          Waiting for translation
+        </message>
         <message name="IDS_TRANSLATE_BUBBLE_BEFORE_TRANSLATE_TITLE" desc="Title text for the translate bubble when asking to translate a page.">
           Translate this page?
         </message>
@@ -10331,6 +10328,9 @@
           <message name="IDS_TRANSLATE_BUBBLE_CHANGE_SOURCE_LANGUAGE" desc="Text for the menu item that lets the user open a dialog to choose another source language for translation, from a list of available languages.">
             Page is not in <ph name="language">$1<ex>French</ex></ph>
           </message>
+          <message name="IDS_PARTIAL_TRANSLATE_BUBBLE_CHANGE_SOURCE_LANGUAGE" desc="Text for the partial translate bubble menu item that lets the user open a dialog to choose another source language for translation, from a list of available languages.">
+            Selection is not in <ph name="language">$1<ex>French</ex></ph>
+          </message>
           <message name="IDS_TRANSLATE_BUBBLE_ACCEPT" desc="Text to show for the translate bubble button to accept translation.">
             Translate
           </message>
@@ -10373,6 +10373,9 @@
           <message name="IDS_TRANSLATE_BUBBLE_ADVANCED_SOURCE" desc="Text to show as the title in the advanced source language view for TAB UI">
             Page language to translate
           </message>
+          <message name="IDS_PARTIAL_TRANSLATE_BUBBLE_ADVANCED_SOURCE" desc="Text to show as the title in the advanced source language view for TAB UI in the partial translate bubble">
+            Language to translate from
+          </message>
           <message name="IDS_PARTIAL_TRANSLATE_BUBBLE_TRANSLATE_FULL_PAGE" desc="Text to show for the partial translate bubble button to start a full page translation">
             Translate full page
           </message>
@@ -10384,12 +10387,15 @@
           <message name="IDS_TRANSLATE_BUBBLE_ADVANCED_MENU_BUTTON" desc="In Title Case: Text to show for the translate bubble menu item to jump to the advanced panel, specifically to change which languages are translated between.">
             Change Languages...
           </message>
-          <message name="IDS_TRANSLATE_BUBBLE_CHANGE_TARGET_LANGUAGE" desc="Text to show for the translate bubble menu item which invokes the target language menu.">
+          <message name="IDS_TRANSLATE_BUBBLE_CHANGE_TARGET_LANGUAGE" desc="In Title Case: Text to show for the translate bubble menu item which invokes the target language menu.">
             Choose Another Language...
           </message>
-          <message name="IDS_TRANSLATE_BUBBLE_CHANGE_SOURCE_LANGUAGE" desc="Text to show for the translate bubble menu item which invokes the source language menu.">
+          <message name="IDS_TRANSLATE_BUBBLE_CHANGE_SOURCE_LANGUAGE" desc="In Title Case: Text to show for the translate bubble menu item which invokes the source language menu.">
             Page Is Not in <ph name="language">$1<ex>French</ex></ph>
           </message>
+          <message name="IDS_PARTIAL_TRANSLATE_BUBBLE_CHANGE_SOURCE_LANGUAGE" desc="In Title Case: Text to show for the partial translate bubble menu item which invokes the source language menu.">
+            Selection Is Not in <ph name="language">$1<ex>French</ex></ph>
+          </message>
           <message name="IDS_TRANSLATE_BUBBLE_ACCEPT" desc="In Title Case: Text to show for the translate bubble button to accept translation.">
             Translate
           </message>
@@ -10432,7 +10438,10 @@
           <message name="IDS_TRANSLATE_BUBBLE_ADVANCED_SOURCE" desc="In Title Case: Text to show as the title in the advanced source language view for TAB UI">
             Page Language to Translate
           </message>
-          <message name="IDS_PARTIAL_TRANSLATE_BUBBLE_TRANSLATE_FULL_PAGE" desc="Text to show for the partial translate bubble button to start a full page translation">
+          <message name="IDS_PARTIAL_TRANSLATE_BUBBLE_ADVANCED_SOURCE" desc="In Title Case: Text to show as the title in the advanced source language view for TAB UI in the partial translate bubble">
+            Language to Translate from
+          </message>
+          <message name="IDS_PARTIAL_TRANSLATE_BUBBLE_TRANSLATE_FULL_PAGE" desc="In Title Case: Text to show for the partial translate bubble button to start a full page translation">
             Translate Full Page
           </message>
         </if>
diff --git a/chrome/app/generated_resources_grd/IDS_EXTENSIONS_REQUEST_ACCESS_BUTTON_TOOLTIP_MULTIPLE_EXTENSIONS.png.sha1 b/chrome/app/generated_resources_grd/IDS_EXTENSIONS_REQUEST_ACCESS_BUTTON_TOOLTIP_MULTIPLE_EXTENSIONS.png.sha1
index 5eedf9b..c520e24e 100644
--- a/chrome/app/generated_resources_grd/IDS_EXTENSIONS_REQUEST_ACCESS_BUTTON_TOOLTIP_MULTIPLE_EXTENSIONS.png.sha1
+++ b/chrome/app/generated_resources_grd/IDS_EXTENSIONS_REQUEST_ACCESS_BUTTON_TOOLTIP_MULTIPLE_EXTENSIONS.png.sha1
@@ -1 +1 @@
-323beda5759b5559837ede0cf372a2f262408155
\ No newline at end of file
+1149732ff74da41249d486cea9ec2458ec53aea6
\ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_EXTENSIONS_REQUEST_ACCESS_BUTTON_TOOLTIP_SINGLE_EXTENSION.png.sha1 b/chrome/app/generated_resources_grd/IDS_EXTENSIONS_REQUEST_ACCESS_BUTTON_TOOLTIP_SINGLE_EXTENSION.png.sha1
index 3666ae7..2e24d41 100644
--- a/chrome/app/generated_resources_grd/IDS_EXTENSIONS_REQUEST_ACCESS_BUTTON_TOOLTIP_SINGLE_EXTENSION.png.sha1
+++ b/chrome/app/generated_resources_grd/IDS_EXTENSIONS_REQUEST_ACCESS_BUTTON_TOOLTIP_SINGLE_EXTENSION.png.sha1
@@ -1 +1 @@
-816fdf39854dd9bb979a21ae5ddad8748e85ba4f
\ No newline at end of file
+e9911b115bcbb5ac51e0f04a54ffc58a36b60964
\ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_PARTIAL_TRANSLATE_BUBBLE_ADVANCED_SOURCE.png.sha1 b/chrome/app/generated_resources_grd/IDS_PARTIAL_TRANSLATE_BUBBLE_ADVANCED_SOURCE.png.sha1
new file mode 100644
index 0000000..b1d9bb6
--- /dev/null
+++ b/chrome/app/generated_resources_grd/IDS_PARTIAL_TRANSLATE_BUBBLE_ADVANCED_SOURCE.png.sha1
@@ -0,0 +1 @@
+cded6059812fcc9f61ba1e047bf249b603b6f193
\ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_PARTIAL_TRANSLATE_BUBBLE_CHANGE_SOURCE_LANGUAGE.png.sha1 b/chrome/app/generated_resources_grd/IDS_PARTIAL_TRANSLATE_BUBBLE_CHANGE_SOURCE_LANGUAGE.png.sha1
new file mode 100644
index 0000000..fa5d5f6
--- /dev/null
+++ b/chrome/app/generated_resources_grd/IDS_PARTIAL_TRANSLATE_BUBBLE_CHANGE_SOURCE_LANGUAGE.png.sha1
@@ -0,0 +1 @@
+fca94c0b943c635e4c5d9ede0fc8d218f0a2ba9d
\ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_PARTIAL_TRANSLATE_BUBBLE_WAITING_TITLE.png.sha1 b/chrome/app/generated_resources_grd/IDS_PARTIAL_TRANSLATE_BUBBLE_WAITING_TITLE.png.sha1
new file mode 100644
index 0000000..c4332c0
--- /dev/null
+++ b/chrome/app/generated_resources_grd/IDS_PARTIAL_TRANSLATE_BUBBLE_WAITING_TITLE.png.sha1
@@ -0,0 +1 @@
+1646522c4a8238d60e8463932396c9ea0df06816
\ No newline at end of file
diff --git a/chrome/app/os_settings_strings.grdp b/chrome/app/os_settings_strings.grdp
index a33fee32..4ef7df3c 100644
--- a/chrome/app/os_settings_strings.grdp
+++ b/chrome/app/os_settings_strings.grdp
@@ -2240,6 +2240,9 @@
   <message name="IDS_BLUETOOTH_SAVED_DEVICES_ERROR_LABEL" desc="Label in Saved Devices sub-page when device list returns an error.">
     Can’t load devices saved to <ph name="PRIMARY_EMAIL">$1<ex>example@google.com</ex></ph>. Check your internet connection and try again.
   </message>
+  <message name="IDS_BLUETOOTH_SAVED_DEVICES_LOADING_LABEL" desc="Label in Saved Devices sub-page while loading the devices list.">
+    Looking for Fast Pair devices saved to <ph name="PRIMARY_EMAIL">$1<ex>example@google.com</ex></ph>
+  </message>
   <message name="IDS_SAVED_DEVICE_ITEM_A11Y_LABEL" desc="Accessibility label for paired Bluetooth device list item with a device type of computer.">
     Device <ph name="DEVICE_INDEX">$1<ex>1</ex></ph> of <ph name="DEVICE_COUNT">$2<ex>15</ex></ph>, <ph name="DEVICE_NAME">$3<ex>Beats</ex></ph>
   </message>
@@ -3360,8 +3363,8 @@
   <message name="IDS_ASH_SETTINGS_LOCK_SCREEN_NOTIFICATION_HIDE_SENSITIVE" desc="One of options of the lock screen notification mode to hide sensitive contents and show the others on the lock screen.">
     Hide sensitive content
   </message>
-  <message name="IDS_SETTINGS_PEOPLE_ENABLE_SCREENLOCK" desc="The text on the checkbox to enable screenlocker for current user.">
-    Lock in sleep mode or when cover is closed
+  <message name="IDS_SETTINGS_PEOPLE_ENABLE_SCREENLOCK" desc="The text on the checkbox to enable screenlocker for current user.  Lock will happen in the device goes into sleep mode from being idle, or when laptop lid or detachable cover is closed">
+    Lock when sleeping or when lid is closed
   </message>
   <message name="IDS_SETTINGS_PEOPLE_SCREEN_LOCK_ENABLE_TITLE" desc="The title on the toggle to enable screen lock for current user.">
     Screen lock
@@ -3670,14 +3673,14 @@
   <message name="IDS_SETTINGS_POWER_IDLE_STOP_SESSION" desc="In Device Settings > Power, menu item for idle behavior that stops the session when idle.">
     Sign out
   </message>
-  <message name="IDS_SETTINGS_POWER_LID_CLOSED_SLEEP_LABEL" desc="In Device Settings > Power, label for suspending when cover is closed.">
-    Sleep when cover is closed
+  <message name="IDS_SETTINGS_POWER_LID_CLOSED_SLEEP_LABEL" desc="In Device Settings > Power, label for suspending when laptop lid, or detachable cover is closed.">
+    Sleep when lid is closed
   </message>
-  <message name="IDS_SETTINGS_POWER_LID_CLOSED_SIGN_OUT_LABEL" desc="In Device Settings > Power, label for signing out when cover is closed.">
-    Sign out when cover is closed
+  <message name="IDS_SETTINGS_POWER_LID_CLOSED_SIGN_OUT_LABEL" desc="In Device Settings > Power, label for signing out when laptop lid, or detachable cover is closed.">
+    Sign out when lid is closed
   </message>
-  <message name="IDS_SETTINGS_POWER_LID_CLOSED_SHUT_DOWN_LABEL" desc="In Device Settings > Power, label for shutting down when cover is closed.">
-    Shut down when cover is closed
+  <message name="IDS_SETTINGS_POWER_LID_CLOSED_SHUT_DOWN_LABEL" desc="In Device Settings > Power, label for shutting down when laptop lid, or detachable cover is closed.">
+    Shut down when lid is closed
   </message>
   <message name="IDS_SETTINGS_BATTERY_STATUS" desc="In Device Settings > Power, the battery status while the battery is discharging, showing the battery power as a percentage and the time left until the battery is empty.">
     <ph name="percentage">$1<ex>56</ex></ph>% - <ph name="time">$2<ex>2 hours and 20 minutes</ex></ph> left
diff --git a/chrome/app/os_settings_strings_grdp/IDS_BLUETOOTH_SAVED_DEVICES_LOADING_LABEL.png.sha1 b/chrome/app/os_settings_strings_grdp/IDS_BLUETOOTH_SAVED_DEVICES_LOADING_LABEL.png.sha1
new file mode 100644
index 0000000..a7ee9fe2
--- /dev/null
+++ b/chrome/app/os_settings_strings_grdp/IDS_BLUETOOTH_SAVED_DEVICES_LOADING_LABEL.png.sha1
@@ -0,0 +1 @@
+db5f1457c9679895f7f9d50daa9fedc482d1e251
diff --git a/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_PEOPLE_ENABLE_SCREENLOCK.png.sha1 b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_PEOPLE_ENABLE_SCREENLOCK.png.sha1
index 1a11950..4b7518f 100644
--- a/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_PEOPLE_ENABLE_SCREENLOCK.png.sha1
+++ b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_PEOPLE_ENABLE_SCREENLOCK.png.sha1
@@ -1 +1 @@
-38408cb2415733b666ba3afcf07ced6172ca6f75
\ No newline at end of file
+b130223a56f110c61b974d5e7cf7a99b8b30d3c0
\ No newline at end of file
diff --git a/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_POWER_LID_CLOSED_SHUT_DOWN_LABEL.png.sha1 b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_POWER_LID_CLOSED_SHUT_DOWN_LABEL.png.sha1
new file mode 100644
index 0000000..753e2c55
--- /dev/null
+++ b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_POWER_LID_CLOSED_SHUT_DOWN_LABEL.png.sha1
@@ -0,0 +1 @@
+106a64fd153a9848d4ef0c075f0f9928ba37234a
\ No newline at end of file
diff --git a/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_POWER_LID_CLOSED_SIGN_OUT_LABEL.png.sha1 b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_POWER_LID_CLOSED_SIGN_OUT_LABEL.png.sha1
new file mode 100644
index 0000000..753e2c55
--- /dev/null
+++ b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_POWER_LID_CLOSED_SIGN_OUT_LABEL.png.sha1
@@ -0,0 +1 @@
+106a64fd153a9848d4ef0c075f0f9928ba37234a
\ No newline at end of file
diff --git a/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_POWER_LID_CLOSED_SLEEP_LABEL.png.sha1 b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_POWER_LID_CLOSED_SLEEP_LABEL.png.sha1
new file mode 100644
index 0000000..753e2c55
--- /dev/null
+++ b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_POWER_LID_CLOSED_SLEEP_LABEL.png.sha1
@@ -0,0 +1 @@
+106a64fd153a9848d4ef0c075f0f9928ba37234a
\ No newline at end of file
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index 2cb13e7..a3bc81d 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -970,8 +970,6 @@
     "optimization_guide/prediction/prediction_model_download_client.h",
     "page_info/about_this_site_service_factory.cc",
     "page_info/about_this_site_service_factory.h",
-    "page_info/about_this_site_tab_helper.cc",
-    "page_info/about_this_site_tab_helper.h",
     "page_info/chrome_about_this_site_service_client.cc",
     "page_info/chrome_about_this_site_service_client.h",
     "page_load_metrics/observers/core/amp_page_load_metrics_observer.cc",
@@ -2718,8 +2716,6 @@
       "android/history_report/usage_reports_buffer_service.h",
       "android/httpclient/http_client_bridge.cc",
       "android/httpclient/http_client_bridge.h",
-      "android/hung_renderer_infobar_delegate.cc",
-      "android/hung_renderer_infobar_delegate.h",
       "android/instantapps/instant_apps_infobar_delegate.cc",
       "android/instantapps/instant_apps_infobar_delegate.h",
       "android/instantapps/instant_apps_message_delegate.cc",
@@ -4027,6 +4023,8 @@
       "obsolete_system/obsolete_system.h",
       "page_info/about_this_site_side_panel_throttle.cc",
       "page_info/about_this_site_side_panel_throttle.h",
+      "page_info/about_this_site_tab_helper.cc",
+      "page_info/about_this_site_tab_helper.h",
       "page_load_metrics/observers/session_restore_page_load_metrics_observer.cc",
       "page_load_metrics/observers/session_restore_page_load_metrics_observer.h",
       "password_manager/generated_password_leak_detection_pref.cc",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index c6a6ae2..5d5cb6b 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -4903,13 +4903,6 @@
      kOsCrOS,
      SINGLE_VALUE_TYPE(
          ::switches::kEnableExperimentalAccessibilitySwitchAccessText)},
-    {"enable-magnifier-continuous-mouse-following-mode-setting",
-     flag_descriptions::kMagnifierContinuousMouseFollowingModeSettingName,
-     flag_descriptions::
-         kMagnifierContinuousMouseFollowingModeSettingDescription,
-     kOsCrOS,
-     FEATURE_VALUE_TYPE(
-         features::kMagnifierContinuousMouseFollowingModeSetting)},
     {"enable-docked-magnifier-resizing",
      flag_descriptions::kDockedMagnifierResizingName,
      flag_descriptions::kDockedMagnifierResizingDescription, kOsCrOS,
@@ -7214,6 +7207,19 @@
      kOsDesktop | kOsAndroid,
      FEATURE_VALUE_TYPE(page_info::kPageInfoAboutThisSiteMoreInfo)},
 
+    {"page-info-about-this-page-description-placeholder",
+     flag_descriptions::kPageInfoboutThisPageDescriptionPlaceholderName,
+     flag_descriptions::kPageInfoboutThisPageDescriptionPlaceholderDescription,
+     kOsDesktop | kOsAndroid,
+     FEATURE_VALUE_TYPE(
+         page_info::kPageInfoAboutThisSiteDescriptionPlaceholder)},
+
+    {"page-info-about-this-page-persistent-side-panel-entry",
+     flag_descriptions::kPageInfoboutThisPagePersistentEntryName,
+     flag_descriptions::kPageInfoboutThisPagePersistentEntryDescription,
+     kOsDesktop,
+     FEATURE_VALUE_TYPE(page_info::kAboutThisSitePersistentSidePanelEntry)},
+
 #if BUILDFLAG(IS_CHROMEOS_ASH)
     {kClipboardHistoryReorderInternalName,
      flag_descriptions::kClipboardHistoryReorderName,
diff --git a/chrome/browser/android/hung_renderer_infobar_delegate.cc b/chrome/browser/android/hung_renderer_infobar_delegate.cc
deleted file mode 100644
index 3af5aa23a2..0000000
--- a/chrome/browser/android/hung_renderer_infobar_delegate.cc
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/android/hung_renderer_infobar_delegate.h"
-
-#include "base/callback.h"
-#include "base/metrics/histogram_macros.h"
-#include "chrome/browser/android/android_theme_resources.h"
-#include "chrome/grit/generated_resources.h"
-#include "components/infobars/android/confirm_infobar.h"
-#include "components/infobars/content/content_infobar_manager.h"
-#include "components/infobars/core/infobar.h"
-#include "content/public/browser/render_process_host.h"
-#include "content/public/common/result_codes.h"
-#include "ui/base/l10n/l10n_util.h"
-
-// static
-void HungRendererInfoBarDelegate::Create(
-    infobars::ContentInfoBarManager* infobar_manager,
-    content::RenderProcessHost* render_process_host) {
-  DCHECK(render_process_host);
-  infobar_manager->AddInfoBar(std::make_unique<infobars::ConfirmInfoBar>(
-      std::unique_ptr<ConfirmInfoBarDelegate>(
-          new HungRendererInfoBarDelegate(render_process_host))));
-}
-
-HungRendererInfoBarDelegate::HungRendererInfoBarDelegate(
-    content::RenderProcessHost* render_process_host)
-    : render_process_host_(render_process_host) {}
-
-HungRendererInfoBarDelegate::~HungRendererInfoBarDelegate() = default;
-
-infobars::InfoBarDelegate::InfoBarIdentifier
-HungRendererInfoBarDelegate::GetIdentifier() const {
-  return HUNG_RENDERER_INFOBAR_DELEGATE_ANDROID;
-}
-
-HungRendererInfoBarDelegate*
-HungRendererInfoBarDelegate::AsHungRendererInfoBarDelegate() {
-  return this;
-}
-
-int HungRendererInfoBarDelegate::GetIconId() const {
-  return IDR_ANDROID_INFOBAR_FROZEN_TAB;
-}
-
-std::u16string HungRendererInfoBarDelegate::GetMessageText() const {
-  return l10n_util::GetStringUTF16(IDS_BROWSER_HANGMONITOR_RENDERER_INFOBAR);
-}
-
-std::u16string HungRendererInfoBarDelegate::GetButtonLabel(
-    InfoBarButton button) const {
-  return l10n_util::GetStringUTF16(
-      (button == BUTTON_OK) ? IDS_BROWSER_HANGMONITOR_RENDERER_INFOBAR_END
-                            : IDS_BROWSER_HANGMONITOR_RENDERER_WAIT);
-}
-
-bool HungRendererInfoBarDelegate::Accept() {
-  render_process_host_->Shutdown(content::RESULT_CODE_HUNG);
-  return true;
-}
-
-bool HungRendererInfoBarDelegate::Cancel() {
-  return true;
-}
diff --git a/chrome/browser/android/hung_renderer_infobar_delegate.h b/chrome/browser/android/hung_renderer_infobar_delegate.h
deleted file mode 100644
index 033051b..0000000
--- a/chrome/browser/android/hung_renderer_infobar_delegate.h
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_ANDROID_HUNG_RENDERER_INFOBAR_DELEGATE_H_
-#define CHROME_BROWSER_ANDROID_HUNG_RENDERER_INFOBAR_DELEGATE_H_
-
-#include "base/memory/raw_ptr.h"
-#include "components/infobars/core/confirm_infobar_delegate.h"
-
-namespace content {
-class RenderProcessHost;
-}
-
-namespace infobars {
-class ContentInfoBarManager;
-}
-
-// A hung renderer infobar is shown when the when the renderer is deemed
-// unresponsive. The infobar provides the user with a choice of either
-// waiting for the renderer to regain responsiveness, or killing the
-// renderer immediately. This class provides the resources necessary to
-// display such an infobar, also logging the action taken by the user
-// (if any) for UMA purposes.
-class HungRendererInfoBarDelegate : public ConfirmInfoBarDelegate {
- public:
-  // Creates a hung renderer InfoBar, adding it to the provided
-  // |infobar_manager|. The |render_process_host| will be used to kill the
-  // renderer process if the user so chooses.
-  static void Create(infobars::ContentInfoBarManager* infobar_manager,
-                     content::RenderProcessHost* render_process_host);
-
-  HungRendererInfoBarDelegate(const HungRendererInfoBarDelegate&) = delete;
-  HungRendererInfoBarDelegate& operator=(const HungRendererInfoBarDelegate&) =
-      delete;
-
- private:
-  // Keep these values in alignment with their histograms.xml counterparts.
-  enum Event {
-    WAIT_CLICKED = 0,
-    KILL_CLICKED,
-    CLOSE_CLICKED,
-    RENDERER_BECAME_RESPONSIVE,
-    TAB_CLOSED,
-    EVENT_COUNT
-  };
-
-  explicit HungRendererInfoBarDelegate(
-      content::RenderProcessHost* render_process_host);
-  ~HungRendererInfoBarDelegate() override;
-
-  // ConfirmInfoBarDelegate:
-  infobars::InfoBarDelegate::InfoBarIdentifier GetIdentifier() const override;
-  HungRendererInfoBarDelegate* AsHungRendererInfoBarDelegate() override;
-  int GetIconId() const override;
-  std::u16string GetMessageText() const override;
-  std::u16string GetButtonLabel(InfoBarButton button) const override;
-  bool Accept() override;
-  bool Cancel() override;
-
-  // Used to terminate the renderer process if the user clicks the kill button.
-  raw_ptr<content::RenderProcessHost> render_process_host_;
-};
-
-#endif  // CHROME_BROWSER_ANDROID_HUNG_RENDERER_INFOBAR_DELEGATE_H_
diff --git a/chrome/browser/android/omnibox/autocomplete_controller_android.cc b/chrome/browser/android/omnibox/autocomplete_controller_android.cc
index 7aef586..828ad31 100644
--- a/chrome/browser/android/omnibox/autocomplete_controller_android.cc
+++ b/chrome/browser/android/omnibox/autocomplete_controller_android.cc
@@ -56,7 +56,6 @@
 #include "components/omnibox/browser/zero_suggest_prefetcher.h"
 #include "components/omnibox/common/omnibox_features.h"
 #include "components/open_from_clipboard/clipboard_recent_content.h"
-#include "components/search_engines/omnibox_focus_type.h"
 #include "components/search_engines/template_url.h"
 #include "components/search_engines/template_url_service.h"
 #include "components/sessions/content/session_tab_helper.h"
@@ -67,6 +66,7 @@
 #include "content/public/common/url_constants.h"
 #include "net/cookies/cookie_util.h"
 #include "third_party/metrics_proto/omnibox_event.pb.h"
+#include "third_party/metrics_proto/omnibox_focus_type.pb.h"
 #include "ui/base/page_transition_types.h"
 #include "ui/base/window_open_disposition.h"
 #include "url/android/gurl_android.h"
@@ -172,7 +172,8 @@
   AutocompleteInput ntp_prefetch_input(
       u"", metrics::OmniboxEventProto::NTP_ZPS_PREFETCH,
       ChromeAutocompleteSchemeClassifier(profile_));
-  ntp_prefetch_input.set_focus_type(OmniboxFocusType::ON_FOCUS);
+  ntp_prefetch_input.set_focus_type(
+      metrics::OmniboxFocusType::INTERACTION_FOCUS);
 
   if (OmniboxFieldTrial::UseSharedInstanceForZeroSuggestPrefetching()) {
     autocomplete_controller_->StartPrefetch(ntp_prefetch_input);
@@ -252,7 +253,7 @@
                              ChromeAutocompleteSchemeClassifier(profile_));
   input_.set_current_url(current_url);
   input_.set_current_title(current_title);
-  input_.set_focus_type(OmniboxFocusType::ON_FOCUS);
+  input_.set_focus_type(metrics::OmniboxFocusType::INTERACTION_FOCUS);
   autocomplete_controller_->Start(input_);
 }
 
@@ -308,8 +309,9 @@
   OmniboxLog log(
       // For zero suggest, record an empty input string instead of the
       // current URL.
-      input_.focus_type() != OmniboxFocusType::DEFAULT ? std::u16string()
-                                                       : input_.text(),
+      input_.focus_type() != metrics::OmniboxFocusType::INTERACTION_DEFAULT
+          ? std::u16string()
+          : input_.text(),
       false,                /* don't know */
       input_.type(), false, /* not keyword mode */
       OmniboxEventProto::INVALID, true, match_index,
diff --git a/chrome/browser/android/resource_id.h b/chrome/browser/android/resource_id.h
index 21d86351..cc8f082 100644
--- a/chrome/browser/android/resource_id.h
+++ b/chrome/browser/android/resource_id.h
@@ -31,7 +31,6 @@
 LINK_RESOURCE_ID(IDR_INFOBAR_AUTOFILL_CC, R.drawable.infobar_autofill_cc)
 
 // Android only infobars.
-DECLARE_RESOURCE_ID(IDR_ANDROID_INFOBAR_FROZEN_TAB, R.drawable.infobar_restore)
 DECLARE_RESOURCE_ID(IDR_ANDROID_INFOBAR_LITE_MODE, R.drawable.preview_pin_round)
 DECLARE_RESOURCE_ID(IDR_ANDROID_INFOBAR_NOTIFICATIONS_OFF,
                     R.drawable.permission_push_notification_off)
diff --git a/chrome/browser/android/tab_web_contents_delegate_android.cc b/chrome/browser/android/tab_web_contents_delegate_android.cc
index b6372c1..634f21382 100644
--- a/chrome/browser/android/tab_web_contents_delegate_android.cc
+++ b/chrome/browser/android/tab_web_contents_delegate_android.cc
@@ -20,7 +20,6 @@
 #include "chrome/android/chrome_jni_headers/TabWebContentsDelegateAndroidImpl_jni.h"
 #include "chrome/browser/android/customtabs/client_data_header_web_contents_observer.h"
 #include "chrome/browser/android/framebust_intervention/framebust_blocked_delegate_android.h"
-#include "chrome/browser/android/hung_renderer_infobar_delegate.h"
 #include "chrome/browser/android/tab_android.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
@@ -110,17 +109,6 @@
           static_cast<int>(rect.right()), static_cast<int>(rect.bottom())));
 }
 
-infobars::InfoBar* FindHungRendererInfoBar(
-    infobars::ContentInfoBarManager* infobar_manager) {
-  DCHECK(infobar_manager);
-  for (size_t i = 0; i < infobar_manager->infobar_count(); ++i) {
-    infobars::InfoBar* infobar = infobar_manager->infobar_at(i);
-    if (infobar->delegate()->AsHungRendererInfoBarDelegate())
-      return infobar;
-  }
-  return nullptr;
-}
-
 void ShowFramebustBlockMessageInternal(content::WebContents* web_contents,
                                        const GURL& url) {
   auto intervention_outcome =
@@ -639,32 +627,6 @@
       content::WebContents::FromJavaWebContents(java_web_contents);
   if (base::RandDouble() < 0.01)
     web_contents->GetPrimaryMainFrame()->GetProcess()->DumpProcessStack();
-
-  if (!base::CommandLine::ForCurrentProcess()->HasSwitch(
-          switches::kEnableHungRendererInfoBar)) {
-    return;
-  }
-
-  infobars::ContentInfoBarManager* infobar_manager =
-      infobars::ContentInfoBarManager::FromWebContents(web_contents);
-  DCHECK(!FindHungRendererInfoBar(infobar_manager));
-  HungRendererInfoBarDelegate::Create(
-      infobar_manager, web_contents->GetPrimaryMainFrame()->GetProcess());
-}
-
-void JNI_TabWebContentsDelegateAndroidImpl_OnRendererResponsive(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& java_web_contents) {
-  content::WebContents* web_contents =
-          content::WebContents::FromJavaWebContents(java_web_contents);
-  infobars::ContentInfoBarManager* infobar_manager =
-      infobars::ContentInfoBarManager::FromWebContents(web_contents);
-  infobars::InfoBar* hung_renderer_infobar =
-      FindHungRendererInfoBar(infobar_manager);
-  if (!hung_renderer_infobar)
-    return;
-
-  infobar_manager->RemoveInfoBar(hung_renderer_infobar);
 }
 
 void JNI_TabWebContentsDelegateAndroidImpl_ShowFramebustBlockInfoBar(
diff --git a/chrome/browser/ash/crosapi/audio_service_ash.h b/chrome/browser/ash/crosapi/audio_service_ash.h
index 51bc899..251806c 100644
--- a/chrome/browser/ash/crosapi/audio_service_ash.h
+++ b/chrome/browser/ash/crosapi/audio_service_ash.h
@@ -13,7 +13,7 @@
 
 namespace extensions {
 class AudioDeviceIdCalculator;
-};  // namespace extensions
+}  // namespace extensions
 
 class Profile;
 
diff --git a/chrome/browser/ash/crosapi/browser_data_migrator_browsertest.cc b/chrome/browser/ash/crosapi/browser_data_migrator_browsertest.cc
index 21984d27..d74093e 100644
--- a/chrome/browser/ash/crosapi/browser_data_migrator_browsertest.cc
+++ b/chrome/browser/ash/crosapi/browser_data_migrator_browsertest.cc
@@ -117,7 +117,7 @@
   // Migration should be triggered in copy mode and not move mode.
   EXPECT_FALSE(FakeSessionManagerClient::Get()
                    ->request_browser_data_migration_for_move_called());
-};
+}
 
 class BrowserDataMigratorMoveMigrateOnSignInByPolicy
     : public BrowserDataMigratorOnSignIn {
@@ -164,7 +164,7 @@
       FakeSessionManagerClient::Get()->request_browser_data_migration_called());
   EXPECT_TRUE(FakeSessionManagerClient::Get()
                   ->request_browser_data_migration_for_move_called());
-};
+}
 
 class BrowserDataMigratorMoveMigrateOnSignInByFeature
     : public BrowserDataMigratorOnSignIn {
@@ -203,7 +203,7 @@
       FakeSessionManagerClient::Get()->request_browser_data_migration_called());
   EXPECT_TRUE(FakeSessionManagerClient::Get()
                   ->request_browser_data_migration_for_move_called());
-};
+}
 
 class BrowserDataMigratorResumeOnSignIn : public BrowserDataMigratorOnSignIn,
                                           public LocalStateMixin::Delegate {
diff --git a/chrome/browser/ash/first_party_sets/first_party_sets_policy_initialization_browsertest.cc b/chrome/browser/ash/first_party_sets/first_party_sets_policy_initialization_browsertest.cc
index dc835939..933e0a2c 100644
--- a/chrome/browser/ash/first_party_sets/first_party_sets_policy_initialization_browsertest.cc
+++ b/chrome/browser/ash/first_party_sets/first_party_sets_policy_initialization_browsertest.cc
@@ -72,7 +72,7 @@
     policy_provider_.UpdateChromePolicy(policy_);
   }
 
-  AccountId test_account_id() { return test_account_id_; };
+  AccountId test_account_id() { return test_account_id_; }
 
  private:
   ash::LoginManagerMixin login_mixin_{&mixin_host_};
diff --git a/chrome/browser/ash/game_mode/game_mode_controller.cc b/chrome/browser/ash/game_mode/game_mode_controller.cc
index 2e440c6..ac95e44 100644
--- a/chrome/browser/ash/game_mode/game_mode_controller.cc
+++ b/chrome/browser/ash/game_mode/game_mode_controller.cc
@@ -6,6 +6,7 @@
 
 #include "ash/components/arc/arc_features.h"
 #include "ash/components/arc/arc_util.h"
+#include "ash/components/arc/mojom/app.mojom.h"
 #include "ash/components/arc/session/connection_holder.h"
 #include "ash/shell.h"
 #include "base/time/time.h"
@@ -43,9 +44,8 @@
     if (!base::FeatureList::IsEnabled(arc::kGameModeFeature))
       return;
 
-    auto* app_instance = ARC_GET_INSTANCE_FOR_METHOD(
-                ArcAppListPrefs::Get(profile)->app_connection_holder(),
-                GetTaskInfo);
+    connection_ = ArcAppListPrefs::Get(profile)->app_connection_holder();
+    auto* app_instance = ARC_GET_INSTANCE_FOR_METHOD(connection_, GetTaskInfo);
     if (!app_instance) {
       LOG(ERROR) << "GetTaskInfo method for ARC is not available";
       return;
@@ -59,17 +59,37 @@
 
   void OnReceiveTaskInfo(const std::string& pkg_name,
                          const std::string& activity) {
-    bool is_game = g_arc_game_pkg_names->count(pkg_name);
-    VLOG(2) << "ARC task package " << pkg_name << " is game? " << is_game;
-    if (is_game) {
-      enabler_ = std::make_unique<GameModeController::GameModeEnabler>(
-          GameMode::ARC);
+    bool is_known_game = g_arc_game_pkg_names->count(pkg_name);
+    VLOG(2) << "ARC task package " << pkg_name << " is game? " << is_known_game;
+    if (is_known_game) {
+      enabler_ =
+          std::make_unique<GameModeController::GameModeEnabler>(GameMode::ARC);
+    } else if (auto* app_instance =
+                   ARC_GET_INSTANCE_FOR_METHOD(connection_, GetAppCategory);
+               app_instance) {
+      VLOG(2) << "Fetch app category of package: " << pkg_name;
+      app_instance->GetAppCategory(
+          pkg_name, base::BindOnce(&ArcGameModeCriteria::OnReceiveAppCategory,
+                                   weak_ptr_factory_.GetWeakPtr()));
+    } else {
+      LOG(ERROR) << "Failed to call GetAppCategory";
+    }
+  }
+
+  void OnReceiveAppCategory(arc::mojom::AppCategory category) {
+    VLOG(2) << "ARC app category is: " << category;
+    if (category == arc::mojom::AppCategory::kGame) {
+      enabler_ =
+          std::make_unique<GameModeController::GameModeEnabler>(GameMode::ARC);
     }
   }
 
   GameMode mode() const override { return GameMode::ARC; }
 
  private:
+  arc::ConnectionHolder<arc::mojom::AppInstance, arc::mojom::AppHost>*
+      connection_;
+
   std::unique_ptr<GameModeController::GameModeEnabler> enabler_;
 
   // This must come last to make sure weak pointers are invalidated first.
diff --git a/chrome/browser/ash/game_mode/game_mode_controller_unittest.cc b/chrome/browser/ash/game_mode/game_mode_controller_unittest.cc
index b7e9b92..4f1f24f 100644
--- a/chrome/browser/ash/game_mode/game_mode_controller_unittest.cc
+++ b/chrome/browser/ash/game_mode/game_mode_controller_unittest.cc
@@ -306,6 +306,8 @@
   fake_resourced_client_->set_set_game_mode_response(
       ash::ResourcedClient::GameMode::ARC);
 
+  arc_app_test_.app_instance()->set_app_category_of_pkg(
+        "net.recipes.search", arc::mojom::AppCategory::kProductivity);
   arc_app_test_.app_instance()->SetTaskInfo(9999, "net.recipes.search",
                                             "activity");
 
@@ -379,5 +381,19 @@
   EXPECT_EQ(3, fake_resourced_client_->get_enter_game_mode_count());
 }
 
+TEST_F(GameModeControllerForArcTest, IdentifyGameWithGetAppCategory) {
+  arc_app_test_.app_instance()->set_app_category_of_pkg(
+      "org.an_awesome.game", arc::mojom::AppCategory::kGame);
+  arc_app_test_.app_instance()->SetTaskInfo(
+      9882, "org.an_awesome.game", "activity");
+
+  auto game_widget = CreateArcTaskWidget(9882);
+  game_widget->Show();
+  fake_resourced_client_->set_set_game_mode_response(
+      ash::ResourcedClient::GameMode::OFF);
+  game_widget->SetFullscreen(true);
+  EXPECT_EQ(1, fake_resourced_client_->get_enter_game_mode_count());
+}
+
 }  // namespace
 }  // namespace game_mode
diff --git a/chrome/browser/ash/login/screens/hid_detection_screen_browsertest.cc b/chrome/browser/ash/login/screens/hid_detection_screen_browsertest.cc
index c8fa1145..e43bf803 100644
--- a/chrome/browser/ash/login/screens/hid_detection_screen_browsertest.cc
+++ b/chrome/browser/ash/login/screens/hid_detection_screen_browsertest.cc
@@ -506,7 +506,7 @@
   }
 
   ForceStopHidDetectionIfRevamp();
-};
+}
 
 IN_PROC_BROWSER_TEST_P(HIDDetectionScreenChromeboxTest,
                        BluetoothPairingDialog) {
diff --git a/chrome/browser/ash/policy/core/device_policy_decoder.cc b/chrome/browser/ash/policy/core/device_policy_decoder.cc
index 0d70183..8a2fcfd 100644
--- a/chrome/browser/ash/policy/core/device_policy_decoder.cc
+++ b/chrome/browser/ash/policy/core/device_policy_decoder.cc
@@ -909,6 +909,18 @@
           policies, key::kReportDeviceAudioStatusCheckingRateMs,
           container.report_device_audio_status_checking_rate_ms());
     }
+    if (container.has_report_signal_strength_event_driven_telemetry()) {
+      base::ListValue signal_strength_telemetry_list;
+      for (const std::string& telemetry_entry :
+           container.report_signal_strength_event_driven_telemetry()
+               .entries()) {
+        signal_strength_telemetry_list.Append(telemetry_entry);
+      }
+      policies->Set(key::kReportDeviceSignalStrengthEventDrivenTelemetry,
+                    POLICY_LEVEL_MANDATORY, POLICY_SCOPE_MACHINE,
+                    POLICY_SOURCE_CLOUD,
+                    std::move(signal_strength_telemetry_list), nullptr);
+    }
   }
 
   if (policy.has_device_heartbeat_settings()) {
diff --git a/chrome/browser/ash/policy/core/device_policy_decoder_unittest.cc b/chrome/browser/ash/policy/core/device_policy_decoder_unittest.cc
index 75bf4ac..5c713188 100644
--- a/chrome/browser/ash/policy/core/device_policy_decoder_unittest.cc
+++ b/chrome/browser/ash/policy/core/device_policy_decoder_unittest.cc
@@ -357,6 +357,28 @@
                                std::move(report_os_update_status_value));
 }
 
+TEST_F(DevicePolicyDecoderTest,
+       ReportDeviceSignalStrengthEventDrivenTelemetry) {
+  em::ChromeDeviceSettingsProto device_policy;
+
+  DecodeUnsetDevicePolicyTestHelper(
+      device_policy, key::kReportDeviceSignalStrengthEventDrivenTelemetry);
+
+  base::ListValue signal_strength_telemetry_list;
+  signal_strength_telemetry_list.Append("network_telemetry");
+  signal_strength_telemetry_list.Append("https_latency");
+  device_policy.mutable_device_reporting()
+      ->mutable_report_signal_strength_event_driven_telemetry()
+      ->add_entries("network_telemetry");
+  device_policy.mutable_device_reporting()
+      ->mutable_report_signal_strength_event_driven_telemetry()
+      ->add_entries("https_latency");
+
+  DecodeDevicePolicyTestHelper(
+      device_policy, key::kReportDeviceSignalStrengthEventDrivenTelemetry,
+      std::move(signal_strength_telemetry_list));
+}
+
 TEST_F(DevicePolicyDecoderTest, DecodeServiceUUIDListSuccess) {
   std::string error;
   absl::optional<base::Value> decoded_json = DecodeJsonStringAndNormalize(
diff --git a/chrome/browser/ash/settings/device_settings_provider.cc b/chrome/browser/ash/settings/device_settings_provider.cc
index 050674b..cb34df3e 100644
--- a/chrome/browser/ash/settings/device_settings_provider.cc
+++ b/chrome/browser/ash/settings/device_settings_provider.cc
@@ -145,6 +145,7 @@
     kReportDeviceNetworkTelemetryEventCheckingRateMs,
     kReportDeviceSessionStatus,
     kReportDeviceSecurityStatus,
+    kReportDeviceSignalStrengthEventDrivenTelemetry,
     kReportDeviceTimezoneInfo,
     kReportDeviceGraphicsStatus,
     kReportDeviceMemoryInfo,
@@ -807,6 +808,17 @@
           kReportDeviceAudioStatusCheckingRateMs,
           reporting_policy.report_device_audio_status_checking_rate_ms());
     }
+    if (reporting_policy.has_report_signal_strength_event_driven_telemetry()) {
+      base::ListValue signal_strength_telemetry_list;
+      for (const std::string& telemetry_entry :
+           reporting_policy.report_signal_strength_event_driven_telemetry()
+               .entries()) {
+        signal_strength_telemetry_list.Append(telemetry_entry);
+      }
+      new_values_cache->SetValue(
+          kReportDeviceSignalStrengthEventDrivenTelemetry,
+          std::move(signal_strength_telemetry_list));
+    }
   }
 }
 
diff --git a/chrome/browser/ash/settings/device_settings_provider_unittest.cc b/chrome/browser/ash/settings/device_settings_provider_unittest.cc
index 57a1b53..e0c58a4 100644
--- a/chrome/browser/ash/settings/device_settings_provider_unittest.cc
+++ b/chrome/browser/ash/settings/device_settings_provider_unittest.cc
@@ -775,6 +775,25 @@
   VerifyReportingSettings(false, status_frequency);
 }
 
+TEST_F(DeviceSettingsProviderTest,
+       DecodeReportingSignalStrengthEventDrivenTelemetrySetting) {
+  em::DeviceReportingProto* proto =
+      device_policy_->payload().mutable_device_reporting();
+  proto->mutable_report_signal_strength_event_driven_telemetry()->add_entries(
+      "https_latency");
+  proto->mutable_report_signal_strength_event_driven_telemetry()->add_entries(
+      "network_telemetry");
+
+  BuildAndInstallDevicePolicy();
+
+  base::ListValue signal_strength_telemetry_list;
+  signal_strength_telemetry_list.Append("https_latency");
+  signal_strength_telemetry_list.Append("network_telemetry");
+
+  VerifyPolicyValue(kReportDeviceSignalStrengthEventDrivenTelemetry,
+                    &signal_strength_telemetry_list);
+}
+
 TEST_F(DeviceSettingsProviderTest, DecodeHeartbeatSettings) {
   // Turn on heartbeats and verify that the heartbeat settings have been
   // decoded correctly.
diff --git a/chrome/browser/ash/web_applications/os_feedback_system_web_app_info.cc b/chrome/browser/ash/web_applications/os_feedback_system_web_app_info.cc
index f0bbb710..a35d5c12 100644
--- a/chrome/browser/ash/web_applications/os_feedback_system_web_app_info.cc
+++ b/chrome/browser/ash/web_applications/os_feedback_system_web_app_info.cc
@@ -9,12 +9,14 @@
 #include "ash/constants/ash_features.h"
 #include "ash/webui/grit/ash_os_feedback_resources.h"
 #include "ash/webui/os_feedback_ui/url_constants.h"
+#include "base/metrics/histogram_macros.h"
 #include "chrome/browser/apps/app_service/app_launch_params.h"
 #include "chrome/browser/ash/os_feedback/os_feedback_screenshot_manager.h"
 #include "chrome/browser/ash/web_applications/system_web_app_install_utils.h"
 #include "chrome/browser/ui/ash/multi_user/multi_user_util.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_window.h"
+#include "chrome/browser/ui/chrome_pages.h"
 #include "chrome/browser/web_applications/user_display_mode.h"
 #include "chrome/browser/web_applications/web_app_install_info.h"
 #include "chrome/browser/web_applications/web_app_provider.h"
@@ -123,6 +125,13 @@
         base::BindOnce(&OSFeedbackAppDelegate::OnScreenshotTaken,
                        weak_ptr_factory_.GetWeakPtr(), profile, provider, url,
                        std::move(app_params)));
+
+    // Record an UMA histogram when feedback app is open from Launcher.
+    if (params.launch_source != apps::LaunchSource::kFromChromeInternal) {
+      UMA_HISTOGRAM_ENUMERATION("Feedback.RequestSource",
+                                chrome::kFeedbackSourceLauncher,
+                                chrome::kFeedbackSourceCount);
+    }
   }
   // Return nullptr to tell the rest of the code SWA aborted the launch so that
   // the Feedback can use a customized launch process, i.e., take a screenshot
diff --git a/chrome/browser/autocomplete/search_provider_unittest.cc b/chrome/browser/autocomplete/search_provider_unittest.cc
index 0fb6d46c..ab41ac32 100644
--- a/chrome/browser/autocomplete/search_provider_unittest.cc
+++ b/chrome/browser/autocomplete/search_provider_unittest.cc
@@ -44,7 +44,6 @@
 #include "components/omnibox/browser/suggestion_answer.h"
 #include "components/omnibox/common/omnibox_features.h"
 #include "components/prefs/pref_service.h"
-#include "components/search_engines/omnibox_focus_type.h"
 #include "components/search_engines/search_engine_type.h"
 #include "components/search_engines/search_engines_switches.h"
 #include "components/search_engines/search_terms_data.h"
@@ -59,6 +58,7 @@
 #include "services/network/test/test_url_loader_factory.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/metrics_proto/omnibox_event.pb.h"
+#include "third_party/metrics_proto/omnibox_focus_type.pb.h"
 #include "ui/base/device_form_factor.h"
 
 using base::ASCIIToUTF16;
@@ -3737,7 +3737,7 @@
   AutocompleteInput input(u"f", metrics::OmniboxEventProto::OTHER,
                           ChromeAutocompleteSchemeClassifier(profile_.get()));
   input.set_prefer_keyword(true);
-  input.set_focus_type(OmniboxFocusType::ON_FOCUS);
+  input.set_focus_type(metrics::OmniboxFocusType::INTERACTION_FOCUS);
   provider_->Start(input, false);
   EXPECT_TRUE(provider_->matches().empty());
 }
@@ -3754,7 +3754,7 @@
   AutocompleteInput input(u"f", metrics::OmniboxEventProto::OTHER,
                           ChromeAutocompleteSchemeClassifier(profile_.get()));
   input.set_prefer_keyword(true);
-  input.set_focus_type(OmniboxFocusType::ON_FOCUS);
+  input.set_focus_type(metrics::OmniboxFocusType::INTERACTION_FOCUS);
 
   provider_->Start(input, false);
   // RunUntilIdle so that SearchProvider create the URLFetcher.
diff --git a/chrome/browser/bookmarks/android/bookmark_bridge.cc b/chrome/browser/bookmarks/android/bookmark_bridge.cc
index 4bc99d06..a8a1f77 100644
--- a/chrome/browser/bookmarks/android/bookmark_bridge.cc
+++ b/chrome/browser/bookmarks/android/bookmark_bridge.cc
@@ -949,7 +949,6 @@
     if (info.has_value()) {
       std::unique_ptr<power_bookmarks::PowerBookmarkMeta> meta =
           std::make_unique<power_bookmarks::PowerBookmarkMeta>();
-      meta->set_type(power_bookmarks::SHOPPING);
       meta->mutable_lead_image()->set_url(info->image_url.spec());
 
       power_bookmarks::ShoppingSpecifics* specifics =
diff --git a/chrome/browser/browser_resources.grd b/chrome/browser/browser_resources.grd
index 73121e5..3a00a6f 100644
--- a/chrome/browser/browser_resources.grd
+++ b/chrome/browser/browser_resources.grd
@@ -174,8 +174,10 @@
         <include name="IDR_URGENT_PASSWORD_EXPIRY_NOTIFICATION_HTML" file="resources\chromeos\password_change\urgent_password_expiry_notification.html" type="chrome_html" />
         <include name="IDR_URGENT_PASSWORD_EXPIRY_NOTIFICATION_APP_JS" file="${root_gen_dir}\chrome\browser\resources\chromeos\password_change\urgent_password_expiry_notification_app.js" type="chrome_html" use_base_dir="false" />
         <include name="IDR_GAIA_AUTH_AUTHENTICATOR_JS" file="resources\gaia_auth_host\authenticator.js" flattenhtml="true" type="BINDATA" />
+        <include name="IDR_LOCK_SCREEN_REAUTH_APP_HTML" file="resources\chromeos\password_change\lock_screen_reauth_app.html" flattenhtml="true" type="BINDATA" />
         <include name="IDR_LOCK_SCREEN_REAUTH_HTML" file="resources\chromeos\password_change\lock_screen_reauth.html" flattenhtml="true" type="BINDATA" />
-        <include name="IDR_LOCK_SCREEN_REAUTH_JS" file="resources\chromeos\password_change\lock_screen_reauth.js" type="BINDATA" />
+        <include name="IDR_LOCK_SCREEN_REAUTH_APP_JS" file="resources\chromeos\password_change\lock_screen_reauth_app.js" type="BINDATA" />
+        <include name="IDR_LOCK_SCREEN_REAUTH_JS" file="${root_gen_dir}\chrome\browser\resources\chromeos\password_change\lock_screen_reauth.js" type="chrome_html" use_base_dir="false" />
         <include name="IDR_LOCK_SCREEN_NETWORK_HTML" file="resources\chromeos\password_change\lock_screen_network.html" type="BINDATA" />
         <include name="IDR_LOCK_SCREEN_NETWORK_JS" file="resources\chromeos\password_change\lock_screen_network.js" type="BINDATA" />
 
diff --git a/chrome/browser/chrome_browser_interface_binders.cc b/chrome/browser/chrome_browser_interface_binders.cc
index 461ac34..6401b9b 100644
--- a/chrome/browser/chrome_browser_interface_binders.cc
+++ b/chrome/browser/chrome_browser_interface_binders.cc
@@ -947,7 +947,7 @@
                                            NewTabPageUI>(map);
   }
 
-  if (base::FeatureList::IsEnabled(ntp_features::kNtpDriveModule)) {
+  if (IsDriveModuleEnabled()) {
     RegisterWebUIControllerInterfaceBinder<drive::mojom::DriveHandler,
                                            NewTabPageUI>(map);
   }
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index c527fb22..594f5874 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -2993,11 +2993,11 @@
   return allowed;
 }
 
-bool ChromeContentBrowserClient::IsConversionMeasurementOperationAllowed(
+bool ChromeContentBrowserClient::IsAttributionReportingOperationAllowed(
     content::BrowserContext* browser_context,
-    ConversionMeasurementOperation operation,
-    const url::Origin* impression_origin,
-    const url::Origin* conversion_origin,
+    AttributionReportingOperation operation,
+    const url::Origin* source_origin,
+    const url::Origin* destination_origin,
     const url::Origin* reporting_origin) {
   Profile* profile = Profile::FromBrowserContext(browser_context);
 
@@ -3007,23 +3007,23 @@
     return false;
 
   switch (operation) {
-    case ConversionMeasurementOperation::kImpression:
-      DCHECK(impression_origin);
+    case AttributionReportingOperation::kSource:
+      DCHECK(source_origin);
       DCHECK(reporting_origin);
-      return privacy_sandbox_settings->IsConversionMeasurementAllowed(
-          *impression_origin, *reporting_origin);
-    case ConversionMeasurementOperation::kConversion:
-      DCHECK(conversion_origin);
+      return privacy_sandbox_settings->IsAttributionReportingAllowed(
+          *source_origin, *reporting_origin);
+    case AttributionReportingOperation::kTrigger:
+      DCHECK(destination_origin);
       DCHECK(reporting_origin);
-      return privacy_sandbox_settings->IsConversionMeasurementAllowed(
-          *conversion_origin, *reporting_origin);
-    case ConversionMeasurementOperation::kReport:
-      DCHECK(impression_origin);
-      DCHECK(conversion_origin);
+      return privacy_sandbox_settings->IsAttributionReportingAllowed(
+          *destination_origin, *reporting_origin);
+    case AttributionReportingOperation::kReport:
+      DCHECK(source_origin);
+      DCHECK(destination_origin);
       DCHECK(reporting_origin);
-      return privacy_sandbox_settings->ShouldSendConversionReport(
-          *impression_origin, *conversion_origin, *reporting_origin);
-    case ConversionMeasurementOperation::kAny:
+      return privacy_sandbox_settings->MaySendAttributionReport(
+          *source_origin, *destination_origin, *reporting_origin);
+    case AttributionReportingOperation::kAny:
       return privacy_sandbox_settings->IsPrivacySandboxEnabled();
   }
 }
diff --git a/chrome/browser/chrome_content_browser_client.h b/chrome/browser/chrome_content_browser_client.h
index edaf7a0..599dae8 100644
--- a/chrome/browser/chrome_content_browser_client.h
+++ b/chrome/browser/chrome_content_browser_client.h
@@ -304,9 +304,9 @@
                                  InterestGroupApiOperation operation,
                                  const url::Origin& top_frame_origin,
                                  const url::Origin& api_origin) override;
-  bool IsConversionMeasurementOperationAllowed(
+  bool IsAttributionReportingOperationAllowed(
       content::BrowserContext* browser_context,
-      ConversionMeasurementOperation operation,
+      AttributionReportingOperation operation,
       const url::Origin* impression_origin,
       const url::Origin* conversion_origin,
       const url::Origin* reporting_origin) override;
diff --git a/chrome/browser/devtools/protocol/devtools_printtopdf_browsertest.cc b/chrome/browser/devtools/protocol/devtools_printtopdf_browsertest.cc
index 1d7fc5a..ada87c14 100644
--- a/chrome/browser/devtools/protocol/devtools_printtopdf_browsertest.cc
+++ b/chrome/browser/devtools/protocol/devtools_printtopdf_browsertest.cc
@@ -39,7 +39,7 @@
   static constexpr int kColorChannels = 4;
   static constexpr int kDpi = 300;
 
-  bool headless() const { return GetParam(); };
+  bool headless() const { return GetParam(); }
 
   void SetUpCommandLine(base::CommandLine* command_line) override {
     DevToolsProtocolTest::SetUpCommandLine(command_line);
diff --git a/chrome/browser/download/download_target_determiner.cc b/chrome/browser/download/download_target_determiner.cc
index 236912bd..37ab859 100644
--- a/chrome/browser/download/download_target_determiner.cc
+++ b/chrome/browser/download/download_target_determiner.cc
@@ -708,7 +708,7 @@
   IGNORE_IF_STALE_PLUGIN_LIST
 };
 
-void IsHandledBySafePlugin(int render_process_id,
+void IsHandledBySafePlugin(content::BrowserContext* browser_context,
                            const GURL& url,
                            const std::string& mime_type,
                            ActionOnStalePluginList stale_plugin_action,
@@ -724,7 +724,7 @@
   content::PluginService* plugin_service =
       content::PluginService::GetInstance();
   bool plugin_found =
-      plugin_service->GetPluginInfo(render_process_id, url, mime_type, false,
+      plugin_service->GetPluginInfo(browser_context, url, mime_type, false,
                                     &is_stale, &plugin_info, &actual_mime_type);
   if (is_stale && stale_plugin_action == RETRY_IF_STALE_PLUGIN_LIST) {
     // The GetPlugins call causes the plugin list to be refreshed. Once that's
@@ -732,9 +732,8 @@
     // after a single retry in order to avoid retrying indefinitely.
     plugin_service->GetPlugins(base::BindOnce(
         &InvokeClosureAfterGetPluginCallback,
-        base::BindOnce(&IsHandledBySafePlugin, render_process_id, url,
-                       mime_type, IGNORE_IF_STALE_PLUGIN_LIST,
-                       std::move(callback))));
+        base::BindOnce(&IsHandledBySafePlugin, browser_context, url, mime_type,
+                       IGNORE_IF_STALE_PLUGIN_LIST, std::move(callback))));
     return;
   }
   // In practice, we assume that retrying once is enough.
@@ -769,14 +768,9 @@
   }
 
 #if BUILDFLAG(ENABLE_PLUGINS)
-  int render_process_id = -1;
-  content::WebContents* web_contents =
-      content::DownloadItemUtils::GetWebContents(download_);
-  if (web_contents)
-    render_process_id =
-        web_contents->GetPrimaryMainFrame()->GetProcess()->GetID();
   IsHandledBySafePlugin(
-      render_process_id, net::FilePathToFileURL(local_path_), mime_type_,
+      content::DownloadItemUtils::GetBrowserContext(download_),
+      net::FilePathToFileURL(local_path_), mime_type_,
       RETRY_IF_STALE_PLUGIN_LIST,
       base::BindOnce(&DownloadTargetDeterminer::DetermineIfHandledSafelyDone,
                      weak_ptr_factory_.GetWeakPtr()));
diff --git a/chrome/browser/download/download_target_determiner_unittest.cc b/chrome/browser/download/download_target_determiner_unittest.cc
index f42bddf..a434cd7 100644
--- a/chrome/browser/download/download_target_determiner_unittest.cc
+++ b/chrome/browser/download/download_target_determiner_unittest.cc
@@ -2472,7 +2472,7 @@
  public:
   MOCK_METHOD1(MockPluginAvailable, bool(const base::FilePath&));
 
-  bool IsPluginAvailable(int render_process_id,
+  bool IsPluginAvailable(content::BrowserContext* browser_context,
                          const content::WebPluginInfo& plugin) override {
     return MockPluginAvailable(plugin.path);
   }
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index 0132895..5beb593d 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -961,7 +961,7 @@
   {
     "name": "clean-undecryptable-passwords",
     "owners": [ "derinel@google.com", "mamir" ],
-    "expiry_milestone": 106
+    "expiry_milestone": 108
   },
   {
     "name": "clear-cross-site-cross-browsing-context-group-window-name",
@@ -2509,11 +2509,6 @@
     "expiry_milestone": 130
   },
   {
-    "name": "enable-magnifier-continuous-mouse-following-mode-setting",
-    "owners": [ "josiahk", "//ui/accessibility/OWNERS" ],
-    "expiry_milestone": 98
-  },
-  {
     "name": "enable-managed-configuration-web-api",
     "owners": [ "apotapchuk" ],
     "expiry_milestone": 92
@@ -4486,11 +4481,6 @@
     "expiry_milestone": 120
   },
   {
-    "name": "new-canvas-2d-api",
-    "owners": [ "aaronhk", "fserb", "juanmihd", "yiyix" ],
-    "expiry_milestone": 100
-  },
-  {
     "name": "new-content-suggestions-feed",
     "owners": [ "adamta@google.com", "sczs", "gogerald", "bling-flags@google.com" ],
     "expiry_milestone": 93
@@ -5053,6 +5043,16 @@
     "expiry_milestone": 110
   },
   {
+    "name": "page-info-about-this-page-description-placeholder",
+    "owners": [ "dullweber", "olesiamarukhno@google.com" ],
+    "expiry_milestone": 109
+  },
+  {
+    "name": "page-info-about-this-page-persistent-side-panel-entry",
+    "owners": [ "dullweber", "olesiamarukhno@google.com" ],
+    "expiry_milestone": 109
+  },
+  {
     "name": "page-info-about-this-site",
     "owners": [ "eokoyomon", "dullweber", "olesiamarukhno@google.com" ],
     "expiry_milestone": 102
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index 63e04b2..8d3f946 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -2162,6 +2162,18 @@
 const char kPageInfoAboutThisSiteDescription[] =
     "Enable the 'About this site' section in the page info.";
 
+const char kPageInfoboutThisPageDescriptionPlaceholderName[] =
+    "AboutThisPage description placeholder";
+const char kPageInfoboutThisPageDescriptionPlaceholderDescription[] =
+    "Shows a placeholder when no description is availble instead of not "
+    "showing an entry at all";
+
+const char kPageInfoboutThisPagePersistentEntryName[] =
+    "AboutThisPage persistent SidePanel entry";
+const char kPageInfoboutThisPagePersistentEntryDescription[] =
+    "Registers a SidePanel entry on pageload if 'AboutThisPage' info is "
+    "available";
+
 const char kPageInfoMoreAboutThisPageName[] =
     "'More about this page' link in page info";
 const char kPageInfoMoreAboutThisPageDescription[] =
@@ -5295,13 +5307,6 @@
     "Enable experimental or in-progress Switch Access features for improved "
     "text input";
 
-const char kMagnifierContinuousMouseFollowingModeSettingName[] =
-    "Enable ability to choose continuous mouse following mode in Magnifier "
-    "settings";
-const char kMagnifierContinuousMouseFollowingModeSettingDescription[] =
-    "Enable feature which adds ability to choose new continuous mouse "
-    "following mode in Magnifier settings.";
-
 const char kDockedMagnifierResizingName[] =
     "Enable ability to resize Docked Magnifier";
 const char kDockedMagnifierResizingDescription[] =
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index af7dd832..d4089fe 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -1209,6 +1209,12 @@
 extern const char kPageInfoAboutThisSiteName[];
 extern const char kPageInfoAboutThisSiteDescription[];
 
+extern const char kPageInfoboutThisPageDescriptionPlaceholderName[];
+extern const char kPageInfoboutThisPageDescriptionPlaceholderDescription[];
+
+extern const char kPageInfoboutThisPagePersistentEntryName[];
+extern const char kPageInfoboutThisPagePersistentEntryDescription[];
+
 extern const char kPageInfoMoreAboutThisPageName[];
 extern const char kPageInfoMoreAboutThisPageDescription[];
 
@@ -3020,9 +3026,6 @@
 extern const char kExperimentalAccessibilitySwitchAccessTextName[];
 extern const char kExperimentalAccessibilitySwitchAccessTextDescription[];
 
-extern const char kMagnifierContinuousMouseFollowingModeSettingName[];
-extern const char kMagnifierContinuousMouseFollowingModeSettingDescription[];
-
 extern const char kDockedMagnifierResizingName[];
 extern const char kDockedMagnifierResizingDescription[];
 
diff --git a/chrome/browser/flags/android/chrome_feature_list.cc b/chrome/browser/flags/android/chrome_feature_list.cc
index f52c1fa1..fda83d4a 100644
--- a/chrome/browser/flags/android/chrome_feature_list.cc
+++ b/chrome/browser/flags/android/chrome_feature_list.cc
@@ -370,7 +370,6 @@
     &page_info::kPageInfoAboutThisSiteEn,
     &page_info::kPageInfoAboutThisSiteMoreInfo,
     &page_info::kPageInfoAboutThisSiteNonEn,
-    &page_info::kAboutThisSiteBanner,
     &page_info::kPageInfoDiscoverability,
     &password_manager::features::kBiometricTouchToFill,
     &password_manager::features::kLeakDetectionUnauthenticated,
diff --git a/chrome/browser/headless/headless_mode_browsertest.h b/chrome/browser/headless/headless_mode_browsertest.h
index 930ab42..8b0318b9 100644
--- a/chrome/browser/headless/headless_mode_browsertest.h
+++ b/chrome/browser/headless/headless_mode_browsertest.h
@@ -45,7 +45,7 @@
 
   void SetUpCommandLine(base::CommandLine* command_line) override;
 
-  StartWindowMode start_window_mode() const { return GetParam(); };
+  StartWindowMode start_window_mode() const { return GetParam(); }
 };
 
 // Toggles browser fullscreen mode synchronously.
diff --git a/chrome/browser/installable/installable_manager_browsertest.cc b/chrome/browser/installable/installable_manager_browsertest.cc
index 777c0860..591da2b 100644
--- a/chrome/browser/installable/installable_manager_browsertest.cc
+++ b/chrome/browser/installable/installable_manager_browsertest.cc
@@ -1955,8 +1955,8 @@
 
   EXPECT_FALSE(tester->valid_manifest());
   EXPECT_EQ(1u, tester->screenshots().size());
-  // Corresponding platform should filter out the screenshot with mismatched
-  // platform.
+  // Corresponding form_factor should filter out the screenshot with mismatched
+  // form_factor.
 #if BUILDFLAG(IS_ANDROID)
   EXPECT_LT(tester->screenshots()[0].width(),
             tester->screenshots()[0].height());
@@ -1976,8 +1976,8 @@
   InstallableParams params = GetManifestParams();
   params.fetch_screenshots = true;
 
-  // Check if only screenshots with mismatched platform are available, they are
-  // still used.
+  // Check if only screenshots with mismatched form_factor are available, they
+  // are still used.
 #if BUILDFLAG(IS_ANDROID)
   NavigateAndRunInstallableManager(
       browser(), tester.get(), params,
diff --git a/chrome/browser/lacros/launcher_search/search_controller_lacros.cc b/chrome/browser/lacros/launcher_search/search_controller_lacros.cc
index a3207b2c..ec198bb 100644
--- a/chrome/browser/lacros/launcher_search/search_controller_lacros.cc
+++ b/chrome/browser/lacros/launcher_search/search_controller_lacros.cc
@@ -91,7 +91,7 @@
       AutocompleteInput(query, metrics::OmniboxEventProto::CHROMEOS_APP_LIST,
                         ChromeAutocompleteSchemeClassifier(profile_));
   if (input.text().empty())
-    input.set_focus_type(OmniboxFocusType::ON_FOCUS);
+    input.set_focus_type(metrics::OmniboxFocusType::INTERACTION_FOCUS);
 
   query_ = query;
   input_ = input;
diff --git a/chrome/browser/mac/auth_session_request_browsertest.mm b/chrome/browser/mac/auth_session_request_browsertest.mm
index 1e4bc628..8f59b99 100644
--- a/chrome/browser/mac/auth_session_request_browsertest.mm
+++ b/chrome/browser/mac/auth_session_request_browsertest.mm
@@ -4,8 +4,11 @@
 
 #import "base/mac/scoped_nsobject.h"
 #import "chrome/browser/app_controller_mac.h"
+
+#include "base/mac/foundation_util.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/profiles/profile_manager.h"
+#include "chrome/browser/profiles/profile_test_util.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_list.h"
 #include "chrome/browser/ui/browser_window.h"
@@ -22,6 +25,38 @@
 #include "testing/gtest_mac.h"
 #include "ui/base/page_transition_types.h"
 
+namespace {
+
+Profile* CreateAndWaitForProfile(const base::FilePath& profile_dir) {
+  Profile* profile = profiles::testing::CreateProfileSync(
+      g_browser_process->profile_manager(), profile_dir);
+  EXPECT_TRUE(profile);
+  return profile;
+}
+
+Profile* CreateAndWaitForGuestProfile() {
+  return CreateAndWaitForProfile(ProfileManager::GetGuestProfilePath());
+}
+
+void SetGuestProfileAsLastProfile() {
+  AppController* ac = base::mac::ObjCCast<AppController>(
+      [[NSApplication sharedApplication] delegate]);
+  ASSERT_TRUE(ac);
+  // Create the guest profile, and set it as the last used profile.
+  Profile* guest_profile = CreateAndWaitForGuestProfile();
+  [ac setLastProfile:guest_profile];
+  Profile* profile = [ac lastProfileIfLoaded];
+  ASSERT_TRUE(profile);
+  EXPECT_EQ(guest_profile->GetPath(), profile->GetPath());
+  EXPECT_TRUE(profile->IsGuestSession());
+  // Also set the last used profile path preference. If the profile does need to
+  // be read from disk for some reason this acts as a backstop.
+  g_browser_process->local_state()->SetString(
+      prefs::kProfileLastUsed, guest_profile->GetPath().BaseName().value());
+}
+
+}  // namespace
+
 using AuthSessionBrowserTest = InProcessBrowserTest;
 
 @interface MockASWebAuthenticationSessionRequest : NSObject {
@@ -190,6 +225,13 @@
     auto* browser_list = BrowserList::GetInstance();
     size_t start_browser_count = browser_list->size();
 
+    // Clear the last profile. It will be set by default since NSApp in browser
+    // tests can activate.
+    AppController* ac = base::mac::ObjCCast<AppController>(
+        [[NSApplication sharedApplication] delegate]);
+    ASSERT_TRUE(ac);
+    [ac setLastProfile:nullptr];
+
     // Use a profile that is not loaded yet.
     const std::string kProfileName = "Profile 2";
     g_browser_process->local_state()->SetString(prefs::kProfileLastUsed,
@@ -229,10 +271,8 @@
     size_t start_browser_count = browser_list->size();
 
     // Use the guest profile, but mark it as disallowed.
-    base::FilePath guest_profile_path = ProfileManager::GetGuestProfilePath();
+    SetGuestProfileAsLastProfile();
     PrefService* local_state = g_browser_process->local_state();
-    local_state->SetString(prefs::kProfileLastUsed,
-                           guest_profile_path.BaseName().value());
     local_state->SetBoolean(prefs::kBrowserGuestModeEnabled, false);
 
     // The profile picker is initially closed.
diff --git a/chrome/browser/metrics/power/power_metrics_reporter_unittest.cc b/chrome/browser/metrics/power/power_metrics_reporter_unittest.cc
index de57bc49..3adcc22 100644
--- a/chrome/browser/metrics/power/power_metrics_reporter_unittest.cc
+++ b/chrome/browser/metrics/power/power_metrics_reporter_unittest.cc
@@ -249,7 +249,7 @@
   const char* kScenarioSuffix = ".VideoCapture";
   const std::vector<const char*> suffixes({"", kScenarioSuffix});
   ExpectHistogramSamples(&histogram_tester_, suffixes,
-                         {{"PerformanceMonitor.AverageCPU5.Total", 500}});
+                         {{"PerformanceMonitor.AverageCPU6.Total", 500}});
 }
 
 #if BUILDFLAG(IS_MAC)
diff --git a/chrome/browser/metrics/power/power_metrics_unittest.cc b/chrome/browser/metrics/power/power_metrics_unittest.cc
index 505cd02..4f03c81 100644
--- a/chrome/browser/metrics/power/power_metrics_unittest.cc
+++ b/chrome/browser/metrics/power/power_metrics_unittest.cc
@@ -84,7 +84,7 @@
   ReportAggregatedProcessMetricsHistograms(process_metrics, suffixes);
 
   ExpectHistogramSamples(&histogram_tester, suffixes, {
-    {"PerformanceMonitor.AverageCPU5.Total", 20},
+    {"PerformanceMonitor.AverageCPU6.Total", 20},
 
 #if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || \
     BUILDFLAG(IS_AIX)
diff --git a/chrome/browser/metrics/power/process_metrics_recorder_util.cc b/chrome/browser/metrics/power/process_metrics_recorder_util.cc
index 56a4542a..a6e9bd9 100644
--- a/chrome/browser/metrics/power/process_metrics_recorder_util.cc
+++ b/chrome/browser/metrics/power/process_metrics_recorder_util.cc
@@ -48,7 +48,7 @@
 #endif
 
   base::UmaHistogramCustomCounts(
-      base::StrCat({"PerformanceMonitor.AverageCPU5.", histogram_suffix}),
+      base::StrCat({"PerformanceMonitor.AverageCPU6.", histogram_suffix}),
       cpu_usage * kCPUUsageFactor, kCPUUsageHistogramMin, kCPUUsageHistogramMax,
       kCPUUsageHistogramBucketCount);
 }
diff --git a/chrome/browser/metrics/power/process_monitor.cc b/chrome/browser/metrics/power/process_monitor.cc
index 1dfa63ac..bed524ed 100644
--- a/chrome/browser/metrics/power/process_monitor.cc
+++ b/chrome/browser/metrics/power/process_monitor.cc
@@ -91,6 +91,23 @@
 #endif
 }
 
+ProcessMonitor::Metrics GetLastIntervalMetrics(
+    base::ProcessMetrics& process_metrics,
+    base::TimeDelta cumulative_cpu_usage) {
+  ProcessMonitor::Metrics metrics;
+
+#if BUILDFLAG(IS_WIN)
+  metrics.cpu_usage = process_metrics.GetPreciseCPUUsage(cumulative_cpu_usage);
+#else
+  metrics.cpu_usage =
+      process_metrics.GetPlatformIndependentCPUUsage(cumulative_cpu_usage);
+#endif
+
+  // TODO: Add other values in ProcessMonitor::Metrics.
+
+  return metrics;
+}
+
 MonitoredProcessType GetMonitoredProcessTypeForRenderProcess(
     content::RenderProcessHost* host) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
@@ -224,6 +241,11 @@
   }
 
   for (int i = 0; i < MonitoredProcessType::kCount; i++) {
+    // Add the metrics for the processes that exited during this interval and
+    // zero out.
+    per_type_metrics[i] += exited_processes_metrics_[i];
+    exited_processes_metrics_[i] = Metrics();
+
     observer->OnMetricsSampled(static_cast<MonitoredProcessType>(i),
                                per_type_metrics[i]);
   }
@@ -269,6 +291,12 @@
     // This process was never ready.
     return;
   }
+
+  // Remember the metrics from when the process exited.
+  const ProcessInfo& process_info = it->second;
+  exited_processes_metrics_[process_info.type] +=
+      GetLastIntervalMetrics(*process_info.process_metrics, info.cpu_usage);
+
   render_process_infos_.erase(it);
 }
 
diff --git a/chrome/browser/metrics/power/process_monitor.h b/chrome/browser/metrics/power/process_monitor.h
index f1d7639d..7afacc46 100644
--- a/chrome/browser/metrics/power/process_monitor.h
+++ b/chrome/browser/metrics/power/process_monitor.h
@@ -5,6 +5,7 @@
 #ifndef CHROME_BROWSER_METRICS_POWER_PROCESS_MONITOR_H_
 #define CHROME_BROWSER_METRICS_POWER_PROCESS_MONITOR_H_
 
+#include <array>
 #include <map>
 #include <memory>
 
@@ -140,6 +141,10 @@
   std::map<content::RenderProcessHost*, ProcessInfo> render_process_infos_;
 
   std::map<int, ProcessInfo> browser_child_process_infos_;
+
+  // The metrics for the processes that exited during the last interval. Added
+  // to the current interval's sample and then reset to zero.
+  std::array<Metrics, MonitoredProcessType::kCount> exited_processes_metrics_;
 };
 
 #endif  // CHROME_BROWSER_METRICS_POWER_PROCESS_MONITOR_H_
diff --git a/chrome/browser/metrics/ukm_browsertest.cc b/chrome/browser/metrics/ukm_browsertest.cc
index f7105bbe..c83f20d 100644
--- a/chrome/browser/metrics/ukm_browsertest.cc
+++ b/chrome/browser/metrics/ukm_browsertest.cc
@@ -125,11 +125,11 @@
   void OnEntryAdded(ukm::mojom::UkmEntryPtr entry) override {}
 
   void OnUpdateSourceURL(ukm::SourceId source_id,
-                         const std::vector<GURL>& urls) override{};
+                         const std::vector<GURL>& urls) override {}
 
   void OnPurgeRecordingsWithUrlScheme(const std::string& url_scheme) override {}
 
-  void OnPurge() override{};
+  void OnPurge() override {}
 
   void ExpectAllowedStateChanged(bool expected_allowed) {
     expected_allowed_ = expected_allowed;
diff --git a/chrome/browser/new_tab_page/new_tab_page_util.cc b/chrome/browser/new_tab_page/new_tab_page_util.cc
index 7119ef2d..bed41ef4 100644
--- a/chrome/browser/new_tab_page/new_tab_page_util.cc
+++ b/chrome/browser/new_tab_page/new_tab_page_util.cc
@@ -26,6 +26,14 @@
 #endif
 }
 
+bool IsOsSupportedForDrive() {
+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
+  return true;
+#else
+  return false;
+#endif
+}
+
 std::string GetCountryCode() {
   std::string country_code;
   auto* variations_service = g_browser_process->variations_service();
@@ -62,6 +70,15 @@
   }
 }
 
+bool IsDriveModuleEnabled() {
+  if (base::FeatureList::GetInstance()->IsFeatureOverridden(
+          ntp_features::kNtpDriveModule.name)) {
+    return base::FeatureList::IsEnabled(ntp_features::kNtpDriveModule);
+  } else {
+    return IsOsSupportedForDrive() && IsInUS();
+  }
+}
+
 bool IsModuleFreEnabled() {
   if (base::FeatureList::GetInstance()->IsFeatureOverridden(
           ntp_features::kNtpModulesFirstRunExperience.name)) {
diff --git a/chrome/browser/new_tab_page/new_tab_page_util.h b/chrome/browser/new_tab_page/new_tab_page_util.h
index 8d6a74e..132528a 100644
--- a/chrome/browser/new_tab_page/new_tab_page_util.h
+++ b/chrome/browser/new_tab_page/new_tab_page_util.h
@@ -7,6 +7,7 @@
 
 bool IsRecipeTasksModuleEnabled();
 bool IsCartModuleEnabled();
+bool IsDriveModuleEnabled();
 bool IsModuleFreEnabled();
 
 #endif  // CHROME_BROWSER_NEW_TAB_PAGE_NEW_TAB_PAGE_UTIL_H_
diff --git a/chrome/browser/new_tab_page/new_tab_page_util_browsertest.cc b/chrome/browser/new_tab_page/new_tab_page_util_browsertest.cc
index ea31c85d..e5d780b 100644
--- a/chrome/browser/new_tab_page/new_tab_page_util_browsertest.cc
+++ b/chrome/browser/new_tab_page/new_tab_page_util_browsertest.cc
@@ -20,20 +20,21 @@
 class NewTabPageUtilEnableFlagBrowserTest : public NewTabPageUtilBrowserTest {
  public:
   NewTabPageUtilEnableFlagBrowserTest() {
-    features_.InitWithFeatures({ntp_features::kNtpRecipeTasksModule,
-                                ntp_features::kNtpChromeCartModule,
-                                ntp_features::kNtpModulesFirstRunExperience},
-                               {});
+    features_.InitWithFeatures(
+        {ntp_features::kNtpRecipeTasksModule,
+         ntp_features::kNtpChromeCartModule, ntp_features::kNtpDriveModule,
+         ntp_features::kNtpModulesFirstRunExperience},
+        {});
   }
 };
 
 class NewTabPageUtilDisableFlagBrowserTest : public NewTabPageUtilBrowserTest {
  public:
   NewTabPageUtilDisableFlagBrowserTest() {
-    features_.InitWithFeatures({},
-                               {ntp_features::kNtpRecipeTasksModule,
-                                ntp_features::kNtpChromeCartModule,
-                                ntp_features::kNtpModulesFirstRunExperience});
+    features_.InitWithFeatures(
+        {}, {ntp_features::kNtpRecipeTasksModule,
+             ntp_features::kNtpChromeCartModule, ntp_features::kNtpDriveModule,
+             ntp_features::kNtpModulesFirstRunExperience});
   }
 };
 
@@ -92,6 +93,33 @@
   EXPECT_FALSE(IsCartModuleEnabled());
 }
 
+IN_PROC_BROWSER_TEST_F(NewTabPageUtilBrowserTest, EnableDriveByToT) {
+  auto locale = std::make_unique<ScopedBrowserLocale>("en-US");
+  g_browser_process->variations_service()->OverrideStoredPermanentCountry("us");
+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
+  EXPECT_TRUE(IsDriveModuleEnabled());
+#else
+  EXPECT_FALSE(IsDriveModuleEnabled());
+#endif
+}
+
+IN_PROC_BROWSER_TEST_F(NewTabPageUtilBrowserTest, DisableDriveByToT) {
+  auto locale = std::make_unique<ScopedBrowserLocale>("en-US");
+  g_browser_process->variations_service()->OverrideStoredPermanentCountry("ca");
+  EXPECT_FALSE(IsDriveModuleEnabled());
+}
+
+IN_PROC_BROWSER_TEST_F(NewTabPageUtilEnableFlagBrowserTest, EnableDriveByFlag) {
+  EXPECT_TRUE(IsDriveModuleEnabled());
+}
+
+IN_PROC_BROWSER_TEST_F(NewTabPageUtilDisableFlagBrowserTest,
+                       DisableDriveByFlag) {
+  auto locale = std::make_unique<ScopedBrowserLocale>("en-US");
+  g_browser_process->variations_service()->OverrideStoredPermanentCountry("us");
+  EXPECT_FALSE(IsDriveModuleEnabled());
+}
+
 IN_PROC_BROWSER_TEST_F(NewTabPageUtilBrowserTest, EnableFreByToT) {
   auto locale = std::make_unique<ScopedBrowserLocale>("en-US");
   g_browser_process->variations_service()->OverrideStoredPermanentCountry("us");
diff --git a/chrome/browser/notifications/notification_interactive_uitest_mac.mm b/chrome/browser/notifications/notification_interactive_uitest_mac.mm
index 4131d89..9b0aa058 100644
--- a/chrome/browser/notifications/notification_interactive_uitest_mac.mm
+++ b/chrome/browser/notifications/notification_interactive_uitest_mac.mm
@@ -27,12 +27,17 @@
   {
     base::scoped_nsobject<WindowedNSNotificationObserver> observer(
         [[WindowedNSNotificationObserver alloc]
-            initForNotification:NSApplicationDidResignActiveNotification
+            initForNotification:NSApplicationDidHideNotification
                          object:NSApp]);
     [NSApp hide:nil];
     [observer wait];
   }
-  EXPECT_FALSE([NSApp isActive]);
+  EXPECT_TRUE([NSApp isHidden]);
+
+  base::scoped_nsobject<WindowedNSNotificationObserver> observer(
+      [[WindowedNSNotificationObserver alloc]
+          initForNotification:NSApplicationDidUnhideNotification
+                       object:NSApp]);
 
   std::string result = CreateNotification(
       browser(), true, "", "", "", "",
@@ -43,13 +48,8 @@
   message_center::Notification* notification =
       *message_center->GetVisibleNotifications().begin();
 
-  {
-    base::scoped_nsobject<WindowedNSNotificationObserver> observer(
-        [[WindowedNSNotificationObserver alloc]
-            initForNotification:NSApplicationDidBecomeActiveNotification
-                         object:NSApp]);
-    message_center->ClickOnNotification(notification->id());
-    [observer wait];
-  }
-  EXPECT_TRUE([NSApp isActive]);
+  message_center->ClickOnNotification(notification->id());
+  [observer wait];
+
+  EXPECT_FALSE([NSApp isHidden]);
 }
diff --git a/chrome/browser/page_info/about_this_site_tab_helper.cc b/chrome/browser/page_info/about_this_site_tab_helper.cc
index f6a451a..06aace3d 100644
--- a/chrome/browser/page_info/about_this_site_tab_helper.cc
+++ b/chrome/browser/page_info/about_this_site_tab_helper.cc
@@ -7,6 +7,7 @@
 #include "base/callback.h"
 #include "base/metrics/histogram_functions.h"
 #include "build/buildflag.h"
+#include "chrome/browser/ui/page_info/about_this_site_side_panel.h"
 #include "components/optimization_guide/content/browser/optimization_guide_decider.h"
 #include "components/optimization_guide/core/optimization_guide_decision.h"
 #include "components/optimization_guide/core/optimization_metadata.h"
@@ -16,16 +17,14 @@
 #include "components/page_info/core/proto/about_this_site_metadata.pb.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/navigation_handle.h"
+#include "content/public/browser/page_navigator.h"
 #include "content/public/browser/web_contents.h"
-#include "services/metrics/public/cpp/ukm_source_id.h"
+#include "net/base/url_util.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
-#if BUILDFLAG(IS_ANDROID)
-#include "chrome/browser/ui/page_info/about_this_site_message_delegate_android.h"
-#endif
-
 using page_info::about_this_site_validation::AboutThisSiteStatus;
-using page_info::about_this_site_validation::ValidateBannerInfo;
+using page_info::about_this_site_validation::ValidateMetadata;
+using page_info::proto::AboutThisSiteMetadata;
 
 namespace {
 
@@ -43,27 +42,6 @@
     return false;
   return true;
 }
-
-std::pair<AboutThisSiteStatus, absl::optional<page_info::proto::BannerInfo>>
-GetBannerInfo(const optimization_guide::OptimizationMetadata& metadata) {
-  auto parsed =
-      metadata.ParsedMetadata<page_info::proto::AboutThisSiteMetadata>();
-
-  if (!parsed) {
-    return {AboutThisSiteStatus::kNoResult, absl::nullopt};
-  }
-  if (!parsed->has_banner_info()) {
-    return {AboutThisSiteStatus::kMissingBannerInfo, absl::nullopt};
-  }
-
-  auto status = ValidateBannerInfo(parsed->banner_info());
-  return {status, parsed->banner_info()};
-}
-
-bool IsExampleUrl(const GURL& url) {
-  return url.DomainIs("example.com") && url.ref_piece() == "banner";
-}
-
 }  // namespace
 
 AboutThisSiteTabHelper::AboutThisSiteTabHelper(
@@ -99,71 +77,32 @@
     const GURL& main_frame_url,
     optimization_guide::OptimizationGuideDecision decision,
     const optimization_guide::OptimizationMetadata& metadata) {
-  BannerStatus status =
-      HandleOptimizationGuideDecision(main_frame_url, decision, metadata);
-  base::UmaHistogramEnumeration("Privacy.AboutThisSite.BannerStatus", status);
-}
-
-AboutThisSiteTabHelper::BannerStatus
-AboutThisSiteTabHelper::HandleOptimizationGuideDecision(
-    const GURL& main_frame_url,
-    optimization_guide::OptimizationGuideDecision decision,
-    const optimization_guide::OptimizationMetadata& metadata) {
-  if (IsExampleUrl(main_frame_url)) {
-    // Always provide a response for https://example.com/#banner.
-    decision = optimization_guide::OptimizationGuideDecision::kTrue;
-  }
+  // Navigated away.
+  if (web_contents()->GetLastCommittedURL() != main_frame_url)
+    return;
 
   if (decision != optimization_guide::OptimizationGuideDecision::kTrue) {
-    return BannerStatus::kNoHints;
+    return;
   }
 
-  auto [status, banner_info] = GetBannerInfo(metadata);
+  absl::optional<AboutThisSiteMetadata> about_this_site_metadata =
+      metadata.ParsedMetadata<AboutThisSiteMetadata>();
 
-  if (status != AboutThisSiteStatus::kValid && IsExampleUrl(main_frame_url)) {
-    status = AboutThisSiteStatus::kValid;
-    banner_info = page_info::proto::BannerInfo();
-    banner_info->set_title("A Sample Note");
-    banner_info->set_label("This is an example website");
-    banner_info->mutable_url()->set_label("Example URL");
-    banner_info->mutable_url()->set_url("https://example.com");
-  }
+  auto status = ValidateMetadata(about_this_site_metadata);
 
-  base::UmaHistogramEnumeration("Privacy.AboutThisSite.BannerValidation",
+  base::UmaHistogramEnumeration("Privacy.AboutThisSite.PageLoadValidation",
                                 status);
-  if (status != AboutThisSiteStatus::kValid) {
-    return BannerStatus::kInvalidOrMissingBannerInfo;
-  }
+  if (status != AboutThisSiteStatus::kValid)
+    return;
 
-  if (!about_this_site_service_->CanShowBanner(main_frame_url)) {
-    return BannerStatus::kNotAllowedToShow;
-  }
-
-  if (web_contents()->GetLastCommittedURL() != main_frame_url) {
-    return BannerStatus::kNavigatedAway;
-  }
-  ShowBanner(std::move(*banner_info));
-  return BannerStatus::kShown;
-}
-
-void AboutThisSiteTabHelper::ShowBanner(
-    page_info::proto::BannerInfo banner_info) {
-  ukm::SourceId source_id =
-      web_contents()->GetPrimaryMainFrame()->GetPageUkmSourceId();
-  GURL url = web_contents()->GetLastCommittedURL();
-  base::OnceClosure on_dimiss =
-      base::BindOnce(&page_info::AboutThisSiteService::OnBannerDismissed,
-                     about_this_site_service_->GetWeakPtr(), url, source_id);
-  base::OnceClosure on_url_opened =
-      base::BindOnce(&page_info::AboutThisSiteService::OnBannerURLOpened,
-                     about_this_site_service_->GetWeakPtr(), url, source_id);
-
-#if BUILDFLAG(IS_ANDROID)
-  AboutThisSiteMessageDelegateAndroid::Create(
-      web_contents(), std::move(banner_info), std::move(on_dimiss),
-      std::move(on_url_opened));
-#endif
-  // TODO(crbug.com/1307295): Implement desktop UI.
+  content::OpenURLParams url_params(
+      net::AppendOrReplaceQueryParameter(
+          GURL(about_this_site_metadata->site_info().more_about().url()),
+          page_info::AboutThisSiteRenderModeParameterName,
+          page_info::AboutThisSiteRenderModeParameterValue),
+      content::Referrer(), WindowOpenDisposition::NEW_FOREGROUND_TAB,
+      ui::PAGE_TRANSITION_LINK, /*is_renderer_initiated=*/false);
+  RegisterAboutThisSiteSidePanel(web_contents(), url_params);
 }
 
 WEB_CONTENTS_USER_DATA_KEY_IMPL(AboutThisSiteTabHelper);
diff --git a/chrome/browser/page_info/about_this_site_tab_helper.h b/chrome/browser/page_info/about_this_site_tab_helper.h
index c6df319..7aefad8 100644
--- a/chrome/browser/page_info/about_this_site_tab_helper.h
+++ b/chrome/browser/page_info/about_this_site_tab_helper.h
@@ -16,14 +16,11 @@
 }  // namespace optimization_guide
 
 namespace page_info {
-namespace proto {
-class BannerInfo;
-}  // namespace proto
 class AboutThisSiteService;
 }  // namespace page_info
 
 // This WebContentsObserver fetches AboutThisSite hints from OptimizationGuide
-// and displays a banner if there is a BannerInfo message.
+// and registers a SidePanel entry.
 class AboutThisSiteTabHelper
     : public content::WebContentsObserver,
       public content::WebContentsUserData<AboutThisSiteTabHelper> {
@@ -37,37 +34,17 @@
       content::NavigationHandle* navigation_handle) override;
 
  private:
-  // These values are persisted to logs. Entries should not be renumbered and
-  // numeric values should never be reused.
-  // Keep in sync with AboutThisSiteBannerStatus in enums.xml
-  enum class BannerStatus {
-    kNoHints = 0,
-    kShown = 1,
-    kInvalidOrMissingBannerInfo = 2,
-    kNavigatedAway = 3,
-    kNotAllowedToShow = 4,
-
-    kMaxValue = kNotAllowedToShow
-  };
-
   explicit AboutThisSiteTabHelper(
       content::WebContents* web_contents,
       optimization_guide::OptimizationGuideDecider* optimization_guide_decider,
       page_info::AboutThisSiteService* about_this_site_service);
   friend class content::WebContentsUserData<AboutThisSiteTabHelper>;
 
-  void ShowBanner(page_info::proto::BannerInfo banner_info);
-
   void OnOptimizationGuideDecision(
       const GURL& main_frame_url,
       optimization_guide::OptimizationGuideDecision decision,
       const optimization_guide::OptimizationMetadata& metadata);
 
-  BannerStatus HandleOptimizationGuideDecision(
-      const GURL& main_frame_url,
-      optimization_guide::OptimizationGuideDecision decision,
-      const optimization_guide::OptimizationMetadata& metadata);
-
   raw_ptr<optimization_guide::OptimizationGuideDecider>
       optimization_guide_decider_ = nullptr;
   raw_ptr<page_info::AboutThisSiteService> about_this_site_service_ = nullptr;
diff --git a/chrome/browser/performance_manager/metrics/metrics_provider.h b/chrome/browser/performance_manager/metrics/metrics_provider.h
index 7256c14..f10f0f0 100644
--- a/chrome/browser/performance_manager/metrics/metrics_provider.h
+++ b/chrome/browser/performance_manager/metrics/metrics_provider.h
@@ -56,12 +56,12 @@
 
   // UserPerformanceTuningManager::Observer:
   void OnBatterySaverModeChanged(bool is_active) override;
-  void OnExternalPowerConnectedChanged(
-      bool external_power_connected) override{};
-  void OnBatteryThresholdReached() override{};
-  void OnMemoryThresholdReached() override{};
-  void OnTabCountThresholdReached() override{};
-  void OnJankThresholdReached() override{};
+  void OnExternalPowerConnectedChanged(bool external_power_connected) override {
+  }
+  void OnBatteryThresholdReached() override {}
+  void OnMemoryThresholdReached() override {}
+  void OnTabCountThresholdReached() override {}
+  void OnJankThresholdReached() override {}
 
   void OnTuningModesChanged();
   EfficiencyMode ComputeCurrentMode() const;
@@ -71,7 +71,6 @@
   EfficiencyMode current_mode_ = EfficiencyMode::kNormal;
 
   bool initialized_ = false;
-  ;
 };
 
 }  // namespace performance_manager
diff --git a/chrome/browser/plugins/chrome_plugin_service_filter.cc b/chrome/browser/plugins/chrome_plugin_service_filter.cc
index 5046ec4f..1768c80f 100644
--- a/chrome/browser/plugins/chrome_plugin_service_filter.cc
+++ b/chrome/browser/plugins/chrome_plugin_service_filter.cc
@@ -119,17 +119,12 @@
 }
 
 bool ChromePluginServiceFilter::IsPluginAvailable(
-    int render_process_id,
+    content::BrowserContext* browser_context,
     const content::WebPluginInfo& plugin) {
   base::AutoLock auto_lock(lock_);
 
-  content::RenderProcessHost* rph =
-      content::RenderProcessHost::FromID(render_process_id);
-  if (!rph)
-    return false;
-
   // Check whether the plugin is disabled.
-  auto context_info_it = browser_context_map_.find(rph->GetBrowserContext());
+  auto context_info_it = browser_context_map_.find(browser_context);
   // The context might not be found because RenderFrameMessageFilter might
   // outlive the Profile (the context is unregistered during the Profile
   // destructor).
diff --git a/chrome/browser/plugins/chrome_plugin_service_filter.h b/chrome/browser/plugins/chrome_plugin_service_filter.h
index f929ce0..ce4ae3f 100644
--- a/chrome/browser/plugins/chrome_plugin_service_filter.h
+++ b/chrome/browser/plugins/chrome_plugin_service_filter.h
@@ -48,7 +48,7 @@
                            const std::string& identifier);
 
   // PluginServiceFilter implementation.
-  bool IsPluginAvailable(int render_process_id,
+  bool IsPluginAvailable(content::BrowserContext* browser_context,
                          const content::WebPluginInfo& plugin) override;
 
   // CanLoadPlugin always grants permission to the browser
diff --git a/chrome/browser/plugins/chrome_plugin_service_filter_unittest.cc b/chrome/browser/plugins/chrome_plugin_service_filter_unittest.cc
index 2dd2d9e..8fe80672 100644
--- a/chrome/browser/plugins/chrome_plugin_service_filter_unittest.cc
+++ b/chrome/browser/plugins/chrome_plugin_service_filter_unittest.cc
@@ -37,10 +37,6 @@
     filter_->RegisterProfile(profile());
   }
 
-  int main_frame_process_id() {
-    return web_contents()->GetPrimaryMainFrame()->GetProcess()->GetID();
-  }
-
   raw_ptr<ChromePluginServiceFilter> filter_ = nullptr;
 };
 
@@ -53,19 +49,18 @@
 }  // namespace
 
 TEST_F(ChromePluginServiceFilterTest, IsPluginAvailable) {
-  EXPECT_TRUE(filter_->IsPluginAvailable(main_frame_process_id(),
-                                         GetFakePdfPluginInfo()));
+  EXPECT_TRUE(
+      filter_->IsPluginAvailable(browser_context(), GetFakePdfPluginInfo()));
 }
 
 TEST_F(ChromePluginServiceFilterTest, IsPluginAvailableForInvalidProcess) {
-  EXPECT_FALSE(filter_->IsPluginAvailable(
-      content::ChildProcessHost::kInvalidUniqueID, GetFakePdfPluginInfo()));
+  EXPECT_FALSE(filter_->IsPluginAvailable(nullptr, GetFakePdfPluginInfo()));
 }
 
 TEST_F(ChromePluginServiceFilterTest, IsPluginAvailableForDisabledPlugin) {
   profile()->GetPrefs()->SetBoolean(prefs::kPluginsAlwaysOpenPdfExternally,
                                     true);
 
-  EXPECT_FALSE(filter_->IsPluginAvailable(main_frame_process_id(),
-                                          GetFakePdfPluginInfo()));
+  EXPECT_FALSE(
+      filter_->IsPluginAvailable(browser_context(), GetFakePdfPluginInfo()));
 }
diff --git a/chrome/browser/plugins/pdf_iframe_navigation_throttle.cc b/chrome/browser/plugins/pdf_iframe_navigation_throttle.cc
index 79745df..ab30516 100644
--- a/chrome/browser/plugins/pdf_iframe_navigation_throttle.cc
+++ b/chrome/browser/plugins/pdf_iframe_navigation_throttle.cc
@@ -59,14 +59,11 @@
 // also sets |is_stale| to true if the plugin list needs a reload.
 bool IsPDFPluginEnabled(content::NavigationHandle* navigation_handle,
                         bool* is_stale) {
-  content::WebContents* web_contents = navigation_handle->GetWebContents();
-  int process_id = web_contents->GetPrimaryMainFrame()->GetProcess()->GetID();
-
   content::WebPluginInfo plugin_info;
   return content::PluginService::GetInstance()->GetPluginInfo(
-      process_id, navigation_handle->GetURL(), kPDFMimeType,
-      false /* allow_wildcard */, is_stale, &plugin_info,
-      nullptr /* actual_mime_type */);
+      navigation_handle->GetWebContents()->GetBrowserContext(),
+      navigation_handle->GetURL(), kPDFMimeType, false /* allow_wildcard */,
+      is_stale, &plugin_info, nullptr /* actual_mime_type */);
 }
 #endif
 
diff --git a/chrome/browser/plugins/pdf_iframe_navigation_throttle_browsertest.cc b/chrome/browser/plugins/pdf_iframe_navigation_throttle_browsertest.cc
index 479672f..6e170fd 100644
--- a/chrome/browser/plugins/pdf_iframe_navigation_throttle_browsertest.cc
+++ b/chrome/browser/plugins/pdf_iframe_navigation_throttle_browsertest.cc
@@ -32,7 +32,7 @@
 // fallback in the NavigationThrottle.
 class BlockAllPluginServiceFilter : public content::PluginServiceFilter {
  public:
-  bool IsPluginAvailable(int render_process_id,
+  bool IsPluginAvailable(content::BrowserContext* browser_context,
                          const content::WebPluginInfo& plugin) override {
     return false;
   }
diff --git a/chrome/browser/plugins/plugin_info_host_impl.cc b/chrome/browser/plugins/plugin_info_host_impl.cc
index 22e8a17b..3ea8226 100644
--- a/chrome/browser/plugins/plugin_info_host_impl.cc
+++ b/chrome/browser/plugins/plugin_info_host_impl.cc
@@ -42,6 +42,7 @@
 #include "content/public/browser/plugin_service.h"
 #include "content/public/browser/plugin_service_filter.h"
 #include "content/public/browser/render_frame_host.h"
+#include "content/public/browser/render_process_host.h"
 #include "content/public/common/content_constants.h"
 #include "extensions/buildflags/buildflags.h"
 #include "net/base/registry_controlled_domains/registry_controlled_domain.h"
@@ -320,10 +321,14 @@
 
   content::PluginServiceFilter* filter =
       PluginService::GetInstance()->GetFilter();
+  content::RenderProcessHost* rph =
+      content::RenderProcessHost::FromID(render_process_id_);
+  content::BrowserContext* browser_context =
+      rph ? rph->GetBrowserContext() : nullptr;
   size_t i = 0;
   for (; i < matching_plugins.size(); ++i) {
     if (!filter ||
-        filter->IsPluginAvailable(render_process_id_, matching_plugins[i])) {
+        filter->IsPluginAvailable(browser_context, matching_plugins[i])) {
       break;
     }
   }
diff --git a/chrome/browser/plugins/plugin_info_host_impl_unittest.cc b/chrome/browser/plugins/plugin_info_host_impl_unittest.cc
index 4dbebbb..cd393a72 100644
--- a/chrome/browser/plugins/plugin_info_host_impl_unittest.cc
+++ b/chrome/browser/plugins/plugin_info_host_impl_unittest.cc
@@ -45,7 +45,7 @@
   FakePluginServiceFilter() = default;
   ~FakePluginServiceFilter() override = default;
 
-  bool IsPluginAvailable(int render_process_id,
+  bool IsPluginAvailable(content::BrowserContext* browser_context,
                          const content::WebPluginInfo& plugin) override;
 
   bool CanLoadPlugin(int render_process_id,
@@ -60,7 +60,7 @@
 };
 
 bool FakePluginServiceFilter::IsPluginAvailable(
-    int render_process_id,
+    content::BrowserContext* browser_context,
     const content::WebPluginInfo& plugin) {
   auto it = plugin_state_.find(plugin.path);
   if (it == plugin_state_.end()) {
diff --git a/chrome/browser/policy/policy_prefs_browsertest.cc b/chrome/browser/policy/policy_prefs_browsertest.cc
index 9fd7a444..e002b60 100644
--- a/chrome/browser/policy/policy_prefs_browsertest.cc
+++ b/chrome/browser/policy/policy_prefs_browsertest.cc
@@ -166,7 +166,7 @@
   VerifyPolicyToPrefMappings(GetTestCasePath(), local_state, user_prefs,
                              /* signin_profile_prefs= */ nullptr,
                              GetMockPolicyProvider(), &chunk_info_);
-};
+}
 
 INSTANTIATE_TEST_SUITE_P(Chunked,
                          ChunkedPolicyPrefsTest,
diff --git a/chrome/browser/preloading/prefetch/zero_suggest_prefetch/zero_suggest_prefetch_tab_helper.cc b/chrome/browser/preloading/prefetch/zero_suggest_prefetch/zero_suggest_prefetch_tab_helper.cc
index e671021..bb378c3 100644
--- a/chrome/browser/preloading/prefetch/zero_suggest_prefetch/zero_suggest_prefetch_tab_helper.cc
+++ b/chrome/browser/preloading/prefetch/zero_suggest_prefetch/zero_suggest_prefetch_tab_helper.cc
@@ -78,10 +78,12 @@
 
   AutocompleteInput autocomplete_input(
       u"", page_classification, ChromeAutocompleteSchemeClassifier(profile));
-  autocomplete_input.set_focus_type(OmniboxFocusType::ON_FOCUS);
+  autocomplete_input.set_focus_type(
+      metrics::OmniboxFocusType::INTERACTION_FOCUS);
   // Construct proper on-clobber input for ZPS prefetch requests on SRP/Web.
   if (page_classification != OEP::NTP_ZPS_PREFETCH) {
-    autocomplete_input.set_focus_type(OmniboxFocusType::DELETED_PERMANENT_TEXT);
+    autocomplete_input.set_focus_type(
+        metrics::OmniboxFocusType::INTERACTION_CLOBBER);
     autocomplete_input.set_current_url(page_url);
   }
   omnibox_view->StartPrefetch(autocomplete_input);
diff --git a/chrome/browser/printing/print_preview_dialog_controller_browsertest.cc b/chrome/browser/printing/print_preview_dialog_controller_browsertest.cc
index 8616e1b0..9407828 100644
--- a/chrome/browser/printing/print_preview_dialog_controller_browsertest.cc
+++ b/chrome/browser/printing/print_preview_dialog_controller_browsertest.cc
@@ -67,7 +67,7 @@
       kPdfInternalPluginPath, &pdf_internal_plugin_info));
 
   ChromePluginServiceFilter* filter = ChromePluginServiceFilter::GetInstance();
-  EXPECT_TRUE(filter->IsPluginAvailable(frame->GetProcess()->GetID(),
+  EXPECT_TRUE(filter->IsPluginAvailable(frame->GetBrowserContext(),
                                         pdf_internal_plugin_info));
 }
 
@@ -240,9 +240,8 @@
 
   // Make sure it is actually disabled for webpages.
   ChromePluginServiceFilter* filter = ChromePluginServiceFilter::GetInstance();
-  EXPECT_FALSE(filter->IsPluginAvailable(
-      initiator()->GetPrimaryMainFrame()->GetProcess()->GetID(),
-      pdf_external_plugin_info));
+  EXPECT_FALSE(filter->IsPluginAvailable(initiator()->GetBrowserContext(),
+                                         pdf_external_plugin_info));
 
   PrintPreview();
 
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu.cc b/chrome/browser/renderer_context_menu/render_view_context_menu.cc
index 5c4f8b77..cbcf392 100644
--- a/chrome/browser/renderer_context_menu/render_view_context_menu.cc
+++ b/chrome/browser/renderer_context_menu/render_view_context_menu.cc
@@ -3253,11 +3253,16 @@
   if (!service)
     return false;
 
+#if BUILDFLAG(IS_CHROMEOS)
+  if (IsFrameInPdfViewer(GetRenderFrameHost()))
+    return false;
+#else
   if (!base::FeatureList::IsEnabled(
           lens::features::kEnableRegionSearchOnPdfViewer) &&
       IsFrameInPdfViewer(GetRenderFrameHost())) {
     return false;
   }
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
   const TemplateURL* provider = service->GetDefaultSearchProvider();
   const bool provider_supports_image_search =
@@ -3271,7 +3276,7 @@
              ->GetBoolean(prefs::kLensRegionSearchEnabled);
 #else
   return false;
-#endif
+#endif  // BUILDFLAG(GOOGLE_CHROME_BRANDING)
 }
 
 bool RenderViewContextMenu::IsAddANoteEnabled() const {
@@ -3606,12 +3611,14 @@
   if (!lens_region_search_controller_) {
     Browser* browser = GetBrowser();
     WebContents* web_contents = source_web_contents_;
+#if !BUILDFLAG(IS_CHROMEOS)
     if (base::FeatureList::IsEnabled(
             lens::features::kEnableRegionSearchOnPdfViewer)) {
       // We don't use `source_web_contents_` here because it doesn't work with
       // the PDF reader.
       web_contents = browser->tab_strip_model()->GetActiveWebContents();
     }
+#endif  // !BUILDFLAG(IS_CHROMEOS)
     lens_region_search_controller_ =
         std::make_unique<lens::LensRegionSearchController>(web_contents,
                                                            browser);
@@ -3623,7 +3630,7 @@
       lens::features::IsLensFullscreenSearchEnabled();
   lens_region_search_controller_->Start(use_fullscreen_capture,
                                         is_google_default_search_provider);
-#endif
+#endif  // BUILDFLAG(GOOGLE_CHROME_BRANDING)
 }
 
 #if BUILDFLAG(ENABLE_SCREEN_AI_SERVICE)
@@ -3771,11 +3778,12 @@
 }
 
 void RenderViewContextMenu::ExecPartialTranslate() {
-  // TODO(crbug/1314825): When the PartialTranslateManager is added update this
-  // call to use language information from the page.
-  GetBrowser()->window()->ShowPartialTranslateBubble(
-      PartialTranslateBubbleModel::ViewState::VIEW_STATE_BEFORE_TRANSLATE, "fr",
-      "en", params_.selection_text, translate::TranslateErrors::Type::NONE);
+  // TODO(crbug/1314825): When the PartialTranslateManager is added this call
+  // will be updated to use language information from the page. The view state
+  // will also depend on the Partial Translate response, rather than being
+  // hardcoded to 'waiting'.
+  GetBrowser()->window()->StartPartialTranslate("fr", "en",
+                                                params_.selection_text);
 }
 
 void RenderViewContextMenu::ExecLanguageSettings(int event_flags) {
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest.cc b/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest.cc
index 724774b03..d13219c 100644
--- a/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest.cc
+++ b/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest.cc
@@ -1827,15 +1827,8 @@
   std::unique_ptr<ContextMenuNotificationObserver> menu_observer_;
 };
 
-#if BUILDFLAG(IS_CHROMEOS)
-#define MAYBE_LensRegionSearchWithValidRegionNewTab \
-  DISABLED_LensRegionSearchWithValidRegionNewTab
-#else
-#define MAYBE_LensRegionSearchWithValidRegionNewTab \
-  LensRegionSearchWithValidRegionNewTab
-#endif
 IN_PROC_BROWSER_TEST_F(SearchByRegionBrowserTest,
-                       MAYBE_LensRegionSearchWithValidRegionNewTab) {
+                       LensRegionSearchWithValidRegionNewTab) {
   SetupAndLoadPage("/empty.html");
   ui_test_utils::AllBrowserTabAddedWaiter add_tab;
 
@@ -1851,7 +1844,7 @@
   // Match the query parameters, without the value of start_time.
   EXPECT_THAT(new_tab_content, testing::MatchesRegex(
                                    expected_content.substr(0, query_start_pos) +
-                                   ".*ep=crs&re=df&s=&st=\\d+&lm.+="));
+                                   ".*ep=crs&re=df&s=&st=\\d+"));
 }
 
 IN_PROC_BROWSER_TEST_F(SearchByRegionBrowserTest,
@@ -1948,7 +1941,7 @@
     EXPECT_THAT(
         side_panel_content,
         testing::MatchesRegex(expected_content.substr(0, query_start_pos) +
-                              ".*ep=crs&re=df&s=&st=\\d+&lm.+="));
+                              ".*ep=crs&re=dcsp&s=csp&st=\\d+"));
     quit_closure_.Run();
   }
 
@@ -2025,7 +2018,7 @@
     EXPECT_THAT(
         side_panel_content,
         testing::MatchesRegex(expected_content.substr(0, query_start_pos) +
-                              ".*ep=crs&re=df&s=&st=\\d+&lm.+="));
+                              ".*ep=crs&re=dcsp&s=csp&st=\\d+"));
     quit_closure_.Run();
   }
 
@@ -2044,13 +2037,8 @@
   base::RepeatingClosure quit_closure_;
 };
 
-#if BUILDFLAG(IS_CHROMEOS)
-#define MAYBE_LensRegionSearchWithValidRegionUnifiedSidePanel DISABLED_LensRegionSearchWithValidRegionUnifiedSidePanel
-#else
-#define MAYBE_LensRegionSearchWithValidRegionUnifiedSidePanel LensRegionSearchWithValidRegionUnifiedSidePanel
-#endif
 IN_PROC_BROWSER_TEST_F(SearchByRegionWithUnifiedSidePanelBrowserTest,
-                       MAYBE_LensRegionSearchWithValidRegionUnifiedSidePanel) {
+                       LensRegionSearchWithValidRegionUnifiedSidePanel) {
   lens::CreateLensUnifiedSidePanelEntryForTesting(browser());
   SetupAndLoadPage("/empty.html");
   // We need a base::RunLoop to ensure that our test does not finish until the
diff --git a/chrome/browser/resources/chromeos/internet_config_dialog/internet_config_dialog.js b/chrome/browser/resources/chromeos/internet_config_dialog/internet_config_dialog.js
index e7cb443..a2734e9 100644
--- a/chrome/browser/resources/chromeos/internet_config_dialog/internet_config_dialog.js
+++ b/chrome/browser/resources/chromeos/internet_config_dialog/internet_config_dialog.js
@@ -13,6 +13,7 @@
 import {CrDialogElement} from 'chrome://resources/cr_elements/cr_dialog/cr_dialog.js';
 import {assert} from 'chrome://resources/js/assert.m.js';
 import {I18nBehavior} from 'chrome://resources/js/i18n_behavior.m.js';
+import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
 import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 /**
diff --git a/chrome/browser/resources/chromeos/login/BUILD.gn b/chrome/browser/resources/chromeos/login/BUILD.gn
index 2a410ad..9836ede 100644
--- a/chrome/browser/resources/chromeos/login/BUILD.gn
+++ b/chrome/browser/resources/chromeos/login/BUILD.gn
@@ -131,6 +131,8 @@
     "images/2x/thumbnail-theme-dark-2x.png",
     "images/1x/thumbnail-theme-auto-1x.png",
     "images/2x/thumbnail-theme-auto-2x.png",
+    "images/1x/verify-account.svg",
+    "images/2x/verify-account.svg",
     "images/blazey_dark.svg",
     "images/blazey_light.svg",
   ]
diff --git a/chrome/browser/resources/chromeos/password_change/BUILD.gn b/chrome/browser/resources/chromeos/password_change/BUILD.gn
index eca9fdf..984d48d 100644
--- a/chrome/browser/resources/chromeos/password_change/BUILD.gn
+++ b/chrome/browser/resources/chromeos/password_change/BUILD.gn
@@ -6,7 +6,10 @@
 import("//tools/polymer/html_to_js.gni")
 
 html_to_js("web_components") {
-  js_files = [ "urgent_password_expiry_notification_app.js" ]
+  js_files = [
+    "urgent_password_expiry_notification_app.js",
+    "lock_screen_reauth.js",
+  ]
 }
 
 js_type_check("closure_compile") {
diff --git a/chrome/browser/resources/chromeos/password_change/lock_screen_reauth.html b/chrome/browser/resources/chromeos/password_change/lock_screen_reauth.html
index f8380e48..b033b90 100644
--- a/chrome/browser/resources/chromeos/password_change/lock_screen_reauth.html
+++ b/chrome/browser/resources/chromeos/password_change/lock_screen_reauth.html
@@ -1,391 +1,363 @@
-<!doctype html>
-<html dir="$i18n{textdirection}" lang="$i18n{language}">
+<style>
+  :host {
+    --lock-screen-reauth-dialog-buttons-horizontal-padding: 40px;
+    --lock-screen-reauth-dialog-buttons-vertical-padding: 25px;
+    --lock-screen-reauth-dialog-content-padding: 40px;
+    --lock-screen-reauth-dialog-icon-size: 32px;
+    --lock-screen-reauth-dialog-text-line-height: 18px;
+    --lock-screen-reauth-dialog-title-top-padding: 40px;
+    --lock-screen-reauth-back-button-height: calc(
+        var(--lock-screen-reauth-dialog-buttons-vertical-padding) +
+        var(--cr-button-height));
+    --lock-screen-reauth-dialog-header-top-padding: calc(
+        var(--lock-screen-reauth-dialog-content-padding) +
+        var(--lock-screen-reauth-back-button-height));
+    height: 100%;
+    left: 0;
+    margin: 0;
+    padding: 0;
+    position: fixed;
+    top: 0;
+    width: 100%;
+  }
 
-<head>
-  <meta charset="utf-8">
-  <include src="../login/components/oobe_icons.html">
+  :host-context([orientation=horizontal]) {
+    --button-alignment: flex-end;
+    --lock-screen-reauth-dialog-content-direction: row;
+    --lock-screen-reauth-dialog-item-alignment: unset;
+    --lock-screen-reauth-dialog-title-top-padding: 40px;
+    --lock-screen-reauth-text-alignment: start;
+    --lock-screen-reauth-dialog-content-top-padding: calc(
+        var(--lock-screen-reauth-dialog-header-top-padding) +
+        var(--lock-screen-reauth-dialog-title-top-padding) +
+        var(--lock-screen-reauth-dialog-icon-size));
+    /* Header takes 40% of the width remaining after applying padding */
+    --lock-screen-reauth-dialog-header-width: clamp(302px,
+    calc(0.4 * (var(--lock-screen-reauth-dialog-width) -
+    4 * var(--lock-screen-reauth-dialog-content-padding))), 346px);
+    --lock-screen-reauth-dialog-content-width: calc(
+        var(--lock-screen-reauth-dialog-width) -
+        4 * var(--lock-screen-reauth-dialog-content-padding) -
+        var(--lock-screen-reauth-dialog-header-width));
+  }
 
-  <link rel="stylesheet" href="chrome://resources/css/text_defaults.css">
+  :host-context([orientation=vertical]) {
+    --button-alignment: center;
+    --lock-screen-reauth-dialog-content-direction: column;
+    --lock-screen-reauth-dialog-content-top-padding:
+        var(--lock-screen-reauth-dialog-buttons-vertical-padding);
+    --lock-screen-reauth-dialog-item-alignment: center;
+    --lock-screen-reauth-dialog-title-top-padding: 15px;
+    --lock-screen-reauth-text-alignment: center;
+    --lock-screen-reauth-dialog-content-width: calc(
+        var(--lock-screen-reauth-dialog-width) -
+        2 * var(--lock-screen-reauth-dialog-content-padding));
+    /* Header takes 70% of the width remaining after applying padding */
+    --lock-screen-reauth-dialog-header-width: clamp(346px,
+    calc(0.7 * (var(--lock-screen-reauth-dialog-width) -
+    2 * var(--lock-screen-reauth-dialog-content-padding))), 520px);
+  }
 
-  <script src="chrome://resources/js/cr.js"></script>
-  <script src="chrome://resources/js/cr/event_target.js"></script>
-  <script src="chrome://resources/js/load_time_data.js"></script>
-  <script src="chrome://resources/js/assert.js"></script>
-  <script src="chrome://resources/js/util.js"></script>
-  <script src="chrome://lock-reauth/authenticator.js"></script>
+  .content-wrapper {
+    display: flex;
+    flex-direction: column;
+    height: 100%;
+    width: 100%;
+  }
 
-  <script type="module" src="chrome://lock-reauth/lock_screen_reauth.js"></script>
+  .main-container {
+    align-items: var(--lock-screen-reauth-dialog-item-alignment);
+    display: flex;
+    flex: 1;
+    flex-direction: var(--lock-screen-reauth-dialog-content-direction);
+  }
 
-  <dom-module id="lock-reauth">
-    <template>
-      <style>
-        :host {
-          --lock-screen-reauth-dialog-buttons-horizontal-padding: 40px;
-          --lock-screen-reauth-dialog-buttons-vertical-padding: 25px;
-          --lock-screen-reauth-dialog-content-padding: 40px;
-          --lock-screen-reauth-dialog-icon-size: 32px;
-          --lock-screen-reauth-dialog-text-line-height: 18px;
-          --lock-screen-reauth-dialog-title-top-padding: 40px;
-          --lock-screen-reauth-back-button-height: calc(
-              var(--lock-screen-reauth-dialog-buttons-vertical-padding) +
-              var(--cr-button-height));
-          --lock-screen-reauth-dialog-header-top-padding: calc(
-              var(--lock-screen-reauth-dialog-content-padding) +
-              var(--lock-screen-reauth-back-button-height));
-          height: 100%;
-          left: 0;
-          margin: 0;
-          padding: 0;
-          position: fixed;
-          top: 0;
-          width: 100%;
-        }
+  #body {
+    align-self: stretch;
+    display: flex;
+    flex-direction: column;
+    flex-grow: 1;
+    height: 100%;
+    width: 100%;
+  }
 
-        :host-context([orientation=horizontal]) {
-          --button-alignment: flex-end;
-          --lock-screen-reauth-dialog-content-direction: row;
-          --lock-screen-reauth-dialog-item-alignment: unset;
-          --lock-screen-reauth-dialog-title-top-padding: 40px;
-          --lock-screen-reauth-text-alignment: start;
-          --lock-screen-reauth-dialog-content-top-padding: calc(
-              var(--lock-screen-reauth-dialog-header-top-padding) +
-              var(--lock-screen-reauth-dialog-title-top-padding) +
-              var(--lock-screen-reauth-dialog-icon-size));
-          /* Header takes 40% of the width remaining after applying padding */
-          --lock-screen-reauth-dialog-header-width: clamp(302px,
-          calc(0.4 * (var(--lock-screen-reauth-dialog-width) -
-          4 * var(--lock-screen-reauth-dialog-content-padding))), 346px);
-          --lock-screen-reauth-dialog-content-width: calc(
-              var(--lock-screen-reauth-dialog-width) -
-              4 * var(--lock-screen-reauth-dialog-content-padding) -
-              var(--lock-screen-reauth-dialog-header-width));
-        }
+  #samlContainer {
+    /* #FFFFFF */
+    background: rgb(255, 255, 255);
+    /* #000000 */
+    box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.17);
+    display: flex;
+    height: 44px;
+    justify-content: flex-end;
+    text-align: center;
+  }
 
-        :host-context([orientation=vertical]) {
-          --button-alignment: center;
-          --lock-screen-reauth-dialog-content-direction: column;
-          --lock-screen-reauth-dialog-content-top-padding:
-              var(--lock-screen-reauth-dialog-buttons-vertical-padding);
-          --lock-screen-reauth-dialog-item-alignment: center;
-          --lock-screen-reauth-dialog-title-top-padding: 15px;
-          --lock-screen-reauth-text-alignment: center;
-          --lock-screen-reauth-dialog-content-width: calc(
-              var(--lock-screen-reauth-dialog-width) -
-              2 * var(--lock-screen-reauth-dialog-content-padding));
-          /* Header takes 70% of the width remaining after applying padding */
-          --lock-screen-reauth-dialog-header-width: clamp(346px,
-          calc(0.7 * (var(--lock-screen-reauth-dialog-width) -
-          2 * var(--lock-screen-reauth-dialog-content-padding))), 520px);
-        }
+  #samlContainer[saml-notice-message] {
+    /* #F1F3F4 */
+    background: rgb(241, 243, 244);
+  }
 
-        .content-wrapper {
-          display: flex;
-          flex-direction: column;
-          height: 100%;
-          width: 100%;
-        }
+  #samlNoticeMessage {
+    /* #6a6a6a */
+    color: rgb(106, 106, 106);
+    flex: 1;
+    font-size: 13px;
+    padding-top: 15px;
+  }
 
-        .main-container {
-          align-items: var(--lock-screen-reauth-dialog-item-alignment);
-          display: flex;
-          flex: 1;
-          flex-direction: var(--lock-screen-reauth-dialog-content-direction);
-        }
+  #saml-close-button {
+    --cr-icon-button-margin-end: 0;
+    --cr-icon-button-margin-start: 0;
+  }
 
-        #body {
-          align-self: stretch;
-          display: flex;
-          flex-direction: column;
-          flex-grow: 1;
-          height: 100%;
-          width: 100%;
-        }
+  #signin-frame {
+    flex: 1;
+    height: 100%;
+    width: 100%;
+  }
 
-        #samlContainer {
-          /* #FFFFFF */
-          background: rgb(255, 255, 255);
-          /* #000000 */
-          box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.17);
-          display: flex;
-          height: 44px;
-          justify-content: flex-end;
-          text-align: center;
-        }
+  .title-icon {
+    /* #1a73e8 */
+    --iron-icon-fill-color: rgb(26, 115, 232);
+    --iron-icon-height: 32px;
+    --iron-icon-width: 32px;
+    align-self: var(--lock-screen-reauth-dialog-item-alignment);
+  }
 
-        #samlContainer[saml-notice-message] {
-          /* #F1F3F4 */
-          background: rgb(241, 243, 244);
-        }
+  .header {
+    background: white;
+    display: flex;
+    flex-direction: column;
+    padding-bottom: var(--lock-screen-reauth-dialog-content-padding);
+    padding-inline-end: var(--lock-screen-reauth-dialog-content-padding);
+    padding-inline-start:
+      var(--lock-screen-reauth-dialog-content-padding);
+    padding-top: var(--lock-screen-reauth-dialog-header-top-padding);
+    width: var(--lock-screen-reauth-dialog-header-width);
+  }
 
-        #samlNoticeMessage {
-          /* #6a6a6a */
-          color: rgb(106, 106, 106);
-          flex: 1;
-          font-size: 13px;
-          padding-top: 15px;
-        }
+  .title {
+    color: var(--cr-primary-text-color);
+    font-size: 28px;
+    font-weight: 400;
+    margin: 0;
+    padding-top: var(--lock-screen-reauth-dialog-title-top-padding);
+    text-align: var(--lock-screen-reauth-text-alignment);
+  }
 
-        #saml-close-button {
-          --cr-icon-button-margin-end: 0;
-          --cr-icon-button-margin-start: 0;
-        }
+  .subtitle {
+    color: var(--cr-secondary-text-color);
+    font-size: 13px;
+    font-weight: 400;
+    line-height: var(--lock-screen-reauth-dialog-text-line-height);
+    margin: 0;
+    overflow-wrap: break-word;
+    padding-top: 15px;
+    text-align: var(--lock-screen-reauth-text-alignment);
+  }
 
-        #signin-frame {
-          flex: 1;
-          height: 100%;
-          width: 100%;
-        }
+  .illustration-container {
+    align-items: center;
+    display: flex;
+    justify-content: center;
+    padding-bottom: 0;
+    padding-inline-end: var(--lock-screen-reauth-dialog-content-padding);
+    padding-inline-start:
+      var(--lock-screen-reauth-dialog-content-padding);
+    width: var(--lock-screen-reauth-dialog-content-width);
+  }
 
-        .title-icon {
-          /* #1a73e8 */
-          --iron-icon-fill-color: rgb(26, 115, 232);
-          --iron-icon-height: 32px;
-          --iron-icon-width: 32px;
-          align-self: var(--lock-screen-reauth-dialog-item-alignment);
-        }
+  .illustration {
+    height: 100%;
+    max-width: 500px;
+    object-fit: contain;
+    width: 100%;
+  }
 
-        .header {
-          background: white;
-          display: flex;
-          flex-direction: column;
-          padding-bottom: var(--lock-screen-reauth-dialog-content-padding);
-          padding-inline-end: var(--lock-screen-reauth-dialog-content-padding);
-          padding-inline-start:
-            var(--lock-screen-reauth-dialog-content-padding);
-          padding-top: var(--lock-screen-reauth-dialog-header-top-padding);
-          width: var(--lock-screen-reauth-dialog-header-width);
-        }
+  .button-container {
+    display: flex;
+    flex-shrink: 0;
+    justify-content: var(--button-alignment);
+    min-height: var(--cr-button-height);
+    padding-bottom:
+      var(--lock-screen-reauth-dialog-buttons-vertical-padding);
+    padding-inline-end:
+      var(--lock-screen-reauth-dialog-buttons-horizontal-padding);
+    padding-inline-start:
+      var(--lock-screen-reauth-dialog-buttons-horizontal-padding);
+    padding-top:
+      var(--lock-screen-reauth-dialog-buttons-vertical-padding);
+    z-index: 1;
+  }
 
-        .title {
-          color: var(--cr-primary-text-color);
-          font-size: 28px;
-          font-weight: 400;
-          margin: 0;
-          padding-top: var(--lock-screen-reauth-dialog-title-top-padding);
-          text-align: var(--lock-screen-reauth-text-alignment);
-        }
+  [hidden] {
+    display: none !important;
+  }
 
-        .subtitle {
-          color: var(--cr-secondary-text-color);
-          font-size: 13px;
-          font-weight: 400;
-          line-height: var(--lock-screen-reauth-dialog-text-line-height);
-          margin: 0;
-          overflow-wrap: break-word;
-          padding-top: 15px;
-          text-align: var(--lock-screen-reauth-text-alignment);
-        }
+  .input-container {
+    border: 0;
+    flex: 2;
+    padding-bottom: 0;
+    padding-inline-end: var(--lock-screen-reauth-dialog-content-padding);
+    padding-inline-start:
+      var(--lock-screen-reauth-dialog-content-padding);
+    padding-top: var(--lock-screen-reauth-dialog-content-top-padding);
+    width: var(--lock-screen-reauth-dialog-content-width);
+  }
 
-        .illustration-container {
-          align-items: center;
-          display: flex;
-          justify-content: center;
-          padding-bottom: 0;
-          padding-inline-end: var(--lock-screen-reauth-dialog-content-padding);
-          padding-inline-start:
-            var(--lock-screen-reauth-dialog-content-padding);
-          width: var(--lock-screen-reauth-dialog-content-width);
-        }
+  cr-input {
+    --cr-input-border-radius: 4px 4px 0 0;
+    --cr-input-min-height: 32px;
+    max-width: 560px;
+    padding-bottom: 8px;
+  }
 
-        .illustration {
-          height: 100%;
-          max-width: 500px;
-          object-fit: contain;
-          width: 100%;
-        }
+  cr-button {
+    border-radius: 16px;
+  }
 
-        .button-container {
-          display: flex;
-          flex-shrink: 0;
-          justify-content: var(--button-alignment);
-          min-height: var(--cr-button-height);
-          padding-bottom:
-            var(--lock-screen-reauth-dialog-buttons-vertical-padding);
-          padding-inline-end:
-            var(--lock-screen-reauth-dialog-buttons-horizontal-padding);
-          padding-inline-start:
-            var(--lock-screen-reauth-dialog-buttons-horizontal-padding);
-          padding-top:
-            var(--lock-screen-reauth-dialog-buttons-vertical-padding);
-          z-index: 1;
-        }
-
-        [hidden] {
-          display: none !important;
-        }
-
-        .input-container {
-          border: 0;
-          flex: 2;
-          padding-bottom: 0;
-          padding-inline-end: var(--lock-screen-reauth-dialog-content-padding);
-          padding-inline-start:
-            var(--lock-screen-reauth-dialog-content-padding);
-          padding-top: var(--lock-screen-reauth-dialog-content-top-padding);
-          width: var(--lock-screen-reauth-dialog-content-width);
-        }
-
-        cr-input {
-          --cr-input-border-radius: 4px 4px 0 0;
-          --cr-input-min-height: 32px;
-          max-width: 560px;
-          padding-bottom: 8px;
-        }
-
-        cr-button {
-          border-radius: 16px;
-        }
-
-        :host-context([dir=rtl]) #arrowForward {
-          transform: rotate(180deg);
-        }
-      </style>
-      <div class="content-wrapper" hidden="[[!isVerifyUser_]]" role="dialog"
-          aria-modal="true" id="verifyAccountScreen"
-          aria-label="$i18n{loginWelcomeMessage}">
-        <div class="main-container">
-          <div class="header">
-            <iron-icon class="title-icon" icon="oobe-32:avatar"></iron-icon>
-            <div class="title">
-              $i18n{loginWelcomeMessage}
-            </div>
-            <div class="subtitle">
-              $i18n{lockScreenReauthSubtitile}
-            </div>
-          </div>
-          <div class="illustration-container">
-            <img class="illustration"
-                srcset="../login/images/1x/verify-account.svg 1x,
-                        ../login/images/2x/verify-account.svg 2x">
-          </div>
-        </div>
-        <div class="flex layout horizontal button-container">
-          <cr-button id="cancelButtonVerifyScreen" class="cancel-button"
-              on-click="onCloseTap_">
-            $i18n{lockScreenCancelButton}
-          </cr-button>
-          <cr-button id="nextButtonVerifyScreen" class="action-button" on-click="onVerify_">
-            $i18n{lockScreenVerifyButton}
-          </cr-button>
-        </div>
+  :host-context([dir=rtl]) #arrowForward {
+    transform: rotate(180deg);
+  }
+</style>
+<div class="content-wrapper" hidden="[[!isVerifyUser_]]" role="dialog"
+    aria-modal="true" id="verifyAccountScreen"
+    aria-label="$i18n{loginWelcomeMessage}">
+  <div class="main-container">
+    <div class="header">
+      <iron-icon class="title-icon" icon="oobe-32:avatar"></iron-icon>
+      <div class="title">
+        $i18n{loginWelcomeMessage}
       </div>
-
-      <div class="content-wrapper" hidden="[[!isErrorDisplayed_]]" role="dialog"
-          aria-modal="true" id="errorScreen"
-          aria-label="$i18n{loginWelcomeMessageWithError}">
-        <div class="main-container">
-          <div class="header">
-            <iron-icon class="title-icon" icon="oobe-32:warning"></iron-icon>
-            <div class="title">
-              $i18n{loginWelcomeMessageWithError}
-            </div>
-            <div class="subtitle">
-              <div>$i18n{lockScreenReauthSubtitile1WithError}</div>
-              <div>$i18n{lockScreenReauthSubtitile2WithError}</div>
-            </div>
-          </div>
-          <div class="illustration-container">
-            <img src="../login/images/error.svg" class="illustration">
-          </div>
-        </div>
-        <div class="flex layout horizontal button-container">
-          <cr-button id="cancelButtonErrorScreen" class="cancel-button"
-              on-click="onCloseTap_">
-            $i18n{lockScreenCancelButton}
-          </cr-button>
-          <cr-button id="nextButton" class="action-button" on-click="onVerify_">
-            $i18n{lockScreenVerifyAgainButton}
-          </cr-button>
-        </div>
+      <div class="subtitle">
+        $i18n{lockScreenReauthSubtitile}
       </div>
+    </div>
+    <div class="illustration-container">
+      <img class="illustration"
+          srcset="chrome://lock-reauth/images/1x/verify-account.svg 1x,
+                  chrome://lock-reauth/images/2x/verify-account.svg 2x">
+    </div>
+  </div>
+  <div class="flex layout horizontal button-container">
+    <cr-button id="cancelButtonVerifyScreen" class="cancel-button"
+        on-click="onCloseTap_">
+      $i18n{lockScreenCancelButton}
+    </cr-button>
+    <cr-button id="nextButtonVerifyScreen" class="action-button"
+        on-click="onVerify_">
+      $i18n{lockScreenVerifyButton}
+    </cr-button>
+  </div>
+</div>
 
-      <div id="body" hidden="[[!isSamlPage_]]">
-        <div id="samlContainer"
-            saml-notice-message$="[[showSamlNoticeMessage_]]">
-          <span id="samlNoticeMessage" hidden="[[!showSamlNoticeMessage_]]">
-          </span>
-          <cr-icon-button id="saml-close-button" iron-icon="cr:close"
-              on-click="onCloseTap_" aria-label="$i18n{lockScreenCloseButton}">
-          </cr-icon-button>
-        </div>
-        <webview id="signin-frame" name="signin-frame" class="flex">
-        </webview>
+<div class="content-wrapper" hidden="[[!isErrorDisplayed_]]" role="dialog"
+    aria-modal="true" id="errorScreen"
+    aria-label="$i18n{loginWelcomeMessageWithError}">
+  <div class="main-container">
+    <div class="header">
+      <iron-icon class="title-icon" icon="oobe-32:warning"></iron-icon>
+      <div class="title">
+        $i18n{loginWelcomeMessageWithError}
       </div>
-
-      <div id="samlConfirmPasswordScreen" class="content-wrapper"
-          hidden="[[!isConfirmPassword_]]">
-        <div class="main-container">
-          <div class="header">
-            <iron-icon class="title-icon" icon="oobe-32:lock"></iron-icon>
-            <div class="title">
-              [[email_]]
-            </div>
-            <div class="subtitle" hidden="[[isManualInput_]]">
-              $i18n{confirmPasswordSubtitle}
-            </div>
-            <div class="subtitle" hidden="[[!isManualInput_]]">
-              $i18n{manualPasswordSubtitle}
-            </div>
-          </div>
-          <div class="input-container">
-            <cr-input type="password" id="passwordInput" required
-                placeholder="[[passwordPlaceholder_(locale, isManualInput_)]]"
-                error-message="[[passwordErrorText_(locale, isManualInput_)]]">
-            </cr-input>
-            <cr-input type="password" id="confirmPasswordInput" required
-                placeholder="$i18n{confirmPasswordLabel}"
-                error-message="$i18n{manualPasswordMismatch}"
-                hidden="[[!isManualInput_]]">
-            </cr-input>
-          </div>
-        </div>
-        <div class="flex layout horizontal button-container">
-          <cr-button id="cancelButton" class="cancel-button" on-click="onCloseTap_">
-            $i18n{lockScreenCancelButton}
-          </cr-button>
-          <cr-button id="nextButtonSamlConfirmPassword" class="action-button"
-              on-click="onConfirm_">
-            $i18n{lockScreenNextButton}
-            <iron-icon id="arrowForward" icon="oobe-20:button-arrow-forward">
-            </iron-icon>
-          </cr-button>
-        </div>
+      <div class="subtitle">
+        <div>$i18n{lockScreenReauthSubtitile1WithError}</div>
+        <div>$i18n{lockScreenReauthSubtitile2WithError}</div>
       </div>
+    </div>
+    <div class="illustration-container">
+      <img src="chrome://lock-reauth/images/error.svg" class="illustration">
+    </div>
+  </div>
+  <div class="flex layout horizontal button-container">
+    <cr-button id="cancelButtonErrorScreen" class="cancel-button"
+        on-click="onCloseTap_">
+      $i18n{lockScreenCancelButton}
+    </cr-button>
+    <cr-button id="nextButton" class="action-button" on-click="onVerify_">
+      $i18n{lockScreenVerifyAgainButton}
+    </cr-button>
+  </div>
+</div>
 
-      <div class="content-wrapper" hidden="[[!isPasswordChanged_]]">
-        <div class="main-container">
-          <div class="header">
-            <iron-icon class="title-icon" icon="oobe-32:lock"></iron-icon>
-            <div class="title">
-              $i18n{passwordChangedTitle}
-            </div>
-            <div class="subtitle">
-              $i18n{passwordChangedSubtitle}
-            </div>
-          </div>
-          <div class="input-container">
-            <cr-input type="password" id="oldPasswordInput" required
-                placeholder="$i18n{passwordChangedOldPasswordHint}"
-                error-message="$i18n{passwordChangedIncorrectOldPassword}">
-          </div>
-        </div>
-        <div class="flex layout horizontal button-container">
-          <cr-button id="cancelButton" class="cancel-button" on-click="onCloseTap_">
-            $i18n{lockScreenCancelButton}
-          </cr-button>
-          <cr-button id="nextButton" class="action-button" on-click="onNext_">
-            $i18n{lockScreenNextButton}
-            <iron-icon icon="oobe-20:button-arrow-forward"></iron-icon>
-          </cr-button>
-        </div>
+<div id="body" hidden="[[!isSamlPage_]]">
+  <div id="samlContainer"
+      saml-notice-message$="[[showSamlNoticeMessage_]]">
+    <span id="samlNoticeMessage" hidden="[[!showSamlNoticeMessage_]]">
+    [[authDomainNotice_]]
+    </span>
+    <cr-icon-button id="saml-close-button" iron-icon="cr:close"
+        on-click="onCloseTap_" aria-label="$i18n{lockScreenCloseButton}">
+    </cr-icon-button>
+  </div>
+  <webview id="signin-frame" name="signin-frame" class="flex">
+  </webview>
+</div>
+
+<div id="samlConfirmPasswordScreen" class="content-wrapper"
+    hidden="[[!isConfirmPassword_]]">
+  <div class="main-container">
+    <div class="header">
+      <iron-icon class="title-icon" icon="oobe-32:lock"></iron-icon>
+      <div class="title">
+        [[email_]]
       </div>
-    </template>
-  </dom-module>
-</head>
+      <div class="subtitle" hidden="[[isManualInput_]]">
+        $i18n{confirmPasswordSubtitle}
+      </div>
+      <div class="subtitle" hidden="[[!isManualInput_]]">
+        $i18n{manualPasswordSubtitle}
+      </div>
+    </div>
+    <div class="input-container">
+      <cr-input type="password" id="passwordInput" required
+          placeholder="[[passwordPlaceholder_(locale, isManualInput_)]]"
+          error-message="[[passwordErrorText_(locale, isManualInput_)]]">
+      </cr-input>
+      <cr-input type="password" id="confirmPasswordInput" required
+          placeholder="$i18n{confirmPasswordLabel}"
+          error-message="$i18n{manualPasswordMismatch}"
+          hidden="[[!isManualInput_]]">
+      </cr-input>
+    </div>
+  </div>
+  <div class="flex layout horizontal button-container">
+    <cr-button id="cancelButton" class="cancel-button" on-click="onCloseTap_">
+      $i18n{lockScreenCancelButton}
+    </cr-button>
+    <cr-button id="nextButtonSamlConfirmPassword" class="action-button"
+        on-click="onConfirm_">
+      $i18n{lockScreenNextButton}
+      <iron-icon id="arrowForward" icon="oobe-20:button-arrow-forward">
+      </iron-icon>
+    </cr-button>
+  </div>
+</div>
 
-<body>
-  <lock-reauth id="main-element">
-  </lock-reauth>
-</body>
-
-</html>
+<div class="content-wrapper" hidden="[[!isPasswordChanged_]]">
+  <div class="main-container">
+    <div class="header">
+      <iron-icon class="title-icon" icon="oobe-32:lock"></iron-icon>
+      <div class="title">
+        $i18n{passwordChangedTitle}
+      </div>
+      <div class="subtitle">
+        $i18n{passwordChangedSubtitle}
+      </div>
+    </div>
+    <div class="input-container">
+      <cr-input type="password" id="oldPasswordInput" required
+          placeholder="$i18n{passwordChangedOldPasswordHint}"
+          error-message="$i18n{passwordChangedIncorrectOldPassword}">
+    </div>
+  </div>
+  <div class="flex layout horizontal button-container">
+    <cr-button id="cancelButton" class="cancel-button" on-click="onCloseTap_">
+      $i18n{lockScreenCancelButton}
+    </cr-button>
+    <cr-button id="nextButton" class="action-button" on-click="onNext_">
+      $i18n{lockScreenNextButton}
+      <iron-icon icon="oobe-20:button-arrow-forward"></iron-icon>
+    </cr-button>
+  </div>
+</div>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/password_change/lock_screen_reauth.js b/chrome/browser/resources/chromeos/password_change/lock_screen_reauth.js
index afb4e51..5dd76e7 100644
--- a/chrome/browser/resources/chromeos/password_change/lock_screen_reauth.js
+++ b/chrome/browser/resources/chromeos/password_change/lock_screen_reauth.js
@@ -7,15 +7,19 @@
  * the lock screen.
  */
 
-import {assert} from 'chrome://resources/js/assert.m.js';
-import {I18nBehavior} from 'chrome://resources/js/i18n_behavior.m.js';
-import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-import {Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import 'chrome://resources/js/cr.m.js';
+import 'chrome://resources/js/cr/event_target.m.js';
 import 'chrome://resources/cr_elements/cr_button/cr_button.js';
-import 'chrome://resources/cr_elements/cr_dialog/cr_dialog.js';
 import 'chrome://resources/cr_elements/cr_input/cr_input.js';
 import 'chrome://resources/cr_elements/icons.m.js';
 import 'chrome://resources/cr_elements/shared_vars_css.m.js';
+import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {assert} from 'chrome://resources/js/assert.m.js';
+import {I18nBehavior} from 'chrome://resources/js/i18n_behavior.m.js';
+import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
+import {$} from 'chrome://resources/js/util.m.js';
+import {Authenticator, AuthMode, AuthParams, SUPPORTED_PARAMS} from './gaia_auth_host/authenticator.m.js';
+import './components/oobe_icons.m.js';
 
 const clearDataType = {
   appcache: true,
@@ -27,10 +31,22 @@
   is: 'lock-reauth',
   behaviors: [I18nBehavior],
 
+  _template: html`{__html_template__}`,
+
   properties: {
     // User non-canonicalized email for display
     email_: String,
 
+
+    /**
+     * SAML notice which changes when the authDomain property is changed on the
+     * authenticator.
+     */
+    authDomainNotice_: {
+      type: String,
+      value: '',
+    },
+
     /**
      * Whether the ‘verify user’ screen is shown.
      */
@@ -100,7 +116,7 @@
 
   /**
    * The UI component that hosts IdP pages.
-   * @type {!cr.login.Authenticator|undefined}
+   * @type {!Authenticator|undefined}
    */
   authenticator_: undefined,
 
@@ -114,7 +130,7 @@
   /** @override */
   ready() {
     this.signinFrame_ = this.getSigninFrame_();
-    this.authenticator_ = new cr.login.Authenticator(this.signinFrame_);
+    this.authenticator_ = new Authenticator(this.signinFrame_);
     this.authenticator_.addEventListener(
         'authDomainChange', () => void this.onAuthDomainChange_());
     this.authenticator_.addEventListener(
@@ -133,6 +149,7 @@
     this.isManualInput_ = false;
     this.isPasswordChanged_ = false;
     this.showSamlNoticeMessage_ = false;
+    this.authDomainNotice_ = '';
   },
 
   /**
@@ -162,26 +179,23 @@
    * @private
    */
   onAuthDomainChange_() {
-    // <!--_html_template_start_-->
-    this.$.samlNoticeMessage.textContent =
-      loadTimeData.substituteString('$i18nPolymer{samlNotice}',
-        this.authenticator_.authDomain);
-    // <!--_html_template_end_-->
+    this.authDomainNotice_ =
+        this.i18n('samlNotice', this.authenticator_.authDomain);
   },
 
   /**
    * Loads the authentication parameter into the iframe.
-   * @param {!Object} data authenticator parameters bag.
+   * @param {!AuthParams} data authenticator parameters bag.
    */
   loadAuthenticator(data) {
     this.authenticator_.setWebviewPartition(data.webviewPartitionName);
     const params = {};
-    for (const i in cr.login.Authenticator.SUPPORTED_PARAMS) {
-      const name = cr.login.Authenticator.SUPPORTED_PARAMS[i];
-      if (data[name]) {
+    SUPPORTED_PARAMS.forEach(name => {
+      if (data.hasOwnProperty(name)) {
         params[name] = data[name];
       }
-    }
+    });
+
     this.authenticatorParams_ = params;
     this.email_ = data.email;
     if (!data['doSamlRedirect']) {
@@ -295,8 +309,7 @@
 
   /** @private */
   onVerify_() {
-    this.authenticator_.load(
-      cr.login.Authenticator.AuthMode.DEFAULT, this.authenticatorParams_);
+    this.authenticator_.load(AuthMode.DEFAULT, this.authenticatorParams_);
     this.resetState_();
     /**
      * These statements override resetStates_ calls.
@@ -313,7 +326,8 @@
     }
     if (this.isManualInput_) {
       // When using manual password entry, both passwords must match.
-      const confirmPasswordInput = this.$$('#confirmPasswordInput');
+      const confirmPasswordInput =
+          this.shadowRoot.querySelector('#confirmPasswordInput');
       if (!confirmPasswordInput.validate()) {
         return;
       }
@@ -352,8 +366,7 @@
 
   /** @private */
   doGaiaRedirect_() {
-    this.authenticator_.load(
-        cr.login.Authenticator.AuthMode.DEFAULT, this.authenticatorParams_);
+    this.authenticator_.load(AuthMode.DEFAULT, this.authenticatorParams_);
     this.resetState_();
     /**
      * These statements override resetStates_ calls.
@@ -364,20 +377,15 @@
 
   /** @private */
   passwordPlaceholder_(locale, isManualInput_) {
-    // <!--_html_template_start_-->
-    return isManualInput_ ?
-      '$i18n{manualPasswordInputLabel}' :
-      '$i18n{confirmPasswordLabel}';
-    // <!--_html_template_end_-->
+    return this.i18n(
+        isManualInput_ ? 'manualPasswordInputLabel' : 'confirmPasswordLabel');
   },
 
   /** @private */
   passwordErrorText_(locale, isManualInput_) {
-    // <!--_html_template_start_-->
-    return isManualInput_ ?
-      '$i18n{manualPasswordMismatch}' :
-      '$i18n{passwordChangedIncorrectOldPassword}';
-    // <!--_html_template_end_-->
+    return this.i18n(
+        isManualInput_ ? 'manualPasswordMismatch' :
+                         'passwordChangedIncorrectOldPassword');
   },
 
 });
diff --git a/chrome/browser/resources/chromeos/password_change/lock_screen_reauth_app.html b/chrome/browser/resources/chromeos/password_change/lock_screen_reauth_app.html
new file mode 100644
index 0000000..6a218742
--- /dev/null
+++ b/chrome/browser/resources/chromeos/password_change/lock_screen_reauth_app.html
@@ -0,0 +1,13 @@
+<!doctype html>
+<html dir="$i18n{textdirection}" lang="$i18n{language}">
+<head>
+  <meta charset="utf-8">
+  <link rel="stylesheet" href="chrome://resources/css/text_defaults.css">
+  <script type="module" src="chrome://lock-reauth/lock_screen_reauth_app.js">
+  </script>
+</head>
+<body>
+  <lock-reauth id="main-element">
+  </lock-reauth>
+</body>
+</html>
diff --git a/chrome/browser/resources/chromeos/password_change/lock_screen_reauth_app.js b/chrome/browser/resources/chromeos/password_change/lock_screen_reauth_app.js
new file mode 100644
index 0000000..c2d2a13
--- /dev/null
+++ b/chrome/browser/resources/chromeos/password_change/lock_screen_reauth_app.js
@@ -0,0 +1,24 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview An UI component to let user init online re-auth flow on
+ * the lock screen.
+ */
+
+import {$} from 'chrome://resources/js/util.m.js';
+export {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
+
+import './strings.m.js';
+import './lock_screen_reauth.js';
+
+function initialize() {
+  // '$(id)' is an alias for 'document.getElementById(id)'. It is defined
+  // in chrome://resources/js/util.m.js. If this function is not exposed
+  // via the global object, it would not be available to tests that inject
+  // JavaScript directly into the renderer.
+  window.$ = $;
+}
+
+initialize();
diff --git a/chrome/browser/resources/new_tab_page/realbox/icons/definition.svg b/chrome/browser/resources/new_tab_page/realbox/icons/definition.svg
index 9e20cee..4825195 100644
--- a/chrome/browser/resources/new_tab_page/realbox/icons/definition.svg
+++ b/chrome/browser/resources/new_tab_page/realbox/icons/definition.svg
@@ -1 +1 @@
-<svg width="16" height="16" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M4 1.333h8c.733 0 1.333.6 1.333 1.334v10.666c0 .734-.6 1.334-1.333 1.334H4c-.733 0-1.333-.6-1.333-1.334V2.667c0-.734.6-1.334 1.333-1.334zm0 12h8V2.667H8.666V8L7 7 5.333 8V2.667H4v10.666z" fill="#000"/></svg>
\ No newline at end of file
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill-rule="evenodd"><path d="M13 1H3c-.6 0-1 .4-1 1v12c0 .6.4 1 1 1h10c.6 0 1-.4 1-1V2c0-.6-.4-1-1-1Zm-1 12H4V3h1v6l2-1.1L9 9V3h3v10Z"/></svg>
diff --git a/chrome/browser/resources/new_tab_page/realbox/icons/finance.svg b/chrome/browser/resources/new_tab_page/realbox/icons/finance.svg
index 3ed9854..36e6cbd 100644
--- a/chrome/browser/resources/new_tab_page/realbox/icons/finance.svg
+++ b/chrome/browser/resources/new_tab_page/realbox/icons/finance.svg
@@ -1 +1 @@
-<svg width="16" height="16" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M3.333 4.66 6 2l2.667 2.66h-2v4.673H5.334V4.66h-2zm7.334 2.007v4.673h2L10 14l-2.667-2.66h2V6.667h1.334z" fill="#000"/></svg>
\ No newline at end of file
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill-rule="evenodd"><path d="M9 12V7h2v5h2l-3 3-3-3h2ZM7 4v5H5V4H3l3-3 3 3H7Z"/></svg>
diff --git a/chrome/browser/resources/new_tab_page/realbox/icons/sunrise.svg b/chrome/browser/resources/new_tab_page/realbox/icons/sunrise.svg
index a1c960e..fff9f9cd 100644
--- a/chrome/browser/resources/new_tab_page/realbox/icons/sunrise.svg
+++ b/chrome/browser/resources/new_tab_page/realbox/icons/sunrise.svg
@@ -1 +1 @@
-<svg width="16" height="16" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.333.667h1.333v1.966H7.333V.667zm-2.827 2.86-1.2-1.194-.94.94L3.56 4.467l.946-.94zM2.666 7.3h-2v1.333h2V7.3zm10.967-4.027-.94-.94L11.5 3.527l.94.94 1.193-1.194zm-.946 10.334-1.194-1.2.934-.934 1.2 1.194-.94.94zM15.332 7.3h-2v1.333h2V7.3zM4 7.967c0-2.207 1.793-4 4-4s4 1.793 4 4c0 2.206-1.793 4-4 4s-4-1.794-4-4zm4.666 7.3V13.3H7.333v1.967h1.333zM3.306 13.6l-.94-.94 1.194-1.2.94.94-1.194 1.2z" fill="#000"/></svg>
\ No newline at end of file
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill-rule="evenodd"><path d="M8 4C5.79 4 4 5.79 4 8s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4Zm1-4v2H7V0h2Zm0 14v2H7v-2h2ZM0 7h2v2H0V7Zm14 0h2v2h-2V7ZM3.05 1.64l1.41 1.41-1.41 1.41-1.41-1.41 1.41-1.41Zm9.9 9.9 1.41 1.41-1.41 1.41-1.41-1.41 1.41-1.41ZM1.64 12.95l1.41-1.41 1.41 1.41-1.41 1.41-1.41-1.41Zm9.9-9.9 1.41-1.41 1.41 1.41-1.41 1.41-1.41-1.41Z"/></svg>
diff --git a/chrome/browser/resources/new_tab_page/realbox/icons/when_is.svg b/chrome/browser/resources/new_tab_page/realbox/icons/when_is.svg
index feff838..6185f9bb 100644
--- a/chrome/browser/resources/new_tab_page/realbox/icons/when_is.svg
+++ b/chrome/browser/resources/new_tab_page/realbox/icons/when_is.svg
@@ -1 +1 @@
-<svg width="16" height="16" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M12.667 2.667H12V1.333h-1.333v1.334H5.333V1.333H4v1.334h-.667c-.74 0-1.326.6-1.326 1.333L2 13.333c0 .734.593 1.334 1.333 1.334h9.334c.733 0 1.333-.6 1.333-1.334V4c0-.733-.6-1.333-1.333-1.333zm0 4v6.666H3.333V6.667h9.334zM8 10.333a1.667 1.667 0 1 1 3.335.002A1.667 1.667 0 0 1 8 10.333z" fill="#000"/></svg>
\ No newline at end of file
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill-rule="evenodd"><path d="M8 10a2 2 0 1 0 4 0 2 2 0 1 0-4 0m5.7-8H13V1h-2v1H5V1H3v1h-.7C1.6 2 1 2.6 1 3.3v10.3c0 .8.6 1.4 1.3 1.4h11.3c.7 0 1.3-.6 1.3-1.3V3.3c.1-.7-.5-1.3-1.2-1.3ZM13 13H3V5h10v8Z"/></svg>
diff --git a/chrome/browser/resources/settings/chromeos/BUILD.gn b/chrome/browser/resources/settings/chromeos/BUILD.gn
index 1333bca..8316eaf 100644
--- a/chrome/browser/resources/settings/chromeos/BUILD.gn
+++ b/chrome/browser/resources/settings/chromeos/BUILD.gn
@@ -435,7 +435,6 @@
     "os_reset_page:web_components",
     "os_search_page:web_components",
     "parental_controls_page:web_components",
-    "personalization_page:web_components",
     "settings_scheduler_slider:web_components",
   ]
 }
@@ -471,7 +470,6 @@
     "os_search_page:closure_compile_module",
     "os_settings_page:closure_compile_module",
     "parental_controls_page:closure_compile_module",
-    "personalization_page:closure_compile_module",
     "settings_scheduler_slider:closure_compile_module",
   ]
 }
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/esim_rename_dialog.js b/chrome/browser/resources/settings/chromeos/internet_page/esim_rename_dialog.js
index 1ad2f562..9bf079a 100644
--- a/chrome/browser/resources/settings/chromeos/internet_page/esim_rename_dialog.js
+++ b/chrome/browser/resources/settings/chromeos/internet_page/esim_rename_dialog.js
@@ -12,6 +12,7 @@
 import 'chrome://resources/polymer/v3_0/iron-flex-layout/iron-flex-layout-classes.js';
 
 import {getESimProfile} from 'chrome://resources/cr_components/chromeos/cellular_setup/esim_manager_utils.m.js';
+import {OncMojo} from 'chrome://resources/cr_components/chromeos/network/onc_mojo.m.js';
 import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/js/i18n_behavior.m.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/network_always_on_vpn.js b/chrome/browser/resources/settings/chromeos/internet_page/network_always_on_vpn.js
index 3d1c90e..509e936 100644
--- a/chrome/browser/resources/settings/chromeos/internet_page/network_always_on_vpn.js
+++ b/chrome/browser/resources/settings/chromeos/internet_page/network_always_on_vpn.js
@@ -10,6 +10,7 @@
 import 'chrome://resources/cr_elements/md_select_css.m.js';
 import 'chrome://resources/cr_components/chromeos/network/network_shared_css.m.js';
 
+import {OncMojo} from 'chrome://resources/cr_components/chromeos/network/onc_mojo.m.js';
 import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/js/i18n_behavior.m.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/network_proxy_section.js b/chrome/browser/resources/settings/chromeos/internet_page/network_proxy_section.js
index b30850e..82f2fef 100644
--- a/chrome/browser/resources/settings/chromeos/internet_page/network_proxy_section.js
+++ b/chrome/browser/resources/settings/chromeos/internet_page/network_proxy_section.js
@@ -21,6 +21,7 @@
 import 'chrome://resources/cr_elements/cr_toggle/cr_toggle.js';
 
 import {CrPolicyNetworkBehaviorMojo, CrPolicyNetworkBehaviorMojoInterface} from 'chrome://resources/cr_components/chromeos/network/cr_policy_network_behavior_mojo.m.js';
+import {OncMojo} from 'chrome://resources/cr_components/chromeos/network/onc_mojo.m.js';
 import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/js/i18n_behavior.m.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
diff --git a/chrome/browser/resources/settings/chromeos/os_a11y_page/display_and_magnification_page.html b/chrome/browser/resources/settings/chromeos/os_a11y_page/display_and_magnification_page.html
index 52ad6cc..040a4b0 100644
--- a/chrome/browser/resources/settings/chromeos/os_a11y_page/display_and_magnification_page.html
+++ b/chrome/browser/resources/settings/chromeos/os_a11y_page/display_and_magnification_page.html
@@ -49,16 +49,12 @@
     <div class="hr">
       <settings-radio-group id="screenMagnifierMouseFollowingModeRadioGroup"
           pref="{{prefs.settings.a11y.screen_magnifier_mouse_following_mode}}">
-        <template
-            is="dom-if"
-            if="[[isMagnifierContinuousMouseFollowingModeSettingEnabled_]]">
-          <controlled-radio-button
-              id="screenMagnifierMouseFollowingModeContinuous"
-              name="[[screenMagnifierMouseFollowingModePrefValues_.CONTINUOUS]]"
-              pref="[[prefs.settings.a11y.screen_magnifier_mouse_following_mode]]"
-              label="$i18n{screenMagnifierMouseFollowingModeContinuous}">
-          </controlled-radio-button>
-        </template>
+        <controlled-radio-button
+            id="screenMagnifierMouseFollowingModeContinuous"
+            name="[[screenMagnifierMouseFollowingModePrefValues_.CONTINUOUS]]"
+            pref="[[prefs.settings.a11y.screen_magnifier_mouse_following_mode]]"
+            label="$i18n{screenMagnifierMouseFollowingModeContinuous}">
+        </controlled-radio-button>
         <controlled-radio-button
             id="screenMagnifierMouseFollowingModeCentered"
             name="[[screenMagnifierMouseFollowingModePrefValues_.CENTERED]]"
diff --git a/chrome/browser/resources/settings/chromeos/os_a11y_page/display_and_magnification_page.js b/chrome/browser/resources/settings/chromeos/os_a11y_page/display_and_magnification_page.js
index a251c740..c7b0fe0 100644
--- a/chrome/browser/resources/settings/chromeos/os_a11y_page/display_and_magnification_page.js
+++ b/chrome/browser/resources/settings/chromeos/os_a11y_page/display_and_magnification_page.js
@@ -107,15 +107,6 @@
         },
       },
 
-      /** @protected */
-      isMagnifierContinuousMouseFollowingModeSettingEnabled_: {
-        type: Boolean,
-        value() {
-          return loadTimeData.getBoolean(
-              'isMagnifierContinuousMouseFollowingModeSettingEnabled');
-        },
-      },
-
       /**
        * Whether the user is in kiosk mode.
        * @protected
diff --git a/chrome/browser/resources/settings/chromeos/os_a11y_page/manage_a11y_page.html b/chrome/browser/resources/settings/chromeos/os_a11y_page/manage_a11y_page.html
index 081177ed..a3a4f5e 100644
--- a/chrome/browser/resources/settings/chromeos/os_a11y_page/manage_a11y_page.html
+++ b/chrome/browser/resources/settings/chromeos/os_a11y_page/manage_a11y_page.html
@@ -107,16 +107,12 @@
     <settings-radio-group id="screenMagnifierMouseFollowingModeRadioGroup"
         pref="{{prefs.settings.a11y.screen_magnifier_mouse_following_mode}}"
         class="sub-item">
-      <template
-          is="dom-if"
-          if="[[isMagnifierContinuousMouseFollowingModeSettingEnabled_]]">
-        <controlled-radio-button
-            id="screenMagnifierMouseFollowingModeContinuous"
-            name="[[screenMagnifierMouseFollowingModePrefValues_.CONTINUOUS]]"
-            pref="[[prefs.settings.a11y.screen_magnifier_mouse_following_mode]]"
-            label="$i18n{screenMagnifierMouseFollowingModeContinuous}">
-        </controlled-radio-button>
-      </template>
+      <controlled-radio-button
+          id="screenMagnifierMouseFollowingModeContinuous"
+          name="[[screenMagnifierMouseFollowingModePrefValues_.CONTINUOUS]]"
+          pref="[[prefs.settings.a11y.screen_magnifier_mouse_following_mode]]"
+          label="$i18n{screenMagnifierMouseFollowingModeContinuous}">
+      </controlled-radio-button>
       <controlled-radio-button
           id="screenMagnifierMouseFollowingModeCentered"
           name="[[screenMagnifierMouseFollowingModePrefValues_.CENTERED]]"
diff --git a/chrome/browser/resources/settings/chromeos/os_a11y_page/manage_a11y_page.js b/chrome/browser/resources/settings/chromeos/os_a11y_page/manage_a11y_page.js
index 04b2b4e..0b0ad18 100644
--- a/chrome/browser/resources/settings/chromeos/os_a11y_page/manage_a11y_page.js
+++ b/chrome/browser/resources/settings/chromeos/os_a11y_page/manage_a11y_page.js
@@ -226,15 +226,6 @@
       },
 
       /** @protected */
-      isMagnifierContinuousMouseFollowingModeSettingEnabled_: {
-        type: Boolean,
-        value() {
-          return loadTimeData.getBoolean(
-              'isMagnifierContinuousMouseFollowingModeSettingEnabled');
-        },
-      },
-
-      /** @protected */
       isAccessibilityOSSettingsVisibilityEnabled_: {
         type: Boolean,
         value() {
diff --git a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_page.html b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_page.html
index bdb2f6f..1125f494 100644
--- a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_page.html
+++ b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_page.html
@@ -38,8 +38,11 @@
       </os-settings-bluetooth-device-detail-subpage>
     </settings-subpage>
   </template>
-  <settings-subpage route-path="/bluetoothSavedDevices">
-    <os-settings-bluetooth-saved-devices-subpage>
+  <settings-subpage route-path="/bluetoothSavedDevices"
+      show-spinner="[[showSavedDevicesLoadingIndicators_]]">
+    <os-settings-bluetooth-saved-devices-subpage
+        show-saved-devices-loading-label=
+        "{{showSavedDevicesLoadingIndicators_}}">
     </os-settings-bluetooth-saved-devices-subpage>
   </settings-subpage>
 </settings-animated-pages>
diff --git a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_page.js b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_page.js
index 9bed25b..0cba97328 100644
--- a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_page.js
+++ b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_page.js
@@ -57,6 +57,13 @@
         type: Boolean,
         value: false,
       },
+
+      /**
+       * Set by Saved Devices subpage. Controls spinner and loading label
+       * visibility in the subpage.
+       * @private
+       */
+      showSavedDevicesLoadingIndicators_: Boolean,
     };
   }
 
diff --git a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_saved_devices_subpage.html b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_saved_devices_subpage.html
index e605e86c..9a808f9 100644
--- a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_saved_devices_subpage.html
+++ b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_saved_devices_subpage.html
@@ -10,22 +10,29 @@
   }
 </style>
 <div id="container">
-  <div hidden="[[!showSavedDevicesErrorLabel_]]" id="devicesError" class="settings-box-text">
+  <div hidden="[[!showSavedDevicesErrorLabel_]]"
+      id="devicesError" class="settings-box-text">
     [[savedDevicesErrorLabel_]]
   </div>
   <div hidden="[[!shouldShowNoDevicesLabel_(savedDevices_,
-      showSavedDevicesErrorLabel_)]]" id="noDevices" class="settings-box-text">
-      [[noSavedDeviceslabel_]]
+      showSavedDevicesErrorLabel_, showSavedDevicesLoadingLabel)]]"
+      id="noDevices" class="settings-box-text">
+    [[noSavedDeviceslabel_]]
+  </div>
+  <div hidden="[[!showSavedDevicesLoadingLabel]]" id="loadingDevices"
+      class="settings-box-text">
+    [[loadingSavedDevicesLabel_]]
   </div>
   <template is="dom-if"
-      if="[[shouldShowDeviceList_(savedDevices_)]]" restamp>
+      if="[[shouldShowDeviceList_(savedDevices_,
+      showSavedDevicesLoadingLabel)]]" restamp>
     <div class="settings-box-text">
       [[savedDevicesSublabel_]]
     </div>
     <div class="device-list">
       <os-settings-saved-devices-list
           id="savedDevicesList"
-          devices_="[[savedDevices_]]">
+          devices="[[savedDevices_]]">
       </os-settings-saved-devices-list>
     </div>
   </template>
diff --git a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_saved_devices_subpage.js b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_saved_devices_subpage.js
index cfff3d6..e34408c 100644
--- a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_saved_devices_subpage.js
+++ b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_saved_devices_subpage.js
@@ -86,10 +86,25 @@
       },
 
       /** @protected */
+      loadingSavedDevicesLabel_: {
+        type: String,
+        value() {
+          return loadTimeData.getString('loadingDevicesWithEmail');
+        },
+      },
+
+      /** @protected */
       showSavedDevicesErrorLabel_: {
         type: Boolean,
         value: false,
       },
+
+      /** @protected */
+      showSavedDevicesLoadingLabel: {
+        type: Boolean,
+        notify: true,
+        value: true,
+      },
     };
   }
 
@@ -134,6 +149,7 @@
             .STATUS_ERROR_RETRIEVING_FROM_FOOTPRINTS_SERVER) {
       this.showSavedDevicesErrorLabel_ = true;
     }
+    this.showSavedDevicesLoadingLabel = false;
   }
 
   /**
@@ -145,6 +161,7 @@
     // If we're navigating to the Saved Devices page, fetch the devices.
     if (route === routes.BLUETOOTH_SAVED_DEVICES) {
       this.showSavedDevicesErrorLabel_ = false;
+      this.showSavedDevicesLoadingLabel = true;
       this.parentNode.pageTitle =
           loadTimeData.getString('savedDevicesPageName');
       this.browserProxy_.requestFastPairSavedDevices();
@@ -156,8 +173,8 @@
    * @return boolean
    * @private
    */
-  shouldShowDeviceList_(devices) {
-    return devices.length > 0;
+  shouldShowDeviceList_(devices, showLoadingLabel) {
+    return !showLoadingLabel && devices.length > 0;
   }
 
   /**
@@ -166,8 +183,8 @@
    * @return boolean
    * @private
    */
-  shouldShowNoDevicesLabel_(devices, showErrorLabel) {
-    return !showErrorLabel && devices.length === 0;
+  shouldShowNoDevicesLabel_(devices, showLoadingLabel, showErrorLabel) {
+    return !showLoadingLabel && !showErrorLabel && devices.length === 0;
   }
 }
 
diff --git a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_saved_devices_list.html b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_saved_devices_list.html
index 5908d5e..83cb81a 100644
--- a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_saved_devices_list.html
+++ b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_saved_devices_list.html
@@ -9,7 +9,7 @@
 </style>
 <div id="container" class="layout vertical flex" scrollable
     no-bottom-scroll-border>
-  <iron-list id="savedDevicesList" items="[[devices_]]"
+  <iron-list id="savedDevicesList" items="[[devices]]"
       scroll-target="container" preserve-focus>
     <template>
       <os-settings-saved-devices-list-item
@@ -18,7 +18,7 @@
         item-index="[[index]]"
         last-focused="{{lastFocused_}}"
         iron-list-tab-index="[[tabIndex]]"
-        list-size="[[devices_.length]]">
+        list-size="[[devices.length]]">
       </os-settings-saved-devices-list-item>
     </template>
   </iron-list>
diff --git a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_saved_devices_list.js b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_saved_devices_list.js
index a3269dc..6b3bc11b 100644
--- a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_saved_devices_list.js
+++ b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_saved_devices_list.js
@@ -44,9 +44,9 @@
   static get properties() {
     return {
       /**
-       * @protected {Array<!FastPairSavedDevice>}
+       * @public {Array<!FastPairSavedDevice>}
        */
-      devices_: {
+      devices: {
         type: Array,
         observer: 'onDevicesChanged_',
         value: [],
@@ -74,9 +74,9 @@
    */
   removeSavedDevice_(/** @type {CustomEvent} */ event) {
     this.browserProxy_.deleteFastPairSavedDevice(event.detail.key);
-    for (let i = 0; i < this.devices_.length; i++) {
-      if (this.devices_[i].accountKey === event.detail.key) {
-        this.devices_.splice(i, 1);
+    for (let i = 0; i < this.devices.length; i++) {
+      if (this.devices[i].accountKey === event.detail.key) {
+        this.devices.splice(i, 1);
         break;
       }
     }
diff --git a/chrome/browser/resources/settings/chromeos/os_settings.gni b/chrome/browser/resources/settings/chromeos/os_settings.gni
index cd7d910..1018a53e 100644
--- a/chrome/browser/resources/settings/chromeos/os_settings.gni
+++ b/chrome/browser/resources/settings/chromeos/os_settings.gni
@@ -35,6 +35,7 @@
   "chromeos/os_settings_search_box/os_settings_search_box.ts",
   "chromeos/os_settings_ui/os_settings_ui.ts",
   "chromeos/os_toolbar/os_toolbar.ts",
+  "chromeos/personalization_page/personalization_page.ts",
 ]
 
 # Files that are passed as input to html_to_wrapper().
@@ -132,7 +133,7 @@
   "chromeos/os_settings_page/main_page_behavior.js",
   "chromeos/os_settings_routes.js",
   "chromeos/parental_controls_page/parental_controls_browser_proxy.js",
-  "chromeos/personalization_page/personalization_hub_browser_proxy.js",
+  "chromeos/personalization_page/personalization_hub_browser_proxy.ts",
   "chromeos/personalization_search_handler.js",
   "chromeos/pref_to_setting_metric_converter.js",
   "chromeos/prefs_behavior.js",
@@ -327,7 +328,6 @@
   "chromeos/os_search_page/search_subpage.js",
   "chromeos/os_settings_icons_css.js",
   "chromeos/parental_controls_page/parental_controls_page.js",
-  "chromeos/personalization_page/personalization_page.js",
   "chromeos/settings_scheduler_slider/settings_scheduler_slider.js",
 ]
 
diff --git a/chrome/browser/resources/settings/chromeos/os_settings_page/BUILD.gn b/chrome/browser/resources/settings/chromeos/os_settings_page/BUILD.gn
index 7566278..9d93bb4 100644
--- a/chrome/browser/resources/settings/chromeos/os_settings_page/BUILD.gn
+++ b/chrome/browser/resources/settings/chromeos/os_settings_page/BUILD.gn
@@ -37,7 +37,6 @@
     "../os_printing_page:os_printing_page",
     "../os_privacy_page:os_privacy_page",
     "../os_search_page:os_search_page",
-    "../personalization_page:personalization_page",
     "//ui/webui/resources/cr_elements/cr_button:cr_button",
     "//ui/webui/resources/js:assert.m",
     "//ui/webui/resources/js:load_time_data.m",
diff --git a/chrome/browser/resources/settings/chromeos/personalization_page/BUILD.gn b/chrome/browser/resources/settings/chromeos/personalization_page/BUILD.gn
deleted file mode 100644
index 9d8ab26..0000000
--- a/chrome/browser/resources/settings/chromeos/personalization_page/BUILD.gn
+++ /dev/null
@@ -1,38 +0,0 @@
-# Copyright 2019 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//third_party/closure_compiler/compile_js.gni")
-import("//tools/polymer/html_to_js.gni")
-import("../os_settings.gni")
-
-js_type_check("closure_compile_module") {
-  closure_flags = os_settings_closure_flags
-  is_polymer3 = true
-  deps = [
-    ":personalization_hub_browser_proxy",
-    ":personalization_page",
-  ]
-}
-
-js_library("personalization_page") {
-  deps = [
-    ":personalization_hub_browser_proxy",
-    "..:deep_linking_behavior",
-    "..:os_route",
-    "..:prefs_behavior",
-    "..:route_observer_behavior",
-    "../..:router",
-    "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/js:load_time_data.m",
-  ]
-}
-
-js_library("personalization_hub_browser_proxy") {
-  deps = [ "//ui/webui/resources/js:cr.m" ]
-  externs_list = [ "$externs_path/chrome_send.js" ]
-}
-
-html_to_js("web_components") {
-  js_files = [ "personalization_page.js" ]
-}
diff --git a/chrome/browser/resources/settings/chromeos/personalization_page/personalization_hub_browser_proxy.js b/chrome/browser/resources/settings/chromeos/personalization_page/personalization_hub_browser_proxy.js
deleted file mode 100644
index 600352f1..0000000
--- a/chrome/browser/resources/settings/chromeos/personalization_page/personalization_hub_browser_proxy.js
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2021 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-/** @interface */
-export class PersonalizationHubBrowserProxy {
-  openPersonalizationHub() {}
-}
-
-/** @type {?PersonalizationHubBrowserProxy} */
-let instance = null;
-
-/**
- * @implements {PersonalizationHubBrowserProxy}
- */
-export class PersonalizationHubBrowserProxyImpl {
-  /** @return {!PersonalizationHubBrowserProxy} */
-  static getInstance() {
-    return instance || (instance = new PersonalizationHubBrowserProxyImpl());
-  }
-
-  /** @param {!PersonalizationHubBrowserProxy} obj */
-  static setInstanceForTesting(obj) {
-    instance = obj;
-  }
-
-  /** @override */
-  openPersonalizationHub() {
-    chrome.send('openPersonalizationHub');
-  }
-}
diff --git a/chrome/browser/resources/settings/chromeos/personalization_page/personalization_hub_browser_proxy.ts b/chrome/browser/resources/settings/chromeos/personalization_page/personalization_hub_browser_proxy.ts
new file mode 100644
index 0000000..c67f872
--- /dev/null
+++ b/chrome/browser/resources/settings/chromeos/personalization_page/personalization_hub_browser_proxy.ts
@@ -0,0 +1,24 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+export interface PersonalizationHubBrowserProxy {
+  openPersonalizationHub(): void;
+}
+
+let instance: PersonalizationHubBrowserProxy|null = null;
+
+export class PersonalizationHubBrowserProxyImpl implements
+    PersonalizationHubBrowserProxy {
+  static getInstance(): PersonalizationHubBrowserProxy {
+    return instance || (instance = new PersonalizationHubBrowserProxyImpl());
+  }
+
+  static setInstanceForTesting(obj: PersonalizationHubBrowserProxy) {
+    instance = obj;
+  }
+
+  openPersonalizationHub() {
+    chrome.send('openPersonalizationHub');
+  }
+}
diff --git a/chrome/browser/resources/settings/chromeos/personalization_page/personalization_page.html b/chrome/browser/resources/settings/chromeos/personalization_page/personalization_page.html
index ffb20436..2152aa0 100644
--- a/chrome/browser/resources/settings/chromeos/personalization_page/personalization_page.html
+++ b/chrome/browser/resources/settings/chromeos/personalization_page/personalization_page.html
@@ -1,6 +1,5 @@
 <style include="settings-shared"></style>
-<settings-animated-pages id="pages" section="personalization"
-    focus-config="[[focusConfig_]]">
+<settings-animated-pages id="pages" section="personalization">
   <div route-path="default">
     <template is="dom-if" if="[[isPersonalizationHubEnabled_]]">
       <cr-link-row class="hr" id="personalizationHubButton"
diff --git a/chrome/browser/resources/settings/chromeos/personalization_page/personalization_page.js b/chrome/browser/resources/settings/chromeos/personalization_page/personalization_page.js
deleted file mode 100644
index c515f74e..0000000
--- a/chrome/browser/resources/settings/chromeos/personalization_page/personalization_page.js
+++ /dev/null
@@ -1,110 +0,0 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-/**
- * 'settings-personalization-page' is the settings page containing
- * personalization settings.
- */
-import 'chrome://resources/cr_elements/cr_link_row/cr_link_row.js';
-import '../../settings_page/settings_animated_pages.js';
-import '../../settings_page/settings_subpage.js';
-import '../../settings_shared.css.js';
-
-import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-
-import {loadTimeData} from '../../i18n_setup.js';
-import {Setting} from '../../mojom-webui/setting.mojom-webui.js';
-import {Route, Router} from '../../router.js';
-import {DeepLinkingBehavior, DeepLinkingBehaviorInterface} from '../deep_linking_behavior.js';
-import {routes} from '../os_route.js';
-import {RouteObserverBehavior, RouteObserverBehaviorInterface} from '../route_observer_behavior.js';
-
-import {PersonalizationHubBrowserProxy, PersonalizationHubBrowserProxyImpl} from './personalization_hub_browser_proxy.js';
-
-/**
- * @constructor
- * @extends {PolymerElement}
- * @implements {DeepLinkingBehaviorInterface}
- * @implements {RouteObserverBehaviorInterface}
- */
-const SettingsPersonalizationPageElementBase = mixinBehaviors(
-    [DeepLinkingBehavior, RouteObserverBehavior], PolymerElement);
-
-/** @polymer */
-class SettingsPersonalizationPageElement extends
-    SettingsPersonalizationPageElementBase {
-  static get is() {
-    return 'settings-personalization-page';
-  }
-
-  static get template() {
-    return html`{__html_template__}`;
-  }
-
-  static get properties() {
-    return {
-      /**
-       * Preferences state.
-       */
-      prefs: Object,
-
-      /** @private */
-      isPersonalizationHubEnabled_: {
-        type: Boolean,
-        value() {
-          return loadTimeData.getBoolean('isPersonalizationHubEnabled');
-        },
-        readOnly: true,
-      },
-
-      /** @private {!Map<string, string>} */
-      focusConfig_: {
-        type: Object,
-        value() {
-          const map = new Map();
-          return map;
-        },
-      },
-
-      /**
-       * Used by DeepLinkingBehavior to focus this page's deep links.
-       * @type {!Set<!Setting>}
-       */
-      supportedSettingIds: {
-        type: Object,
-        value: () => new Set([Setting.kOpenWallpaper]),
-      },
-    };
-  }
-
-  /** @override */
-  constructor() {
-    super();
-
-    /** @private {!PersonalizationHubBrowserProxy} */
-    this.personalizationHubBrowserProxy_ =
-        PersonalizationHubBrowserProxyImpl.getInstance();
-  }
-
-  /**
-   * @param {!Route} route
-   * @param {!Route=} oldRoute
-   */
-  currentRouteChanged(route, oldRoute) {
-    // Does not apply to this page.
-    if (route !== routes.PERSONALIZATION) {
-      return;
-    }
-
-    this.attemptDeepLink();
-  }
-
-  /** @private */
-  openPersonalizationHub_() {
-    this.personalizationHubBrowserProxy_.openPersonalizationHub();
-  }
-}
-
-customElements.define(
-    SettingsPersonalizationPageElement.is, SettingsPersonalizationPageElement);
diff --git a/chrome/browser/resources/settings/chromeos/personalization_page/personalization_page.ts b/chrome/browser/resources/settings/chromeos/personalization_page/personalization_page.ts
new file mode 100644
index 0000000..c4512ac
--- /dev/null
+++ b/chrome/browser/resources/settings/chromeos/personalization_page/personalization_page.ts
@@ -0,0 +1,68 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview
+ * 'settings-personalization-page' is the settings page containing
+ * personalization settings.
+ */
+import 'chrome://resources/cr_elements/cr_link_row/cr_link_row.js';
+import '../../settings_page/settings_animated_pages.js';
+import '../../settings_page/settings_subpage.js';
+import '../../settings_shared.css.js';
+
+import {I18nMixin, I18nMixinInterface} from 'chrome://resources/js/i18n_mixin.js';
+import {mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+import {loadTimeData} from '../../i18n_setup.js';
+
+import {PersonalizationHubBrowserProxy, PersonalizationHubBrowserProxyImpl} from './personalization_hub_browser_proxy.js';
+import {getTemplate} from './personalization_page.html.js';
+
+const SettingsPersonalizationPageElementBase =
+    mixinBehaviors([], I18nMixin(PolymerElement)) as {
+      new (): PolymerElement & I18nMixinInterface,
+    };
+
+
+class SettingsPersonalizationPageElement extends
+    SettingsPersonalizationPageElementBase {
+  static get is() {
+    return 'settings-personalization-page';
+  }
+
+  static get template() {
+    return getTemplate();
+  }
+
+  static get properties() {
+    return {
+      isPersonalizationHubEnabled_: {
+        type: Boolean,
+        value() {
+          return loadTimeData.getBoolean('isPersonalizationHubEnabled');
+        },
+        readOnly: true,
+      },
+    };
+  }
+
+  private isPersonalizationHubEnabled_: boolean;
+
+  private personalizationHubBrowserProxy_: PersonalizationHubBrowserProxy;
+
+  constructor() {
+    super();
+
+    this.personalizationHubBrowserProxy_ =
+        PersonalizationHubBrowserProxyImpl.getInstance();
+  }
+
+  private openPersonalizationHub_() {
+    this.personalizationHubBrowserProxy_.openPersonalizationHub();
+  }
+}
+
+customElements.define(
+    SettingsPersonalizationPageElement.is, SettingsPersonalizationPageElement);
diff --git a/chrome/browser/resources/signin/enterprise_profile_welcome/enterprise_profile_welcome_app.html b/chrome/browser/resources/signin/enterprise_profile_welcome/enterprise_profile_welcome_app.html
index 4d889e06..20b2a77 100644
--- a/chrome/browser/resources/signin/enterprise_profile_welcome/enterprise_profile_welcome_app.html
+++ b/chrome/browser/resources/signin/enterprise_profile_welcome/enterprise_profile_welcome_app.html
@@ -4,6 +4,7 @@
     --banner-height: 244px;
     --banner-size: auto;
     --footer-margin: 40px;
+    --content-container-margin-inline: auto;
     --content-container-margin-bottom: calc(48px + var(--footer-margin));
     --content-container-margin-top: 104px;
     --info-box-margin-inline: auto;
@@ -18,9 +19,15 @@
     --avatar-size: 76px;
     --banner-height: 128px;
     --banner-size: 90% 90%;
+    --content-container-margin-inline: 32px;
     --content-container-margin-bottom: 0;
-    --content-container-margin-top: 96px;
+    --content-container-margin-top: 72px;
+<if expr="chromeos_lacros">
     --info-box-margin-inline: 32px;
+</if>
+<if expr="not chromeos_lacros">
+    --info-box-margin-inline: 0;
+</if>
     --info-box-margin-top: 28px;
     --info-box-width: auto;
     --footer-margin: 16px;
@@ -156,7 +163,7 @@
     font-size: var(--content-container-font-size);
     line-height: var(--content-container-line-height);
     margin-bottom: var(--content-container-margin-bottom);
-    margin-inline: auto;
+    margin-inline: var(--content-container-margin-inline);
     margin-top: var(--content-container-margin-top);
     text-align: center;
     width: var(--content-container-width);
@@ -220,7 +227,7 @@
   }
 
   #linkData {
-    margin: 16px;
+    margin: 16px 32px;
   }
 
   @media (prefers-color-scheme: dark) {
diff --git a/chrome/browser/resources/webui_gallery/demos/cr_radio_demo.html b/chrome/browser/resources/webui_gallery/demos/cr_radio_demo.html
index fdcb4235..e9567b59 100644
--- a/chrome/browser/resources/webui_gallery/demos/cr_radio_demo.html
+++ b/chrome/browser/resources/webui_gallery/demos/cr_radio_demo.html
@@ -14,7 +14,7 @@
             <cr-radio-button name="option1" label="Option 1"></cr-radio-button>
             <cr-radio-button name="option2" label="Option 2"></cr-radio-button>
             <cr-radio-button name="option3" label="Option 3">
-              With slotted content
+              <div>With slotted content</div>
             </cr-radio-button>
           </cr-radio-group>
 
diff --git a/chrome/browser/supervised_user/kids_chrome_management/kids_external_fetcher.cc b/chrome/browser/supervised_user/kids_chrome_management/kids_external_fetcher.cc
index 0106eae..7eae34c 100644
--- a/chrome/browser/supervised_user/kids_chrome_management/kids_external_fetcher.cc
+++ b/chrome/browser/supervised_user/kids_chrome_management/kids_external_fetcher.cc
@@ -131,7 +131,7 @@
         url_loader_factory_.get(),
         base::BindOnce(&FetcherImpl::OnSimpleUrlLoaderComplete,
                        weak_ptr_factory_.GetSafeRef()));
-  };
+  }
 
   // Not copyable
   FetcherImpl(const FetcherImpl&) = delete;
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index 0e7d1d9..ceb13a0 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -865,8 +865,6 @@
       "fast_checkout/fast_checkout_view.h",
       "javascript_dialogs/javascript_tab_modal_dialog_manager_delegate_android.cc",
       "javascript_dialogs/javascript_tab_modal_dialog_manager_delegate_android.h",
-      "page_info/about_this_site_message_delegate_android.cc",
-      "page_info/about_this_site_message_delegate_android.h",
       "page_info/chrome_page_info_client.cc",
       "page_info/chrome_page_info_client.h",
       "screen_capture_notification_ui_stub.cc",
@@ -4320,6 +4318,8 @@
       "views/commander_frontend_views.h",
       "views/commerce/ntp_discount_consent_dialog_view.cc",
       "views/commerce/ntp_discount_consent_dialog_view.h",
+      "views/commerce/price_tracking_view.cc",
+      "views/commerce/price_tracking_view.h",
       "views/confirm_bubble_views.cc",
       "views/confirm_bubble_views.h",
       "views/constrained_web_dialog_delegate_views.cc",
@@ -5178,6 +5178,7 @@
       "//base",
       "//chrome/browser/ui/views",
       "//components/commerce/core:public",
+      "//components/commerce/core:shopping_service",
       "//components/constrained_window",
       "//components/content_settings/browser/ui",
       "//components/fullscreen_control",
diff --git a/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenu.java b/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenu.java
index e991c9be..b42c2c36 100644
--- a/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenu.java
+++ b/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenu.java
@@ -42,7 +42,6 @@
 import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.base.task.PostTask;
 import org.chromium.base.task.TaskTraits;
-import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.ui.appmenu.internal.R;
 import org.chromium.components.browser_ui.styles.ChromeColors;
 import org.chromium.components.browser_ui.widget.chips.ChipView;
@@ -300,8 +299,7 @@
                 popupHeight, anchorView.getRootView().getLayoutDirection());
         mPopup.setContentView(contentView);
 
-        if (!ChromeFeatureList.sCctResizableWindowAboveNavbar.isEnabled()
-                && popupHeight + popupPosition[1] > visibleDisplayFrame.bottom) {
+        if (popupHeight + popupPosition[1] > visibleDisplayFrame.bottom) {
             mPopup.setHeight(visibleDisplayFrame.height());
         }
 
diff --git a/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuHandlerImpl.java b/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuHandlerImpl.java
index 0fb91a7..5574ff5 100644
--- a/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuHandlerImpl.java
+++ b/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuHandlerImpl.java
@@ -20,7 +20,6 @@
 import org.chromium.base.Callback;
 import org.chromium.base.metrics.RecordUserAction;
 import org.chromium.base.supplier.Supplier;
-import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher;
 import org.chromium.chrome.browser.lifecycle.ConfigurationChangedObserver;
 import org.chromium.chrome.browser.lifecycle.StartStopWithNativeObserver;
@@ -200,14 +199,7 @@
         registerViewBinders(customViewBinders, customViewTypeOffsetMap, adapter,
                 mDelegate.shouldShowIconBeforeItem());
 
-        Rect appRect;
-        if (ChromeFeatureList.sCctResizableWindowAboveNavbar.isEnabled()) {
-            // Get the height and width of the display.
-            appRect = new Rect();
-            mDecorView.getWindowVisibleDisplayFrame(appRect);
-        } else {
-            appRect = mAppRect.get();
-        }
+        Rect appRect = mAppRect.get();
 
         // Use full size of window for abnormal appRect.
         if (appRect.left < 0 && appRect.top < 0) {
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarCoordinator.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarCoordinator.java
index 40b862f..f84807b 100644
--- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarCoordinator.java
+++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarCoordinator.java
@@ -18,6 +18,7 @@
 import org.chromium.base.supplier.BooleanSupplier;
 import org.chromium.base.supplier.ObservableSupplier;
 import org.chromium.base.supplier.Supplier;
+import org.chromium.chrome.browser.device.DeviceClassManager;
 import org.chromium.chrome.browser.layouts.LayoutType;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.tabmodel.IncognitoStateProvider;
@@ -64,7 +65,7 @@
             ObservableSupplier<Boolean> identityDiscStateSupplier, ThemeColorProvider provider,
             MenuButtonCoordinator menuButtonCoordinator,
             Supplier<ButtonData> identityDiscButtonSupplier, boolean isGridTabSwitcherEnabled,
-            boolean isTabGroupsAndroidContinuationEnabled,
+            boolean isTabToGtsAnimationEnabled, boolean isTabGroupsAndroidContinuationEnabled,
             BooleanSupplier isIncognitoModeEnabledSupplier,
             ObservableSupplier<Profile> profileSupplier,
             Callback<LoadUrlParams> logoClickedCallback, boolean isRefactorEnabled) {
@@ -81,6 +82,8 @@
                                 isGridTabSwitcherEnabled)
                         .build();
 
+        boolean isTabToGtsFadeAnimationEnabled = isTabToGtsAnimationEnabled
+                && !DeviceClassManager.enableAccessibilityLayout(mStub.getContext());
         mToolbarMediator = new StartSurfaceToolbarMediator(mPropertyModel,
                 (iphCommandBuilder)
                         -> {
@@ -93,8 +96,9 @@
                 StartSurfaceConfiguration.START_SURFACE_HIDE_INCOGNITO_SWITCH_NO_TAB.getValue(),
                 menuButtonCoordinator, identityDiscStateSupplier, identityDiscButtonSupplier,
                 StartSurfaceConfiguration.TAB_COUNT_BUTTON_ON_START_SURFACE.getValue(),
-                isTabGroupsAndroidContinuationEnabled, isIncognitoModeEnabledSupplier,
-                profileSupplier, logoClickedCallback, isRefactorEnabled);
+                isTabToGtsFadeAnimationEnabled, isTabGroupsAndroidContinuationEnabled,
+                isIncognitoModeEnabledSupplier, profileSupplier, logoClickedCallback,
+                isRefactorEnabled);
 
         mThemeColorProvider = provider;
         mMenuButtonCoordinator = menuButtonCoordinator;
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarMediator.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarMediator.java
index 3df9b51..c0f4c84 100644
--- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarMediator.java
+++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarMediator.java
@@ -5,6 +5,7 @@
 package org.chromium.chrome.browser.toolbar.top;
 
 import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.ACCESSIBILITY_ENABLED;
+import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.ALPHA;
 import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.BUTTONS_CLICKABLE;
 import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.IDENTITY_DISC_AT_START;
 import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.IDENTITY_DISC_CLICK_HANDLER;
@@ -26,6 +27,7 @@
 import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.TAB_SWITCHER_BUTTON_IS_VISIBLE;
 import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.TRANSLATION_Y;
 
+import android.animation.Animator;
 import android.view.View;
 
 import androidx.annotation.VisibleForTesting;
@@ -52,8 +54,11 @@
 import org.chromium.chrome.browser.user_education.IPHCommandBuilder;
 import org.chromium.chrome.browser.util.ChromeAccessibilityUtil;
 import org.chromium.chrome.features.start_surface.StartSurfaceState;
+import org.chromium.components.browser_ui.widget.animation.CancelAwareAnimatorListener;
+import org.chromium.components.browser_ui.widget.animation.Interpolators;
 import org.chromium.content_public.browser.LoadUrlParams;
 import org.chromium.ui.modelutil.PropertyModel;
+import org.chromium.ui.modelutil.PropertyModelAnimatorFactory;
 
 /** The mediator implements interacts between the views and the caller. */
 class StartSurfaceToolbarMediator {
@@ -63,6 +68,7 @@
     private final boolean mShouldShowTabSwitcherButtonOnHomepage;
     private final Supplier<ButtonData> mIdentityDiscButtonSupplier;
     private final boolean mIsTabGroupsAndroidContinuationEnabled;
+    private final boolean mIsTabToGtsFadeAnimationEnabled;
     private final BooleanSupplier mIsIncognitoModeEnabledSupplier;
     private final MenuButtonCoordinator mMenuButtonCoordinator;
     private final TabModelSelectorObserver mTabModelSelectorObserver;
@@ -86,12 +92,14 @@
     private LogoLoadHelper mLogoLoadHelper;
     private LogoView mLogoView;
 
+    private Animator mAlphaAnimator;
+
     StartSurfaceToolbarMediator(PropertyModel model,
             Callback<IPHCommandBuilder> showIdentityIPHCallback,
             boolean hideIncognitoSwitchWhenNoTabs, MenuButtonCoordinator menuButtonCoordinator,
             ObservableSupplier<Boolean> identityDiscStateSupplier,
             Supplier<ButtonData> identityDiscButtonSupplier,
-            boolean shouldShowTabSwitcherButtonOnHomepage,
+            boolean shouldShowTabSwitcherButtonOnHomepage, boolean isTabToGtsFadeAnimationEnabled,
             boolean isTabGroupsAndroidContinuationEnabled,
             BooleanSupplier isIncognitoModeEnabledSupplier,
             ObservableSupplier<Profile> profileSupplier,
@@ -102,6 +110,7 @@
         mHideIncognitoSwitchWhenNoTabs = hideIncognitoSwitchWhenNoTabs;
         mMenuButtonCoordinator = menuButtonCoordinator;
         mIdentityDiscButtonSupplier = identityDiscButtonSupplier;
+        mIsTabToGtsFadeAnimationEnabled = isTabToGtsFadeAnimationEnabled;
         mIsTabGroupsAndroidContinuationEnabled = isTabGroupsAndroidContinuationEnabled;
         mIsIncognitoModeEnabledSupplier = isIncognitoModeEnabledSupplier;
         mProfileSupplier = profileSupplier;
@@ -165,6 +174,7 @@
 
     void onStartSurfaceStateChanged(@StartSurfaceState int newState,
             boolean shouldShowStartSurfaceToolbar, @LayoutType int newLayoutType) {
+        boolean wasOnGridTabSwitcher = isOnGridTabSwitcher();
         mStartSurfaceState = newState;
         mLayoutType = newLayoutType;
         updateLogoVisibility();
@@ -173,7 +183,7 @@
         updateNewTabViewVisibility();
         updateIdentityDisc(mIdentityDiscButtonSupplier.get());
         updateAppMenuUpdateBadgeSuppression();
-        setStartSurfaceToolbarVisibility(shouldShowStartSurfaceToolbar);
+        setStartSurfaceToolbarVisibility(shouldShowStartSurfaceToolbar, wasOnGridTabSwitcher);
         updateButtonsClickable(shouldShowStartSurfaceToolbar);
         updateTranslationY(mNonIncognitoHomepageTranslationY);
     }
@@ -297,10 +307,6 @@
         return mTabModelSelector.getModel(true).getCount() != 0;
     }
 
-    void setStartSurfaceToolbarVisibility(boolean shouldShowStartSurfaceToolbar) {
-        mPropertyModel.set(IS_VISIBLE, shouldShowStartSurfaceToolbar);
-    }
-
     void setIncognitoStateProvider(IncognitoStateProvider provider) {
         mPropertyModel.set(INCOGNITO_STATE_PROVIDER, provider);
     }
@@ -326,6 +332,49 @@
         mLogoLoadHelper = new LogoLoadHelper(mProfileSupplier, mLogoClickedCallback, logoView);
     }
 
+    private void setStartSurfaceToolbarVisibility(
+            boolean shouldShowStartSurfaceToolbar, boolean wasOnGridTabSwitcher) {
+        if (mPropertyModel.get(IS_VISIBLE) == shouldShowStartSurfaceToolbar) return;
+
+        if (mAlphaAnimator != null) {
+            mAlphaAnimator.cancel();
+            mAlphaAnimator = null;
+        }
+
+        // Only show cross fade animation when switching between tab and grid tab switcher surface.
+        // When switching between Start surface and grid tab switcher, the visibility won't change,
+        // so it's shortcut above.
+        boolean shouldShowAnimation =
+                mIsTabToGtsFadeAnimationEnabled && (wasOnGridTabSwitcher || isOnGridTabSwitcher());
+
+        if (!shouldShowAnimation) {
+            finishAlphaAnimator(shouldShowStartSurfaceToolbar);
+            return;
+        }
+
+        mPropertyModel.set(IS_VISIBLE, true);
+        mPropertyModel.set(ALPHA, shouldShowStartSurfaceToolbar ? 0.0f : 1.0f);
+        float targetAlpha = shouldShowStartSurfaceToolbar ? 1.0f : 0.0f;
+        final long duration = TopToolbarCoordinator.TAB_SWITCHER_MODE_GTS_ANIMATION_DURATION_MS;
+        mAlphaAnimator = PropertyModelAnimatorFactory.ofFloat(mPropertyModel, ALPHA, targetAlpha);
+        mAlphaAnimator.setDuration(duration);
+        mAlphaAnimator.setStartDelay(shouldShowStartSurfaceToolbar ? duration : 0);
+        mAlphaAnimator.setInterpolator(Interpolators.LINEAR_INTERPOLATOR);
+        mAlphaAnimator.addListener(new CancelAwareAnimatorListener() {
+            @Override
+            public void onEnd(Animator animation) {
+                finishAlphaAnimator(shouldShowStartSurfaceToolbar);
+            }
+        });
+        mAlphaAnimator.start();
+    }
+
+    private void finishAlphaAnimator(boolean shouldShowStartSurfaceToolbar) {
+        mPropertyModel.set(ALPHA, 1.0f);
+        mPropertyModel.set(IS_VISIBLE, shouldShowStartSurfaceToolbar);
+        mAlphaAnimator = null;
+    }
+
     private void updateLogoVisibility() {
         if (mLogoLoadHelper != null) {
             mLogoLoadHelper.maybeLoadSearchProviderLogoOnHomepage(isOnHomepage(),
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarProperties.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarProperties.java
index c724208..00635d3 100644
--- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarProperties.java
+++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarProperties.java
@@ -73,6 +73,8 @@
 
     public static final PropertyModel.WritableFloatPropertyKey TRANSLATION_Y =
             new PropertyModel.WritableFloatPropertyKey();
+    public static final PropertyModel.WritableFloatPropertyKey ALPHA =
+            new PropertyModel.WritableFloatPropertyKey();
 
     public static final PropertyKey[] ALL_KEYS = new PropertyKey[] {NEW_TAB_CLICK_HANDLER,
             IS_NEW_TAB_ENABLED, IS_VISIBLE, LOGO_IS_VISIBLE, IS_INCOGNITO, INCOGNITO_STATE_PROVIDER,
@@ -80,6 +82,6 @@
             NEW_TAB_VIEW_TEXT_IS_VISIBLE, BUTTONS_CLICKABLE, GRID_TAB_SWITCHER_ENABLED,
             IDENTITY_DISC_AT_START, INCOGNITO_SWITCHER_VISIBLE, IDENTITY_DISC_IS_VISIBLE,
             IDENTITY_DISC_CLICK_HANDLER, IDENTITY_DISC_IMAGE, IDENTITY_DISC_DESCRIPTION,
-            NEW_TAB_BUTTON_HIGHLIGHT, TRANSLATION_Y, TAB_SWITCHER_BUTTON_IS_VISIBLE,
+            NEW_TAB_BUTTON_HIGHLIGHT, TRANSLATION_Y, ALPHA, TAB_SWITCHER_BUTTON_IS_VISIBLE,
             INCOGNITO_TAB_COUNT_PROVIDER, INCOGNITO_TAB_MODEL_SELECTOR};
 }
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarViewBinder.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarViewBinder.java
index 5e6f00d2..44ec7bf 100644
--- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarViewBinder.java
+++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarViewBinder.java
@@ -5,6 +5,7 @@
 package org.chromium.chrome.browser.toolbar.top;
 
 import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.ACCESSIBILITY_ENABLED;
+import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.ALPHA;
 import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.BUTTONS_CLICKABLE;
 import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.GRID_TAB_SWITCHER_ENABLED;
 import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.IDENTITY_DISC_AT_START;
@@ -75,6 +76,8 @@
             view.setNewTabViewTextVisibility(model.get(NEW_TAB_VIEW_TEXT_IS_VISIBLE));
         } else if (propertyKey == TRANSLATION_Y) {
             view.setTranslationY(model.get(TRANSLATION_Y));
+        } else if (propertyKey == ALPHA) {
+            view.setAlpha(model.get(ALPHA));
         } else if (propertyKey == TAB_SWITCHER_BUTTON_IS_VISIBLE) {
             view.setTabSwitcherButtonVisibility(model.get(TAB_SWITCHER_BUTTON_IS_VISIBLE));
         } else if (propertyKey == INCOGNITO_TAB_COUNT_PROVIDER) {
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator.java
index ebdd1eb..15b5e3e0 100644
--- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator.java
+++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator.java
@@ -170,9 +170,10 @@
             mStartSurfaceToolbarCoordinator = new StartSurfaceToolbarCoordinator(toolbarStub,
                     userEducationHelper, identityDiscStateSupplier, overviewThemeColorProvider,
                     overviewModeMenuButtonCoordinator, identityDiscButtonSupplier,
-                    isGridTabSwitcherEnabled, isTabGroupsAndroidContinuationEnabled,
-                    isIncognitoModeEnabledSupplier, profileSupplier,
-                    startSurfaceLogoClickedCallback, mIsStartSurfaceRefactorEnabled);
+                    isGridTabSwitcherEnabled, isTabToGtsAnimationEnabled,
+                    isTabGroupsAndroidContinuationEnabled, isIncognitoModeEnabledSupplier,
+                    profileSupplier, startSurfaceLogoClickedCallback,
+                    mIsStartSurfaceRefactorEnabled);
         } else if (mToolbarLayout instanceof ToolbarPhone || isTabletGridTabSwitcherEnabled()) {
             mTabSwitcherModeCoordinator = new TabSwitcherModeTTCoordinator(toolbarStub,
                     fullscreenToolbarStub, overviewModeMenuButtonCoordinator,
diff --git a/chrome/browser/ui/app_list/search/omnibox_provider.cc b/chrome/browser/ui/app_list/search/omnibox_provider.cc
index f5858960..dadabbe 100644
--- a/chrome/browser/ui/app_list/search/omnibox_provider.cc
+++ b/chrome/browser/ui/app_list/search/omnibox_provider.cc
@@ -32,8 +32,8 @@
 #include "components/favicon/core/favicon_service.h"
 #include "components/omnibox/browser/autocomplete_classifier.h"
 #include "components/omnibox/browser/autocomplete_input.h"
-#include "components/search_engines/omnibox_focus_type.h"
 #include "third_party/metrics_proto/omnibox_event.pb.h"
+#include "third_party/metrics_proto/omnibox_focus_type.pb.h"
 #include "url/gurl.h"
 
 namespace app_list {
@@ -122,7 +122,7 @@
   // Sets the |from_omnibox_focus| flag to enable ZeroSuggestProvider to process
   // the requests from app_list.
   if (input_.text().empty()) {
-    input_.set_focus_type(OmniboxFocusType::ON_FOCUS);
+    input_.set_focus_type(metrics::OmniboxFocusType::INTERACTION_FOCUS);
     is_zero_state_input_ = true;
   } else {
     is_zero_state_input_ = false;
diff --git a/chrome/browser/ui/ash/device_scheduled_reboot/scheduled_reboot_dialog.cc b/chrome/browser/ui/ash/device_scheduled_reboot/scheduled_reboot_dialog.cc
index 1125693..584e772 100644
--- a/chrome/browser/ui/ash/device_scheduled_reboot/scheduled_reboot_dialog.cc
+++ b/chrome/browser/ui/ash/device_scheduled_reboot/scheduled_reboot_dialog.cc
@@ -45,7 +45,7 @@
           .AddOkButton(base::OnceClosure())
           .AddCancelButton(std::move(reboot_callback),
                            l10n_util::GetStringUTF16(IDS_POLICY_REBOOT_BUTTON))
-          .AddBodyText(
+          .AddParagraph(
               ui::DialogModelLabel(
                   l10n_util::GetStringFUTF16(
                       IDS_POLICY_DEVICE_SCHEDULED_REBOOT_DIALOG_MESSAGE,
diff --git a/chrome/browser/ui/browser_element_identifiers.cc b/chrome/browser/ui/browser_element_identifiers.cc
index 759cf58..644f33e 100644
--- a/chrome/browser/ui/browser_element_identifiers.cc
+++ b/chrome/browser/ui/browser_element_identifiers.cc
@@ -18,6 +18,7 @@
 DEFINE_ELEMENT_IDENTIFIER_VALUE(kLocationIconElementId);
 DEFINE_ELEMENT_IDENTIFIER_VALUE(kMediaButtonElementId);
 DEFINE_ELEMENT_IDENTIFIER_VALUE(kOmniboxElementId);
+DEFINE_ELEMENT_IDENTIFIER_VALUE(kPriceTrackingBookmarkViewElementId);
 DEFINE_ELEMENT_IDENTIFIER_VALUE(kReadLaterButtonElementId);
 DEFINE_ELEMENT_IDENTIFIER_VALUE(kReadLaterSidePanelWebViewElementId);
 DEFINE_ELEMENT_IDENTIFIER_VALUE(kSidePanelCloseButtonElementId);
diff --git a/chrome/browser/ui/browser_element_identifiers.h b/chrome/browser/ui/browser_element_identifiers.h
index 7b814ae..b1f450a 100644
--- a/chrome/browser/ui/browser_element_identifiers.h
+++ b/chrome/browser/ui/browser_element_identifiers.h
@@ -27,6 +27,7 @@
 DECLARE_ELEMENT_IDENTIFIER_VALUE(kLocationIconElementId);
 DECLARE_ELEMENT_IDENTIFIER_VALUE(kMediaButtonElementId);
 DECLARE_ELEMENT_IDENTIFIER_VALUE(kOmniboxElementId);
+DECLARE_ELEMENT_IDENTIFIER_VALUE(kPriceTrackingBookmarkViewElementId);
 DECLARE_ELEMENT_IDENTIFIER_VALUE(kReadLaterButtonElementId);
 DECLARE_ELEMENT_IDENTIFIER_VALUE(kReadLaterSidePanelWebViewElementId);
 DECLARE_ELEMENT_IDENTIFIER_VALUE(kSidePanelCloseButtonElementId);
diff --git a/chrome/browser/ui/browser_window.h b/chrome/browser/ui/browser_window.h
index 43d0b31..f5594f1 100644
--- a/chrome/browser/ui/browser_window.h
+++ b/chrome/browser/ui/browser_window.h
@@ -466,12 +466,9 @@
       bool is_user_gesture) = 0;
 
   // Shows the Partial Translate bubble.
-  virtual void ShowPartialTranslateBubble(
-      PartialTranslateBubbleModel::ViewState view_state,
-      const std::string& source_language,
-      const std::string& target_language,
-      const std::u16string& text_selection,
-      translate::TranslateErrors::Type error_type) = 0;
+  virtual void StartPartialTranslate(const std::string& source_language,
+                                     const std::string& target_language,
+                                     const std::u16string& text_selection) = 0;
 
   // Shows the one-click sign in confirmation UI. |email| holds the full email
   // address of the account that has signed in.
diff --git a/chrome/browser/ui/chrome_pages.h b/chrome/browser/ui/chrome_pages.h
index d0bd9bc..e0ffc4b6d 100644
--- a/chrome/browser/ui/chrome_pages.h
+++ b/chrome/browser/ui/chrome_pages.h
@@ -92,6 +92,7 @@
   kFeedbackSourceDesksTemplates,
   kFeedbackSourceFilesApp,
   kFeedbackSourceChannelIndicator,
+  kFeedbackSourceLauncher,
 
   // Must be last.
   kFeedbackSourceCount,
diff --git a/chrome/browser/ui/cocoa/apps/app_shim_menu_controller_mac_browsertest.mm b/chrome/browser/ui/cocoa/apps/app_shim_menu_controller_mac_browsertest.mm
index 02c2076..dd19532 100644
--- a/chrome/browser/ui/cocoa/apps/app_shim_menu_controller_mac_browsertest.mm
+++ b/chrome/browser/ui/cocoa/apps/app_shim_menu_controller_mac_browsertest.mm
@@ -74,19 +74,24 @@
   }
 
   void CheckHasAppMenus(const extensions::Extension* app) const {
-    const int kExtraTopLevelItems = 4;
     NSArray* item_array = [[NSApp mainMenu] itemArray];
-    ASSERT_EQ(initial_menu_item_count_ + kExtraTopLevelItems,
-              [item_array count]);
-    for (NSUInteger i = 0; i < initial_menu_item_count_; ++i)
+    ASSERT_EQ(initial_menu_item_count_, [item_array count]);
+
+    // The extra app menus are added from the start when NSApp has an activation
+    // policy.
+    const int kExtraTopLevelItems = 4;
+    for (NSUInteger i = 0; i < initial_menu_item_count_ - kExtraTopLevelItems;
+         ++i) {
       EXPECT_TRUE([item_array[i] isHidden]);
-    NSMenuItem* app_menu = item_array[initial_menu_item_count_];
+    }
+
+    NSMenuItem* app_menu =
+        item_array[initial_menu_item_count_ - kExtraTopLevelItems];
     EXPECT_EQ(app->id(), base::SysNSStringToUTF8([app_menu title]));
     EXPECT_EQ(app->name(),
               base::SysNSStringToUTF8([[app_menu submenu] title]));
-    for (NSUInteger i = initial_menu_item_count_;
-         i < initial_menu_item_count_ + kExtraTopLevelItems;
-         ++i) {
+    for (NSUInteger i = initial_menu_item_count_ - kExtraTopLevelItems;
+         i < initial_menu_item_count_; ++i) {
       NSMenuItem* menu = item_array[i];
       EXPECT_GT([[menu submenu] numberOfItems], 0);
       EXPECT_FALSE([menu isHidden]);
@@ -94,10 +99,14 @@
   }
 
   void CheckNoAppMenus() const {
+    const int kExtraTopLevelItems = 4;
     NSArray* item_array = [[NSApp mainMenu] itemArray];
-    EXPECT_EQ(initial_menu_item_count_, [item_array count]);
-    for (NSUInteger i = 0; i < initial_menu_item_count_; ++i)
+    EXPECT_EQ(initial_menu_item_count_ - kExtraTopLevelItems,
+              [item_array count]);
+    for (NSUInteger i = 0; i < initial_menu_item_count_ - kExtraTopLevelItems;
+         ++i) {
       EXPECT_FALSE([item_array[i] isHidden]);
+    }
   }
 
   void CheckEditMenu(const extensions::Extension* app) const {
diff --git a/chrome/browser/ui/cocoa/apps/native_app_window_cocoa_browsertest.mm b/chrome/browser/ui/cocoa/apps/native_app_window_cocoa_browsertest.mm
index dc922914..b1695e58 100644
--- a/chrome/browser/ui/cocoa/apps/native_app_window_cocoa_browsertest.mm
+++ b/chrome/browser/ui/cocoa/apps/native_app_window_cocoa_browsertest.mm
@@ -589,20 +589,28 @@
 
 // Test that the colored frames have the correct color when active and inactive.
 // Disabled; https://crbug.com/1322741.
-IN_PROC_BROWSER_TEST_F(NativeAppWindowCocoaBrowserTest, DISABLED_FrameColor) {
+IN_PROC_BROWSER_TEST_F(NativeAppWindowCocoaBrowserTest, FrameColor) {
+  EXPECT_EQ(NSApp.activationPolicy, NSApplicationActivationPolicyAccessory);
+
   // The hex values indicate an RGB color. When we get the NSColor later, the
   // components are CGFloats in the range [0, 1].
   extensions::AppWindow* app_window = CreateTestAppWindow(
       "{\"frame\": {\"color\": \"#FF0000\", \"inactiveColor\": \"#0000FF\"}}");
   NSWindow* ns_window = app_window->GetNativeWindow().GetNativeNSWindow();
+
   // No color correction in the default case.
   [ns_window setColorSpace:[NSColorSpace sRGBColorSpace]];
 
-  int half_width = NSWidth([ns_window frame]) / 2;
+  // Make sure the window is inactive before color sampling.
+  ui::test::ScopedFakeNSWindowFocus fake_focus;
+  [ns_window resignMainWindow];
+  [ns_window resignKeyWindow];
 
   NSBitmapImageRep* bitmap = ScreenshotNSWindow(ns_window);
-  // The window is currently inactive so it should be blue (#0000FF).
+  // The window is currently inactive so it should be blue (#0000FF). We are
+  // assuming the Light appearance is being used.
   NSColor* expected_color = ColorInBitmapColorSpace(0xFF0000FF, bitmap);
+  int half_width = NSWidth([ns_window frame]) / 2;
   NSColor* color = [bitmap colorAtX:half_width y:5];
   CGFloat expected_components[4], color_components[4];
   [expected_color getComponents:expected_components];
@@ -611,11 +619,12 @@
   EXPECT_NEAR(expected_components[1], color_components[1], 0.01);
   EXPECT_NEAR(expected_components[2], color_components[2], 0.01);
 
-  ui::test::ScopedFakeNSWindowFocus fake_focus;
+  // Activate the window.
   [ns_window makeMainWindow];
 
   bitmap = ScreenshotNSWindow(ns_window);
-  // The window is now active so it should be red (#FF0000).
+  // The window is now active so it should be red (#FF0000). Again, this is
+  // assuming the Light appearance is being used.
   expected_color = ColorInBitmapColorSpace(0xFFFF0000, bitmap);
   color = [bitmap colorAtX:half_width y:5];
   [expected_color getComponents:expected_components];
diff --git a/chrome/browser/ui/cocoa/browser_window_mac_browsertest.mm b/chrome/browser/ui/cocoa/browser_window_mac_browsertest.mm
index 9bd69244..4baf70a1 100644
--- a/chrome/browser/ui/cocoa/browser_window_mac_browsertest.mm
+++ b/chrome/browser/ui/cocoa/browser_window_mac_browsertest.mm
@@ -39,12 +39,6 @@
           itemWithTag:IDC_BOOKMARK_THIS_TAB],
       base::scoped_policy::RETAIN);
 
-  // The mainMenu item doesn't have an action associated while the browser
-  // window isn't focused, which we can't do in a browser test. So associate one
-  // manually.
-  EXPECT_EQ([bookmark_menu_item action], nullptr);
-  [bookmark_menu_item setAction:@selector(commandDispatch:)];
-
   EXPECT_TRUE(window.get());
   EXPECT_TRUE(bookmark_menu_item.get());
 
diff --git a/chrome/browser/ui/dialogs/outdated_upgrade_bubble.cc b/chrome/browser/ui/dialogs/outdated_upgrade_bubble.cc
index ed846b5..f9b2eb3 100644
--- a/chrome/browser/ui/dialogs/outdated_upgrade_bubble.cc
+++ b/chrome/browser/ui/dialogs/outdated_upgrade_bubble.cc
@@ -125,7 +125,7 @@
               l10n_util::GetStringUTF16(auto_update_enabled
                                             ? IDS_REINSTALL_APP
                                             : IDS_REENABLE_UPDATES))
-          .AddBodyText(
+          .AddParagraph(
               ui::DialogModelLabel(IDS_UPGRADE_BUBBLE_TEXT).set_is_secondary())
           .SetDialogDestroyingCallback(base::BindOnce(&OnWindowClosing))
           .SetCloseActionCallback(base::BindOnce(
diff --git a/chrome/browser/ui/page_info/about_this_site_message_delegate_android.cc b/chrome/browser/ui/page_info/about_this_site_message_delegate_android.cc
deleted file mode 100644
index 30ae4c3..0000000
--- a/chrome/browser/ui/page_info/about_this_site_message_delegate_android.cc
+++ /dev/null
@@ -1,80 +0,0 @@
-// Copyright 2022 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/ui/page_info/about_this_site_message_delegate_android.h"
-
-#include "base/callback.h"
-#include "base/callback_helpers.h"
-#include "base/strings/utf_string_conversions.h"
-#include "chrome/browser/android/android_theme_resources.h"
-#include "chrome/browser/android/resource_mapper.h"
-#include "components/messages/android/message_dispatcher_bridge.h"
-#include "components/messages/android/message_enums.h"
-#include "components/messages/android/message_wrapper.h"
-#include "components/page_info/core/about_this_site_service.h"
-#include "components/page_info/core/proto/about_this_site_metadata.pb.h"
-#include "content/public/browser/web_contents.h"
-
-// static
-void AboutThisSiteMessageDelegateAndroid::Create(
-    content::WebContents* web_contents,
-    page_info::proto::BannerInfo banner_info,
-    base::OnceClosure on_dismissed,
-    base::OnceClosure on_url_opened) {
-  // This object lives until the Message is dismissed.
-  new AboutThisSiteMessageDelegateAndroid(web_contents, std::move(banner_info),
-                                          std::move(on_dismissed),
-                                          std::move(on_url_opened));
-}
-
-AboutThisSiteMessageDelegateAndroid::AboutThisSiteMessageDelegateAndroid(
-    content::WebContents* web_contents,
-    page_info::proto::BannerInfo banner_info,
-    base::OnceClosure on_dismissed,
-    base::OnceClosure on_url_opened)
-    : banner_info_(std::move(banner_info)),
-      on_dismissed_(std::move(on_dismissed)),
-      on_url_opened_(std::move(on_url_opened)),
-      web_contents_(web_contents) {
-  DCHECK(on_dismissed_);
-  DCHECK(on_url_opened_);
-
-  message_ = std::make_unique<messages::MessageWrapper>(
-      messages::MessageIdentifier::ABOUT_THIS_SITE,
-      base::BindOnce(&AboutThisSiteMessageDelegateAndroid::OpenUrl,
-                     base::Unretained(this)),
-      base::BindOnce(&AboutThisSiteMessageDelegateAndroid::OnDismiss,
-                     base::Unretained(this)));
-  if (banner_info_.has_title()) {
-    message_->SetTitle(base::UTF8ToUTF16(banner_info_.title()));
-    message_->SetDescription(base::UTF8ToUTF16(banner_info_.label()));
-  } else {
-    message_->SetTitle(base::UTF8ToUTF16(banner_info_.label()));
-  }
-
-  message_->SetPrimaryButtonText(base::UTF8ToUTF16(banner_info_.url().label()));
-  message_->SetIconResourceId(
-      ResourceMapper::MapToJavaDrawableId(IDR_PAGEINFO_BAD));
-
-  messages::MessageDispatcherBridge::Get()->EnqueueMessage(
-      message_.get(), web_contents, messages::MessageScopeType::NAVIGATION,
-      messages::MessagePriority::kNormal);
-}
-
-AboutThisSiteMessageDelegateAndroid::~AboutThisSiteMessageDelegateAndroid() =
-    default;
-
-void AboutThisSiteMessageDelegateAndroid::OnDismiss(
-    messages::DismissReason reason) {
-  if (reason == messages::DismissReason::GESTURE)
-    std::move(on_dismissed_).Run();
-  delete this;
-}
-
-void AboutThisSiteMessageDelegateAndroid::OpenUrl() {
-  std::move(on_url_opened_).Run();
-  web_contents_->OpenURL({GURL(banner_info_.url().url()), content::Referrer(),
-                          WindowOpenDisposition::NEW_FOREGROUND_TAB,
-                          ui::PAGE_TRANSITION_LINK, false});
-}
diff --git a/chrome/browser/ui/page_info/about_this_site_message_delegate_android.h b/chrome/browser/ui/page_info/about_this_site_message_delegate_android.h
deleted file mode 100644
index b06b0e10..0000000
--- a/chrome/browser/ui/page_info/about_this_site_message_delegate_android.h
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright 2022 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_UI_PAGE_INFO_ABOUT_THIS_SITE_MESSAGE_DELEGATE_ANDROID_H_
-#define CHROME_BROWSER_UI_PAGE_INFO_ABOUT_THIS_SITE_MESSAGE_DELEGATE_ANDROID_H_
-
-#include <memory>
-#include "base/callback.h"
-#include "base/memory/raw_ptr.h"
-#include "components/messages/android/message_enums.h"
-#include "components/page_info/core/proto/about_this_site_metadata.pb.h"
-
-namespace content {
-class WebContents;
-}  // namespace content
-
-namespace messages {
-class MessageWrapper;
-}  // namespace messages
-
-// This class creates a message for AboutThisSiteController
-class AboutThisSiteMessageDelegateAndroid {
- public:
-  AboutThisSiteMessageDelegateAndroid(
-      const AboutThisSiteMessageDelegateAndroid&) = delete;
-  AboutThisSiteMessageDelegateAndroid& operator=(
-      const AboutThisSiteMessageDelegateAndroid&) = delete;
-
-  // Creates an AboutThisSite message.
-  static void Create(content::WebContents* web_contents,
-                     page_info::proto::BannerInfo banner_info,
-                     base::OnceClosure on_dismissed,
-                     base::OnceClosure on_url_opened);
-
- private:
-  explicit AboutThisSiteMessageDelegateAndroid(
-      content::WebContents* web_contents,
-      page_info::proto::BannerInfo banner_info,
-      base::OnceClosure on_dismissed,
-      base::OnceClosure on_url_opened);
-  ~AboutThisSiteMessageDelegateAndroid();
-
-  void OnDismiss(messages::DismissReason reason);
-  void OpenUrl();
-
-  std::unique_ptr<messages::MessageWrapper> message_;
-  page_info::proto::BannerInfo banner_info_;
-  base::OnceClosure on_dismissed_;
-  base::OnceClosure on_url_opened_;
-  raw_ptr<content::WebContents> web_contents_;
-};
-
-#endif  // CHROME_BROWSER_UI_PAGE_INFO_ABOUT_THIS_SITE_MESSAGE_DELEGATE_ANDROID_H_
diff --git a/chrome/browser/ui/page_info/about_this_site_side_panel.h b/chrome/browser/ui/page_info/about_this_site_side_panel.h
index 7b63e4f..a26424ed 100644
--- a/chrome/browser/ui/page_info/about_this_site_side_panel.h
+++ b/chrome/browser/ui/page_info/about_this_site_side_panel.h
@@ -15,5 +15,6 @@
 // Implemented by about_this_site_side_panel_coordinator.cc in ui/views.
 void ShowAboutThisSiteSidePanel(content::WebContents* web_contents,
                                 const content::OpenURLParams& params);
-
+void RegisterAboutThisSiteSidePanel(content::WebContents* web_contents,
+                                    const content::OpenURLParams& params);
 #endif
diff --git a/chrome/browser/ui/tab_helpers.cc b/chrome/browser/ui/tab_helpers.cc
index b597938..3fd8f0a2 100644
--- a/chrome/browser/ui/tab_helpers.cc
+++ b/chrome/browser/ui/tab_helpers.cc
@@ -48,8 +48,6 @@
 #include "chrome/browser/optimization_guide/optimization_guide_keyed_service_factory.h"
 #include "chrome/browser/optimization_guide/optimization_guide_web_contents_observer.h"
 #include "chrome/browser/optimization_guide/page_content_annotations_service_factory.h"
-#include "chrome/browser/page_info/about_this_site_service_factory.h"
-#include "chrome/browser/page_info/about_this_site_tab_helper.h"
 #include "chrome/browser/page_load_metrics/page_load_metrics_initialize.h"
 #include "chrome/browser/password_manager/chrome_password_manager_client.h"
 #include "chrome/browser/performance_hints/performance_hints_features.h"
@@ -182,6 +180,8 @@
 #endif
 
 #if defined(TOOLKIT_VIEWS)
+#include "chrome/browser/page_info/about_this_site_service_factory.h"
+#include "chrome/browser/page_info/about_this_site_tab_helper.h"
 #include "chrome/browser/ui/side_search/side_search_tab_contents_helper.h"
 #include "chrome/browser/ui/side_search/side_search_utils.h"
 #endif
@@ -298,7 +298,9 @@
       Profile::FromBrowserContext(web_contents->GetBrowserContext());
 
   // --- Section 1: Common tab helpers ---
-  if (base::FeatureList::IsEnabled(page_info::kAboutThisSiteBanner)) {
+#if defined(TOOLKIT_VIEWS)
+  if (base::FeatureList::IsEnabled(
+          page_info::kAboutThisSitePersistentSidePanelEntry)) {
     auto* optimization_guide_decider =
         OptimizationGuideKeyedServiceFactory::GetForProfile(profile);
     auto* about_this_site_service =
@@ -307,6 +309,7 @@
       AboutThisSiteTabHelper::CreateForWebContents(
           web_contents, optimization_guide_decider, about_this_site_service);
   }
+#endif
   autofill::ChromeAutofillClient::CreateForWebContents(web_contents);
   autofill::ContentAutofillDriverFactory::CreateForWebContentsAndDelegate(
       web_contents,
diff --git a/chrome/browser/ui/translate/partial_translate_bubble_model.h b/chrome/browser/ui/translate/partial_translate_bubble_model.h
index ee3ccf2..0b4c2a8 100644
--- a/chrome/browser/ui/translate/partial_translate_bubble_model.h
+++ b/chrome/browser/ui/translate/partial_translate_bubble_model.h
@@ -20,6 +20,9 @@
 class PartialTranslateBubbleModel : public TranslateLanguageListModel {
  public:
   enum ViewState {
+    // The view state while waiting for translation.
+    VIEW_STATE_WAITING,
+
     // The view state before translating.
     VIEW_STATE_BEFORE_TRANSLATE,
 
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_bubble_view.cc b/chrome/browser/ui/views/bookmarks/bookmark_bubble_view.cc
index 63e6a6b..addd782 100644
--- a/chrome/browser/ui/views/bookmarks/bookmark_bubble_view.cc
+++ b/chrome/browser/ui/views/bookmarks/bookmark_bubble_view.cc
@@ -4,21 +4,27 @@
 
 #include "chrome/browser/ui/views/bookmarks/bookmark_bubble_view.h"
 
+#include "base/feature_list.h"
 #include "base/memory/raw_ptr.h"
 #include "base/metrics/user_metrics.h"
 #include "build/build_config.h"
 #include "build/chromeos_buildflags.h"
 #include "chrome/browser/bookmarks/bookmark_model_factory.h"
+#include "chrome/browser/commerce/shopping_service_factory.h"
 #include "chrome/browser/platform_util.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/bookmarks/bookmark_bubble_observer.h"
 #include "chrome/browser/ui/bookmarks/bookmark_editor.h"
 #include "chrome/browser/ui/bookmarks/recently_used_folders_combo_model.h"
+#include "chrome/browser/ui/browser_element_identifiers.h"
 #include "chrome/browser/ui/sync/sync_promo_ui.h"
+#include "chrome/browser/ui/views/commerce/price_tracking_view.h"
 #include "chrome/grit/chromium_strings.h"
 #include "chrome/grit/generated_resources.h"
 #include "components/bookmarks/browser/bookmark_model.h"
 #include "components/bookmarks/browser/bookmark_utils.h"
+#include "components/commerce/core/commerce_feature_list.h"
+#include "components/commerce/core/shopping_service.h"
 #include "components/signin/public/base/signin_buildflags.h"
 #include "components/signin/public/base/signin_metrics.h"
 #include "components/strings/grit/components_strings.h"
@@ -179,51 +185,64 @@
       observer, std::move(delegate), profile, url);
   BookmarkBubbleDelegate* bubble_delegate = bubble_delegate_unique.get();
 
-  auto dialog_model =
-      ui::DialogModel::Builder(std::move(bubble_delegate_unique))
-          .SetTitle(l10n_util::GetStringUTF16(
-              already_bookmarked ? IDS_BOOKMARK_BUBBLE_PAGE_BOOKMARK
-                                 : IDS_BOOKMARK_BUBBLE_PAGE_BOOKMARKED))
-          .SetDialogDestroyingCallback(
-              base::BindOnce(&BookmarkBubbleDelegate::OnWindowClosing,
-                             base::Unretained(bubble_delegate)))
-          .AddOkButton(base::BindOnce(&BookmarkBubbleDelegate::ApplyEdits,
-                                      base::Unretained(bubble_delegate)),
-                       l10n_util::GetStringUTF16(IDS_DONE))
-          .AddCancelButton(
-              base::BindOnce(&BookmarkBubbleDelegate::RemoveBookmark,
-                             base::Unretained(bubble_delegate)),
-              l10n_util::GetStringUTF16(IDS_BOOKMARK_BUBBLE_REMOVE_BOOKMARK),
-              ui::DialogModelButton::Params().AddAccelerator(
-                  ui::Accelerator(ui::VKEY_R, ui::EF_ALT_DOWN)))
-          .AddExtraButton(
-              base::BindRepeating(&BookmarkBubbleDelegate::OnEditButton,
+  auto dialog_model_builder =
+      ui::DialogModel::Builder(std::move(bubble_delegate_unique));
+  dialog_model_builder
+      .SetTitle(l10n_util::GetStringUTF16(
+          already_bookmarked ? IDS_BOOKMARK_BUBBLE_PAGE_BOOKMARK
+                             : IDS_BOOKMARK_BUBBLE_PAGE_BOOKMARKED))
+      .SetDialogDestroyingCallback(
+          base::BindOnce(&BookmarkBubbleDelegate::OnWindowClosing,
+                         base::Unretained(bubble_delegate)))
+      .AddOkButton(base::BindOnce(&BookmarkBubbleDelegate::ApplyEdits,
                                   base::Unretained(bubble_delegate)),
-              l10n_util::GetStringUTF16(IDS_BOOKMARK_BUBBLE_OPTIONS),
-              ui::DialogModelButton::Params().AddAccelerator(
-                  ui::Accelerator(ui::VKEY_E, ui::EF_ALT_DOWN)))
-          .AddTextfield(
-              kBookmarkName,
-              l10n_util::GetStringUTF16(IDS_BOOKMARK_BUBBLE_NAME_LABEL),
-              bookmark_node->GetTitle(),
-              ui::DialogModelTextfield::Params().SetAccessibleName(
-                  l10n_util::GetStringUTF16(IDS_BOOKMARK_AX_BUBBLE_NAME_LABEL)))
-          .AddCombobox(
-              kBookmarkFolder,
-              l10n_util::GetStringUTF16(IDS_BOOKMARK_BUBBLE_FOLDER_LABEL),
-              std::make_unique<RecentlyUsedFoldersComboModel>(
-                  bookmark_model,
-                  bookmark_model->GetMostRecentlyAddedUserNodeForURL(url)),
-              ui::DialogModelCombobox::Params().SetCallback(
-                  base::BindRepeating(&BookmarkBubbleDelegate::OnComboboxAction,
-                                      base::Unretained(bubble_delegate))))
-          .SetInitiallyFocusedField(kBookmarkName)
-          .Build();
+                   l10n_util::GetStringUTF16(IDS_DONE))
+      .AddCancelButton(
+          base::BindOnce(&BookmarkBubbleDelegate::RemoveBookmark,
+                         base::Unretained(bubble_delegate)),
+          l10n_util::GetStringUTF16(IDS_BOOKMARK_BUBBLE_REMOVE_BOOKMARK),
+          ui::DialogModelButton::Params().AddAccelerator(
+              ui::Accelerator(ui::VKEY_R, ui::EF_ALT_DOWN)))
+      .AddExtraButton(base::BindRepeating(&BookmarkBubbleDelegate::OnEditButton,
+                                          base::Unretained(bubble_delegate)),
+                      l10n_util::GetStringUTF16(IDS_BOOKMARK_BUBBLE_OPTIONS),
+                      ui::DialogModelButton::Params().AddAccelerator(
+                          ui::Accelerator(ui::VKEY_E, ui::EF_ALT_DOWN)))
+      .AddTextfield(
+          kBookmarkName,
+          l10n_util::GetStringUTF16(IDS_BOOKMARK_BUBBLE_NAME_LABEL),
+          bookmark_node->GetTitle(),
+          ui::DialogModelTextfield::Params().SetAccessibleName(
+              l10n_util::GetStringUTF16(IDS_BOOKMARK_AX_BUBBLE_NAME_LABEL)))
+      .AddCombobox(
+          kBookmarkFolder,
+          l10n_util::GetStringUTF16(IDS_BOOKMARK_BUBBLE_FOLDER_LABEL),
+          std::make_unique<RecentlyUsedFoldersComboModel>(
+              bookmark_model,
+              bookmark_model->GetMostRecentlyAddedUserNodeForURL(url)),
+          ui::DialogModelCombobox::Params().SetCallback(
+              base::BindRepeating(&BookmarkBubbleDelegate::OnComboboxAction,
+                                  base::Unretained(bubble_delegate))))
+      .SetInitiallyFocusedField(kBookmarkName);
+
+  if (base::FeatureList::IsEnabled(commerce::kShoppingList)) {
+    absl::optional<commerce::ProductInfo> product_info =
+        commerce::ShoppingServiceFactory::GetForBrowserContext(profile)
+            ->GetAvailableProductInfoForUrl(url);
+    if (product_info.has_value()) {
+      dialog_model_builder.AddSeparator().AddCustomField(
+          std::make_unique<views::BubbleDialogModelHost::CustomView>(
+              std::make_unique<PriceTrackingView>(),
+              views::BubbleDialogModelHost::FieldType::kControl),
+          kPriceTrackingBookmarkViewElementId);
+    }
+  }
 
   // views:: land below, there's no agnostic reference to arrow / anchors /
   // bubbles.
   auto bubble = std::make_unique<views::BubbleDialogModelHost>(
-      std::move(dialog_model), anchor_view, views::BubbleBorder::TOP_RIGHT);
+      dialog_model_builder.Build(), anchor_view,
+      views::BubbleBorder::TOP_RIGHT);
   bookmark_bubble_ = bubble.get();
   if (highlighted_button)
     bubble->SetHighlightedButton(highlighted_button);
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_bubble_view_browsertest.cc b/chrome/browser/ui/views/bookmarks/bookmark_bubble_view_browsertest.cc
index a0e64722..17271de1 100644
--- a/chrome/browser/ui/views/bookmarks/bookmark_bubble_view_browsertest.cc
+++ b/chrome/browser/ui/views/bookmarks/bookmark_bubble_view_browsertest.cc
@@ -6,9 +6,11 @@
 
 #include "base/command_line.h"
 #include "base/strings/utf_string_conversions.h"
+#include "base/test/scoped_feature_list.h"
 #include "build/build_config.h"
 #include "build/chromeos_buildflags.h"
 #include "chrome/browser/bookmarks/bookmark_model_factory.h"
+#include "chrome/browser/commerce/shopping_service_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/signin/identity_manager_factory.h"
 #include "chrome/browser/ui/browser.h"
@@ -18,18 +20,32 @@
 #include "components/bookmarks/browser/bookmark_model.h"
 #include "components/bookmarks/browser/bookmark_utils.h"
 #include "components/bookmarks/test/bookmark_test_helpers.h"
+#include "components/commerce/core/commerce_feature_list.h"
+#include "components/commerce/core/mock_shopping_service.h"
 #include "components/signin/public/identity_manager/identity_test_utils.h"
 #include "content/public/test/browser_test.h"
 #include "ui/views/bubble/bubble_dialog_delegate_view.h"
 
 class BookmarkBubbleViewBrowserTest : public DialogBrowserTest {
  public:
-  BookmarkBubbleViewBrowserTest() {}
+  BookmarkBubbleViewBrowserTest() {
+    test_features_.InitAndEnableFeature(commerce::kShoppingList);
+  }
 
   BookmarkBubbleViewBrowserTest(const BookmarkBubbleViewBrowserTest&) = delete;
   BookmarkBubbleViewBrowserTest& operator=(
       const BookmarkBubbleViewBrowserTest&) = delete;
 
+  void SetUpOnMainThread() override {
+    mock_shopping_service_ = static_cast<commerce::MockShoppingService*>(
+        commerce::ShoppingServiceFactory::GetInstance()
+            ->SetTestingFactoryAndUse(
+                browser()->profile(),
+                base::BindRepeating([](content::BrowserContext* context) {
+                  return commerce::MockShoppingService::Build();
+                })));
+  }
+
   // DialogBrowserTest:
   void ShowUi(const std::string& name) override {
 #if !BUILDFLAG(IS_CHROMEOS_ASH)
@@ -44,6 +60,11 @@
                                         consent_level);
 #endif
 
+    if (name == "bookmark_details_on_trackable_product") {
+      mock_shopping_service_->SetResponseForGetProductInfoForUrl(
+          commerce::ProductInfo());
+    }
+
     const GURL url = GURL("https://www.google.com");
     const std::u16string title = u"Title";
     bookmarks::BookmarkModel* bookmark_model =
@@ -52,9 +73,14 @@
     bookmarks::AddIfNotBookmarked(bookmark_model, url, title);
     browser()->window()->ShowBookmarkBubble(url, true);
 
-    if (name == "ios_promotion")
+    if (name == "ios_promotion") {
       BookmarkBubbleView::bookmark_bubble()->AcceptDialog();
+    }
   }
+
+ private:
+  commerce::MockShoppingService* mock_shopping_service_;
+  base::test::ScopedFeatureList test_features_;
 };
 
 // Ash always has sync ON
@@ -69,3 +95,8 @@
                        InvokeUi_bookmark_details_synced_on) {
   ShowAndVerifyUi();
 }
+
+IN_PROC_BROWSER_TEST_F(BookmarkBubbleViewBrowserTest,
+                       InvokeUi_bookmark_details_on_trackable_product) {
+  ShowAndVerifyUi();
+}
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_bubble_view_unittest.cc b/chrome/browser/ui/views/bookmarks/bookmark_bubble_view_unittest.cc
index bb610f8..80dfa45 100644
--- a/chrome/browser/ui/views/bookmarks/bookmark_bubble_view_unittest.cc
+++ b/chrome/browser/ui/views/bookmarks/bookmark_bubble_view_unittest.cc
@@ -12,15 +12,22 @@
 #include "build/build_config.h"
 #include "build/chromeos_buildflags.h"
 #include "chrome/browser/bookmarks/bookmark_model_factory.h"
+#include "chrome/browser/commerce/shopping_service_factory.h"
 #include "chrome/browser/signin/identity_manager_factory.h"
 #include "chrome/browser/signin/identity_test_environment_profile_adaptor.h"
+#include "chrome/browser/ui/browser_element_identifiers.h"
 #include "chrome/browser/ui/sync/bubble_sync_promo_delegate.h"
 #include "chrome/test/base/browser_with_test_window_test.h"
 #include "chrome/test/views/chrome_test_widget.h"
 #include "components/bookmarks/browser/bookmark_utils.h"
 #include "components/bookmarks/test/bookmark_test_helpers.h"
+#include "components/commerce/core/commerce_feature_list.h"
+#include "components/commerce/core/mock_shopping_service.h"
 #include "components/signin/public/identity_manager/identity_test_utils.h"
+#include "ui/base/interaction/element_identifier.h"
+#include "ui/base/interaction/element_tracker.h"
 #include "ui/views/bubble/bubble_dialog_delegate_view.h"
+#include "ui/views/interaction/element_tracker_views.h"
 #include "ui/views/test/widget_test.h"
 #include "ui/views/widget/unique_widget_ptr.h"
 
@@ -38,7 +45,9 @@
   // and IO tasks on separate threads.
   BookmarkBubbleViewTest()
       : BrowserWithTestWindowTest(
-            content::BrowserTaskEnvironment::REAL_IO_THREAD) {}
+            content::BrowserTaskEnvironment::REAL_IO_THREAD) {
+    test_features_.InitAndEnableFeature(commerce::kShoppingList);
+  }
 
   BookmarkBubbleViewTest(const BookmarkBubbleViewTest&) = delete;
   BookmarkBubbleViewTest& operator=(const BookmarkBubbleViewTest&) = delete;
@@ -76,7 +85,11 @@
   TestingProfile::TestingFactories GetTestingFactories() override {
     TestingProfile::TestingFactories factories = {
         {BookmarkModelFactory::GetInstance(),
-         BookmarkModelFactory::GetDefaultFactory()}};
+         BookmarkModelFactory::GetDefaultFactory()},
+        {commerce::ShoppingServiceFactory::GetInstance(),
+         base::BindRepeating([](content::BrowserContext* context) {
+           return commerce::MockShoppingService::Build();
+         })}};
     IdentityTestEnvironmentProfileAdaptor::
         AppendIdentityTestEnvironmentFactories(&factories);
     return factories;
@@ -93,6 +106,7 @@
 
  private:
   views::UniqueWidgetPtr anchor_widget_;
+  base::test::ScopedFeatureList test_features_;
 };
 
 // Verifies that the sync promo is not displayed for a signed in user.
@@ -116,3 +130,32 @@
   EXPECT_TRUE(footnote);
 #endif
 }
+
+// Verifies that the price tracking view is displayed for trackable product.
+TEST_F(BookmarkBubbleViewTest, PriceTrackingViewIsVisible) {
+  commerce::MockShoppingService* mock_shopping_service =
+      static_cast<commerce::MockShoppingService*>(
+          commerce::ShoppingServiceFactory::GetForBrowserContext(profile()));
+  mock_shopping_service->SetResponseForGetProductInfoForUrl(
+      commerce::ProductInfo());
+  CreateBubbleView();
+  // Verify the view is displayed
+  const ui::ElementContext context =
+      views::ElementTrackerViews::GetContextForView(
+          BookmarkBubbleView::bookmark_bubble()->GetAnchorView());
+  EXPECT_TRUE(views::ElementTrackerViews::GetInstance()->GetFirstMatchingView(
+      kPriceTrackingBookmarkViewElementId, context));
+}
+
+TEST_F(BookmarkBubbleViewTest, PriceTrackingViewIsHidden) {
+  commerce::MockShoppingService* mock_shopping_service =
+      static_cast<commerce::MockShoppingService*>(
+          commerce::ShoppingServiceFactory::GetForBrowserContext(profile()));
+  mock_shopping_service->SetResponseForGetProductInfoForUrl(absl::nullopt);
+  CreateBubbleView();
+  const ui::ElementContext context =
+      views::ElementTrackerViews::GetContextForView(
+          BookmarkBubbleView::bookmark_bubble()->GetAnchorView());
+  EXPECT_FALSE(views::ElementTrackerViews::GetInstance()->GetFirstMatchingView(
+      kPriceTrackingBookmarkViewElementId, context));
+}
diff --git a/chrome/browser/ui/views/commerce/price_tracking_view.cc b/chrome/browser/ui/views/commerce/price_tracking_view.cc
new file mode 100644
index 0000000..26854d2
--- /dev/null
+++ b/chrome/browser/ui/views/commerce/price_tracking_view.cc
@@ -0,0 +1,82 @@
+// Copyright (c) 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/views/commerce/price_tracking_view.h"
+#include "chrome/browser/ui/views/chrome_layout_provider.h"
+#include "components/strings/grit/components_strings.h"
+#include "third_party/skia/include/core/SkColor.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/gfx/color_palette.h"
+#include "ui/gfx/geometry/insets_outsets_base.h"
+#include "ui/views/background.h"
+#include "ui/views/border.h"
+#include "ui/views/controls/button/toggle_button.h"
+#include "ui/views/controls/image_view.h"
+#include "ui/views/controls/label.h"
+#include "ui/views/layout/box_layout.h"
+#include "ui/views/layout/box_layout_view.h"
+#include "ui/views/layout/flex_layout_view.h"
+
+namespace {
+constexpr int kProductImageSize = 56;
+constexpr int kLableSpacing = 4;
+constexpr int kHorizontalSpacing = 16;
+}  // namespace
+
+PriceTrackingView::PriceTrackingView() {
+  // image column
+  auto product_image_containter = std::make_unique<views::BoxLayoutView>();
+  product_image_containter->SetCrossAxisAlignment(
+      views::BoxLayout::CrossAxisAlignment::kCenter);
+  product_image_containter->SetProperty(
+      views::kMarginsKey, gfx::Insets::TLBR(0, 0, 0, kHorizontalSpacing));
+  // place holder product image
+  auto* placeholder = product_image_containter->AddChildView(
+      std::make_unique<views::ImageView>());
+  placeholder->SetImageSize(gfx::Size(kProductImageSize, kProductImageSize));
+  placeholder->SetPreferredSize(
+      gfx::Size(kProductImageSize, kProductImageSize));
+  // TODO(meiliang@): Use correct color and corner radius.
+  placeholder->SetBorder(views::CreateRoundedRectBorder(
+      1, 4, SkColorSetA(gfx::kGoogleGrey900, 0x24)));
+  placeholder->SetBackground(
+      views::CreateSolidBackground(SkColorSetA(gfx::kGoogleGrey900, 0x24)));
+  AddChildView(std::move(product_image_containter));
+  // TODO(meiliang): Use image fetcher to fetch image.
+
+  // Text column
+  auto text_container = std::make_unique<views::FlexLayoutView>();
+  text_container->SetOrientation(views::LayoutOrientation::kVertical);
+  // Title label
+  auto* title_label =
+      text_container->AddChildView(std::make_unique<views::Label>(
+          l10n_util::GetStringUTF16(IDS_OMNIBOX_TRACK_PRICE_DIALOG_TITLE),
+          views::style::CONTEXT_DIALOG_BODY_TEXT, views::style::STYLE_PRIMARY));
+  title_label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
+  // Body label
+  body_label_ = text_container->AddChildView(std::make_unique<views::Label>(
+      l10n_util::GetStringUTF16(IDS_OMNIBOX_TRACK_PRICE_DIALOG_DESCRIPTION),
+      views::style::CONTEXT_DIALOG_BODY_TEXT, views::style::STYLE_SECONDARY));
+  body_label_->SetProperty(views::kMarginsKey,
+                           gfx::Insets::TLBR(kLableSpacing, 0, 0, 0));
+  body_label_->SetAllowCharacterBreak(true);
+  body_label_->SetMultiLine(true);
+  body_label_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
+  AddChildView(std::move(text_container));
+
+  // Toggle button column
+  toggle_button_ = AddChildView(std::make_unique<views::ToggleButton>());
+  toggle_button_->SetAccessibleName(l10n_util::GetStringUTF16(
+      IDS_PRICE_TRACKING_TRACK_PRODUCT_ACCESSIBILITY));
+  toggle_button_->SetProperty(views::kMarginsKey,
+                              gfx::Insets::TLBR(0, kHorizontalSpacing, 0, 0));
+
+  const int bubble_width = ChromeLayoutProvider::Get()->GetDistanceMetric(
+      views::DISTANCE_BUBBLE_PREFERRED_WIDTH);
+
+  const int label_width = bubble_width - kHorizontalSpacing * 4 -
+                          kProductImageSize -
+                          toggle_button_->GetPreferredSize().width();
+  body_label_->SizeToFit(label_width);
+}
diff --git a/chrome/browser/ui/views/commerce/price_tracking_view.h b/chrome/browser/ui/views/commerce/price_tracking_view.h
new file mode 100644
index 0000000..214863e
--- /dev/null
+++ b/chrome/browser/ui/views/commerce/price_tracking_view.h
@@ -0,0 +1,21 @@
+// Copyright (c) 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_VIEWS_COMMERCE_PRICE_TRACKING_VIEW_H_
+#define CHROME_BROWSER_UI_VIEWS_COMMERCE_PRICE_TRACKING_VIEW_H_
+
+#include "base/memory/raw_ptr.h"
+#include "ui/views/controls/button/toggle_button.h"
+#include "ui/views/controls/label.h"
+#include "ui/views/layout/flex_layout_view.h"
+
+class PriceTrackingView : public views::FlexLayoutView {
+ public:
+  PriceTrackingView();
+
+ private:
+  raw_ptr<views::Label> body_label_;
+  raw_ptr<views::ToggleButton> toggle_button_;
+};
+#endif  // CHROME_BROWSER_UI_VIEWS_COMMERCE_PRICE_TRACKING_VIEW_H_
diff --git a/chrome/browser/ui/views/extensions/extension_uninstall_dialog_view.cc b/chrome/browser/ui/views/extensions/extension_uninstall_dialog_view.cc
index 85a4c8a..b5df9bbf 100644
--- a/chrome/browser/ui/views/extensions/extension_uninstall_dialog_view.cc
+++ b/chrome/browser/ui/views/extensions/extension_uninstall_dialog_view.cc
@@ -89,7 +89,7 @@
           base::OnceClosure() /* Cancel is covered by WindowClosingCallback */);
 
   if (triggering_extension()) {
-    dialog_builder.AddBodyText(
+    dialog_builder.AddParagraph(
         ui::DialogModelLabel(
             l10n_util::GetStringFUTF16(
                 IDS_EXTENSION_PROMPT_UNINSTALL_TRIGGERED_BY_EXTENSION,
diff --git a/chrome/browser/ui/views/extensions/extensions_request_access_button_hover_card.cc b/chrome/browser/ui/views/extensions/extensions_request_access_button_hover_card.cc
index 38e8ab0..70ec3b3 100644
--- a/chrome/browser/ui/views/extensions/extensions_request_access_button_hover_card.cc
+++ b/chrome/browser/ui/views/extensions/extensions_request_access_button_hover_card.cc
@@ -42,11 +42,11 @@
   const std::u16string url = GetCurrentHost(web_contents);
   if (actions.size() == 1) {
     dialog_builder.SetIcon(GetIcon(actions[0], web_contents))
-        .AddBodyText(ui::DialogModelLabel(l10n_util::GetStringFUTF16(
+        .AddParagraph(ui::DialogModelLabel(l10n_util::GetStringFUTF16(
             IDS_EXTENSIONS_REQUEST_ACCESS_BUTTON_TOOLTIP_SINGLE_EXTENSION,
             actions[0]->GetActionName(), url)));
   } else {
-    dialog_builder.AddBodyText(ui::DialogModelLabel(l10n_util::GetStringFUTF16(
+    dialog_builder.AddParagraph(ui::DialogModelLabel(l10n_util::GetStringFUTF16(
         IDS_EXTENSIONS_REQUEST_ACCESS_BUTTON_TOOLTIP_MULTIPLE_EXTENSIONS,
         url)));
     for (auto* action : actions) {
diff --git a/chrome/browser/ui/views/extensions/extensions_tabbed_menu_view.cc b/chrome/browser/ui/views/extensions/extensions_tabbed_menu_view.cc
index 317926f..c1effef 100644
--- a/chrome/browser/ui/views/extensions/extensions_tabbed_menu_view.cc
+++ b/chrome/browser/ui/views/extensions/extensions_tabbed_menu_view.cc
@@ -653,11 +653,13 @@
     SiteAccessSection* section = nullptr;
     SiteAccessMenuItemView* item = nullptr;
     if (auto* current_item =
-            GetSiteAccessMenuItem(requests_access_.items, action_id)) {
+            GetSiteAccessMenuItem(requests_access_.items, action_id);
+        current_item) {
       section = &requests_access_;
       item = current_item;
-    } else if (auto* current_item =
-                   GetSiteAccessMenuItem(has_access_.items, action_id)) {
+    } else if (current_item =
+                   GetSiteAccessMenuItem(has_access_.items, action_id);
+               current_item) {
       section = &has_access_;
       item = current_item;
     }
diff --git a/chrome/browser/ui/views/extensions/print_job_confirmation_dialog.cc b/chrome/browser/ui/views/extensions/print_job_confirmation_dialog.cc
index b1c95924..dd4f7d0 100644
--- a/chrome/browser/ui/views/extensions/print_job_confirmation_dialog.cc
+++ b/chrome/browser/ui/views/extensions/print_job_confirmation_dialog.cc
@@ -64,7 +64,7 @@
                   base::Unretained(bubble_delegate)),
               l10n_util::GetStringUTF16(
                   IDS_EXTENSIONS_PRINTING_API_PRINT_REQUEST_DENY))
-          .AddBodyText(
+          .AddParagraph(
               ui::DialogModelLabel(
                   l10n_util::GetStringFUTF16(
                       IDS_EXTENSIONS_PRINTING_API_PRINT_REQUEST_BUBBLE_HEADING,
diff --git a/chrome/browser/ui/views/extensions/settings_overridden_dialog.cc b/chrome/browser/ui/views/extensions/settings_overridden_dialog.cc
index c78246e..a1535b20 100644
--- a/chrome/browser/ui/views/extensions/settings_overridden_dialog.cc
+++ b/chrome/browser/ui/views/extensions/settings_overridden_dialog.cc
@@ -78,7 +78,7 @@
       ui::DialogModel::Builder(std::move(dialog_delegate_unique));
   dialog_builder.SetInternalName(kExtensionSettingsOverridenDialogName)
       .SetTitle(show_params.dialog_title)
-      .AddBodyText(ui::DialogModelLabel(show_params.message))
+      .AddParagraph(ui::DialogModelLabel(show_params.message))
       .AddOkButton(
           base::BindOnce(&SettingsOverriddenDialogDelegate::OnDialogAccepted,
                          base::Unretained(dialog_delegate)),
diff --git a/chrome/browser/ui/views/frame/browser_root_view.cc b/chrome/browser/ui/views/frame/browser_root_view.cc
index d83a734..4bddf99c 100644
--- a/chrome/browser/ui/views/frame/browser_root_view.cc
+++ b/chrome/browser/ui/views/frame/browser_root_view.cc
@@ -75,7 +75,7 @@
 }
 
 void OnFindURLMimeType(const GURL& url,
-                       int process_id,
+                       content::BrowserContext* browser_context,
                        FileSupportedCallback callback,
                        const std::string& mime_type) {
   // Check whether the mime type, if given, is known to be supported or whether
@@ -86,9 +86,9 @@
 
 #if BUILDFLAG(ENABLE_PLUGINS)
   content::WebPluginInfo plugin;
-  result = result ||
-           content::PluginService::GetInstance()->GetPluginInfo(
-               process_id, url, mime_type, false, nullptr, &plugin, nullptr);
+  result = result || content::PluginService::GetInstance()->GetPluginInfo(
+                         browser_context, url, mime_type, false, nullptr,
+                         &plugin, nullptr);
 #endif
 
   std::move(callback).Run(url, result);
@@ -185,11 +185,11 @@
         return;
       }
 
-      content::RenderFrameHost* rfh = web_contents->GetPrimaryMainFrame();
       base::ThreadPool::PostTaskAndReplyWithResult(
           FROM_HERE, {base::MayBlock(), base::TaskPriority::USER_VISIBLE},
           base::BindOnce(&FindURLMimeType, url),
-          base::BindOnce(&OnFindURLMimeType, url, rfh->GetProcess()->GetID(),
+          base::BindOnce(&OnFindURLMimeType, url,
+                         browser_view_->browser()->profile(),
                          base::BindOnce(&BrowserRootView::OnFileSupported,
                                         weak_ptr_factory_.GetWeakPtr())));
     }
diff --git a/chrome/browser/ui/views/frame/browser_view.cc b/chrome/browser/ui/views/frame/browser_view.cc
index f60740b8..64c5eb93 100644
--- a/chrome/browser/ui/views/frame/browser_view.cc
+++ b/chrome/browser/ui/views/frame/browser_view.cc
@@ -2646,12 +2646,9 @@
   return ShowTranslateBubbleResult::SUCCESS;
 }
 
-void BrowserView::ShowPartialTranslateBubble(
-    PartialTranslateBubbleModel::ViewState view_state,
-    const std::string& source_language,
-    const std::string& target_language,
-    const std::u16string& text_selection,
-    translate::TranslateErrors::Type error_type) {
+void BrowserView::StartPartialTranslate(const std::string& source_language,
+                                        const std::string& target_language,
+                                        const std::u16string& text_selection) {
   // Show the Translate icon and enabled the associated command to show the
   // Translate UI.
   ChromeTranslateClient::FromWebContents(GetActiveWebContents())
@@ -2660,13 +2657,11 @@
       ->SetTranslateEnabled(true);
 
   TranslateBubbleController::GetOrCreate(GetActiveWebContents())
-      ->ShowPartialTranslateBubble(
-          toolbar_button_provider()->GetAnchorView(
-              PageActionIconType::kTranslate),
-          toolbar_button_provider()->GetPageActionIconView(
-              PageActionIconType::kTranslate),
-          view_state, source_language, target_language, text_selection,
-          error_type);
+      ->StartPartialTranslate(toolbar_button_provider()->GetAnchorView(
+                                  PageActionIconType::kTranslate),
+                              toolbar_button_provider()->GetPageActionIconView(
+                                  PageActionIconType::kTranslate),
+                              source_language, target_language, text_selection);
 }
 
 void BrowserView::ShowOneClickSigninConfirmation(
diff --git a/chrome/browser/ui/views/frame/browser_view.h b/chrome/browser/ui/views/frame/browser_view.h
index 987fe4a4..21aef02d 100644
--- a/chrome/browser/ui/views/frame/browser_view.h
+++ b/chrome/browser/ui/views/frame/browser_view.h
@@ -553,12 +553,9 @@
       const std::string& target_language,
       translate::TranslateErrors::Type error_type,
       bool is_user_gesture) override;
-  void ShowPartialTranslateBubble(
-      PartialTranslateBubbleModel::ViewState view_state,
-      const std::string& source_language,
-      const std::string& target_language,
-      const std::u16string& text_selection,
-      translate::TranslateErrors::Type error_type) override;
+  void StartPartialTranslate(const std::string& source_language,
+                             const std::string& target_language,
+                             const std::u16string& text_selection) override;
   void ShowOneClickSigninConfirmation(
       const std::u16string& email,
       base::OnceCallback<void(bool)> confirmed_callback) override;
diff --git a/chrome/browser/ui/views/frame/dbus_appmenu.cc b/chrome/browser/ui/views/frame/dbus_appmenu.cc
index 3f28222c..117dd93 100644
--- a/chrome/browser/ui/views/frame/dbus_appmenu.cc
+++ b/chrome/browser/ui/views/frame/dbus_appmenu.cc
@@ -307,11 +307,11 @@
       continue;
     }
 
-    int string_id = commands->str_id;
+    int command_str_id = commands->str_id;
     if (command_id == IDC_SHOW_BOOKMARK_BAR)
-      menu->AddCheckItemWithStringId(command_id, string_id);
+      menu->AddCheckItemWithStringId(command_id, command_str_id);
     else
-      menu->AddItemWithStringId(command_id, string_id);
+      menu->AddItemWithStringId(command_id, command_str_id);
     if (command_id < kLastChromeCommand)
       RegisterCommandObserver(command_id);
   }
diff --git a/chrome/browser/ui/views/frame/webui_tab_strip_interactive_uitest.cc b/chrome/browser/ui/views/frame/webui_tab_strip_interactive_uitest.cc
index d9df3a42..08868c1 100644
--- a/chrome/browser/ui/views/frame/webui_tab_strip_interactive_uitest.cc
+++ b/chrome/browser/ui/views/frame/webui_tab_strip_interactive_uitest.cc
@@ -64,7 +64,7 @@
     ASSERT_NE(nullptr, target);
     ui::ElementTracker::GetFrameworkDelegate()->NotifyCustomEvent(target,
                                                                   event_type);
-  };
+  }
 
  protected:
   using WeakPtr = base::WeakPtr<WebUITabStripInteractiveTest>;
@@ -103,7 +103,7 @@
                       test, end, target_id)));
             },
             weak_ptr_factory_.GetWeakPtr(), end, target_id)));
-  };
+  }
 
   WeakPtr GetWeakPtr() { return weak_ptr_factory_.GetWeakPtr(); }
 
diff --git a/chrome/browser/ui/views/page_info/about_this_site_side_panel_coordinator.cc b/chrome/browser/ui/views/page_info/about_this_site_side_panel_coordinator.cc
index b33d069..d2beb95 100644
--- a/chrome/browser/ui/views/page_info/about_this_site_side_panel_coordinator.cc
+++ b/chrome/browser/ui/views/page_info/about_this_site_side_panel_coordinator.cc
@@ -5,6 +5,8 @@
 #include "chrome/browser/ui/views/page_info/about_this_site_side_panel_coordinator.h"
 
 #include "base/callback.h"
+#include "base/metrics/histogram_functions.h"
+#include "chrome/browser/page_info/about_this_site_service_factory.h"
 #include "chrome/browser/ui/browser_finder.h"
 #include "chrome/browser/ui/page_info/about_this_site_side_panel.h"
 #include "chrome/browser/ui/views/chrome_layout_provider.h"
@@ -13,6 +15,7 @@
 #include "chrome/browser/ui/views/side_panel/side_panel_coordinator.h"
 #include "chrome/browser/ui/views/side_panel/side_panel_entry.h"
 #include "chrome/browser/ui/views/side_panel/side_panel_registry.h"
+#include "components/page_info/core/about_this_site_service.h"
 #include "components/strings/grit/components_strings.h"
 #include "components/vector_icons/vector_icons.h"
 #include "content/public/browser/navigation_handle.h"
@@ -28,6 +31,14 @@
       ->RegisterEntryAndShow(params);
 }
 
+void RegisterAboutThisSiteSidePanel(content::WebContents* web_contents,
+                                    const content::OpenURLParams& params) {
+  // Create PanelCoordinator if it doesn't exist yet.
+  AboutThisSideSidePanelCoordinator::CreateForWebContents(web_contents);
+  AboutThisSideSidePanelCoordinator::FromWebContents(web_contents)
+      ->RegisterEntry(params);
+}
+
 AboutThisSideSidePanelCoordinator::AboutThisSideSidePanelCoordinator(
     content::WebContents* web_contents)
     : content::WebContentsUserData<AboutThisSideSidePanelCoordinator>(
@@ -37,16 +48,15 @@
 AboutThisSideSidePanelCoordinator::~AboutThisSideSidePanelCoordinator() =
     default;
 
-void AboutThisSideSidePanelCoordinator::RegisterEntryAndShow(
+void AboutThisSideSidePanelCoordinator::RegisterEntry(
     const content::OpenURLParams& params) {
   auto* browser_view = GetBrowserView();
   if (!browser_view)
     return;
 
-  auto* side_panel_coordinator = browser_view->side_panel_coordinator();
   auto* registry = SidePanelRegistry::Get(web_contents());
-
   last_url_params_ = params;
+  registered_but_not_shown_ = true;
 
   // Check if the view is already registered.
   if (!registry->GetEntryForId(SidePanelEntry::Id::kAboutThisSite)) {
@@ -62,12 +72,23 @@
             base::Unretained(this)));
     registry->Register(std::move(entry));
   }
+}
+
+void AboutThisSideSidePanelCoordinator::RegisterEntryAndShow(
+    const content::OpenURLParams& params) {
+  auto* browser_view = GetBrowserView();
+  if (!browser_view)
+    return;
+
+  RegisterEntry(params);
+  registered_but_not_shown_ = false;
 
   if (about_this_site_side_panel_view_) {
     // Load params in view if view still exists.
     about_this_site_side_panel_view_->OpenUrl(params);
   }
 
+  auto* side_panel_coordinator = browser_view->side_panel_coordinator();
   if (side_panel_coordinator->GetCurrentEntryId() !=
       SidePanelEntry::Id::kAboutThisSite) {
     side_panel_coordinator->Show(SidePanelEntry::Id::kAboutThisSite);
@@ -92,6 +113,11 @@
 AboutThisSideSidePanelCoordinator::CreateAboutThisSiteWebView() {
   DCHECK(GetBrowserView());
   DCHECK(last_url_params_);
+  if (registered_but_not_shown_) {
+    page_info::AboutThisSiteService::OnOpenedDirectlyFromSidePanel();
+    registered_but_not_shown_ = false;
+  }
+
   auto side_panel_view_ =
       std::make_unique<AboutThisSiteSidePanelView>(GetBrowserView());
   side_panel_view_->OpenUrl(*last_url_params_);
diff --git a/chrome/browser/ui/views/page_info/about_this_site_side_panel_coordinator.h b/chrome/browser/ui/views/page_info/about_this_site_side_panel_coordinator.h
index 10bcb46d..303ef70 100644
--- a/chrome/browser/ui/views/page_info/about_this_site_side_panel_coordinator.h
+++ b/chrome/browser/ui/views/page_info/about_this_site_side_panel_coordinator.h
@@ -33,6 +33,9 @@
       const AboutThisSideSidePanelCoordinator&) = delete;
   ~AboutThisSideSidePanelCoordinator() override;
 
+  // Registers ATS entry in the side panel but does not show it.
+  void RegisterEntry(const content::OpenURLParams& params);
+
   // Registers ATS entry in the side panel and shows side panel with ATS
   // selected if its not shown.
   void RegisterEntryAndShow(const content::OpenURLParams& params);
@@ -42,13 +45,21 @@
 
   BrowserView* GetBrowserView() const;
 
+  // Called when SidePanel is opened.
   std::unique_ptr<views::View> CreateAboutThisSiteWebView();
 
   // content::WebContentsObserver:
   void DidFinishNavigation(
       content::NavigationHandle* navigation_handle) override;
 
+  // Stores the URL open params that were last requested. Used to
+  // open a SidePanel to the right URL in case it got destroyed and needs to
+  // be recreated.
   absl::optional<content::OpenURLParams> last_url_params_;
+  // Stores whether a SidePanel entry has been shown yet or is just registered
+  // at pageload. Used to differentiate SidePanels previously opened or opened
+  // from PageInfo from panels opened directly through the SidePanel dropdown.
+  bool registered_but_not_shown_ = false;
 
   base::WeakPtr<AboutThisSiteSidePanelView> about_this_site_side_panel_view_;
 
diff --git a/chrome/browser/ui/views/permissions/permission_prompt_bubble_view.h b/chrome/browser/ui/views/permissions/permission_prompt_bubble_view.h
index 62f2127d..6b4c3a28 100644
--- a/chrome/browser/ui/views/permissions/permission_prompt_bubble_view.h
+++ b/chrome/browser/ui/views/permissions/permission_prompt_bubble_view.h
@@ -15,18 +15,9 @@
 #include "ui/views/bubble/bubble_dialog_delegate_view.h"
 
 namespace permissions {
-enum class RequestType;
 enum class PermissionAction;
 }  // namespace permissions
 
-namespace view {
-class Widget;
-}
-
-namespace view {
-class Widget;
-}
-
 class Browser;
 
 // Bubble that prompts the user to grant or deny a permission request from a
diff --git a/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_notice_bubble.cc b/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_notice_bubble.cc
index 1c28729..8dc3ba3 100644
--- a/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_notice_bubble.cc
+++ b/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_notice_bubble.cc
@@ -99,7 +99,7 @@
                        IDR_PRIVACY_SANDBOX_CONFIRMATION_BANNER)),
                    ui::ImageModel::FromImageSkia(*bundle.GetImageSkiaNamed(
                        IDR_PRIVACY_SANDBOX_CONFIRMATION_BANNER_DARK)))
-          .AddBodyText(
+          .AddParagraph(
               ui::DialogModelLabel::CreateWithLink(
                   IDS_PRIVACY_SANDBOX_BUBBLE_NOTICE_DESCRIPTION,
                   ui::DialogModelLabel::Link(
@@ -110,7 +110,7 @@
                           base::Unretained(bubble_delegate)),
                       l10n_util::GetStringUTF16(
                           IDS_PRIVACY_SANDBOX_BUBBLE_NOTICE_DESCRIPTION_ESTIMATES_INTERESTS_LINK_A11Y_NAME))),
-              kPrivacySandboxLearnMoreTextForTesting)
+              std::u16string(), kPrivacySandboxLearnMoreTextForTesting)
           .AddOkButton(
               base::BindRepeating(
                   &PrivacySandboxNoticeBubbleModelDelegate::OnOkButtonPressed,
diff --git a/chrome/browser/ui/views/profiles/signin_view_controller_delegate_views.cc b/chrome/browser/ui/views/profiles/signin_view_controller_delegate_views.cc
index 7b7beff5..4bea9796 100644
--- a/chrome/browser/ui/views/profiles/signin_view_controller_delegate_views.cc
+++ b/chrome/browser/ui/views/profiles/signin_view_controller_delegate_views.cc
@@ -49,6 +49,11 @@
 namespace {
 
 const int kModalDialogWidth = 448;
+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+    BUILDFLAG(IS_CHROMEOS_LACROS)
+const int kEnterpriseConfirmationDialogWidth = 512;
+const int kEnterpriseConfirmationDialogHeight = 576;
+#endif
 const int kSyncConfirmationDialogWidth = 512;
 const int kSyncConfirmationDialogHeight = 487;
 const int kSigninErrorDialogHeight = 164;
@@ -172,7 +177,7 @@
     signin::SigninChoiceCallback callback) {
   std::unique_ptr<views::WebView> web_view = CreateDialogWebView(
       browser, GURL(chrome::kChromeUIEnterpriseProfileWelcomeURL),
-      kSyncConfirmationDialogHeight, kSyncConfirmationDialogWidth,
+      kEnterpriseConfirmationDialogHeight, kEnterpriseConfirmationDialogWidth,
       InitializeSigninWebDialogUI(false));
 
   EnterpriseProfileWelcomeUI* web_dialog_ui =
diff --git a/chrome/browser/ui/views/safe_browsing/tailored_security_desktop_dialog.cc b/chrome/browser/ui/views/safe_browsing/tailored_security_desktop_dialog.cc
index c676e9f..a9cca99 100644
--- a/chrome/browser/ui/views/safe_browsing/tailored_security_desktop_dialog.cc
+++ b/chrome/browser/ui/views/safe_browsing/tailored_security_desktop_dialog.cc
@@ -89,7 +89,7 @@
           .SetInternalName(kTailoredSecurityNoticeDialog)
           .SetBannerImage(std::move(banner_image_light),
                           std::move(banner_image_dark))
-          .AddBodyText(body_text, kBodyText)
+          .AddParagraph(body_text, std::u16string(), kBodyText)
           .AddOkButton(
               base::BindOnce(&EnabledDialogModelDelegate::OnDialogAccepted,
                              base::Unretained(model_delegate_ptr)))
@@ -121,7 +121,7 @@
           .SetTitle(l10n_util::GetStringUTF16(
               IDS_TAILORED_SECURITY_DISABLED_DIALOG_TITLE))
           .SetInternalName(kTailoredSecurityNoticeDialog)
-          .AddBodyText(body_text, kBodyText)
+          .AddParagraph(body_text, std::u16string(), kBodyText)
           .AddOkButton(
               base::BindOnce(&DisabledDialogModelDelegate::OnDialogAccepted,
                              base::Unretained(model_delegate_ptr)),
diff --git a/chrome/browser/ui/views/session_crashed_bubble_view.cc b/chrome/browser/ui/views/session_crashed_bubble_view.cc
index 3f97392..2b8f8cfd 100644
--- a/chrome/browser/ui/views/session_crashed_bubble_view.cc
+++ b/chrome/browser/ui/views/session_crashed_bubble_view.cc
@@ -272,7 +272,7 @@
       .SetDialogDestroyingCallback(
           base::BindOnce(&SessionCrashedBubbleDelegate::OnWindowClosing,
                          base::Unretained(bubble_delegate)))
-      .AddBodyText(ui::DialogModelLabel(IDS_SESSION_CRASHED_VIEW_MESSAGE));
+      .AddParagraph(ui::DialogModelLabel(IDS_SESSION_CRASHED_VIEW_MESSAGE));
 
   if (offer_uma_optin) {
     RecordBubbleHistogramValue(SESSION_CRASHED_BUBBLE_OPTIN_BAR_SHOWN);
diff --git a/chrome/browser/ui/views/side_panel/side_panel.cc b/chrome/browser/ui/views/side_panel/side_panel.cc
index ee72743..3261a891 100644
--- a/chrome/browser/ui/views/side_panel/side_panel.cc
+++ b/chrome/browser/ui/views/side_panel/side_panel.cc
@@ -68,7 +68,7 @@
     // Undo DSF so that we can be sure to draw an integral number of pixels for
     // the border. Integral scale factors should be unaffected by this, but for
     // fractional scale factors this ensures sharp lines.
-    gfx::ScopedCanvas scoped(canvas);
+    gfx::ScopedCanvas scoped_unscale(canvas);
     float dsf = canvas->UndoDeviceScaleFactor();
 
     gfx::RectF scaled_bounds = gfx::ConvertRectToPixels(
@@ -92,7 +92,7 @@
       // Redo device-scale factor, the theme background is drawn in DIPs. Note
       // that the clip area above is in pixels, hence the
       // UndoDeviceScaleFactor() call before this.
-      gfx::ScopedCanvas scoped(canvas);
+      gfx::ScopedCanvas scoped_rescale(canvas);
       canvas->Scale(dsf, dsf);
 
       TopContainerBackground::PaintBackground(
diff --git a/chrome/browser/ui/views/side_panel/side_panel_content_proxy.cc b/chrome/browser/ui/views/side_panel/side_panel_content_proxy.cc
index 45f6a628..2aa92d2d 100644
--- a/chrome/browser/ui/views/side_panel/side_panel_content_proxy.cc
+++ b/chrome/browser/ui/views/side_panel/side_panel_content_proxy.cc
@@ -4,7 +4,7 @@
 
 #include "chrome/browser/ui/views/side_panel/side_panel_content_proxy.h"
 
-DEFINE_UI_CLASS_PROPERTY_TYPE(SidePanelContentProxy*);
+DEFINE_UI_CLASS_PROPERTY_TYPE(SidePanelContentProxy*)
 DEFINE_OWNED_UI_CLASS_PROPERTY_KEY(SidePanelContentProxy,
                                    kSidePanelContentProxyKey,
                                    nullptr)
diff --git a/chrome/browser/ui/views/side_search/side_search_browser_controller.cc b/chrome/browser/ui/views/side_search/side_search_browser_controller.cc
index a680dd9b..5bc947b 100644
--- a/chrome/browser/ui/views/side_search/side_search_browser_controller.cc
+++ b/chrome/browser/ui/views/side_search/side_search_browser_controller.cc
@@ -181,13 +181,11 @@
         views::FlexSpecification(views::MinimumFlexSizeRule::kPreferred,
                                  views::MaximumFlexSizeRule::kPreferred));
 
-    auto* simple_site_name = AddChildView(std::make_unique<views::Label>());
-    simple_site_name->SetID(static_cast<int>(
-        SideSearchBrowserController::SideSearchViewID::kSidePanelTitleLabel));
-    simple_site_name->SetHorizontalAlignment(gfx::ALIGN_LEFT);
-    simple_site_name->SetTextContext(CONTEXT_SIDE_PANEL_TITLE);
-    simple_site_name->SetTextStyle(views::style::STYLE_PRIMARY);
-    simple_site_name->SetProperty(
+    title_label_ = AddChildView(std::make_unique<views::Label>());
+    title_label_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
+    title_label_->SetTextContext(CONTEXT_SIDE_PANEL_TITLE);
+    title_label_->SetTextStyle(views::style::STYLE_PRIMARY);
+    title_label_->SetProperty(
         views::kFlexBehaviorKey,
         views::FlexSpecification(views::MinimumFlexSizeRule::kScaleToZero,
                                  views::MaximumFlexSizeRule::kUnbounded));
@@ -248,6 +246,8 @@
   }
   ~HeaderView() override = default;
 
+  views::Label* get_title_label() { return title_label_; }
+
  private:
   // Updates the toolbar insets which may change as we enter / leave touch mode.
   // Icons are also updated to give them the opportunity to resize and adjust
@@ -260,6 +260,7 @@
   }
 
   raw_ptr<DseImageView> dse_image_view_ = nullptr;
+  raw_ptr<views::Label> title_label_ = nullptr;
   raw_ptr<HeaderButton> feedback_button_ = nullptr;
   raw_ptr<HeaderButton> close_button_ = nullptr;
 
@@ -275,37 +276,6 @@
 BEGIN_METADATA(HeaderView, views::View)
 END_METADATA
 
-views::WebView* ConfigureSidePanel(views::View* side_panel,
-                                   Profile* profile,
-                                   Browser* browser,
-                                   base::RepeatingClosure callback) {
-  auto container = std::make_unique<views::FlexLayoutView>();
-  container->SetOrientation(views::LayoutOrientation::kVertical);
-  container->SetCrossAxisAlignment(views::LayoutAlignment::kStretch);
-  container->AddChildView(
-      std::make_unique<HeaderView>(std::move(callback), browser));
-  container->AddChildView(std::make_unique<views::Separator>());
-
-  // The WebView will fill the remaining space after the header view has been
-  // laid out.
-  auto* web_view =
-      container->AddChildView(std::make_unique<views::WebView>(profile));
-  web_view->SetProperty(
-      views::kFlexBehaviorKey,
-      views::FlexSpecification(views::MinimumFlexSizeRule::kScaleToZero,
-                               views::MaximumFlexSizeRule::kUnbounded));
-  web_view->SetBackground(views::CreateThemedSolidBackground(kColorToolbar));
-
-  side_panel->AddChildView(std::move(container));
-
-  // The side panel should not start visible to avoid having it participate in
-  // initial layout calculations. Its visibility state will be updated later on
-  // in UpdateSidePanel().
-  side_panel->SetVisible(false);
-
-  return web_view;
-}
-
 }  // namespace
 
 SideSearchBrowserController::SideSearchBrowserController(
@@ -313,14 +283,35 @@
     BrowserView* browser_view)
     : side_panel_(side_panel),
       browser_view_(browser_view),
-      web_view_(ConfigureSidePanel(
-          side_panel,
-          browser_view_->GetProfile(),
-          browser_view_->browser(),
-          base::BindRepeating(
-              &SideSearchBrowserController::SidePanelCloseButtonPressed,
-              base::Unretained(this)))),
       focus_tracker_(side_panel_, browser_view_->GetFocusManager()) {
+  auto container = std::make_unique<views::FlexLayoutView>();
+  container->SetOrientation(views::LayoutOrientation::kVertical);
+  container->SetCrossAxisAlignment(views::LayoutAlignment::kStretch);
+  auto* header_view = container->AddChildView(std::make_unique<HeaderView>(
+      base::BindRepeating(
+          &SideSearchBrowserController::SidePanelCloseButtonPressed,
+          base::Unretained(this)),
+      browser_view_->browser()));
+  title_label_ = header_view->get_title_label();
+  container->AddChildView(std::make_unique<views::Separator>());
+
+  // The WebView will fill the remaining space after the header view has been
+  // laid out.
+  web_view_ = container->AddChildView(
+      std::make_unique<views::WebView>(browser_view_->GetProfile()));
+  web_view_->SetProperty(
+      views::kFlexBehaviorKey,
+      views::FlexSpecification(views::MinimumFlexSizeRule::kScaleToZero,
+                               views::MaximumFlexSizeRule::kUnbounded));
+  web_view_->SetBackground(views::CreateThemedSolidBackground(kColorToolbar));
+
+  side_panel_->AddChildView(std::move(container));
+
+  // The side panel should not start visible to avoid having it participate in
+  // initial layout calculations. Its visibility state will be updated later on
+  // in UpdateSidePanel().
+  side_panel_->SetVisible(false);
+
   web_view_visibility_subscription_ =
       web_view_->AddVisibleChangedCallback(base::BindRepeating(
           &SideSearchBrowserController::OnWebViewVisibilityChanged,
@@ -599,10 +590,7 @@
 
   // Update the side panel header title text if necessary
   if (auto last_search_url = tab_contents_helper->last_search_url()) {
-    views::Label* title_label =
-        static_cast<views::Label*>(side_panel_->GetViewByID(
-            static_cast<int>(SideSearchViewID::kSidePanelTitleLabel)));
-    title_label->SetText(
+    title_label_->SetText(
         url_formatter::FormatUrlForDisplayOmitSchemePathAndTrivialSubdomains(
             last_search_url.value()));
   }
diff --git a/chrome/browser/ui/views/side_search/side_search_browser_controller.h b/chrome/browser/ui/views/side_search/side_search_browser_controller.h
index abbc94b8..fbc80d8b 100644
--- a/chrome/browser/ui/views/side_search/side_search_browser_controller.h
+++ b/chrome/browser/ui/views/side_search/side_search_browser_controller.h
@@ -12,6 +12,7 @@
 #include "chrome/browser/ui/side_search/side_search_metrics.h"
 #include "chrome/browser/ui/side_search/side_search_tab_contents_helper.h"
 #include "content/public/browser/web_contents_observer.h"
+#include "ui/views/controls/label.h"
 #include "ui/views/controls/webview/unhandled_keyboard_event_handler.h"
 #include "ui/views/focus/external_focus_tracker.h"
 #include "ui/views/view.h"
@@ -32,11 +33,6 @@
       public content::WebContentsObserver,
       public views::ViewObserver {
  public:
-  enum class SideSearchViewID {
-    kNone = 0,
-    kSidePanelTitleLabel,
-  };
-
   SideSearchBrowserController(SidePanel* side_panel, BrowserView* browser_view);
   SideSearchBrowserController(const SideSearchBrowserController&) = delete;
   SideSearchBrowserController& operator=(const SideSearchBrowserController&) =
@@ -108,7 +104,8 @@
   raw_ptr<ToolbarButton> toolbar_button_ = nullptr;
   raw_ptr<SidePanel> const side_panel_;
   raw_ptr<BrowserView> const browser_view_;
-  raw_ptr<views::WebView> const web_view_;
+  raw_ptr<views::Label> title_label_;
+  raw_ptr<views::WebView> web_view_;
 
   // Used to test whether or not the side panel was available the last time
   // `UpdateSidePanel()` was called. i.e. whether the ability for the user to
diff --git a/chrome/browser/ui/views/site_data/page_specific_site_data_dialog.cc b/chrome/browser/ui/views/site_data/page_specific_site_data_dialog.cc
index 05ffd9a4..171dcb30 100644
--- a/chrome/browser/ui/views/site_data/page_specific_site_data_dialog.cc
+++ b/chrome/browser/ui/views/site_data/page_specific_site_data_dialog.cc
@@ -215,8 +215,9 @@
       GetSections(delegate->GetAllOrigins(),
                   url::Origin::Create(web_contents->GetVisibleURL()));
   for (const auto& section : sections) {
-    builder.AddBodyText(ui::DialogModelLabel(section.title));
-    builder.AddBodyText(ui::DialogModelLabel(section.subtitle));
+    builder.AddParagraph(
+        ui::DialogModelLabel(section.subtitle).set_is_secondary(),
+        section.title);
     for (const auto& origin : section.origins) {
       // TODO(crbug.com/1344787): Get the actual state based on the cookie
       // setting.
diff --git a/chrome/browser/ui/views/supervised_user/extension_install_blocked_by_parent_dialog.cc b/chrome/browser/ui/views/supervised_user/extension_install_blocked_by_parent_dialog.cc
index 09d67185..356a5445 100644
--- a/chrome/browser/ui/views/supervised_user/extension_install_blocked_by_parent_dialog.cc
+++ b/chrome/browser/ui/views/supervised_user/extension_install_blocked_by_parent_dialog.cc
@@ -65,7 +65,7 @@
           .SetTitle(GetTitle(action, extension_type))
           .SetIcon(ui::ImageModel::FromImageSkia(gfx::CreateVectorIcon(
               chromeos::kNotificationSupervisedUserIcon, ui::kColorIcon)))
-          .AddBodyText(
+          .AddParagraph(
               ui::DialogModelLabel(GetBodyText(action, extension_type)))
           .AddOkButton(base::DoNothing(), l10n_util::GetStringUTF16(IDS_OK))
           .SetDialogDestroyingCallback(std::move(done_callback))
diff --git a/chrome/browser/ui/views/translate/partial_translate_bubble_view.cc b/chrome/browser/ui/views/translate/partial_translate_bubble_view.cc
index f8390d8..ac05125a 100644
--- a/chrome/browser/ui/views/translate/partial_translate_bubble_view.cc
+++ b/chrome/browser/ui/views/translate/partial_translate_bubble_view.cc
@@ -11,6 +11,7 @@
 #include <utility>
 #include <vector>
 
+#include "base/bind.h"
 #include "base/i18n/string_compare.h"
 #include "base/memory/singleton.h"
 #include "base/metrics/field_trial_params.h"
@@ -68,11 +69,12 @@
 #include "ui/views/controls/link.h"
 #include "ui/views/controls/styled_label.h"
 #include "ui/views/controls/tabbed_pane/tabbed_pane.h"
-#include "ui/views/controls/throbber.h"
 #include "ui/views/layout/box_layout.h"
 #include "ui/views/layout/box_layout_view.h"
 #include "ui/views/layout/flex_layout.h"
 #include "ui/views/layout/flex_layout_types.h"
+#include "ui/views/layout/flex_layout_view.h"
+#include "ui/views/layout/layout_types.h"
 #include "ui/views/style/platform_style.h"
 #include "ui/views/style/typography.h"
 #include "ui/views/view_class_properties.h"
@@ -176,6 +178,7 @@
   SetLayoutManager(std::make_unique<views::BoxLayout>(
       views::BoxLayout::Orientation::kVertical));
 
+  translate_view_waiting_ = AddChildView(CreateViewWaiting());
   translate_view_ = AddChildView(CreateView());
   advanced_view_source_ = AddChildView(CreateViewAdvancedSource());
   advanced_view_target_ = AddChildView(CreateViewAdvancedTarget());
@@ -245,6 +248,7 @@
 bool PartialTranslateBubbleView::AcceleratorPressed(
     const ui::Accelerator& accelerator) {
   switch (GetViewState()) {
+    case PartialTranslateBubbleModel::VIEW_STATE_WAITING:
     case PartialTranslateBubbleModel::VIEW_STATE_BEFORE_TRANSLATE: {
       if (accelerator.key_code() == ui::VKEY_RETURN) {
         Translate();
@@ -293,8 +297,9 @@
       model_->GetSourceLanguageNameAt(model_->GetSourceLanguageIndex());
   options_menu_model_->AddItem(
       OptionsMenuItem::CHANGE_SOURCE_LANGUAGE,
-      l10n_util::GetStringFUTF16(IDS_TRANSLATE_BUBBLE_CHANGE_SOURCE_LANGUAGE,
-                                 source_language));
+      l10n_util::GetStringFUTF16(
+          IDS_PARTIAL_TRANSLATE_BUBBLE_CHANGE_SOURCE_LANGUAGE,
+          source_language));
   options_menu_model_->SetElementIdentifierAt(
       options_menu_model_->GetItemCount() - 1, kChangeSourceLanguage);
 
@@ -362,7 +367,7 @@
       text_selection_(text_selection),
       on_closing_(std::move(on_closing)),
       web_contents_(web_contents) {
-  UpdateInsets(PartialTranslateBubbleModel::VIEW_STATE_BEFORE_TRANSLATE);
+  UpdateInsets(PartialTranslateBubbleModel::VIEW_STATE_WAITING);
 
   if (web_contents)  // web_contents can be null in unit_tests.
     mouse_handler_ =
@@ -374,6 +379,8 @@
 
 views::View* PartialTranslateBubbleView::GetCurrentView() const {
   switch (GetViewState()) {
+    case PartialTranslateBubbleModel::VIEW_STATE_WAITING:
+      return translate_view_waiting_;
     case PartialTranslateBubbleModel::VIEW_STATE_BEFORE_TRANSLATE:
       return translate_view_;
     case PartialTranslateBubbleModel::VIEW_STATE_TRANSLATING:
@@ -671,8 +678,43 @@
   return view;
 }
 
+std::unique_ptr<views::View> PartialTranslateBubbleView::CreateViewWaiting() {
+  const ChromeLayoutProvider* provider = ChromeLayoutProvider::Get();
+  auto view = std::make_unique<views::View>();
+  views::BoxLayout* layout =
+      view->SetLayoutManager(std::make_unique<views::BoxLayout>(
+          views::BoxLayout::Orientation::kVertical));
+  layout->set_between_child_spacing(
+      provider->GetDistanceMetric(views::DISTANCE_UNRELATED_CONTROL_VERTICAL));
+
+  // Title row.
+  const int close_button_margin_size = 5;
+  auto title_row = std::make_unique<views::View>();
+  title_row->SetLayoutManager(std::make_unique<views::BoxLayout>());
+  auto close_button_container = std::make_unique<views::BoxLayoutView>();
+  close_button_container->SetMainAxisAlignment(
+      views::BoxLayout::MainAxisAlignment::kEnd);
+  auto* close_button =
+      close_button_container->AddChildView(CreateCloseButton());
+  close_button->SetProperty(views::kMarginsKey,
+                            gfx::Insets::TLBR(close_button_margin_size, 0, 0,
+                                              close_button_margin_size));
+  view->AddChildView(std::move(close_button_container));
+
+  const int throbber_diameter = 35;
+  auto throbber_container = std::make_unique<views::FlexLayoutView>();
+  throbber_container->SetMainAxisAlignment(views::LayoutAlignment::kCenter);
+  auto throbber = std::make_unique<views::Throbber>();
+  throbber->SetPreferredSize(gfx::Size(throbber_diameter, throbber_diameter));
+  throbber_ = throbber_container->AddChildView(std::move(throbber));
+  throbber_->Start();
+  view->AddChildView(std::move(throbber_container));
+
+  return view;
+}
+
 // TODO(cuianthony): The code for advanced view creation for
-// PartialTranslateBubbleView is a duplicate of the code for
+// PartialTranslateBubbleView is a near duplicate of the code for
 // TranslateBubbleView. This should be refactored to share the view creation
 // code between the two bubbles.
 std::unique_ptr<views::View>
@@ -680,7 +722,8 @@
   // Bubble title
   std::unique_ptr<views::Label> source_language_title_label =
       std::make_unique<views::Label>(
-          l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_ADVANCED_SOURCE),
+          l10n_util::GetStringUTF16(
+              IDS_PARTIAL_TRANSLATE_BUBBLE_ADVANCED_SOURCE),
           views::style::CONTEXT_DIALOG_TITLE);
 
   // Language icon
@@ -908,6 +951,9 @@
 void PartialTranslateBubbleView::SetWindowTitle(
     PartialTranslateBubbleModel::ViewState view_state) {
   switch (view_state) {
+    case PartialTranslateBubbleModel::VIEW_STATE_WAITING:
+      SetTitle(IDS_PARTIAL_TRANSLATE_BUBBLE_WAITING_TITLE);
+      break;
     case PartialTranslateBubbleModel::VIEW_STATE_BEFORE_TRANSLATE:
       SetTitle(IDS_TRANSLATE_BUBBLE_BEFORE_TRANSLATE_TITLE);
       break;
@@ -921,7 +967,7 @@
       SetTitle(IDS_TRANSLATE_BUBBLE_COULD_NOT_TRANSLATE_TITLE);
       break;
     case PartialTranslateBubbleModel::VIEW_STATE_SOURCE_LANGUAGE:
-      SetTitle(IDS_TRANSLATE_BUBBLE_ADVANCED_SOURCE);
+      SetTitle(IDS_PARTIAL_TRANSLATE_BUBBLE_ADVANCED_SOURCE);
       break;
     case PartialTranslateBubbleModel::VIEW_STATE_TARGET_LANGUAGE:
       SetTitle(IDS_TRANSLATE_BUBBLE_ADVANCED_TARGET);
@@ -948,6 +994,12 @@
 
   SwitchTabForViewState(view_state);
 
+  // In cases where we are switching from the waiting view, the spinner should
+  // be stopped.
+  if (view_state != PartialTranslateBubbleModel::VIEW_STATE_WAITING &&
+      throbber_)
+    throbber_->Stop();
+
   UpdateViewState(view_state);
   if (view_state == PartialTranslateBubbleModel::VIEW_STATE_SOURCE_LANGUAGE ||
       view_state == PartialTranslateBubbleModel::VIEW_STATE_TARGET_LANGUAGE)
diff --git a/chrome/browser/ui/views/translate/partial_translate_bubble_view.h b/chrome/browser/ui/views/translate/partial_translate_bubble_view.h
index 65f31c28..273f309 100644
--- a/chrome/browser/ui/views/translate/partial_translate_bubble_view.h
+++ b/chrome/browser/ui/views/translate/partial_translate_bubble_view.h
@@ -27,6 +27,7 @@
 #include "ui/views/controls/menu/menu_runner.h"
 #include "ui/views/controls/tabbed_pane/tabbed_pane.h"
 #include "ui/views/controls/tabbed_pane/tabbed_pane_listener.h"
+#include "ui/views/controls/throbber.h"
 #include "ui/views/window/non_client_view.h"
 
 namespace views {
@@ -147,6 +148,9 @@
   std::unique_ptr<views::View> CreateViewErrorNoTitle(
       std::unique_ptr<views::Button> advanced_button);
 
+  // Creates the 'waiting' view that shows an empty bubble with a throbber.
+  std::unique_ptr<views::View> CreateViewWaiting();
+
   // Creates source language label and combobox for Tab UI advanced view. Caller
   // takes ownership of the returned view.
   std::unique_ptr<views::View> CreateViewAdvancedSource();
@@ -218,11 +222,14 @@
 
   static PartialTranslateBubbleView* partial_translate_bubble_view_;
 
+  raw_ptr<views::View> translate_view_waiting_ = nullptr;
   raw_ptr<views::View> translate_view_ = nullptr;
   raw_ptr<views::View> error_view_ = nullptr;
   raw_ptr<views::View> advanced_view_source_ = nullptr;
   raw_ptr<views::View> advanced_view_target_ = nullptr;
 
+  views::Throbber* throbber_;
+
   raw_ptr<views::Combobox> source_language_combobox_ = nullptr;
   raw_ptr<views::Combobox> target_language_combobox_ = nullptr;
 
diff --git a/chrome/browser/ui/views/translate/translate_bubble_controller.cc b/chrome/browser/ui/views/translate/translate_bubble_controller.cc
index 70c356e4..502c0e2 100644
--- a/chrome/browser/ui/views/translate/translate_bubble_controller.cc
+++ b/chrome/browser/ui/views/translate/translate_bubble_controller.cc
@@ -6,6 +6,8 @@
 
 #include <memory>
 
+#include "base/bind.h"
+#include "chrome/browser/ui/translate/partial_translate_bubble_model.h"
 #include "chrome/browser/ui/translate/partial_translate_bubble_model_impl.h"
 #include "chrome/browser/ui/translate/partial_translate_bubble_ui_action_logger.h"
 #include "chrome/browser/ui/translate/translate_bubble_model_impl.h"
@@ -92,6 +94,58 @@
   return bubble_widget;
 }
 
+void TranslateBubbleController::StartPartialTranslate(
+    views::View* anchor_view,
+    views::Button* highlighted_button,
+    const std::string& source_language,
+    const std::string& target_language,
+    const std::u16string& text_selection) {
+  // TODO(crbug/1314825): When PartialTranslateManager is completed this
+  // function will be updated to show the Partial Translate bubble as soon as
+  // the translate response is received. If response time is <=500ms the bubble
+  // will be shown directly with the translation. If response time is >500ms the
+  // bubble will be shown in a loading state until the translation is ready.
+  // Current implementation is only for UI purposes and simulates the latter
+  // case.
+  partial_translate_timer_.Start(
+      FROM_HERE, base::Milliseconds(500),
+      base::BindOnce(&TranslateBubbleController::OnPartialTranslateWaitExpired,
+                     weak_ptr_factory_.GetWeakPtr(), anchor_view,
+                     highlighted_button, source_language, target_language,
+                     text_selection));
+}
+
+void TranslateBubbleController::OnPartialTranslateWaitExpired(
+    views::View* anchor_view,
+    views::Button* highlighted_button,
+    const std::string& source_language,
+    const std::string& target_language,
+    const std::u16string& text_selection) {
+  // TODO(crbug/1314825): When PartialTranslateManager is completed this
+  // callback will be updated to handle two cases depending on the response. If
+  // the response is quick, the bubble will be shown in the translated state
+  // with the translated text. If there's a longer response time, the bubble
+  // will be shown in an intermediate loading state.
+  ShowPartialTranslateBubble(anchor_view, highlighted_button,
+                             PartialTranslateBubbleModel::VIEW_STATE_WAITING,
+                             source_language, target_language, text_selection,
+                             translate::TranslateErrors::NONE);
+
+  // TODO(crbug/1314825): When PartialTranslateManager is completed, this
+  // duration will be updated to depend on the backend response time. For now, a
+  // 2 second timer is used to mimic this delay.
+  throbber_timer_.Start(
+      FROM_HERE, base::Milliseconds(2000),
+      base::BindOnce(
+          [](base::WeakPtr<TranslateBubbleController> controller) {
+            controller->partial_translate_bubble_view_->SetViewState(
+                PartialTranslateBubbleModel::ViewState::
+                    VIEW_STATE_AFTER_TRANSLATE,
+                translate::TranslateErrors::Type::NONE);
+          },
+          weak_ptr_factory_.GetWeakPtr()));
+}
+
 views::Widget* TranslateBubbleController::ShowPartialTranslateBubble(
     views::View* anchor_view,
     views::Button* highlighted_button,
@@ -138,14 +192,11 @@
           anchor_view, std::move(model), error_type, web_contents,
           text_selection, GetOnPartialTranslateBubbleClosedCallback());
   partial_translate_bubble_view_ = partial_translate_bubble_view.get();
-
   if (highlighted_button)
     partial_translate_bubble_view_->SetHighlightedButton(highlighted_button);
   views::Widget* bubble_widget = views::BubbleDialogDelegateView::CreateBubble(
       std::move(partial_translate_bubble_view));
-
   partial_translate_bubble_view_->SetViewState(view_state, error_type);
-
   partial_translate_bubble_view_->ShowForReason(
       LocationBarBubbleDelegateView::USER_GESTURE);
   translate::ReportPartialTranslateBubbleUiAction(
diff --git a/chrome/browser/ui/views/translate/translate_bubble_controller.h b/chrome/browser/ui/views/translate/translate_bubble_controller.h
index d05fd74..6d24e55 100644
--- a/chrome/browser/ui/views/translate/translate_bubble_controller.h
+++ b/chrome/browser/ui/views/translate/translate_bubble_controller.h
@@ -35,6 +35,14 @@
       translate::TranslateErrors::Type error_type,
       LocationBarBubbleDelegateView::DisplayReason reason);
 
+  // Initiates the Partial Translate request, showing the bubble after a delay
+  // dependent on the Partial Translate response.
+  void StartPartialTranslate(views::View* anchor_view,
+                             views::Button* highlighted_button,
+                             const std::string& source_language,
+                             const std::string& target_language,
+                             const std::u16string& text_selection);
+
   // Shows the Partial Translate bubble. Returns the newly created bubble's
   // Widget or nullptr in cases when the bubble already exists or when the
   // bubble is not created.
@@ -92,6 +100,21 @@
   void OnTranslateBubbleClosed();
   void OnPartialTranslateBubbleClosed();
 
+  // Callback for handling how the bubble should be shown, depending on the
+  // Partial Translate response.
+  void OnPartialTranslateWaitExpired(views::View* anchor_view,
+                                     views::Button* highlighted_button,
+                                     const std::string& source_language,
+                                     const std::string& target_language,
+                                     const std::u16string& text_selection);
+
+  // Timer used for handling the delay before showing Partial Translate bubble.
+  base::OneShotTimer partial_translate_timer_;
+
+  // Timer used for mimicking wait time for Partial Translate response. This
+  // will be removed with the completion of PartialTranslateManager.
+  base::OneShotTimer throbber_timer_;
+
   friend class content::WebContentsUserData<TranslateBubbleController>;
   friend class TranslateBubbleControllerTest;
   WEB_CONTENTS_USER_DATA_KEY_DECL();
diff --git a/chrome/browser/ui/views/translate/translate_icon_view_interactive_uitest.cc b/chrome/browser/ui/views/translate/translate_icon_view_interactive_uitest.cc
index 4acfc64..edd57c9b 100644
--- a/chrome/browser/ui/views/translate/translate_icon_view_interactive_uitest.cc
+++ b/chrome/browser/ui/views/translate/translate_icon_view_interactive_uitest.cc
@@ -12,6 +12,7 @@
 #include "chrome/browser/ui/views/translate/translate_bubble_controller.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/interactive_test_utils.h"
+#include "components/translate/core/browser/translate_manager.h"
 #include "content/public/test/browser_test.h"
 #include "ui/base/test/ui_controls.h"
 
@@ -37,20 +38,42 @@
                browser()->tab_strip_model()->GetActiveWebContents())
         ->GetPartialTranslateBubble();
   }
+
+  std::unique_ptr<views::Widget> CreateTestWidget() {
+    auto widget = std::make_unique<views::Widget>();
+
+    views::Widget::InitParams params;
+    params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
+    params.type = views::Widget::InitParams::TYPE_WINDOW;
+    widget->Init(std::move(params));
+
+    return widget;
+  }
 };
 
 // Verifies that clicking the Translate icon closes the Partial Translate bubble
 // and results in neither of the two Translate bubbles being shown.
 IN_PROC_BROWSER_TEST_F(TranslateIconViewTest, ClosePartialTranslateBubble) {
-  browser()->window()->ShowPartialTranslateBubble(
-      PartialTranslateBubbleModel::ViewState::VIEW_STATE_BEFORE_TRANSLATE, "fr",
-      "en", std::u16string(), TranslateErrors::NONE);
-  EXPECT_THAT(GetPartialTranslateBubble(), ::testing::NotNull());
-
-  // The Translate icon should appear with the Partial Translate bubble
+  // Show the Translate icon.
+  ChromeTranslateClient::FromWebContents(
+      browser()->tab_strip_model()->GetActiveWebContents())
+      ->GetTranslateManager()
+      ->GetLanguageState()
+      ->SetTranslateEnabled(true);
   PageActionIconView* translate_icon = GetTranslateIcon();
   EXPECT_THAT(translate_icon, ::testing::NotNull());
 
+  TranslateBubbleController* controller =
+      TranslateBubbleController::GetOrCreate(
+          browser()->tab_strip_model()->GetActiveWebContents());
+  auto anchor_widget = CreateTestWidget();
+  views::View* anchor_view = anchor_widget->GetContentsView();
+  controller->ShowPartialTranslateBubble(
+      anchor_view, nullptr,
+      PartialTranslateBubbleModel::ViewState::VIEW_STATE_BEFORE_TRANSLATE, "fr",
+      "en", std::u16string(), translate::TranslateErrors::Type::NONE);
+  EXPECT_THAT(GetPartialTranslateBubble(), ::testing::NotNull());
+
   // Clicking the icon should close the Partial Translate bubble and should not
   // open the Full Page Translate bubble.
   base::RunLoop loop;
diff --git a/chrome/browser/ui/views/web_apps/web_app_detailed_install_dialog.cc b/chrome/browser/ui/views/web_apps/web_app_detailed_install_dialog.cc
index 0b9dd1e..bd60b45 100644
--- a/chrome/browser/ui/views/web_apps/web_app_detailed_install_dialog.cc
+++ b/chrome/browser/ui/views/web_apps/web_app_detailed_install_dialog.cc
@@ -315,7 +315,7 @@
           .SetIcon(ui::ImageModel::FromImageSkia(icon_image))
           .SetTitle(title)
           .SetSubtitle(base::UTF8ToUTF16(start_url_host))
-          .AddBodyText(ui::DialogModelLabel(description))
+          .AddParagraph(ui::DialogModelLabel(description))
           .AddOkButton(
               base::BindOnce(
                   &web_app::WebAppDetailedInstallDialogDelegate::OnAccept,
diff --git a/chrome/browser/ui/views/web_apps/web_app_detailed_install_dialog_browsertest.cc b/chrome/browser/ui/views/web_apps/web_app_detailed_install_dialog_browsertest.cc
index fb096fcc..e43f8fbd7 100644
--- a/chrome/browser/ui/views/web_apps/web_app_detailed_install_dialog_browsertest.cc
+++ b/chrome/browser/ui/views/web_apps/web_app_detailed_install_dialog_browsertest.cc
@@ -53,7 +53,7 @@
     bitmap.allocN32Pixels(width, height);
     bitmap.eraseColor(color);
     return bitmap;
-  };
+  }
 
   static constexpr int kIconSize = 40;
   static constexpr int kScreenshotSize = 300;
diff --git a/chrome/browser/ui/web_applications/web_app_file_handling_browsertest.cc b/chrome/browser/ui/web_applications/web_app_file_handling_browsertest.cc
index 280221f..f84682b 100644
--- a/chrome/browser/ui/web_applications/web_app_file_handling_browsertest.cc
+++ b/chrome/browser/ui/web_applications/web_app_file_handling_browsertest.cc
@@ -267,8 +267,8 @@
           file_handler_manager().GetMatchingFileHandlerUrls(app_id, files);
       EXPECT_EQ(1u, launch_infos.size());
 
-      const auto& [url, files] = launch_infos[0];
-      params.launch_files = files;
+      const auto& [url, launch_files] = launch_infos[0];
+      params.launch_files = launch_files;
       params.override_url = url;
     }
 
diff --git a/chrome/browser/ui/webui/chromeos/cloud_upload/cloud_upload_ui.cc b/chrome/browser/ui/webui/chromeos/cloud_upload/cloud_upload_ui.cc
index 37a060a0..1e7bd0f 100644
--- a/chrome/browser/ui/webui/chromeos/cloud_upload/cloud_upload_ui.cc
+++ b/chrome/browser/ui/webui/chromeos/cloud_upload/cloud_upload_ui.cc
@@ -59,6 +59,6 @@
   ui::MojoWebDialogUI::CloseDialog(args);
 }
 
-WEB_UI_CONTROLLER_TYPE_IMPL(CloudUploadUI);
+WEB_UI_CONTROLLER_TYPE_IMPL(CloudUploadUI)
 
 }  // namespace chromeos::cloud_upload
diff --git a/chrome/browser/ui/webui/chromeos/in_session_password_change/lock_screen_start_reauth_ui.cc b/chrome/browser/ui/webui/chromeos/in_session_password_change/lock_screen_start_reauth_ui.cc
index 27d710b..1552ed0 100644
--- a/chrome/browser/ui/webui/chromeos/in_session_password_change/lock_screen_start_reauth_ui.cc
+++ b/chrome/browser/ui/webui/chromeos/in_session_password_change/lock_screen_start_reauth_ui.cc
@@ -11,7 +11,9 @@
 #include "chrome/browser/ui/webui/metrics_handler.h"
 #include "chrome/common/webui_url_constants.h"
 #include "chrome/grit/browser_resources.h"
+#include "chrome/grit/gaia_auth_host_resources_map.h"
 #include "chrome/grit/generated_resources.h"
+#include "chrome/grit/oobe_unconditional_resources_map.h"
 #include "content/public/browser/web_ui_data_source.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/chromeos/devicetype_utils.h"
@@ -40,6 +42,7 @@
   source->DisableTrustedTypesCSP();
 
   source->EnableReplaceI18nInJS();
+  source->UseStringsJs();
 
   source->AddString("lockScreenReauthSubtitile",
                     l10n_util::GetStringFUTF16(IDS_LOCK_SCREEN_REAUTH_SUBTITLE,
@@ -98,13 +101,24 @@
       "passwordChangedOldPasswordHint",
       l10n_util::GetStringUTF16(IDS_LOCK_PASSWORD_CHANGED_OLD_PASSWORD_HINT));
 
-  source->SetDefaultResource(IDR_LOCK_SCREEN_REAUTH_HTML);
+  source->SetDefaultResource(IDR_LOCK_SCREEN_REAUTH_APP_HTML);
 
-  source->AddResourcePath("authenticator.js", IDR_GAIA_AUTH_AUTHENTICATOR_JS);
   source->AddResourcePath("webview_saml_injected.js",
                           IDR_GAIA_AUTH_WEBVIEW_SAML_INJECTED_JS);
 
+  // Add Gaia Authenticator resources
+  source->AddResourcePaths(
+      base::make_span(kGaiaAuthHostResources, kGaiaAuthHostResourcesSize));
+
+  // Add OOBE resources
+  source->AddResourcePaths(base::make_span(kOobeUnconditionalResources,
+                                           kOobeUnconditionalResourcesSize));
+
+  source->AddResourcePath("lock_screen_reauth.html",
+                          IDR_LOCK_SCREEN_REAUTH_HTML);
   source->AddResourcePath("lock_screen_reauth.js", IDR_LOCK_SCREEN_REAUTH_JS);
+  source->AddResourcePath("lock_screen_reauth_app.js",
+                          IDR_LOCK_SCREEN_REAUTH_APP_JS);
 
   content::WebUIDataSource::Add(profile, source);
 }
diff --git a/chrome/browser/ui/webui/history_clusters/history_clusters_handler.cc b/chrome/browser/ui/webui/history_clusters/history_clusters_handler.cc
index 6177943..a208df0 100644
--- a/chrome/browser/ui/webui/history_clusters/history_clusters_handler.cc
+++ b/chrome/browser/ui/webui/history_clusters/history_clusters_handler.cc
@@ -378,11 +378,13 @@
 
   std::vector<history::BrowsingHistoryService::HistoryEntry> items_to_remove;
   for (const auto& visit : visits) {
-    history::BrowsingHistoryService::HistoryEntry entry;
-    entry.url = visit->raw_visit_data->url;
-    entry.all_timestamps.insert(
-        visit->raw_visit_data->visit_time.ToInternalValue());
-    items_to_remove.push_back(std::move(entry));
+    {
+      history::BrowsingHistoryService::HistoryEntry entry;
+      entry.url = visit->raw_visit_data->url;
+      entry.all_timestamps.insert(
+          visit->raw_visit_data->visit_time.ToInternalValue());
+      items_to_remove.push_back(std::move(entry));
+    }
     for (const auto& duplicate : visit->duplicates) {
       history::BrowsingHistoryService::HistoryEntry entry;
       entry.url = duplicate->url;
diff --git a/chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.cc b/chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.cc
index d67fc42..3246a6b 100644
--- a/chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.cc
+++ b/chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.cc
@@ -612,17 +612,17 @@
 }
 
 // static
-bool NewTabPageUI::IsDriveModuleEnabled(Profile* profile) {
+bool NewTabPageUI::IsDriveModuleEnabledForProfile(Profile* profile) {
   // TODO(crbug.com/1321896): Explore not requiring sync for the drive
   // module to be enabled.
   auto* sync_service = SyncServiceFactory::GetForProfile(profile);
-  if (!base::FeatureList::IsEnabled(ntp_features::kNtpDriveModule) ||
-      !sync_service || !sync_service->IsSyncFeatureEnabled()) {
+  if (!IsDriveModuleEnabled() || !sync_service ||
+      !sync_service->IsSyncFeatureEnabled()) {
     return false;
   }
-  if (base::GetFieldTrialParamValueByFeature(
+  if (!base::GetFieldTrialParamByFeatureAsBool(
           ntp_features::kNtpDriveModule,
-          ntp_features::kNtpDriveModuleManagedUsersOnlyParam) != "true") {
+          ntp_features::kNtpDriveModuleManagedUsersOnlyParam, true)) {
     return true;
   }
   // TODO(crbug.com/1213351): Stop calling the private method
@@ -854,7 +854,8 @@
 void NewTabPageUI::OnLoad() {
   base::Value::Dict update;
   update.Set("navigationStartTime", navigation_start_time_.ToJsTime());
-  bool driveModuleEnabled = NewTabPageUI::IsDriveModuleEnabled(profile_);
+  bool driveModuleEnabled =
+      NewTabPageUI::IsDriveModuleEnabledForProfile(profile_);
   bool anyModuleEnabled = driveModuleEnabled;
   for (const auto& nameFeature : kModuleFeatures) {
     anyModuleEnabled |= base::FeatureList::IsEnabled(nameFeature.second);
diff --git a/chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.h b/chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.h
index 877f80e..ee92bbb1 100644
--- a/chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.h
+++ b/chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.h
@@ -88,7 +88,7 @@
   static bool IsNewTabPageOrigin(const GURL& url);
   static void RegisterProfilePrefs(PrefRegistrySimple* registry);
   static void ResetProfilePrefs(PrefService* prefs);
-  static bool IsDriveModuleEnabled(Profile* profile);
+  static bool IsDriveModuleEnabledForProfile(Profile* profile);
 
   // Instantiates the implementor of the mojom::PageHandlerFactory mojo
   // interface passing the pending receiver that will be internally bound.
diff --git a/chrome/browser/ui/webui/omnibox/omnibox_page_handler.cc b/chrome/browser/ui/webui/omnibox/omnibox_page_handler.cc
index ceebbb3..1c0abdc 100644
--- a/chrome/browser/ui/webui/omnibox/omnibox_page_handler.cc
+++ b/chrome/browser/ui/webui/omnibox/omnibox_page_handler.cc
@@ -33,10 +33,10 @@
 #include "components/omnibox/browser/autocomplete_match.h"
 #include "components/omnibox/browser/autocomplete_provider.h"
 #include "components/omnibox/browser/omnibox_controller_emitter.h"
-#include "components/search_engines/omnibox_focus_type.h"
 #include "components/search_engines/template_url.h"
 #include "content/public/browser/web_ui.h"
 #include "third_party/metrics_proto/omnibox_event.pb.h"
+#include "third_party/metrics_proto/omnibox_focus_type.pb.h"
 #include "third_party/skia/include/core/SkBitmap.h"
 #include "ui/gfx/image/image.h"
 
@@ -358,8 +358,9 @@
   input.set_prefer_keyword(prefer_keyword);
   if (prefer_keyword)
     input.set_keyword_mode_entry_method(metrics::OmniboxEventProto::TAB);
-  input.set_focus_type(zero_suggest ? OmniboxFocusType::ON_FOCUS
-                                    : OmniboxFocusType::DEFAULT);
+  input.set_focus_type(zero_suggest
+                           ? metrics::OmniboxFocusType::INTERACTION_FOCUS
+                           : metrics::OmniboxFocusType::INTERACTION_DEFAULT);
 
   controller_->Start(input);
 }
diff --git a/chrome/browser/ui/webui/realbox/realbox_handler.cc b/chrome/browser/ui/webui/realbox/realbox_handler.cc
index afdebc6..22d7d3a9 100644
--- a/chrome/browser/ui/webui/realbox/realbox_handler.cc
+++ b/chrome/browser/ui/webui/realbox/realbox_handler.cc
@@ -10,6 +10,7 @@
 #include "base/metrics/user_metrics.h"
 #include "base/metrics/user_metrics_action.h"
 #include "base/strings/string_util.h"
+#include "base/strings/utf_string_conversions.h"
 #include "build/branding_buildflags.h"
 #include "build/build_config.h"
 #include "build/chromeos_buildflags.h"
@@ -48,13 +49,13 @@
 #include "components/prefs/pref_service.h"
 #include "components/profile_metrics/browser_profile_type.h"
 #include "components/search/ntp_features.h"
-#include "components/search_engines/omnibox_focus_type.h"
 #include "components/search_engines/template_url_service.h"
 #include "components/sessions/content/session_tab_helper.h"
 #include "components/strings/grit/components_strings.h"
 #include "components/vector_icons/vector_icons.h"
 #include "content/public/browser/web_ui_data_source.h"
 #include "net/cookies/cookie_util.h"
+#include "third_party/metrics_proto/omnibox_focus_type.pb.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/webui/resource_path.h"
 #include "ui/base/webui/web_ui_util.h"
@@ -129,7 +130,8 @@
   for (const auto& pair : suggestion_groups_map) {
     realbox::mojom::SuggestionGroupPtr suggestion_group =
         realbox::mojom::SuggestionGroup::New();
-    suggestion_group->header = pair.second.header;
+    suggestion_group->header =
+        base::UTF8ToUTF16(pair.second.group_config_info.header_text());
     suggestion_group->hidden =
         result.IsSuggestionGroupHidden(prefs, pair.first);
     suggestion_group->show_group_a11y_label = l10n_util::GetStringFUTF16(
@@ -514,8 +516,9 @@
   AutocompleteInput autocomplete_input(
       input, metrics::OmniboxEventProto::NTP_REALBOX,
       ChromeAutocompleteSchemeClassifier(profile_));
-  autocomplete_input.set_focus_type(is_on_focus ? OmniboxFocusType::ON_FOCUS
-                                                : OmniboxFocusType::DEFAULT);
+  autocomplete_input.set_focus_type(
+      is_on_focus ? metrics::OmniboxFocusType::INTERACTION_FOCUS
+                  : metrics::OmniboxFocusType::INTERACTION_DEFAULT);
   autocomplete_input.set_prevent_inline_autocomplete(
       prevent_inline_autocomplete);
 
@@ -625,7 +628,8 @@
           : default_time_delta;
 
   OmniboxLog log(
-      /*text=*/input.focus_type() != OmniboxFocusType::DEFAULT
+      /*text=*/input.focus_type() !=
+              metrics::OmniboxFocusType::INTERACTION_DEFAULT
           ? std::u16string()
           : input.text(),
       /*just_deleted_text=*/input.prevent_inline_autocomplete(),
diff --git a/chrome/browser/ui/webui/settings/chromeos/accessibility_section.cc b/chrome/browser/ui/webui/settings/chromeos/accessibility_section.cc
index b1f5bc7..e9336e7 100644
--- a/chrome/browser/ui/webui/settings/chromeos/accessibility_section.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/accessibility_section.cc
@@ -448,10 +448,6 @@
   return captions::IsLiveCaptionFeatureSupported();
 }
 
-bool IsMagnifierContinuousMouseFollowingModeSettingEnabled() {
-  return ::features::IsMagnifierContinuousMouseFollowingModeSettingEnabled();
-}
-
 bool IsAccessibilityOSSettingsVisibilityEnabled() {
   return ::features::IsAccessibilityOSSettingsVisibilityEnabled();
 }
@@ -917,10 +913,6 @@
   html_source->AddString("tabletModeShelfNavigationButtonsLearnMoreUrl",
                          chrome::kTabletModeGesturesLearnMoreURL);
 
-  html_source->AddBoolean(
-      "isMagnifierContinuousMouseFollowingModeSettingEnabled",
-      IsMagnifierContinuousMouseFollowingModeSettingEnabled());
-
   html_source->AddBoolean("isAccessibilityOSSettingsVisibilityEnabled",
                           IsAccessibilityOSSettingsVisibilityEnabled());
 
diff --git a/chrome/browser/ui/webui/settings/chromeos/main_section.cc b/chrome/browser/ui/webui/settings/chromeos/main_section.cc
index 0a152089..f97eba8 100644
--- a/chrome/browser/ui/webui/settings/chromeos/main_section.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/main_section.cc
@@ -266,6 +266,10 @@
       l10n_util::GetStringFUTF16(IDS_BLUETOOTH_NO_SAVED_DEVICES_LABEL,
                                  base::ASCIIToUTF16(primary_user_email)));
   html_source->AddString(
+      "loadingDevicesWithEmail",
+      l10n_util::GetStringFUTF16(IDS_BLUETOOTH_SAVED_DEVICES_LOADING_LABEL,
+                                 base::ASCIIToUTF16(primary_user_email)));
+  html_source->AddString(
       "savedDevicesErrorWithEmail",
       l10n_util::GetStringFUTF16(IDS_BLUETOOTH_SAVED_DEVICES_ERROR_LABEL,
                                  base::ASCIIToUTF16(primary_user_email)));
diff --git a/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc b/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc
index ff6e58c1..da6c64f 100644
--- a/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc
+++ b/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc
@@ -2549,16 +2549,18 @@
   auto remaining_host_nodes = GetHostNodes(GURL("https://www.example.com"));
 
   // example.com storage partitioned on other sites should still remain.
-  ASSERT_EQ(1u, remaining_host_nodes.size());
-  ASSERT_EQ(1u, remaining_host_nodes[0]->children().size());
-  const auto& storage_node = remaining_host_nodes[0]->children()[0];
-  ASSERT_EQ(CookieTreeNode::DetailedInfo::TYPE_COOKIES,
-            storage_node->GetDetailedInfo().node_type);
-  ASSERT_EQ(2u, storage_node->children().size());
-  for (const auto& cookie_node : storage_node->children()) {
-    const auto& cookie = cookie_node->GetDetailedInfo().cookie;
-    EXPECT_EQ("www.example.com", cookie->Domain());
-    EXPECT_TRUE(cookie->IsPartitioned());
+  {
+    ASSERT_EQ(1u, remaining_host_nodes.size());
+    ASSERT_EQ(1u, remaining_host_nodes[0]->children().size());
+    const auto& storage_node = remaining_host_nodes[0]->children()[0];
+    ASSERT_EQ(CookieTreeNode::DetailedInfo::TYPE_COOKIES,
+              storage_node->GetDetailedInfo().node_type);
+    ASSERT_EQ(2u, storage_node->children().size());
+    for (const auto& cookie_node : storage_node->children()) {
+      const auto& cookie = cookie_node->GetDetailedInfo().cookie;
+      EXPECT_EQ("www.example.com", cookie->Domain());
+      EXPECT_TRUE(cookie->IsPartitioned());
+    }
   }
 
   EXPECT_EQ(22u,
diff --git a/chrome/browser/ui/webui/signin/signin_helper_chromeos_browsertest.cc b/chrome/browser/ui/webui/signin/signin_helper_chromeos_browsertest.cc
index 448a54e..d096f2ba 100644
--- a/chrome/browser/ui/webui/signin/signin_helper_chromeos_browsertest.cc
+++ b/chrome/browser/ui/webui/signin/signin_helper_chromeos_browsertest.cc
@@ -49,7 +49,6 @@
     "https://secureconnect-pa.clients6.google.com/"
     "v1:getManagedAccountsSigninRestriction?policy_name="
     "SecondaryGoogleAccountUsage";
-;
 
 // Fake responses for the URL requests that are part of the sign-in flow.
 const char kOnClientOAuthSuccessBody[] =
diff --git a/chrome/browser/web_applications/app_service/web_app_publisher_helper_unittest.cc b/chrome/browser/web_applications/app_service/web_app_publisher_helper_unittest.cc
index 00ec3d7..055ed9a 100644
--- a/chrome/browser/web_applications/app_service/web_app_publisher_helper_unittest.cc
+++ b/chrome/browser/web_applications/app_service/web_app_publisher_helper_unittest.cc
@@ -48,12 +48,12 @@
 
 class NoOpWebAppPublisherDelegate : public WebAppPublisherHelper::Delegate {
   // WebAppPublisherHelper::Delegate:
-  void PublishWebApps(std::vector<apps::AppPtr> apps) override{};
-  void PublishWebApp(apps::AppPtr app) override{};
+  void PublishWebApps(std::vector<apps::AppPtr> apps) override {}
+  void PublishWebApp(apps::AppPtr app) override {}
   void ModifyWebAppCapabilityAccess(
       const std::string& app_id,
       absl::optional<bool> accessing_camera,
-      absl::optional<bool> accessing_microphone) override{};
+      absl::optional<bool> accessing_microphone) override {}
 };
 
 std::string ToString(const apps::AppPtr& app) {
diff --git a/chrome/browser/web_applications/commands/externally_managed_install_command_browsertest.cc b/chrome/browser/web_applications/commands/externally_managed_install_command_browsertest.cc
index 01c6841d..5cab8ca 100644
--- a/chrome/browser/web_applications/commands/externally_managed_install_command_browsertest.cc
+++ b/chrome/browser/web_applications/commands/externally_managed_install_command_browsertest.cc
@@ -208,4 +208,4 @@
   run_loop.Run();
 }
 
-};  // namespace web_app
+}  // namespace web_app
diff --git a/chrome/browser/web_applications/commands/run_on_os_login_command.h b/chrome/browser/web_applications/commands/run_on_os_login_command.h
index d1b8673..8411d8e 100644
--- a/chrome/browser/web_applications/commands/run_on_os_login_command.h
+++ b/chrome/browser/web_applications/commands/run_on_os_login_command.h
@@ -59,7 +59,7 @@
   Lock& lock() const override;
 
   void Start() override;
-  void OnSyncSourceRemoved() override{};
+  void OnSyncSourceRemoved() override {}
   void OnShutdown() override;
   base::Value ToDebugValue() const override;
 
diff --git a/chrome/browser/web_applications/web_app.cc b/chrome/browser/web_applications/web_app.cc
index d3abb1f..80e5964 100644
--- a/chrome/browser/web_applications/web_app.cc
+++ b/chrome/browser/web_applications/web_app.cc
@@ -10,6 +10,7 @@
 
 #include "base/check_op.h"
 #include "base/containers/contains.h"
+#include "base/functional/overloaded.h"
 #include "base/notreached.h"
 #include "base/strings/strcat.h"
 #include "base/strings/string_split.h"
@@ -555,31 +556,29 @@
   return !(*this == other);
 }
 base::Value WebApp::IsolationData::AsDebugValue() const {
-  struct ContentVisitor {
-    base::Value::Dict operator()(
-        const WebApp::IsolationData::InstalledBundle& bundle) {
-      base::Value::Dict content;
-      content.SetByDottedPath("installed_bundle.path", bundle.path);
-      return content;
-    }
-
-    base::Value::Dict operator()(
-        const WebApp::IsolationData::DevModeBundle& bundle) {
-      base::Value::Dict content;
-      content.SetByDottedPath("dev_mode_bundle.path", bundle.path);
-      return content;
-    }
-
-    base::Value::Dict operator()(
-        const WebApp::IsolationData::DevModeProxy& proxy) {
-      base::Value::Dict content;
-      content.SetByDottedPath("dev_mode_proxy.proxy_url", proxy.proxy_url);
-      return content;
-    }
-  };
-
   base::Value::Dict value;
-  value.Set("content", absl::visit(ContentVisitor(), content));
+  value.Set(
+      "content",
+      absl::visit(
+          base::Overloaded{
+              [](const WebApp::IsolationData::InstalledBundle& bundle) {
+                base::Value::Dict content;
+                content.SetByDottedPath("installed_bundle.path", bundle.path);
+                return content;
+              },
+              [](const WebApp::IsolationData::DevModeBundle& bundle) {
+                base::Value::Dict content;
+                content.SetByDottedPath("dev_mode_bundle.path", bundle.path);
+                return content;
+              },
+              [](const WebApp::IsolationData::DevModeProxy& proxy) {
+                base::Value::Dict content;
+                content.SetByDottedPath("dev_mode_proxy.proxy_url",
+                                        proxy.proxy_url);
+                return content;
+              },
+          },
+          content));
   return base::Value(std::move(value));
 }
 
diff --git a/chrome/browser/web_applications/web_app_database.cc b/chrome/browser/web_applications/web_app_database.cc
index f653e44d..ae4ca0f 100644
--- a/chrome/browser/web_applications/web_app_database.cc
+++ b/chrome/browser/web_applications/web_app_database.cc
@@ -11,6 +11,7 @@
 #include "base/bind.h"
 #include "base/callback.h"
 #include "base/containers/contains.h"
+#include "base/functional/overloaded.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/browser/ash/system_web_apps/types/system_web_app_type.h"
 #include "chrome/browser/web_applications/os_integration/web_app_file_handler_manager.h"
@@ -734,26 +735,22 @@
       web_app.always_show_toolbar_in_fullscreen());
 
   if (web_app.isolation_data().has_value()) {
-    struct ContentVisitor {
-      void operator()(const WebApp::IsolationData::InstalledBundle& bundle) {
-        mutable_isolation_data->mutable_installed_bundle()->set_path(
-            bundle.path);
-      }
-
-      void operator()(const WebApp::IsolationData::DevModeBundle& bundle) {
-        mutable_isolation_data->mutable_dev_mode_bundle()->set_path(
-            bundle.path);
-      }
-
-      void operator()(const WebApp::IsolationData::DevModeProxy& proxy) {
-        mutable_isolation_data->mutable_dev_mode_proxy()->set_proxy_url(
-            proxy.proxy_url);
-      }
-
-      IsolationData* mutable_isolation_data;
-    };
-    absl::visit(ContentVisitor{local_data->mutable_isolation_data()},
-                web_app.isolation_data().value().content);
+    using IsolationData = WebApp::IsolationData;
+    auto* mutable_data = local_data->mutable_isolation_data();
+    absl::visit(
+        base::Overloaded{
+            [&mutable_data](const IsolationData::InstalledBundle& bundle) {
+              mutable_data->mutable_installed_bundle()->set_path(bundle.path);
+            },
+            [&mutable_data](const IsolationData::DevModeBundle& bundle) {
+              mutable_data->mutable_dev_mode_bundle()->set_path(bundle.path);
+            },
+            [&mutable_data](const IsolationData::DevModeProxy& proxy) {
+              mutable_data->mutable_dev_mode_proxy()->set_proxy_url(
+                  proxy.proxy_url);
+            },
+        },
+        web_app.isolation_data().value().content);
   }
 
   return local_data;
diff --git a/chrome/browser/webauthn/chrome_webauthn_browsertest.cc b/chrome/browser/webauthn/chrome_webauthn_browsertest.cc
index 53aff22..a68c84d 100644
--- a/chrome/browser/webauthn/chrome_webauthn_browsertest.cc
+++ b/chrome/browser/webauthn/chrome_webauthn_browsertest.cc
@@ -165,17 +165,17 @@
     // ChromeAuthenticatorRequestDelegate::TestObserver:
     void Created(ChromeAuthenticatorRequestDelegate* delegate) override {
       delegate_ = delegate;
-    };
+    }
 
     std::vector<std::unique_ptr<device::cablev2::Pairing>>
     GetCablePairingsFromSyncedDevices() override {
       return {};
-    };
+    }
 
     void OnTransportAvailabilityEnumerated(
         ChromeAuthenticatorRequestDelegate* delegate,
         device::FidoRequestHandlerBase::TransportAvailabilityInfo* tai)
-        override{};
+        override {}
 
     void UIShown(ChromeAuthenticatorRequestDelegate* delegate) override {
       if (state_ == kWaitingForUI) {
@@ -187,7 +187,7 @@
         run_loop_.QuitWhenIdle();
       }
       state_ = kShowedUI;
-    };
+    }
 
     void CableV2ExtensionSeen(
         base::span<const uint8_t> server_link_data,
@@ -369,19 +369,19 @@
   class ExtensionObserver
       : public ChromeAuthenticatorRequestDelegate::TestObserver {
    public:
-    void Created(ChromeAuthenticatorRequestDelegate* delegate) override{};
+    void Created(ChromeAuthenticatorRequestDelegate* delegate) override {}
 
     std::vector<std::unique_ptr<device::cablev2::Pairing>>
     GetCablePairingsFromSyncedDevices() override {
       return {};
-    };
+    }
 
     void OnTransportAvailabilityEnumerated(
         ChromeAuthenticatorRequestDelegate* delegate,
         device::FidoRequestHandlerBase::TransportAvailabilityInfo* tai)
-        override{};
+        override {}
 
-    void UIShown(ChromeAuthenticatorRequestDelegate* delegate) override{};
+    void UIShown(ChromeAuthenticatorRequestDelegate* delegate) override {}
 
     void CableV2ExtensionSeen(
         base::span<const uint8_t> server_link_data,
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt
index 146da0b..5bb6bb38 100644
--- a/chrome/build/linux.pgo.txt
+++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@
-chrome-linux-main-1661342370-d94f1ffc3ef5b36cf9c8f05b2db2c0248f96082d.profdata
+chrome-linux-main-1661363899-7be88a19f15311eae255111f78cd73ad49a33e82.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt
index 5e8306d5..15d091b 100644
--- a/chrome/build/win32.pgo.txt
+++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@
-chrome-win32-main-1661342370-7059696a11b62fe10cf119bbd2569e20a50292ea.profdata
+chrome-win32-main-1661353049-6c6fd8092fd57e40789b60be1617a939f0d530af.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt
index f36dfa4..8267a42 100644
--- a/chrome/build/win64.pgo.txt
+++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@
-chrome-win64-main-1661342370-665af18b4d4f8e354b2b8526f83423a9ce97ab8f.profdata
+chrome-win64-main-1661353049-0c3c892c1a41cc98d97248b00417193b1a32b27f.profdata
diff --git a/chrome/common/chrome_switches.cc b/chrome/common/chrome_switches.cc
index 59ebe94..b0116d2 100644
--- a/chrome/common/chrome_switches.cc
+++ b/chrome/common/chrome_switches.cc
@@ -629,10 +629,6 @@
 const char kEnableAccessibilityTabSwitcher[] =
     "enable-accessibility-tab-switcher";
 
-// Enables a hung renderer InfoBar allowing the user to close or wait on
-// unresponsive web content.
-const char kEnableHungRendererInfoBar[] = "enable-hung-renderer-infobar";
-
 // Forces the device to report being owned by an enterprise. This mimics the
 // presence of an app signaling device ownerhsip.
 const char kForceDeviceOwnership[] = "force-device-ownership";
diff --git a/chrome/common/chrome_switches.h b/chrome/common/chrome_switches.h
index 1859e93..4f2cf50 100644
--- a/chrome/common/chrome_switches.h
+++ b/chrome/common/chrome_switches.h
@@ -192,7 +192,6 @@
 #if BUILDFLAG(IS_ANDROID)
 extern const char kAuthAndroidNegotiateAccountType[];
 extern const char kEnableAccessibilityTabSwitcher[];
-extern const char kEnableHungRendererInfoBar[];
 extern const char kForceDeviceOwnership[];
 extern const char kForceEnableNightMode[];
 extern const char kForceShowUpdateMenuBadge[];
diff --git a/chrome/services/file_util/xz_file_extractor.cc b/chrome/services/file_util/xz_file_extractor.cc
index 71ee175..caa21130 100644
--- a/chrome/services/file_util/xz_file_extractor.cc
+++ b/chrome/services/file_util/xz_file_extractor.cc
@@ -13,6 +13,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/numerics/safe_conversions.h"
 #include "third_party/lzma_sdk/C/7zCrc.h"
 #include "third_party/lzma_sdk/C/Xz.h"
 #include "third_party/lzma_sdk/C/XzCrc64.h"
@@ -86,7 +87,7 @@
     // CODER_STATUS_NOT_FINISHED.
     while (status == CODER_STATUS_NOT_FINISHED) {
       uint8_t* data = nullptr;
-      uint32_t size = 0;
+      uint32_t size = base::checked_cast<uint32_t>(buffer_size_);
       result = producer_->BeginWriteData(reinterpret_cast<void**>(&data), &size,
                                          MOJO_WRITE_DATA_FLAG_NONE);
       if (result == MOJO_RESULT_SHOULD_WAIT) {
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 9592f2ed..3d327ee 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -3455,6 +3455,7 @@
       }
       deps += [
         ":test_support_ui",
+        "//components/commerce/core:shopping_service_test_support",
         "//components/page_info/core:proto",
         "//components/send_tab_to_self",
         "//components/send_tab_to_self:test_support",
@@ -8558,6 +8559,7 @@
       "//chrome/browser/ui/tabs:tab_enums",
       "//chrome/browser/ui/views",
       "//components/app_constants",
+      "//components/commerce/core:shopping_service_test_support",
       "//components/constrained_window",
       "//components/global_media_controls",
       "//components/media_message_center",
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeTabbedActivityTestRule.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeTabbedActivityTestRule.java
index c482342..b7d84ed1 100644
--- a/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeTabbedActivityTestRule.java
+++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeTabbedActivityTestRule.java
@@ -20,6 +20,7 @@
 import org.chromium.base.Log;
 import org.chromium.base.test.util.ApplicationTestUtils;
 import org.chromium.base.test.util.CallbackHelper;
+import org.chromium.base.test.util.CriteriaHelper;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
 import org.chromium.chrome.browser.omnibox.UrlBar;
@@ -112,7 +113,23 @@
     public void startMainActivityFromIntent(Intent intent, String url) {
         prepareUrlIntent(intent, url);
         startActivityCompletely(intent);
-        waitForFirstFrame();
+        if (!getActivity().isInOverviewMode()) {
+            waitForFirstFrame();
+        }
+    }
+
+    @Override
+    public void waitForActivityCompletelyLoaded() {
+        CriteriaHelper.pollUiThread(()
+                                            -> getActivity().getActivityTab() != null
+                        || getActivity().isInOverviewMode(),
+                "Tab never selected/initialized and no overview page is showing.");
+
+        if (!getActivity().isInOverviewMode()) {
+            super.waitForActivityCompletelyLoaded();
+        } else {
+            Assert.assertTrue(waitForDeferredStartup());
+        }
     }
 
     /**
diff --git a/chrome/test/base/test_browser_window.cc b/chrome/test/base/test_browser_window.cc
index 223b903..f6dc8a2 100644
--- a/chrome/test/base/test_browser_window.cc
+++ b/chrome/test/base/test_browser_window.cc
@@ -251,12 +251,10 @@
   return ShowTranslateBubbleResult::SUCCESS;
 }
 
-void TestBrowserWindow::ShowPartialTranslateBubble(
-    PartialTranslateBubbleModel::ViewState view_state,
+void TestBrowserWindow::StartPartialTranslate(
     const std::string& source_language,
     const std::string& target_language,
-    const std::u16string& text_selection,
-    translate::TranslateErrors::Type error_type) {}
+    const std::u16string& text_selection) {}
 
 qrcode_generator::QRCodeGeneratorBubbleView*
 TestBrowserWindow::ShowQRCodeGeneratorBubble(content::WebContents* contents,
diff --git a/chrome/test/base/test_browser_window.h b/chrome/test/base/test_browser_window.h
index d357429..799fa1ab 100644
--- a/chrome/test/base/test_browser_window.h
+++ b/chrome/test/base/test_browser_window.h
@@ -182,12 +182,9 @@
       const std::string& target_language,
       translate::TranslateErrors::Type error_type,
       bool is_user_gesture) override;
-  void ShowPartialTranslateBubble(
-      PartialTranslateBubbleModel::ViewState view_state,
-      const std::string& source_language,
-      const std::string& target_language,
-      const std::u16string& text_selection,
-      translate::TranslateErrors::Type error_type) override;
+  void StartPartialTranslate(const std::string& source_language,
+                             const std::string& target_language,
+                             const std::u16string& text_selection) override;
   void ShowOneClickSigninConfirmation(
       const std::u16string& email,
       base::OnceCallback<void(bool)> confirmed_callback) override {}
diff --git a/chrome/test/data/banners/manifest_with_only_narrow_screenshots.json b/chrome/test/data/banners/manifest_with_only_narrow_screenshots.json
index f76a96c..47b9ea1 100644
--- a/chrome/test/data/banners/manifest_with_only_narrow_screenshots.json
+++ b/chrome/test/data/banners/manifest_with_only_narrow_screenshots.json
@@ -6,7 +6,7 @@
       "src": "screenshot1-portrait.jpeg",
       "type": "image/jpeg",
       "sizes": "409x728",
-      "platform": "narrow"
+      "form_factor": "narrow"
     }
   ],
   "icons": [
diff --git a/chrome/test/data/banners/manifest_with_only_wide_screenshots.json b/chrome/test/data/banners/manifest_with_only_wide_screenshots.json
index 2b434de..21485b63 100644
--- a/chrome/test/data/banners/manifest_with_only_wide_screenshots.json
+++ b/chrome/test/data/banners/manifest_with_only_wide_screenshots.json
@@ -6,7 +6,7 @@
       "src": "screenshot1.jpeg",
       "type": "image/jpeg",
       "sizes": "728x409",
-      "platform": "wide"
+      "form_factor": "wide"
     }
   ],
   "icons": [
diff --git a/chrome/test/data/banners/manifest_with_screenshots.json b/chrome/test/data/banners/manifest_with_screenshots.json
index a850181..fff1fd065 100644
--- a/chrome/test/data/banners/manifest_with_screenshots.json
+++ b/chrome/test/data/banners/manifest_with_screenshots.json
@@ -6,13 +6,13 @@
       "src": "screenshot1-portrait.jpeg",
       "type": "image/jpeg",
       "sizes": "409x728",
-      "platform": "narrow"
+      "form_factor": "narrow"
     },
     {
       "src": "screenshot1.jpeg",
       "type": "image/jpeg",
       "sizes": "728x409",
-      "platform": "wide"
+      "form_factor": "wide"
     },
     {
       "src": "screenshot2.jpeg",
diff --git a/chrome/test/data/policy/policy_test_cases.json b/chrome/test/data/policy/policy_test_cases.json
index de31cd1..c7b377f6 100644
--- a/chrome/test/data/policy/policy_test_cases.json
+++ b/chrome/test/data/policy/policy_test_cases.json
@@ -7,7 +7,8 @@
       "mac",
       "android",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -30,7 +31,8 @@
     "os": [
       "win",
       "linux",
-      "mac"
+      "mac",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -56,7 +58,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "can_be_recommended": true,
     "policy_pref_mapping_tests": [
@@ -78,7 +81,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "can_be_recommended": true,
     "policy_pref_mapping_tests": [
@@ -100,7 +104,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "can_be_recommended": true,
     "policy_pref_mapping_tests": [
@@ -118,7 +123,8 @@
     "os": [
       "win",
       "mac",
-      "linux"
+      "linux",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -178,7 +184,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "can_be_recommended": true,
     "policy_pref_mapping_tests": [
@@ -216,7 +223,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "can_be_recommended": true,
     "policy_pref_mapping_tests": [
@@ -260,7 +268,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -282,7 +291,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -306,7 +316,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "can_be_recommended": true,
     "policy_pref_mapping_tests": [
@@ -329,7 +340,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -404,7 +416,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -448,7 +461,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -468,7 +482,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -507,7 +522,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -552,7 +568,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -653,7 +670,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -672,7 +690,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -737,7 +756,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -756,7 +776,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -775,7 +796,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -794,7 +816,8 @@
     "os": [
       "win",
       "linux",
-      "mac"
+      "mac",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -864,7 +887,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -936,7 +960,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -957,7 +982,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -1356,7 +1382,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "can_be_recommended": true,
     "policy_pref_mapping_tests": [
@@ -1486,7 +1513,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -1607,7 +1635,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -1641,7 +1670,8 @@
       "win",
       "mac",
       "linux",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "official_only": true,
     "can_be_recommended": true,
@@ -1665,7 +1695,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "can_be_recommended": true,
     "policy_pref_mapping_tests": [
@@ -1689,7 +1720,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "can_be_recommended": true,
     "policy_pref_mapping_tests": [
@@ -1709,7 +1741,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "can_be_recommended": true,
     "policy_pref_mapping_tests": [
@@ -1804,7 +1837,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "can_be_recommended": true,
     "policy_pref_mapping_tests": [
@@ -1836,7 +1870,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "can_be_recommended": true,
     "policy_pref_mapping_tests": [
@@ -1874,7 +1909,8 @@
     "os": [
       "win",
       "linux",
-      "mac"
+      "mac",
+      "fuchsia"
     ],
     "can_be_recommended": true,
     "policy_pref_mapping_tests": [
@@ -1921,7 +1957,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -1961,7 +1998,8 @@
       "mac",
       "android",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -2089,7 +2127,8 @@
     "os": [
       "win",
       "mac",
-      "linux"
+      "linux",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -2108,7 +2147,8 @@
     "os": [
       "win",
       "mac",
-      "linux"
+      "linux",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -2132,7 +2172,8 @@
       "mac",
       "linux",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "can_be_recommended": false,
     "policy_pref_mapping_tests": [
@@ -2172,7 +2213,8 @@
       "mac",
       "linux",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "can_be_recommended": true,
     "policy_pref_mapping_tests": [
@@ -2228,7 +2270,8 @@
       "mac",
       "linux",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "can_be_recommended": true,
     "policy_pref_mapping_tests": [
@@ -2271,7 +2314,8 @@
       "mac",
       "linux",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -2299,7 +2343,8 @@
       "mac",
       "linux",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -2343,7 +2388,8 @@
       "linux",
       "android",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -2367,7 +2413,8 @@
       "linux",
       "android",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -2472,7 +2519,8 @@
       "android",
       "chromeos_ash",
       "chromeos_lacros",
-      "mac"
+      "mac",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -2500,7 +2548,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -2520,7 +2569,8 @@
       "win",
       "linux",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -2608,7 +2658,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -2653,7 +2704,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -2684,7 +2736,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -2727,7 +2780,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -2770,7 +2824,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -2806,7 +2861,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -2831,7 +2887,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -2928,7 +2985,8 @@
       "mac",
       "linux",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -3134,7 +3192,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -3165,7 +3224,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -3205,7 +3265,8 @@
       "mac",
       "android",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -3247,7 +3308,8 @@
       "linux",
       "mac",
       "chromeos_lacros",
-      "chromeos_ash"
+      "chromeos_ash",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -3289,7 +3351,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "can_be_recommended": true,
     "policy_pref_mapping_tests": [
@@ -3519,7 +3582,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -3555,7 +3619,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -3579,7 +3644,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -3600,7 +3666,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -3627,7 +3694,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -3648,7 +3716,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -3673,7 +3742,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -3719,7 +3789,8 @@
     "os": [
       "win",
       "linux",
-      "mac"
+      "mac",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -3738,7 +3809,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "can_be_recommended": true,
     "policy_pref_mapping_tests": [
@@ -3817,7 +3889,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -3878,7 +3951,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -3903,7 +3977,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "can_be_recommended": true,
     "policy_pref_mapping_tests": [
@@ -3975,7 +4050,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "can_be_recommended": true,
     "policy_pref_mapping_tests": [
@@ -3998,7 +4074,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "can_be_recommended": true,
     "policy_pref_mapping_tests": [
@@ -4082,7 +4159,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "note": "TODO(http://crbug.com/106682): Flag this with can_be_recommended when bug is fixed.",
     "policy_pref_mapping_tests": [
@@ -4124,7 +4202,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "note": "TODO(http://crbug.com/106682): Flag this with can_be_recommended when bug is fixed.",
     "policy_pref_mapping_tests": [
@@ -4156,7 +4235,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "note": "TODO(http://crbug.com/106682): Flag this with can_be_recommended when bug is fixed.",
     "policy_pref_mapping_tests": [
@@ -4189,7 +4269,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "note": "TODO(http://crbug.com/106682): Flag this with can_be_recommended when bug is fixed.",
     "policy_pref_mapping_tests": [
@@ -4222,7 +4303,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "note": "TODO(http://crbug.com/106682): Flag this with can_be_recommended when bug is fixed.",
     "policy_pref_mapping_tests": [
@@ -4261,7 +4343,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -4283,7 +4366,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -4323,7 +4407,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -4354,7 +4439,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "note": "TODO(http://crbug.com/106682): Flag this with can_be_recommended when bug is fixed.",
     "policy_pref_mapping_tests": [
@@ -4384,7 +4470,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "note": "TODO(http://crbug.com/106682): Flag this with can_be_recommended when bug is fixed.",
     "policy_pref_mapping_tests": [
@@ -4427,7 +4514,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "note": "TODO(http://crbug.com/106682): Flag this with can_be_recommended when bug is fixed.",
     "policy_pref_mapping_tests": [
@@ -4588,7 +4676,8 @@
       "mac",
       "android",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "note": "TODO(http://crbug.com/106682): Flag this with can_be_recommended when bug is fixed.",
     "policy_pref_mapping_tests": [
@@ -4620,7 +4709,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -4659,7 +4749,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -4692,7 +4783,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -4731,7 +4823,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -4764,7 +4857,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -4803,7 +4897,8 @@
       "linux",
       "mac",
       "chromeos_lacros",
-      "chromeos_ash"
+      "chromeos_ash",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -4832,7 +4927,8 @@
       "linux",
       "mac",
       "chromeos_lacros",
-      "chromeos_ash"
+      "chromeos_ash",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -4861,7 +4957,8 @@
       "linux",
       "mac",
       "chromeos_lacros",
-      "chromeos_ash"
+      "chromeos_ash",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -4890,7 +4987,8 @@
       "linux",
       "mac",
       "chromeos_lacros",
-      "chromeos_ash"
+      "chromeos_ash",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -4920,7 +5018,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -4940,7 +5039,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -4959,7 +5059,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "note": "TODO(http://crbug.com/106682): Flag this with can_be_recommended when bug is fixed.",
     "policy_pref_mapping_tests": [
@@ -4991,7 +5092,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -5022,7 +5124,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -5047,7 +5150,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -5072,7 +5176,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -5107,7 +5212,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -5173,7 +5279,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -5239,7 +5346,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "note": "TODO(http://crbug.com/106682): Flag this with can_be_recommended when bug is fixed.",
     "policy_pref_mapping_tests": [
@@ -5262,7 +5370,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "note": "TODO(http://crbug.com/106682): Flag this with can_be_recommended when bug is fixed.",
     "policy_pref_mapping_tests": [
@@ -5285,7 +5394,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "note": "TODO(http://crbug.com/106682): Flag this with can_be_recommended when bug is fixed.",
     "policy_pref_mapping_tests": [
@@ -5308,7 +5418,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "note": "TODO(http://crbug.com/106682): Flag this with can_be_recommended when bug is fixed.",
     "policy_pref_mapping_tests": [
@@ -5330,7 +5441,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "note": "TODO(http://crbug.com/106682): Flag this with can_be_recommended when bug is fixed.",
     "policy_pref_mapping_tests": [
@@ -5352,7 +5464,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "note": "TODO(http://crbug.com/106682): Flag this with can_be_recommended when bug is fixed.",
     "policy_pref_mapping_tests": [
@@ -5374,7 +5487,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "note": "TODO(http://crbug.com/106682): Flag this with can_be_recommended when bug is fixed.",
     "policy_pref_mapping_tests": [
@@ -5396,7 +5510,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "note": "TODO(http://crbug.com/106682): Flag this with can_be_recommended when bug is fixed.",
     "policy_pref_mapping_tests": [
@@ -5419,7 +5534,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "note": "TODO(http://crbug.com/106682): Flag this with can_be_recommended when bug is fixed.",
     "policy_pref_mapping_tests": [
@@ -5442,7 +5558,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "note": "TODO(http://crbug.com/106682): Flag this with can_be_recommended when bug is fixed.",
     "policy_pref_mapping_tests": [
@@ -5464,7 +5581,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -5502,7 +5620,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -5523,7 +5642,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -5545,7 +5665,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "note": "TODO(http://crbug.com/106682): Flag this with can_be_recommended when bug is fixed.",
     "policy_pref_mapping_tests": [
@@ -5568,7 +5689,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "note": "TODO(http://crbug.com/106682): Flag this with can_be_recommended when bug is fixed.",
     "policy_pref_mapping_tests": [
@@ -5603,7 +5725,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "note": "TODO(http://crbug.com/106682): Flag this with can_be_recommended when bug is fixed.",
     "policy_pref_mapping_tests": [
@@ -5626,7 +5749,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "note": "TODO(http://crbug.com/106682): Flag this with can_be_recommended when bug is fixed.",
     "policy_pref_mapping_tests": [
@@ -5648,7 +5772,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "note": "TODO(http://crbug.com/106682): Flag this with can_be_recommended when bug is fixed.",
     "policy_pref_mapping_tests": [
@@ -5670,7 +5795,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "note": "TODO(http://crbug.com/106682): Flag this with can_be_recommended when bug is fixed.",
     "policy_pref_mapping_tests": [
@@ -5693,7 +5819,8 @@
       "mac",
       "android",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "note": "TODO(http://crbug.com/106682): Flag this with can_be_recommended when bug is fixed.",
     "policy_pref_mapping_tests": [
@@ -5728,7 +5855,8 @@
       "mac",
       "android",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "note": "TODO(http://crbug.com/106682): Flag this with can_be_recommended when bug is fixed.",
     "policy_pref_mapping_tests": [
@@ -5763,7 +5891,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -5852,7 +5981,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "note": "TODO(http://crbug.com/106682): Flag this with can_be_recommended when bug is fixed.",
     "policy_pref_mapping_tests": [
@@ -5875,7 +6005,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -5896,7 +6027,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -5917,7 +6049,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "note": "TODO(http://crbug.com/106682): Flag this with can_be_recommended when bug is fixed.",
     "policy_pref_mapping_tests": [
@@ -5939,7 +6072,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -5974,7 +6108,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -6017,7 +6152,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -6058,7 +6194,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "can_be_recommended": true,
     "policy_pref_mapping_tests": [
@@ -6090,7 +6227,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "can_be_recommended": true,
     "policy_pref_mapping_tests": [
@@ -6122,7 +6260,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -6150,7 +6289,8 @@
     "os": [
       "win",
       "linux",
-      "mac"
+      "mac",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -6167,7 +6307,8 @@
     "os": [
       "win",
       "mac",
-      "linux"
+      "linux",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -6208,7 +6349,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -6242,7 +6384,8 @@
     "os": [
       "win",
       "mac",
-      "linux"
+      "linux",
+      "fuchsia"
     ],
     "can_be_recommended": true,
     "policy_pref_mapping_tests": [
@@ -6260,7 +6403,8 @@
     "os": [
       "win",
       "mac",
-      "linux"
+      "linux",
+      "fuchsia"
     ],
     "can_be_recommended": true,
     "policy_pref_mapping_tests": [
@@ -6278,7 +6422,8 @@
     "os": [
       "win",
       "mac",
-      "linux"
+      "linux",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -6295,7 +6440,8 @@
     "os": [
       "win",
       "mac",
-      "linux"
+      "linux",
+      "fuchsia"
     ],
     "can_be_recommended": true,
     "policy_pref_mapping_tests": [
@@ -6313,7 +6459,8 @@
     "os": [
       "win",
       "mac",
-      "linux"
+      "linux",
+      "fuchsia"
     ],
     "can_be_recommended": true,
     "policy_pref_mapping_tests": [
@@ -6331,7 +6478,8 @@
     "os": [
       "win",
       "mac",
-      "linux"
+      "linux",
+      "fuchsia"
     ],
     "can_be_recommended": true,
     "policy_pref_mapping_tests": [
@@ -6351,7 +6499,8 @@
       "chromeos_lacros",
       "win",
       "linux",
-      "mac"
+      "mac",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -6377,7 +6526,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -6414,7 +6564,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -6466,7 +6617,8 @@
     "os": [
       "win",
       "mac",
-      "linux"
+      "linux",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -6505,7 +6657,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -6522,7 +6675,8 @@
     "os": [
       "win",
       "mac",
-      "linux"
+      "linux",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -6568,7 +6722,8 @@
     "os": [
       "win",
       "mac",
-      "linux"
+      "linux",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -6600,7 +6755,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -6642,7 +6798,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "can_be_recommended": true,
     "policy_pref_mapping_tests": [
@@ -6673,7 +6830,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -6708,7 +6866,7 @@
   },
   "BuiltInDnsClientEnabled.FeatureDisabledByDefault": {
     "os": [
-      "linux"
+      "linux", "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -6773,7 +6931,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -6805,7 +6964,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -6829,7 +6989,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "can_be_recommended": true,
     "policy_pref_mapping_tests": [
@@ -6857,7 +7018,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -6874,7 +7036,8 @@
     "os": [
       "win",
       "linux",
-      "mac"
+      "mac",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -6899,7 +7062,8 @@
     "os": [
       "win",
       "linux",
-      "mac"
+      "mac",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -6943,7 +7107,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -6983,7 +7148,8 @@
     "os": [
       "win",
       "linux",
-      "mac"
+      "mac",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -7004,7 +7170,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -7045,7 +7212,8 @@
       "win",
       "android",
       "mac",
-      "linux"
+      "linux",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -7103,7 +7271,8 @@
   "BrowserSignin.DesktopForce": {
     "os": [
       "win",
-      "mac"
+      "mac",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -7224,7 +7393,8 @@
     "os": [
       "win",
       "linux",
-      "mac"
+      "mac",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -7246,7 +7416,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -7285,7 +7456,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -7317,7 +7489,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -7352,7 +7525,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -7387,7 +7561,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -7422,7 +7597,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -7465,7 +7641,8 @@
       "chromeos_lacros",
       "linux",
       "mac",
-      "win"
+      "win",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -7487,7 +7664,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -7517,7 +7695,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -7536,7 +7715,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -7555,7 +7735,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -7576,7 +7757,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -7610,7 +7792,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -7631,7 +7814,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -7663,7 +7847,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -7682,7 +7867,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -7705,7 +7891,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -7724,7 +7911,8 @@
     "os": [
       "win",
       "linux",
-      "mac"
+      "mac",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -7814,7 +8002,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -7835,7 +8024,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -7873,7 +8063,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -7904,7 +8095,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -7926,7 +8118,8 @@
     "os": [
       "win",
       "linux",
-      "mac"
+      "mac",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -7951,7 +8144,8 @@
     "os": [
       "win",
       "linux",
-      "mac"
+      "mac",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -7970,7 +8164,8 @@
     "os": [
       "win",
       "linux",
-      "mac"
+      "mac",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -8029,7 +8224,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -8157,7 +8353,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -8179,7 +8376,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -8200,7 +8398,8 @@
       "chromeos_lacros",
       "linux",
       "mac",
-      "win"
+      "win",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -8222,7 +8421,8 @@
       "chromeos_lacros",
       "linux",
       "mac",
-      "win"
+      "win",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -8260,7 +8460,8 @@
       "chromeos_lacros",
       "linux",
       "mac",
-      "win"
+      "win",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -9946,7 +10147,8 @@
       "android",
       "linux",
       "win",
-      "mac"
+      "mac",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -10028,7 +10230,8 @@
       "win",
       "linux",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -10100,7 +10303,8 @@
     "os": [
       "win",
       "linux",
-      "mac"
+      "mac",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -10122,7 +10326,8 @@
     "os": [
       "win",
       "linux",
-      "mac"
+      "mac",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -10141,7 +10346,8 @@
     "os": [
       "win",
       "linux",
-      "mac"
+      "mac",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -10213,7 +10419,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -10244,7 +10451,8 @@
       "linux",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -10301,7 +10509,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -10368,7 +10577,8 @@
     "os": [
       "win",
       "linux",
-      "mac"
+      "mac",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -10425,7 +10635,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -11197,7 +11408,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -11251,7 +11463,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -11286,7 +11499,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -11325,7 +11539,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -11359,7 +11574,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -11572,7 +11788,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -11741,7 +11958,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -11786,7 +12004,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -12120,6 +12339,9 @@
   "ReportDeviceAudioStatusCheckingRateMs": {
     "reason_for_missing_test": "Maps into CrosSettings"
   },
+  "ReportDeviceSignalStrengthEventDrivenTelemetry": {
+    "reason_for_missing_test": "Maps into CrosSettings"
+  },
   "DeviceAllowNewUsers": {
     "reason_for_missing_test": "Maps into CrosSettings"
   },
@@ -12645,7 +12867,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -12736,7 +12959,8 @@
     "os": [
       "win",
       "linux",
-      "mac"
+      "mac",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -12885,7 +13109,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -12954,7 +13179,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -13015,7 +13241,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -13061,7 +13288,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -13103,7 +13331,8 @@
       "chromeos_lacros",
       "linux",
       "win",
-      "mac"
+      "mac",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -13439,7 +13668,8 @@
       "mac",
       "linux",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -13472,7 +13702,8 @@
       "chromeos_lacros",
       "linux",
       "win",
-      "mac"
+      "mac",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -13509,7 +13740,8 @@
       "chromeos_lacros",
       "linux",
       "win",
-      "mac"
+      "mac",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -13540,7 +13772,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -13573,7 +13806,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -13775,7 +14009,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -13817,7 +14052,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -14790,7 +15026,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -14849,7 +15086,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "note": "Policy uses default value if CloudReportingEnabled is false or unset.",
     "policy_pref_mapping_tests": [
@@ -14987,7 +15225,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -15033,7 +15272,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -15054,7 +15294,8 @@
       "linux",
       "mac",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -15129,7 +15370,8 @@
     "os": [
       "win",
       "linux",
-      "mac"
+      "mac",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -15146,7 +15388,8 @@
     "os": [
       "win",
       "linux",
-      "mac"
+      "mac",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -15236,7 +15479,8 @@
     "os": [
       "win",
       "linux",
-      "mac"
+      "mac",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -15270,7 +15514,8 @@
     "os": [
       "win",
       "linux",
-      "mac"
+      "mac",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -15330,7 +15575,8 @@
     "os": [
       "win",
       "linux",
-      "mac"
+      "mac",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -15358,7 +15604,8 @@
     "os": [
       "win",
       "linux",
-      "mac"
+      "mac",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -15386,7 +15633,8 @@
     "os": [
       "win",
       "linux",
-      "mac"
+      "mac",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -15414,7 +15662,8 @@
     "os": [
       "win",
       "linux",
-      "mac"
+      "mac",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -15442,7 +15691,8 @@
     "os": [
       "win",
       "linux",
-      "mac"
+      "mac",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -15470,7 +15720,8 @@
     "os": [
       "win",
       "linux",
-      "mac"
+      "mac",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -15530,7 +15781,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -15630,7 +15882,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -15725,7 +15978,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -15820,7 +16074,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -15913,7 +16168,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -16056,7 +16312,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -16079,7 +16336,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -16152,7 +16410,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -16195,7 +16454,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -16246,7 +16506,8 @@
     "os": [
       "win",
       "linux",
-      "mac"
+      "mac",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -16306,7 +16567,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -16377,7 +16639,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -16414,7 +16677,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -16440,7 +16704,8 @@
       "mac",
       "chromeos_lacros",
       "chromeos_ash",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -16479,7 +16744,8 @@
       "mac",
       "chromeos_lacros",
       "chromeos_ash",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -16537,7 +16803,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "can_be_recommended": true,
     "policy_pref_mapping_tests": [
@@ -16558,7 +16825,8 @@
     "os": [
       "win",
       "linux",
-      "mac"
+      "mac",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -16578,7 +16846,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -16598,7 +16867,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -16667,7 +16937,7 @@
     "reason_for_missing_test": "Policy was removed"
   },
   "LensRegionSearchEnabled": {
-    "os": ["win", "linux", "mac", "chromeos_ash", "chromeos_lacros"],
+    "os": ["win", "linux", "mac", "chromeos_ash", "chromeos_lacros", "fuchsia"],
     "policy_pref_mapping_tests": [
       {
         "policies": { "LensRegionSearchEnabled": true },
@@ -16713,7 +16983,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -16732,7 +17003,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -16751,7 +17023,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "note": "TODO(http://crbug.com/106682): Flag this with can_be_recommended when bug is fixed.",
     "policy_pref_mapping_tests": [
@@ -16773,7 +17046,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "note": "TODO(http://crbug.com/106682): Flag this with can_be_recommended when bug is fixed.",
     "policy_pref_mapping_tests": [
@@ -16795,7 +17069,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "note": "TODO(http://crbug.com/106682): Flag this with can_be_recommended when bug is fixed.",
     "policy_pref_mapping_tests": [
@@ -16817,7 +17092,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "note": "TODO(http://crbug.com/106682): Flag this with can_be_recommended when bug is fixed.",
     "policy_pref_mapping_tests": [
@@ -16941,7 +17217,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -16979,7 +17256,8 @@
       "chromeos_lacros",
       "linux",
       "mac",
-      "win"
+      "win",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -17049,7 +17327,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -17103,7 +17382,8 @@
       "win",
       "linux",
       "mac",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -17123,7 +17403,8 @@
     "os": [
       "win",
       "linux",
-      "mac"
+      "mac",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -17145,7 +17426,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -17231,7 +17513,8 @@
     "os": [
       "win",
       "linux",
-      "mac"
+      "mac",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -17267,7 +17550,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -17321,7 +17605,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -17379,7 +17664,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "can_be_recommended": false,
     "policy_pref_mapping_tests": [
@@ -17406,7 +17692,8 @@
     "os": [
       "win",
       "linux",
-      "mac"
+      "mac",
+      "fuchsia"
     ],
     "can_be_recommended": false,
     "policy_pref_mapping_tests": [
@@ -17439,7 +17726,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "can_be_recommended": false,
     "policy_pref_mapping_tests": [
@@ -17478,7 +17766,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -17609,7 +17898,8 @@
     "os": [
       "win",
       "linux",
-      "mac"
+      "mac",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -17714,7 +18004,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -17855,7 +18146,7 @@
     ]
   },
   "ChromeAppsEnabled": {
-    "os": ["win", "linux", "mac"],
+    "os": ["win", "linux", "mac", "fuchsia"],
     "policy_pref_mapping_tests": [
       {
         "policies": { "ChromeAppsEnabled": false },
@@ -18027,7 +18318,7 @@
     ]
   },
   "PromptOnMultipleMatchingCertificates": {
-    "os": ["win", "linux", "mac", "chromeos_ash", "chromeos_lacros"],
+    "os": ["win", "linux", "mac", "chromeos_ash", "chromeos_lacros", "fuchsia"],
     "policy_pref_mapping_tests": [
       {
         "policies": {},
@@ -18056,7 +18347,7 @@
     ]
   },
   "SideSearchEnabled": {
-    "os": ["win", "linux", "mac", "chromeos_ash", "chromeos_lacros"],
+    "os": ["win", "linux", "mac", "chromeos_ash", "chromeos_lacros", "fuchsia"],
     "policy_pref_mapping_tests": [
       {
         "policies": {
@@ -18072,7 +18363,7 @@
     ]
   },
   "AccessCodeCastEnabled": {
-    "os": ["win", "linux", "mac", "chromeos_ash", "chromeos_lacros"],
+    "os": ["win", "linux", "mac", "chromeos_ash", "chromeos_lacros", "fuchsia"],
     "policy_pref_mapping_tests": [
       {
         "policies": {},
@@ -18101,7 +18392,7 @@
     ]
   },
   "AccessCodeCastDeviceDuration": {
-    "os": ["win", "linux", "mac", "chromeos_ash", "chromeos_lacros"],
+    "os": ["win", "linux", "mac", "chromeos_ash", "chromeos_lacros", "fuchsia"],
     "policy_pref_mapping_tests": [
       {
         "policies": {
@@ -18251,7 +18542,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -18291,7 +18583,8 @@
       "chromeos_lacros",
       "linux",
       "mac",
-      "win"
+      "win",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -18334,7 +18627,7 @@
   },
   "OriginAgentClusterDefaultEnabled": {
     "os": [
-      "win", "linux", "mac", "android", "chromeos_ash", "chromeos_lacros"
+      "win", "linux", "mac", "android", "chromeos_ash", "chromeos_lacros", "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -18450,7 +18743,7 @@
     "reason_for_missing_test": "Chrome OS device policy used by cryptohome only, not used in Chrome."
   },
   "ExemptDomainFileTypePairsFromFileTypeDownloadWarnings": {
-    "os": ["win", "linux", "mac", "chromeos_ash", "chromeos_lacros"],
+    "os": ["win", "linux", "mac", "chromeos_ash", "chromeos_lacros", "fuchsia"],
     "can_be_recommended": false,
     "policy_pref_mapping_tests": [
       {
@@ -18474,7 +18767,7 @@
     ]
   },
   "FirstPartySetsEnabled": {
-    "os": ["win", "linux", "mac", "chromeos_ash", "chromeos_lacros", "android"],
+    "os": ["win", "linux", "mac", "chromeos_ash", "chromeos_lacros", "android", "fuchsia"],
     "policy_pref_mapping_tests": [
       {
         "note": "Check default values (no policies set)",
@@ -18512,7 +18805,7 @@
     ]
   },
   "FirstPartySetsOverrides": {
-    "os": ["win", "linux", "mac", "chromeos_ash", "chromeos_lacros", "android"],
+    "os": ["win", "linux", "mac", "chromeos_ash", "chromeos_lacros", "android", "fuchsia"],
     "policy_pref_mapping_tests": [
       {
         "note": "Default value (no policies set)",
@@ -18620,7 +18913,8 @@
       "chromeos_lacros",
       "linux",
       "mac",
-      "win"
+      "win",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -18697,7 +18991,7 @@
     ]
   },
   "DefaultWindowPlacementSetting": {
-    "os": ["win", "linux", "mac", "chromeos_ash", "chromeos_lacros"],
+    "os": ["win", "linux", "mac", "chromeos_ash", "chromeos_lacros", "fuchsia"],
     "note": "TODO(http://crbug.com/106682): Flag this with can_be_recommended when bug is fixed.",
     "policy_pref_mapping_tests": [
       {
@@ -18723,7 +19017,7 @@
     ]
   },
   "WindowPlacementAllowedForUrls": {
-    "os": ["win", "linux", "mac", "chromeos_ash", "chromeos_lacros"],
+    "os": ["win", "linux", "mac", "chromeos_ash", "chromeos_lacros", "fuchsia"],
     "note": "TODO(http://crbug.com/106682): Flag this with can_be_recommended when bug is fixed.",
     "policy_pref_mapping_tests": [
       {
@@ -18745,7 +19039,7 @@
     ]
   },
   "WindowPlacementBlockedForUrls": {
-    "os": ["win", "linux", "mac", "chromeos_ash", "chromeos_lacros"],
+    "os": ["win", "linux", "mac", "chromeos_ash", "chromeos_lacros", "fuchsia"],
     "note": "TODO(http://crbug.com/106682): Flag this with can_be_recommended when bug is fixed.",
     "policy_pref_mapping_tests": [
       {
@@ -18767,7 +19061,7 @@
     ]
   },
   "DefaultLocalFontsSetting": {
-    "os": ["win", "linux", "mac", "chromeos_ash", "chromeos_lacros", "android"],
+    "os": ["win", "linux", "mac", "chromeos_ash", "chromeos_lacros", "android", "fuchsia"],
     "note": "TODO(http://crbug.com/106682): Flag this with can_be_recommended when bug is fixed.",
     "policy_pref_mapping_tests": [
       {
@@ -18793,7 +19087,7 @@
     ]
   },
   "LocalFontsAllowedForUrls": {
-    "os": ["win", "linux", "mac", "chromeos_ash", "chromeos_lacros", "android"],
+    "os": ["win", "linux", "mac", "chromeos_ash", "chromeos_lacros", "android", "fuchsia"],
     "note": "TODO(http://crbug.com/106682): Flag this with can_be_recommended when bug is fixed.",
     "policy_pref_mapping_tests": [
       {
@@ -18815,7 +19109,7 @@
     ]
   },
   "LocalFontsBlockedForUrls": {
-    "os": ["win", "linux", "mac", "chromeos_ash", "chromeos_lacros", "android"],
+    "os": ["win", "linux", "mac", "chromeos_ash", "chromeos_lacros", "android", "fuchsia"],
     "note": "TODO(http://crbug.com/106682): Flag this with can_be_recommended when bug is fixed.",
     "policy_pref_mapping_tests": [
       {
@@ -18840,7 +19134,7 @@
     "reason_for_missing_test": "Maps into CrosSettings"
   },
   "IsolatedAppsDeveloperModeAllowed": {
-    "os": ["win", "linux", "mac", "chromeos_ash", "chromeos_lacros"],
+    "os": ["win", "linux", "mac", "chromeos_ash", "chromeos_lacros", "fuchsia"],
     "policy_pref_mapping_tests": [
       {
         "policies": { "IsolatedAppsDeveloperModeAllowed": false },
@@ -18866,7 +19160,8 @@
       "linux",
       "mac",
       "chromeos_ash",
-      "chromeos_lacros"
+      "chromeos_lacros",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -18902,7 +19197,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -18960,7 +19256,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -19071,7 +19368,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "can_be_recommended": true,
     "policy_pref_mapping_tests": [
@@ -19171,7 +19469,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -19211,7 +19510,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -19244,7 +19544,8 @@
     "os": [
       "win",
       "linux",
-      "mac"
+      "mac",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -19327,7 +19628,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
@@ -19363,7 +19665,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "android"
+      "android",
+      "fuchsia"
     ],
     "policy_pref_mapping_tests": [
       {
diff --git a/chrome/test/data/webui/chromeos/os_feedback_ui/feedback_flow_test.js b/chrome/test/data/webui/chromeos/os_feedback_ui/feedback_flow_test.js
index c0212e4..ee52039 100644
--- a/chrome/test/data/webui/chromeos/os_feedback_ui/feedback_flow_test.js
+++ b/chrome/test/data/webui/chromeos/os_feedback_ui/feedback_flow_test.js
@@ -6,7 +6,7 @@
 import {FakeFeedbackServiceProvider} from 'chrome://os-feedback/fake_feedback_service_provider.js';
 import {FakeHelpContentProvider} from 'chrome://os-feedback/fake_help_content_provider.js';
 import {AdditionalContextQueryParam, FeedbackFlowElement, FeedbackFlowState} from 'chrome://os-feedback/feedback_flow.js';
-import {FeedbackAppExitPath, FeedbackAppPreSubmitAction, FeedbackContext, SendReportStatus} from 'chrome://os-feedback/feedback_types.js';
+import {FeedbackAppExitPath, FeedbackAppHelpContentOutcome, FeedbackAppPreSubmitAction, FeedbackContext, SendReportStatus} from 'chrome://os-feedback/feedback_types.js';
 import {OS_FEEDBACK_TRUSTED_ORIGIN} from 'chrome://os-feedback/help_content.js';
 import {setFeedbackServiceProviderForTesting, setHelpContentProviderForTesting} from 'chrome://os-feedback/mojo_interface_provider.js';
 import {SearchPageElement} from 'chrome://os-feedback/search_page.js';
@@ -84,6 +84,20 @@
         assertFalse(feedbackServiceProvider.isRecordExitPathCalled(exitPath));
   }
 
+
+  /**
+   * @param {boolean} isCalled
+   * @param {FeedbackAppHelpContentOutcome} outcome
+   * @private
+   */
+  function verifyHelpContentOutcomeMetricCalled(isCalled, outcome) {
+    isCalled ?
+        assertTrue(feedbackServiceProvider.isHelpContentOutcomeMetricEmitted(
+            outcome)) :
+        assertFalse(
+            feedbackServiceProvider.isHelpContentOutcomeMetricEmitted(outcome));
+  }
+
   /**
    * @param {FeedbackFlowState} exitPage
    * @param {FeedbackAppExitPath} exitPath
@@ -179,6 +193,13 @@
   test('NavigateFromSearchPageToShareDataPage', async () => {
     await initializePage();
 
+    verifyHelpContentOutcomeMetricCalled(
+        false, FeedbackAppHelpContentOutcome.kContinueHelpContentClicked);
+    verifyHelpContentOutcomeMetricCalled(
+        false, FeedbackAppHelpContentOutcome.kContinueNoHelpContentClicked);
+
+    page.setHelpContentClickedForTesting(true);
+
     let activePage = page.shadowRoot.querySelector('.iron-selected');
     assertTrue(!!activePage);
     assertEquals('searchPage', activePage.id);
@@ -224,6 +245,12 @@
     assertTrue(!!screenshotImg.src);
     // Verify that the src of the screenshot image is set.
     assertTrue(screenshotImg.src.startsWith('blob:chrome://os-feedback/'));
+    // Verify that click continue after viewing helpcontent will emit the
+    // correct metric.
+    verifyHelpContentOutcomeMetricCalled(
+        true, FeedbackAppHelpContentOutcome.kContinueHelpContentClicked);
+    verifyHelpContentOutcomeMetricCalled(
+        false, FeedbackAppHelpContentOutcome.kContinueNoHelpContentClicked);
   });
 
   // Test the navigation from share data page back to search page when click
@@ -488,9 +515,22 @@
   // without clicking any help contents.
   test('QuitSearchPageNoHelpContentClicked', async () => {
     await initializePage();
+    verifyHelpContentOutcomeMetricCalled(
+        false, FeedbackAppHelpContentOutcome.kQuitHelpContentClicked);
+    verifyHelpContentOutcomeMetricCalled(
+        false, FeedbackAppHelpContentOutcome.kQuitNoHelpContentClicked);
+
+    // This will emit an close-app event with no help content clicked.
     verifyExitPathMetricsEmitted(
         FeedbackFlowState.SEARCH,
         FeedbackAppExitPath.kQuitSearchPageNoHelpContentClicked, false);
+
+    // Verify that close app without viewing helpcontent will emit the
+    // correct metric.
+    verifyHelpContentOutcomeMetricCalled(
+        false, FeedbackAppHelpContentOutcome.kQuitHelpContentClicked);
+    verifyHelpContentOutcomeMetricCalled(
+        true, FeedbackAppHelpContentOutcome.kQuitNoHelpContentClicked);
   });
 
   // Test that correct exitPathMetrics is emitted when user quits on share data
diff --git a/chrome/test/data/webui/chromeos/shortcut_customization/accelerator_edit_dialog_test.js b/chrome/test/data/webui/chromeos/shortcut_customization/accelerator_edit_dialog_test.js
index 228acbd..edc6fc1a 100644
--- a/chrome/test/data/webui/chromeos/shortcut_customization/accelerator_edit_dialog_test.js
+++ b/chrome/test/data/webui/chromeos/shortcut_customization/accelerator_edit_dialog_test.js
@@ -4,7 +4,7 @@
 
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {AcceleratorEditDialogElement} from 'chrome://shortcut-customization/accelerator_edit_dialog.js';
-import {AcceleratorInfo, AcceleratorKeys, AcceleratorState, AcceleratorType, Modifier} from 'chrome://shortcut-customization/shortcut_types.js';
+import {Modifier} from 'chrome://shortcut-customization/shortcut_types.js';
 
 import {assertEquals, assertFalse, assertTrue} from '../../chai_assert.js';
 
diff --git a/chrome/test/data/webui/chromeos/shortcut_customization/accelerator_edit_view_test.js b/chrome/test/data/webui/chromeos/shortcut_customization/accelerator_edit_view_test.js
index 229f542..1df363c 100644
--- a/chrome/test/data/webui/chromeos/shortcut_customization/accelerator_edit_view_test.js
+++ b/chrome/test/data/webui/chromeos/shortcut_customization/accelerator_edit_view_test.js
@@ -6,7 +6,7 @@
 import {AcceleratorEditViewElement} from 'chrome://shortcut-customization/accelerator_edit_view.js';
 import {AcceleratorLookupManager} from 'chrome://shortcut-customization/accelerator_lookup_manager.js';
 import {fakeAcceleratorConfig, fakeLayoutInfo} from 'chrome://shortcut-customization/fake_data.js';
-import {AcceleratorInfo, AcceleratorKeys, AcceleratorSource, AcceleratorState, AcceleratorType, Modifier} from 'chrome://shortcut-customization/shortcut_types.js';
+import {AcceleratorSource, Modifier} from 'chrome://shortcut-customization/shortcut_types.js';
 
 import {assertEquals, assertFalse, assertTrue} from '../../chai_assert.js';
 import {flushTasks} from '../../test_util.js';
diff --git a/chrome/test/data/webui/chromeos/shortcut_customization/accelerator_lookup_manager_test.js b/chrome/test/data/webui/chromeos/shortcut_customization/accelerator_lookup_manager_test.js
index bbdbf30..7ade9db 100644
--- a/chrome/test/data/webui/chromeos/shortcut_customization/accelerator_lookup_manager_test.js
+++ b/chrome/test/data/webui/chromeos/shortcut_customization/accelerator_lookup_manager_test.js
@@ -5,7 +5,7 @@
 import {AcceleratorLookupManager} from 'chrome://shortcut-customization/accelerator_lookup_manager.js';
 import {fakeAcceleratorConfig, fakeLayoutInfo} from 'chrome://shortcut-customization/fake_data.js';
 import {FakeShortcutProvider} from 'chrome://shortcut-customization/fake_shortcut_provider.js';
-import {AcceleratorConfig, AcceleratorInfo, AcceleratorKeys, AcceleratorSource, AcceleratorState, LayoutInfoList, Modifier} from 'chrome://shortcut-customization/shortcut_types.js';
+import {AcceleratorSource, AcceleratorState, Modifier} from 'chrome://shortcut-customization/shortcut_types.js';
 
 import {assertDeepEquals, assertEquals} from '../../chai_assert.js';
 import {flushTasks} from '../../test_util.js';
diff --git a/chrome/test/data/webui/chromeos/shortcut_customization/accelerator_row_test.js b/chrome/test/data/webui/chromeos/shortcut_customization/accelerator_row_test.js
index e1dc0bb5..80ea792 100644
--- a/chrome/test/data/webui/chromeos/shortcut_customization/accelerator_row_test.js
+++ b/chrome/test/data/webui/chromeos/shortcut_customization/accelerator_row_test.js
@@ -4,7 +4,7 @@
 
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {AcceleratorRowElement} from 'chrome://shortcut-customization/accelerator_row.js';
-import {AcceleratorInfo, AcceleratorKeys, AcceleratorSource, AcceleratorState, AcceleratorType, Modifier} from 'chrome://shortcut-customization/shortcut_types.js';
+import {AcceleratorSource, AcceleratorState, AcceleratorType, Modifier} from 'chrome://shortcut-customization/shortcut_types.js';
 
 import {assertEquals, assertFalse, assertTrue} from '../../chai_assert.js';
 import {flushTasks} from '../../test_util.js';
diff --git a/chrome/test/data/webui/chromeos/shortcut_customization/accelerator_subsection_test.js b/chrome/test/data/webui/chromeos/shortcut_customization/accelerator_subsection_test.js
index 0039afb..78a4833 100644
--- a/chrome/test/data/webui/chromeos/shortcut_customization/accelerator_subsection_test.js
+++ b/chrome/test/data/webui/chromeos/shortcut_customization/accelerator_subsection_test.js
@@ -6,7 +6,7 @@
 import {AcceleratorLookupManager} from 'chrome://shortcut-customization/accelerator_lookup_manager.js';
 import {AcceleratorSubsectionElement} from 'chrome://shortcut-customization/accelerator_subsection.js';
 import {fakeAcceleratorConfig, fakeLayoutInfo} from 'chrome://shortcut-customization/fake_data.js';
-import {AcceleratorInfo, AcceleratorKeys, AcceleratorState, AcceleratorType, Modifier} from 'chrome://shortcut-customization/shortcut_types.js';
+import {Modifier} from 'chrome://shortcut-customization/shortcut_types.js';
 
 import {assertEquals} from '../../chai_assert.js';
 import {flushTasks} from '../../test_util.js';
diff --git a/chrome/test/data/webui/chromeos/shortcut_customization/accelerator_view_test.js b/chrome/test/data/webui/chromeos/shortcut_customization/accelerator_view_test.js
index 966e0b4..9564109 100644
--- a/chrome/test/data/webui/chromeos/shortcut_customization/accelerator_view_test.js
+++ b/chrome/test/data/webui/chromeos/shortcut_customization/accelerator_view_test.js
@@ -6,7 +6,7 @@
 import {AcceleratorLookupManager} from 'chrome://shortcut-customization/accelerator_lookup_manager.js';
 import {AcceleratorViewElement, ViewState} from 'chrome://shortcut-customization/accelerator_view.js';
 import {fakeAcceleratorConfig, fakeLayoutInfo} from 'chrome://shortcut-customization/fake_data.js';
-import {AcceleratorInfo, AcceleratorKeys, AcceleratorSource, AcceleratorState, AcceleratorType, Modifier} from 'chrome://shortcut-customization/shortcut_types.js';
+import {AcceleratorSource, AcceleratorState, AcceleratorType, Modifier} from 'chrome://shortcut-customization/shortcut_types.js';
 
 import {assertEquals, assertTrue} from '../../chai_assert.js';
 
diff --git a/chrome/test/data/webui/chromeos/shortcut_customization/fake_shortcut_provider_test.js b/chrome/test/data/webui/chromeos/shortcut_customization/fake_shortcut_provider_test.js
index 7df4110..c192fec 100644
--- a/chrome/test/data/webui/chromeos/shortcut_customization/fake_shortcut_provider_test.js
+++ b/chrome/test/data/webui/chromeos/shortcut_customization/fake_shortcut_provider_test.js
@@ -4,7 +4,7 @@
 
 import {fakeAcceleratorConfig, fakeLayoutInfo} from 'chrome://shortcut-customization/fake_data.js';
 import {FakeShortcutProvider} from 'chrome://shortcut-customization/fake_shortcut_provider.js';
-import {AcceleratorConfig, AcceleratorConfigResult, AcceleratorKeys, AcceleratorSource, LayoutInfoList, Modifier} from 'chrome://shortcut-customization/shortcut_types.js';
+import {AcceleratorConfigResult, AcceleratorSource, Modifier} from 'chrome://shortcut-customization/shortcut_types.js';
 
 import {assertDeepEquals, assertEquals, assertFalse, assertTrue} from '../../chai_assert.js';
 
diff --git a/chrome/test/data/webui/chromeos/shortcut_customization/shortcut_customization_test.js b/chrome/test/data/webui/chromeos/shortcut_customization/shortcut_customization_test.js
index c4ed268..2305afd 100644
--- a/chrome/test/data/webui/chromeos/shortcut_customization/shortcut_customization_test.js
+++ b/chrome/test/data/webui/chromeos/shortcut_customization/shortcut_customization_test.js
@@ -7,7 +7,7 @@
 import {fakeAcceleratorConfig, fakeLayoutInfo, fakeSubCategories} from 'chrome://shortcut-customization/fake_data.js';
 import {getShortcutProvider, setShortcutProviderForTesting} from 'chrome://shortcut-customization/mojo_interface_provider.js';
 import {ShortcutCustomizationAppElement} from 'chrome://shortcut-customization/shortcut_customization_app.js';
-import {AcceleratorInfo, Modifier, ShortcutProviderInterface} from 'chrome://shortcut-customization/shortcut_types.js';
+import {Modifier} from 'chrome://shortcut-customization/shortcut_types.js';
 
 import {assertEquals, assertFalse, assertTrue} from '../../chai_assert.js';
 import {flushTasks} from '../../test_util.js';
diff --git a/chrome/test/data/webui/chromeos/shortcut_customization/shortcut_customization_test_util.js b/chrome/test/data/webui/chromeos/shortcut_customization/shortcut_customization_test_util.js
index 59bcce6..bd401af 100644
--- a/chrome/test/data/webui/chromeos/shortcut_customization/shortcut_customization_test_util.js
+++ b/chrome/test/data/webui/chromeos/shortcut_customization/shortcut_customization_test_util.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {AcceleratorInfo, AcceleratorKeys, AcceleratorState, AcceleratorType} from 'chrome://shortcut-customization/shortcut_types.js';
+import {AcceleratorState, AcceleratorType} from 'chrome://shortcut-customization/shortcut_types.js';
 
 /**
  * @param {number} modifier
diff --git a/chrome/test/data/webui/cr_elements/cr_toggle_test.ts b/chrome/test/data/webui/cr_elements/cr_toggle_test.ts
index 81bd63e..e67c18b4 100644
--- a/chrome/test/data/webui/cr_elements/cr_toggle_test.ts
+++ b/chrome/test/data/webui/cr_elements/cr_toggle_test.ts
@@ -81,6 +81,14 @@
     toggle.click();
   }
 
+  // Check if setting checked in HTML works, has to use a separate element to
+  // ensure that we are testing brand new state.
+  test('initiallyCheckedWorks', function() {
+    document.body.innerHTML = ` <cr-toggle checked></cr-toggle> `;
+    toggle = (document.querySelector('cr-toggle'))!;
+    assertChecked();
+  });
+
   // Test that the control is toggled when the |checked| attribute is
   // programmatically changed.
   test('ToggleByAttribute', function() {
diff --git a/chrome/test/data/webui/settings/chromeos/os_saved_devices_list_tests.js b/chrome/test/data/webui/settings/chromeos/os_saved_devices_list_tests.js
index 849cb228..0466607 100644
--- a/chrome/test/data/webui/settings/chromeos/os_saved_devices_list_tests.js
+++ b/chrome/test/data/webui/settings/chromeos/os_saved_devices_list_tests.js
@@ -53,12 +53,12 @@
     const device2 = {name: 'dev2', imageUrl: '', accountKey: '2'};
     const device3 = {name: 'dev3', imageUrl: '', accountKey: '3'};
 
-    assertEquals(savedDevicesList.devices_.length, 0);
+    assertEquals(savedDevicesList.devices.length, 0);
 
-    savedDevicesList.devices_ = [device0, device1, device2, device3];
+    savedDevicesList.devices = [device0, device1, device2, device3];
     await flushAsync();
 
-    assertEquals(savedDevicesList.devices_.length, 4);
+    assertEquals(savedDevicesList.devices.length, 4);
 
     const ironResizePromise = eventToPromise('iron-resize', savedDevicesList);
 
@@ -72,10 +72,10 @@
     await ironResizePromise;
     await flushAsync();
 
-    assertEquals(savedDevicesList.devices_[0].accountKey, '0');
-    assertEquals(savedDevicesList.devices_[1].accountKey, '2');
-    assertEquals(savedDevicesList.devices_[2].accountKey, '3');
-    assertEquals(savedDevicesList.devices_.length, 3);
+    assertEquals(savedDevicesList.devices[0].accountKey, '0');
+    assertEquals(savedDevicesList.devices[1].accountKey, '2');
+    assertEquals(savedDevicesList.devices[2].accountKey, '3');
+    assertEquals(savedDevicesList.devices.length, 3);
   });
 
   test('Device list change renders items correctly', async function() {
@@ -83,13 +83,13 @@
     const device1 = {name: 'dev1'};
     const device2 = {name: 'dev2'};
 
-    savedDevicesList.devices_ = [device0, device1, device2];
+    savedDevicesList.devices = [device0, device1, device2];
     await flushAsync();
 
     assertEquals(getListItems().length, 3);
 
     const ironResizePromise = eventToPromise('iron-resize', savedDevicesList);
-    savedDevicesList.devices_ = [device0, device1, device2, device1, device2];
+    savedDevicesList.devices = [device0, device1, device2, device1, device2];
 
     await ironResizePromise;
     await flushAsync();
@@ -104,12 +104,12 @@
       return savedDevicesList.shadowRoot.querySelectorAll(
           'os-settings-saved-devices-list-item');
     };
-    assertEquals(savedDevicesList.devices_.length, 0);
+    assertEquals(savedDevicesList.devices.length, 0);
 
-    savedDevicesList.devices_ = [device0, device1, device2];
+    savedDevicesList.devices = [device0, device1, device2];
     await flushAsync();
 
-    assertEquals(savedDevicesList.devices_.length, 3);
+    assertEquals(savedDevicesList.devices.length, 3);
 
     const ironResizePromise = eventToPromise('iron-resize', savedDevicesList);
 
diff --git a/chrome/updater/auto_run_on_os_upgrade_task_unittest.cc b/chrome/updater/auto_run_on_os_upgrade_task_unittest.cc
index 741f5a4d..3513863 100644
--- a/chrome/updater/auto_run_on_os_upgrade_task_unittest.cc
+++ b/chrome/updater/auto_run_on_os_upgrade_task_unittest.cc
@@ -38,7 +38,7 @@
     L"cmd.exe /c \"echo HardcodedFile > HardcodedFile && exit 0\"";
 constexpr char kLastOSVersion[] = "last_os_version";
 
-};  // namespace
+}  // namespace
 
 class AutoRunOnOsUpgradeTaskTest : public testing::Test {
  protected:
diff --git a/chrome/updater/run_all_unittests.cc b/chrome/updater/run_all_unittests.cc
index 697d27e..61976308 100644
--- a/chrome/updater/run_all_unittests.cc
+++ b/chrome/updater/run_all_unittests.cc
@@ -21,6 +21,10 @@
 
 #include <memory>
 
+#include "base/base_paths.h"
+#include "base/files/file_path.h"
+#include "base/path_service.h"
+#include "base/win/registry.h"
 #include "base/win/scoped_com_initializer.h"
 #include "chrome/installer/util/scoped_token_privilege.h"
 #include "chrome/updater/win/win_util.h"
@@ -61,6 +65,74 @@
   }
 }
 
+// Sets the _NT_ALT_SYMBOL_PATH for the system or the user, if it is not set
+// already. Resets it on destruction. The environment variable is set in the
+// corresponding registry hive. _NT_ALT_SYMBOL_PATH is used to avoid symbol
+// path collision because its usage is less common than _NT_SYMBOL_PATH. The
+// environment variable points to the directory where this unit test binary is.
+// The symbol files for the updater targets are expected to be present in this
+// directory.
+class ScopedSymbolPath {
+ public:
+  explicit ScopedSymbolPath(bool is_system)
+      : is_system_(is_system),
+        rootkey_(is_system ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER),
+        subkey_(is_system ? L"SYSTEM\\CurrentControlSet\\Control\\Session "
+                            L"Manager\\Environment"
+                          : L"Environment") {
+    base::win::RegKey reg_key(rootkey_, subkey_.c_str(), KEY_READ | KEY_WRITE);
+    if (reg_key.Valid() && !reg_key.HasValue(kNtSymbolPathEnVar)) {
+      base::FilePath this_executable_path;
+      base::PathService::Get(base::FILE_EXE, &this_executable_path);
+      const std::wstring symbol_path = this_executable_path.DirName().value();
+      is_owned = reg_key.WriteValue(kNtSymbolPathEnVar, symbol_path.c_str()) ==
+                 ERROR_SUCCESS;
+      if (!is_owned)
+        return;
+
+      // For an unknown reason, symbolized stacks for code running as user
+      // requires setting up the environment variable for this unit test process
+      // as well.
+      ::SetEnvironmentVariable(kNtSymbolPathEnVar, symbol_path.c_str());
+      BroadcastEnvironmentChange();
+      std::wcerr << "Symbol path for " << (is_system_ ? "system" : "user")
+                 << " set to: " << symbol_path << std::endl;
+    }
+  }
+
+  ~ScopedSymbolPath() {
+    if (!is_owned)
+      return;
+    ::SetEnvironmentVariable(kNtSymbolPathEnVar, nullptr);
+    base::win::RegKey reg_key(rootkey_, subkey_.c_str(), KEY_WRITE);
+    if (reg_key.Valid()) {
+      reg_key.DeleteValue(kNtSymbolPathEnVar);
+      BroadcastEnvironmentChange();
+    }
+  }
+
+ private:
+  // Notifies the processes that the environment has been changed to reload it.
+  static void BroadcastEnvironmentChange() {
+    constexpr int kTimeOutMilliSeconds = 100;
+    DWORD_PTR result = 0;
+    ::SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0,
+                         reinterpret_cast<LPARAM>(L"Environment"), SMTO_NORMAL,
+                         kTimeOutMilliSeconds, &result);
+  }
+
+  // The name of the environment variable to create under the registry key.
+  static constexpr wchar_t kNtSymbolPathEnVar[] = L"_NT_ALT_SYMBOL_PATH";
+
+  const bool is_system_ = false;
+  const HKEY rootkey_ = nullptr;
+  const std::wstring subkey_;
+
+  // True if the registry value is owned by this instance and it must be
+  // cleaned up on destruction.
+  bool is_owned = false;
+};
+
 }  // namespace
 
 #endif  // BUILDFLAG(IS_WIN)
@@ -99,6 +171,9 @@
               << std::endl;
   }
 
+  // Set up the _NT_ALT_SYMBOL_PATH to get symbolized stack traces in logs.
+  ScopedSymbolPath scoped_symbol_path_system(/*is_system=*/true);
+  ScopedSymbolPath scoped_symbol_path_user(/*is_system=*/false);
 #endif
 
   base::TestSuite test_suite(argc, argv);
diff --git a/chrome/updater/win/setup/setup_util.cc b/chrome/updater/win/setup/setup_util.cc
index 9b08f14..cccd7c8 100644
--- a/chrome/updater/win/setup/setup_util.cc
+++ b/chrome/updater/win/setup/setup_util.cc
@@ -407,9 +407,29 @@
     }
 
     const HKEY root = UpdaterScopeToHKeyRoot(scope);
+    const std::wstring iid_reg_path = GetComIidRegistryPath(iid);
     const std::wstring typelib_reg_path = GetComTypeLibRegistryPath(iid);
+    const std::wstring iid_string = base::win::WStringFromGUID(iid);
 
     std::wstring val;
+    {
+      const auto& path = iid_reg_path + L"\\ProxyStubClsid32";
+      CHECK_EQ(
+          base::win::RegKey(root, path.c_str(), KEY_READ).ReadValue(L"", &val),
+          ERROR_SUCCESS)
+          << ": " << root << ": " << path << ": " << iid_string;
+      CHECK_EQ(val, L"{00020424-0000-0000-C000-000000000046}");
+    }
+
+    {
+      const auto& path = iid_reg_path + L"\\TypeLib";
+      CHECK_EQ(
+          base::win::RegKey(root, path.c_str(), KEY_READ).ReadValue(L"", &val),
+          ERROR_SUCCESS)
+          << ": " << root << ": " << path << ": " << iid_string;
+      CHECK_EQ(val, iid_string);
+    }
+
     const std::wstring typelib_reg_path_win32 =
         typelib_reg_path + L"\\1.0\\0\\win32";
     const std::wstring typelib_reg_path_win64 =
@@ -419,10 +439,8 @@
       CHECK_EQ(
           base::win::RegKey(root, path.c_str(), KEY_READ).ReadValue(L"", &val),
           ERROR_SUCCESS)
-          << ": " << root << ": " << path << ": "
-          << base::win::WStringFromGUID(iid);
-      VLOG(1) << __func__ << ": " << path << ": " << val << ": "
-              << base::win::WStringFromGUID(iid);
+          << ": " << root << ": " << path << ": " << iid_string;
+      VLOG(1) << __func__ << ": " << path << ": " << val << ": " << iid_string;
     }
   }
 }
diff --git a/chromeos/ash/components/audio/cros_audio_config_impl.cc b/chromeos/ash/components/audio/cros_audio_config_impl.cc
index 079489614..7a7f080 100644
--- a/chromeos/ash/components/audio/cros_audio_config_impl.cc
+++ b/chromeos/ash/components/audio/cros_audio_config_impl.cc
@@ -67,7 +67,7 @@
 
 uint8_t CrosAudioConfigImpl::GetOutputVolumePercent() const {
   return CrasAudioHandler::Get()->GetOutputVolumePercent();
-};
+}
 
 mojom::MuteState CrosAudioConfigImpl::GetOutputMuteState() const {
   // TODO(crbug.com/1092970): Add kMutedExternally.
@@ -78,7 +78,7 @@
     return mojom::MuteState::kMutedByUser;
 
   return mojom::MuteState::kNotMuted;
-};
+}
 
 void CrosAudioConfigImpl::GetAudioDevices(
     std::vector<mojom::AudioDevicePtr>* output_devices_out) const {
@@ -94,7 +94,7 @@
       output_devices_out->push_back(GenerateMojoAudioDevice(device));
     }
   }
-};
+}
 
 void CrosAudioConfigImpl::SetOutputVolumePercent(int8_t volume) {
   CrasAudioHandler* audio_handler = CrasAudioHandler::Get();
@@ -110,14 +110,14 @@
 void CrosAudioConfigImpl::OnOutputNodeVolumeChanged(uint64_t node_id,
                                                     int volume) {
   NotifyObserversAudioSystemPropertiesChanged();
-};
+}
 
 void CrosAudioConfigImpl::OnOutputMuteChanged(bool mute_on) {
   NotifyObserversAudioSystemPropertiesChanged();
-};
+}
 
 void CrosAudioConfigImpl::OnAudioNodesChanged() {
   NotifyObserversAudioSystemPropertiesChanged();
-};
+}
 
 }  // namespace ash::audio_config
diff --git a/chromeos/ash/components/audio/cros_audio_config_impl_unittest.cc b/chromeos/ash/components/audio/cros_audio_config_impl_unittest.cc
index 21ceada..4cf3badb 100644
--- a/chromeos/ash/components/audio/cros_audio_config_impl_unittest.cc
+++ b/chromeos/ash/components/audio/cros_audio_config_impl_unittest.cc
@@ -63,7 +63,7 @@
       mojom::AudioSystemPropertiesPtr properties) override {
     last_audio_system_properties_ = std::move(properties);
     ++num_properties_updated_calls_;
-  };
+  }
 
   absl::optional<mojom::AudioSystemPropertiesPtr> last_audio_system_properties_;
   size_t num_properties_updated_calls_ = 0u;
diff --git a/chromeos/ash/components/memory/zram_writeback_controller_unittest.cc b/chromeos/ash/components/memory/zram_writeback_controller_unittest.cc
index 61505ce..f5ce292 100644
--- a/chromeos/ash/components/memory/zram_writeback_controller_unittest.cc
+++ b/chromeos/ash/components/memory/zram_writeback_controller_unittest.cc
@@ -99,7 +99,7 @@
   MockZramWritebackPolicy* policy() { return policy_; }
   MockZramWritebackBackend* backend() { return backend_; }
   ZramWritebackController* controller() { return controller_.get(); }
-  base::test::TaskEnvironment* task_env() { return &task_environment_; };
+  base::test::TaskEnvironment* task_env() { return &task_environment_; }
 
  private:
   // Capture only for the mock.
diff --git a/chromeos/ash/components/string_matching/diacritic_utils.cc b/chromeos/ash/components/string_matching/diacritic_utils.cc
index 69b98861..9fda6a7 100644
--- a/chromeos/ash/components/string_matching/diacritic_utils.cc
+++ b/chromeos/ash/components/string_matching/diacritic_utils.cc
@@ -29,7 +29,7 @@
       conversion_map_[diacritic] = mapping_pair.second;
     }
   }
-};
+}
 
 DiacriticUtils::~DiacriticUtils() = default;
 
@@ -45,6 +45,6 @@
     }
   }
   return result;
-};
+}
 
 }  // namespace ash::string_matching
diff --git a/chromeos/ash/services/cros_healthd/private/cpp/data_collector.cc b/chromeos/ash/services/cros_healthd/private/cpp/data_collector.cc
index faf1499..288527f 100644
--- a/chromeos/ash/services/cros_healthd/private/cpp/data_collector.cc
+++ b/chromeos/ash/services/cros_healthd/private/cpp/data_collector.cc
@@ -124,7 +124,7 @@
       FROM_HERE, base::BindOnce(std::move(callback), std::move(results)));
 }
 
-};  // namespace
+}  // namespace
 
 DataCollector::DataCollector() : DataCollector(GetDataCollectorDelegate()) {
   if (chromeos::mojo_service_manager::IsServiceManagerBound()) {
diff --git a/chromeos/ui/base/window_state_type.cc b/chromeos/ui/base/window_state_type.cc
index e2aa6e46f..23f9dbe 100644
--- a/chromeos/ui/base/window_state_type.cc
+++ b/chromeos/ui/base/window_state_type.cc
@@ -108,4 +108,9 @@
   return type == WindowStateType::kNormal || type == WindowStateType::kDefault;
 }
 
+bool IsSnappedWindowStateType(WindowStateType type) {
+  return type == WindowStateType::kPrimarySnapped ||
+         type == WindowStateType::kSecondarySnapped;
+}
+
 }  // namespace chromeos
diff --git a/chromeos/ui/base/window_state_type.h b/chromeos/ui/base/window_state_type.h
index 3bf6c02d..f6b8a7a 100644
--- a/chromeos/ui/base/window_state_type.h
+++ b/chromeos/ui/base/window_state_type.h
@@ -77,6 +77,10 @@
 COMPONENT_EXPORT(CHROMEOS_UI_BASE)
 bool IsNormalWindowStateType(WindowStateType type);
 
+// Returns true if `type` is either kPrimarySnapped or kSecondarySnapped.
+COMPONENT_EXPORT(CHROMEOS_UI_BASE)
+bool IsSnappedWindowStateType(WindowStateType type);
+
 }  // namespace chromeos
 
 #endif  // CHROMEOS_UI_BASE_WINDOW_STATE_TYPE_H_
diff --git a/chromeos/ui/frame/multitask_menu/split_button.h b/chromeos/ui/frame/multitask_menu/split_button.h
index b5979820..effd0b8 100644
--- a/chromeos/ui/frame/multitask_menu/split_button.h
+++ b/chromeos/ui/frame/multitask_menu/split_button.h
@@ -32,7 +32,7 @@
   SplitButton& operator=(const SplitButton&) = delete;
   ~SplitButton() override;
 
-  void set_button_color(SkColor color) { button_color_ = color; };
+  void set_button_color(SkColor color) { button_color_ = color; }
 
   // views::Button:
   void OnPaintBackground(gfx::Canvas* canvas) override;
diff --git a/components/autofill/core/browser/browser_autofill_manager_unittest.cc b/components/autofill/core/browser/browser_autofill_manager_unittest.cc
index 0118d5c1..92aa19c 100644
--- a/components/autofill/core/browser/browser_autofill_manager_unittest.cc
+++ b/components/autofill/core/browser/browser_autofill_manager_unittest.cc
@@ -9199,7 +9199,7 @@
         features::kAutofillPageLanguageDetection);
   }
 
-  bool is_in_active_frame() const { return GetParam(); };
+  bool is_in_active_frame() const { return GetParam(); }
 
  private:
   base::test::ScopedFeatureList scoped_features_;
diff --git a/components/autofill/core/browser/data_model/autofill_structured_address_unittest.cc b/components/autofill/core/browser/data_model/autofill_structured_address_unittest.cc
index a2bf9284..c45836f 100644
--- a/components/autofill/core/browser/data_model/autofill_structured_address_unittest.cc
+++ b/components/autofill/core/browser/data_model/autofill_structured_address_unittest.cc
@@ -728,7 +728,7 @@
 
   older_address.MergeWithComponent(newer_address);
   EXPECT_TRUE(older_address.SameAs(expectation_address));
-};
+}
 
 INSTANTIATE_TEST_SUITE_P(
     AutofillStructuredAddress,
diff --git a/components/autofill/core/browser/form_data_importer.cc b/components/autofill/core/browser/form_data_importer.cc
index 6093231..94d146c0 100644
--- a/components/autofill/core/browser/form_data_importer.cc
+++ b/components/autofill/core/browser/form_data_importer.cc
@@ -166,7 +166,7 @@
 FormDataImporter::~FormDataImporter() {
   if (personal_data_manager_)
     personal_data_manager_->RemoveObserver(this);
-};
+}
 
 void FormDataImporter::ImportFormData(const FormStructure& submitted_form,
                                       bool profile_autofill_enabled,
diff --git a/components/autofill/core/browser/form_data_importer_unittest.cc b/components/autofill/core/browser/form_data_importer_unittest.cc
index 64a1452..d85020b 100644
--- a/components/autofill/core/browser/form_data_importer_unittest.cc
+++ b/components/autofill/core/browser/form_data_importer_unittest.cc
@@ -434,7 +434,7 @@
       TestAutofillClient* autofill_client)
       : TestVirtualCardEnrollmentManager(personal_data_manager,
                                          payments_client,
-                                         autofill_client){};
+                                         autofill_client) {}
   MOCK_METHOD(
       void,
       InitVirtualCardEnroll,
diff --git a/components/autofill/core/browser/payments/credit_card_save_manager_unittest.cc b/components/autofill/core/browser/payments/credit_card_save_manager_unittest.cc
index 74c3aea..c29b5e1 100644
--- a/components/autofill/core/browser/payments/credit_card_save_manager_unittest.cc
+++ b/components/autofill/core/browser/payments/credit_card_save_manager_unittest.cc
@@ -130,7 +130,7 @@
   explicit MockAutofillClient(
       std::unique_ptr<TestPersonalDataManager> pdm = nullptr)
       : TestAutofillClient(pdm ? std::move(pdm)
-                               : std::make_unique<TestPersonalDataManager>()){};
+                               : std::make_unique<TestPersonalDataManager>()) {}
   ~MockAutofillClient() override = default;
   MOCK_METHOD(VirtualCardEnrollmentManager*,
               GetVirtualCardEnrollmentManager,
@@ -147,7 +147,7 @@
       TestAutofillClient* autofill_client)
       : TestVirtualCardEnrollmentManager(personal_data_manager,
                                          payments_client,
-                                         autofill_client){};
+                                         autofill_client) {}
   MOCK_METHOD(
       void,
       InitVirtualCardEnroll,
diff --git a/components/autofill_assistant/browser/client_context.h b/components/autofill_assistant/browser/client_context.h
index 64665a0..743b9b6 100644
--- a/components/autofill_assistant/browser/client_context.h
+++ b/components/autofill_assistant/browser/client_context.h
@@ -21,7 +21,7 @@
   // Updates the annotate DOM model context.
   virtual void UpdateAnnotateDomModelContext(int64_t model_version) {}
   // Updates whether the JS flow library is loaded.
-  virtual void UpdateJsFlowLibraryLoaded(bool js_flow_library_loaded){};
+  virtual void UpdateJsFlowLibraryLoaded(bool js_flow_library_loaded) {}
   // Returns the proto representation of this client context.
   virtual ClientContextProto AsProto() const = 0;
 };
diff --git a/components/autofill_assistant/browser/public/external_action_delegate.h b/components/autofill_assistant/browser/public/external_action_delegate.h
index ca09c740..6e8ba96 100644
--- a/components/autofill_assistant/browser/public/external_action_delegate.h
+++ b/components/autofill_assistant/browser/public/external_action_delegate.h
@@ -32,11 +32,11 @@
           end_action_callback) = 0;
 
   // Called before starting the execution of an interrupt.
-  virtual void OnInterruptStarted(){};
+  virtual void OnInterruptStarted() {}
 
   // Called after finishing to execute an interrupt, before resuming the
   // execution of the main script.
-  virtual void OnInterruptFinished(){};
+  virtual void OnInterruptFinished() {}
 
   // Called to notify a change in the configuration of the touchable area.
   //
@@ -55,7 +55,7 @@
   virtual void OnTouchableAreaChanged(
       const RectF& visual_viewport,
       const std::vector<RectF>& touchable_areas,
-      const std::vector<RectF>& restricted_areas){};
+      const std::vector<RectF>& restricted_areas) {}
 };
 
 }  // namespace autofill_assistant
diff --git a/components/cast_streaming/browser/BUILD.gn b/components/cast_streaming/browser/BUILD.gn
index a518502..30644ff 100644
--- a/components/cast_streaming/browser/BUILD.gn
+++ b/components/cast_streaming/browser/BUILD.gn
@@ -133,54 +133,6 @@
       "test/cast_streaming_test_sender.h",
     ]
   }
-
-  # TODO(crbug.com/1207715): Move to /tests directory.
-  source_set("test_receiver") {
-    testonly = true
-    deps = [
-      ":streaming_session",
-      "//base",
-      "//components/cast_streaming/public",
-      "//components/cast_streaming/public:config_conversions",
-
-      # Partial implementation of the platform API used by
-      # //third_party/openscreen/src/*.
-      "//components/openscreen_platform:openscreen_platform_without_sockets",
-      "//media",
-      "//media/mojo/common",
-      "//mojo/public/cpp/system",
-      "//third_party/openscreen/src/cast/common:public",
-      "//third_party/openscreen/src/cast/streaming:receiver",
-      "//third_party/openscreen/src/platform:api",
-    ]
-    visibility = [ ":*" ]
-    sources = [
-      "test/cast_streaming_test_receiver.cc",
-      "test/cast_streaming_test_receiver.h",
-    ]
-  }
-
-  # TODO(crbug.com/1207715): Move to /tests directory.
-  test("e2e_tests") {
-    deps = [
-      ":core",
-      ":streaming_session",
-      ":test_receiver",
-      ":test_sender",
-      "//base/test:test_support",
-
-      # Complete implementation of //third_party/openscreen/src/platform:api.
-      "//components/openscreen_platform:openscreen_platform_using_net_sockets",
-      "//media",
-      "//mojo/core/embedder",
-      "//testing/gtest",
-      "//third_party/openscreen/src/platform:api",
-    ]
-    sources = [
-      "cast_streaming_session_unittest.cc",
-      "test/run_all_unittests.cc",
-    ]
-  }
 }
 
 source_set("demuxer_stream_data_provider") {
diff --git a/components/cast_streaming/browser/test/cast_streaming_test_receiver.cc b/components/cast_streaming/browser/test/cast_streaming_test_receiver.cc
deleted file mode 100644
index 9c48124e1..0000000
--- a/components/cast_streaming/browser/test/cast_streaming_test_receiver.cc
+++ /dev/null
@@ -1,186 +0,0 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/cast_streaming/browser/test/cast_streaming_test_receiver.h"
-
-#include "base/logging.h"
-#include "base/run_loop.h"
-#include "base/threading/sequenced_task_runner_handle.h"
-#include "components/cast_streaming/public/config_conversions.h"
-
-namespace cast_streaming {
-
-CastStreamingTestReceiver::CastStreamingTestReceiver() = default;
-CastStreamingTestReceiver::~CastStreamingTestReceiver() = default;
-
-void CastStreamingTestReceiver::Start(
-    std::unique_ptr<cast_api_bindings::MessagePort> message_port) {
-  VLOG(1) << __func__;
-  auto stream_config =
-      std::make_unique<cast_streaming::ReceiverSession::AVConstraints>(
-          ToVideoCaptureConfigCodecs(media::VideoCodec::kH264,
-                                     media::VideoCodec::kVP8),
-          ToAudioCaptureConfigCodecs(media::AudioCodec::kAAC,
-                                     media::AudioCodec::kOpus));
-  receiver_session_.Start(this, absl::nullopt, std::move(stream_config),
-                          std::move(message_port),
-                          base::SequencedTaskRunnerHandle::Get());
-}
-
-void CastStreamingTestReceiver::Stop() {
-  VLOG(1) << __func__;
-  is_active_ = false;
-  receiver_session_.Stop();
-
-  // Clear the configuration.
-  audio_config_.reset();
-  audio_decoder_buffer_reader_.reset();
-  audio_buffers_.clear();
-  video_config_.reset();
-  video_decoder_buffer_reader_.reset();
-  video_buffers_.clear();
-
-  // Clear any pending callback.
-  if (receiver_updated_closure_) {
-    std::move(receiver_updated_closure_).Run();
-  }
-}
-
-void CastStreamingTestReceiver::RunUntilStarted() {
-  VLOG(1) << __func__;
-  CHECK(!receiver_updated_closure_);
-  while (!is_active_) {
-    base::RunLoop run_loop;
-    receiver_updated_closure_ = run_loop.QuitClosure();
-    run_loop.Run();
-  }
-}
-
-void CastStreamingTestReceiver::RunUntilStopped() {
-  VLOG(1) << __func__;
-  CHECK(!receiver_updated_closure_);
-  while (is_active_) {
-    base::RunLoop run_loop;
-    receiver_updated_closure_ = run_loop.QuitClosure();
-    run_loop.Run();
-  }
-}
-
-bool CastStreamingTestReceiver::RunUntilAudioFramesCountIsAtLeast(
-    size_t audio_frames_count) {
-  VLOG(1) << __func__;
-  CHECK(!receiver_updated_closure_);
-  while (is_active_ && audio_buffers_.size() < audio_frames_count) {
-    base::RunLoop run_loop;
-    receiver_updated_closure_ = run_loop.QuitClosure();
-    run_loop.Run();
-  }
-  return is_active_;
-}
-
-bool CastStreamingTestReceiver::RunUntilVideoFramesCountIsAtLeast(
-    size_t video_frames_count) {
-  VLOG(1) << __func__;
-  CHECK(!receiver_updated_closure_);
-  while (is_active_ && video_buffers_.size() < video_frames_count) {
-    base::RunLoop run_loop;
-    receiver_updated_closure_ = run_loop.QuitClosure();
-    run_loop.Run();
-  }
-  return is_active_;
-}
-
-void CastStreamingTestReceiver::OnAudioBufferRead(
-    scoped_refptr<media::DecoderBuffer> buffer) {
-  VLOG(3) << __func__;
-
-  // The pending buffer reads are cancelled when we reset the data pipe on a
-  // configuration change. Just ignore them and return early here.
-  if (!buffer)
-    return;
-
-  audio_buffers_.push_back(buffer);
-  if (receiver_updated_closure_) {
-    std::move(receiver_updated_closure_).Run();
-  }
-}
-
-void CastStreamingTestReceiver::OnVideoBufferRead(
-    scoped_refptr<media::DecoderBuffer> buffer) {
-  VLOG(3) << __func__;
-
-  // The pending buffer reads are cancelled when we reset the data pipe on a
-  // configuration change. Just ignore them and return early here.
-  if (!buffer)
-    return;
-
-  video_buffers_.push_back(buffer);
-  if (receiver_updated_closure_) {
-    std::move(receiver_updated_closure_).Run();
-  }
-}
-
-void CastStreamingTestReceiver::OnSessionInitialization(
-    StreamingInitializationInfo initialization_info,
-    absl::optional<mojo::ScopedDataPipeConsumerHandle> audio_pipe_consumer,
-    absl::optional<mojo::ScopedDataPipeConsumerHandle> video_pipe_consumer) {
-  VLOG(1) << __func__;
-  if (initialization_info.audio_stream_info) {
-    audio_decoder_buffer_reader_ =
-        std::make_unique<media::MojoDecoderBufferReader>(
-            std::move(audio_pipe_consumer.value()));
-    audio_config_ = initialization_info.audio_stream_info->config;
-  }
-
-  if (initialization_info.video_stream_info) {
-    video_decoder_buffer_reader_ =
-        std::make_unique<media::MojoDecoderBufferReader>(
-            std::move(video_pipe_consumer.value()));
-    video_config_ = initialization_info.video_stream_info->config;
-  }
-
-  is_active_ = true;
-  if (receiver_updated_closure_) {
-    std::move(receiver_updated_closure_).Run();
-  }
-}
-
-void CastStreamingTestReceiver::OnAudioBufferReceived(
-    media::mojom::DecoderBufferPtr buffer) {
-  VLOG(3) << __func__;
-  audio_decoder_buffer_reader_->ReadDecoderBuffer(
-      std::move(buffer),
-      base::BindOnce(&CastStreamingTestReceiver::OnAudioBufferRead,
-                     base::Unretained(this)));
-}
-
-void CastStreamingTestReceiver::OnVideoBufferReceived(
-    media::mojom::DecoderBufferPtr buffer) {
-  VLOG(3) << __func__;
-  video_decoder_buffer_reader_->ReadDecoderBuffer(
-      std::move(buffer),
-      base::BindOnce(&CastStreamingTestReceiver::OnVideoBufferRead,
-                     base::Unretained(this)));
-}
-
-void CastStreamingTestReceiver::OnSessionReinitialization(
-    StreamingInitializationInfo initialization_info,
-    absl::optional<mojo::ScopedDataPipeConsumerHandle> audio_pipe_consumer,
-    absl::optional<mojo::ScopedDataPipeConsumerHandle> video_pipe_consumer) {
-  VLOG(1) << __func__;
-
-  // TODO(crbug.com/1110490): Add tests handling the session reinitialization
-  // case.
-  Stop();
-}
-
-void CastStreamingTestReceiver::OnSessionEnded() {
-  VLOG(1) << __func__;
-  if (is_active_) {
-    // Do not call Stop() if the session is already ending.
-    Stop();
-  }
-}
-
-}  // namespace cast_streaming
diff --git a/components/cast_streaming/browser/test/cast_streaming_test_receiver.h b/components/cast_streaming/browser/test/cast_streaming_test_receiver.h
deleted file mode 100644
index a0c3543..0000000
--- a/components/cast_streaming/browser/test/cast_streaming_test_receiver.h
+++ /dev/null
@@ -1,119 +0,0 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COMPONENTS_CAST_STREAMING_BROWSER_TEST_CAST_STREAMING_TEST_RECEIVER_H_
-#define COMPONENTS_CAST_STREAMING_BROWSER_TEST_CAST_STREAMING_TEST_RECEIVER_H_
-
-#include "base/callback.h"
-#include "components/cast/message_port/message_port.h"
-#include "components/cast_streaming/browser/cast_streaming_session.h"
-#include "media/mojo/common/mojo_decoder_buffer_converter.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
-
-namespace cast_streaming {
-
-// Cast Streaming Receiver implementation for testing. This class provides basic
-// functionality for starting a Cast Streaming Receiver and receiving audio and
-// video frames to a Cast Streaming Sender. Example usage:
-//
-// std::unique_ptr<cast_api_bindings::MessagePort> sender_message_port;
-// std::unique_ptr<cast_api_bindings::MessagePort> receiver_message_port;
-// cast_api_bindings::CreatePlatformMessagePortPair(&sender_message_port,
-//                                                  &receiver_message_port);
-//
-// // Send |sender_message_port| to a Sender and start it.
-//
-// CastStreamingTestReceiver receiver;
-// receiver.Start(std::move(receiver_message_port));
-// receiver.RunUntilStarted();
-//
-// if (!receiver.RunUntilAudioFramesCountIsAtLeast(1u)) {
-//   return;
-// }
-// // Handle receiver.audio_frames()[0] here.
-//
-// if (!receiver.RunUntilVideoFramesCountIsAtLeast(1u)) {
-//   return;
-// }
-// // Handle receiver.video_frames()[0] here.
-//
-// receiver.Stop();
-// receiver.RunUntilStopped();
-class CastStreamingTestReceiver final : public CastStreamingSession::Client {
- public:
-  CastStreamingTestReceiver();
-  ~CastStreamingTestReceiver() override;
-
-  CastStreamingTestReceiver(const CastStreamingTestReceiver&) = delete;
-  CastStreamingTestReceiver& operator=(const CastStreamingTestReceiver&) =
-      delete;
-
-  // Uses |message_port| as the Receiverr-end of a Cast Streaming MessagePort to
-  // start a Cast Streaming Session.
-  void Start(std::unique_ptr<cast_api_bindings::MessagePort> message_port);
-  void Stop();
-
-  // Helper methods running the Receiver until it is properly started or
-  // stopped. Only one of the Run*() methods can be called at any given time.
-  void RunUntilStarted();
-  void RunUntilStopped();
-
-  // Helper methods running the Receiver until |*frames_count| audio or video
-  // frames have been received or until the Receiver has stopped. Returns true
-  // if the session is still active. Only one of the Run*() methods can be
-  // called at any given time.
-  bool RunUntilAudioFramesCountIsAtLeast(size_t audio_frames_count);
-  bool RunUntilVideoFramesCountIsAtLeast(size_t video_frames_count);
-
-  bool is_active() { return is_active_; }
-  absl::optional<media::AudioDecoderConfig> audio_config() {
-    return audio_config_;
-  }
-  absl::optional<media::VideoDecoderConfig> video_config() {
-    return video_config_;
-  }
-  const std::vector<scoped_refptr<media::DecoderBuffer>>& audio_buffers() {
-    return audio_buffers_;
-  }
-  const std::vector<scoped_refptr<media::DecoderBuffer>>& video_buffers() {
-    return video_buffers_;
-  }
-
- private:
-  // Callbacks for |audio_decoder_buffer_reader_| and
-  // |video_decoder_buffer_reader_|, respectively.
-  void OnAudioBufferRead(scoped_refptr<media::DecoderBuffer> buffer);
-  void OnVideoBufferRead(scoped_refptr<media::DecoderBuffer> buffer);
-
-  // CastStreamingSession::Client implementation.
-  void OnSessionInitialization(
-      StreamingInitializationInfo initialization_info,
-      absl::optional<mojo::ScopedDataPipeConsumerHandle> audio_pipe_consumer,
-      absl::optional<mojo::ScopedDataPipeConsumerHandle> video_pipe_consumer)
-      override;
-  void OnAudioBufferReceived(media::mojom::DecoderBufferPtr buffer) override;
-  void OnVideoBufferReceived(media::mojom::DecoderBufferPtr buffer) override;
-  void OnSessionReinitialization(
-      StreamingInitializationInfo initialization_info,
-      absl::optional<mojo::ScopedDataPipeConsumerHandle> audio_pipe_consumer,
-      absl::optional<mojo::ScopedDataPipeConsumerHandle> video_pipe_consumer)
-      override;
-  void OnSessionEnded() override;
-
-  CastStreamingSession receiver_session_;
-  bool is_active_ = false;
-  base::OnceClosure receiver_updated_closure_;
-
-  absl::optional<media::AudioDecoderConfig> audio_config_;
-  std::unique_ptr<media::MojoDecoderBufferReader> audio_decoder_buffer_reader_;
-  std::vector<scoped_refptr<media::DecoderBuffer>> audio_buffers_;
-
-  absl::optional<media::VideoDecoderConfig> video_config_;
-  std::unique_ptr<media::MojoDecoderBufferReader> video_decoder_buffer_reader_;
-  std::vector<scoped_refptr<media::DecoderBuffer>> video_buffers_;
-};
-
-}  // namespace cast_streaming
-
-#endif  // COMPONENTS_CAST_STREAMING_BROWSER_TEST_CAST_STREAMING_TEST_RECEIVER_H_
diff --git a/components/cast_streaming/browser/test/run_all_unittests.cc b/components/cast_streaming/browser/test/run_all_unittests.cc
deleted file mode 100644
index 21817cd4..0000000
--- a/components/cast_streaming/browser/test/run_all_unittests.cc
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/bind.h"
-#include "base/test/launcher/unit_test_launcher.h"
-#include "base/test/test_suite.h"
-#include "components/cast_streaming/browser/cast_streaming_session.h"
-#include "mojo/core/embedder/embedder.h"
-
-int main(int argc, char** argv) {
-  base::TestSuite test_suite(argc, argv);
-  mojo::core::Init();
-
-  return base::LaunchUnitTests(
-      argc, argv,
-      base::BindOnce(&base::TestSuite::Run, base::Unretained(&test_suite)));
-}
diff --git a/components/commerce/core/mock_shopping_service.cc b/components/commerce/core/mock_shopping_service.cc
index 2c5fb70e..1ee70fb 100644
--- a/components/commerce/core/mock_shopping_service.cc
+++ b/components/commerce/core/mock_shopping_service.cc
@@ -27,6 +27,11 @@
   std::move(callback).Run(url, product_info_);
 }
 
+absl::optional<ProductInfo> MockShoppingService::GetAvailableProductInfoForUrl(
+    const GURL& url) {
+  return product_info_;
+}
+
 void MockShoppingService::SetResponseForGetProductInfoForUrl(
     absl::optional<commerce::ProductInfo> product_info) {
   product_info_ = product_info;
diff --git a/components/commerce/core/mock_shopping_service.h b/components/commerce/core/mock_shopping_service.h
index 75604be..2693f5f 100644
--- a/components/commerce/core/mock_shopping_service.h
+++ b/components/commerce/core/mock_shopping_service.h
@@ -26,6 +26,8 @@
                             commerce::ProductInfoCallback callback) override;
   void GetMerchantInfoForUrl(const GURL& url,
                              MerchantInfoCallback callback) override;
+  absl::optional<ProductInfo> GetAvailableProductInfoForUrl(
+      const GURL& url) override;
   void Subscribe(
       std::unique_ptr<std::vector<CommerceSubscription>> subscriptions,
       base::OnceCallback<void(bool)> callback) override;
diff --git a/components/commerce/core/price_tracking_utils_unittest.cc b/components/commerce/core/price_tracking_utils_unittest.cc
index d6d8f0f..2870620 100644
--- a/components/commerce/core/price_tracking_utils_unittest.cc
+++ b/components/commerce/core/price_tracking_utils_unittest.cc
@@ -37,7 +37,6 @@
         bookmark_model_->AddURL(bookmark_model_->other_node(), 0, title, url);
     std::unique_ptr<power_bookmarks::PowerBookmarkMeta> meta =
         std::make_unique<power_bookmarks::PowerBookmarkMeta>();
-    meta->set_type(power_bookmarks::PowerBookmarkType::SHOPPING);
     power_bookmarks::ShoppingSpecifics* specifics =
         meta->mutable_shopping_specifics();
     specifics->set_product_cluster_id(cluster_id);
diff --git a/components/commerce/core/shopping_service_unittest.cc b/components/commerce/core/shopping_service_unittest.cc
index 56094a3..3942ccc 100644
--- a/components/commerce/core/shopping_service_unittest.cc
+++ b/components/commerce/core/shopping_service_unittest.cc
@@ -55,7 +55,6 @@
       bookmark_model->AddURL(bookmark_model->other_node(), 0, title, url);
   std::unique_ptr<power_bookmarks::PowerBookmarkMeta> meta =
       std::make_unique<power_bookmarks::PowerBookmarkMeta>();
-  meta->set_type(power_bookmarks::PowerBookmarkType::SHOPPING);
   power_bookmarks::ShoppingSpecifics* specifics =
       meta->mutable_shopping_specifics();
   specifics->set_product_cluster_id(cluster_id);
diff --git a/components/commerce/core/subscriptions/subscriptions_manager.cc b/components/commerce/core/subscriptions/subscriptions_manager.cc
index ba9357d4..c2bf7616 100644
--- a/components/commerce/core/subscriptions/subscriptions_manager.cc
+++ b/components/commerce/core/subscriptions/subscriptions_manager.cc
@@ -146,7 +146,7 @@
 void SubscriptionsManager::ProcessInitRequest(Request request) {
   GetRemoteSubscriptionsAndUpdateStorage(request.type,
                                          std::move(request.callback));
-};
+}
 
 void SubscriptionsManager::ProcessSubscribeRequest(Request request) {
   if (!init_succeeded_) {
diff --git a/components/commerce_strings.grdp b/components/commerce_strings.grdp
index 683180e6..e050764 100644
--- a/components/commerce_strings.grdp
+++ b/components/commerce_strings.grdp
@@ -2,6 +2,7 @@
 <grit-part>
   <!-- Desktop only -->
   <if expr="not is_android and not is_ios">
+    <!-- Discount consent strings -->
     <message name="IDS_DISCOUNT_CONTEXTUAL_CONSENT_TITLE" desc="The title shown on the consent bubble for getting discount.">
       Get discount on <ph name="MERCHANT_NAME">$1</ph> and more
     </message>
@@ -23,6 +24,9 @@
     <message name="IDS_DISCOUNT_CONTEXTUAL_CONSENT_ACCEPTED_CONFIRMATION_DONE" desc="The text shown on the consent confirmation bubble bubble. User can click this button to close the bubble.">
       Done
     </message>
+    <!-- TODO(meiliang@): Use the final approved strings and remove the translateable tag. -->
+    <!-- These strings can skip translation because the feature is targeted en-us locale. Only the
+         en-us user can access the feature UI. -->
     <message name="IDS_NATIVE_NTP_CART_DISCOUNT_CONSENT_ACCEPT_BUTTON" translateable="false" desc="Text shown on the accept button of the consent dialog. By clicking this button, users has chosen to accept the consent.">
       Yes, I'm in
     </message>
@@ -138,4 +142,4 @@
       Visit site
     </message>
   </if>
-</grit-part>
\ No newline at end of file
+</grit-part>
diff --git a/components/cronet/android/BUILD.gn b/components/cronet/android/BUILD.gn
index cce4fb0..047860d3 100644
--- a/components/cronet/android/BUILD.gn
+++ b/components/cronet/android/BUILD.gn
@@ -489,7 +489,6 @@
     proguard_configs = [
       "$target_gen_dir/cronet_impl_native_proguard.cfg",
       "cronet_impl_common_proguard.cfg",
-      "//base/android/proguard/chromium_apk.flags",
     ]
   }
 }
@@ -1229,7 +1228,6 @@
         "$target_gen_dir/cronet_impl_native_proguard.cfg",
         "cronet_impl_common_proguard.cfg",
         "test/proguard.cfg",
-        "//base/android/proguard/chromium_apk.flags",
         "//testing/android/proguard_for_test.flags",
       ]
       enable_proguard_checks = false
diff --git a/components/desks_storage/core/saved_desk_builder.cc b/components/desks_storage/core/saved_desk_builder.cc
index e0231f5..757ac107 100644
--- a/components/desks_storage/core/saved_desk_builder.cc
+++ b/components/desks_storage/core/saved_desk_builder.cc
@@ -19,9 +19,9 @@
       restore_data_(std::make_unique<app_restore::RestoreData>()) {
   desk_uuid_ = base::GUID::GenerateRandomV4();
   created_time_ = base::Time::Now();
-};
+}
 
-SavedDeskBuilder::~SavedDeskBuilder(){};
+SavedDeskBuilder::~SavedDeskBuilder() {}
 
 std::unique_ptr<ash::DeskTemplate> SavedDeskBuilder::Build() {
   auto desk_template = std::make_unique<ash::DeskTemplate>(
diff --git a/components/exo/wayland/wayland_dmabuf_feedback_manager.cc b/components/exo/wayland/wayland_dmabuf_feedback_manager.cc
index 557b66d..acf4f87 100644
--- a/components/exo/wayland/wayland_dmabuf_feedback_manager.cc
+++ b/components/exo/wayland/wayland_dmabuf_feedback_manager.cc
@@ -192,12 +192,12 @@
 
     scanout_tranche_ = std::make_unique<WaylandDmabufFeedbackTranche>(
         main_device_id_, TrancheFlags::kScanout, scanout_formats_and_modifiers);
-  };
+  }
 
   void ClearScanoutTranche() {
     DCHECK(scanout_tranche_);
     scanout_tranche_ = nullptr;
-  };
+  }
 
  private:
   const dev_t main_device_id_;
diff --git a/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalNavigationHandler.java b/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalNavigationHandler.java
index a930de8..8c881751 100644
--- a/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalNavigationHandler.java
+++ b/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalNavigationHandler.java
@@ -150,6 +150,40 @@
         int NUM_ENTRIES = 3;
     }
 
+    /**
+     * Histogram for the result of an intent scheme navigation.
+     * This enum is used in UMA, do not reorder values.
+     */
+    @IntDef({IntentUriNavigationResult.WITH_FALLBACK_LAUNCHED_INTENT,
+            IntentUriNavigationResult.WITH_FALLBACK_USED_FALLBACK,
+            IntentUriNavigationResult.WITH_FALLBACK_NO_OVERRIDE,
+            IntentUriNavigationResult.WITH_FALLBACK_ASYNC_RESULT,
+            IntentUriNavigationResult.NO_FALLBACK_LAUNCHED_INTENT,
+            IntentUriNavigationResult.NO_FALLBACK_NO_OVERRIDE,
+            IntentUriNavigationResult.NO_FALLBACK_ASYNC_RESULT,
+            IntentUriNavigationResult.NUM_ENTRIES})
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface IntentUriNavigationResult {
+        /* Intent with an unused fallback URL was launched. */
+        int WITH_FALLBACK_LAUNCHED_INTENT = 0;
+        /* Intent fallback URL was used. */
+        int WITH_FALLBACK_USED_FALLBACK = 1;
+        /* Intent with an unused fallback URL was blocked. */
+        int WITH_FALLBACK_NO_OVERRIDE = 2;
+        /* Intent with a fallback URL prompted the user. */
+        int WITH_FALLBACK_ASYNC_RESULT = 3;
+        /* Intent without a fallback URL was launched. */
+        int NO_FALLBACK_LAUNCHED_INTENT = 4;
+        /* Intent without a fallback URL was blocked. */
+        int NO_FALLBACK_NO_OVERRIDE = 5;
+        /* Intent without a fallback URL prompted the user. */
+        int NO_FALLBACK_ASYNC_RESULT = 6;
+
+        int NUM_ENTRIES = 7;
+    }
+
+    private static final String INTENT_URI_RESULT_NAME = "Android.Intent.IntentUriNavigationResult";
+
     // Helper class to return a boolean by reference.
     private static class MutableBoolean {
         private Boolean mValue;
@@ -308,12 +342,15 @@
         @OverrideUrlLoadingAsyncActionType
         int mAsyncActionType;
 
+        boolean mWasExternalFallbackUrlLaunch;
+
         private OverrideUrlLoadingResult(@OverrideUrlLoadingResultType int resultType) {
-            this(resultType, OverrideUrlLoadingAsyncActionType.NO_ASYNC_ACTION);
+            this(resultType, OverrideUrlLoadingAsyncActionType.NO_ASYNC_ACTION, false);
         }
 
         private OverrideUrlLoadingResult(@OverrideUrlLoadingResultType int resultType,
-                @OverrideUrlLoadingAsyncActionType int asyncActionType) {
+                @OverrideUrlLoadingAsyncActionType int asyncActionType,
+                boolean wasExternalFallbackUrlLaunch) {
             // The async action type should be set only for async actions...
             assert (asyncActionType == OverrideUrlLoadingAsyncActionType.NO_ASYNC_ACTION
                     || resultType == OverrideUrlLoadingResultType.OVERRIDE_WITH_ASYNC_ACTION);
@@ -322,8 +359,12 @@
             assert (!(asyncActionType == OverrideUrlLoadingAsyncActionType.NO_ASYNC_ACTION
                     && resultType == OverrideUrlLoadingResultType.OVERRIDE_WITH_ASYNC_ACTION));
 
+            assert (!wasExternalFallbackUrlLaunch
+                    || resultType == OverrideUrlLoadingResultType.OVERRIDE_WITH_EXTERNAL_INTENT);
+
             mResultType = resultType;
             mAsyncActionType = asyncActionType;
+            mWasExternalFallbackUrlLaunch = wasExternalFallbackUrlLaunch;
         }
 
         public @OverrideUrlLoadingResultType int getResultType() {
@@ -334,6 +375,10 @@
             return mAsyncActionType;
         }
 
+        public boolean wasExternalFallbackUrlLaunch() {
+            return mWasExternalFallbackUrlLaunch;
+        }
+
         /**
          * Use this result when an asynchronous action needs to be carried out before deciding
          * whether to block the external navigation.
@@ -341,7 +386,8 @@
         public static OverrideUrlLoadingResult forAsyncAction(
                 @OverrideUrlLoadingAsyncActionType int asyncActionType) {
             return new OverrideUrlLoadingResult(
-                    OverrideUrlLoadingResultType.OVERRIDE_WITH_ASYNC_ACTION, asyncActionType);
+                    OverrideUrlLoadingResultType.OVERRIDE_WITH_ASYNC_ACTION, asyncActionType,
+                    false);
         }
 
         /**
@@ -369,6 +415,16 @@
             return new OverrideUrlLoadingResult(
                     OverrideUrlLoadingResultType.OVERRIDE_WITH_EXTERNAL_INTENT);
         }
+
+        /**
+         * Use this result when an external app has been launched as a result of using the fallback
+         * URL for an intent scheme navigation.
+         */
+        public static OverrideUrlLoadingResult forExternalFallbackUrl() {
+            return new OverrideUrlLoadingResult(
+                    OverrideUrlLoadingResultType.OVERRIDE_WITH_EXTERNAL_INTENT,
+                    OverrideUrlLoadingAsyncActionType.NO_ASYNC_ACTION, true);
+        }
     }
 
     /**
@@ -392,8 +448,9 @@
     public OverrideUrlLoadingResult shouldOverrideUrlLoading(ExternalNavigationParams params) {
         if (debug()) Log.i(TAG, "shouldOverrideUrlLoading called on " + params.getUrl().getSpec());
         Intent targetIntent;
+        boolean isIntentUrl = UrlUtilities.hasIntentScheme(params.getUrl());
         // Perform generic parsing of the URI to turn it into an Intent.
-        if (UrlUtilities.hasIntentScheme(params.getUrl())) {
+        if (isIntentUrl) {
             try {
                 targetIntent = Intent.parseUri(params.getUrl().getSpec(), Intent.URI_INTENT_SCHEME);
             } catch (Exception ex) {
@@ -439,6 +496,8 @@
                     canLaunchExternalFallbackResult.get());
         }
         if (debug()) printDebugShouldOverrideUrlLoadingResultType(result);
+        if (isIntentUrl) captureIntentSchemeMetrics(result, browserFallbackUrl);
+
         return result;
     }
 
@@ -471,7 +530,7 @@
                             new QueryIntentActivitiesSupplier(intent);
                     if (!isAlreadyInTargetWebApk(supplier, params)
                             && launchWebApkIfSoleIntentHandler(supplier, intent, params)) {
-                        return OverrideUrlLoadingResult.forExternalIntent();
+                        return OverrideUrlLoadingResult.forExternalFallbackUrl();
                     }
                 } catch (Exception e) {
                     if (debug()) Log.i(TAG, "Could not parse fallback url as intent");
@@ -485,8 +544,13 @@
                 String marketReferrer = TextUtils.isEmpty(appInfo.second)
                         ? ContextUtils.getApplicationContext().getPackageName()
                         : appInfo.second;
-                return sendIntentToMarket(
+                OverrideUrlLoadingResult result = sendIntentToMarket(
                         appInfo.first, marketReferrer, params, browserFallbackUrl);
+                if (result.getResultType()
+                        == OverrideUrlLoadingResultType.OVERRIDE_WITH_EXTERNAL_INTENT) {
+                    result = OverrideUrlLoadingResult.forExternalFallbackUrl();
+                }
+                return result;
             }
         }
 
@@ -532,6 +596,58 @@
         Log.i(TAG, "shouldOverrideUrlLoading result: " + resultString);
     }
 
+    private void captureIntentSchemeMetrics(
+            OverrideUrlLoadingResult result, GURL browserFallbackUrl) {
+        @IntentUriNavigationResult
+        int value = IntentUriNavigationResult.NO_FALLBACK_NO_OVERRIDE;
+        if (browserFallbackUrl.isEmpty()) {
+            switch (result.getResultType()) {
+                case OverrideUrlLoadingResultType.OVERRIDE_WITH_EXTERNAL_INTENT:
+                    value = IntentUriNavigationResult.NO_FALLBACK_LAUNCHED_INTENT;
+                    break;
+                case OverrideUrlLoadingResultType.OVERRIDE_WITH_ASYNC_ACTION:
+                    value = IntentUriNavigationResult.NO_FALLBACK_ASYNC_RESULT;
+                    break;
+                case OverrideUrlLoadingResultType.NO_OVERRIDE:
+                    value = IntentUriNavigationResult.NO_FALLBACK_NO_OVERRIDE;
+                    break;
+                case OverrideUrlLoadingResultType.OVERRIDE_WITH_CLOBBERING_TAB:
+                    // Quirk of incognito intent scheme URLs synchronously clobbering the tab with
+                    // the target URL when the dialog can't be shown.
+                    value = IntentUriNavigationResult.NO_FALLBACK_NO_OVERRIDE;
+                    break;
+                default:
+                    assert false;
+                    break;
+            }
+        } else {
+            switch (result.getResultType()) {
+                case OverrideUrlLoadingResultType.OVERRIDE_WITH_EXTERNAL_INTENT:
+                    if (result.wasExternalFallbackUrlLaunch()) {
+                        value = IntentUriNavigationResult.WITH_FALLBACK_USED_FALLBACK;
+                    } else {
+                        value = IntentUriNavigationResult.WITH_FALLBACK_LAUNCHED_INTENT;
+                    }
+                    break;
+                case OverrideUrlLoadingResultType.OVERRIDE_WITH_ASYNC_ACTION:
+                    value = IntentUriNavigationResult.WITH_FALLBACK_ASYNC_RESULT;
+                    break;
+                case OverrideUrlLoadingResultType.NO_OVERRIDE:
+                    value = IntentUriNavigationResult.WITH_FALLBACK_NO_OVERRIDE;
+                    break;
+                case OverrideUrlLoadingResultType.OVERRIDE_WITH_CLOBBERING_TAB:
+                    value = IntentUriNavigationResult.WITH_FALLBACK_USED_FALLBACK;
+                    break;
+                default:
+                    assert false;
+                    break;
+            }
+        }
+
+        RecordHistogram.recordEnumeratedHistogram(
+                INTENT_URI_RESULT_NAME, value, IntentUriNavigationResult.NUM_ENTRIES);
+    }
+
     private boolean resolversSubsetOf(List<ResolveInfo> infos, List<ResolveInfo> container) {
         if (container == null) return false;
         HashSet<ComponentName> containerSet = new HashSet<>();
diff --git a/components/guest_view/browser/guest_view_base.cc b/components/guest_view/browser/guest_view_base.cc
index 2195249..2793d91e 100644
--- a/components/guest_view/browser/guest_view_base.cc
+++ b/components/guest_view/browser/guest_view_base.cc
@@ -371,7 +371,7 @@
   return GuestViewManager::FromBrowserContext(browser_context());
 }
 
-WebContents* GuestViewBase::CreateNewGuestWindow(
+std::unique_ptr<WebContents> GuestViewBase::CreateNewGuestWindow(
     const WebContents::CreateParams& create_params) {
   return GetGuestViewManager()->CreateGuestWithWebContentsParams(
       GetViewType(), owner_web_contents(), create_params);
diff --git a/components/guest_view/browser/guest_view_base.h b/components/guest_view/browser/guest_view_base.h
index 75af1219..5dd7de2 100644
--- a/components/guest_view/browser/guest_view_base.h
+++ b/components/guest_view/browser/guest_view_base.h
@@ -332,7 +332,7 @@
                   base::OnceClosure completion_callback);
 
   // BrowserPluginGuestDelegate implementation.
-  content::WebContents* CreateNewGuestWindow(
+  std::unique_ptr<content::WebContents> CreateNewGuestWindow(
       const content::WebContents::CreateParams& create_params) final;
   content::WebContents* GetOwnerWebContents() final;
   void SetGuestHost(content::GuestHost* guest_host) final;
diff --git a/components/guest_view/browser/guest_view_manager.cc b/components/guest_view/browser/guest_view_manager.cc
index c811a4b..2fb8f56 100644
--- a/components/guest_view/browser/guest_view_manager.cc
+++ b/components/guest_view/browser/guest_view_manager.cc
@@ -166,7 +166,8 @@
   guest->Init(create_params, std::move(callback));
 }
 
-content::WebContents* GuestViewManager::CreateGuestWithWebContentsParams(
+std::unique_ptr<content::WebContents>
+GuestViewManager::CreateGuestWithWebContentsParams(
     const std::string& view_type,
     content::WebContents* owner_web_contents,
     const content::WebContents::CreateParams& create_params) {
@@ -176,12 +177,12 @@
   content::WebContents::CreateParams guest_create_params(create_params);
   guest_create_params.guest_delegate = guest;
 
-  // TODO(erikchen): Fix ownership semantics for this class.
-  // https://crbug.com/832879.
   std::unique_ptr<content::WebContents> guest_web_contents =
       WebContents::Create(guest_create_params);
   guest->InitWithWebContents(base::Value::Dict(), guest_web_contents.get());
-  return guest_web_contents.release();
+  // Ownership of the guest WebContents goes to the content layer until we get
+  // it back in AddNewContents.
+  return guest_web_contents;
 }
 
 SiteInstance* GuestViewManager::GetGuestSiteInstance(
diff --git a/components/guest_view/browser/guest_view_manager.h b/components/guest_view/browser/guest_view_manager.h
index 8bf39e5..685aa9a 100644
--- a/components/guest_view/browser/guest_view_manager.h
+++ b/components/guest_view/browser/guest_view_manager.h
@@ -100,7 +100,7 @@
                    const base::Value::Dict& create_params,
                    WebContentsCreatedCallback callback);
 
-  content::WebContents* CreateGuestWithWebContentsParams(
+  std::unique_ptr<content::WebContents> CreateGuestWithWebContentsParams(
       const std::string& view_type,
       content::WebContents* owner_web_contents,
       const content::WebContents::CreateParams& create_params);
diff --git a/components/history_clusters/core/history_clusters_service_unittest.cc b/components/history_clusters/core/history_clusters_service_unittest.cc
index 7d37bd4..6e63bb16 100644
--- a/components/history_clusters/core/history_clusters_service_unittest.cc
+++ b/components/history_clusters/core/history_clusters_service_unittest.cc
@@ -44,7 +44,7 @@
 
 base::Time DaysAgo(int days) {
   return base::Time::Now() - base::Days(days);
-};
+}
 
 // Trivial backend to allow us to specifically test just the service behavior.
 class TestClusteringBackend : public ClusteringBackend {
@@ -275,7 +275,7 @@
     return {clusters, expect_clustering_backend_call
                           ? test_clustering_backend_->LastClusteredVisits()
                           : std::vector<history::AnnotatedVisit>{}};
-  };
+  }
 
   // Helper to repeatedly schedule a `GetAnnotatedVisitsToCluster` and return
   // the clusters and visits it returns.
@@ -323,7 +323,7 @@
     // exhaust persisted cluster requests.
     history::BlockUntilHistoryProcessesPendingRequests(history_service_.get());
     history::BlockUntilHistoryProcessesPendingRequests(history_service_.get());
-  };
+  }
 
  protected:
   // ScopedFeatureList needs to be declared before TaskEnvironment, so that it
diff --git a/components/infobars/core/infobar_delegate.cc b/components/infobars/core/infobar_delegate.cc
index e3f33ad9..3723196 100644
--- a/components/infobars/core/infobar_delegate.cc
+++ b/components/infobars/core/infobar_delegate.cc
@@ -94,10 +94,6 @@
   return nullptr;
 }
 
-HungRendererInfoBarDelegate* InfoBarDelegate::AsHungRendererInfoBarDelegate() {
-  return nullptr;
-}
-
 blocked_content::PopupBlockedInfoBarDelegate*
 InfoBarDelegate::AsPopupBlockedInfoBarDelegate() {
   return nullptr;
diff --git a/components/infobars/core/infobar_delegate.h b/components/infobars/core/infobar_delegate.h
index fae18f19..5918cab 100644
--- a/components/infobars/core/infobar_delegate.h
+++ b/components/infobars/core/infobar_delegate.h
@@ -14,7 +14,6 @@
 #include "url/gurl.h"
 
 class ConfirmInfoBarDelegate;
-class HungRendererInfoBarDelegate;
 class ThemeInstalledInfoBarDelegate;
 
 namespace blocked_content {
@@ -77,7 +76,7 @@
     // Removed: DOWNLOAD_REQUEST_INFOBAR_DELEGATE_ANDROID = 5,
     // Removed: FULLSCREEN_INFOBAR_DELEGATE = 6,
     HUNG_PLUGIN_INFOBAR_DELEGATE = 7,
-    HUNG_RENDERER_INFOBAR_DELEGATE_ANDROID = 8,
+    // Removed: HUNG_RENDERER_INFOBAR_DELEGATE_ANDROID = 8,
     // Removed: MEDIA_STREAM_INFOBAR_DELEGATE_ANDROID = 9,
     // Removed: MEDIA_THROTTLE_INFOBAR_DELEGATE = 10,
     // Removed: REQUEST_QUOTA_INFOBAR_DELEGATE = 11,
@@ -274,7 +273,6 @@
 
   // Type-checking downcast routines:
   virtual ConfirmInfoBarDelegate* AsConfirmInfoBarDelegate();
-  virtual HungRendererInfoBarDelegate* AsHungRendererInfoBarDelegate();
   virtual blocked_content::PopupBlockedInfoBarDelegate*
   AsPopupBlockedInfoBarDelegate();
   virtual ThemeInstalledInfoBarDelegate* AsThemePreviewInfobarDelegate();
diff --git a/components/lens/lens_metadata.h b/components/lens/lens_metadata.h
index 7b7167d..dc5fbbcf 100644
--- a/components/lens/lens_metadata.h
+++ b/components/lens/lens_metadata.h
@@ -12,6 +12,6 @@
 namespace LensMetadata {
 std::string CreateProto(
     const std::vector<lens::mojom::LatencyLogPtr>& log_data);
-};
+}
 
-#endif  // COMPONENTS_LENS_LENS_ENTRYPOINTS_H_
\ No newline at end of file
+#endif  // COMPONENTS_LENS_LENS_ENTRYPOINTS_H_
diff --git a/components/lookalikes/core/lookalike_url_util_unittest.cc b/components/lookalikes/core/lookalike_url_util_unittest.cc
index 079ecdff..cbd3618 100644
--- a/components/lookalikes/core/lookalike_url_util_unittest.cc
+++ b/components/lookalikes/core/lookalike_url_util_unittest.cc
@@ -630,7 +630,6 @@
     const char* domain;
     const char* expected_suggested_domain;
     const ComboSquattingType expected_type;
-    ;
   } kTestCases[] = {
       // Not Combo Squatting (CSQ).
       {"google.com", "", ComboSquattingType::kNone},
@@ -745,4 +744,4 @@
     EXPECT_EQ(std::string(test_case.expected_suggested_domain), matched_domain);
     EXPECT_EQ(test_case.expected_type, type);
   }
-}
\ No newline at end of file
+}
diff --git a/components/metrics/structured/recorder.h b/components/metrics/structured/recorder.h
index fba95b1c..7eab537 100644
--- a/components/metrics/structured/recorder.h
+++ b/components/metrics/structured/recorder.h
@@ -50,7 +50,7 @@
     virtual void OnReportingStateChanged(bool enabled) = 0;
     // Called when full hardware class has been loaded.
     virtual void OnHardwareClassInitialized(
-        const std::string& full_hardware_class){};
+        const std::string& full_hardware_class) {}
     // Called on a call to LastKeyRotation.
     virtual absl::optional<int> LastKeyRotation(uint64_t project_name_hash) = 0;
   };
diff --git a/components/metrics/unsent_log_store.cc b/components/metrics/unsent_log_store.cc
index c3edf4f..2b562a71 100644
--- a/components/metrics/unsent_log_store.cc
+++ b/components/metrics/unsent_log_store.cc
@@ -57,7 +57,7 @@
       : list_value_(list_value) {
     DCHECK(list_value);
     list_value->clear();
-  };
+  }
 
   LogsPrefWriter(const LogsPrefWriter&) = delete;
   LogsPrefWriter& operator=(const LogsPrefWriter&) = delete;
diff --git a/components/omnibox/browser/BUILD.gn b/components/omnibox/browser/BUILD.gn
index 83cd376..123d3c5 100644
--- a/components/omnibox/browser/BUILD.gn
+++ b/components/omnibox/browser/BUILD.gn
@@ -254,6 +254,7 @@
     "//components/omnibox/resources:omnibox_resources",
     "//components/security_state/core",
     "//third_party/metrics_proto",
+    "//third_party/omnibox_proto",
     "//url",
   ]
   deps = [
diff --git a/components/omnibox/browser/DEPS b/components/omnibox/browser/DEPS
index b11e7e9..bd83b20 100644
--- a/components/omnibox/browser/DEPS
+++ b/components/omnibox/browser/DEPS
@@ -47,6 +47,7 @@
   "+services/network/test",
   "+sql",
   "+third_party/metrics_proto",
+  "+third_party/omnibox_proto",
   "+third_party/protobuf/src/google",
   "+third_party/re2",
   "+third_party/skia",
diff --git a/components/omnibox/browser/autocomplete_controller.cc b/components/omnibox/browser/autocomplete_controller.cc
index cc62ad5..614657a 100644
--- a/components/omnibox/browser/autocomplete_controller.cc
+++ b/components/omnibox/browser/autocomplete_controller.cc
@@ -54,13 +54,13 @@
 #include "components/omnibox/browser/zero_suggest_provider.h"
 #include "components/omnibox/browser/zero_suggest_verbatim_match_provider.h"
 #include "components/open_from_clipboard/clipboard_recent_content.h"
-#include "components/search_engines/omnibox_focus_type.h"
 #include "components/search_engines/template_url.h"
 #include "components/search_engines/template_url_service.h"
 #include "components/search_engines/template_url_starter_pack_data.h"
 #include "components/strings/grit/components_strings.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 #include "third_party/metrics_proto/chrome_searchbox_stats.pb.h"
+#include "third_party/metrics_proto/omnibox_focus_type.pb.h"
 #include "ui/base/device_form_factor.h"
 #include "ui/base/l10n/l10n_util.h"
 
@@ -515,10 +515,10 @@
                base::UTF16ToUTF8(input.text()));
 
   // Providers assume synchronous inputs (`omit_asynchronous_matches() ==
-  // true`) have default focus type (`focus_type() == DEFAULT`). See
+  // true`) have default focus type (`focus_type() == INTERACTION_DEFAULT`). See
   // crbug.com/1339425.
   DCHECK(!input.omit_asynchronous_matches() ||
-         input.focus_type() == OmniboxFocusType::DEFAULT);
+         input.focus_type() == metrics::OmniboxFocusType::INTERACTION_DEFAULT);
 
   // When input.omit_asynchronous_matches() is true, the AutocompleteController
   // is being used for text classification, which should not notify observers.
@@ -545,7 +545,7 @@
   const std::u16string old_input_text(input_.text());
   const bool old_allow_exact_keyword_match = input_.allow_exact_keyword_match();
   const bool old_omit_asynchronous_matches = input_.omit_asynchronous_matches();
-  const OmniboxFocusType old_focus_type = input_.focus_type();
+  const metrics::OmniboxFocusType old_focus_type = input_.focus_type();
   input_ = input;
 
   // See if we can avoid rerunning autocomplete when the query hasn't changed
@@ -927,7 +927,7 @@
   result_.SortAndCull(input_, template_url_service_, preserve_default_match);
 
   // Only produce Pedals for the default focus case (not on focus or on delete).
-  if (input_.focus_type() == OmniboxFocusType::DEFAULT) {
+  if (input_.focus_type() == metrics::OmniboxFocusType::INTERACTION_DEFAULT) {
     // TODO(tommycli): It sure seems like this should be moved down below
     // `TransferOldMatches()` along with all the other annotation code.
     result_.AttachPedalsToMatches(input_, *provider_client_);
diff --git a/components/omnibox/browser/autocomplete_controller_metrics_unittest.cc b/components/omnibox/browser/autocomplete_controller_metrics_unittest.cc
index df5e50bd..114d0cc 100644
--- a/components/omnibox/browser/autocomplete_controller_metrics_unittest.cc
+++ b/components/omnibox/browser/autocomplete_controller_metrics_unittest.cc
@@ -34,7 +34,7 @@
  public:
   AutocompleteControllerMetricsTest()
       : metrics_(controller_.metrics_),
-        histogram_tester_(std::make_unique<base::HistogramTester>()){};
+        histogram_tester_(std::make_unique<base::HistogramTester>()) {}
 
   // By default, the controller wants async matches. `SetInputSync()` will
   // explicitly set this behavior.
diff --git a/components/omnibox/browser/autocomplete_input.cc b/components/omnibox/browser/autocomplete_input.cc
index 8cc250b..e32ce71 100644
--- a/components/omnibox/browser/autocomplete_input.cc
+++ b/components/omnibox/browser/autocomplete_input.cc
@@ -753,7 +753,7 @@
   prefer_keyword_ = false;
   allow_exact_keyword_match_ = false;
   omit_asynchronous_matches_ = false;
-  focus_type_ = OmniboxFocusType::DEFAULT;
+  focus_type_ = metrics::OmniboxFocusType::INTERACTION_DEFAULT;
   terms_prefixed_by_http_or_https_.clear();
   query_tile_id_.reset();
   https_port_for_testing_ = 0;
diff --git a/components/omnibox/browser/autocomplete_input.h b/components/omnibox/browser/autocomplete_input.h
index e53da83..f7e402e 100644
--- a/components/omnibox/browser/autocomplete_input.h
+++ b/components/omnibox/browser/autocomplete_input.h
@@ -10,9 +10,9 @@
 #include <string>
 #include <vector>
 
-#include "components/search_engines/omnibox_focus_type.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 #include "third_party/metrics_proto/omnibox_event.pb.h"
+#include "third_party/metrics_proto/omnibox_focus_type.pb.h"
 #include "third_party/metrics_proto/omnibox_input_type.pb.h"
 #include "third_party/perfetto/include/perfetto/tracing/traced_value_forward.h"
 #include "url/gurl.h"
@@ -246,12 +246,15 @@
   }
 
   // Returns the type of UI interaction that started this autocomplete query.
-  OmniboxFocusType focus_type() const { return focus_type_; }
+  metrics::OmniboxFocusType focus_type() const { return focus_type_; }
   // |focus_type| should specify the UI interaction that started autocomplete.
-  // Generally, this should be left alone as DEFAULT. Most providers only
-  // provide results for DEFAULT focus type. Providers (like ZeroSuggest) that
-  // only want to display matches on-focus or on-clobber will look at this flag.
-  void set_focus_type(OmniboxFocusType focus_type) { focus_type_ = focus_type; }
+  // Generally, this should be left alone as INTERACTION_DEFAULT. Most providers
+  // only provide results for the INTERACTION_DEFAULT focus type. Providers like
+  // ZeroSuggestProvider that only want to display matches on-focus or
+  // on-clobber will look at this flag.
+  void set_focus_type(metrics::OmniboxFocusType focus_type) {
+    focus_type_ = focus_type;
+  }
 
   // Returns the terms in |text_| that start with http:// or https:// plus
   // at least one more character, stored without the scheme.  Used in
@@ -319,7 +322,8 @@
   bool allow_exact_keyword_match_;
   metrics::OmniboxEventProto::KeywordModeEntryMethod keyword_mode_entry_method_;
   bool omit_asynchronous_matches_;
-  OmniboxFocusType focus_type_ = OmniboxFocusType::DEFAULT;
+  metrics::OmniboxFocusType focus_type_ =
+      metrics::OmniboxFocusType::INTERACTION_DEFAULT;
   std::vector<std::u16string> terms_prefixed_by_http_or_https_;
   absl::optional<std::string> query_tile_id_;
 
diff --git a/components/omnibox/browser/autocomplete_provider_unittest.cc b/components/omnibox/browser/autocomplete_provider_unittest.cc
index f52ddb2..24cf269 100644
--- a/components/omnibox/browser/autocomplete_provider_unittest.cc
+++ b/components/omnibox/browser/autocomplete_provider_unittest.cc
@@ -37,7 +37,6 @@
 #include "components/omnibox/common/omnibox_features.h"
 #include "components/open_from_clipboard/fake_clipboard_recent_content.h"
 #include "components/prefs/testing_pref_service.h"
-#include "components/search_engines/omnibox_focus_type.h"
 #include "components/search_engines/search_engines_switches.h"
 #include "components/search_engines/template_url.h"
 #include "components/search_engines/template_url_service.h"
@@ -45,6 +44,7 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 #include "third_party/metrics_proto/omnibox_event.pb.h"
+#include "third_party/metrics_proto/omnibox_focus_type.pb.h"
 #include "ui/gfx/image/image_unittest_util.h"
 #include "ui/gfx/image/image_util.h"
 #include "url/url_constants.h"
@@ -224,7 +224,7 @@
 
   matches_.clear();
 
-  if (input.focus_type() != OmniboxFocusType::DEFAULT)
+  if (input.focus_type() != metrics::OmniboxFocusType::INTERACTION_DEFAULT)
     return;
 
   // Generate 4 results synchronously, the rest later.
@@ -871,10 +871,10 @@
 
   const auto kRecommendedGroupId =
       SuggestionGroupId::kNonPersonalizedZeroSuggest1;
-  const std::u16string kRecommended = u"Recommended for you";
+  const std::string kRecommended = "Recommended for you";
   const auto kRecentSearchesGroupId =
       SuggestionGroupId::kNonPersonalizedZeroSuggest2;
-  const std::u16string kRecentSearches = u"Recent Searches";
+  const std::string kRecentSearches = "Recent Searches";
 
   // This exists to verify that suggestion group IDs without associated
   // suggestion groups information are stripped away.
@@ -883,10 +883,12 @@
   {
     // Headers are optional for suggestion groups.
     SuggestionGroupsMap suggestion_groups_map;
-    suggestion_groups_map[kRecommendedGroupId].header = kRecommended;
+    suggestion_groups_map[kRecommendedGroupId]
+        .group_config_info.set_header_text(kRecommended);
     suggestion_groups_map[kRecommendedGroupId].priority =
         SuggestionGroupPriority::kRemoteZeroSuggest4;
-    suggestion_groups_map[kRecentSearchesGroupId].header = u"";
+    suggestion_groups_map[kRecentSearchesGroupId]
+        .group_config_info.set_header_text("");
     suggestion_groups_map[kRecentSearchesGroupId].priority =
         SuggestionGroupPriority::kRemoteZeroSuggest3;
     UpdateResultsWithSuggestionGroupsTestData({std::move(suggestion_groups_map),
@@ -910,16 +912,18 @@
 
     EXPECT_EQ(kRecommendedGroupId,
               result_.match_at(4)->suggestion_group_id.value());
-    EXPECT_EQ(kRecommended,
+    EXPECT_EQ(base::UTF8ToUTF16(kRecommended),
               result_.GetHeaderForSuggestionGroup(kRecommendedGroupId));
   }
   {
     // Suggestion groups are ordered based on their priories.
     SuggestionGroupsMap suggestion_groups_map;
-    suggestion_groups_map[kRecommendedGroupId].header = kRecommended;
+    suggestion_groups_map[kRecommendedGroupId]
+        .group_config_info.set_header_text(kRecommended);
     suggestion_groups_map[kRecommendedGroupId].priority =
         SuggestionGroupPriority::kRemoteZeroSuggest3;
-    suggestion_groups_map[kRecentSearchesGroupId].header = kRecentSearches;
+    suggestion_groups_map[kRecentSearchesGroupId]
+        .group_config_info.set_header_text(kRecentSearches);
     suggestion_groups_map[kRecentSearchesGroupId].priority =
         SuggestionGroupPriority::kRemoteZeroSuggest4;
     UpdateResultsWithSuggestionGroupsTestData({std::move(suggestion_groups_map),
@@ -937,25 +941,27 @@
 
     EXPECT_EQ(kRecommendedGroupId,
               result_.match_at(2)->suggestion_group_id.value());
-    EXPECT_EQ(kRecommended,
+    EXPECT_EQ(base::UTF8ToUTF16(kRecommended),
               result_.GetHeaderForSuggestionGroup(kRecommendedGroupId));
 
     EXPECT_EQ(kRecentSearchesGroupId,
               result_.match_at(3)->suggestion_group_id.value());
-    EXPECT_EQ(kRecentSearches,
+    EXPECT_EQ(base::UTF8ToUTF16(kRecentSearches),
               result_.GetHeaderForSuggestionGroup(kRecentSearchesGroupId));
 
     EXPECT_EQ(kRecentSearchesGroupId,
               result_.match_at(4)->suggestion_group_id.value());
-    EXPECT_EQ(kRecentSearches,
+    EXPECT_EQ(base::UTF8ToUTF16(kRecentSearches),
               result_.GetHeaderForSuggestionGroup(kRecentSearchesGroupId));
   }
   {
     // suggestion group IDs without associated suggestion group information are
     // stripped away.
     SuggestionGroupsMap suggestion_groups_map;
-    suggestion_groups_map[kRecommendedGroupId].header = kRecommended;
-    suggestion_groups_map[kRecentSearchesGroupId].header = kRecentSearches;
+    suggestion_groups_map[kRecommendedGroupId]
+        .group_config_info.set_header_text(kRecommended);
+    suggestion_groups_map[kRecentSearchesGroupId]
+        .group_config_info.set_header_text(kRecentSearches);
     UpdateResultsWithSuggestionGroupsTestData({std::move(suggestion_groups_map),
                                                {
                                                    {kBadSuggestionGroupId},
@@ -973,12 +979,12 @@
 
     EXPECT_EQ(kRecentSearchesGroupId,
               result_.match_at(3)->suggestion_group_id.value());
-    EXPECT_EQ(kRecentSearches,
+    EXPECT_EQ(base::UTF8ToUTF16(kRecentSearches),
               result_.GetHeaderForSuggestionGroup(kRecentSearchesGroupId));
 
     EXPECT_EQ(kRecommendedGroupId,
               result_.match_at(4)->suggestion_group_id.value());
-    EXPECT_EQ(kRecommended,
+    EXPECT_EQ(base::UTF8ToUTF16(kRecommended),
               result_.GetHeaderForSuggestionGroup(kRecommendedGroupId));
   }
 }
diff --git a/components/omnibox/browser/autocomplete_result.cc b/components/omnibox/browser/autocomplete_result.cc
index e33d102..be4e138 100644
--- a/components/omnibox/browser/autocomplete_result.cc
+++ b/components/omnibox/browser/autocomplete_result.cc
@@ -34,11 +34,11 @@
 #include "components/omnibox/browser/omnibox_prefs.h"
 #include "components/omnibox/browser/tab_matcher.h"
 #include "components/omnibox/common/omnibox_features.h"
-#include "components/search_engines/omnibox_focus_type.h"
 #include "components/search_engines/template_url_service.h"
 #include "components/strings/grit/components_strings.h"
 #include "components/url_formatter/url_fixer.h"
 #include "third_party/metrics_proto/omnibox_event.pb.h"
+#include "third_party/metrics_proto/omnibox_focus_type.pb.h"
 #include "third_party/metrics_proto/omnibox_input_type.pb.h"
 #include "ui/base/device_form_factor.h"
 #include "ui/base/l10n/l10n_util.h"
@@ -336,7 +336,8 @@
 
   // Limit URL matches per OmniboxMaxURLMatches.
   size_t max_url_count = 0;
-  bool is_zero_suggest = input.focus_type() != OmniboxFocusType::DEFAULT;
+  bool is_zero_suggest =
+      input.focus_type() != metrics::OmniboxFocusType::INTERACTION_DEFAULT;
   if (OmniboxFieldTrial::IsMaxURLMatchesFeatureEnabled() &&
       (max_url_count = OmniboxFieldTrial::GetMaxURLMatches()) != 0)
     LimitNumberOfURLsShown(GetMaxMatches(is_zero_suggest), max_url_count,
@@ -391,7 +392,7 @@
   //    modes, there is no explicit user input so these checks don't make sense.
   auto* default_match = this->default_match();
   if (default_match && default_match->destination_url.is_valid() &&
-      input.focus_type() == OmniboxFocusType::DEFAULT) {
+      input.focus_type() == metrics::OmniboxFocusType::INTERACTION_DEFAULT) {
     const std::u16string debug_info =
         u"fill_into_edit=" + default_match->fill_into_edit + u", provider=" +
         ((default_match->provider != nullptr)
@@ -980,7 +981,7 @@
     SuggestionGroupId suggestion_group_id) const {
   const auto& it = suggestion_groups_map_.find(suggestion_group_id);
   DCHECK(it != suggestion_groups_map_.end());
-  return it->second.header;
+  return base::UTF8ToUTF16(it->second.group_config_info.header_text());
 }
 
 bool AutocompleteResult::IsSuggestionGroupHidden(
@@ -1002,7 +1003,8 @@
     return false;
 
   DCHECK_EQ(user_preference, omnibox::SuggestionGroupVisibility::DEFAULT);
-  return it->second.hidden;
+  return it->second.group_config_info.visibility() ==
+         omnibox::GroupConfigInfo_Visibility_HIDDEN;
 }
 
 void AutocompleteResult::SetSuggestionGroupHidden(
diff --git a/components/omnibox/browser/autocomplete_result_android.cc b/components/omnibox/browser/autocomplete_result_android.cc
index 818e528..ceff5794 100644
--- a/components/omnibox/browser/autocomplete_result_android.cc
+++ b/components/omnibox/browser/autocomplete_result_android.cc
@@ -100,8 +100,11 @@
   size_t index = 0;
   for (const auto& suggestion_group : suggestion_groups_map_) {
     group_ids[index] = static_cast<int>(suggestion_group.first);
-    group_names[index] = suggestion_group.second.header;
-    group_collapsed_states[index] = suggestion_group.second.hidden;
+    group_names[index] = base::UTF8ToUTF16(
+        suggestion_group.second.group_config_info.header_text());
+    group_collapsed_states[index] =
+        suggestion_group.second.group_config_info.visibility() ==
+        omnibox::GroupConfigInfo_Visibility_HIDDEN;
     ++index;
   }
 
diff --git a/components/omnibox/browser/autocomplete_result_unittest.cc b/components/omnibox/browser/autocomplete_result_unittest.cc
index dc0ef353..98712c5 100644
--- a/components/omnibox/browser/autocomplete_result_unittest.cc
+++ b/components/omnibox/browser/autocomplete_result_unittest.cc
@@ -1200,7 +1200,7 @@
   AutocompleteInput input(u"https://secure-prefix",
                           metrics::OmniboxEventProto::OTHER,
                           TestSchemeClassifier());
-  input.set_focus_type(OmniboxFocusType::ON_FOCUS);
+  input.set_focus_type(metrics::OmniboxFocusType::INTERACTION_FOCUS);
 
   AutocompleteResult result;
   result.AppendMatches(matches);
@@ -1874,8 +1874,8 @@
   // Suggestion groups have SuggestionGroupPriority::kDefault priority by
   // default.
   SuggestionGroupsMap suggestion_groups_map;
-  suggestion_groups_map[group_1].header = u"1";
-  suggestion_groups_map[group_2].header = u"2";
+  suggestion_groups_map[group_1].group_config_info.set_header_text("1");
+  suggestion_groups_map[group_2].group_config_info.set_header_text("2");
 
   {
     AutocompleteInput typed_input(u"a", metrics::OmniboxEventProto::OTHER,
@@ -1903,7 +1903,8 @@
   {
     AutocompleteInput zero_prefix_input(u"", metrics::OmniboxEventProto::NTP,
                                         TestSchemeClassifier());
-    zero_prefix_input.set_focus_type(OmniboxFocusType::ON_FOCUS);
+    zero_prefix_input.set_focus_type(
+        metrics::OmniboxFocusType::INTERACTION_FOCUS);
     AutocompleteResult result;
     result.MergeSuggestionGroupsMap(suggestion_groups_map);
     result.AppendMatches(matches);
@@ -1957,7 +1958,8 @@
   {
     AutocompleteInput zero_prefix_input(u"", metrics::OmniboxEventProto::NTP,
                                         TestSchemeClassifier());
-    zero_prefix_input.set_focus_type(OmniboxFocusType::ON_FOCUS);
+    zero_prefix_input.set_focus_type(
+        metrics::OmniboxFocusType::INTERACTION_FOCUS);
     AutocompleteResult result;
     result.MergeSuggestionGroupsMap(suggestion_groups_map);
     result.AppendMatches(matches);
@@ -2011,8 +2013,8 @@
   // Suggestion groups have SuggestionGroupPriority::kDefault priority by
   // default.
   SuggestionGroupsMap suggestion_groups_map;
-  suggestion_groups_map[group_1].header = u"1";
-  suggestion_groups_map[group_2].header = u"2";
+  suggestion_groups_map[group_1].group_config_info.set_header_text("1");
+  suggestion_groups_map[group_2].group_config_info.set_header_text("2");
 
   {
     AutocompleteInput typed_input(u"a", metrics::OmniboxEventProto::OTHER,
@@ -2033,7 +2035,8 @@
   {
     AutocompleteInput zero_prefix_input(u"", metrics::OmniboxEventProto::NTP,
                                         TestSchemeClassifier());
-    zero_prefix_input.set_focus_type(OmniboxFocusType::ON_FOCUS);
+    zero_prefix_input.set_focus_type(
+        metrics::OmniboxFocusType::INTERACTION_FOCUS);
     AutocompleteResult result;
 
     result.MergeSuggestionGroupsMap(suggestion_groups_map);
@@ -2087,10 +2090,10 @@
 
   // Set priorities that contradict the scores of the matches in groups.
   SuggestionGroupsMap suggestion_groups_map;
-  suggestion_groups_map[group_1].header = u"1";
+  suggestion_groups_map[group_1].group_config_info.set_header_text("1");
   suggestion_groups_map[group_1].priority =
       SuggestionGroupPriority::kRemoteZeroSuggest2;
-  suggestion_groups_map[group_2].header = u"2";
+  suggestion_groups_map[group_2].group_config_info.set_header_text("2");
   suggestion_groups_map[group_2].priority =
       SuggestionGroupPriority::kRemoteZeroSuggest1;
 
@@ -2114,7 +2117,8 @@
   {
     AutocompleteInput zero_prefix_input(u"", metrics::OmniboxEventProto::NTP,
                                         TestSchemeClassifier());
-    zero_prefix_input.set_focus_type(OmniboxFocusType::ON_FOCUS);
+    zero_prefix_input.set_focus_type(
+        metrics::OmniboxFocusType::INTERACTION_FOCUS);
     AutocompleteResult result;
 
     result.MergeSuggestionGroupsMap(suggestion_groups_map);
diff --git a/components/omnibox/browser/bookmark_provider.cc b/components/omnibox/browser/bookmark_provider.cc
index 27a95de..55fb3f2 100644
--- a/components/omnibox/browser/bookmark_provider.cc
+++ b/components/omnibox/browser/bookmark_provider.cc
@@ -23,7 +23,7 @@
 #include "components/omnibox/browser/titled_url_match_utils.h"
 #include "components/omnibox/common/omnibox_features.h"
 #include "components/prefs/pref_service.h"
-#include "components/search_engines/omnibox_focus_type.h"
+#include "third_party/metrics_proto/omnibox_focus_type.pb.h"
 #include "third_party/metrics_proto/omnibox_input_type.pb.h"
 #include "url/url_constants.h"
 
@@ -40,7 +40,8 @@
   TRACE_EVENT0("omnibox", "BookmarkProvider::Start");
   matches_.clear();
 
-  if (input.focus_type() != OmniboxFocusType::DEFAULT || input.text().empty())
+  if (input.focus_type() != metrics::OmniboxFocusType::INTERACTION_DEFAULT ||
+      input.text().empty())
     return;
 
   // Remove the keyword from input if we're in keyword mode for a starter pack
diff --git a/components/omnibox/browser/bookmark_provider_unittest.cc b/components/omnibox/browser/bookmark_provider_unittest.cc
index 286a41b..b1fafe3 100644
--- a/components/omnibox/browser/bookmark_provider_unittest.cc
+++ b/components/omnibox/browser/bookmark_provider_unittest.cc
@@ -27,7 +27,6 @@
 #include "components/omnibox/browser/test_scheme_classifier.h"
 #include "components/omnibox/browser/titled_url_match_utils.h"
 #include "components/omnibox/common/omnibox_features.h"
-#include "components/search_engines/omnibox_focus_type.h"
 #include "components/search_engines/template_url.h"
 #include "components/search_engines/template_url_service.h"
 #include "components/search_engines/template_url_starter_pack_data.h"
@@ -35,6 +34,7 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 #include "third_party/metrics_proto/omnibox_event.pb.h"
+#include "third_party/metrics_proto/omnibox_focus_type.pb.h"
 
 using bookmarks::BookmarkModel;
 using bookmarks::BookmarkNode;
@@ -546,7 +546,7 @@
 TEST_F(BookmarkProviderTest, DoesNotProvideMatchesOnFocus) {
   AutocompleteInput input(u"foo", metrics::OmniboxEventProto::OTHER,
                           TestSchemeClassifier());
-  input.set_focus_type(OmniboxFocusType::ON_FOCUS);
+  input.set_focus_type(metrics::OmniboxFocusType::INTERACTION_FOCUS);
   provider_->Start(input, false);
   EXPECT_TRUE(provider_->matches().empty());
 }
diff --git a/components/omnibox/browser/builtin_provider.cc b/components/omnibox/browser/builtin_provider.cc
index 8106dcf..3595acb 100644
--- a/components/omnibox/browser/builtin_provider.cc
+++ b/components/omnibox/browser/builtin_provider.cc
@@ -18,11 +18,11 @@
 #include "components/omnibox/browser/autocomplete_provider_client.h"
 #include "components/omnibox/browser/history_provider.h"
 #include "components/omnibox/browser/omnibox_field_trial.h"
-#include "components/search_engines/omnibox_focus_type.h"
 #include "components/search_engines/template_url_data.h"
 #include "components/search_engines/template_url_service.h"
 #include "components/search_engines/template_url_starter_pack_data.h"
 #include "components/url_formatter/url_fixer.h"
+#include "third_party/metrics_proto/omnibox_focus_type.pb.h"
 #include "third_party/metrics_proto/omnibox_input_type.pb.h"
 #include "ui/base/page_transition_types.h"
 #include "url/url_constants.h"
@@ -39,7 +39,7 @@
 void BuiltinProvider::Start(const AutocompleteInput& input,
                             bool minimal_changes) {
   matches_.clear();
-  if (input.focus_type() != OmniboxFocusType::DEFAULT ||
+  if (input.focus_type() != metrics::OmniboxFocusType::INTERACTION_DEFAULT ||
       (input.type() == metrics::OmniboxInputType::EMPTY)) {
     return;
   }
diff --git a/components/omnibox/browser/builtin_provider_unittest.cc b/components/omnibox/browser/builtin_provider_unittest.cc
index 6cfe3d7..6a709a1 100644
--- a/components/omnibox/browser/builtin_provider_unittest.cc
+++ b/components/omnibox/browser/builtin_provider_unittest.cc
@@ -23,13 +23,13 @@
 #include "components/omnibox/browser/mock_autocomplete_provider_client.h"
 #include "components/omnibox/browser/test_scheme_classifier.h"
 #include "components/omnibox/common/omnibox_features.h"
-#include "components/search_engines/omnibox_focus_type.h"
 #include "components/search_engines/template_url.h"
 #include "components/search_engines/template_url_data.h"
 #include "components/search_engines/template_url_service.h"
 #include "components/search_engines/template_url_starter_pack_data.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/metrics_proto/omnibox_event.pb.h"
+#include "third_party/metrics_proto/omnibox_focus_type.pb.h"
 #include "url/gurl.h"
 
 namespace {
@@ -310,7 +310,7 @@
 TEST_F(BuiltinProviderTest, DoesNotSupportMatchesOnFocus) {
   AutocompleteInput input(u"chrome://m", metrics::OmniboxEventProto::OTHER,
                           TestSchemeClassifier());
-  input.set_focus_type(OmniboxFocusType::ON_FOCUS);
+  input.set_focus_type(metrics::OmniboxFocusType::INTERACTION_FOCUS);
   provider_->Start(input, false);
   EXPECT_TRUE(provider_->matches().empty());
 }
diff --git a/components/omnibox/browser/clipboard_provider.cc b/components/omnibox/browser/clipboard_provider.cc
index 39c011f8..e60d0bbc9 100644
--- a/components/omnibox/browser/clipboard_provider.cc
+++ b/components/omnibox/browser/clipboard_provider.cc
@@ -29,11 +29,11 @@
 #include "components/omnibox/browser/verbatim_match.h"
 #include "components/omnibox/common/omnibox_features.h"
 #include "components/open_from_clipboard/clipboard_recent_content.h"
-#include "components/search_engines/omnibox_focus_type.h"
 #include "components/search_engines/template_url_service.h"
 #include "components/strings/grit/components_strings.h"
 #include "components/url_formatter/url_formatter.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
+#include "third_party/metrics_proto/omnibox_focus_type.pb.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/gfx/image/image_skia.h"
 #include "ui/gfx/image/image_util.h"
@@ -142,7 +142,7 @@
   field_trial_triggered_ = false;
 
   // If the user started typing, do not offer clipboard based match.
-  if (input.focus_type() == OmniboxFocusType::DEFAULT)
+  if (input.focus_type() == metrics::OmniboxFocusType::INTERACTION_DEFAULT)
     return;
 
   // Image matched was kicked off asynchronously, so proceed when that ends.
diff --git a/components/omnibox/browser/clipboard_provider_unittest.cc b/components/omnibox/browser/clipboard_provider_unittest.cc
index 6334eaaf..24629f1 100644
--- a/components/omnibox/browser/clipboard_provider_unittest.cc
+++ b/components/omnibox/browser/clipboard_provider_unittest.cc
@@ -21,11 +21,11 @@
 #include "components/omnibox/browser/test_scheme_classifier.h"
 #include "components/omnibox/common/omnibox_features.h"
 #include "components/open_from_clipboard/fake_clipboard_recent_content.h"
-#include "components/search_engines/omnibox_focus_type.h"
 #include "components/search_engines/template_url_service.h"
 #include "components/search_engines/template_url_service_client.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/metrics_proto/omnibox_focus_type.pb.h"
 #include "ui/gfx/image/image.h"
 #include "ui/gfx/image/image_skia.h"
 #include "ui/gfx/image/image_unittest_util.h"
@@ -105,7 +105,8 @@
            !clipboard_content_.HasRecentImageFromClipboard();
   }
 
-  AutocompleteInput CreateAutocompleteInput(OmniboxFocusType focus_type) {
+  AutocompleteInput CreateAutocompleteInput(
+      metrics::OmniboxFocusType focus_type) {
     AutocompleteInput input(std::u16string(), metrics::OmniboxEventProto::OTHER,
                             classifier_);
     input.set_current_url(GURL(kCurrentURL));
@@ -138,7 +139,9 @@
 }
 
 TEST_F(ClipboardProviderTest, NotFromOmniboxFocus) {
-  provider_->Start(CreateAutocompleteInput(OmniboxFocusType::DEFAULT), false);
+  provider_->Start(
+      CreateAutocompleteInput(metrics::OmniboxFocusType::INTERACTION_DEFAULT),
+      false);
   EXPECT_TRUE(provider_->matches().empty());
 }
 
@@ -147,7 +150,9 @@
       /*initializers=*/nullptr, /*count=*/0);
   client_->set_template_url_service(std::move(template_url_service));
   ClearClipboard();
-  provider_->Start(CreateAutocompleteInput(OmniboxFocusType::ON_FOCUS), false);
+  provider_->Start(
+      CreateAutocompleteInput(metrics::OmniboxFocusType::INTERACTION_FOCUS),
+      false);
   EXPECT_TRUE(provider_->matches().empty());
 }
 
@@ -161,14 +166,18 @@
       /*initializers=*/nullptr, /*count=*/0);
   client_->set_template_url_service(std::move(template_url_service));
   SetClipboardUrl(GURL(kCurrentURL));
-  provider_->Start(CreateAutocompleteInput(OmniboxFocusType::ON_FOCUS), false);
+  provider_->Start(
+      CreateAutocompleteInput(metrics::OmniboxFocusType::INTERACTION_FOCUS),
+      false);
   EXPECT_TRUE(provider_->matches().empty());
 }
 
 TEST_F(ClipboardProviderTest, HasMultipleMatches) {
   EXPECT_CALL(*client_.get(), GetSchemeClassifier())
       .WillOnce(testing::ReturnRef(classifier_));
-  provider_->Start(CreateAutocompleteInput(OmniboxFocusType::ON_FOCUS), false);
+  provider_->Start(
+      CreateAutocompleteInput(metrics::OmniboxFocusType::INTERACTION_FOCUS),
+      false);
   ASSERT_GE(provider_->matches().size(), 1U);
   EXPECT_EQ(GURL(kClipboardURL), provider_->matches().back().destination_url);
 }
@@ -177,7 +186,9 @@
   SetClipboardUrl(GURL(kClipboardURL));
   EXPECT_CALL(*client_.get(), GetSchemeClassifier())
       .WillOnce(testing::ReturnRef(classifier_));
-  provider_->Start(CreateAutocompleteInput(OmniboxFocusType::ON_FOCUS), false);
+  provider_->Start(
+      CreateAutocompleteInput(metrics::OmniboxFocusType::INTERACTION_FOCUS),
+      false);
   ASSERT_GE(provider_->matches().size(), 1U);
   EXPECT_EQ(GURL(kClipboardURL), provider_->matches().back().destination_url);
   EXPECT_EQ(AutocompleteMatchType::CLIPBOARD_URL,
@@ -189,7 +200,9 @@
       /*initializers=*/nullptr, /*count=*/0);
   client_->set_template_url_service(std::move(template_url_service));
   SetClipboardText(kClipboardText);
-  provider_->Start(CreateAutocompleteInput(OmniboxFocusType::ON_FOCUS), false);
+  provider_->Start(
+      CreateAutocompleteInput(metrics::OmniboxFocusType::INTERACTION_FOCUS),
+      false);
   ASSERT_GE(provider_->matches().size(), 1U);
   EXPECT_EQ(kClipboardText, provider_->matches().back().contents);
   EXPECT_EQ(kClipboardText, provider_->matches().back().fill_into_edit);
@@ -221,7 +234,9 @@
       /*initializers=*/nullptr, /*count=*/0);
   client_->set_template_url_service(std::move(template_url_service));
   SetClipboardText(kClipboardText);
-  provider_->Start(CreateAutocompleteInput(OmniboxFocusType::ON_FOCUS), false);
+  provider_->Start(
+      CreateAutocompleteInput(metrics::OmniboxFocusType::INTERACTION_FOCUS),
+      false);
   ASSERT_EQ(provider_->matches().size(), 1U);
 
   provider_->DeleteMatch(provider_->matches().back());
@@ -238,7 +253,9 @@
   auto template_url_service = std::make_unique<TemplateURLService>(
       /*initializers=*/nullptr, /*count=*/0);
   client_->set_template_url_service(std::move(template_url_service));
-  provider_->Start(CreateAutocompleteInput(OmniboxFocusType::ON_FOCUS), false);
+  provider_->Start(
+      CreateAutocompleteInput(metrics::OmniboxFocusType::INTERACTION_FOCUS),
+      false);
   ASSERT_GE(provider_->matches().size(), 1U);
   EXPECT_EQ(AutocompleteMatchType::CLIPBOARD_URL,
             provider_->matches().back().type);
@@ -256,7 +273,9 @@
       /*initializers=*/nullptr, /*count=*/0);
   client_->set_template_url_service(std::move(template_url_service));
   SetClipboardText(kClipboardText);
-  provider_->Start(CreateAutocompleteInput(OmniboxFocusType::ON_FOCUS), false);
+  provider_->Start(
+      CreateAutocompleteInput(metrics::OmniboxFocusType::INTERACTION_FOCUS),
+      false);
   ASSERT_GE(provider_->matches().size(), 1U);
   EXPECT_EQ(AutocompleteMatchType::CLIPBOARD_TEXT,
             provider_->matches().back().type);
@@ -278,7 +297,9 @@
 
   gfx::Image test_image = gfx::test::CreateImage(/*width=*/10, /*height=*/10);
   SetClipboardImage(test_image);
-  provider_->Start(CreateAutocompleteInput(OmniboxFocusType::ON_FOCUS), false);
+  provider_->Start(
+      CreateAutocompleteInput(metrics::OmniboxFocusType::INTERACTION_FOCUS),
+      false);
   ASSERT_GE(provider_->matches().size(), 1U);
   EXPECT_EQ(AutocompleteMatchType::CLIPBOARD_IMAGE,
             provider_->matches().back().type);
@@ -300,7 +321,8 @@
   // When `input.omit_asynchronous_matches` is set to true, the clipboard
   // provider should skip any asynchronous logic associated with creating an
   // image match.
-  AutocompleteInput input = CreateAutocompleteInput(OmniboxFocusType::ON_FOCUS);
+  AutocompleteInput input =
+      CreateAutocompleteInput(metrics::OmniboxFocusType::INTERACTION_FOCUS);
   input.set_omit_asynchronous_matches(true);
   provider_->Start(input, false);
   ASSERT_TRUE(provider_->done());
diff --git a/components/omnibox/browser/document_provider.cc b/components/omnibox/browser/document_provider.cc
index e1a25f84..47a25e12 100644
--- a/components/omnibox/browser/document_provider.cc
+++ b/components/omnibox/browser/document_provider.cc
@@ -45,13 +45,13 @@
 #include "components/omnibox/common/omnibox_features.h"
 #include "components/pref_registry/pref_registry_syncable.h"
 #include "components/prefs/pref_service.h"
-#include "components/search_engines/omnibox_focus_type.h"
 #include "components/search_engines/search_engine_type.h"
 #include "components/search_engines/template_url_service.h"
 #include "components/strings/grit/components_strings.h"
 #include "net/base/url_util.h"
 #include "services/network/public/mojom/url_response_head.mojom.h"
 #include "third_party/metrics_proto/omnibox_event.pb.h"
+#include "third_party/metrics_proto/omnibox_focus_type.pb.h"
 #include "third_party/re2/src/re2/re2.h"
 #include "ui/base/l10n/l10n_util.h"
 
@@ -565,7 +565,7 @@
 
   // There should be no document suggestions fetched for on-focus suggestion
   // requests, or if the input is empty.
-  if (input.focus_type() != OmniboxFocusType::DEFAULT ||
+  if (input.focus_type() != metrics::OmniboxFocusType::INTERACTION_DEFAULT ||
       input.type() == metrics::OmniboxInputType::EMPTY) {
     return false;
   }
diff --git a/components/omnibox/browser/document_provider_unittest.cc b/components/omnibox/browser/document_provider_unittest.cc
index 9f21e4f5..2de10bf 100644
--- a/components/omnibox/browser/document_provider_unittest.cc
+++ b/components/omnibox/browser/document_provider_unittest.cc
@@ -264,7 +264,7 @@
   {
     AutocompleteInput input(u"text text", metrics::OmniboxEventProto::OTHER,
                             TestSchemeClassifier());
-    input.set_focus_type(OmniboxFocusType::ON_FOCUS);
+    input.set_focus_type(metrics::OmniboxFocusType::INTERACTION_FOCUS);
     EXPECT_FALSE(provider_->IsDocumentProviderAllowed(client_.get(), input));
   }
 
@@ -288,7 +288,7 @@
   {
     AutocompleteInput input(u"www.x.com", metrics::OmniboxEventProto::OTHER,
                             TestSchemeClassifier());
-    input.set_focus_type(OmniboxFocusType::ON_FOCUS);
+    input.set_focus_type(metrics::OmniboxFocusType::INTERACTION_FOCUS);
     EXPECT_FALSE(provider_->IsDocumentProviderAllowed(client_.get(), input));
   }
 }
diff --git a/components/omnibox/browser/history_cluster_provider_unittest.cc b/components/omnibox/browser/history_cluster_provider_unittest.cc
index 8e3bfc92b..0daa541 100644
--- a/components/omnibox/browser/history_cluster_provider_unittest.cc
+++ b/components/omnibox/browser/history_cluster_provider_unittest.cc
@@ -80,7 +80,7 @@
     provider_ = new HistoryClusterProvider(
         autocomplete_provider_client_.get(), this, search_provider_.get(),
         history_url_provider_.get(), history_quick_provider_.get());
-  };
+  }
 
   ~HistoryClustersProviderTest() override {
     // The provider will kick off an async task to refresh the keyword cache.
@@ -93,7 +93,7 @@
   void OnProviderUpdate(bool updated_matches,
                         const AutocompleteProvider* provider) override {
     on_provider_update_calls_.push_back(updated_matches);
-  };
+  }
 
   // Tracks `OnProviderUpdate()` invocations.
   std::vector<bool> on_provider_update_calls_;
diff --git a/components/omnibox/browser/history_fuzzy_provider.cc b/components/omnibox/browser/history_fuzzy_provider.cc
index 297e8314..64efd259 100644
--- a/components/omnibox/browser/history_fuzzy_provider.cc
+++ b/components/omnibox/browser/history_fuzzy_provider.cc
@@ -36,8 +36,8 @@
 #include "components/omnibox/browser/history_quick_provider.h"
 #include "components/omnibox/browser/omnibox_field_trial.h"
 #include "components/omnibox/browser/omnibox_triggered_feature_service.h"
-#include "components/search_engines/omnibox_focus_type.h"
 #include "components/url_formatter/elide_url.h"
+#include "third_party/metrics_proto/omnibox_focus_type.pb.h"
 #include "url/gurl.h"
 
 namespace {
@@ -544,7 +544,7 @@
                                  bool minimal_changes) {
   TRACE_EVENT0("omnibox", "HistoryFuzzyProvider::Start");
   matches_.clear();
-  if (input.focus_type() != OmniboxFocusType::DEFAULT ||
+  if (input.focus_type() != metrics::OmniboxFocusType::INTERACTION_DEFAULT ||
       input.type() == metrics::OmniboxInputType::EMPTY) {
     return;
   }
diff --git a/components/omnibox/browser/history_quick_provider.cc b/components/omnibox/browser/history_quick_provider.cc
index 35308918..d054927 100644
--- a/components/omnibox/browser/history_quick_provider.cc
+++ b/components/omnibox/browser/history_quick_provider.cc
@@ -31,9 +31,9 @@
 #include "components/omnibox/browser/omnibox_field_trial.h"
 #include "components/omnibox/browser/url_prefix.h"
 #include "components/prefs/pref_service.h"
-#include "components/search_engines/omnibox_focus_type.h"
 #include "components/url_formatter/url_formatter.h"
 #include "net/base/registry_controlled_domains/registry_controlled_domain.h"
+#include "third_party/metrics_proto/omnibox_focus_type.pb.h"
 #include "third_party/metrics_proto/omnibox_input_type.pb.h"
 #include "url/third_party/mozilla/url_parse.h"
 #include "url/url_util.h"
@@ -48,7 +48,8 @@
                                  bool minimal_changes) {
   TRACE_EVENT0("omnibox", "HistoryQuickProvider::Start");
   matches_.clear();
-  if (disabled_ || input.focus_type() != OmniboxFocusType::DEFAULT)
+  if (disabled_ ||
+      input.focus_type() != metrics::OmniboxFocusType::INTERACTION_DEFAULT)
     return;
 
   // Don't bother with INVALID.
diff --git a/components/omnibox/browser/history_quick_provider_unittest.cc b/components/omnibox/browser/history_quick_provider_unittest.cc
index 1aaaefb6..8111b611 100644
--- a/components/omnibox/browser/history_quick_provider_unittest.cc
+++ b/components/omnibox/browser/history_quick_provider_unittest.cc
@@ -36,10 +36,10 @@
 #include "components/omnibox/browser/in_memory_url_index_test_util.h"
 #include "components/omnibox/common/omnibox_features.h"
 #include "components/prefs/pref_service.h"
-#include "components/search_engines/omnibox_focus_type.h"
 #include "components/search_engines/search_terms_data.h"
 #include "components/search_engines/template_url_starter_pack_data.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/metrics_proto/omnibox_focus_type.pb.h"
 
 using base::ASCIIToUTF16;
 
@@ -832,7 +832,7 @@
 TEST_F(HistoryQuickProviderTest, DoesNotProvideMatchesOnFocus) {
   AutocompleteInput input(u"popularsite", metrics::OmniboxEventProto::OTHER,
                           TestSchemeClassifier());
-  input.set_focus_type(OmniboxFocusType::ON_FOCUS);
+  input.set_focus_type(metrics::OmniboxFocusType::INTERACTION_FOCUS);
   provider().Start(input, false);
   EXPECT_TRUE(provider().matches().empty());
 }
diff --git a/components/omnibox/browser/history_url_provider.cc b/components/omnibox/browser/history_url_provider.cc
index 7f620f4e..75ba23bc 100644
--- a/components/omnibox/browser/history_url_provider.cc
+++ b/components/omnibox/browser/history_url_provider.cc
@@ -39,12 +39,12 @@
 #include "components/omnibox/browser/url_prefix.h"
 #include "components/omnibox/browser/verbatim_match.h"
 #include "components/prefs/pref_service.h"
-#include "components/search_engines/omnibox_focus_type.h"
 #include "components/search_engines/search_terms_data.h"
 #include "components/search_engines/template_url_service.h"
 #include "components/url_formatter/url_fixer.h"
 #include "components/url_formatter/url_formatter.h"
 #include "net/base/registry_controlled_domains/registry_controlled_domain.h"
+#include "third_party/metrics_proto/omnibox_focus_type.pb.h"
 #include "third_party/metrics_proto/omnibox_input_type.pb.h"
 #include "url/gurl.h"
 #include "url/third_party/mozilla/url_parse.h"
@@ -417,7 +417,7 @@
   // Cancel any in-progress query.
   Stop(true, false);
 
-  if (input.focus_type() != OmniboxFocusType::DEFAULT ||
+  if (input.focus_type() != metrics::OmniboxFocusType::INTERACTION_DEFAULT ||
       (input.type() == metrics::OmniboxInputType::EMPTY))
     return;
 
diff --git a/components/omnibox/browser/history_url_provider_unittest.cc b/components/omnibox/browser/history_url_provider_unittest.cc
index 249ba8f..521c83be 100644
--- a/components/omnibox/browser/history_url_provider_unittest.cc
+++ b/components/omnibox/browser/history_url_provider_unittest.cc
@@ -33,13 +33,13 @@
 #include "components/omnibox/common/omnibox_features.h"
 #include "components/prefs/pref_service.h"
 #include "components/search_engines/default_search_manager.h"
-#include "components/search_engines/omnibox_focus_type.h"
 #include "components/search_engines/template_url.h"
 #include "components/search_engines/template_url_service.h"
 #include "components/search_engines/template_url_starter_pack_data.h"
 #include "components/url_formatter/url_fixer.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/metrics_proto/omnibox_event.pb.h"
+#include "third_party/metrics_proto/omnibox_focus_type.pb.h"
 #include "third_party/metrics_proto/omnibox_input_type.pb.h"
 
 using base::ASCIIToUTF16;
@@ -1020,7 +1020,7 @@
 TEST_F(HistoryURLProviderTest, DoesNotProvideMatchesOnFocus) {
   AutocompleteInput input(u"foo", metrics::OmniboxEventProto::OTHER,
                           TestSchemeClassifier());
-  input.set_focus_type(OmniboxFocusType::ON_FOCUS);
+  input.set_focus_type(metrics::OmniboxFocusType::INTERACTION_FOCUS);
   autocomplete_->Start(input, false);
   EXPECT_TRUE(autocomplete_->matches().empty());
 }
diff --git a/components/omnibox/browser/keyword_provider.cc b/components/omnibox/browser/keyword_provider.cc
index 08a1e3d..fc54fa5b 100644
--- a/components/omnibox/browser/keyword_provider.cc
+++ b/components/omnibox/browser/keyword_provider.cc
@@ -23,12 +23,12 @@
 #include "components/omnibox/browser/keyword_extensions_delegate.h"
 #include "components/omnibox/browser/omnibox_field_trial.h"
 #include "components/omnibox/browser/search_provider.h"
-#include "components/search_engines/omnibox_focus_type.h"
 #include "components/search_engines/template_url.h"
 #include "components/search_engines/template_url_service.h"
 #include "components/search_engines/template_url_starter_pack_data.h"
 #include "components/strings/grit/components_strings.h"
 #include "components/url_formatter/url_formatter.h"
+#include "third_party/metrics_proto/omnibox_focus_type.pb.h"
 #include "third_party/metrics_proto/omnibox_input_type.pb.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "url/url_constants.h"
@@ -318,7 +318,7 @@
       extensions_delegate_->IncrementInputId();
   }
 
-  if (input.focus_type() != OmniboxFocusType::DEFAULT)
+  if (input.focus_type() != metrics::OmniboxFocusType::INTERACTION_DEFAULT)
     return;
 
   GetTemplateURLService();
diff --git a/components/omnibox/browser/keyword_provider_unittest.cc b/components/omnibox/browser/keyword_provider_unittest.cc
index ccf802b..70dc991a 100644
--- a/components/omnibox/browser/keyword_provider_unittest.cc
+++ b/components/omnibox/browser/keyword_provider_unittest.cc
@@ -19,7 +19,6 @@
 #include "components/omnibox/browser/autocomplete_scheme_classifier.h"
 #include "components/omnibox/browser/mock_autocomplete_provider_client.h"
 #include "components/omnibox/browser/omnibox_field_trial.h"
-#include "components/search_engines/omnibox_focus_type.h"
 #include "components/search_engines/search_engines_switches.h"
 #include "components/search_engines/template_url.h"
 #include "components/search_engines/template_url_service.h"
@@ -27,6 +26,7 @@
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/metrics_proto/omnibox_event.pb.h"
+#include "third_party/metrics_proto/omnibox_focus_type.pb.h"
 #include "url/gurl.h"
 #include "url/url_constants.h"
 
@@ -499,7 +499,7 @@
   SetUpClientAndKeywordProvider();
   AutocompleteInput input(u"aaa", metrics::OmniboxEventProto::OTHER,
                           TestingSchemeClassifier());
-  input.set_focus_type(OmniboxFocusType::ON_FOCUS);
+  input.set_focus_type(metrics::OmniboxFocusType::INTERACTION_FOCUS);
   kw_provider_->Start(input, false);
   ASSERT_TRUE(kw_provider_->matches().empty());
 }
diff --git a/components/omnibox/browser/local_history_zero_suggest_provider.cc b/components/omnibox/browser/local_history_zero_suggest_provider.cc
index b8d9a9a4..080cb62 100644
--- a/components/omnibox/browser/local_history_zero_suggest_provider.cc
+++ b/components/omnibox/browser/local_history_zero_suggest_provider.cc
@@ -36,8 +36,8 @@
 #include "components/omnibox/browser/omnibox_prefs.h"
 #include "components/omnibox/browser/zero_suggest_provider.h"
 #include "components/omnibox/common/omnibox_features.h"
-#include "components/search_engines/omnibox_focus_type.h"
 #include "components/search_engines/template_url_service.h"
+#include "third_party/metrics_proto/omnibox_focus_type.pb.h"
 #include "url/gurl.h"
 
 using metrics::OmniboxInputType;
@@ -83,7 +83,7 @@
 
   // Allow local history query suggestions only when the omnibox is empty and is
   // focused from the NTP.
-  return input.focus_type() == OmniboxFocusType::ON_FOCUS &&
+  return input.focus_type() == metrics::OmniboxFocusType::INTERACTION_FOCUS &&
          input.type() == OmniboxInputType::EMPTY &&
          BaseSearchProvider::IsNTPPage(input.current_page_classification());
 }
diff --git a/components/omnibox/browser/local_history_zero_suggest_provider_unittest.cc b/components/omnibox/browser/local_history_zero_suggest_provider_unittest.cc
index 9822e07..63c1683 100644
--- a/components/omnibox/browser/local_history_zero_suggest_provider_unittest.cc
+++ b/components/omnibox/browser/local_history_zero_suggest_provider_unittest.cc
@@ -29,12 +29,12 @@
 #include "components/omnibox/browser/fake_autocomplete_provider_client.h"
 #include "components/omnibox/browser/in_memory_url_index_test_util.h"
 #include "components/omnibox/common/omnibox_features.h"
-#include "components/search_engines/omnibox_focus_type.h"
 #include "components/search_engines/search_engines_test_util.h"
 #include "components/search_engines/template_url.h"
 #include "components/search_engines/template_url_service.h"
 #include "components/signin/public/identity_manager/identity_test_environment.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/metrics_proto/omnibox_focus_type.pb.h"
 
 using base::Time;
 using metrics::OmniboxEventProto;
@@ -136,7 +136,7 @@
 
   // Creates an input using the provided information and queries the provider.
   void StartProviderAndWaitUntilDone(const std::string& text,
-                                     OmniboxFocusType focus_type,
+                                     metrics::OmniboxFocusType focus_type,
                                      PageClassification page_classification,
                                      const std::string& current_url);
 
@@ -199,7 +199,8 @@
 
 void LocalHistoryZeroSuggestProviderTest::StartProviderAndWaitUntilDone(
     const std::string& text = "",
-    OmniboxFocusType focus_type = OmniboxFocusType::ON_FOCUS,
+    metrics::OmniboxFocusType focus_type =
+        metrics::OmniboxFocusType::INTERACTION_FOCUS,
     PageClassification page_classification = OmniboxEventProto::NTP_REALBOX,
     const std::string& current_url = "") {
   AutocompleteInput input(base::ASCIIToUTF16(text), page_classification,
@@ -266,7 +267,8 @@
   histogram_tester.ExpectTotalCount(
       "Omnibox.LocalHistoryZeroSuggest.SearchTermsExtractionTime", 0);
 
-  StartProviderAndWaitUntilDone(/*text=*/"", OmniboxFocusType::DEFAULT);
+  StartProviderAndWaitUntilDone(/*text=*/"",
+                                metrics::OmniboxFocusType::INTERACTION_DEFAULT);
   ExpectMatches({});
 
   // Following histograms should not be logged if zero-prefix suggestions are
@@ -337,7 +339,8 @@
         /*enabled_features=*/{omnibox::kFocusTriggersSRPZeroSuggest},
         /*disabled_features=*/{omnibox::kLocalHistoryZeroSuggestBeyondNTP});
     StartProviderAndWaitUntilDone(
-        /*text=*/"https://example.com/", OmniboxFocusType::ON_FOCUS,
+        /*text=*/"https://example.com/",
+        metrics::OmniboxFocusType::INTERACTION_FOCUS,
         OmniboxEventProto::SEARCH_RESULT_PAGE_NO_SEARCH_TERM_REPLACEMENT,
         /*current_url=*/"https://example.com/");
 
@@ -356,7 +359,8 @@
         },
         /*disabled_features=*/{});
     StartProviderAndWaitUntilDone(
-        /*text=*/"https://example.com/", OmniboxFocusType::ON_FOCUS,
+        /*text=*/"https://example.com/",
+        metrics::OmniboxFocusType::INTERACTION_FOCUS,
         OmniboxEventProto::SEARCH_RESULT_PAGE_NO_SEARCH_TERM_REPLACEMENT,
         /*current_url=*/"https://example.com/");
 
@@ -372,7 +376,8 @@
         /*enabled_features=*/{omnibox::kLocalHistoryZeroSuggestBeyondNTP},
         /*disabled_features=*/{omnibox::kFocusTriggersSRPZeroSuggest});
     StartProviderAndWaitUntilDone(
-        /*text=*/"https://example.com/", OmniboxFocusType::ON_FOCUS,
+        /*text=*/"https://example.com/",
+        metrics::OmniboxFocusType::INTERACTION_FOCUS,
         OmniboxEventProto::SEARCH_RESULT_PAGE_NO_SEARCH_TERM_REPLACEMENT,
         /*current_url=*/"https://example.com/");
 
diff --git a/components/omnibox/browser/most_visited_sites_provider.cc b/components/omnibox/browser/most_visited_sites_provider.cc
index a50290f..fc3211e 100644
--- a/components/omnibox/browser/most_visited_sites_provider.cc
+++ b/components/omnibox/browser/most_visited_sites_provider.cc
@@ -197,7 +197,7 @@
   const auto page_class = input.current_page_classification();
   const auto input_type = input.type();
 
-  if (input.focus_type() == OmniboxFocusType::DEFAULT)
+  if (input.focus_type() == metrics::OmniboxFocusType::INTERACTION_DEFAULT)
     return false;
 
   if (client_->IsOffTheRecord())
diff --git a/components/omnibox/browser/most_visited_sites_provider_unittest.cc b/components/omnibox/browser/most_visited_sites_provider_unittest.cc
index d12372d7..2e7e732 100644
--- a/components/omnibox/browser/most_visited_sites_provider_unittest.cc
+++ b/components/omnibox/browser/most_visited_sites_provider_unittest.cc
@@ -20,10 +20,10 @@
 #include "components/omnibox/browser/omnibox_field_trial.h"
 #include "components/omnibox/browser/test_scheme_classifier.h"
 #include "components/omnibox/common/omnibox_features.h"
-#include "components/search_engines/omnibox_focus_type.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/metrics_proto/omnibox_event.pb.h"
+#include "third_party/metrics_proto/omnibox_focus_type.pb.h"
 
 namespace {
 class FakeTopSites : public history::TopSites {
@@ -101,7 +101,7 @@
       const std::u16string& input_url,
       const std::u16string& current_url,
       metrics::OmniboxEventProto::PageClassification page_class,
-      OmniboxFocusType focus_type) {
+      metrics::OmniboxFocusType focus_type) {
     AutocompleteInput input(input_url, page_class, TestSchemeClassifier());
     input.set_focus_type(focus_type);
     input.set_current_url(GURL(current_url));
@@ -113,7 +113,7 @@
   AutocompleteInput BuildAutocompleteInputForWebOnFocus() {
     return BuildAutocompleteInput(WEB_URL, WEB_URL,
                                   metrics::OmniboxEventProto::OTHER,
-                                  OmniboxFocusType::ON_FOCUS);
+                                  metrics::OmniboxFocusType::INTERACTION_FOCUS);
   }
 
   // Iterate over all matches offered by the Provider and verify these against
@@ -305,7 +305,7 @@
   auto srp_input = BuildAutocompleteInput(
       SRP_URL, SRP_URL,
       metrics::OmniboxEventProto::SEARCH_RESULT_PAGE_NO_SEARCH_TERM_REPLACEMENT,
-      OmniboxFocusType::ON_FOCUS);
+      metrics::OmniboxFocusType::INTERACTION_FOCUS);
 
   controller_->Start(srp_input);
   EXPECT_EQ(0u, NumMostVisitedMatches());
@@ -347,31 +347,34 @@
 TEST_P(ParameterizedMostVisitedSitesProviderTest,
        AllowMostVisitedSitesSuggestions) {
   using OEP = metrics::OmniboxEventProto;
-  using OFT = OmniboxFocusType;
+  using OFT = metrics::OmniboxFocusType;
 
   // MostVisited should never deal with prefix suggestions.
-  EXPECT_FALSE(provider_->AllowMostVisitedSitesSuggestions(
-      BuildAutocompleteInput(WEB_URL, WEB_URL, OEP::OTHER, OFT::DEFAULT)));
+  EXPECT_FALSE(
+      provider_->AllowMostVisitedSitesSuggestions(BuildAutocompleteInput(
+          WEB_URL, WEB_URL, OEP::OTHER, OFT::INTERACTION_DEFAULT)));
 
   // This should always be true, as otherwise we will break MostVisited.
-  EXPECT_TRUE(provider_->AllowMostVisitedSitesSuggestions(
-      BuildAutocompleteInput(WEB_URL, WEB_URL, OEP::OTHER, OFT::ON_FOCUS)));
+  EXPECT_TRUE(
+      provider_->AllowMostVisitedSitesSuggestions(BuildAutocompleteInput(
+          WEB_URL, WEB_URL, OEP::OTHER, OFT::INTERACTION_FOCUS)));
 
   // Verifies that non-permitted schemes are rejected.
-  EXPECT_FALSE(provider_->AllowMostVisitedSitesSuggestions(
-      BuildAutocompleteInput(FTP_URL, FTP_URL, OEP::OTHER, OFT::ON_FOCUS)));
+  EXPECT_FALSE(
+      provider_->AllowMostVisitedSitesSuggestions(BuildAutocompleteInput(
+          FTP_URL, FTP_URL, OEP::OTHER, OFT::INTERACTION_FOCUS)));
 
   // Offer MV sites when the User is visiting a website and deletes text.
   EXPECT_TRUE(
       provider_->AllowMostVisitedSitesSuggestions(BuildAutocompleteInput(
-          WEB_URL, WEB_URL, OEP::OTHER, OFT::DELETED_PERMANENT_TEXT)));
+          WEB_URL, WEB_URL, OEP::OTHER, OFT::INTERACTION_CLOBBER)));
 
   // Offer MV sites when the User searched for a query and focus on omnibox.
   EXPECT_EQ(
       GetParam(),
       provider_->AllowMostVisitedSitesSuggestions(BuildAutocompleteInput(
           WEB_URL, WEB_URL, OEP::SEARCH_RESULT_PAGE_NO_SEARCH_TERM_REPLACEMENT,
-          OFT::ON_FOCUS)));
+          OFT::INTERACTION_FOCUS)));
 }
 
 TEST_P(ParameterizedMostVisitedSitesProviderTest, TestCreateMostVisitedMatch) {
@@ -398,7 +401,7 @@
   // Assume that top sites list has not been loaded yet from the DB.
   ASSERT_FALSE(top_sites_->loaded());
   auto input = BuildAutocompleteInputForWebOnFocus();
-  input.set_focus_type(OmniboxFocusType::DEFAULT);
+  input.set_focus_type(metrics::OmniboxFocusType::INTERACTION_DEFAULT);
   input.set_omit_asynchronous_matches(true);
   controller_->Start(input);
   EXPECT_TRUE(provider_->done());
diff --git a/components/omnibox/browser/omnibox_edit_model.cc b/components/omnibox/browser/omnibox_edit_model.cc
index 9d3f7ba..84b62cd 100644
--- a/components/omnibox/browser/omnibox_edit_model.cc
+++ b/components/omnibox/browser/omnibox_edit_model.cc
@@ -52,7 +52,6 @@
 #include "components/omnibox/browser/verbatim_match.h"
 #include "components/omnibox/common/omnibox_features.h"
 #include "components/prefs/pref_service.h"
-#include "components/search_engines/omnibox_focus_type.h"
 #include "components/search_engines/search_engine_type.h"
 #include "components/search_engines/template_url.h"
 #include "components/search_engines/template_url_prepopulate_data.h"
@@ -61,6 +60,7 @@
 #include "net/cookies/cookie_util.h"
 #include "third_party/icu/source/common/unicode/ubidi.h"
 #include "third_party/metrics_proto/omnibox_event.pb.h"
+#include "third_party/metrics_proto/omnibox_focus_type.pb.h"
 #include "third_party/skia/include/core/SkBitmap.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/gfx/geometry/rect.h"
@@ -898,8 +898,8 @@
   // dropdown is closed or the user used a paste-and-go action.  (In most
   // cases when this happens, the user never modified the omnibox.)
   const bool popup_open = PopupIsOpen();
-  if (input_.focus_type() != OmniboxFocusType::DEFAULT || !popup_open ||
-      !pasted_text.empty()) {
+  if (input_.focus_type() != metrics::OmniboxFocusType::INTERACTION_DEFAULT ||
+      !popup_open || !pasted_text.empty()) {
     const base::TimeDelta default_time_delta = base::Milliseconds(-1);
     elapsed_time_since_user_first_modified_omnibox = default_time_delta;
     elapsed_time_since_last_change_to_default_match = default_time_delta;
@@ -920,8 +920,9 @@
   fake_single_entry_result.AppendMatches(fake_single_entry_matches);
 
   OmniboxLog log(
-      input_.focus_type() != OmniboxFocusType::DEFAULT ? std::u16string()
-                                                       : input_text,
+      input_.focus_type() != metrics::OmniboxFocusType::INTERACTION_DEFAULT
+          ? std::u16string()
+          : input_text,
       just_deleted_text_, input_.type(), is_keyword_selected(),
       keyword_mode_entry_method_, popup_open, dropdown_ignored ? 0 : index,
       disposition, !pasted_text.empty(),
@@ -1282,8 +1283,8 @@
   input_.set_current_url(client_->GetURL());
   input_.set_current_title(client_->GetTitle());
   input_.set_focus_type(user_clobbered_permanent_text
-                            ? OmniboxFocusType::DELETED_PERMANENT_TEXT
-                            : OmniboxFocusType::ON_FOCUS);
+                            ? metrics::OmniboxFocusType::INTERACTION_CLOBBER
+                            : metrics::OmniboxFocusType::INTERACTION_FOCUS);
   autocomplete_controller()->Start(input_);
 }
 
diff --git a/components/omnibox/browser/omnibox_edit_model_unittest.cc b/components/omnibox/browser/omnibox_edit_model_unittest.cc
index d77c24e6..cfb0068 100644
--- a/components/omnibox/browser/omnibox_edit_model_unittest.cc
+++ b/components/omnibox/browser/omnibox_edit_model_unittest.cc
@@ -750,8 +750,10 @@
   result->AppendMatches(matches);
 
   SuggestionGroupsMap suggestion_groups_map;
-  suggestion_groups_map[kNewGroupId].header = u"header";
-  suggestion_groups_map[SuggestionGroupId::kHistoryCluster].header = u"";
+  suggestion_groups_map[kNewGroupId].group_config_info.set_header_text(
+      "header");
+  suggestion_groups_map[SuggestionGroupId::kHistoryCluster]
+      .group_config_info.set_header_text("");
 
   // Do not set the original_group_id on purpose to test that default visibility
   // can be safely queried via AutocompleteResult::IsSuggestionGroupHidden().
@@ -842,7 +844,8 @@
   result->AppendMatches(matches);
 
   SuggestionGroupsMap suggestion_groups_map;
-  suggestion_groups_map[kNewGroupId].header = u"header";
+  suggestion_groups_map[kNewGroupId].group_config_info.set_header_text(
+      "header");
   suggestion_groups_map[kNewGroupId].original_group_id = 12345;
   // Setting the original_group_id allows the default visibility to be set via
   // AutocompleteResult::SetSuggestionGroupHidden().
@@ -918,7 +921,8 @@
   result->AppendMatches(matches);
 
   SuggestionGroupsMap suggestion_groups_map;
-  suggestion_groups_map[kNewGroupId].header = u"header";
+  suggestion_groups_map[kNewGroupId].group_config_info.set_header_text(
+      "header");
   // Do not set the original_group_id on purpose to test that default visibility
   // can be safely queried via AutocompleteResult::IsSuggestionGroupHidden().
   result->MergeSuggestionGroupsMap(suggestion_groups_map);
diff --git a/components/omnibox/browser/on_device_head_provider.cc b/components/omnibox/browser/on_device_head_provider.cc
index 7d5db77..d6a8f40a 100644
--- a/components/omnibox/browser/on_device_head_provider.cc
+++ b/components/omnibox/browser/on_device_head_provider.cc
@@ -25,9 +25,9 @@
 #include "components/omnibox/browser/on_device_head_provider.h"
 #include "components/omnibox/browser/on_device_model_update_listener.h"
 #include "components/omnibox/common/omnibox_features.h"
-#include "components/search_engines/omnibox_focus_type.h"
 #include "components/search_engines/search_terms_data.h"
 #include "components/search_engines/template_url_service.h"
+#include "third_party/metrics_proto/omnibox_focus_type.pb.h"
 #include "third_party/metrics_proto/omnibox_input_type.pb.h"
 
 namespace {
@@ -129,7 +129,7 @@
     return false;
 
   // Reject on focus request.
-  if (input.focus_type() != OmniboxFocusType::DEFAULT)
+  if (input.focus_type() != metrics::OmniboxFocusType::INTERACTION_DEFAULT)
     return false;
 
   // Do not proceed if default search provider is not Google.
diff --git a/components/omnibox/browser/on_device_head_provider_unittest.cc b/components/omnibox/browser/on_device_head_provider_unittest.cc
index bcde71b..6e84148 100644
--- a/components/omnibox/browser/on_device_head_provider_unittest.cc
+++ b/components/omnibox/browser/on_device_head_provider_unittest.cc
@@ -20,9 +20,9 @@
 #include "components/omnibox/browser/on_device_model_update_listener.h"
 #include "components/omnibox/browser/test_scheme_classifier.h"
 #include "components/omnibox/common/omnibox_features.h"
-#include "components/search_engines/omnibox_focus_type.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/metrics_proto/omnibox_focus_type.pb.h"
 
 using testing::_;
 using testing::NiceMock;
@@ -125,7 +125,7 @@
   AutocompleteInput input(u"M", metrics::OmniboxEventProto::OTHER,
                           TestSchemeClassifier());
   input.set_omit_asynchronous_matches(false);
-  input.set_focus_type(OmniboxFocusType::ON_FOCUS);
+  input.set_focus_type(metrics::OmniboxFocusType::INTERACTION_FOCUS);
 
   EXPECT_CALL(*client_.get(), IsOffTheRecord()).WillRepeatedly(Return(false));
   EXPECT_CALL(*client_.get(), SearchSuggestEnabled()).WillOnce(Return(true));
diff --git a/components/omnibox/browser/open_tab_provider.cc b/components/omnibox/browser/open_tab_provider.cc
index d8c450b..32391c0 100644
--- a/components/omnibox/browser/open_tab_provider.cc
+++ b/components/omnibox/browser/open_tab_provider.cc
@@ -79,7 +79,8 @@
 void OpenTabProvider::Start(const AutocompleteInput& input,
                             bool minimal_changes) {
   matches_.clear();
-  if (input.focus_type() != OmniboxFocusType::DEFAULT || input.text().empty()) {
+  if (input.focus_type() != metrics::OmniboxFocusType::INTERACTION_DEFAULT ||
+      input.text().empty()) {
     return;
   }
 
diff --git a/components/omnibox/browser/search_provider.cc b/components/omnibox/browser/search_provider.cc
index d4d255c..b9871cd5 100644
--- a/components/omnibox/browser/search_provider.cc
+++ b/components/omnibox/browser/search_provider.cc
@@ -38,7 +38,6 @@
 #include "components/omnibox/browser/url_prefix.h"
 #include "components/omnibox/common/omnibox_features.h"
 #include "components/search/search.h"
-#include "components/search_engines/omnibox_focus_type.h"
 #include "components/search_engines/template_url_service.h"
 #include "components/search_engines/template_url_starter_pack_data.h"
 #include "components/strings/grit/components_strings.h"
@@ -52,6 +51,7 @@
 #include "services/network/public/cpp/simple_url_loader.h"
 #include "services/network/public/mojom/url_response_head.mojom.h"
 #include "third_party/metrics_proto/omnibox_event.pb.h"
+#include "third_party/metrics_proto/omnibox_focus_type.pb.h"
 #include "third_party/metrics_proto/omnibox_input_type.pb.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "url/url_constants.h"
@@ -319,7 +319,7 @@
 
   providers_.set(default_provider_keyword, keyword_provider_keyword);
 
-  if (input.focus_type() != OmniboxFocusType::DEFAULT) {
+  if (input.focus_type() != metrics::OmniboxFocusType::INTERACTION_DEFAULT) {
     // Don't display any suggestions for on-focus requests.
     DCHECK(done_);
     ClearAllResults();
@@ -344,7 +344,7 @@
 
   // Don't search the query history database for on-focus inputs; these inputs
   // should only be used to warm up the suggest server.
-  if (input.focus_type() == OmniboxFocusType::DEFAULT) {
+  if (input.focus_type() == metrics::OmniboxFocusType::INTERACTION_DEFAULT) {
     DoHistoryQuery(minimal_changes);
     // Answers needs scored history results before any suggest query has been
     // started, since the query for answer-bearing results needs additional
@@ -463,7 +463,8 @@
   // that's left to ZeroSuggestProvider and friends.  Furthermore, it's not
   // clear if the suggest server will send back sensible results to the
   // request we're constructing here for on-focus inputs.
-  if (input_.focus_type() == OmniboxFocusType::DEFAULT && request_succeeded) {
+  if (input_.focus_type() == metrics::OmniboxFocusType::INTERACTION_DEFAULT &&
+      request_succeeded) {
     std::unique_ptr<base::Value> data(
         SearchSuggestionParser::DeserializeJsonData(
             SearchSuggestionParser::ExtractJsonData(source,
@@ -573,7 +574,7 @@
   // enforce constraints about inlinability in this case.  Indeed, most of
   // these steps would be bad, as they'd add a suggestion of some form, thus
   // opening the dropdown (which we do not want to happen).
-  if (input_.focus_type() == OmniboxFocusType::DEFAULT) {
+  if (input_.focus_type() == metrics::OmniboxFocusType::INTERACTION_DEFAULT) {
     PersistTopSuggestions(&default_results_);
     PersistTopSuggestions(&keyword_results_);
     ConvertResultsToAutocompleteMatches();
@@ -989,8 +990,9 @@
       template_url, search_terms_data, input.current_page_classification(),
       &empty_search_term_args);
   GURL suggest_url(template_url->suggestions_url_ref().ReplaceSearchTerms(
-      input.focus_type() != OmniboxFocusType::DEFAULT ? empty_search_term_args
-                                                      : search_term_args,
+      input.focus_type() != metrics::OmniboxFocusType::INTERACTION_DEFAULT
+          ? empty_search_term_args
+          : search_term_args,
       search_terms_data));
   if (!suggest_url.is_valid())
     return nullptr;
diff --git a/components/omnibox/browser/search_suggestion_parser.cc b/components/omnibox/browser/search_suggestion_parser.cc
index 242f495..b6f0e00 100644
--- a/components/omnibox/browser/search_suggestion_parser.cc
+++ b/components/omnibox/browser/search_suggestion_parser.cc
@@ -614,8 +614,8 @@
           if (base::StringToInt(it.first, &suggestion_group_id)) {
             parsed_suggestion_groups_map[suggestion_group_id]
                 .original_group_id = suggestion_group_id;
-            parsed_suggestion_groups_map[suggestion_group_id].header =
-                base::UTF8ToUTF16(it.second.GetString());
+            parsed_suggestion_groups_map[suggestion_group_id]
+                .group_config_info.set_header_text(it.second.GetString());
           }
         }
       }
@@ -624,7 +624,9 @@
       if (hidden_group_ids) {
         for (const auto& value : hidden_group_ids->GetListDeprecated()) {
           if (value.is_int()) {
-            parsed_suggestion_groups_map[value.GetInt()].hidden = true;
+            parsed_suggestion_groups_map[value.GetInt()]
+                .group_config_info.set_visibility(
+                    omnibox::GroupConfigInfo_Visibility_HIDDEN);
           }
         }
       }
diff --git a/components/omnibox/browser/search_suggestion_parser_unittest.cc b/components/omnibox/browser/search_suggestion_parser_unittest.cc
index 0f2b015..4da5798 100644
--- a/components/omnibox/browser/search_suggestion_parser_unittest.cc
+++ b/components/omnibox/browser/search_suggestion_parser_unittest.cc
@@ -376,10 +376,10 @@
     ASSERT_EQ(2U, results.suggestion_groups_map.size());
 
     ASSERT_EQ(
-        u"Recent Searches",
+        "Recent Searches",
         results
             .suggestion_groups_map[SuggestionGroupId::kPersonalizedZeroSuggest]
-            .header);
+            .group_config_info.header_text());
     ASSERT_EQ(
         40000,
         results
@@ -390,24 +390,26 @@
         results
             .suggestion_groups_map[SuggestionGroupId::kPersonalizedZeroSuggest]
             .priority);
-    ASSERT_TRUE(
+    ASSERT_EQ(
+        omnibox::GroupConfigInfo_Visibility_HIDDEN,
         results
             .suggestion_groups_map[SuggestionGroupId::kPersonalizedZeroSuggest]
-            .hidden);
+            .group_config_info.visibility());
 
-    ASSERT_EQ(u"Recommended for you",
+    ASSERT_EQ("Recommended for you",
               results
                   .suggestion_groups_map
                       [SuggestionGroupId::kNonPersonalizedZeroSuggest2]
-                  .header);
+                  .group_config_info.header_text());
     ASSERT_EQ(40008, results
                          .suggestion_groups_map
                              [SuggestionGroupId::kNonPersonalizedZeroSuggest2]
                          .original_group_id.value());
-    ASSERT_FALSE(results
-                     .suggestion_groups_map
-                         [SuggestionGroupId::kNonPersonalizedZeroSuggest2]
-                     .hidden);
+    ASSERT_EQ(omnibox::GroupConfigInfo_Visibility_DEFAULT_VISIBLE,
+              results
+                  .suggestion_groups_map
+                      [SuggestionGroupId::kNonPersonalizedZeroSuggest2]
+                  .group_config_info.visibility());
     ASSERT_EQ(SuggestionGroupPriority::kRemoteZeroSuggest2,
               results
                   .suggestion_groups_map
@@ -478,19 +480,20 @@
     // visibilities are correctly parsed and populated.
     ASSERT_EQ(2U, results.suggestion_groups_map.size());
 
-    ASSERT_EQ(u"Recommended for you",
+    ASSERT_EQ("Recommended for you",
               results
                   .suggestion_groups_map
                       [SuggestionGroupId::kNonPersonalizedZeroSuggest1]
-                  .header);
+                  .group_config_info.header_text());
     ASSERT_EQ(40008, results
                          .suggestion_groups_map
                              [SuggestionGroupId::kNonPersonalizedZeroSuggest1]
                          .original_group_id.value());
-    ASSERT_FALSE(results
-                     .suggestion_groups_map
-                         [SuggestionGroupId::kNonPersonalizedZeroSuggest1]
-                     .hidden);
+    ASSERT_EQ(omnibox::GroupConfigInfo_Visibility_DEFAULT_VISIBLE,
+              results
+                  .suggestion_groups_map
+                      [SuggestionGroupId::kNonPersonalizedZeroSuggest1]
+                  .group_config_info.visibility());
     ASSERT_EQ(SuggestionGroupPriority::kRemoteZeroSuggest1,
               results
                   .suggestion_groups_map
@@ -498,10 +501,10 @@
                   .priority);
 
     ASSERT_EQ(
-        u"Recent Searches",
+        "Recent Searches",
         results
             .suggestion_groups_map[SuggestionGroupId::kPersonalizedZeroSuggest]
-            .header);
+            .group_config_info.header_text());
     ASSERT_EQ(
         40000,
         results
@@ -512,10 +515,11 @@
         results
             .suggestion_groups_map[SuggestionGroupId::kPersonalizedZeroSuggest]
             .priority);
-    ASSERT_TRUE(
+    ASSERT_EQ(
+        omnibox::GroupConfigInfo_Visibility_HIDDEN,
         results
             .suggestion_groups_map[SuggestionGroupId::kPersonalizedZeroSuggest]
-            .hidden);
+            .group_config_info.visibility());
 
     ASSERT_EQ(u"los angeles", results.suggest_results[0].suggestion());
     ASSERT_EQ(SuggestionGroupId::kNonPersonalizedZeroSuggest1,
@@ -581,11 +585,11 @@
     // visibilities are correctly parsed and populated.
     ASSERT_EQ(3U, results.suggestion_groups_map.size());
 
-    ASSERT_EQ(u"Recommended for you",
+    ASSERT_EQ("Recommended for you",
               results
                   .suggestion_groups_map
                       [SuggestionGroupId::kNonPersonalizedZeroSuggest1]
-                  .header);
+                  .group_config_info.header_text());
     ASSERT_EQ(40008, results
                          .suggestion_groups_map
                              [SuggestionGroupId::kNonPersonalizedZeroSuggest1]
@@ -595,43 +599,46 @@
                   .suggestion_groups_map
                       [SuggestionGroupId::kNonPersonalizedZeroSuggest1]
                   .priority);
-    ASSERT_FALSE(results
-                     .suggestion_groups_map
-                         [SuggestionGroupId::kNonPersonalizedZeroSuggest1]
-                     .hidden);
+    ASSERT_EQ(omnibox::GroupConfigInfo_Visibility_DEFAULT_VISIBLE,
+              results
+                  .suggestion_groups_map
+                      [SuggestionGroupId::kNonPersonalizedZeroSuggest1]
+                  .group_config_info.visibility());
 
-    ASSERT_EQ(u"Related Searches",
+    ASSERT_EQ("Related Searches",
               results
                   .suggestion_groups_map
                       [SuggestionGroupId::kNonPersonalizedZeroSuggest2]
-                  .header);
+                  .group_config_info.header_text());
     ASSERT_EQ(40007, results
                          .suggestion_groups_map
                              [SuggestionGroupId::kNonPersonalizedZeroSuggest2]
                          .original_group_id.value());
-    ASSERT_TRUE(results
-                    .suggestion_groups_map
-                        [SuggestionGroupId::kNonPersonalizedZeroSuggest2]
-                    .hidden);
+    ASSERT_EQ(omnibox::GroupConfigInfo_Visibility_HIDDEN,
+              results
+                  .suggestion_groups_map
+                      [SuggestionGroupId::kNonPersonalizedZeroSuggest2]
+                  .group_config_info.visibility());
     ASSERT_EQ(SuggestionGroupPriority::kRemoteZeroSuggest2,
               results
                   .suggestion_groups_map
                       [SuggestionGroupId::kNonPersonalizedZeroSuggest2]
                   .priority);
 
-    ASSERT_EQ(u"NOT RECOMMENDED FOR YOU",
+    ASSERT_EQ("NOT RECOMMENDED FOR YOU",
               results
                   .suggestion_groups_map
                       [SuggestionGroupId::kNonPersonalizedZeroSuggest3]
-                  .header);
+                  .group_config_info.header_text());
     ASSERT_EQ(40009, results
                          .suggestion_groups_map
                              [SuggestionGroupId::kNonPersonalizedZeroSuggest3]
                          .original_group_id.value());
-    ASSERT_FALSE(results
-                     .suggestion_groups_map
-                         [SuggestionGroupId::kNonPersonalizedZeroSuggest3]
-                     .hidden);
+    ASSERT_EQ(omnibox::GroupConfigInfo_Visibility_DEFAULT_VISIBLE,
+              results
+                  .suggestion_groups_map
+                      [SuggestionGroupId::kNonPersonalizedZeroSuggest3]
+                  .group_config_info.visibility());
     ASSERT_EQ(SuggestionGroupPriority::kRemoteZeroSuggest3,
               results
                   .suggestion_groups_map
diff --git a/components/omnibox/browser/shortcuts_provider.cc b/components/omnibox/browser/shortcuts_provider.cc
index c6c3547c..4e4d1261 100644
--- a/components/omnibox/browser/shortcuts_provider.cc
+++ b/components/omnibox/browser/shortcuts_provider.cc
@@ -36,9 +36,9 @@
 #include "components/omnibox/browser/url_prefix.h"
 #include "components/omnibox/common/omnibox_features.h"
 #include "components/prefs/pref_service.h"
-#include "components/search_engines/omnibox_focus_type.h"
 #include "components/search_engines/template_url_service.h"
 #include "components/url_formatter/url_fixer.h"
+#include "third_party/metrics_proto/omnibox_focus_type.pb.h"
 #include "third_party/metrics_proto/omnibox_input_type.pb.h"
 
 #if !BUILDFLAG(IS_IOS)
@@ -211,7 +211,7 @@
   TRACE_EVENT0("omnibox", "ShortcutsProvider::Start");
   matches_.clear();
 
-  if (input.focus_type() == OmniboxFocusType::DEFAULT &&
+  if (input.focus_type() == metrics::OmniboxFocusType::INTERACTION_DEFAULT &&
       input.type() != metrics::OmniboxInputType::EMPTY &&
       !input.text().empty() && initialized_) {
     GetMatches(input);
diff --git a/components/omnibox/browser/shortcuts_provider_unittest.cc b/components/omnibox/browser/shortcuts_provider_unittest.cc
index e01d8941..a3d4b19 100644
--- a/components/omnibox/browser/shortcuts_provider_unittest.cc
+++ b/components/omnibox/browser/shortcuts_provider_unittest.cc
@@ -33,10 +33,10 @@
 #include "components/omnibox/browser/shortcuts_backend.h"
 #include "components/omnibox/browser/shortcuts_provider_test_util.h"
 #include "components/omnibox/common/omnibox_features.h"
-#include "components/search_engines/omnibox_focus_type.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 #include "third_party/metrics_proto/omnibox_event.pb.h"
+#include "third_party/metrics_proto/omnibox_focus_type.pb.h"
 
 using base::ASCIIToUTF16;
 using ExpectedURLs = std::vector<ExpectedURLAndAllowedToBeDefault>;
@@ -273,7 +273,7 @@
   RichAutocompletionParams::ClearParamsForTesting();
   scoped_feature_list_.InitWithFeatures({omnibox::kShortcutExpanding},
                                         {omnibox::kRichAutocompletion});
-};
+}
 
 void ShortcutsProviderTest::SetUp() {
   client_ = std::make_unique<FakeAutocompleteProviderClient>();
@@ -754,7 +754,7 @@
 TEST_F(ShortcutsProviderTest, DoesNotProvideOnFocus) {
   AutocompleteInput input(u"about:o", metrics::OmniboxEventProto::OTHER,
                           TestSchemeClassifier());
-  input.set_focus_type(OmniboxFocusType::ON_FOCUS);
+  input.set_focus_type(metrics::OmniboxFocusType::INTERACTION_FOCUS);
   provider_->Start(input, false);
   EXPECT_TRUE(provider_->matches().empty());
 }
diff --git a/components/omnibox/browser/suggestion_group.cc b/components/omnibox/browser/suggestion_group.cc
index 0f16404..d19427a 100644
--- a/components/omnibox/browser/suggestion_group.cc
+++ b/components/omnibox/browser/suggestion_group.cc
@@ -4,27 +4,19 @@
 
 #include "components/omnibox/browser/suggestion_group.h"
 
-void SuggestionGroup::MergeFrom(const SuggestionGroup& suggestion_group) {
-  // Only update the priority if not previously set.
-  if (priority == SuggestionGroupPriority::kDefault) {
-    priority = suggestion_group.priority;
+void SuggestionGroup::MergeFrom(const SuggestionGroup& other) {
+  if (priority == SuggestionGroupPriority::kDefault &&
+      other.priority != SuggestionGroupPriority::kDefault) {
+    priority = other.priority;
   }
-  // Only update the header if not previously set.
-  if (header.empty()) {
-    header = suggestion_group.header;
+  if (!original_group_id.has_value() && other.original_group_id.has_value()) {
+    original_group_id = *other.original_group_id;
   }
-  // Only update the server group ID if not previously set and given group has
-  // a value.
-  if (!original_group_id.has_value() &&
-      suggestion_group.original_group_id.has_value()) {
-    original_group_id = *suggestion_group.original_group_id;
-  }
-  hidden = suggestion_group.hidden;
+  group_config_info.MergeFrom(other.group_config_info);
 }
 
 void SuggestionGroup::Clear() {
   priority = SuggestionGroupPriority::kDefault;
-  header.clear();
   original_group_id.reset();
-  hidden = false;
+  group_config_info.Clear();
 }
diff --git a/components/omnibox/browser/suggestion_group.h b/components/omnibox/browser/suggestion_group.h
index 159d1fd..f24a9a1 100644
--- a/components/omnibox/browser/suggestion_group.h
+++ b/components/omnibox/browser/suggestion_group.h
@@ -9,6 +9,7 @@
 #include <unordered_map>
 
 #include "third_party/abseil-cpp/absl/types/optional.h"
+#include "third_party/omnibox_proto/group_config_info.pb.h"
 
 // Determines the order in which suggestion groups appear in the final displayed
 // list relative to one another. A higher numeric value places a given group
@@ -79,7 +80,8 @@
   SuggestionGroup(const SuggestionGroup&) = delete;
   SuggestionGroup& operator=(const SuggestionGroup&) = delete;
 
-  void MergeFrom(const SuggestionGroup& suggestion_group);
+  // Merges the fields from |from|, if specified in |from|.
+  void MergeFrom(const SuggestionGroup& other);
   void Clear();
 
   // Determines how this group is placed in the final list of suggestions with
@@ -88,10 +90,8 @@
   SuggestionGroupPriority priority{SuggestionGroupPriority::kDefault};
   // The original group ID provided by the server, if applicable.
   absl::optional<int> original_group_id;
-  // Group header provided by the server, if applicable.
-  std::u16string header{u""};
-  // Default visibility provided by the server, if applicable.
-  bool hidden{false};
+  // The Suggestion group configurations.
+  omnibox::GroupConfigInfo group_config_info;
 };
 
 // A map of SuggestionGroupId to SuggestionGroup.
diff --git a/components/omnibox/browser/zero_suggest_provider.cc b/components/omnibox/browser/zero_suggest_provider.cc
index 6b69b11..708b5c68 100644
--- a/components/omnibox/browser/zero_suggest_provider.cc
+++ b/components/omnibox/browser/zero_suggest_provider.cc
@@ -31,18 +31,18 @@
 #include "components/omnibox/common/omnibox_features.h"
 #include "components/prefs/pref_registry_simple.h"
 #include "components/prefs/pref_service.h"
-#include "components/search_engines/omnibox_focus_type.h"
 #include "components/search_engines/search_engine_type.h"
 #include "components/search_engines/template_url_service.h"
 #include "components/url_formatter/url_formatter.h"
 #include "services/network/public/cpp/simple_url_loader.h"
 #include "services/network/public/mojom/url_response_head.mojom.h"
 #include "third_party/metrics_proto/omnibox_event.pb.h"
+#include "third_party/metrics_proto/omnibox_focus_type.pb.h"
 #include "third_party/metrics_proto/omnibox_input_type.pb.h"
 #include "url/gurl.h"
 
 using OEP = metrics::OmniboxEventProto;
-using OFT = OmniboxFocusType;
+using OFT = metrics::OmniboxFocusType;
 using OIT = metrics::OmniboxInputType;
 
 namespace {
@@ -288,14 +288,16 @@
 
   // Android Search Widget.
   if (page_class == OEP::ANDROID_SHORTCUTS_WIDGET) {
-    if (focus_type_input_type == std::make_pair(OFT::ON_FOCUS, OIT::URL)) {
+    if (focus_type_input_type ==
+        std::make_pair(OFT::INTERACTION_FOCUS, OIT::URL)) {
       return ResultType::kRemoteNoURL;
     }
   }
 
   // New Tab Page.
   if (BaseSearchProvider::IsNTPPage(page_class)) {
-    if (focus_type_input_type == std::make_pair(OFT::ON_FOCUS, OIT::EMPTY)) {
+    if (focus_type_input_type ==
+        std::make_pair(OFT::INTERACTION_FOCUS, OIT::EMPTY)) {
       return ResultType::kRemoteNoURL;
     }
   }
@@ -309,13 +311,14 @@
 
   // Open Web - does NOT include Search Results Page.
   if (BaseSearchProvider::IsOtherWebPage(page_class)) {
-    if (focus_type_input_type == std::make_pair(OFT::ON_FOCUS, OIT::URL) &&
+    if (focus_type_input_type ==
+            std::make_pair(OFT::INTERACTION_FOCUS, OIT::URL) &&
         base::FeatureList::IsEnabled(
             omnibox::kFocusTriggersContextualWebZeroSuggest)) {
       return ResultType::kRemoteSendURL;
     }
     if (focus_type_input_type ==
-            std::make_pair(OFT::DELETED_PERMANENT_TEXT, OIT::EMPTY) &&
+            std::make_pair(OFT::INTERACTION_CLOBBER, OIT::EMPTY) &&
         base::FeatureList::IsEnabled(
             omnibox::kClobberTriggersContextualWebZeroSuggest)) {
       return ResultType::kRemoteSendURL;
@@ -324,12 +327,13 @@
 
   // Search Results Page.
   if (BaseSearchProvider::IsSearchResultsPage(page_class)) {
-    if (focus_type_input_type == std::make_pair(OFT::ON_FOCUS, OIT::URL) &&
+    if (focus_type_input_type ==
+            std::make_pair(OFT::INTERACTION_FOCUS, OIT::URL) &&
         base::FeatureList::IsEnabled(omnibox::kFocusTriggersSRPZeroSuggest)) {
       return ResultType::kRemoteSendURL;
     }
     if (focus_type_input_type ==
-            std::make_pair(OFT::DELETED_PERMANENT_TEXT, OIT::EMPTY) &&
+            std::make_pair(OFT::INTERACTION_CLOBBER, OIT::EMPTY) &&
         base::FeatureList::IsEnabled(omnibox::kClobberTriggersSRPZeroSuggest)) {
       return ResultType::kRemoteSendURL;
     }
diff --git a/components/omnibox/browser/zero_suggest_provider_unittest.cc b/components/omnibox/browser/zero_suggest_provider_unittest.cc
index 3ac54da..536a8b2 100644
--- a/components/omnibox/browser/zero_suggest_provider_unittest.cc
+++ b/components/omnibox/browser/zero_suggest_provider_unittest.cc
@@ -25,7 +25,6 @@
 #include "components/omnibox/common/omnibox_features.h"
 #include "components/prefs/pref_registry_simple.h"
 #include "components/prefs/testing_pref_service.h"
-#include "components/search_engines/omnibox_focus_type.h"
 #include "components/search_engines/template_url.h"
 #include "components/search_engines/template_url_service.h"
 #include "components/variations/entropy_provider.h"
@@ -35,6 +34,7 @@
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/metrics_proto/omnibox_event.pb.h"
+#include "third_party/metrics_proto/omnibox_focus_type.pb.h"
 
 namespace {
 
@@ -111,7 +111,7 @@
 
   GURL GetSuggestURL(
       metrics::OmniboxEventProto::PageClassification page_classification,
-      OmniboxFocusType focus_type,
+      metrics::OmniboxFocusType focus_type,
       const std::string& page_url) {
     TemplateURLRef::SearchTermsArgs search_terms_args;
     search_terms_args.page_classification = page_classification;
@@ -124,21 +124,21 @@
   AutocompleteInput OnFocusInputForNTP() {
     AutocompleteInput input(u"", metrics::OmniboxEventProto::NTP_REALBOX,
                             TestSchemeClassifier());
-    input.set_focus_type(OmniboxFocusType::ON_FOCUS);
+    input.set_focus_type(metrics::OmniboxFocusType::INTERACTION_FOCUS);
     return input;
   }
 
   AutocompleteInput PrefetchingInputForNTP() {
     AutocompleteInput input(u"", metrics::OmniboxEventProto::NTP_ZPS_PREFETCH,
                             TestSchemeClassifier());
-    input.set_focus_type(OmniboxFocusType::ON_FOCUS);
+    input.set_focus_type(metrics::OmniboxFocusType::INTERACTION_FOCUS);
     return input;
   }
 
   AutocompleteInput PrefixInputForNTP() {
     AutocompleteInput input(u"foobar", metrics::OmniboxEventProto::NTP_REALBOX,
                             TestSchemeClassifier());
-    input.set_focus_type(OmniboxFocusType::DEFAULT);
+    input.set_focus_type(metrics::OmniboxFocusType::INTERACTION_DEFAULT);
     return input;
   }
 
@@ -148,7 +148,7 @@
                             metrics::OmniboxEventProto::OTHER,
                             TestSchemeClassifier());
     input.set_current_url(GURL(input_url));
-    input.set_focus_type(OmniboxFocusType::ON_FOCUS);
+    input.set_focus_type(metrics::OmniboxFocusType::INTERACTION_FOCUS);
     return input;
   }
 
@@ -156,7 +156,7 @@
     AutocompleteInput input(u"", metrics::OmniboxEventProto::OTHER,
                             TestSchemeClassifier());
     input.set_current_url(GURL("https://example.com/"));
-    input.set_focus_type(OmniboxFocusType::DELETED_PERMANENT_TEXT);
+    input.set_focus_type(metrics::OmniboxFocusType::INTERACTION_CLOBBER);
     return input;
   }
 
@@ -164,7 +164,7 @@
     AutocompleteInput input(u"", metrics::OmniboxEventProto::OTHER_ZPS_PREFETCH,
                             TestSchemeClassifier());
     input.set_current_url(GURL("https://example.com/"));
-    input.set_focus_type(OmniboxFocusType::DELETED_PERMANENT_TEXT);
+    input.set_focus_type(metrics::OmniboxFocusType::INTERACTION_CLOBBER);
     return input;
   }
 
@@ -172,7 +172,7 @@
     AutocompleteInput input(u"foobar", metrics::OmniboxEventProto::OTHER,
                             TestSchemeClassifier());
     input.set_current_url(GURL("https://example.com/"));
-    input.set_focus_type(OmniboxFocusType::DEFAULT);
+    input.set_focus_type(metrics::OmniboxFocusType::INTERACTION_DEFAULT);
     return input;
   }
 
@@ -183,7 +183,7 @@
                                 SEARCH_RESULT_PAGE_NO_SEARCH_TERM_REPLACEMENT,
                             TestSchemeClassifier());
     input.set_current_url(GURL(input_url));
-    input.set_focus_type(OmniboxFocusType::ON_FOCUS);
+    input.set_focus_type(metrics::OmniboxFocusType::INTERACTION_FOCUS);
     return input;
   }
 
@@ -193,7 +193,7 @@
                                 SEARCH_RESULT_PAGE_NO_SEARCH_TERM_REPLACEMENT,
                             TestSchemeClassifier());
     input.set_current_url(GURL("https://google.com/search?q=omnibox"));
-    input.set_focus_type(OmniboxFocusType::DELETED_PERMANENT_TEXT);
+    input.set_focus_type(metrics::OmniboxFocusType::INTERACTION_CLOBBER);
     return input;
   }
 
@@ -201,7 +201,7 @@
     AutocompleteInput input(u"", metrics::OmniboxEventProto::SRP_ZPS_PREFETCH,
                             TestSchemeClassifier());
     input.set_current_url(GURL("https://google.com/search?q=omnibox"));
-    input.set_focus_type(OmniboxFocusType::DELETED_PERMANENT_TEXT);
+    input.set_focus_type(metrics::OmniboxFocusType::INTERACTION_CLOBBER);
     return input;
   }
 
@@ -211,7 +211,7 @@
                                 SEARCH_RESULT_PAGE_NO_SEARCH_TERM_REPLACEMENT,
                             TestSchemeClassifier());
     input.set_current_url(GURL("https://google.com/search?q=omnibox"));
-    input.set_focus_type(OmniboxFocusType::DEFAULT);
+    input.set_focus_type(metrics::OmniboxFocusType::INTERACTION_DEFAULT);
     return input;
   }
 
@@ -594,8 +594,9 @@
   PrefService* prefs = client_->GetPrefs();
   prefs->SetString(omnibox::kZeroSuggestCachedResults, json_response);
 
-  GURL suggest_url = GetSuggestURL(metrics::OmniboxEventProto::NTP_REALBOX,
-                                   OmniboxFocusType::ON_FOCUS, "");
+  GURL suggest_url =
+      GetSuggestURL(metrics::OmniboxEventProto::NTP_REALBOX,
+                    metrics::OmniboxFocusType::INTERACTION_FOCUS, "");
 
   // Make sure valid input starts the provider.
   AutocompleteInput input = OnFocusInputForNTP();
@@ -661,7 +662,8 @@
 
   GURL suggest_url = GetSuggestURL(
       metrics::OmniboxEventProto::SEARCH_RESULT_PAGE_NO_SEARCH_TERM_REPLACEMENT,
-      OmniboxFocusType::DELETED_PERMANENT_TEXT, input.current_url().spec());
+      metrics::OmniboxFocusType::INTERACTION_CLOBBER,
+      input.current_url().spec());
 
   // Make sure valid input starts the provider.
   provider_->Start(input, false);
@@ -725,9 +727,10 @@
   omnibox::SetUserPreferenceForZeroSuggestCachedResponse(
       prefs, input.current_url().spec(), json_response);
 
-  GURL suggest_url = GetSuggestURL(metrics::OmniboxEventProto::OTHER,
-                                   OmniboxFocusType::DELETED_PERMANENT_TEXT,
-                                   input.current_url().spec());
+  GURL suggest_url =
+      GetSuggestURL(metrics::OmniboxEventProto::OTHER,
+                    metrics::OmniboxFocusType::INTERACTION_CLOBBER,
+                    input.current_url().spec());
 
   // Make sure valid input starts the provider.
   provider_->Start(input, false);
@@ -785,8 +788,9 @@
 
   EXPECT_TRUE(provider_->matches().empty());
 
-  GURL suggest_url = GetSuggestURL(metrics::OmniboxEventProto::NTP_REALBOX,
-                                   OmniboxFocusType::ON_FOCUS, "");
+  GURL suggest_url =
+      GetSuggestURL(metrics::OmniboxEventProto::NTP_REALBOX,
+                    metrics::OmniboxFocusType::INTERACTION_FOCUS, "");
   EXPECT_TRUE(test_loader_factory()->IsPending(suggest_url.spec()));
 
   std::string json_response(
@@ -847,7 +851,8 @@
 
   GURL suggest_url = GetSuggestURL(
       metrics::OmniboxEventProto::SEARCH_RESULT_PAGE_NO_SEARCH_TERM_REPLACEMENT,
-      OmniboxFocusType::DELETED_PERMANENT_TEXT, input.current_url().spec());
+      metrics::OmniboxFocusType::INTERACTION_CLOBBER,
+      input.current_url().spec());
   EXPECT_TRUE(test_loader_factory()->IsPending(suggest_url.spec()));
 
   std::string json_response(
@@ -909,9 +914,10 @@
 
   EXPECT_TRUE(provider_->matches().empty());
 
-  GURL suggest_url = GetSuggestURL(metrics::OmniboxEventProto::OTHER,
-                                   OmniboxFocusType::DELETED_PERMANENT_TEXT,
-                                   input.current_url().spec());
+  GURL suggest_url =
+      GetSuggestURL(metrics::OmniboxEventProto::OTHER,
+                    metrics::OmniboxFocusType::INTERACTION_CLOBBER,
+                    input.current_url().spec());
   EXPECT_TRUE(test_loader_factory()->IsPending(suggest_url.spec()));
 
   std::string json_response(
@@ -963,8 +969,9 @@
   AutocompleteInput input = OnFocusInputForNTP();
   input.set_omit_asynchronous_matches(true);
 
-  GURL suggest_url = GetSuggestURL(metrics::OmniboxEventProto::NTP_REALBOX,
-                                   OmniboxFocusType::ON_FOCUS, "");
+  GURL suggest_url =
+      GetSuggestURL(metrics::OmniboxEventProto::NTP_REALBOX,
+                    metrics::OmniboxFocusType::INTERACTION_FOCUS, "");
 
   // Ensure the cache is empty.
   PrefService* prefs = client_->GetPrefs();
@@ -1001,7 +1008,8 @@
 
   GURL suggest_url = GetSuggestURL(
       metrics::OmniboxEventProto::SEARCH_RESULT_PAGE_NO_SEARCH_TERM_REPLACEMENT,
-      OmniboxFocusType::DELETED_PERMANENT_TEXT, input.current_url().spec());
+      metrics::OmniboxFocusType::INTERACTION_CLOBBER,
+      input.current_url().spec());
 
   // Ensure the cache is empty.
   PrefService* prefs = client_->GetPrefs();
@@ -1037,9 +1045,10 @@
   AutocompleteInput input = OnClobberInputForWeb();
   input.set_omit_asynchronous_matches(true);
 
-  GURL suggest_url = GetSuggestURL(metrics::OmniboxEventProto::OTHER,
-                                   OmniboxFocusType::DELETED_PERMANENT_TEXT,
-                                   input.current_url().spec());
+  GURL suggest_url =
+      GetSuggestURL(metrics::OmniboxEventProto::OTHER,
+                    metrics::OmniboxFocusType::INTERACTION_CLOBBER,
+                    input.current_url().spec());
 
   // Ensure the cache is empty.
   PrefService* prefs = client_->GetPrefs();
@@ -1087,8 +1096,9 @@
   EXPECT_EQ(u"search2", provider_->matches()[1].contents);
   EXPECT_EQ(u"search3", provider_->matches()[2].contents);
 
-  GURL suggest_url = GetSuggestURL(metrics::OmniboxEventProto::NTP_REALBOX,
-                                   OmniboxFocusType::ON_FOCUS, "");
+  GURL suggest_url =
+      GetSuggestURL(metrics::OmniboxEventProto::NTP_REALBOX,
+                    metrics::OmniboxFocusType::INTERACTION_FOCUS, "");
   EXPECT_TRUE(test_loader_factory()->IsPending(suggest_url.spec()));
   std::string json_response2(
       R"(["",["search4", "search5", "search6"],)"
@@ -1167,7 +1177,8 @@
 
   GURL suggest_url = GetSuggestURL(
       metrics::OmniboxEventProto::SEARCH_RESULT_PAGE_NO_SEARCH_TERM_REPLACEMENT,
-      OmniboxFocusType::DELETED_PERMANENT_TEXT, input.current_url().spec());
+      metrics::OmniboxFocusType::INTERACTION_CLOBBER,
+      input.current_url().spec());
   EXPECT_TRUE(test_loader_factory()->IsPending(suggest_url.spec()));
   std::string json_response2(
       R"(["",["search4", "search5", "search6"],)"
@@ -1247,9 +1258,10 @@
   EXPECT_EQ(u"search2", provider_->matches()[1].contents);
   EXPECT_EQ(u"search3", provider_->matches()[2].contents);
 
-  GURL suggest_url = GetSuggestURL(metrics::OmniboxEventProto::OTHER,
-                                   OmniboxFocusType::DELETED_PERMANENT_TEXT,
-                                   input.current_url().spec());
+  GURL suggest_url =
+      GetSuggestURL(metrics::OmniboxEventProto::OTHER,
+                    metrics::OmniboxFocusType::INTERACTION_CLOBBER,
+                    input.current_url().spec());
   EXPECT_TRUE(test_loader_factory()->IsPending(suggest_url.spec()));
   std::string json_response2(
       R"(["",["search4", "search5", "search6"],)"
@@ -1324,8 +1336,9 @@
   EXPECT_EQ(u"search2", provider_->matches()[1].contents);
   EXPECT_EQ(u"search3", provider_->matches()[2].contents);
 
-  GURL suggest_url = GetSuggestURL(metrics::OmniboxEventProto::NTP_REALBOX,
-                                   OmniboxFocusType::ON_FOCUS, "");
+  GURL suggest_url =
+      GetSuggestURL(metrics::OmniboxEventProto::NTP_REALBOX,
+                    metrics::OmniboxFocusType::INTERACTION_FOCUS, "");
   EXPECT_TRUE(test_loader_factory()->IsPending(suggest_url.spec()));
   std::string empty_response(R"(["",[],[],[],{}])");
   test_loader_factory()->AddResponse(suggest_url.spec(), empty_response);
@@ -1401,7 +1414,8 @@
 
   GURL suggest_url = GetSuggestURL(
       metrics::OmniboxEventProto::SEARCH_RESULT_PAGE_NO_SEARCH_TERM_REPLACEMENT,
-      OmniboxFocusType::DELETED_PERMANENT_TEXT, input.current_url().spec());
+      metrics::OmniboxFocusType::INTERACTION_CLOBBER,
+      input.current_url().spec());
   EXPECT_TRUE(test_loader_factory()->IsPending(suggest_url.spec()));
   std::string empty_response(R"(["",[],[],[],{}])");
   test_loader_factory()->AddResponse(suggest_url.spec(), empty_response);
@@ -1478,9 +1492,10 @@
   EXPECT_EQ(u"search2", provider_->matches()[1].contents);
   EXPECT_EQ(u"search3", provider_->matches()[2].contents);
 
-  GURL suggest_url = GetSuggestURL(metrics::OmniboxEventProto::OTHER,
-                                   OmniboxFocusType::DELETED_PERMANENT_TEXT,
-                                   input.current_url().spec());
+  GURL suggest_url =
+      GetSuggestURL(metrics::OmniboxEventProto::OTHER,
+                    metrics::OmniboxFocusType::INTERACTION_CLOBBER,
+                    input.current_url().spec());
   EXPECT_TRUE(test_loader_factory()->IsPending(suggest_url.spec()));
   std::string empty_response(R"(["",[],[],[],{}])");
   test_loader_factory()->AddResponse(suggest_url.spec(), empty_response);
@@ -1550,7 +1565,7 @@
 
     GURL suggest_url =
         GetSuggestURL(metrics::OmniboxEventProto::NTP_ZPS_PREFETCH,
-                      OmniboxFocusType::ON_FOCUS, "");
+                      metrics::OmniboxFocusType::INTERACTION_FOCUS, "");
     EXPECT_TRUE(test_loader_factory()->IsPending(suggest_url.spec()));
     std::string json_response2(
         R"(["",["search4", "search5", "search6"],)"
@@ -1606,8 +1621,9 @@
     EXPECT_EQ(u"search5", provider_->matches()[1].contents);
     EXPECT_EQ(u"search6", provider_->matches()[2].contents);
 
-    GURL suggest_url = GetSuggestURL(metrics::OmniboxEventProto::NTP_REALBOX,
-                                     OmniboxFocusType::ON_FOCUS, "");
+    GURL suggest_url =
+        GetSuggestURL(metrics::OmniboxEventProto::NTP_REALBOX,
+                      metrics::OmniboxFocusType::INTERACTION_FOCUS, "");
     EXPECT_TRUE(test_loader_factory()->IsPending(suggest_url.spec()));
     std::string json_response3(
         R"(["",["search7", "search8", "search9"],)"
@@ -1684,9 +1700,10 @@
     // Expect the results to be empty.
     ASSERT_EQ(0U, provider_->matches().size());
 
-    GURL suggest_url = GetSuggestURL(
-        metrics::OmniboxEventProto::SRP_ZPS_PREFETCH,
-        OmniboxFocusType::DELETED_PERMANENT_TEXT, input.current_url().spec());
+    GURL suggest_url =
+        GetSuggestURL(metrics::OmniboxEventProto::SRP_ZPS_PREFETCH,
+                      metrics::OmniboxFocusType::INTERACTION_CLOBBER,
+                      input.current_url().spec());
     EXPECT_TRUE(test_loader_factory()->IsPending(suggest_url.spec()));
     std::string json_response2(
         R"(["",["search4", "search5", "search6"],)"
@@ -1743,10 +1760,11 @@
     EXPECT_EQ(u"search5", provider_->matches()[1].contents);
     EXPECT_EQ(u"search6", provider_->matches()[2].contents);
 
-    GURL suggest_url = GetSuggestURL(
-        metrics::OmniboxEventProto::
-            SEARCH_RESULT_PAGE_NO_SEARCH_TERM_REPLACEMENT,
-        OmniboxFocusType::DELETED_PERMANENT_TEXT, input.current_url().spec());
+    GURL suggest_url =
+        GetSuggestURL(metrics::OmniboxEventProto::
+                          SEARCH_RESULT_PAGE_NO_SEARCH_TERM_REPLACEMENT,
+                      metrics::OmniboxFocusType::INTERACTION_CLOBBER,
+                      input.current_url().spec());
     EXPECT_TRUE(test_loader_factory()->IsPending(suggest_url.spec()));
     std::string json_response3(
         R"(["",["search7", "search8", "search9"],)"
@@ -1826,9 +1844,10 @@
     // Expect the results to be empty.
     ASSERT_EQ(0U, provider_->matches().size());
 
-    GURL suggest_url = GetSuggestURL(
-        metrics::OmniboxEventProto::OTHER_ZPS_PREFETCH,
-        OmniboxFocusType::DELETED_PERMANENT_TEXT, input.current_url().spec());
+    GURL suggest_url =
+        GetSuggestURL(metrics::OmniboxEventProto::OTHER_ZPS_PREFETCH,
+                      metrics::OmniboxFocusType::INTERACTION_CLOBBER,
+                      input.current_url().spec());
     EXPECT_TRUE(test_loader_factory()->IsPending(suggest_url.spec()));
     std::string json_response2(
         R"(["",["search4", "search5", "search6"],)"
@@ -1885,9 +1904,10 @@
     EXPECT_EQ(u"search5", provider_->matches()[1].contents);
     EXPECT_EQ(u"search6", provider_->matches()[2].contents);
 
-    GURL suggest_url = GetSuggestURL(metrics::OmniboxEventProto::OTHER,
-                                     OmniboxFocusType::DELETED_PERMANENT_TEXT,
-                                     input.current_url().spec());
+    GURL suggest_url =
+        GetSuggestURL(metrics::OmniboxEventProto::OTHER,
+                      metrics::OmniboxFocusType::INTERACTION_CLOBBER,
+                      input.current_url().spec());
     EXPECT_TRUE(test_loader_factory()->IsPending(suggest_url.spec()));
     std::string json_response3(
         R"(["",["search7", "search8", "search9"],)"
diff --git a/components/omnibox/browser/zero_suggest_verbatim_match_provider.cc b/components/omnibox/browser/zero_suggest_verbatim_match_provider.cc
index ee9c1bc1..1362036 100644
--- a/components/omnibox/browser/zero_suggest_verbatim_match_provider.cc
+++ b/components/omnibox/browser/zero_suggest_verbatim_match_provider.cc
@@ -48,8 +48,8 @@
 
   // Only offer verbatim match after the user just focused the Omnibox,
   // or if the input field is empty.
-  if (input.focus_type() == OmniboxFocusType::DEFAULT ||
-      input.focus_type() == OmniboxFocusType::DELETED_PERMANENT_TEXT)
+  if (input.focus_type() == metrics::OmniboxFocusType::INTERACTION_DEFAULT ||
+      input.focus_type() == metrics::OmniboxFocusType::INTERACTION_CLOBBER)
     return;
 
   // For consistency with other zero-prefix providers.
diff --git a/components/omnibox/browser/zero_suggest_verbatim_match_provider_unittest.cc b/components/omnibox/browser/zero_suggest_verbatim_match_provider_unittest.cc
index f144dc01..ec77425 100644
--- a/components/omnibox/browser/zero_suggest_verbatim_match_provider_unittest.cc
+++ b/components/omnibox/browser/zero_suggest_verbatim_match_provider_unittest.cc
@@ -63,7 +63,7 @@
   AutocompleteInput input(base::ASCIIToUTF16(query), GetParam(),
                           TestSchemeClassifier());
   input.set_current_url(GURL(url));
-  input.set_focus_type(OmniboxFocusType::DEFAULT);
+  input.set_focus_type(metrics::OmniboxFocusType::INTERACTION_DEFAULT);
   provider_->Start(input, false);
 
   // Clobber state should never generate a verbatim match.
@@ -77,7 +77,7 @@
   AutocompleteInput input(base::ASCIIToUTF16(query), GetParam(),
                           TestSchemeClassifier());
   input.set_current_url(GURL(url));
-  input.set_focus_type(OmniboxFocusType::DEFAULT);
+  input.set_focus_type(metrics::OmniboxFocusType::INTERACTION_DEFAULT);
   ON_CALL(mock_client_, IsOffTheRecord()).WillByDefault([] { return true; });
   provider_->Start(input, false);
 
@@ -90,7 +90,7 @@
   AutocompleteInput input(base::ASCIIToUTF16(url), GetParam(),
                           TestSchemeClassifier());
   input.set_current_url(GURL(url));
-  input.set_focus_type(OmniboxFocusType::ON_FOCUS);
+  input.set_focus_type(metrics::OmniboxFocusType::INTERACTION_FOCUS);
   provider_->Start(input, false);
   ASSERT_EQ(IsVerbatimMatchEligible(), provider_->matches().size() > 0);
   // Note: we intentionally do not validate the match content here.
@@ -105,7 +105,7 @@
   AutocompleteInput input(base::ASCIIToUTF16(url), GetParam(),
                           TestSchemeClassifier());
   input.set_current_url(GURL(url));
-  input.set_focus_type(OmniboxFocusType::ON_FOCUS);
+  input.set_focus_type(metrics::OmniboxFocusType::INTERACTION_FOCUS);
   ON_CALL(mock_client_, IsOffTheRecord()).WillByDefault([] { return true; });
   provider_->Start(input, false);
   ASSERT_EQ(IsVerbatimMatchEligible(), provider_->matches().size() > 0);
@@ -120,7 +120,7 @@
   AutocompleteInput input(std::u16string(),  // Note: empty input.
                           GetParam(), TestSchemeClassifier());
   input.set_current_url(GURL(url));
-  input.set_focus_type(OmniboxFocusType::DEFAULT);
+  input.set_focus_type(metrics::OmniboxFocusType::INTERACTION_DEFAULT);
   provider_->Start(input, false);
   ASSERT_TRUE(provider_->matches().empty());
   // Note: we intentionally do not validate the match content here.
@@ -135,7 +135,7 @@
   AutocompleteInput input(std::u16string(),  // Note: empty input.
                           GetParam(), TestSchemeClassifier());
   input.set_current_url(GURL(url));
-  input.set_focus_type(OmniboxFocusType::DEFAULT);
+  input.set_focus_type(metrics::OmniboxFocusType::INTERACTION_DEFAULT);
   ON_CALL(mock_client_, IsOffTheRecord()).WillByDefault([] { return true; });
   provider_->Start(input, false);
   ASSERT_TRUE(provider_->matches().empty());
@@ -150,7 +150,7 @@
   AutocompleteInput input(std::u16string(),  // Note: empty input.
                           GetParam(), TestSchemeClassifier());
   input.set_current_url(GURL(url));
-  input.set_focus_type(OmniboxFocusType::DELETED_PERMANENT_TEXT);
+  input.set_focus_type(metrics::OmniboxFocusType::INTERACTION_CLOBBER);
   provider_->Start(input, false);
   ASSERT_TRUE(provider_->matches().empty());
   // Note: we intentionally do not validate the match content here.
@@ -165,7 +165,7 @@
   AutocompleteInput input(std::u16string(),  // Note: empty input.
                           GetParam(), TestSchemeClassifier());
   input.set_current_url(GURL(url));
-  input.set_focus_type(OmniboxFocusType::DELETED_PERMANENT_TEXT);
+  input.set_focus_type(metrics::OmniboxFocusType::INTERACTION_CLOBBER);
   ON_CALL(mock_client_, IsOffTheRecord()).WillByDefault([] { return true; });
   provider_->Start(input, false);
   ASSERT_TRUE(provider_->matches().empty());
diff --git a/components/optimization_guide/core/optimization_guide_features.cc b/components/optimization_guide/core/optimization_guide_features.cc
index e8b2d70..ba46261a 100644
--- a/components/optimization_guide/core/optimization_guide_features.cc
+++ b/components/optimization_guide/core/optimization_guide_features.cc
@@ -28,8 +28,8 @@
 
 namespace {
 
-constexpr auto enabled_by_default_non_ios =
-#if BUILDFLAG(IS_IOS)
+constexpr auto enabled_by_default_desktop_only =
+#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_IOS)
     base::FEATURE_DISABLED_BY_DEFAULT;
 #else
     base::FEATURE_ENABLED_BY_DEFAULT;
@@ -110,7 +110,7 @@
 
 // Enables page content to be annotated.
 const base::Feature kPageContentAnnotations{"PageContentAnnotations",
-                                            enabled_by_default_non_ios};
+                                            enabled_by_default_desktop_only};
 
 // Enables fetching page metadata from the remote Optimization Guide service.
 const base::Feature kRemotePageMetadata{"RemotePageMetadata",
@@ -118,7 +118,7 @@
 
 // Enables the page entities model to be annotated on every page load.
 const base::Feature kPageEntitiesPageContentAnnotations{
-    "PageEntitiesPageContentAnnotations", enabled_by_default_non_ios};
+    "PageEntitiesPageContentAnnotations", enabled_by_default_desktop_only};
 // Enables the page visibility model to be annotated on every page load.
 const base::Feature kPageVisibilityPageContentAnnotations{
     "PageVisibilityPageContentAnnotations", base::FEATURE_DISABLED_BY_DEFAULT};
@@ -126,7 +126,7 @@
 // This feature flag does not allow for the entities model to load the name and
 // prefix filters.
 const base::Feature kPageEntitiesModelBypassFilters{
-    "PageEntitiesModelBypassFilters", base::FEATURE_ENABLED_BY_DEFAULT};
+    "PageEntitiesModelBypassFilters", enabled_by_default_desktop_only};
 
 // This feature flag enables resetting the entities model on shutdown.
 const base::Feature kPageEntitiesModelResetOnShutdown{
diff --git a/components/page_info/core/about_this_site_service.cc b/components/page_info/core/about_this_site_service.cc
index 1256af2e..41b259d 100644
--- a/components/page_info/core/about_this_site_service.cc
+++ b/components/page_info/core/about_this_site_service.cc
@@ -29,9 +29,6 @@
 
 }  // namespace
 
-const char kBannerInteractionHistogram[] =
-    "Privacy.AboutThisSite.BannerInteraction";
-
 // These values are persisted to logs. Entries should not be renumbered and
 // numeric values should never be reused.
 // Keep in sync with AboutThisSiteBannerInteraction in enums.xml.
@@ -119,23 +116,6 @@
   return absl::nullopt;
 }
 
-bool AboutThisSiteService::CanShowBanner(GURL url) {
-  return !dismissed_banners_.contains(url::Origin::Create(url));
-}
-
-void AboutThisSiteService::OnBannerDismissed(GURL url,
-                                             ukm::SourceId source_id) {
-  base::UmaHistogramEnumeration(kBannerInteractionHistogram,
-                                BannerInteraction::kDismissed);
-  dismissed_banners_.insert(url::Origin::Create(url));
-}
-
-void AboutThisSiteService::OnBannerURLOpened(GURL url,
-                                             ukm::SourceId source_id) {
-  base::UmaHistogramEnumeration(kBannerInteractionHistogram,
-                                BannerInteraction::kUrlOpened);
-}
-
 // static
 void AboutThisSiteService::OnAboutThisSiteRowClicked(bool with_description) {
   RecordAboutThisSiteInteraction(
@@ -143,6 +123,12 @@
                        : AboutThisSiteInteraction::kClickedWithoutDescription);
 }
 
+// static
+void AboutThisSiteService::OnOpenedDirectlyFromSidePanel() {
+  RecordAboutThisSiteInteraction(
+      AboutThisSiteInteraction::kOpenedDirectlyFromSidePanel);
+}
+
 base::WeakPtr<AboutThisSiteService> AboutThisSiteService::GetWeakPtr() {
   return weak_ptr_factory_.GetWeakPtr();
 }
diff --git a/components/page_info/core/about_this_site_service.h b/components/page_info/core/about_this_site_service.h
index 01175d8..5671e11 100644
--- a/components/page_info/core/about_this_site_service.h
+++ b/components/page_info/core/about_this_site_service.h
@@ -51,8 +51,9 @@
     kShownWithoutDescription = 2,
     kClickedWithDescription = 3,
     kClickedWithoutDescription = 4,
+    kOpenedDirectlyFromSidePanel = 5,
 
-    kMaxValue = kClickedWithoutDescription
+    kMaxValue = kOpenedDirectlyFromSidePanel
   };
 
   explicit AboutThisSiteService(std::unique_ptr<Client> client);
@@ -66,11 +67,8 @@
       const GURL& url,
       ukm::SourceId source_id) const;
 
-  bool CanShowBanner(GURL url);
-  void OnBannerDismissed(GURL url, ukm::SourceId source_id);
-  void OnBannerURLOpened(GURL url, ukm::SourceId source_id);
-
   static void OnAboutThisSiteRowClicked(bool with_description);
+  static void OnOpenedDirectlyFromSidePanel();
 
   base::WeakPtr<AboutThisSiteService> GetWeakPtr();
 
diff --git a/components/page_info/core/about_this_site_service_unittest.cc b/components/page_info/core/about_this_site_service_unittest.cc
index e8ec1f7..f5f47bd 100644
--- a/components/page_info/core/about_this_site_service_unittest.cc
+++ b/components/page_info/core/about_this_site_service_unittest.cc
@@ -172,24 +172,4 @@
                        AboutThisSiteInteraction::kNotShown, 1);
 }
 
-// Tests that banner dismisses are handled.
-TEST_F(AboutThisSiteServiceTest, Banner) {
-  const GURL kExampleFoo("https://example.com/foo");
-  const GURL kExampleBar("https://example.com/foo");
-
-  EXPECT_TRUE(service()->CanShowBanner(kExampleFoo));
-  EXPECT_TRUE(service()->CanShowBanner(kExampleBar));
-
-  // Showing or opening a banner URL does not change whether we can show more
-  // banners.
-  service()->OnBannerURLOpened(kExampleFoo, ukm::SourceId());
-  EXPECT_TRUE(service()->CanShowBanner(kExampleFoo));
-  EXPECT_TRUE(service()->CanShowBanner(kExampleBar));
-
-  // Explicitly dismissing a banner prevents more from being shown.
-  service()->OnBannerDismissed(kExampleFoo, ukm::SourceId());
-  EXPECT_FALSE(service()->CanShowBanner(kExampleFoo));
-  EXPECT_FALSE(service()->CanShowBanner(kExampleBar));
-}
-
 }  // namespace page_info
diff --git a/components/page_info/core/about_this_site_validation.cc b/components/page_info/core/about_this_site_validation.cc
index aab19f55..2837f993 100644
--- a/components/page_info/core/about_this_site_validation.cc
+++ b/components/page_info/core/about_this_site_validation.cc
@@ -100,14 +100,6 @@
   return status;
 }
 
-AboutThisSiteStatus ValidateBannerInfo(const proto::BannerInfo& banner_info) {
-  if (!banner_info.has_label())
-    return AboutThisSiteStatus::kMissingDescription;
-  if (!banner_info.has_url())
-    return AboutThisSiteStatus::kIncompleteSource;
-  return ValidateSource(banner_info.url());
-}
-
 AboutThisSiteStatus ValidateMetadata(
     const absl::optional<proto::AboutThisSiteMetadata>& metadata) {
   if (!metadata)
diff --git a/components/page_info/core/about_this_site_validation.h b/components/page_info/core/about_this_site_validation.h
index 339b113..caad24b 100644
--- a/components/page_info/core/about_this_site_validation.h
+++ b/components/page_info/core/about_this_site_validation.h
@@ -30,7 +30,7 @@
   kMissingDescriptionName = 12,
   kMissingDescriptionLang = 13,
   kMissingDescriptionSource = 14,
-  kMissingBannerInfo = 15,
+  // Deprecated: kMissingBannerInfo = 15,
   kInvalidMoreAbout = 16,
   kMissingMoreAbout = 17,
 
@@ -44,9 +44,8 @@
 AboutThisSiteStatus ValidateDescription(
     const proto::SiteDescription& description);
 AboutThisSiteStatus ValidateFirstSeen(const proto::SiteFirstSeen& first_seen);
-AboutThisSiteStatus ValidateMoreAbout(const proto::MoreAbout& banner_info);
+AboutThisSiteStatus ValidateMoreAbout(const proto::MoreAbout& more_about);
 AboutThisSiteStatus ValidateSiteInfo(const proto::SiteInfo& site_info);
-AboutThisSiteStatus ValidateBannerInfo(const proto::BannerInfo& banner_info);
 
 }  // namespace about_this_site_validation
 }  // namespace page_info
diff --git a/components/page_info/core/about_this_site_validation_unittest.cc b/components/page_info/core/about_this_site_validation_unittest.cc
index 2788ace0..b8d4253c 100644
--- a/components/page_info/core/about_this_site_validation_unittest.cc
+++ b/components/page_info/core/about_this_site_validation_unittest.cc
@@ -41,14 +41,6 @@
   return more_about;
 }
 
-proto::BannerInfo GetBannerInfo() {
-  proto::BannerInfo banner_info;
-  banner_info.set_title("Title");
-  banner_info.set_label("Example description");
-  *banner_info.mutable_url() = GetSampleSource();
-  return banner_info;
-}
-
 proto::AboutThisSiteMetadata GetSampleMetaData() {
   proto::AboutThisSiteMetadata metadata;
   auto* site_info = metadata.mutable_site_info();
@@ -68,16 +60,6 @@
   EXPECT_EQ(ValidateMetadata(metadata), AboutThisSiteStatus::kValid);
 }
 
-// Tests that correct proto messages are accepted.
-TEST(AboutThisSiteValidation, ValidateBanner) {
-  auto banner = GetBannerInfo();
-  EXPECT_EQ(ValidateBannerInfo(banner), AboutThisSiteStatus::kValid);
-
-  // The proto should still be valid without a title.
-  banner.clear_title();
-  EXPECT_EQ(ValidateBannerInfo(banner), AboutThisSiteStatus::kValid);
-}
-
 TEST(AboutThisSiteValidation, InvalidSiteInfoProto) {
   proto::AboutThisSiteMetadata metadata;
   EXPECT_EQ(ValidateMetadata(metadata), AboutThisSiteStatus::kMissingSiteInfo);
diff --git a/components/page_info/core/features.cc b/components/page_info/core/features.cc
index c6b1042f..824a2589 100644
--- a/components/page_info/core/features.cc
+++ b/components/page_info/core/features.cc
@@ -44,8 +44,8 @@
     "PageInfoAboutThisSiteDescriptionPlaceholder",
     base::FEATURE_DISABLED_BY_DEFAULT};
 
-const base::Feature kAboutThisSiteBanner{"AboutThisSiteBanner",
-                                         base::FEATURE_DISABLED_BY_DEFAULT};
+const base::Feature kAboutThisSitePersistentSidePanelEntry{
+    "AboutThisSitePersistentSidePanelEntry", base::FEATURE_DISABLED_BY_DEFAULT};
 
 #if !BUILDFLAG(IS_ANDROID)
 const base::Feature kPageInfoHistoryDesktop{"PageInfoHistoryDesktop",
diff --git a/components/page_info/core/features.h b/components/page_info/core/features.h
index 439a7af..9ba223ea 100644
--- a/components/page_info/core/features.h
+++ b/components/page_info/core/features.h
@@ -41,8 +41,8 @@
 // with kPageInfoAboutThisSiteMoreInfo.
 extern const base::Feature kPageInfoAboutThisSiteDescriptionPlaceholder;
 
-// Enables the "About this site" banner.
-extern const base::Feature kAboutThisSiteBanner;
+// Enables the persistent "About this site" entry in the side panel.
+extern const base::Feature kAboutThisSitePersistentSidePanelEntry;
 
 #if !BUILDFLAG(IS_ANDROID)
 // Enables the history section for Page Info on desktop.
diff --git a/components/page_info/core/proto/about_this_site_metadata.proto b/components/page_info/core/proto/about_this_site_metadata.proto
index 973fdf4f..e26389a 100644
--- a/components/page_info/core/proto/about_this_site_metadata.proto
+++ b/components/page_info/core/proto/about_this_site_metadata.proto
@@ -84,23 +84,10 @@
   optional MoreAbout more_about = 3;
 }
 
-// Info for a site-specific banner.
-message BannerInfo {
-  // Optional title of a banner.
-  optional string title = 1;
-  // Label of a banner.
-  optional string label = 2;
-  // Source URL of the banner.
-  optional Hyperlink url = 3;
-}
-
 // Optimization metadata associated with SiteInfo.
 //
 // This is only populated for the ABOUT_THIS_SITE optimization type.
 message AboutThisSiteMetadata {
   // A SiteInfo hint that will be shown in PageInfo.
   optional SiteInfo site_info = 1;
-
-  // Info for a site-specific banner.
-  optional BannerInfo banner_info = 2;
 }
diff --git a/components/password_manager/core/browser/android_affiliation/affiliation_utils.cc b/components/password_manager/core/browser/android_affiliation/affiliation_utils.cc
index 3eb6e20..6af130a 100644
--- a/components/password_manager/core/browser/android_affiliation/affiliation_utils.cc
+++ b/components/password_manager/core/browser/android_affiliation/affiliation_utils.cc
@@ -265,6 +265,20 @@
                         &parsed_);
 }
 
+// GroupedFacets
+
+GroupedFacets::GroupedFacets() = default;
+
+GroupedFacets::~GroupedFacets() = default;
+
+GroupedFacets::GroupedFacets(const GroupedFacets& other) = default;
+
+GroupedFacets::GroupedFacets(GroupedFacets&& other) = default;
+
+GroupedFacets& GroupedFacets::operator=(const GroupedFacets& other) = default;
+
+GroupedFacets& GroupedFacets::operator=(GroupedFacets&& other) = default;
+
 // AffiliatedFacetsWithUpdateTime ---------------------------------------------
 
 AffiliatedFacetsWithUpdateTime::AffiliatedFacetsWithUpdateTime() = default;
diff --git a/components/password_manager/core/browser/android_affiliation/affiliation_utils.h b/components/password_manager/core/browser/android_affiliation/affiliation_utils.h
index 0d0b7648..e3c1b31 100644
--- a/components/password_manager/core/browser/android_affiliation/affiliation_utils.h
+++ b/components/password_manager/core/browser/android_affiliation/affiliation_utils.h
@@ -177,8 +177,21 @@
 // A collection of facets affiliated with each other, i.e. an equivalence class.
 using AffiliatedFacets = std::vector<Facet>;
 
-// A collection of grouped facets.
-using GroupedFacets = std::vector<Facet>;
+// A collection of grouped facets. Used to group passwords in the UI.
+struct GroupedFacets {
+  GroupedFacets();
+  ~GroupedFacets();
+  GroupedFacets(const GroupedFacets& other);
+  GroupedFacets(GroupedFacets&& other);
+  GroupedFacets& operator=(const GroupedFacets& other);
+  GroupedFacets& operator=(GroupedFacets&& other);
+
+  // Facets which are representing a group.
+  std::vector<Facet> facets;
+
+  // Group branding info.
+  FacetBrandingInfo branding_info;
+};
 
 // A collection of facets affiliated with each other, i.e. an equivalence class,
 // plus a timestamp that indicates the last time the data was updated from an
diff --git a/components/password_manager/core/browser/android_affiliation/lookup_affiliation_response_parser.cc b/components/password_manager/core/browser/android_affiliation/lookup_affiliation_response_parser.cc
index 840c44a9..dbf2b05 100644
--- a/components/password_manager/core/browser/android_affiliation/lookup_affiliation_response_parser.cc
+++ b/components/password_manager/core/browser/android_affiliation/lookup_affiliation_response_parser.cc
@@ -14,36 +14,69 @@
 // > affiliation_pb::Affiliation
 // > affiliation_pb::FacetGroup
 template <typename MessageT>
-bool ParseFacets(const std::vector<FacetURI>& requested_facet_uris,
-                 const MessageT& response,
-                 std::vector<std::vector<Facet>>& result) {
-  std::map<FacetURI, size_t> facet_uri_to_class_index;
-  base::flat_set<FacetURI> requested_facets(requested_facet_uris);
-
-  for (const auto& equivalence_class : response) {
-    std::vector<Facet> facets;
-    facets.reserve(equivalence_class.facet().size());
-    for (const auto& facet : equivalence_class.facet()) {
-      const std::string& uri_spec(facet.id());
-      FacetURI uri = FacetURI::FromPotentiallyInvalidSpec(uri_spec);
-      // Ignore potential future kinds of facet URIs (e.g. for new platforms).
-      if (!uri.is_valid())
-        continue;
-      Facet new_facet = {uri};
-      if (facet.has_branding_info()) {
-        new_facet.branding_info =
-            FacetBrandingInfo{facet.branding_info().name(),
-                              GURL(facet.branding_info().icon_url())};
-      }
-      if (facet.has_change_password_info()) {
-        new_facet.change_password_url =
-            GURL(facet.change_password_info().change_password_url());
-      }
-      facets.push_back(std::move(new_facet));
+std::vector<Facet> ParseFacets(const MessageT& response) {
+  std::vector<Facet> facets;
+  facets.reserve(response.facet().size());
+  for (const auto& facet : response.facet()) {
+    const std::string& uri_spec(facet.id());
+    FacetURI uri = FacetURI::FromPotentiallyInvalidSpec(uri_spec);
+    // Ignore potential future kinds of facet URIs (e.g. for new platforms).
+    if (!uri.is_valid())
+      continue;
+    Facet new_facet = {uri};
+    if (facet.has_branding_info()) {
+      new_facet.branding_info = FacetBrandingInfo{
+          facet.branding_info().name(), GURL(facet.branding_info().icon_url())};
     }
+    if (facet.has_change_password_info()) {
+      new_facet.change_password_url =
+          GURL(facet.change_password_info().change_password_url());
+    }
+    facets.push_back(std::move(new_facet));
+  }
+  return facets;
+}
 
+AffiliatedFacets ParseEqClass(const affiliation_pb::Affiliation& affiliation) {
+  return ParseFacets(affiliation);
+}
+
+GroupedFacets ParseEqClass(const affiliation_pb::FacetGroup& grouping) {
+  GroupedFacets group;
+  group.facets = ParseFacets(grouping);
+  if (grouping.has_group_branding_info()) {
+    group.branding_info =
+        FacetBrandingInfo{grouping.group_branding_info().name(),
+                          GURL(grouping.group_branding_info().icon_url())};
+  }
+  return group;
+}
+
+void AddSingleFacet(std::vector<AffiliatedFacets>& affiliations, Facet facet) {
+  affiliations.push_back({facet});
+}
+
+void AddSingleFacet(std::vector<GroupedFacets>& groups, Facet facet) {
+  GroupedFacets group;
+  group.facets = {facet};
+  groups.push_back(std::move(group));
+}
+
+// Template for the affiliation_pb message:
+// > affiliation_pb::Affiliation
+// > affiliation_pb::FacetGroup
+template <typename MessageT, typename ResultT>
+bool ParseResponse(const std::vector<FacetURI>& requested_facet_uris,
+                   const MessageT& response,
+                   ResultT& result) {
+  std::map<std::string, size_t> facet_uri_to_class_index;
+  base::flat_set<std::string> requested_facets = base::MakeFlatSet<std::string>(
+      requested_facet_uris, /*comp=*/{}, &FacetURI::potentially_invalid_spec);
+
+  // Validate and de-duplicate data.
+  for (const auto& equivalence_class : response) {
     // Be lenient and ignore empty (after filtering) equivalence classes.
-    if (facets.empty())
+    if (equivalence_class.facet().empty())
       continue;
 
     // Ignore equivalence classes that are duplicates of earlier ones. However,
@@ -51,29 +84,32 @@
     // affiliations must form an equivalence relation. Also check, if the class
     // was requested.
     bool is_class_requested = false;
-    for (const Facet& facet : facets) {
-      if (requested_facets.count(facet.uri))
+    for (const auto& facet : equivalence_class.facet()) {
+      if (requested_facets.count(facet.id()))
         is_class_requested = true;
-      if (!facet_uri_to_class_index.count(facet.uri))
-        facet_uri_to_class_index[facet.uri] = result.size();
-      if (facet_uri_to_class_index[facet.uri] !=
-          facet_uri_to_class_index[facets[0].uri]) {
+
+      if (!facet_uri_to_class_index.count(facet.id()))
+        facet_uri_to_class_index[facet.id()] = result.size();
+
+      if (facet_uri_to_class_index[facet.id()] !=
+          facet_uri_to_class_index[equivalence_class.facet()[0].id()]) {
         return false;
       }
     }
 
-    // Filter out duplicate or nonrequested equivalence classes in the response.
+    // Filter out duplicate or unrequested equivalence classes in the response.
     if (is_class_requested &&
-        facet_uri_to_class_index[facets[0].uri] == result.size()) {
-      result.push_back(std::move(facets));
+        facet_uri_to_class_index[equivalence_class.facet()[0].id()] ==
+            result.size()) {
+      result.push_back(ParseEqClass(equivalence_class));
     }
   }
 
   // Synthesize an equivalence class (of size one) for each facet that did not
   // appear in the server response due to not being affiliated with any others.
   for (const FacetURI& uri : requested_facet_uris) {
-    if (!facet_uri_to_class_index.count(uri))
-      result.push_back({{uri}});
+    if (!facet_uri_to_class_index.count(uri.potentially_invalid_spec()))
+      AddSingleFacet(result, {uri});
   }
 
   return true;
@@ -85,10 +121,10 @@
     const std::vector<FacetURI>& requested_facet_uris,
     const affiliation_pb::LookupAffiliationByHashPrefixResponse& response,
     AffiliationFetcherDelegate::Result* result) {
-  return ParseFacets(requested_facet_uris, response.affiliations(),
-                     result->affiliations) &&
-         ParseFacets(requested_facet_uris, response.groups(),
-                     result->groupings);
+  return ParseResponse(requested_facet_uris, response.affiliations(),
+                       result->affiliations) &&
+         ParseResponse(requested_facet_uris, response.groups(),
+                       result->groupings);
 }
 
 }  // namespace password_manager
diff --git a/components/password_manager/core/browser/leak_detection_dialog_utils.h b/components/password_manager/core/browser/leak_detection_dialog_utils.h
index ced5b5a..c8937f3 100644
--- a/components/password_manager/core/browser/leak_detection_dialog_utils.h
+++ b/components/password_manager/core/browser/leak_detection_dialog_utils.h
@@ -192,7 +192,7 @@
 
   bool ShouldCheckPasswords() const override { return true; }
 
-  bool ShouldShowCancelButton() const override { return true; };
+  bool ShouldShowCancelButton() const override { return true; }
 };
 
 // Implementation of a leak change dialog.
@@ -231,7 +231,7 @@
 
   bool ShouldCheckPasswords() const override { return false; }
 
-  bool ShouldShowCancelButton() const override { return false; };
+  bool ShouldShowCancelButton() const override { return false; }
 };
 
 // Implementation of a leak checkup and change dialog.
@@ -271,7 +271,7 @@
 
   bool ShouldCheckPasswords() const override { return true; }
 
-  bool ShouldShowCancelButton() const override { return true; };
+  bool ShouldShowCancelButton() const override { return true; }
 };
 
 // Implementation of a leak automatic change dialog.
@@ -306,7 +306,7 @@
 
   bool ShouldCheckPasswords() const override { return false; }
 
-  bool ShouldShowCancelButton() const override { return true; };
+  bool ShouldShowCancelButton() const override { return true; }
 };
 
 }  // namespace password_manager
diff --git a/components/password_manager/core/browser/password_feature_manager_impl.cc b/components/password_manager/core/browser/password_feature_manager_impl.cc
index f09c1c8a..d9a3f315 100644
--- a/components/password_manager/core/browser/password_feature_manager_impl.cc
+++ b/components/password_manager/core/browser/password_feature_manager_impl.cc
@@ -41,7 +41,7 @@
     case SyncState::kSyncingNormalEncryption:
       return true;
   }
-};
+}
 
 bool PasswordFeatureManagerImpl::IsOptedInForAccountStorage() const {
   return features_util::IsOptedInForAccountStorage(pref_service_,
diff --git a/components/password_manager/core/browser/site_affiliation/affiliation_service_impl.cc b/components/password_manager/core/browser/site_affiliation/affiliation_service_impl.cc
index f0d3221..69db9b6 100644
--- a/components/password_manager/core/browser/site_affiliation/affiliation_service_impl.cc
+++ b/components/password_manager/core/browser/site_affiliation/affiliation_service_impl.cc
@@ -45,7 +45,7 @@
   for (const auto& grouped_facets : groupings) {
     std::vector<FacetURI> uris_without_urls;
     GURL fallback_url;
-    for (const auto& facet : grouped_facets) {
+    for (const auto& facet : grouped_facets.facets) {
       if (!facet.change_password_url.is_valid()) {
         uris_without_urls.push_back(facet.uri);
         continue;
diff --git a/components/password_manager/core/browser/site_affiliation/affiliation_service_impl_unittest.cc b/components/password_manager/core/browser/site_affiliation/affiliation_service_impl_unittest.cc
index 64dd14d..151fc79 100644
--- a/components/password_manager/core/browser/site_affiliation/affiliation_service_impl_unittest.cc
+++ b/components/password_manager/core/browser/site_affiliation/affiliation_service_impl_unittest.cc
@@ -264,13 +264,13 @@
 
   service()->PrefetchChangePasswordURLs({origin}, base::DoNothing());
 
-  const GroupedFacets group = {
-      {.uri = FacetURI::FromPotentiallyInvalidSpec(k1ExampleURL),
-       .change_password_url = GURL(k1ExampleChangePasswordURL)},
-      {.uri = FacetURI::FromPotentiallyInvalidSpec(kM1ExampleURL),
-       .change_password_url = GURL()},
-      {.uri = FacetURI::FromPotentiallyInvalidSpec(kOneExampleURL),
-       .change_password_url = GURL(kOneExampleChangePasswordURL)}};
+  GroupedFacets group;
+  group.facets = {{.uri = FacetURI::FromPotentiallyInvalidSpec(k1ExampleURL),
+                   .change_password_url = GURL(k1ExampleChangePasswordURL)},
+                  {.uri = FacetURI::FromPotentiallyInvalidSpec(kM1ExampleURL),
+                   .change_password_url = GURL()},
+                  {.uri = FacetURI::FromPotentiallyInvalidSpec(kOneExampleURL),
+                   .change_password_url = GURL(kOneExampleChangePasswordURL)}};
   auto test_result = std::make_unique<AffiliationFetcherDelegate::Result>();
   test_result->groupings.push_back(group);
   static_cast<AffiliationFetcherDelegate*>(service())->OnFetchSucceeded(
@@ -296,11 +296,11 @@
 
   service()->PrefetchChangePasswordURLs({origin}, base::DoNothing());
 
-  const GroupedFacets group = {
-      {.uri = FacetURI::FromPotentiallyInvalidSpec(k1ExampleURL),
-       .change_password_url = GURL(k1ExampleChangePasswordURL)},
-      {.uri = FacetURI::FromPotentiallyInvalidSpec(kM1ExampleURL),
-       .change_password_url = GURL()}};
+  GroupedFacets group;
+  group.facets = {{.uri = FacetURI::FromPotentiallyInvalidSpec(k1ExampleURL),
+                   .change_password_url = GURL(k1ExampleChangePasswordURL)},
+                  {.uri = FacetURI::FromPotentiallyInvalidSpec(kM1ExampleURL),
+                   .change_password_url = GURL()}};
   auto test_result = std::make_unique<AffiliationFetcherDelegate::Result>();
   test_result->groupings.push_back(group);
   static_cast<AffiliationFetcherDelegate*>(service())->OnFetchSucceeded(
@@ -326,13 +326,13 @@
 
   service()->PrefetchChangePasswordURLs({origin}, base::DoNothing());
 
-  const GroupedFacets group = {
-      {.uri = FacetURI::FromPotentiallyInvalidSpec(k1ExampleURL),
-       .change_password_url = GURL()},
-      {.uri = FacetURI::FromPotentiallyInvalidSpec(kM1ExampleURL),
-       .change_password_url = GURL()},
-      {.uri = FacetURI::FromPotentiallyInvalidSpec(kOneExampleURL),
-       .change_password_url = GURL()}};
+  GroupedFacets group;
+  group.facets = {{.uri = FacetURI::FromPotentiallyInvalidSpec(k1ExampleURL),
+                   .change_password_url = GURL()},
+                  {.uri = FacetURI::FromPotentiallyInvalidSpec(kM1ExampleURL),
+                   .change_password_url = GURL()},
+                  {.uri = FacetURI::FromPotentiallyInvalidSpec(kOneExampleURL),
+                   .change_password_url = GURL()}};
   auto test_result = std::make_unique<AffiliationFetcherDelegate::Result>();
   test_result->groupings.push_back(group);
   static_cast<AffiliationFetcherDelegate*>(service())->OnFetchSucceeded(
@@ -452,11 +452,11 @@
 
   service()->PrefetchChangePasswordURLs({origin}, base::DoNothing());
 
-  const GroupedFacets group = {
-      {.uri = FacetURI::FromPotentiallyInvalidSpec(k1ExampleURL),
-       .change_password_url = GURL(k1ExampleChangePasswordURL)},
-      {.uri = FacetURI::FromPotentiallyInvalidSpec(kOneExampleURL),
-       .change_password_url = GURL(kOneExampleChangePasswordURL)}};
+  GroupedFacets group;
+  group.facets = {{.uri = FacetURI::FromPotentiallyInvalidSpec(k1ExampleURL),
+                   .change_password_url = GURL(k1ExampleChangePasswordURL)},
+                  {.uri = FacetURI::FromPotentiallyInvalidSpec(kOneExampleURL),
+                   .change_password_url = GURL(kOneExampleChangePasswordURL)}};
   auto test_result = std::make_unique<AffiliationFetcherDelegate::Result>();
   test_result->groupings.push_back(group);
 
@@ -483,11 +483,11 @@
 
   service()->PrefetchChangePasswordURLs({origin}, base::DoNothing());
 
-  const GroupedFacets group = {
-      {.uri = FacetURI::FromPotentiallyInvalidSpec(k1ExampleURL),
-       .change_password_url = GURL(k1ExampleChangePasswordURL)},
-      {.uri = FacetURI::FromPotentiallyInvalidSpec(kM1ExampleURL),
-       .change_password_url = GURL()}};
+  GroupedFacets group;
+  group.facets = {{.uri = FacetURI::FromPotentiallyInvalidSpec(k1ExampleURL),
+                   .change_password_url = GURL(k1ExampleChangePasswordURL)},
+                  {.uri = FacetURI::FromPotentiallyInvalidSpec(kM1ExampleURL),
+                   .change_password_url = GURL()}};
   auto test_result = std::make_unique<AffiliationFetcherDelegate::Result>();
   test_result->groupings.push_back(group);
 
@@ -545,9 +545,9 @@
   service()->PrefetchChangePasswordURLs(origins_1, base::DoNothing());
   service()->PrefetchChangePasswordURLs(origins_2, base::DoNothing());
 
-  const GroupedFacets group1 = {
-      {.uri = FacetURI::FromPotentiallyInvalidSpec(k1ExampleURL),
-       .change_password_url = GURL(k1ExampleChangePasswordURL)}};
+  GroupedFacets group1;
+  group1.facets = {{.uri = FacetURI::FromPotentiallyInvalidSpec(k1ExampleURL),
+                    .change_password_url = GURL(k1ExampleChangePasswordURL)}};
   auto test_result1 = std::make_unique<AffiliationFetcherDelegate::Result>();
   test_result1->groupings.push_back(group1);
   static_cast<AffiliationFetcherDelegate*>(service())->OnFetchSucceeded(
@@ -555,9 +555,9 @@
   EXPECT_EQ(GURL(k1ExampleChangePasswordURL),
             service()->GetChangePasswordURL(origin1));
 
-  const GroupedFacets group2 = {
-      {.uri = FacetURI::FromPotentiallyInvalidSpec(k2ExampleURL),
-       .change_password_url = GURL(k2ExampleChangePasswordURL)}};
+  GroupedFacets group2;
+  group2.facets = {{.uri = FacetURI::FromPotentiallyInvalidSpec(k2ExampleURL),
+                    .change_password_url = GURL(k2ExampleChangePasswordURL)}};
   auto test_result2 = std::make_unique<AffiliationFetcherDelegate::Result>();
   test_result2->groupings.push_back(group2);
   static_cast<AffiliationFetcherDelegate*>(service())->OnFetchSucceeded(
diff --git a/components/password_manager/core/browser/site_affiliation/hash_affiliation_fetcher_unittest.cc b/components/password_manager/core/browser/site_affiliation/hash_affiliation_fetcher_unittest.cc
index c27b230..12a7cb9 100644
--- a/components/password_manager/core/browser/site_affiliation/hash_affiliation_fetcher_unittest.cc
+++ b/components/password_manager/core/browser/site_affiliation/hash_affiliation_fetcher_unittest.cc
@@ -307,7 +307,7 @@
 
   ASSERT_EQ(1u, result->groupings.size());
   EXPECT_THAT(
-      result->groupings[0],
+      result->groupings[0].facets,
       testing::UnorderedElementsAre(
           Facet{
               .uri = FacetURI::FromCanonicalSpec(kExampleWebFacet1URI),
@@ -584,4 +584,47 @@
       "PasswordManager.AffiliationFetcher.ResponseSize.Malformed", 1);
 }
 
+TEST_F(HashAffiliationFetcherTest, GroupBrandingInfoIsReturnedIfPresent) {
+  affiliation_pb::LookupAffiliationResponse test_response;
+
+  affiliation_pb::FacetGroup* eq_class_1 = test_response.add_group();
+  affiliation_pb::Facet* facet_1 = eq_class_1->add_facet();
+  facet_1->set_id(kExampleAndroidFacetURI);
+  auto group_branding_info =
+      std::make_unique<affiliation_pb::GroupBrandingInfo>();
+  group_branding_info->set_name(kExampleAndroidPlayName);
+  group_branding_info->set_icon_url(kExampleAndroidIconURL);
+  eq_class_1->set_allocated_group_branding_info(group_branding_info.release());
+
+  affiliation_pb::FacetGroup* eq_class_2 = test_response.add_group();
+  affiliation_pb::Facet* facet_2 = eq_class_2->add_facet();
+  facet_2->set_id(kExampleWebFacet1URI);
+
+  AffiliationFetcherInterface::RequestInfo request_info{.branding_info = true};
+
+  std::vector<FacetURI> requested_uris = {
+      FacetURI::FromCanonicalSpec(kExampleWebFacet1URI),
+      FacetURI::FromCanonicalSpec(kExampleAndroidFacetURI)};
+
+  SetupSuccessfulResponse(test_response.SerializeAsString());
+  testing::StrictMock<MockAffiliationFetcherDelegate> mock_delegate;
+  HashAffiliationFetcher fetcher(test_shared_loader_factory(), &mock_delegate);
+  std::unique_ptr<AffiliationFetcherDelegate::Result> result;
+  EXPECT_CALL(mock_delegate, OnFetchSucceeded(&fetcher, testing::_))
+      .WillOnce(MoveArg<1>(&result));
+  fetcher.StartRequest(requested_uris, request_info);
+  WaitForResponse();
+
+  ASSERT_NO_FATAL_FAILURE(
+      VerifyRequestPayload(ComputeHashes(requested_uris), request_info));
+  ASSERT_TRUE(testing::Mock::VerifyAndClearExpectations(&mock_delegate));
+
+  ASSERT_EQ(2u, result->groupings.size());
+  EXPECT_THAT(result->groupings[0].branding_info,
+              testing::Eq(FacetBrandingInfo{kExampleAndroidPlayName,
+                                            GURL(kExampleAndroidIconURL)}));
+  EXPECT_THAT(result->groupings[1].branding_info,
+              testing::Eq(FacetBrandingInfo()));
+}
+
 }  // namespace password_manager
diff --git a/components/password_manager/core/common/password_manager_features.cc b/components/password_manager/core/common/password_manager_features.cc
index cd58d74..ba7caca 100644
--- a/components/password_manager/core/common/password_manager_features.cc
+++ b/components/password_manager/core/common/password_manager_features.cc
@@ -200,7 +200,7 @@
 // When enabled, all undecryptable passwords are deleted from the local database
 // during initial sync flow.
 const base::Feature kSyncUndecryptablePasswordsLinux = {
-    "SyncUndecryptablePasswordsLinux", base::FEATURE_DISABLED_BY_DEFAULT};
+    "SyncUndecryptablePasswordsLinux", base::FEATURE_ENABLED_BY_DEFAULT};
 #endif
 
 #if BUILDFLAG(IS_ANDROID)
diff --git a/components/permissions/permission_request_queue.cc b/components/permissions/permission_request_queue.cc
index 44e0950..de9845e 100644
--- a/components/permissions/permission_request_queue.cc
+++ b/components/permissions/permission_request_queue.cc
@@ -67,4 +67,4 @@
   return queued_requests_.end();
 }
 
-};  // namespace permissions
+}  // namespace permissions
diff --git a/components/policy/android/java/src/org/chromium/components/policy/PolicyCacheUpdater.java b/components/policy/android/java/src/org/chromium/components/policy/PolicyCacheUpdater.java
index 71dce31..9eba9e1b 100644
--- a/components/policy/android/java/src/org/chromium/components/policy/PolicyCacheUpdater.java
+++ b/components/policy/android/java/src/org/chromium/components/policy/PolicyCacheUpdater.java
@@ -12,10 +12,7 @@
 import java.util.Arrays;
 import java.util.List;
 
-/**
- * Helper class to allow native libirary to update policy cache with {@link PolicyCache}
- */
-
+/** Helper class to allow native library to update policy cache with {@link PolicyCache} */
 @JNINamespace("policy::android")
 public class PolicyCacheUpdater {
     // A list of policies that will be cached. Note that policy won't be cached in case of any error
@@ -27,7 +24,9 @@
             Arrays.asList(Pair.create("BrowserSignin", PolicyCache.Type.Integer),
                     Pair.create("CloudManagementEnrollmentToken", PolicyCache.Type.String),
                     Pair.create("URLAllowlist", PolicyCache.Type.List),
-                    Pair.create("URLBlocklist", PolicyCache.Type.List));
+                    Pair.create("URLBlocklist", PolicyCache.Type.List),
+                    Pair.create("FirstPartySetsEnabled", PolicyCache.Type.Boolean),
+                    Pair.create("FirstPartySetsOverrides", PolicyCache.Type.Dict));
 
     @CalledByNative
     public static void cachePolicies(PolicyMap policyMap) {
diff --git a/components/policy/core/common/policy_map.cc b/components/policy/core/common/policy_map.cc
index 527b94f0..cd664ea 100644
--- a/components/policy/core/common/policy_map.cc
+++ b/components/policy/core/common/policy_map.cc
@@ -307,7 +307,7 @@
 }
 
 PolicyMap::PolicyMap()
-    : details_callback_{base::BindRepeating(&GetChromePolicyDetails)} {};
+    : details_callback_{base::BindRepeating(&GetChromePolicyDetails)} {}
 PolicyMap::PolicyMap(PolicyMap&&) noexcept = default;
 PolicyMap& PolicyMap::operator=(PolicyMap&&) noexcept = default;
 PolicyMap::~PolicyMap() = default;
diff --git a/components/policy/proto/chrome_device_policy.proto b/components/policy/proto/chrome_device_policy.proto
index cc81fc9..72fb37cc 100644
--- a/components/policy/proto/chrome_device_policy.proto
+++ b/components/policy/proto/chrome_device_policy.proto
@@ -175,6 +175,8 @@
   // Audio telemetry policy
   optional int64 report_device_audio_status_checking_rate_ms = 35
       [default = 600000];
+
+  optional StringList report_signal_strength_event_driven_telemetry = 38;
 }
 
 message EphemeralUsersEnabledProto {
diff --git a/components/policy/resources/policy_templates.json b/components/policy/resources/policy_templates.json
index 392f32a..de3a221 100644
--- a/components/policy/resources/policy_templates.json
+++ b/components/policy/resources/policy_templates.json
@@ -1003,6 +1003,7 @@
         'ReportDeviceNetworkTelemetryCollectionRateMs',
         'ReportDeviceNetworkTelemetryEventCheckingRateMs',
         'ReportDeviceAudioStatusCheckingRateMs',
+        'ReportDeviceSignalStrengthEventDrivenTelemetry',
       ],
     },
     {
@@ -12702,6 +12703,52 @@
       Setting the policy to Disabled or leaving it unset means no usage information is reported.''',
     },
     {
+      'name': 'ReportDeviceSignalStrengthEventDrivenTelemetry',
+      'owners': ['anasr@google.com', 'cros-reporting-team@google.com'],
+      'type': 'string-enum-list',
+      'schema': {
+        'type': 'array',
+        'items': {
+          'type': 'string',
+          'enum': [
+            'network_telemetry',
+            'https_latency',
+          ]
+        },
+      },
+      'items': [
+        {
+          'name': 'network_telemetry',
+          'value': 'network_telemetry',
+          'caption': '''Network Telemetry''',
+        },
+        {
+          'name': 'https_latency',
+          'value': 'https_latency',
+          'caption': '''Https Latency''',
+        },
+      ],
+      'future_on': ['chrome_os'],
+      'supported_chrome_os_management': ['google_cloud'],
+      'device_only': True,
+      'features': {
+        'cloud_only': True,
+        'dynamic_refresh': True,
+        'unlisted': True,
+      },
+      'example_value': ['https_latency'],
+      'id': 1008,
+      'caption': '''Telemetry data to report on signal strength event.''',
+      'tags': ['admin-sharing'],
+      'desc': '''List of telemetry data to be reported on signal strength change events.
+
+      Each telemetry data specified will only be reported if it was not disabled by its controlling policy.
+      Controlling policy for https_latency and network_telemetry is ReportDeviceNetworkStatus.
+
+      If not set, no additional telemetry data will be reported on signal strength change events.''',
+      'arc_support': 'This policy has no effect on the logging done by Android.',
+    },
+    {
       'name': 'HeartbeatEnabled',
       'owners': ['cros-reporting-team@google.com', 'lbaraz@chromium.org'],
       'type': 'main',
@@ -33424,6 +33471,7 @@
     'ReportDeviceNetworkTelemetryCollectionRateMs': 'device_reporting.report_network_telemetry_collection_rate_ms',
     'ReportDeviceNetworkTelemetryEventCheckingRateMs': 'device_reporting.report_network_telemetry_event_checking_rate_ms',
     'ReportDeviceAudioStatusCheckingRateMs': 'device_reporting.report_device_audio_status_checking_rate_ms',
+    'ReportDeviceSignalStrengthEventDrivenTelemetry': 'device_reporting.report_signal_strength_event_driven_telemetry.entries',
     'ReportUploadFrequency': 'device_reporting.device_status_frequency',
     'DeviceLoginScreenPowerManagement': 'login_screen_power_management.login_screen_power_management',
     'DeviceChromeVariations': 'device_chrome_variations_type.value',
@@ -34033,6 +34081,6 @@
   'placeholders': [],
   'deleted_policy_ids': [114, 115, 204, 205, 206, 341, 412, 438, 476, 544, 546, 562, 569, 578, 583, 585, 586, 587, 588, 589, 590, 591, 600, 668, 669, 872],
   'deleted_atomic_policy_group_ids': [19],
-  'highest_id_currently_used': 1007,
+  'highest_id_currently_used': 1008,
   'highest_atomic_group_id_currently_used': 43
 }
diff --git a/components/power_bookmarks/core/power_bookmark_utils.cc b/components/power_bookmarks/core/power_bookmark_utils.cc
index 696becd..a28bd30 100644
--- a/components/power_bookmarks/core/power_bookmark_utils.cc
+++ b/components/power_bookmarks/core/power_bookmark_utils.cc
@@ -10,6 +10,7 @@
 #include "base/base64.h"
 #include "base/guid.h"
 #include "base/i18n/string_search.h"
+#include "base/notreached.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/time/time.h"
@@ -22,6 +23,21 @@
 
 namespace power_bookmarks {
 
+namespace {
+
+// Backfill old shopping_specifics field to the new one. This is necessary
+// as we're transitioning from oneof powers to allowing multiple.
+// TODO(crbug.com/1349651): Also invoke this in meta updates once available.
+void BackfillShoppingSpecifics(PowerBookmarkMeta* meta) {
+  if (meta->has_old_shopping_specifics() && !meta->has_shopping_specifics()) {
+    meta->mutable_shopping_specifics()->CopyFrom(
+        meta->old_shopping_specifics());
+    meta->clear_old_shopping_specifics();
+  }
+}
+
+}  // namespace
+
 const char kPowerBookmarkMetaKey[] = "power_bookmark_meta";
 
 PowerBookmarkQueryFields::PowerBookmarkQueryFields() = default;
@@ -44,6 +60,8 @@
     DeleteNodePowerBookmarkMeta(model, node);
   }
 
+  BackfillShoppingSpecifics(meta.get());
+
   return meta;
 }
 
@@ -55,6 +73,8 @@
 
   CHECK(meta);
 
+  BackfillShoppingSpecifics(meta.get());
+
   std::string data;
   EncodeMetaForStorage(*meta.get(), &data);
   model->SetNodeMetaInfo(node, kPowerBookmarkMetaKey, data);
@@ -110,11 +130,22 @@
     bool tags_match_query =
         query_words.empty() || DoBookmarkTagsContainWords(meta, query_words);
 
+    // Add vertical-specific support by adding a case below.
     if (query.type.has_value()) {
-      if (!meta || (meta->type() != query.type.value() &&
-                    query.type.value() != PowerBookmarkType::UNSPECIFIED)) {
+      if (!meta)
         continue;
+
+      bool type_present = false;
+      switch (query.type.value()) {
+        case PowerBookmarkType::SHOPPING:
+          type_present = meta->has_shopping_specifics();
+          break;
+        default:
+          NOTREACHED();
       }
+
+      if (!type_present)
+        continue;
     }
 
     if (!title_or_url_match_query && !tags_match_query)
diff --git a/components/power_bookmarks/core/power_bookmark_utils_unittest.cc b/components/power_bookmarks/core/power_bookmark_utils_unittest.cc
index 22d531f..7c4cb03 100644
--- a/components/power_bookmarks/core/power_bookmark_utils_unittest.cc
+++ b/components/power_bookmarks/core/power_bookmark_utils_unittest.cc
@@ -324,21 +324,20 @@
       model()->other_node(), 0, u"foo bar", GURL("http://www.google.com"));
   std::unique_ptr<PowerBookmarkMeta> meta1 =
       std::make_unique<PowerBookmarkMeta>();
-  meta1->set_type(PowerBookmarkType::SHOPPING);
+  meta1->mutable_shopping_specifics()->set_title("Example Title");
   SetNodePowerBookmarkMeta(model(), node1, std::move(meta1));
 
   const bookmarks::BookmarkNode* node2 = model()->AddURL(
       model()->other_node(), 0, u"baz buz", GURL("http://www.cnn.com"));
   std::unique_ptr<PowerBookmarkMeta> meta2 =
       std::make_unique<PowerBookmarkMeta>();
-  meta2->set_type(PowerBookmarkType::SHOPPING);
+  meta2->mutable_shopping_specifics()->set_title("Example Title");
   SetNodePowerBookmarkMeta(model(), node2, std::move(meta2));
 
   const bookmarks::BookmarkNode* node3 = model()->AddURL(
       model()->other_node(), 0, u"chromium", GURL("http://www.chromium.org"));
   std::unique_ptr<PowerBookmarkMeta> meta3 =
       std::make_unique<PowerBookmarkMeta>();
-  meta3->set_type(PowerBookmarkType::UNSPECIFIED);
   SetNodePowerBookmarkMeta(model(), node3, std::move(meta3));
 
   const bookmarks::BookmarkNode* normal_node =
@@ -360,18 +359,10 @@
   EXPECT_FALSE(ListContainsNode(nodes, normal_node));
   EXPECT_FALSE(ListContainsNode(nodes, node3));
   nodes.clear();
-
-  // Test that a query for the UNSPECIFIED type returns the correct results.
-  query.type = PowerBookmarkType::UNSPECIFIED;
-  GetBookmarksMatchingProperties(model(), query, 100, &nodes);
-  ASSERT_EQ(3U, nodes.size());
-  EXPECT_FALSE(ListContainsNode(nodes, normal_node));
-  nodes.clear();
 }
 
 TEST_F(PowerBookmarkUtilsTest, EncodeAndDecodeForPersistence) {
   PowerBookmarkMeta meta;
-  meta.set_type(PowerBookmarkType::SHOPPING);
   meta.mutable_shopping_specifics()->set_title("Example Title");
 
   std::string encoded_data;
@@ -380,7 +371,7 @@
   PowerBookmarkMeta out_meta;
   EXPECT_TRUE(DecodeMetaFromStorage(encoded_data, &out_meta));
 
-  ASSERT_EQ(meta.type(), out_meta.type());
+  ASSERT_EQ(meta.has_shopping_specifics(), out_meta.has_shopping_specifics());
   ASSERT_EQ(meta.shopping_specifics().title(),
             out_meta.shopping_specifics().title());
 }
diff --git a/components/power_bookmarks/core/proto/power_bookmark_meta.proto b/components/power_bookmarks/core/proto/power_bookmark_meta.proto
index fbeeb01..cddb4711 100644
--- a/components/power_bookmarks/core/proto/power_bookmark_meta.proto
+++ b/components/power_bookmarks/core/proto/power_bookmark_meta.proto
@@ -13,14 +13,16 @@
 
 import "components/power_bookmarks/core/proto/shopping_specifics.proto";
 
+// Used to query specific bookmark verticals.
 enum PowerBookmarkType {
-  UNSPECIFIED = 0;
   SHOPPING = 1;
 }
 
 // This message is used to store the extra information associated with a
 // bookmark. This information is stored with and synced with bookmarks.
 message PowerBookmarkMeta {
+  // Generic properties
+
   // This is the main image that will be shown in the UI.
   optional Image lead_image = 1;
 
@@ -30,15 +32,25 @@
 
   repeated Tag tags = 3;
 
-  // This enum can aid in determining what type of UI to show the bookmark in or
-  // which backend to update with.
-  optional PowerBookmarkType type = 4;
+  // Vertical specifics
+  // How to add a new vertical:
+  // 1. Add a new proto with the required data.
+  // 2. Include that proto at the top of the file.
+  // 3. Add a new option field below.
 
-  // Extra information corresponding to the |type|.
+  // Shopping-specific data populated when a user bookmarks a product-page.
+  optional ShoppingSpecifics shopping_specifics = 6;
+
+  // Deprecated fields
+
+  // TODO(wylieb): Remove this field once the migration code has baked.
   oneof type_specifics {
-    ShoppingSpecifics shopping_specifics = 5;
+    ShoppingSpecifics old_shopping_specifics = 5;
   }
 
+  // Previously used values, don't reuse.
+  reserved 4;
+
   message Tag {
     // The name of the tag as displayed to the user.
     optional string display_name = 1;
diff --git a/components/privacy_sandbox/privacy_sandbox_settings.cc b/components/privacy_sandbox/privacy_sandbox_settings.cc
index 8458b1a..0e18d4e 100644
--- a/components/privacy_sandbox/privacy_sandbox_settings.cc
+++ b/components/privacy_sandbox/privacy_sandbox_settings.cc
@@ -179,25 +179,25 @@
       prefs::kPrivacySandboxTopicsDataAccessibleSince);
 }
 
-bool PrivacySandboxSettings::IsConversionMeasurementAllowed(
+bool PrivacySandboxSettings::IsAttributionReportingAllowed(
     const url::Origin& top_frame_origin,
     const url::Origin& reporting_origin) const {
   return IsPrivacySandboxEnabledForContext(reporting_origin.GetURL(),
                                            top_frame_origin);
 }
 
-bool PrivacySandboxSettings::ShouldSendConversionReport(
-    const url::Origin& impression_origin,
-    const url::Origin& conversion_origin,
+bool PrivacySandboxSettings::MaySendAttributionReport(
+    const url::Origin& source_origin,
+    const url::Origin& destination_origin,
     const url::Origin& reporting_origin) const {
-  // The |reporting_origin| needs to have been accessible in both impression
-  // and conversion contexts. These are both checked when they occur, but
-  // user settings may have changed between then and when the conversion report
+  // The |reporting_origin| needs to have been accessible in both source
+  // and trigger contexts. These are both checked when they occur, but
+  // user settings may have changed between then and when the attribution report
   // is sent.
   return IsPrivacySandboxEnabledForContext(reporting_origin.GetURL(),
-                                           impression_origin) &&
+                                           source_origin) &&
          IsPrivacySandboxEnabledForContext(reporting_origin.GetURL(),
-                                           conversion_origin);
+                                           destination_origin);
 }
 
 void PrivacySandboxSettings::SetFledgeJoiningAllowed(
diff --git a/components/privacy_sandbox/privacy_sandbox_settings.h b/components/privacy_sandbox/privacy_sandbox_settings.h
index 44509d1c..1bf50bf 100644
--- a/components/privacy_sandbox/privacy_sandbox_settings.h
+++ b/components/privacy_sandbox/privacy_sandbox_settings.h
@@ -103,20 +103,19 @@
   // future, in which case no history is eligible.
   base::Time TopicsDataAccessibleSince() const;
 
-  // Determines whether Conversion Measurement is allowable in a particular
-  // context. Should be called at both impression & conversion. At each of these
-  // points |top_frame_origin| is the same as either the impression origin or
-  // the conversion origin respectively.
-  bool IsConversionMeasurementAllowed(
-      const url::Origin& top_frame_origin,
-      const url::Origin& reporting_origin) const;
+  // Determines whether Attribution Reporting is allowable in a particular
+  // context. Should be called at both source and trigger registration. At each
+  // of these points |top_frame_origin| is the same as either the source origin
+  // or the destination origin respectively.
+  bool IsAttributionReportingAllowed(const url::Origin& top_frame_origin,
+                                     const url::Origin& reporting_origin) const;
 
-  // Called before sending the associated conversion report to
+  // Called before sending the associated attribution report to
   // |reporting_origin|. Re-checks that |reporting_origin| is allowable as a 3P
-  // on both |impression_origin| and |conversion_origin|.
-  bool ShouldSendConversionReport(const url::Origin& impression_origin,
-                                  const url::Origin& conversion_origin,
-                                  const url::Origin& reporting_origin) const;
+  // on both |source_origin| and |destination_origin|.
+  bool MaySendAttributionReport(const url::Origin& source_origin,
+                                const url::Origin& destination_origin,
+                                const url::Origin& reporting_origin) const;
 
   // Sets the ability for |top_frame_etld_plus1| to join the profile to interest
   // groups to |allowed|. This information is stored in preferences, and is made
diff --git a/components/privacy_sandbox/privacy_sandbox_settings_unittest.cc b/components/privacy_sandbox/privacy_sandbox_settings_unittest.cc
index bd044f7..d1c704b 100644
--- a/components/privacy_sandbox/privacy_sandbox_settings_unittest.cc
+++ b/components/privacy_sandbox/privacy_sandbox_settings_unittest.cc
@@ -123,10 +123,10 @@
       GURL("https://embedded.com"),
       url::Origin::Create(GURL("https://test.com"))));
 
-  EXPECT_FALSE(privacy_sandbox_settings()->IsConversionMeasurementAllowed(
+  EXPECT_FALSE(privacy_sandbox_settings()->IsAttributionReportingAllowed(
       url::Origin::Create(GURL("https://test.com")),
       url::Origin::Create(GURL("https://embedded.com"))));
-  EXPECT_FALSE(privacy_sandbox_settings()->ShouldSendConversionReport(
+  EXPECT_FALSE(privacy_sandbox_settings()->MaySendAttributionReport(
       url::Origin::Create(GURL("https://test.com")),
       url::Origin::Create(GURL("https://another-test.com")),
       url::Origin::Create(GURL("https://embedded.com"))));
@@ -176,10 +176,10 @@
       GURL("https://embedded.com"),
       url::Origin::Create(GURL("https://test.com"))));
 
-  EXPECT_FALSE(privacy_sandbox_settings()->IsConversionMeasurementAllowed(
+  EXPECT_FALSE(privacy_sandbox_settings()->IsAttributionReportingAllowed(
       url::Origin::Create(GURL("https://test.com")),
       url::Origin::Create(GURL("https://embedded.com"))));
-  EXPECT_FALSE(privacy_sandbox_settings()->ShouldSendConversionReport(
+  EXPECT_FALSE(privacy_sandbox_settings()->MaySendAttributionReport(
       url::Origin::Create(GURL("https://test.com")),
       url::Origin::Create(GURL("https://another-test.com")),
       url::Origin::Create(GURL("https://embedded.com"))));
@@ -223,10 +223,10 @@
       GURL("https://embedded.com"),
       url::Origin::Create(GURL("https://test.com"))));
 
-  EXPECT_FALSE(privacy_sandbox_settings()->IsConversionMeasurementAllowed(
+  EXPECT_FALSE(privacy_sandbox_settings()->IsAttributionReportingAllowed(
       url::Origin::Create(GURL("https://test.com")),
       url::Origin::Create(GURL("https://embedded.com"))));
-  EXPECT_FALSE(privacy_sandbox_settings()->ShouldSendConversionReport(
+  EXPECT_FALSE(privacy_sandbox_settings()->MaySendAttributionReport(
       url::Origin::Create(GURL("https://test.com")),
       url::Origin::Create(GURL("https://another-test.com")),
       url::Origin::Create(GURL("https://embedded.com"))));
@@ -269,10 +269,10 @@
   EXPECT_FALSE(privacy_sandbox_settings()->IsTopicsAllowedForContext(
       GURL("https://embedded.com"),
       url::Origin::Create(GURL("https://test.com"))));
-  EXPECT_FALSE(privacy_sandbox_settings()->IsConversionMeasurementAllowed(
+  EXPECT_FALSE(privacy_sandbox_settings()->IsAttributionReportingAllowed(
       url::Origin::Create(GURL("https://test.com")),
       url::Origin::Create(GURL("https://embedded.com"))));
-  EXPECT_FALSE(privacy_sandbox_settings()->ShouldSendConversionReport(
+  EXPECT_FALSE(privacy_sandbox_settings()->MaySendAttributionReport(
       url::Origin::Create(GURL("https://test.com")),
       url::Origin::Create(GURL("https://another-test.com")),
       url::Origin::Create(GURL("https://embedded.com"))));
@@ -320,17 +320,17 @@
       GURL("https://unrelated.com"),
       url::Origin::Create(GURL("https://unrelated.com"))));
 
-  EXPECT_FALSE(privacy_sandbox_settings()->IsConversionMeasurementAllowed(
+  EXPECT_FALSE(privacy_sandbox_settings()->IsAttributionReportingAllowed(
       url::Origin::Create(GURL("https://test.com")),
       url::Origin::Create(GURL("https://embedded.com"))));
-  EXPECT_FALSE(privacy_sandbox_settings()->ShouldSendConversionReport(
+  EXPECT_FALSE(privacy_sandbox_settings()->MaySendAttributionReport(
       url::Origin::Create(GURL("https://test.com")),
       url::Origin::Create(GURL("https://another-test.com")),
       url::Origin::Create(GURL("https://embedded.com"))));
-  EXPECT_TRUE(privacy_sandbox_settings()->IsConversionMeasurementAllowed(
+  EXPECT_TRUE(privacy_sandbox_settings()->IsAttributionReportingAllowed(
       url::Origin::Create(GURL("https://unrelated-a.com")),
       url::Origin::Create(GURL("https://unrelated-b.com"))));
-  EXPECT_TRUE(privacy_sandbox_settings()->ShouldSendConversionReport(
+  EXPECT_TRUE(privacy_sandbox_settings()->MaySendAttributionReport(
       url::Origin::Create(GURL("https://unrelated-c.com")),
       url::Origin::Create(GURL("https://unrelated-d.com")),
       url::Origin::Create(GURL("https://unrelated-e.com"))));
@@ -402,10 +402,10 @@
   EXPECT_TRUE(privacy_sandbox_settings()->IsTopicsAllowedForContext(
       GURL("https://embedded.com"), absl::nullopt));
 
-  EXPECT_TRUE(privacy_sandbox_settings()->IsConversionMeasurementAllowed(
+  EXPECT_TRUE(privacy_sandbox_settings()->IsAttributionReportingAllowed(
       url::Origin::Create(GURL("https://another-test.com")),
       url::Origin::Create(GURL("https://embedded.com"))));
-  EXPECT_TRUE(privacy_sandbox_settings()->ShouldSendConversionReport(
+  EXPECT_TRUE(privacy_sandbox_settings()->MaySendAttributionReport(
       url::Origin::Create(GURL("https://another-test.com")),
       url::Origin::Create(GURL("https://yet-another-test.com")),
       url::Origin::Create(GURL("https://embedded.com"))));
@@ -446,10 +446,10 @@
       GURL("https://embedded.com"),
       url::Origin::Create(GURL("https://test.com"))));
 
-  EXPECT_FALSE(privacy_sandbox_settings()->IsConversionMeasurementAllowed(
+  EXPECT_FALSE(privacy_sandbox_settings()->IsAttributionReportingAllowed(
       url::Origin::Create(GURL("https://test.com")),
       url::Origin::Create(GURL("https://embedded.com"))));
-  EXPECT_FALSE(privacy_sandbox_settings()->ShouldSendConversionReport(
+  EXPECT_FALSE(privacy_sandbox_settings()->MaySendAttributionReport(
       url::Origin::Create(GURL("https://test.com")),
       url::Origin::Create(GURL("https://another-test.com")),
       url::Origin::Create(GURL("https://embedded.com"))));
@@ -488,10 +488,10 @@
       GURL("https://embedded.com"),
       url::Origin::Create(GURL("https://test.com"))));
 
-  EXPECT_FALSE(privacy_sandbox_settings()->IsConversionMeasurementAllowed(
+  EXPECT_FALSE(privacy_sandbox_settings()->IsAttributionReportingAllowed(
       url::Origin::Create(GURL("https://test.com")),
       url::Origin::Create(GURL("https://embedded.com"))));
-  EXPECT_FALSE(privacy_sandbox_settings()->ShouldSendConversionReport(
+  EXPECT_FALSE(privacy_sandbox_settings()->MaySendAttributionReport(
       url::Origin::Create(GURL("https://test.com")),
       url::Origin::Create(GURL("https://another-test.com")),
       url::Origin::Create(GURL("https://embedded.com"))));
@@ -528,10 +528,10 @@
       GURL("https://embedded.com"),
       url::Origin::Create(GURL("https://test.com"))));
 
-  EXPECT_FALSE(privacy_sandbox_settings()->IsConversionMeasurementAllowed(
+  EXPECT_FALSE(privacy_sandbox_settings()->IsAttributionReportingAllowed(
       url::Origin::Create(GURL("https://test.com")),
       url::Origin::Create(GURL("https://embedded.com"))));
-  EXPECT_FALSE(privacy_sandbox_settings()->ShouldSendConversionReport(
+  EXPECT_FALSE(privacy_sandbox_settings()->MaySendAttributionReport(
       url::Origin::Create(GURL("https://test.com")),
       url::Origin::Create(GURL("https://another-test.com")),
       url::Origin::Create(GURL("https://embedded.com"))));
@@ -573,10 +573,10 @@
       GURL("https://embedded.com"),
       url::Origin::Create(GURL("https://test.com"))));
 
-  EXPECT_FALSE(privacy_sandbox_settings()->IsConversionMeasurementAllowed(
+  EXPECT_FALSE(privacy_sandbox_settings()->IsAttributionReportingAllowed(
       url::Origin::Create(GURL("https://test.com")),
       url::Origin::Create(GURL("https://embedded.com"))));
-  EXPECT_FALSE(privacy_sandbox_settings()->ShouldSendConversionReport(
+  EXPECT_FALSE(privacy_sandbox_settings()->MaySendAttributionReport(
       url::Origin::Create(GURL("https://test.com")),
       url::Origin::Create(GURL("https://another-test.com")),
       url::Origin::Create(GURL("https://embedded.com"))));
diff --git a/components/reporting/util/test_support_callbacks.h b/components/reporting/util/test_support_callbacks.h
index 1372d85..9173c05 100644
--- a/components/reporting/util/test_support_callbacks.h
+++ b/components/reporting/util/test_support_callbacks.h
@@ -27,14 +27,13 @@
 // Usage (in tests only):
 //
 //   TestEvent<ResType> e;
+//
 //   ... Do some async work passing e.cb() as a completion callback of
 //   base::OnceCallback<void(ResType res)> type which also may perform some
 //   other action specified by |done| callback provided by the caller.
-//   ... = e.result();  // Will wait for e.cb() to be called and return the
-//   collected result.
+//   Now wait for e.cb() to be called and return the collected result.
 //
-//   This class follows base::BarrierCallback in using mutex Lock.
-//   It can only be done in tests, never in production code.
+//   ... = e.result();
 //
 template <typename ResType>
 class TestEvent : base::test::RepeatingTestFuture<ResType> {
@@ -43,8 +42,21 @@
   ~TestEvent() = default;
   TestEvent(const TestEvent& other) = delete;
   TestEvent& operator=(const TestEvent& other) = delete;
-  ResType result() {
-    auto res = base::test::RepeatingTestFuture<ResType>::Take();
+
+  template <std::enable_if_t<std::is_move_constructible<ResType>::value, bool> =
+                false>
+  [[nodiscard]] const ResType& ref_result() {
+    auto res = base::test::RepeatingTestFuture<ResType>::Get();
+    EXPECT_TRUE(base::test::RepeatingTestFuture<ResType>::IsEmpty())
+        << "Event callback invoked more than once";
+    return res;
+  }
+
+  template <
+      std::enable_if_t<std::is_move_constructible<ResType>::value, bool> = true>
+  [[nodiscard]] ResType result() {
+    auto res =
+        std::forward<ResType>(base::test::RepeatingTestFuture<ResType>::Take());
     EXPECT_TRUE(base::test::RepeatingTestFuture<ResType>::IsEmpty())
         << "Event callback invoked more than once";
     return res;
@@ -65,14 +77,13 @@
 // Usage (in tests only):
 //
 //   TestMultiEvent<ResType1, Restype2, ...> e;
+//
 //   ... Do some async work passing e.cb() as a completion callback of
 //   base::OnceCallback<void(ResType1, Restype2, ...)> type which also may
 //   perform some other action specified by |done| callback provided by the
-//   caller. std::tie(res1, res2, ...) = e.result();  // Will wait for e.cb() to
-//   be called and return the collected results.
+//   caller. Now wait for e.cb() to be called and return the collected results.
 //
-//   This class follows base::BarrierCallback in using mutex Lock.
-//   It can only be done in tests, never in production code.
+//   std::tie(res1, res2, ...) = e.result();
 //
 template <typename... ResType>
 class TestMultiEvent : base::test::RepeatingTestFuture<ResType...> {
@@ -81,7 +92,22 @@
   ~TestMultiEvent() = default;
   TestMultiEvent(const TestMultiEvent& other) = delete;
   TestMultiEvent& operator=(const TestMultiEvent& other) = delete;
-  std::tuple<ResType...> result() {
+
+  template <std::enable_if_t<
+                std::is_move_constructible<std::tuple<ResType...>>::value,
+                bool> = false>
+  [[nodiscard]] const std::tuple<ResType...>& ref_result() {
+    auto res = std::forward<std::tuple<ResType...>>(
+        base::test::RepeatingTestFuture<ResType...>::Get());
+    EXPECT_TRUE(base::test::RepeatingTestFuture<ResType...>::IsEmpty())
+        << "Event callback invoked more than once";
+    return res;
+  }
+
+  template <std::enable_if_t<
+                std::is_move_constructible<std::tuple<ResType...>>::value,
+                bool> = true>
+  [[nodiscard]] std::tuple<ResType...> result() {
     auto res = std::forward<std::tuple<ResType...>>(
         base::test::RepeatingTestFuture<ResType...>::Take());
     EXPECT_TRUE(base::test::RepeatingTestFuture<ResType...>::IsEmpty())
@@ -90,7 +116,7 @@
   }
 
   // Completion callback to hand over to the processing method.
-  base::RepeatingCallback<void(ResType... res)> cb() {
+  [[nodiscard]] base::RepeatingCallback<void(ResType... res)> cb() {
     return base::BindPostTask(
         base::SequencedTaskRunnerHandle::Get(),
         base::test::RepeatingTestFuture<ResType...>::GetCallback());
diff --git a/components/saved_tab_groups/saved_tab_group.h b/components/saved_tab_groups/saved_tab_group.h
index 1c5e570..1acd6ed 100644
--- a/components/saved_tab_groups/saved_tab_group.h
+++ b/components/saved_tab_groups/saved_tab_group.h
@@ -57,11 +57,11 @@
   SavedTabGroup& SetTitle(std::u16string title) {
     title_ = title;
     return *this;
-  };
+  }
   SavedTabGroup& SetColor(tab_groups::TabGroupColorId color) {
     color_ = color;
     return *this;
-  };
+  }
   SavedTabGroup& SetLocalGroupId(
       absl::optional<tab_groups::TabGroupId> tab_group_id) {
     tab_group_id_ = tab_group_id;
diff --git a/components/search/ntp_features.cc b/components/search/ntp_features.cc
index ffe275d..171f45a 100644
--- a/components/search/ntp_features.cc
+++ b/components/search/ntp_features.cc
@@ -71,7 +71,7 @@
 
 // If enabled, Google Drive module will be shown.
 const base::Feature kNtpDriveModule{"NtpDriveModule",
-                                    base::FEATURE_DISABLED_BY_DEFAULT};
+                                    base::FEATURE_ENABLED_BY_DEFAULT};
 
 // If enabled, handles navigations from the Most Visited tiles explicitly and
 // overrides the navigation's transition type to bookmark navigation before the
diff --git a/components/search_engines/BUILD.gn b/components/search_engines/BUILD.gn
index df37adb5..e4d0814 100644
--- a/components/search_engines/BUILD.gn
+++ b/components/search_engines/BUILD.gn
@@ -19,7 +19,6 @@
     "keyword_table.h",
     "keyword_web_data_service.cc",
     "keyword_web_data_service.h",
-    "omnibox_focus_type.h",
     "search_engines_pref_names.cc",
     "search_engines_pref_names.h",
     "search_engines_switches.cc",
diff --git a/components/search_engines/omnibox_focus_type.h b/components/search_engines/omnibox_focus_type.h
deleted file mode 100644
index e69eab0..0000000
--- a/components/search_engines/omnibox_focus_type.h
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COMPONENTS_SEARCH_ENGINES_OMNIBOX_FOCUS_TYPE_H_
-#define COMPONENTS_SEARCH_ENGINES_OMNIBOX_FOCUS_TYPE_H_
-
-// For search requests, this enum specifies how the user last interacted with
-// the UI control. This is used for both the omnibox and NTP realbox.
-//
-// At this point, it's a bit of a misnomer to call it OmniboxFocusType, since
-// the enum now covers UI interactions unrelated to focus. But we are keeping
-// the old name to match the "oft" GET param.
-//
-// These values are used as HTTP GET parameter values. Entries should not be
-// renumbered and numeric values should never be reused.
-enum class OmniboxFocusType {
-  // The default value. This is used for any search requests without any
-  // special interaction annotation, including: normal omnibox searches,
-  // as-you-type omnibox suggestions, as well as non-omnibox searches.
-  DEFAULT = 0,
-
-  // This search request is triggered by the user focusing the omnibox.
-  ON_FOCUS = 1,
-
-  // This search request is triggered by the user deleting all of the
-  // omnibox permanent text at once, i.e. user is on "https://example.com",
-  // does Ctrl+L which selects the whole URL, then presses Backspace.
-  //
-  // Note, DELETED_PERMANENT_TEXT only applies in fairly limited circumstances.
-  // For example, these cases would NOT qualify, are instead marked DEFAULT:
-  //  - User deletes their own typed text.
-  //  - User deletes the permanent text one character at a time.
-  //  - User uses Cut (Ctrl+X) to delete the permanent text.
-  DELETED_PERMANENT_TEXT = 2,
-};
-
-#endif  // COMPONENTS_SEARCH_ENGINES_OMNIBOX_FOCUS_TYPE_H_
diff --git a/components/search_engines/template_url.cc b/components/search_engines/template_url.cc
index 72f9652..a6d31be 100644
--- a/components/search_engines/template_url.cc
+++ b/components/search_engines/template_url.cc
@@ -1162,7 +1162,8 @@
 
       case GOOGLE_OMNIBOX_FOCUS_TYPE:
         DCHECK(!replacement.is_post_param);
-        if (search_terms_args.focus_type != OmniboxFocusType::DEFAULT) {
+        if (search_terms_args.focus_type !=
+            metrics::OmniboxFocusType::INTERACTION_DEFAULT) {
           HandleReplacement("oft",
                             base::NumberToString(
                                 static_cast<int>(search_terms_args.focus_type)),
diff --git a/components/search_engines/template_url.h b/components/search_engines/template_url.h
index baff8c6..02e7f28 100644
--- a/components/search_engines/template_url.h
+++ b/components/search_engines/template_url.h
@@ -14,12 +14,12 @@
 #include "base/gtest_prod_util.h"
 #include "base/memory/raw_ptr.h"
 #include "base/time/time.h"
-#include "components/search_engines/omnibox_focus_type.h"
 #include "components/search_engines/search_engine_type.h"
 #include "components/search_engines/template_url_data.h"
 #include "components/search_engines/template_url_id.h"
 #include "third_party/metrics_proto/chrome_searchbox_stats.pb.h"
 #include "third_party/metrics_proto/omnibox_event.pb.h"
+#include "third_party/metrics_proto/omnibox_focus_type.pb.h"
 #include "third_party/metrics_proto/omnibox_input_type.pb.h"
 #include "ui/gfx/geometry/size.h"
 #include "url/gurl.h"
@@ -192,7 +192,8 @@
     metrics::OmniboxInputType input_type = metrics::OmniboxInputType::EMPTY;
 
     // Specifies how the user last interacted with the searchbox UI element.
-    OmniboxFocusType focus_type = OmniboxFocusType::DEFAULT;
+    metrics::OmniboxFocusType focus_type =
+        metrics::OmniboxFocusType::INTERACTION_DEFAULT;
 
     // The optional assisted query stats, aka AQS, used for logging purposes.
     // This string contains impressions of all autocomplete matches shown
diff --git a/components/search_engines/template_url_unittest.cc b/components/search_engines/template_url_unittest.cc
index 47a9048..4e34322b 100644
--- a/components/search_engines/template_url_unittest.cc
+++ b/components/search_engines/template_url_unittest.cc
@@ -850,17 +850,17 @@
 TEST_F(TemplateURLTest, ReplaceOmniboxFocusType) {
   struct TestData {
     const std::u16string search_term;
-    OmniboxFocusType focus_type;
+    metrics::OmniboxFocusType focus_type;
     const std::string url;
     const std::string expected_result;
   } test_data[] = {
-      {u"foo", OmniboxFocusType::DEFAULT,
+      {u"foo", metrics::OmniboxFocusType::INTERACTION_DEFAULT,
        "{google:baseURL}?{searchTerms}&{google:omniboxFocusType}",
        "http://www.google.com/?foo&"},
-      {u"foo", OmniboxFocusType::ON_FOCUS,
+      {u"foo", metrics::OmniboxFocusType::INTERACTION_FOCUS,
        "{google:baseURL}?{searchTerms}&{google:omniboxFocusType}",
        "http://www.google.com/?foo&oft=1&"},
-      {u"foo", OmniboxFocusType::DELETED_PERMANENT_TEXT,
+      {u"foo", metrics::OmniboxFocusType::INTERACTION_CLOBBER,
        "{google:baseURL}?{searchTerms}&{google:omniboxFocusType}",
        "http://www.google.com/?foo&oft=2&"},
   };
diff --git a/components/segmentation_platform/internal/data_collection/training_data_collector_impl.cc b/components/segmentation_platform/internal/data_collection/training_data_collector_impl.cc
index 6178fc4..5a4488a 100644
--- a/components/segmentation_platform/internal/data_collection/training_data_collector_impl.cc
+++ b/components/segmentation_platform/internal/data_collection/training_data_collector_impl.cc
@@ -106,15 +106,14 @@
   histogram_signal_handler_->AddObserver(this);
 
   DCHECK(segments);
-  const base::flat_set<SegmentId>& allowed_ids =
-      SegmentationUkmHelper::GetInstance()->allowed_segment_ids();
   for (const auto& segment : *segments) {
+    const proto::SegmentInfo& segment_info = segment.second;
+
     // Skip the segment if it is not in allowed list.
-    if (!allowed_ids.contains(static_cast<int>(segment.first))) {
+    if (!SegmentationUkmHelper::GetInstance()->CanUploadTensors(segment_info)) {
       continue;
     }
 
-    const proto::SegmentInfo& segment_info = segment.second;
     // Validate segment info.
     auto validation_result = metadata_utils::ValidateSegmentInfo(segment_info);
     if (validation_result !=
diff --git a/components/segmentation_platform/internal/execution/model_executor_impl.cc b/components/segmentation_platform/internal/execution/model_executor_impl.cc
index b752e72..bfb8d57f 100644
--- a/components/segmentation_platform/internal/execution/model_executor_impl.cc
+++ b/components/segmentation_platform/internal/execution/model_executor_impl.cc
@@ -64,6 +64,7 @@
   base::Time total_execution_start_time;
   base::Time model_execution_start_time;
   base::TimeDelta signal_storage_length;
+  bool upload_tensors;
 };
 
 ModelExecutorImpl::ModelExecutionTraceEvent::ModelExecutionTraceEvent(
@@ -125,6 +126,8 @@
       segment_info.model_metadata();
   state->signal_storage_length = model_metadata.signal_storage_length() *
                                  metadata_utils::GetTimeUnit(model_metadata);
+  state->upload_tensors =
+      SegmentationUkmHelper::GetInstance()->CanUploadTensors(segment_info);
   feature_list_query_processor_->ProcessFeatureList(
       segment_info.model_metadata(), request->input_context, segment_id,
       clock_->Now(), FeatureListQueryProcessor::ProcessOption::kInputsOnly,
@@ -184,9 +187,11 @@
     stats::RecordModelExecutionResult(state->segment_id, result.value());
     if (state->model_version && SegmentationUkmHelper::AllowedToUploadData(
                                     state->signal_storage_length, clock_)) {
-      SegmentationUkmHelper::GetInstance()->RecordModelExecutionResult(
-          state->segment_id, state->model_version, state->input_tensor,
-          result.value());
+      if (state->upload_tensors) {
+        SegmentationUkmHelper::GetInstance()->RecordModelExecutionResult(
+            state->segment_id, state->model_version, state->input_tensor,
+            result.value());
+      }
     }
     RunModelExecutionCallback(std::move(state), *result,
                               ModelExecutionStatus::kSuccess);
diff --git a/components/segmentation_platform/internal/execution/processing/custom_input_processor_unittest.cc b/components/segmentation_platform/internal/execution/processing/custom_input_processor_unittest.cc
index 6838f0f8..166fdba8 100644
--- a/components/segmentation_platform/internal/execution/processing/custom_input_processor_unittest.cc
+++ b/components/segmentation_platform/internal/execution/processing/custom_input_processor_unittest.cc
@@ -156,7 +156,7 @@
   expected_result[index] = {ProcessedValue(clock_.Now())};
   ExpectProcessedCustomInputsForSql<IndexType>(data, /*expected_error=*/false,
                                                expected_result);
-};
+}
 
 TEST_F(CustomInputProcessorTest, DefaultValueCustomInput) {
   // Create custom inputs data.
diff --git a/components/segmentation_platform/internal/segmentation_ukm_helper.cc b/components/segmentation_platform/internal/segmentation_ukm_helper.cc
index ab51818..324e752f 100644
--- a/components/segmentation_platform/internal/segmentation_ukm_helper.cc
+++ b/components/segmentation_platform/internal/segmentation_ukm_helper.cc
@@ -115,8 +115,9 @@
 
   // Add inputs to ukm message.
   if (!AddInputsToUkm(&execution_result, segment_id, model_version,
-                      input_tensor))
+                      input_tensor)) {
     return ukm::kInvalidSourceId;
+  }
 
   // TODO(xingliu): Also record continuous outputs for model execution.
   execution_result.SetPredictionResult(FloatToInt64(result))
@@ -162,9 +163,6 @@
     SegmentId segment_id,
     int64_t model_version,
     const std::vector<float>& input_tensor) {
-  if (!allowed_segment_ids_.contains(static_cast<int>(segment_id)))
-    return false;
-
   if (input_tensor.size() > ARRAY_SIZE(kSegmentationUkmInputMethods)) {
     // Don't record UKM if there are too many tensors.
     stats::RecordTooManyInputTensors(input_tensor.size());
@@ -202,6 +200,17 @@
   return true;
 }
 
+bool SegmentationUkmHelper::CanUploadTensors(
+    const proto::SegmentInfo& segment_info) const {
+  if (!base::FeatureList::IsEnabled(
+          features::kSegmentationStructuredMetricsFeature)) {
+    return false;
+  }
+  return segment_info.model_metadata().upload_tensors() ||
+         allowed_segment_ids_.contains(
+             static_cast<int>(segment_info.segment_id()));
+}
+
 // static
 int64_t SegmentationUkmHelper::FloatToInt64(float f) {
   // Encode the float number in IEEE754 double precision.
diff --git a/components/segmentation_platform/internal/segmentation_ukm_helper.h b/components/segmentation_platform/internal/segmentation_ukm_helper.h
index 80b2021..73f0ab4 100644
--- a/components/segmentation_platform/internal/segmentation_ukm_helper.h
+++ b/components/segmentation_platform/internal/segmentation_ukm_helper.h
@@ -59,6 +59,9 @@
       absl::optional<proto::PredictionResult> prediction_result,
       absl::optional<SelectedSegment> selected_segment);
 
+  // Returns whether a segment is allowed to upload training tensors.
+  bool CanUploadTensors(const proto::SegmentInfo& segment_info) const;
+
   // Helper method to encode a float number into int64.
   static int64_t FloatToInt64(float f);
 
diff --git a/components/segmentation_platform/internal/segmentation_ukm_helper_unittest.cc b/components/segmentation_platform/internal/segmentation_ukm_helper_unittest.cc
index faf59f9..51170dd 100644
--- a/components/segmentation_platform/internal/segmentation_ukm_helper_unittest.cc
+++ b/components/segmentation_platform/internal/segmentation_ukm_helper_unittest.cc
@@ -17,6 +17,7 @@
 #include "components/segmentation_platform/public/config.h"
 #include "components/segmentation_platform/public/features.h"
 #include "components/segmentation_platform/public/local_state_helper.h"
+#include "components/segmentation_platform/public/proto/segmentation_platform.pb.h"
 #include "components/segmentation_platform/public/segmentation_platform_service.h"
 #include "components/ukm/test_ukm_recorder.h"
 #include "services/metrics/public/cpp/ukm_builders.h"
@@ -50,6 +51,14 @@
   return result;
 }
 
+proto::SegmentInfo CreateTestSegmentInfo(proto::SegmentId segment_id,
+                                         bool upload_tensors) {
+  proto::SegmentInfo segment_info;
+  segment_info.set_segment_id(segment_id);
+  segment_info.mutable_model_metadata()->set_upload_tensors(upload_tensors);
+  return segment_info;
+}
+
 }  // namespace
 
 class SegmentationUkmHelperTest : public testing::Test {
@@ -163,24 +172,42 @@
                    });
 }
 
-// Tests that recording is disabled if kSegmentationStructuredMetricsFeature
-// is disabled.
+// Tests that tensor uploading is disabled if
+// kSegmentationStructuredMetricsFeature is disabled.
 TEST_F(SegmentationUkmHelperTest, TestDisabledStructuredMetrics) {
   DisableStructureMetrics();
-  std::vector<float> input_tensors = {0.1, 0.7, 0.8, 0.5};
-  SegmentationUkmHelper::GetInstance()->RecordModelExecutionResult(
-      proto::OPTIMIZATION_TARGET_SEGMENTATION_NEW_TAB, 101, input_tensors, 0.6);
-  ExpectEmptyUkmMetrics(Segmentation_ModelExecution::kEntryName);
+  proto::SegmentInfo segment_info = CreateTestSegmentInfo(
+      proto::OPTIMIZATION_TARGET_SEGMENTATION_NEW_TAB, true);
+  EXPECT_FALSE(
+      SegmentationUkmHelper::GetInstance()->CanUploadTensors(segment_info));
 }
 
-// Tests that recording is disabled for segment IDs that are not in the allowed
-// list.
+// Tests that tensor uploading is disabled for segment IDs that are not in the
+// allowed list.
 TEST_F(SegmentationUkmHelperTest, TestNotAllowedSegmentId) {
   InitializeAllowedSegmentIds("7, 8");
-  std::vector<float> input_tensors = {0.1, 0.7, 0.8, 0.5};
-  SegmentationUkmHelper::GetInstance()->RecordModelExecutionResult(
-      proto::OPTIMIZATION_TARGET_SEGMENTATION_NEW_TAB, 101, input_tensors, 0.6);
-  ExpectEmptyUkmMetrics(Segmentation_ModelExecution::kEntryName);
+  proto::SegmentInfo segment_info = CreateTestSegmentInfo(
+      proto::OPTIMIZATION_TARGET_SEGMENTATION_NEW_TAB, false);
+  EXPECT_FALSE(
+      SegmentationUkmHelper::GetInstance()->CanUploadTensors(segment_info));
+}
+
+// Tests that tensor uploading is enabled through finch param.
+TEST_F(SegmentationUkmHelperTest, TestUploadTensorsAllowedFromParam) {
+  InitializeAllowedSegmentIds("4, 7, 8");
+  proto::SegmentInfo segment_info = CreateTestSegmentInfo(
+      proto::OPTIMIZATION_TARGET_SEGMENTATION_NEW_TAB, false);
+  EXPECT_TRUE(
+      SegmentationUkmHelper::GetInstance()->CanUploadTensors(segment_info));
+}
+
+// Tests that tensor uploading is enabled through metadata.
+TEST_F(SegmentationUkmHelperTest, TestUploadTensorsAllowedFromMetadata) {
+  InitializeAllowedSegmentIds("7, 8");
+  proto::SegmentInfo segment_info = CreateTestSegmentInfo(
+      proto::OPTIMIZATION_TARGET_SEGMENTATION_NEW_TAB, true);
+  EXPECT_TRUE(
+      SegmentationUkmHelper::GetInstance()->CanUploadTensors(segment_info));
 }
 
 // Tests that float encoding works properly.
diff --git a/components/services/app_service/public/cpp/BUILD.gn b/components/services/app_service/public/cpp/BUILD.gn
index c8c405dc..8e7f68a 100644
--- a/components/services/app_service/public/cpp/BUILD.gn
+++ b/components/services/app_service/public/cpp/BUILD.gn
@@ -335,6 +335,7 @@
     "icon_coalescer_unittest.cc",
     "intent_filter_util_unittest.cc",
     "intent_util_unittest.cc",
+    "menu_unittest.cc",
     "preferred_apps_converter_unittest.cc",
     "preferred_apps_list_unittest.cc",
   ]
diff --git a/components/services/app_service/public/cpp/menu.cc b/components/services/app_service/public/cpp/menu.cc
index c2c2815..35078d7 100644
--- a/components/services/app_service/public/cpp/menu.cc
+++ b/components/services/app_service/public/cpp/menu.cc
@@ -15,6 +15,9 @@
 
 MenuItems::~MenuItems() = default;
 
+MenuItems::MenuItems(MenuItems&&) = default;
+MenuItems& MenuItems::operator=(MenuItems&&) = default;
+
 MenuType ConvertMojomMenuTypeToMenuType(apps::mojom::MenuType mojom_menu_type) {
   switch (mojom_menu_type) {
     case apps::mojom::MenuType::kAppList:
@@ -24,4 +27,106 @@
   }
 }
 
+MenuItemType ConvertMojomMenuItemTypeToMenuItemType(
+    apps::mojom::MenuItemType mojom_menu_item_type) {
+  switch (mojom_menu_item_type) {
+    case apps::mojom::MenuItemType::kCommand:
+      return MenuItemType::kCommand;
+    case apps::mojom::MenuItemType::kRadio:
+      return MenuItemType::kRadio;
+    case apps::mojom::MenuItemType::kSeparator:
+      return MenuItemType::kSeparator;
+    case apps::mojom::MenuItemType::kSubmenu:
+      return MenuItemType::kSubmenu;
+    case apps::mojom::MenuItemType::kPublisherCommand:
+      return MenuItemType::kPublisherCommand;
+  }
+}
+
+apps::mojom::MenuItemType ConvertMenuItemTypeToMojomMenuItemType(
+    MenuItemType menu_item_type) {
+  switch (menu_item_type) {
+    case MenuItemType::kCommand:
+      return apps::mojom::MenuItemType::kCommand;
+    case MenuItemType::kRadio:
+      return apps::mojom::MenuItemType::kRadio;
+    case MenuItemType::kSeparator:
+      return apps::mojom::MenuItemType::kSeparator;
+    case MenuItemType::kSubmenu:
+      return apps::mojom::MenuItemType::kSubmenu;
+    case MenuItemType::kPublisherCommand:
+      return apps::mojom::MenuItemType::kPublisherCommand;
+  }
+}
+
+MenuItemPtr ConvertMojomMenuItemToMenuItem(
+    const apps::mojom::MenuItemPtr& mojom_menu_item) {
+  if (!mojom_menu_item) {
+    return nullptr;
+  }
+
+  auto menu_item = std::make_unique<MenuItem>(
+      ConvertMojomMenuItemTypeToMenuItemType(mojom_menu_item->type),
+      mojom_menu_item->command_id);
+  menu_item->string_id = mojom_menu_item->string_id;
+
+  for (const auto& mojom_submenu : mojom_menu_item->submenu) {
+    menu_item->submenu.push_back(ConvertMojomMenuItemToMenuItem(mojom_submenu));
+  }
+
+  menu_item->radio_group_id = mojom_menu_item->radio_group_id;
+  menu_item->shortcut_id = mojom_menu_item->shortcut_id;
+  menu_item->label = mojom_menu_item->label;
+  menu_item->image = mojom_menu_item->image;
+
+  return menu_item;
+}
+
+apps::mojom::MenuItemPtr ConvertMenuItemToMojomMenuItem(
+    const MenuItemPtr& menu_item) {
+  if (!menu_item) {
+    return nullptr;
+  }
+
+  auto mojom_menu_item = apps::mojom::MenuItem::New();
+  mojom_menu_item->type =
+      ConvertMenuItemTypeToMojomMenuItemType(menu_item->type);
+  mojom_menu_item->command_id = menu_item->command_id;
+  mojom_menu_item->string_id = menu_item->string_id;
+
+  for (const auto& submenu : menu_item->submenu) {
+    mojom_menu_item->submenu.push_back(ConvertMenuItemToMojomMenuItem(submenu));
+  }
+
+  mojom_menu_item->radio_group_id = menu_item->radio_group_id;
+  mojom_menu_item->shortcut_id = menu_item->shortcut_id;
+  mojom_menu_item->label = menu_item->label;
+  mojom_menu_item->image = menu_item->image;
+
+  return mojom_menu_item;
+}
+
+MenuItems ConvertMojomMenuItemsToMenuItems(
+    const apps::mojom::MenuItemsPtr& mojom_menu_items) {
+  MenuItems menu_items;
+
+  if (!mojom_menu_items) {
+    return menu_items;
+  }
+
+  for (const auto& item : mojom_menu_items->items) {
+    menu_items.items.push_back(ConvertMojomMenuItemToMenuItem(item));
+  }
+  return menu_items;
+}
+
+apps::mojom::MenuItemsPtr ConvertMenuItemsToMojomMenuItems(
+    const MenuItems& menu_items) {
+  apps::mojom::MenuItemsPtr mojom_menu_items = apps::mojom::MenuItems::New();
+  for (const auto& item : menu_items.items) {
+    mojom_menu_items->items.push_back(ConvertMenuItemToMojomMenuItem(item));
+  }
+  return mojom_menu_items;
+}
+
 }  // namespace apps
diff --git a/components/services/app_service/public/cpp/menu.h b/components/services/app_service/public/cpp/menu.h
index eb56116..618cba6 100644
--- a/components/services/app_service/public/cpp/menu.h
+++ b/components/services/app_service/public/cpp/menu.h
@@ -84,6 +84,9 @@
   MenuItems& operator=(const MenuItems&) = delete;
   ~MenuItems();
 
+  MenuItems(MenuItems&&);
+  MenuItems& operator=(MenuItems&&);
+
   std::vector<MenuItemPtr> items;
 };
 
@@ -92,6 +95,30 @@
 COMPONENT_EXPORT(APP_TYPES)
 MenuType ConvertMojomMenuTypeToMenuType(apps::mojom::MenuType mojom_menu_type);
 
+COMPONENT_EXPORT(APP_TYPES)
+MenuItemType ConvertMojomMenuItemTypeToMenuItemType(
+    apps::mojom::MenuItemType mojom_menu_item_type);
+
+COMPONENT_EXPORT(APP_TYPES)
+apps::mojom::MenuItemType ConvertMenuItemTypeToMojomMenuItemType(
+    MenuItemType menu_item_type);
+
+COMPONENT_EXPORT(APP_TYPES)
+MenuItemPtr ConvertMojomMenuItemToMenuItem(
+    const apps::mojom::MenuItemPtr& mojom_menu_item);
+
+COMPONENT_EXPORT(APP_TYPES)
+apps::mojom::MenuItemPtr ConvertMenuItemToMojomMenuItem(
+    const MenuItemPtr& menu_item);
+
+COMPONENT_EXPORT(APP_TYPES)
+MenuItems ConvertMojomMenuItemsToMenuItems(
+    const apps::mojom::MenuItemsPtr& mojom_menu_items);
+
+COMPONENT_EXPORT(APP_TYPES)
+apps::mojom::MenuItemsPtr ConvertMenuItemsToMojomMenuItems(
+    const MenuItems& menu_item);
+
 }  // namespace apps
 
 #endif  // COMPONENTS_SERVICES_APP_SERVICE_PUBLIC_CPP_MENU_H_
diff --git a/components/services/app_service/public/cpp/menu_unittest.cc b/components/services/app_service/public/cpp/menu_unittest.cc
new file mode 100644
index 0000000..bf5bb6b
--- /dev/null
+++ b/components/services/app_service/public/cpp/menu_unittest.cc
@@ -0,0 +1,65 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/services/app_service/public/cpp/menu.h"
+
+#include "components/services/app_service/public/mojom/types.mojom.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace apps {
+
+using MenuTest = testing::Test;
+
+// TODO(crbug.com/1253250): Remove after migrating to non-mojo AppService.
+TEST_F(MenuTest, MojomConvert) {
+  apps::mojom::MenuItemPtr menu_item1 = apps::mojom::MenuItem::New();
+  menu_item1->type = apps::mojom::MenuItemType::kCommand;
+  menu_item1->command_id = 1;
+  menu_item1->string_id = 101;
+  menu_item1->radio_group_id = -1;
+  menu_item1->shortcut_id = "shortcut_id1";
+  menu_item1->label = "label1";
+
+  apps::mojom::MenuItemPtr menu_item2 = apps::mojom::MenuItem::New();
+  menu_item2->type = apps::mojom::MenuItemType::kSubmenu;
+  menu_item2->command_id = 2;
+
+  apps::mojom::MenuItemPtr menu_item3 = apps::mojom::MenuItem::New();
+  menu_item3->type = apps::mojom::MenuItemType::kRadio;
+  menu_item3->command_id = 3;
+  menu_item3->string_id = 103;
+  menu_item3->submenu.push_back(std::move(menu_item2));
+  menu_item3->radio_group_id = 0;
+  menu_item3->shortcut_id = "shortcut_id3";
+  menu_item3->label = "label3";
+
+  auto src_menu_items = mojom::MenuItems::New();
+  src_menu_items->items.push_back(std::move(menu_item1));
+  src_menu_items->items.push_back(std::move(menu_item3));
+
+  auto dst_menu_items = ConvertMenuItemsToMojomMenuItems(
+      ConvertMojomMenuItemsToMenuItems(src_menu_items));
+  EXPECT_EQ(2U, dst_menu_items->items.size());
+
+  EXPECT_EQ(apps::mojom::MenuItemType::kCommand,
+            dst_menu_items->items[0]->type);
+  EXPECT_EQ(1, dst_menu_items->items[0]->command_id);
+  EXPECT_EQ(101, dst_menu_items->items[0]->string_id);
+  EXPECT_EQ(-1, dst_menu_items->items[0]->radio_group_id);
+  EXPECT_EQ("shortcut_id1", dst_menu_items->items[0]->shortcut_id);
+  EXPECT_EQ("label1", dst_menu_items->items[0]->label);
+
+  EXPECT_EQ(apps::mojom::MenuItemType::kRadio, dst_menu_items->items[1]->type);
+  EXPECT_EQ(3, dst_menu_items->items[1]->command_id);
+  EXPECT_EQ(103, dst_menu_items->items[1]->string_id);
+  EXPECT_EQ(1U, dst_menu_items->items[1]->submenu.size());
+  EXPECT_EQ(apps::mojom::MenuItemType::kSubmenu,
+            dst_menu_items->items[1]->submenu[0]->type);
+  EXPECT_EQ(2, dst_menu_items->items[1]->submenu[0]->command_id);
+  EXPECT_EQ(0, dst_menu_items->items[1]->radio_group_id);
+  EXPECT_EQ("shortcut_id3", dst_menu_items->items[1]->shortcut_id);
+  EXPECT_EQ("label3", dst_menu_items->items[1]->label);
+}
+
+}  // namespace apps
diff --git a/components/url_param_filter/core/url_param_classifications_loader_unittest.cc b/components/url_param_filter/core/url_param_classifications_loader_unittest.cc
index 0461293..9cc7f02 100644
--- a/components/url_param_filter/core/url_param_classifications_loader_unittest.cc
+++ b/components/url_param_filter/core/url_param_classifications_loader_unittest.cc
@@ -145,7 +145,7 @@
       histogram_tester.GetTotalSum(kApplicableClassificationsDestinationMetric),
       1);
   histogram_tester.ExpectTotalCount(kApplicableClassificationsInvalidMetric, 0);
-};
+}
 
 TEST_F(UrlParamClassificationsLoaderTest,
        ReadClassifications_MatchTypeKeyCollision_NonExperimentalTagApplied) {
@@ -202,7 +202,7 @@
       histogram_tester.GetTotalSum(kApplicableClassificationsDestinationMetric),
       0);
   histogram_tester.ExpectTotalCount(kApplicableClassificationsInvalidMetric, 0);
-};
+}
 
 TEST_F(
     UrlParamClassificationsLoaderTest,
@@ -345,7 +345,7 @@
       histogram_tester.GetTotalSum(kApplicableClassificationsDestinationMetric),
       1);
   histogram_tester.ExpectTotalCount(kApplicableClassificationsInvalidMetric, 0);
-};
+}
 
 TEST_F(UrlParamClassificationsLoaderTest, ReadClassifications_OnlySources) {
   base::HistogramTester histogram_tester;
diff --git a/components/user_notes/browser/user_note_instance_unittest.cc b/components/user_notes/browser/user_note_instance_unittest.cc
index 55543c0..4f5278b 100644
--- a/components/user_notes/browser/user_note_instance_unittest.cc
+++ b/components/user_notes/browser/user_note_instance_unittest.cc
@@ -38,7 +38,7 @@
       : UserNoteInstance(model_ref, manager),
         attach_rect_(simulate_attach_rect) {}
 
-  const gfx::Rect& attach_rect() { return attach_rect_; };
+  const gfx::Rect& attach_rect() { return attach_rect_; }
 
   MOCK_METHOD(void, InitializeHighlightInternal, (), (override));
 
diff --git a/components/user_notes/browser/user_note_manager.h b/components/user_notes/browser/user_note_manager.h
index 46e55ed2a..51129eaf 100644
--- a/components/user_notes/browser/user_note_manager.h
+++ b/components/user_notes/browser/user_note_manager.h
@@ -38,7 +38,7 @@
 
   mojo::Remote<blink::mojom::AnnotationAgentContainer>& note_agent_container() {
     return note_agent_container_;
-  };
+  }
 
   // Returns the note instance for the given ID, or nullptr if this page does
   // not have an instance of that note.
diff --git a/components/viz/service/display/skia_renderer.cc b/components/viz/service/display/skia_renderer.cc
index 3695a612..45e5dcf 100644
--- a/components/viz/service/display/skia_renderer.cc
+++ b/components/viz/service/display/skia_renderer.cc
@@ -3147,6 +3147,44 @@
 }
 
 #if BUILDFLAG(IS_APPLE) || defined(USE_OZONE)
+SkiaRenderer::RenderPassBacking&
+SkiaRenderer::GetOrCreateRenderPassOverlayBacking(
+    AggregatedRenderPassId render_pass_id,
+    const AggregatedRenderPassDrawQuad* rpdq,
+    ResourceFormat buffer_format,
+    gfx::ColorSpace color_space,
+    gfx::Size buffer_size) {
+  auto it = std::find_if(available_render_pass_overlay_backings_.begin(),
+                         available_render_pass_overlay_backings_.end(),
+                         [&buffer_format, &buffer_size,
+                          &color_space](const RenderPassBacking& backing) {
+                           return backing.format == buffer_format &&
+                                  backing.size == buffer_size &&
+                                  backing.color_space == color_space;
+                         });
+
+  gpu::Mailbox mailbox;
+  if (it == available_render_pass_overlay_backings_.end()) {
+    // Allocate the image for render pass overlay if there is no existing
+    // available one.
+    constexpr auto kOverlayUsage = gpu::SHARED_IMAGE_USAGE_SCANOUT |
+                                   gpu::SHARED_IMAGE_USAGE_DISPLAY |
+                                   gpu::SHARED_IMAGE_USAGE_RASTER;
+    mailbox = skia_output_surface_->CreateSharedImage(
+        buffer_format, buffer_size, color_space, kOverlayUsage,
+        gpu::kNullSurfaceHandle);
+    in_flight_render_pass_overlay_backings_.push_back(
+        RenderPassBacking{buffer_size, /*generate_mipmap=*/false, color_space,
+                          buffer_format, mailbox, /*is_root=*/false});
+  } else {
+    mailbox = it->mailbox;
+    in_flight_render_pass_overlay_backings_.push_back(std::move(*it));
+    available_render_pass_overlay_backings_.erase(it);
+  }
+
+  return in_flight_render_pass_overlay_backings_.back();
+}
+
 void SkiaRenderer::PrepareRenderPassOverlay(
     OverlayProcessorInterface::PlatformOverlayCandidate* overlay) {
   DCHECK(!current_canvas_);
@@ -3289,41 +3327,17 @@
       cc::MathUtil::CheckedRoundUp(filter_bounds.width(), kBufferMultiple),
       cc::MathUtil::CheckedRoundUp(filter_bounds.height(), kBufferMultiple));
 
-  auto it = std::find_if(available_render_pass_overlay_backings_.begin(),
-                         available_render_pass_overlay_backings_.end(),
-                         [&buffer_format, &buffer_size,
-                          &color_space](const RenderPassBacking& backing) {
-                           return backing.format == buffer_format &&
-                                  backing.size == buffer_size &&
-                                  backing.color_space == color_space;
-                         });
-
-  if (it == available_render_pass_overlay_backings_.end()) {
-    // Allocate the image for render pass overlay if there is no existing
-    // available one.
-    constexpr auto kOverlayUsage = gpu::SHARED_IMAGE_USAGE_SCANOUT |
-                                   gpu::SHARED_IMAGE_USAGE_DISPLAY |
-                                   gpu::SHARED_IMAGE_USAGE_RASTER;
-    auto mailbox = skia_output_surface_->CreateSharedImage(
-        buffer_format, buffer_size, color_space, kOverlayUsage,
-        gpu::kNullSurfaceHandle);
-    in_flight_render_pass_overlay_backings_.push_back(
-        RenderPassBacking{buffer_size, /*generate_mipmap=*/false, color_space,
-                          buffer_format, mailbox, /*is_root=*/false});
-    overlay->mailbox = std::move(mailbox);
-  } else {
-    overlay->mailbox = std::move(it->mailbox);
-    in_flight_render_pass_overlay_backings_.push_back(std::move(*it));
-    available_render_pass_overlay_backings_.erase(it);
-  }
   const RenderPassBacking& dst_overlay_backing =
-      in_flight_render_pass_overlay_backings_.back();
+      GetOrCreateRenderPassOverlayBacking(
+          quad->render_pass_id, quad, buffer_format, color_space, buffer_size);
+
+  overlay->mailbox = dst_overlay_backing.mailbox;
 
   current_canvas_ = skia_output_surface_->BeginPaintRenderPass(
       quad->render_pass_id, dst_overlay_backing.size,
       dst_overlay_backing.format, /*mipmap=*/false,
-      RenderPassBackingSkColorSpace(dst_overlay_backing), /*is_overlay=*/true,
-      overlay->mailbox);
+      RenderPassBackingSkColorSpace(dst_overlay_backing),
+      /*is_overlay=*/true, overlay->mailbox);
   if (!current_canvas_) {
     DLOG(ERROR)
         << "BeginPaintRenderPass() in PrepareRenderPassOverlay() failed.";
@@ -3366,9 +3380,10 @@
       return;
     }
 
-    if (src_quad_backing->generate_mipmap)
+    if (src_quad_backing->generate_mipmap) {
       params.sampling =
           SkSamplingOptions(SkFilterMode::kLinear, SkMipmapMode::kLinear);
+    }
 
     params.vis_tex_coords = cc::MathUtil::ScaleRectProportional(
         quad->tex_coord_rect, gfx::RectF(quad->rect), params.visible_rect);
@@ -3379,7 +3394,6 @@
     DrawSingleImage(content_image.get(), valid_texel_bounds, &rpdq_params,
                     &paint, &params);
   }
-
   current_canvas_ = nullptr;
 
   EndPaint(/*failed=*/false);
diff --git a/components/viz/service/display/skia_renderer.h b/components/viz/service/display/skia_renderer.h
index 6a985db..5fbb87b 100644
--- a/components/viz/service/display/skia_renderer.h
+++ b/components/viz/service/display/skia_renderer.h
@@ -265,7 +265,24 @@
   // be sent to GPU scheduler.
   void FlushOutputSurface();
 
+  // A map from RenderPass id to the texture used to draw the RenderPass from.
+  struct RenderPassBacking {
+    gfx::Size size;
+    bool generate_mipmap;
+    gfx::ColorSpace color_space;
+    ResourceFormat format;
+    gpu::Mailbox mailbox;
+    bool is_root;
+  };
+
 #if BUILDFLAG(IS_APPLE) || defined(USE_OZONE)
+  RenderPassBacking& GetOrCreateRenderPassOverlayBacking(
+      AggregatedRenderPassId render_pass_id,
+      const AggregatedRenderPassDrawQuad* rpdq,
+      ResourceFormat buffer_format,
+      gfx::ColorSpace color_space,
+      gfx::Size buffer_size);
+
   void PrepareRenderPassOverlay(
       OverlayProcessorInterface::PlatformOverlayCandidate* overlay);
 #endif
@@ -279,15 +296,6 @@
     return static_cast<DisplayResourceProviderSkia*>(resource_provider_);
   }
 
-  // A map from RenderPass id to the texture used to draw the RenderPass from.
-  struct RenderPassBacking {
-    gfx::Size size;
-    bool generate_mipmap;
-    gfx::ColorSpace color_space;
-    ResourceFormat format;
-    gpu::Mailbox mailbox;
-    bool is_root;
-  };
   base::flat_map<AggregatedRenderPassId, RenderPassBacking>
       render_pass_backings_;
   sk_sp<SkColorSpace> RenderPassBackingSkColorSpace(
diff --git a/components/web_cache/browser/web_cache_manager.cc b/components/web_cache/browser/web_cache_manager.cc
index 7eb41d56..e8bd17c 100644
--- a/components/web_cache/browser/web_cache_manager.cc
+++ b/components/web_cache/browser/web_cache_manager.cc
@@ -27,7 +27,7 @@
 
 constexpr uint64_t kNoCapacitySet = std::numeric_limits<uint64_t>::max();
 
-WebCacheManager::WebCacheInfo::WebCacheInfo() : last_capacity(kNoCapacitySet){};
+WebCacheManager::WebCacheInfo::WebCacheInfo() : last_capacity(kNoCapacitySet) {}
 WebCacheManager::WebCacheInfo::~WebCacheInfo() = default;
 
 static const int kReviseAllocationDelayMS = 200;
diff --git a/components/web_package/shared_file.cc b/components/web_package/shared_file.cc
index f5911cba..5c95b35 100644
--- a/components/web_package/shared_file.cc
+++ b/components/web_package/shared_file.cc
@@ -82,7 +82,7 @@
       (std::numeric_limits<int64_t>::max() < max_offset)) {
     error_ = MOJO_RESULT_INVALID_ARGUMENT;
   }
-};
+}
 
 SharedFile::SharedFileDataSource::~SharedFileDataSource() = default;
 
diff --git a/components/web_package/test_support/signed_web_bundles/web_bundle_signer.cc b/components/web_package/test_support/signed_web_bundles/web_bundle_signer.cc
index d87f077..29920ef 100644
--- a/components/web_package/test_support/signed_web_bundles/web_bundle_signer.cc
+++ b/components/web_package/test_support/signed_web_bundles/web_bundle_signer.cc
@@ -134,7 +134,7 @@
 WebBundleSigner::KeyPair::KeyPair(base::span<const uint8_t> public_key,
                                   base::span<const uint8_t> private_key)
     : public_key(public_key.begin(), public_key.end()),
-      private_key(private_key.begin(), private_key.end()){};
+      private_key(private_key.begin(), private_key.end()) {}
 
 WebBundleSigner::KeyPair::KeyPair(const WebBundleSigner::KeyPair& other) =
     default;
diff --git a/components/webapps/browser/installable/installable_manager.cc b/components/webapps/browser/installable/installable_manager.cc
index 8af8c3d6..51f8f40 100644
--- a/components/webapps/browser/installable/installable_manager.cc
+++ b/components/webapps/browser/installable/installable_manager.cc
@@ -608,7 +608,7 @@
             webapps::features::kDesktopPWAsDetailedInstallDialog)) {
       CheckAndFetchScreenshots();
     } else {
-      CheckAndFetchScreenshots(/*check_platform=*/false);
+      CheckAndFetchScreenshots(/*check_form_factor=*/false);
     }
   } else if (params.has_worker && !worker_->fetched) {
     CheckServiceWorker();
@@ -894,7 +894,7 @@
   WorkOnTask();
 }
 
-void InstallableManager::CheckAndFetchScreenshots(bool check_platform) {
+void InstallableManager::CheckAndFetchScreenshots(bool check_form_factor) {
   DCHECK(!blink::IsEmptyManifest(manifest()));
   DCHECK(!is_screenshots_fetch_complete_);
 
@@ -904,11 +904,13 @@
 
   for (const auto& url : manifest().screenshots) {
 #if BUILDFLAG(IS_ANDROID)
-    auto reject_platform = blink::mojom::ManifestScreenshot::Platform::kWide;
+    auto reject_form_factor =
+        blink::mojom::ManifestScreenshot::FormFactor::kWide;
 #else
-    auto reject_platform = blink::mojom::ManifestScreenshot::Platform::kNarrow;
+    auto reject_form_factor =
+        blink::mojom::ManifestScreenshot::FormFactor::kNarrow;
 #endif  // BUILDFLAG(IS_ANDROID)
-    if (check_platform && url->platform == reject_platform)
+    if (check_form_factor && url->form_factor == reject_form_factor)
       continue;
 
     if (++num_of_screenshots > kMaximumNumOfScreenshots)
@@ -939,10 +941,10 @@
 
   if (!screenshots_downloading_) {
     // If there is no screenshot that matches all the criteria, populate again
-    // without checking platform to fallback to screenshots with mismatching
-    // platform instead of showing nothing.
-    if (screenshots_.size() == 0 && check_platform) {
-      CheckAndFetchScreenshots(/*check_platform=*/false);
+    // without checking form_factor to fallback to screenshots with mismatching
+    // form_factor instead of showing nothing.
+    if (screenshots_.size() == 0 && check_form_factor) {
+      CheckAndFetchScreenshots(/*check_form_factor=*/false);
     } else {
       is_screenshots_fetch_complete_ = true;
       WorkOnTask();
diff --git a/components/webapps/browser/installable/installable_manager.h b/components/webapps/browser/installable/installable_manager.h
index 12f21edc..e5094c4 100644
--- a/components/webapps/browser/installable/installable_manager.h
+++ b/components/webapps/browser/installable/installable_manager.h
@@ -241,10 +241,10 @@
                              IconUsage usage);
   void OnIconFetched(GURL icon_url, IconUsage usage, const SkBitmap& bitmap);
 
-  void CheckAndFetchScreenshots(bool check_platform = true);
+  void CheckAndFetchScreenshots(bool check_form_factor = true);
 
   void OnScreenshotFetched(GURL screenshot_url, const SkBitmap& bitmap);
-  void PopulateScreenshots(bool check_platform);
+  void PopulateScreenshots(bool check_form_factor);
 
   // content::ServiceWorkerContextObserver overrides
   void OnRegistrationCompleted(const GURL& pattern) override;
diff --git a/content/browser/accessibility/accessibility_tree_formatter_blink.cc b/content/browser/accessibility/accessibility_tree_formatter_blink.cc
index b3b6faac..b123d41 100644
--- a/content/browser/accessibility/accessibility_tree_formatter_blink.cc
+++ b/content/browser/accessibility/accessibility_tree_formatter_blink.cc
@@ -559,7 +559,7 @@
         if (ui::IsNodeIdIntListAttribute(attr)) {
           ui::AXTreeID tree_id = node.tree()->GetAXTreeID();
           ui::AXNode* target =
-              ui::AXTreeManager::FromID(tree_id)->GetNodeFromTree(node.id());
+              ui::AXTreeManager::FromID(tree_id)->GetNode(node.id());
 
           if (target)
             value_list.Append(ui::ToString(target->GetRole()));
diff --git a/content/browser/accessibility/browser_accessibility_manager.cc b/content/browser/accessibility/browser_accessibility_manager.cc
index b1c4ad4..236cae3e 100644
--- a/content/browser/accessibility/browser_accessibility_manager.cc
+++ b/content/browser/accessibility/browser_accessibility_manager.cc
@@ -1679,12 +1679,7 @@
     const ui::AXNodeID node_id) const {
   auto* manager = BrowserAccessibilityManager::FromID(tree_id);
   CHECK(manager);
-  return manager->GetNodeFromTree(node_id);
-}
-
-ui::AXNode* BrowserAccessibilityManager::GetNodeFromTree(
-    const ui::AXNodeID node_id) const {
-  return ax_tree()->GetFromId(node_id);
+  return manager->GetNode(node_id);
 }
 
 ui::AXPlatformNode* BrowserAccessibilityManager::GetPlatformNodeFromTree(
@@ -1721,7 +1716,7 @@
       << "Multiple nodes cannot claim the same child tree ID.";
 
   ui::AXNode* parent_node =
-      parent_manager->GetNodeFromTree(*(host_node_ids.begin()));
+      parent_manager->GetNode(*(host_node_ids.begin()));
   DCHECK(parent_node);
   DCHECK_EQ(ax_tree_id_,
             ui::AXTreeID::FromString(parent_node->GetStringAttribute(
diff --git a/content/browser/accessibility/browser_accessibility_manager.h b/content/browser/accessibility/browser_accessibility_manager.h
index 73f2bf1..1e6624a 100644
--- a/content/browser/accessibility/browser_accessibility_manager.h
+++ b/content/browser/accessibility/browser_accessibility_manager.h
@@ -485,7 +485,6 @@
   // AXTreeManager overrides.
   ui::AXNode* GetNodeFromTree(const ui::AXTreeID& tree_id,
                               ui::AXNodeID node_id) const override;
-  ui::AXNode* GetNodeFromTree(ui::AXNodeID node_id) const override;
   ui::AXPlatformNode* GetPlatformNodeFromTree(
       const ui::AXNodeID node_id) const override;
   ui::AXPlatformNode* GetPlatformNodeFromTree(const ui::AXNode&) const override;
diff --git a/content/browser/attribution_reporting/attribution_host_unittest.cc b/content/browser/attribution_reporting/attribution_host_unittest.cc
index 32749a6..1d207dd 100644
--- a/content/browser/attribution_reporting/attribution_host_unittest.cc
+++ b/content/browser/attribution_reporting/attribution_host_unittest.cc
@@ -14,7 +14,6 @@
 #include "content/browser/attribution_reporting/attribution_test_utils.h"
 #include "content/browser/storage_partition_impl.h"
 #include "content/browser/web_contents/web_contents_impl.h"
-#include "content/public/common/content_client.h"
 #include "content/public/test/test_renderer_host.h"
 #include "content/public/test/test_utils.h"
 #include "content/test/navigation_simulator_impl.h"
@@ -44,11 +43,7 @@
 
 namespace {
 
-using ConversionMeasurementOperation =
-    ::content::ContentBrowserClient::ConversionMeasurementOperation;
-
 using testing::_;
-using testing::Mock;
 using testing::Return;
 
 const char kConversionUrl[] = "https://b.com";
diff --git a/content/browser/attribution_reporting/attribution_internals_browsertest.cc b/content/browser/attribution_reporting/attribution_internals_browsertest.cc
index a4fc2a2..bd73b96 100644
--- a/content/browser/attribution_reporting/attribution_internals_browsertest.cc
+++ b/content/browser/attribution_reporting/attribution_internals_browsertest.cc
@@ -189,8 +189,8 @@
                        DisabledByEmbedder_MeasurementConsideredDisabled) {
   MockAttributionReportingContentBrowserClient browser_client;
   EXPECT_CALL(browser_client,
-              IsConversionMeasurementOperationAllowed(
-                  _, ContentBrowserClient::ConversionMeasurementOperation::kAny,
+              IsAttributionReportingOperationAllowed(
+                  _, ContentBrowserClient::AttributionReportingOperation::kAny,
                   IsNull(), IsNull(), IsNull()))
       .WillRepeatedly(Return(false));
   ScopedContentBrowserClientSetting setting(&browser_client);
diff --git a/content/browser/attribution_reporting/attribution_internals_handler_impl.cc b/content/browser/attribution_reporting/attribution_internals_handler_impl.cc
index 356379a5..59a341e 100644
--- a/content/browser/attribution_reporting/attribution_internals_handler_impl.cc
+++ b/content/browser/attribution_reporting/attribution_internals_handler_impl.cc
@@ -186,10 +186,10 @@
   content::WebContents* contents = web_ui_->GetWebContents();
   bool attribution_reporting_enabled =
       AttributionManager::FromWebContents(contents) &&
-      GetContentClient()->browser()->IsConversionMeasurementOperationAllowed(
+      GetContentClient()->browser()->IsAttributionReportingOperationAllowed(
           contents->GetBrowserContext(),
-          ContentBrowserClient::ConversionMeasurementOperation::kAny,
-          /*impression_origin=*/nullptr, /*conversion_origin=*/nullptr,
+          ContentBrowserClient::AttributionReportingOperation::kAny,
+          /*source_origin=*/nullptr, /*destination_origin=*/nullptr,
           /*reporting_origin=*/nullptr);
   bool debug_mode = base::CommandLine::ForCurrentProcess()->HasSwitch(
       switches::kAttributionReportingDebugMode);
diff --git a/content/browser/attribution_reporting/attribution_manager_impl.cc b/content/browser/attribution_reporting/attribution_manager_impl.cc
index b324a44c..6f733eea 100644
--- a/content/browser/attribution_reporting/attribution_manager_impl.cc
+++ b/content/browser/attribution_reporting/attribution_manager_impl.cc
@@ -104,8 +104,8 @@
     attribution_storage_.AsyncCall(&AttributionStorage::GetNextReportTime)
         .WithArgs(now)
         .Then(std::move(callback));
-  };
-  void OnReportingTimeReached(base::Time now) override { send_reports_.Run(); };
+  }
+  void OnReportingTimeReached(base::Time now) override { send_reports_.Run(); }
   void AdjustOfflineReportTimes(
       base::OnceCallback<void(absl::optional<base::Time>)> maybe_set_timer_cb)
       override {
@@ -116,7 +116,7 @@
     attribution_storage_
         .AsyncCall(&AttributionStorage::AdjustOfflineReportTimes)
         .Then(std::move(maybe_set_timer_cb));
-  };
+  }
 
   base::RepeatingClosure send_reports_;
   base::SequenceBound<AttributionStorage>& attribution_storage_;
@@ -248,12 +248,12 @@
 
 bool IsOperationAllowed(
     StoragePartitionImpl* storage_partition,
-    ContentBrowserClient::ConversionMeasurementOperation operation,
+    ContentBrowserClient::AttributionReportingOperation operation,
     const url::Origin* source_origin,
     const url::Origin* destination_origin,
     const url::Origin* reporting_origin) {
   DCHECK(storage_partition);
-  return GetContentClient()->browser()->IsConversionMeasurementOperationAllowed(
+  return GetContentClient()->browser()->IsAttributionReportingOperationAllowed(
       storage_partition->browser_context(), operation, source_origin,
       destination_origin, reporting_origin);
 }
@@ -301,7 +301,7 @@
       report.attribution_info().source.common_info();
   return IsOperationAllowed(
       storage_partition_.get(),
-      ContentBrowserClient::ConversionMeasurementOperation::kReport,
+      ContentBrowserClient::AttributionReportingOperation::kReport,
       &common_info.source_origin(), &common_info.destination_origin(),
       &common_info.reporting_origin());
 }
@@ -509,7 +509,7 @@
 
       bool allowed = IsOperationAllowed(
           manager->storage_partition_.get(),
-          ContentBrowserClient::ConversionMeasurementOperation::kImpression,
+          ContentBrowserClient::AttributionReportingOperation::kSource,
           &common_info.source_origin(),
           /*destination_origin=*/nullptr, &common_info.reporting_origin());
       RecordRegisterImpressionAllowed(allowed);
@@ -530,7 +530,7 @@
     void operator()(AttributionTrigger trigger) {
       bool allowed = IsOperationAllowed(
           manager->storage_partition_.get(),
-          ContentBrowserClient::ConversionMeasurementOperation::kConversion,
+          ContentBrowserClient::AttributionReportingOperation::kTrigger,
           /*source_origin=*/nullptr, &trigger.destination_origin(),
           &trigger.reporting_origin());
       RecordRegisterConversionAllowed(allowed);
diff --git a/content/browser/attribution_reporting/attribution_manager_impl_unittest.cc b/content/browser/attribution_reporting/attribution_manager_impl_unittest.cc
index 273e7e5..68ed6b72 100644
--- a/content/browser/attribution_reporting/attribution_manager_impl_unittest.cc
+++ b/content/browser/attribution_reporting/attribution_manager_impl_unittest.cc
@@ -1220,8 +1220,8 @@
   MockAttributionReportingContentBrowserClient browser_client;
   EXPECT_CALL(
       browser_client,
-      IsConversionMeasurementOperationAllowed(
-          _, ContentBrowserClient::ConversionMeasurementOperation::kImpression,
+      IsAttributionReportingOperationAllowed(
+          _, ContentBrowserClient::AttributionReportingOperation::kSource,
           Pointee(url::Origin::Create(GURL("https://impression.test/"))),
           IsNull(), Pointee(url::Origin::Create(GURL("https://report.test/")))))
       .WillOnce(Return(false));
@@ -1258,14 +1258,14 @@
   MockAttributionReportingContentBrowserClient browser_client;
   EXPECT_CALL(
       browser_client,
-      IsConversionMeasurementOperationAllowed(
-          _, ContentBrowserClient::ConversionMeasurementOperation::kImpression,
-          _, _, _))
+      IsAttributionReportingOperationAllowed(
+          _, ContentBrowserClient::AttributionReportingOperation::kSource, _, _,
+          _))
       .WillRepeatedly(Return(true));
   EXPECT_CALL(
       browser_client,
-      IsConversionMeasurementOperationAllowed(
-          _, ContentBrowserClient::ConversionMeasurementOperation::kConversion,
+      IsAttributionReportingOperationAllowed(
+          _, ContentBrowserClient::AttributionReportingOperation::kTrigger,
           IsNull(),
           Pointee(url::Origin::Create(GURL("https://sub.conversion.test/"))),
           Pointee(url::Origin::Create(GURL("https://report.test/")))))
@@ -1287,18 +1287,16 @@
   MockAttributionReportingContentBrowserClient browser_client;
   EXPECT_CALL(
       browser_client,
-      IsConversionMeasurementOperationAllowed(
+      IsAttributionReportingOperationAllowed(
           _,
-          AnyOf(
-              ContentBrowserClient::ConversionMeasurementOperation::kImpression,
-              ContentBrowserClient::ConversionMeasurementOperation::
-                  kConversion),
+          AnyOf(ContentBrowserClient::AttributionReportingOperation::kSource,
+                ContentBrowserClient::AttributionReportingOperation::kTrigger),
           _, _, _))
       .WillRepeatedly(Return(true));
   EXPECT_CALL(
       browser_client,
-      IsConversionMeasurementOperationAllowed(
-          _, ContentBrowserClient::ConversionMeasurementOperation::kReport,
+      IsAttributionReportingOperationAllowed(
+          _, ContentBrowserClient::AttributionReportingOperation::kReport,
           Pointee(url::Origin::Create(GURL("https://impression.test/"))),
           Pointee(url::Origin::Create(GURL("https://sub.conversion.test/"))),
           Pointee(url::Origin::Create(GURL("https://report.test/")))))
@@ -1341,18 +1339,16 @@
   MockAttributionReportingContentBrowserClient browser_client;
   EXPECT_CALL(
       browser_client,
-      IsConversionMeasurementOperationAllowed(
+      IsAttributionReportingOperationAllowed(
           _,
-          AnyOf(
-              ContentBrowserClient::ConversionMeasurementOperation::kImpression,
-              ContentBrowserClient::ConversionMeasurementOperation::
-                  kConversion),
+          AnyOf(ContentBrowserClient::AttributionReportingOperation::kSource,
+                ContentBrowserClient::AttributionReportingOperation::kTrigger),
           _, _, _))
       .WillRepeatedly(Return(true));
   EXPECT_CALL(
       browser_client,
-      IsConversionMeasurementOperationAllowed(
-          _, ContentBrowserClient::ConversionMeasurementOperation::kReport,
+      IsAttributionReportingOperationAllowed(
+          _, ContentBrowserClient::AttributionReportingOperation::kReport,
           Pointee(source_origin), Pointee(destination_origin),
           Pointee(reporting_origin)))
       .WillOnce(Return(false));
diff --git a/content/browser/attribution_reporting/attribution_test_utils.h b/content/browser/attribution_reporting/attribution_test_utils.h
index 186ea62c..0c51420 100644
--- a/content/browser/attribution_reporting/attribution_test_utils.h
+++ b/content/browser/attribution_reporting/attribution_test_utils.h
@@ -82,11 +82,11 @@
 
   // ContentBrowserClient:
   MOCK_METHOD(bool,
-              IsConversionMeasurementOperationAllowed,
+              IsAttributionReportingOperationAllowed,
               (content::BrowserContext * browser_context,
-               ConversionMeasurementOperation operation,
-               const url::Origin* impression_origin,
-               const url::Origin* conversion_origin,
+               AttributionReportingOperation operation,
+               const url::Origin* source_origin,
+               const url::Origin* destination_origin,
                const url::Origin* reporting_origin),
               (override));
 };
diff --git a/content/browser/blob_storage/blob_internals_url_loader.cc b/content/browser/blob_storage/blob_internals_url_loader.cc
index 16ece0c..f447726 100644
--- a/content/browser/blob_storage/blob_internals_url_loader.cc
+++ b/content/browser/blob_storage/blob_internals_url_loader.cc
@@ -36,9 +36,9 @@
   void* buffer = nullptr;
   uint32_t num_bytes = output.size();
   MojoResult result = producer_handle->BeginWriteData(
-      &buffer, &num_bytes, MOJO_WRITE_DATA_FLAG_NONE);
+      &buffer, &num_bytes, MOJO_BEGIN_WRITE_DATA_FLAG_ALL_OR_NONE);
   CHECK_EQ(result, MOJO_RESULT_OK);
-  CHECK_EQ(num_bytes, output.size());
+  CHECK_GE(num_bytes, output.size());
 
   memcpy(buffer, output.c_str(), output.size());
   result = producer_handle->EndWriteData(num_bytes);
diff --git a/content/browser/bluetooth/web_bluetooth_service_impl_unittest.cc b/content/browser/bluetooth/web_bluetooth_service_impl_unittest.cc
index d44ffe1..75a72452 100644
--- a/content/browser/bluetooth/web_bluetooth_service_impl_unittest.cc
+++ b/content/browser/bluetooth/web_bluetooth_service_impl_unittest.cc
@@ -299,7 +299,7 @@
       PairingKind pairing_kind,
       const absl::optional<std::u16string>& pin) override {
     std::move(callback).Run(PairPromptResult(PairPromptStatus::kCancelled));
-  };
+  }
 
   blink::WebBluetoothDeviceId GetWebBluetoothDeviceId(
       RenderFrameHost* frame,
diff --git a/content/browser/browser_plugin/browser_plugin_guest.cc b/content/browser/browser_plugin/browser_plugin_guest.cc
index 7cbc2d88..aa5fac11 100644
--- a/content/browser/browser_plugin/browser_plugin_guest.cc
+++ b/content/browser/browser_plugin/browser_plugin_guest.cc
@@ -60,12 +60,13 @@
   InitInternal(owner_web_contents);
 }
 
-WebContentsImpl* BrowserPluginGuest::CreateNewGuestWindow(
+std::unique_ptr<WebContentsImpl> BrowserPluginGuest::CreateNewGuestWindow(
     const WebContents::CreateParams& params) {
-  WebContentsImpl* new_contents =
-      static_cast<WebContentsImpl*>(delegate_->CreateNewGuestWindow(params));
+  std::unique_ptr<WebContents> new_contents =
+      delegate_->CreateNewGuestWindow(params);
   DCHECK(new_contents);
-  return new_contents;
+  return base::WrapUnique(
+      static_cast<WebContentsImpl*>(new_contents.release()));
 }
 
 void BrowserPluginGuest::InitInternal(WebContentsImpl* owner_web_contents) {
diff --git a/content/browser/browser_plugin/browser_plugin_guest.h b/content/browser/browser_plugin/browser_plugin_guest.h
index 066c66c..4dcb038 100644
--- a/content/browser/browser_plugin/browser_plugin_guest.h
+++ b/content/browser/browser_plugin/browser_plugin_guest.h
@@ -84,7 +84,7 @@
 
   // Creates a new guest WebContentsImpl with the provided |params| with |this|
   // as the |opener|.
-  WebContentsImpl* CreateNewGuestWindow(
+  std::unique_ptr<WebContentsImpl> CreateNewGuestWindow(
       const WebContents::CreateParams& params);
 
   // WebContentsObserver implementation.
diff --git a/content/browser/child_process_launcher.cc b/content/browser/child_process_launcher.cc
index 42043c8..0661614 100644
--- a/content/browser/child_process_launcher.cc
+++ b/content/browser/child_process_launcher.cc
@@ -27,6 +27,33 @@
 
 namespace content {
 
+namespace {
+
+#if !BUILDFLAG(IS_ANDROID)
+// Returns the cumulative CPU usage for the specified process.
+base::TimeDelta GetCPUUsage(base::ProcessHandle process_handle) {
+#if BUILDFLAG(IS_MAC)
+  std::unique_ptr<base::ProcessMetrics> process_metrics =
+      base::ProcessMetrics::CreateProcessMetrics(
+          process_handle, ChildProcessTaskPortProvider::GetInstance());
+#else
+  std::unique_ptr<base::ProcessMetrics> process_metrics =
+      base::ProcessMetrics::CreateProcessMetrics(process_handle);
+#endif
+
+#if BUILDFLAG(IS_WIN)
+  // Use the precise version which is Windows specific.
+  // TODO(pmonette): Clean up this code when the precise version becomes the
+  //                 default.
+  return process_metrics->GetPreciseCumulativeCPUUsage();
+#else
+  return process_metrics->GetCumulativeCPUUsage();
+#endif
+}
+#endif  // !BUILDFLAG(IS_ANDROID)
+
+}  // namespace
+
 using internal::ChildProcessLauncherHelper;
 
 void ChildProcessLauncherPriority::WriteIntoTrace(
@@ -160,8 +187,19 @@
     return termination_info_;
   }
 
+#if !BUILDFLAG(IS_ANDROID)
+  auto cpu_usage = GetCPUUsage(process_.process.Handle());
+#endif
+
   termination_info_ = helper_->GetTerminationInfo(process_, known_dead);
 
+#if !BUILDFLAG(IS_ANDROID)
+  // Get the cumulative CPU usage. This needs to be done before closing the
+  // process handle (on Windows) or reaping the zombie process (on MacOS, Linux,
+  // ChromeOS).
+  termination_info_.cpu_usage = cpu_usage;
+#endif
+
   // POSIX: If the process crashed, then the kernel closed the socket for it and
   // so the child has already died by the time we get here. Since
   // GetTerminationInfo called waitpid with WNOHANG, it'll reap the process.
diff --git a/content/browser/devtools/web_contents_devtools_agent_host.cc b/content/browser/devtools/web_contents_devtools_agent_host.cc
index 331e0df..e80cfd96 100644
--- a/content/browser/devtools/web_contents_devtools_agent_host.cc
+++ b/content/browser/devtools/web_contents_devtools_agent_host.cc
@@ -132,7 +132,7 @@
   if (DevToolsAgentHost* host = GetPrimaryFrameAgent())
     return host->GetOpenerId();
   return "";
-};
+}
 
 std::string WebContentsDevToolsAgentHost::GetOpenerFrameId() {
   if (DevToolsAgentHost* host = GetPrimaryFrameAgent())
diff --git a/content/browser/direct_sockets/direct_sockets_tcp_browsertest.cc b/content/browser/direct_sockets/direct_sockets_tcp_browsertest.cc
index 019a1dc..6fa31a0 100644
--- a/content/browser/direct_sockets/direct_sockets_tcp_browsertest.cc
+++ b/content/browser/direct_sockets/direct_sockets_tcp_browsertest.cc
@@ -157,7 +157,8 @@
       DCHECK(send_stream_.is_valid());
       DCHECK_LT(bytes_sent_, required_send_bytes_);
       void* buffer = nullptr;
-      uint32_t num_bytes = 0;
+      uint32_t num_bytes =
+          static_cast<uint32_t>(required_send_bytes_ - bytes_sent_);
       MojoResult mojo_result = send_stream_->BeginWriteData(
           &buffer, &num_bytes, MOJO_WRITE_DATA_FLAG_NONE);
       if (mojo_result == MOJO_RESULT_SHOULD_WAIT) {
diff --git a/content/browser/interest_group/interest_group_priority_util.h b/content/browser/interest_group/interest_group_priority_util.h
index fd80faa..83359e6 100644
--- a/content/browser/interest_group/interest_group_priority_util.h
+++ b/content/browser/interest_group/interest_group_priority_util.h
@@ -14,7 +14,7 @@
 namespace blink {
 struct AuctionConfig;
 struct InterestGroup;
-};  // namespace blink
+}  // namespace blink
 
 namespace content {
 
diff --git a/content/browser/loader/navigation_url_loader_impl.cc b/content/browser/loader/navigation_url_loader_impl.cc
index 4f8967e5..033c273 100644
--- a/content/browser/loader/navigation_url_loader_impl.cc
+++ b/content/browser/loader/navigation_url_loader_impl.cc
@@ -893,12 +893,8 @@
     const std::vector<WebPluginInfo>& plugins) {
   bool stale;
   WebPluginInfo plugin;
-  FrameTreeNode* frame_tree_node =
-      FrameTreeNode::GloballyFindByID(frame_tree_node_id_);
-  int render_process_id =
-      frame_tree_node->current_frame_host()->GetProcess()->GetID();
   bool has_plugin = PluginService::GetInstance()->GetPluginInfo(
-      render_process_id, resource_request_->url, head->mime_type,
+      browser_context_, resource_request_->url, head->mime_type,
       /*allow_wildcard=*/false, &stale, &plugin, nullptr);
 
   if (stale) {
diff --git a/content/browser/mojo_sandbox_browsertest.cc b/content/browser/mojo_sandbox_browsertest.cc
index f5d2e7b..3942a75 100644
--- a/content/browser/mojo_sandbox_browsertest.cc
+++ b/content/browser/mojo_sandbox_browsertest.cc
@@ -54,7 +54,7 @@
 
   mojo::Remote<mojom::TestService> BindTestService() {
     mojo::Remote<mojom::TestService> test_service;
-    host_->GetChildProcess()->BindReceiver(
+    host_->GetChildProcess()->BindServiceInterface(
         test_service.BindNewPipeAndPassReceiver());
     return test_service;
   }
diff --git a/content/browser/plugin_service_impl.cc b/content/browser/plugin_service_impl.cc
index fabe096..7f41c14a 100644
--- a/content/browser/plugin_service_impl.cc
+++ b/content/browser/plugin_service_impl.cc
@@ -199,7 +199,7 @@
       url, mime_type, allow_wildcard, plugins, actual_mime_types);
 }
 
-bool PluginServiceImpl::GetPluginInfo(int render_process_id,
+bool PluginServiceImpl::GetPluginInfo(content::BrowserContext* browser_context,
                                       const GURL& url,
                                       const std::string& mime_type,
                                       bool allow_wildcard,
@@ -209,13 +209,14 @@
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   std::vector<WebPluginInfo> plugins;
   std::vector<std::string> mime_types;
-  bool stale = GetPluginInfoArray(
-      url, mime_type, allow_wildcard, &plugins, &mime_types);
+
+  bool stale =
+      GetPluginInfoArray(url, mime_type, allow_wildcard, &plugins, &mime_types);
   if (is_stale)
     *is_stale = stale;
 
   for (size_t i = 0; i < plugins.size(); ++i) {
-    if (!filter_ || filter_->IsPluginAvailable(render_process_id, plugins[i])) {
+    if (!filter_ || filter_->IsPluginAvailable(browser_context, plugins[i])) {
       *info = plugins[i];
       if (actual_mime_type)
         *actual_mime_type = mime_types[i];
diff --git a/content/browser/plugin_service_impl.h b/content/browser/plugin_service_impl.h
index 51413954..a41b6578 100644
--- a/content/browser/plugin_service_impl.h
+++ b/content/browser/plugin_service_impl.h
@@ -51,7 +51,7 @@
                           bool allow_wildcard,
                           std::vector<WebPluginInfo>* info,
                           std::vector<std::string>* actual_mime_types) override;
-  bool GetPluginInfo(int render_process_id,
+  bool GetPluginInfo(content::BrowserContext* browser_context,
                      const GURL& url,
                      const std::string& mime_type,
                      bool allow_wildcard,
diff --git a/content/browser/reduce_accept_language/reduce_accept_language_utils_unittest.cc b/content/browser/reduce_accept_language/reduce_accept_language_utils_unittest.cc
index 385bb6e5..21f89b7 100644
--- a/content/browser/reduce_accept_language/reduce_accept_language_utils_unittest.cc
+++ b/content/browser/reduce_accept_language/reduce_accept_language_utils_unittest.cc
@@ -42,7 +42,7 @@
   return TestRenderFrameHost::CreateStubAssociatedInterfaceProviderReceiver();
 }
 
-};  // namespace
+}  // namespace
 
 class AcceptLanguageUtilsTests : public RenderViewHostImplTestHarness {
  public:
diff --git a/content/browser/renderer_host/media/media_stream_manager_unittest.cc b/content/browser/renderer_host/media/media_stream_manager_unittest.cc
index da4dfc1..9401c9f4 100644
--- a/content/browser/renderer_host/media/media_stream_manager_unittest.cc
+++ b/content/browser/renderer_host/media/media_stream_manager_unittest.cc
@@ -173,7 +173,7 @@
 class ScreenEnumeratorMock : public media::ScreenEnumerator {
  public:
   explicit ScreenEnumeratorMock(const size_t* screen_count)
-      : screen_count_(screen_count){};
+      : screen_count_(screen_count) {}
   ~ScreenEnumeratorMock() override = default;
 
   void EnumerateScreens(
diff --git a/content/browser/renderer_host/pending_beacon_host.cc b/content/browser/renderer_host/pending_beacon_host.cc
index 636b0dc..e3ffe589 100644
--- a/content/browser/renderer_host/pending_beacon_host.cc
+++ b/content/browser/renderer_host/pending_beacon_host.cc
@@ -168,6 +168,6 @@
   }
 
   return request;
-};
+}
 
 }  // namespace content
diff --git a/content/browser/renderer_host/plugin_registry_impl.cc b/content/browser/renderer_host/plugin_registry_impl.cc
index c223f45..18873e85 100644
--- a/content/browser/renderer_host/plugin_registry_impl.cc
+++ b/content/browser/renderer_host/plugin_registry_impl.cc
@@ -68,7 +68,8 @@
           rph->GetBrowserContext());
 
   for (const auto& plugin : all_plugins) {
-    if (!filter || filter->IsPluginAvailable(render_process_id_, plugin)) {
+    if (!filter ||
+        filter->IsPluginAvailable(rph->GetBrowserContext(), plugin)) {
       auto plugin_blink = blink::mojom::PluginInfo::New();
       plugin_blink->name = plugin.name;
       plugin_blink->description = plugin.desc;
diff --git a/content/browser/renderer_host/render_frame_host_impl.cc b/content/browser/renderer_host/render_frame_host_impl.cc
index 38e6b7b..cc2f15ec 100644
--- a/content/browser/renderer_host/render_frame_host_impl.cc
+++ b/content/browser/renderer_host/render_frame_host_impl.cc
@@ -13992,7 +13992,7 @@
   WebPluginInfo info;
   std::string actual_mime_type;
   bool found = PluginServiceImpl::GetInstance()->GetPluginInfo(
-      GetProcess()->GetID(), url, mime_type, allow_wildcard, nullptr, &info,
+      GetBrowserContext(), url, mime_type, allow_wildcard, nullptr, &info,
       &actual_mime_type);
   std::move(callback).Run(found, info, actual_mime_type);
 }
diff --git a/content/browser/security_exploit_browsertest.cc b/content/browser/security_exploit_browsertest.cc
index d7155ee9..0458fef 100644
--- a/content/browser/security_exploit_browsertest.cc
+++ b/content/browser/security_exploit_browsertest.cc
@@ -2035,6 +2035,7 @@
   GURL main_frame_url(https_server()->GetURL("a.test", "/simple_page.html"));
   std::vector<GURL> invalid_urls = {
       GURL("http://example.com"),
+      GURL("http://example.com?<\n=block"),
       GURL("about:srcdoc"),
       GURL("data:text/html,<p>foo"),
       GURL("blob:https://example.com/a9400bf5-aaa8-4166-86e4-492c50f4ca2b"),
diff --git a/content/browser/utility_process_host_browsertest.cc b/content/browser/utility_process_host_browsertest.cc
index 6f47e7e7..42d802a0 100644
--- a/content/browser/utility_process_host_browsertest.cc
+++ b/content/browser/utility_process_host_browsertest.cc
@@ -77,7 +77,7 @@
 #endif
     EXPECT_TRUE(host->Start());
 
-    host->GetChildProcess()->BindReceiver(
+    host->GetChildProcess()->BindServiceInterface(
         service_.BindNewPipeAndPassReceiver());
     if (crash) {
       service_->DoCrashImmediately(
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc
index 0103773b..718d135 100644
--- a/content/browser/web_contents/web_contents_impl.cc
+++ b/content/browser/web_contents/web_contents_impl.cc
@@ -4007,8 +4007,7 @@
     create_params.context = view_->GetNativeView();
     new_contents = WebContentsImpl::Create(create_params);
   } else {
-    new_contents = base::WrapUnique(static_cast<WebContentsImpl*>(
-        GetBrowserPluginGuest()->CreateNewGuestWindow(create_params)));
+    new_contents = GetBrowserPluginGuest()->CreateNewGuestWindow(create_params);
   }
   auto* new_contents_impl = new_contents.get();
 
diff --git a/content/browser/webui/web_ui_browsertest.cc b/content/browser/webui/web_ui_browsertest.cc
index 21547f6d6..89a0f8f9 100644
--- a/content/browser/webui/web_ui_browsertest.cc
+++ b/content/browser/webui/web_ui_browsertest.cc
@@ -488,7 +488,7 @@
         ~Controller() override { web_contents.reset(); }
       };
       return std::make_unique<Controller>(web_ui);
-    };
+    }
   };
 
   content::WebUIConfigMap::GetInstance().AddUntrustedWebUIConfig(
diff --git a/content/common/main_frame_counter.cc b/content/common/main_frame_counter.cc
index 08a19b9..9d2de1d 100644
--- a/content/common/main_frame_counter.cc
+++ b/content/common/main_frame_counter.cc
@@ -27,4 +27,4 @@
   main_frame_count_--;
 }
 
-};  // namespace content
+}  // namespace content
diff --git a/content/public/browser/browser_plugin_guest_delegate.cc b/content/public/browser/browser_plugin_guest_delegate.cc
index b3b270f..e28920a 100644
--- a/content/public/browser/browser_plugin_guest_delegate.cc
+++ b/content/public/browser/browser_plugin_guest_delegate.cc
@@ -6,7 +6,7 @@
 
 namespace content {
 
-WebContents* BrowserPluginGuestDelegate::CreateNewGuestWindow(
+std::unique_ptr<WebContents> BrowserPluginGuestDelegate::CreateNewGuestWindow(
     const WebContents::CreateParams& create_params) {
   NOTREACHED();
   return nullptr;
diff --git a/content/public/browser/browser_plugin_guest_delegate.h b/content/public/browser/browser_plugin_guest_delegate.h
index 4051e90..5830f50 100644
--- a/content/public/browser/browser_plugin_guest_delegate.h
+++ b/content/public/browser/browser_plugin_guest_delegate.h
@@ -18,7 +18,7 @@
  public:
   virtual ~BrowserPluginGuestDelegate() {}
 
-  virtual WebContents* CreateNewGuestWindow(
+  virtual std::unique_ptr<WebContents> CreateNewGuestWindow(
       const WebContents::CreateParams& create_params);
 
   // Returns the WebContents that currently owns this guest.
diff --git a/content/public/browser/child_process_termination_info.h b/content/public/browser/child_process_termination_info.h
index e74de37..abfe0101 100644
--- a/content/public/browser/child_process_termination_info.h
+++ b/content/public/browser/child_process_termination_info.h
@@ -67,6 +67,11 @@
   // The LastError if there was a failure to launch the process.
   DWORD last_error;
 #endif
+
+#if !BUILDFLAG(IS_ANDROID)
+  // The cumulative CPU usage of this process.
+  base::TimeDelta cpu_usage;
+#endif
 };
 
 }  // namespace content
diff --git a/content/public/browser/content_browser_client.cc b/content/public/browser/content_browser_client.cc
index 2722ee6..52ae8f7 100644
--- a/content/public/browser/content_browser_client.cc
+++ b/content/public/browser/content_browser_client.cc
@@ -494,11 +494,11 @@
   return false;
 }
 
-bool ContentBrowserClient::IsConversionMeasurementOperationAllowed(
+bool ContentBrowserClient::IsAttributionReportingOperationAllowed(
     content::BrowserContext* browser_context,
-    ConversionMeasurementOperation operation,
-    const url::Origin* impression_origin,
-    const url::Origin* conversion_origin,
+    AttributionReportingOperation operation,
+    const url::Origin* source_origin,
+    const url::Origin* destination_origin,
     const url::Origin* reporting_origin) {
   return true;
 }
diff --git a/content/public/browser/content_browser_client.h b/content/public/browser/content_browser_client.h
index 3f07e771..1fc23ba 100644
--- a/content/public/browser/content_browser_client.h
+++ b/content/public/browser/content_browser_client.h
@@ -842,29 +842,29 @@
       const url::Origin& top_frame_origin,
       const url::Origin& api_origin);
 
-  enum class ConversionMeasurementOperation {
-    kImpression,
-    kConversion,
+  enum class AttributionReportingOperation {
+    kSource,
+    kTrigger,
     kReport,
     kAny,
   };
 
-  // Allows the embedder to control if conversion measurement API operations can
+  // Allows the embedder to control if Attribution Reporting API operations can
   // happen in a given context. Origins must be provided for a given operation
   // as follows:
-  //   - `kImpression` must provide a non-null `impression_origin` and
+  //   - `kSource` must provide a non-null `source_origin` and
   //   `reporting_origin`
-  //   - `kConversion` must provide a non-null `conversion_origin` and
+  //   - `kTrigger` must provide a non-null `destination_origin` and
   //   `reporting_origin`
   //   - `kReport` must provide all non-null origins
   //   - `kAny` may provide all null origins. It checks whether conversion
   //   measurement is allowed anywhere in `browser_context`, returning false if
-  //   conversion measurement is not allowed by default on any origin.
-  virtual bool IsConversionMeasurementOperationAllowed(
+  //   Attribution Reporting is not allowed by default on any origin.
+  virtual bool IsAttributionReportingOperationAllowed(
       content::BrowserContext* browser_context,
-      ConversionMeasurementOperation operation,
-      const url::Origin* impression_origin,
-      const url::Origin* conversion_origin,
+      AttributionReportingOperation operation,
+      const url::Origin* source_origin,
+      const url::Origin* destination_origin,
       const url::Origin* reporting_origin);
 
   // Allows the embedder to control if Shared Storage API operations can happen
diff --git a/content/public/browser/plugin_service.h b/content/public/browser/plugin_service.h
index 16df90b..ad33618 100644
--- a/content/public/browser/plugin_service.h
+++ b/content/public/browser/plugin_service.h
@@ -68,10 +68,10 @@
       std::vector<std::string>* actual_mime_types) = 0;
 
   // Gets plugin info for an individual plugin and filters the plugins using
-  // the |context| and renderer IDs. This will report whether the data is stale
-  // via |is_stale| and returns whether or not the plugin can be found.
-  // This must be called from the UI thread.
-  virtual bool GetPluginInfo(int render_process_id,
+  // the |browser_context|. This will report whether the data is stale via
+  // |is_stale| and returns whether or not the plugin can be found. This must be
+  // called from the UI thread.
+  virtual bool GetPluginInfo(content::BrowserContext* browser_context,
                              const GURL& url,
                              const std::string& mime_type,
                              bool allow_wildcard,
diff --git a/content/public/browser/plugin_service_filter.h b/content/public/browser/plugin_service_filter.h
index 8730ea5..548d8501 100644
--- a/content/public/browser/plugin_service_filter.h
+++ b/content/public/browser/plugin_service_filter.h
@@ -10,6 +10,7 @@
 }
 
 namespace content {
+class BrowserContext;
 struct WebPluginInfo;
 
 // Callback class to let the client filter the list of all installed plugins
@@ -21,7 +22,7 @@
 
   // Whether `plugin` is available. The client can return false to hide the
   // plugin. The result may be cached, and should be consistent between calls.
-  virtual bool IsPluginAvailable(int render_process_id,
+  virtual bool IsPluginAvailable(content::BrowserContext* browser_context,
                                  const WebPluginInfo& plugin) = 0;
 
   // Whether the renderer has permission to load available `plugin`.
diff --git a/content/public/test/browser_test_base.cc b/content/public/test/browser_test_base.cc
index 0521a8f..bb2781f 100644
--- a/content/public/test/browser_test_base.cc
+++ b/content/public/test/browser_test_base.cc
@@ -276,6 +276,7 @@
 #elif BUILDFLAG(IS_MAC)
   ui::test::EventGeneratorDelegate::SetFactoryFunction(
       base::BindRepeating(&views::test::CreateEventGeneratorDelegateMac));
+  EnableNativeWindowActivation();
 #endif
 }
 
diff --git a/content/public/test/browser_test_base.h b/content/public/test/browser_test_base.h
index c91fdc83..3411c1ff 100644
--- a/content/public/test/browser_test_base.h
+++ b/content/public/test/browser_test_base.h
@@ -78,7 +78,7 @@
   virtual bool UseProductionQuotaSettings();
 
   // This is invoked if the test receives SIGTERM or SIGSEGV.
-  virtual void SignalRunTestOnMainThread(int signal){};
+  virtual void SignalRunTestOnMainThread(int signal) {}
 
   // Crash the Network Service process. Should only be called when
   // out-of-process Network Service is enabled. Re-applies any added host
diff --git a/content/public/test/browser_test_utils.h b/content/public/test/browser_test_utils.h
index 5c6d2d3..5c7793a1 100644
--- a/content/public/test/browser_test_utils.h
+++ b/content/public/test/browser_test_utils.h
@@ -2293,6 +2293,13 @@
 [[nodiscard]] bool HistoryGoBack(WebContents* wc);
 [[nodiscard]] bool HistoryGoForward(WebContents* wc);
 
+#if BUILDFLAG(IS_MAC)
+// Grant native windows the ability to activate, allowing them to become key
+// and/or main. This can be useful to enable when the process hosting the window
+// is a standalone executable without an Info.plist.
+bool EnableNativeWindowActivation();
+#endif  // BUILDFLAG(IS_MAC)
+
 }  // namespace content
 
 #endif  // CONTENT_PUBLIC_TEST_BROWSER_TEST_UTILS_H_
diff --git a/content/public/test/browser_test_utils_mac.mm b/content/public/test/browser_test_utils_mac.mm
new file mode 100644
index 0000000..fabd386
--- /dev/null
+++ b/content/public/test/browser_test_utils_mac.mm
@@ -0,0 +1,24 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/public/test/browser_test_utils.h"
+
+#import <AppKit/AppKit.h>
+
+namespace content {
+
+bool EnableNativeWindowActivation() {
+  // Do not downgrade the activation policy.
+  if (NSApp.activationPolicy > NSApplicationActivationPolicyProhibited) {
+    return true;
+  }
+
+  // NSApplicationActivationPolicyAccessory is the least permissive policy that
+  // still allows for programmatic activation.
+  return [NSApp setActivationPolicy:NSApplicationActivationPolicyAccessory]
+             ? true
+             : false;
+}
+
+}  // namespace content
diff --git a/content/shell/browser/shell_plugin_service_filter.cc b/content/shell/browser/shell_plugin_service_filter.cc
index d69331e..fcf394d 100644
--- a/content/shell/browser/shell_plugin_service_filter.cc
+++ b/content/shell/browser/shell_plugin_service_filter.cc
@@ -12,8 +12,9 @@
 
 ShellPluginServiceFilter::~ShellPluginServiceFilter() = default;
 
-bool ShellPluginServiceFilter::IsPluginAvailable(int render_process_id,
-                                                 const WebPluginInfo& plugin) {
+bool ShellPluginServiceFilter::IsPluginAvailable(
+    content::BrowserContext* browser_context,
+    const WebPluginInfo& plugin) {
   return plugin.name == u"Blink Test Plugin" ||
          plugin.name == u"Blink Deprecated Test Plugin" ||
          plugin.name == u"WebKit Test PlugIn";
diff --git a/content/shell/browser/shell_plugin_service_filter.h b/content/shell/browser/shell_plugin_service_filter.h
index fd6bfe9..f4f9c18 100644
--- a/content/shell/browser/shell_plugin_service_filter.h
+++ b/content/shell/browser/shell_plugin_service_filter.h
@@ -19,7 +19,7 @@
   ~ShellPluginServiceFilter() override;
 
   // PluginServiceFilter implementation.
-  bool IsPluginAvailable(int render_process_id,
+  bool IsPluginAvailable(content::BrowserContext* browser_context,
                          const WebPluginInfo& plugin) override;
 
   bool CanLoadPlugin(int render_process_id,
diff --git a/content/shell/common/main_frame_counter_test_impl.cc b/content/shell/common/main_frame_counter_test_impl.cc
index fb557f1..cfef311 100644
--- a/content/shell/common/main_frame_counter_test_impl.cc
+++ b/content/shell/common/main_frame_counter_test_impl.cc
@@ -27,4 +27,4 @@
   std::move(callback).Run(MainFrameCounter::has_main_frame());
 }
 
-};  // namespace content
+}  // namespace content
diff --git a/content/shell/common/main_frame_counter_test_impl.h b/content/shell/common/main_frame_counter_test_impl.h
index 0ab65b7..a8bee99 100644
--- a/content/shell/common/main_frame_counter_test_impl.h
+++ b/content/shell/common/main_frame_counter_test_impl.h
@@ -22,6 +22,6 @@
   mojo::Receiver<mojom::MainFrameCounterTest> receiver_{this};
 };
 
-};  // namespace content
+}  // namespace content
 
 #endif  // CONTENT_SHELL_COMMON_MAIN_FRAME_COUNTER_TEST_IMPL_H_
diff --git a/content/shell/utility/shell_content_utility_client.cc b/content/shell/utility/shell_content_utility_client.cc
index 030ddf9..1818675 100644
--- a/content/shell/utility/shell_content_utility_client.cc
+++ b/content/shell/utility/shell_content_utility_client.cc
@@ -26,6 +26,7 @@
 #include "content/shell/common/power_monitor_test_impl.h"
 #include "mojo/public/cpp/bindings/binder_map.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/receiver.h"
 #include "mojo/public/cpp/bindings/self_owned_receiver.h"
 #include "mojo/public/cpp/bindings/service_factory.h"
 #include "mojo/public/cpp/system/buffer.h"
@@ -42,14 +43,15 @@
 
 class TestUtilityServiceImpl : public mojom::TestService {
  public:
-  static void Create(mojo::PendingReceiver<mojom::TestService> receiver) {
-    mojo::MakeSelfOwnedReceiver(base::WrapUnique(new TestUtilityServiceImpl),
-                                std::move(receiver));
-  }
+  explicit TestUtilityServiceImpl(
+      mojo::PendingReceiver<mojom::TestService> receiver)
+      : receiver_(this, std::move(receiver)) {}
 
   TestUtilityServiceImpl(const TestUtilityServiceImpl&) = delete;
   TestUtilityServiceImpl& operator=(const TestUtilityServiceImpl&) = delete;
 
+  ~TestUtilityServiceImpl() override = default;
+
   // mojom::TestService implementation:
   void DoSomething(DoSomethingCallback callback) override {
     std::move(callback).Run();
@@ -113,9 +115,13 @@
   }
 
  private:
-  TestUtilityServiceImpl() = default;
+  mojo::Receiver<mojom::TestService> receiver_;
 };
 
+auto RunTestService(mojo::PendingReceiver<mojom::TestService> receiver) {
+  return std::make_unique<TestUtilityServiceImpl>(std::move(receiver));
+}
+
 auto RunEchoService(mojo::PendingReceiver<echo::mojom::EchoService> receiver) {
   return std::make_unique<echo::EchoService>(std::move(receiver));
 }
@@ -137,9 +143,6 @@
 
 void ShellContentUtilityClient::ExposeInterfacesToBrowser(
     mojo::BinderMap* binders) {
-  binders->Add<mojom::TestService>(
-      base::BindRepeating(&TestUtilityServiceImpl::Create),
-      base::ThreadTaskRunnerHandle::Get());
   binders->Add<mojom::PowerMonitorTest>(
       base::BindRepeating(&PowerMonitorTestImpl::MakeSelfOwnedReceiver),
       base::ThreadTaskRunnerHandle::Get());
@@ -155,6 +158,7 @@
 
 void ShellContentUtilityClient::RegisterIOThreadServices(
     mojo::ServiceFactory& services) {
+  services.Add(RunTestService);
   services.Add(RunEchoService);
 }
 
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn
index 70072a0..597d4fa2 100644
--- a/content/test/BUILD.gn
+++ b/content/test/BUILD.gn
@@ -695,6 +695,7 @@
     sources += [
       "../browser/renderer_host/test_render_widget_host_view_mac_factory.h",
       "../browser/renderer_host/test_render_widget_host_view_mac_factory.mm",
+      "../public/test/browser_test_utils_mac.mm",
       "../public/test/text_input_test_utils_mac.mm",
     ]
     deps += [
diff --git a/device/bluetooth/floss/bluetooth_adapter_floss.cc b/device/bluetooth/floss/bluetooth_adapter_floss.cc
index b705d7e7..7dd5d40 100644
--- a/device/bluetooth/floss/bluetooth_adapter_floss.cc
+++ b/device/bluetooth/floss/bluetooth_adapter_floss.cc
@@ -9,6 +9,7 @@
 #include "base/location.h"
 #include "base/logging.h"
 #include "base/memory/ptr_util.h"
+#include "base/metrics/histogram_macros.h"
 #include "base/notreached.h"
 #include "base/observer_list.h"
 #include "base/task/single_thread_task_runner.h"
@@ -22,6 +23,11 @@
 #include "device/bluetooth/floss/floss_socket_manager.h"
 #include "device/bluetooth/public/cpp/bluetooth_address.h"
 
+#if BUILDFLAG(IS_CHROMEOS)
+#include "device/bluetooth/chromeos/bluetooth_connection_logger.h"
+#include "device/bluetooth/chromeos/bluetooth_utils.h"
+#endif
+
 namespace floss {
 
 namespace {
@@ -468,6 +474,34 @@
   }
 }
 
+void BluetoothAdapterFloss::NotifyDeviceConnectedStateChanged(
+    BluetoothDeviceFloss* device,
+    bool is_now_connected) {
+  DCHECK_EQ(device->IsConnected(), is_now_connected);
+
+#if BUILDFLAG(IS_CHROMEOS)
+  if (is_now_connected) {
+    device::BluetoothConnectionLogger::RecordDeviceConnected(
+        device->GetIdentifier(), device->GetDeviceType());
+  } else {
+    device::RecordDeviceDisconnect(device->GetDeviceType());
+  }
+
+  // Also log the total number of connected devices. This uses a sampled
+  // histogram rather than a enumeration.
+  int count = 0;
+  for (auto& [address, device] : devices_) {
+    if (device->IsPaired() && device->IsConnected()) {
+      count++;
+    }
+  }
+
+  UMA_HISTOGRAM_COUNTS_100("Bluetooth.ConnectedDeviceCount", count);
+#endif
+
+  BluetoothAdapter::NotifyDeviceConnectedStateChanged(device, is_now_connected);
+}
+
 // Observers
 
 void BluetoothAdapterFloss::AdapterPresent(int adapter, bool present) {
@@ -571,8 +605,8 @@
     BluetoothDeviceFloss* found_ptr = static_cast<BluetoothDeviceFloss*>(
         GetDevice(device_floss->GetAddress()));
 
-    // Only remove devices from devices_ that are not paired
-    if (!found_ptr || !found_ptr->IsPaired()) {
+    // Only remove devices from devices_ that are not paired or connected.
+    if (!found_ptr || (!found_ptr->IsPaired() && !found_ptr->IsConnected())) {
       devices_.erase(canonical_address);
     }
 
@@ -662,6 +696,11 @@
     LOG(ERROR) << "Received BondStateChanged with error status = " << status;
     // TODO(b/192289534): Record status in UMA.
     device->TriggerConnectCallback(BtifStatusToConnectErrorCode(status));
+
+    // Since we're no longer bonded, also remove this from found list.
+    if (bond_state == FlossAdapterClient::BondState::kNotBonded) {
+      AdapterClearedDevice(remote_device);
+    }
     return;
   }
 
@@ -669,8 +708,13 @@
   NotifyDeviceChanged(device);
   NotifyDevicePairedChanged(device, device->IsPaired());
 
-  if (bond_state == FlossAdapterClient::BondState::kBonded)
+  if (bond_state == FlossAdapterClient::BondState::kBonded) {
     device->ConnectAllEnabledProfiles();
+  } else if (bond_state == FlossAdapterClient::BondState::kNotBonded) {
+    // If we're no longer bonded (or paired/connected), we should clear the
+    // device so it doesn't show up in found devices list.
+    AdapterClearedDevice(remote_device);
+  }
 }
 
 void BluetoothAdapterFloss::AdapterDeviceConnected(
diff --git a/device/bluetooth/floss/bluetooth_adapter_floss.h b/device/bluetooth/floss/bluetooth_adapter_floss.h
index 49242e8..39f0f1f4 100644
--- a/device/bluetooth/floss/bluetooth_adapter_floss.h
+++ b/device/bluetooth/floss/bluetooth_adapter_floss.h
@@ -29,6 +29,8 @@
 
 namespace floss {
 
+class BluetoothDeviceFloss;
+
 // The BluetoothAdapterFloss class implements BluetoothAdapter for platforms
 // that use Floss, a dbus front-end for the Fluoride Bluetooth stack.
 //
@@ -164,6 +166,10 @@
   void PresentChanged(bool present);
   void NotifyAdapterPoweredChanged(bool powered);
 
+  // Announce to observers that |device| has changed its connected state.
+  void NotifyDeviceConnectedStateChanged(BluetoothDeviceFloss* device,
+                                         bool is_now_connected);
+
   // Observers
   // floss::FlossManagerClient::Observer override.
   void AdapterPresent(int adapter, bool present) override;
diff --git a/device/bluetooth/floss/bluetooth_device_floss.cc b/device/bluetooth/floss/bluetooth_device_floss.cc
index 303a0b7..07feea5e 100644
--- a/device/bluetooth/floss/bluetooth_device_floss.cc
+++ b/device/bluetooth/floss/bluetooth_device_floss.cc
@@ -18,6 +18,10 @@
 #include "device/bluetooth/floss/floss_dbus_manager.h"
 #include "device/bluetooth/floss/floss_socket_manager.h"
 
+#if BUILDFLAG(IS_CHROMEOS)
+#include "device/bluetooth/chromeos/bluetooth_utils.h"
+#endif
+
 namespace floss {
 
 namespace {
@@ -33,13 +37,17 @@
 }
 
 void OnRemoveBond(base::OnceClosure callback, DBusResult<bool> ret) {
-  if (ret.has_value() && !*ret) {
+  if (!ret.has_value()) {
+    BLUETOOTH_LOG(ERROR) << "Failed to remove bond: " << ret.error();
+  } else if (!*ret) {
     BLUETOOTH_LOG(ERROR) << "RemoveBond returned failure";
   }
 
-  if (!ret.has_value()) {
-    BLUETOOTH_LOG(ERROR) << "Failed to remove bond: " << ret.error();
-  }
+#if BUILDFLAG(IS_CHROMEOS)
+  bool success = ret.has_value() && *ret;
+  device::RecordForgetResult(success ? device::ForgetResult::kSuccess
+                                     : device::ForgetResult::kFailure);
+#endif
 
   std::move(callback).Run();
 }
@@ -406,55 +414,6 @@
   return bond_state_ == FlossAdapterClient::BondState::kBonded;
 }
 
-void BluetoothDeviceFloss::ConnectInternal(ConnectCallback callback) {
-  NOTIMPLEMENTED();
-}
-
-void BluetoothDeviceFloss::OnConnect(ConnectCallback callback) {
-  NOTIMPLEMENTED();
-}
-
-void BluetoothDeviceFloss::OnConnectError(ConnectCallback callback,
-                                          const Error& error) {
-  NOTIMPLEMENTED();
-}
-
-void BluetoothDeviceFloss::OnPairDuringConnect(ConnectCallback callback) {
-  NOTIMPLEMENTED();
-}
-
-void BluetoothDeviceFloss::OnPairDuringConnectError(ConnectCallback callback,
-                                                    const Error& error) {
-  NOTIMPLEMENTED();
-}
-
-void BluetoothDeviceFloss::OnDisconnect(base::OnceClosure callback) {
-  NOTIMPLEMENTED();
-}
-
-void BluetoothDeviceFloss::OnDisconnectError(ErrorCallback error_callback,
-                                             const Error& error) {
-  NOTIMPLEMENTED();
-}
-
-void BluetoothDeviceFloss::OnPair(ConnectCallback callback) {
-  NOTIMPLEMENTED();
-}
-
-void BluetoothDeviceFloss::OnPairError(ConnectCallback callback,
-                                       const Error& error) {
-  NOTIMPLEMENTED();
-}
-
-void BluetoothDeviceFloss::OnCancelPairingError(const Error& error) {
-  NOTIMPLEMENTED();
-}
-
-void BluetoothDeviceFloss::OnForgetError(ErrorCallback error_callback,
-                                         const Error& error) {
-  NOTIMPLEMENTED();
-}
-
 void BluetoothDeviceFloss::OnGetRemoteType(
     DBusResult<FlossAdapterClient::BluetoothDeviceType> ret) {
   if (!ret.has_value()) {
@@ -520,12 +479,23 @@
     ErrorCallback error_callback,
     DBusResult<Void> ret) {
   if (!ret.has_value()) {
+#if BUILDFLAG(IS_CHROMEOS)
+    device::RecordUserInitiatedDisconnectResult(
+        device::DisconnectResult::kFailure,
+        /*transport=*/GetType());
+#endif
     BLUETOOTH_LOG(ERROR) << "Failed to discconnect all enabled profiles: "
                          << ret.error();
     std::move(error_callback).Run();
     return;
   }
 
+#if BUILDFLAG(IS_CHROMEOS)
+  device::RecordUserInitiatedDisconnectResult(
+      device::DisconnectResult::kSuccess,
+      /*transport=*/GetType());
+#endif
+
   std::move(callback).Run();
 }
 
diff --git a/device/bluetooth/floss/bluetooth_device_floss.h b/device/bluetooth/floss/bluetooth_device_floss.h
index 8b11205..dc692119 100644
--- a/device/bluetooth/floss/bluetooth_device_floss.h
+++ b/device/bluetooth/floss/bluetooth_device_floss.h
@@ -19,8 +19,6 @@
 namespace floss {
 
 class BluetoothAdapterFloss;
-struct Error;
-struct FlossDeviceId;
 
 // BluetoothDeviceFloss implements device::BluetoothDevice for platforms using
 // Floss (Linux front-end for Fluoride). Objects of this type should be managed
@@ -130,23 +128,6 @@
   void DisconnectGatt() override;
 
  private:
-  // Method for connecting to this device.
-  void ConnectInternal(ConnectCallback callback);
-  void OnConnect(ConnectCallback callback);
-  void OnConnectError(ConnectCallback callback, const Error& error);
-
-  // Used if a Connect() is called but requires Pairing.
-  void OnPairDuringConnect(ConnectCallback callback);
-  void OnPairDuringConnectError(ConnectCallback callback, const Error& error);
-
-  void OnDisconnect(base::OnceClosure callback);
-  void OnDisconnectError(ErrorCallback error_callback, const Error& error);
-
-  void OnPair(ConnectCallback callback);
-  void OnPairError(ConnectCallback callback, const Error& error);
-
-  void OnCancelPairingError(const Error& error);
-  void OnForgetError(ErrorCallback error_callback, const Error& error);
   void OnGetRemoteType(DBusResult<FlossAdapterClient::BluetoothDeviceType> ret);
   void OnGetRemoteClass(DBusResult<uint32_t> ret);
   void OnGetRemoteUuids(DBusResult<UUIDList> ret);
@@ -174,7 +155,7 @@
 
   // Class of device.
   // TODO(b/204708206): Update with property framework when available
-  uint32_t cod_;
+  uint32_t cod_ = 0;
 
   // Whether the device is bonded/paired.
   FlossAdapterClient::BondState bond_state_ =
diff --git a/device/bluetooth/floss/bluetooth_floss_unittest.cc b/device/bluetooth/floss/bluetooth_floss_unittest.cc
index bedf6aa..77ba3224c 100644
--- a/device/bluetooth/floss/bluetooth_floss_unittest.cc
+++ b/device/bluetooth/floss/bluetooth_floss_unittest.cc
@@ -240,6 +240,9 @@
   InitializeAdapter();
   DiscoverDevices();
 
+  // Simulate adapter enabled event.
+  EnableAdapter();
+
   BluetoothDevice* device =
       adapter_->GetDevice(FakeFlossAdapterClient::kJustWorksAddress);
   ASSERT_TRUE(device);
@@ -266,7 +269,29 @@
                  base::BindLambdaForTesting([]() { FAIL(); }));
   run_loop2.Run();
 
-  EXPECT_FALSE(device->IsPaired());
+  device = adapter_->GetDevice(FakeFlossAdapterClient::kJustWorksAddress);
+  EXPECT_FALSE(device);
+
+  // Now check with bonded and connected device.
+  BluetoothDevice* paired_device =
+      adapter_->GetDevice(FakeFlossAdapterClient::kBondedAddress1);
+
+  ASSERT_TRUE(paired_device);
+  ASSERT_TRUE(paired_device->IsPaired());
+  ASSERT_TRUE(paired_device->IsConnected());
+
+  {
+    base::RunLoop loop;
+    paired_device->Forget(base::BindLambdaForTesting([&loop]() {
+                            SUCCEED();
+                            loop.Quit();
+                          }),
+                          base::BindLambdaForTesting([]() { FAIL(); }));
+    loop.Run();
+  }
+
+  paired_device = adapter_->GetDevice(FakeFlossAdapterClient::kBondedAddress1);
+  ASSERT_TRUE(paired_device);
 }
 
 TEST_F(BluetoothFlossTest, Disconnect) {
diff --git a/device/bluetooth/floss/floss_dbus_client.h b/device/bluetooth/floss/floss_dbus_client.h
index 90a0d76..2e94a34 100644
--- a/device/bluetooth/floss/floss_dbus_client.h
+++ b/device/bluetooth/floss/floss_dbus_client.h
@@ -402,7 +402,7 @@
       for (auto const& kv : fields) {
         fields_.insert(kv);
       }
-    };
+    }
 
     bool ReadDBusParam(dbus::MessageReader* reader, T* data) {
       // Keep track of parsed fields to detect missing and duplicate fields.
diff --git a/device/bluetooth/floss/floss_manager_client.h b/device/bluetooth/floss/floss_manager_client.h
index be3552a..52cc5c32 100644
--- a/device/bluetooth/floss/floss_manager_client.h
+++ b/device/bluetooth/floss/floss_manager_client.h
@@ -62,12 +62,12 @@
       if (cb_) {
         std::move(cb_).Run(base::unexpected(Error(kErrorNoResponse, "")));
       }
-    };
+    }
     void RunNoError() {
       if (cb_) {
         std::move(cb_).Run(Void{});
       }
-    };
+    }
 
    private:
     void PostDelayedError();
diff --git a/device/bluetooth/floss/floss_socket_manager.h b/device/bluetooth/floss/floss_socket_manager.h
index e7cd299..f532059 100644
--- a/device/bluetooth/floss/floss_socket_manager.h
+++ b/device/bluetooth/floss/floss_socket_manager.h
@@ -96,9 +96,7 @@
     FlossSocket(FlossSocket&&);
     FlossSocket& operator=(FlossSocket&&) = default;
 
-    bool is_valid() const {
-      return id != FlossSocketManager::kInvalidSocketId;
-    };
+    bool is_valid() const { return id != FlossSocketManager::kInvalidSocketId; }
   };
 
   // Represents a result from any socket api call.
diff --git a/device/bluetooth/test/fake_device_information_custom_pairing_winrt.h b/device/bluetooth/test/fake_device_information_custom_pairing_winrt.h
index e23529c..490f6cf 100644
--- a/device/bluetooth/test/fake_device_information_custom_pairing_winrt.h
+++ b/device/bluetooth/test/fake_device_information_custom_pairing_winrt.h
@@ -87,9 +87,9 @@
 
   ABI::Windows::Devices::Enumeration::DevicePairingKinds pairing_kind() const {
     return pairing_kind_;
-  };
+  }
 
-  const std::string& pin() const { return display_pin_; };
+  const std::string& pin() const { return display_pin_; }
 
   void SetConfirmed() { confirmed_ = true; }
 
diff --git a/docs/images/Pointer_interaction_state_machine_diagram.png b/docs/images/Pointer_interaction_state_machine_diagram.png
new file mode 100644
index 0000000..2774c9e
--- /dev/null
+++ b/docs/images/Pointer_interaction_state_machine_diagram.png
Binary files differ
diff --git a/docs/security/compromised-renderers.md b/docs/security/compromised-renderers.md
index b7e56be..e04c472 100644
--- a/docs/security/compromised-renderers.md
+++ b/docs/security/compromised-renderers.md
@@ -213,20 +213,17 @@
 - Spoof the `MessageEvent.origin` seen by a recipient of a `postMessage`.
 - Bypass enforcement of the `targetOrigin` argument of `postMessage`.
 - Send or receive `BroadcastChannel` messages for another origin.
-- Spoof the `MessageSender.origin` seen by a recipient of a
-  `chrome.runtime.sendMessage`
-  (see also [MessageSender documentation](https://developers.chrome.com/extensions/runtime#type-MessageSender) and [content script security guidance](https://groups.google.com/a/chromium.org/forum/#!topic/chromium-extensions/0ei-UCHNm34)).
+- Spoof the `MessageSender.origin`, nor `MessageSender.id` (i.e. an
+  extension id which can differ from the origin when the message is sent
+  from a content script), as seen by a recipient of a
+  `chrome.runtime.sendMessage`.
+  See also [MessageSender documentation](https://developers.chrome.com/extensions/runtime#type-MessageSender) and [content script security guidance](https://groups.google.com/a/chromium.org/forum/#!topic/chromium-extensions/0ei-UCHNm34).
 
 Protection techniques:
 - Using `CanAccessDataForOrigin` to verify IPCs sent by a renderer process
   (e.g. in `RenderFrameProxyHost::OnRouteMessageEvent` or
   `BroadcastChannelProvider::ConnectToChannel`).
 
-**Known gaps in protection**:
-- Spoofing of `MessageSender.id` object
-  (see [the MessageSender documentation](https://developers.chrome.com/extensions/runtime#type-MessageSender)
-  and https://crbug.com/982361).
-
 
 ## JavaScript code cache
 
diff --git a/extensions/browser/api/offscreen/offscreen_api.h b/extensions/browser/api/offscreen/offscreen_api.h
index cfa949a6..1b3571e 100644
--- a/extensions/browser/api/offscreen/offscreen_api.h
+++ b/extensions/browser/api/offscreen/offscreen_api.h
@@ -17,7 +17,7 @@
                                         public ExtensionHostObserver {
  public:
   DECLARE_EXTENSION_FUNCTION("offscreen.createDocument",
-                             OFFSCREEN_CREATEDOCUMENT);
+                             OFFSCREEN_CREATEDOCUMENT)
 
   OffscreenCreateDocumentFunction();
   OffscreenCreateDocumentFunction(const OffscreenCreateDocumentFunction&) =
@@ -49,8 +49,7 @@
 class OffscreenCloseDocumentFunction : public ExtensionFunction,
                                        public ExtensionHostObserver {
  public:
-  DECLARE_EXTENSION_FUNCTION("offscreen.closeDocument",
-                             OFFSCREEN_CLOSEDOCUMENT);
+  DECLARE_EXTENSION_FUNCTION("offscreen.closeDocument", OFFSCREEN_CLOSEDOCUMENT)
 
   OffscreenCloseDocumentFunction();
   OffscreenCloseDocumentFunction(const OffscreenCloseDocumentFunction&) =
@@ -83,7 +82,7 @@
  public:
   // Note: We use `UNKNOWN` as the histogram value here because we are unlikely
   // to ship this API to stable.
-  DECLARE_EXTENSION_FUNCTION("offscreen.hasDocument", UNKNOWN);
+  DECLARE_EXTENSION_FUNCTION("offscreen.hasDocument", UNKNOWN)
 
   OffscreenHasDocumentFunction();
   OffscreenHasDocumentFunction(const OffscreenHasDocumentFunction&) = delete;
diff --git a/extensions/browser/guest_view/web_view/web_view_guest.cc b/extensions/browser/guest_view/web_view/web_view_guest.cc
index eda3ff0..3c35de83 100644
--- a/extensions/browser/guest_view/web_view/web_view_guest.cc
+++ b/extensions/browser/guest_view/web_view/web_view_guest.cc
@@ -1322,10 +1322,11 @@
                                   const gfx::Rect& initial_rect,
                                   bool user_gesture,
                                   bool* was_blocked) {
-  // TODO(erikchen): Fix ownership semantics for WebContents inside this class.
-  // https://crbug.com/832879.
   if (was_blocked)
     *was_blocked = false;
+  // This is the guest we created during CreateNewGuestWindow, which we now own.
+  // TODO(erikchen): Fix ownership semantics for WebContents inside this class.
+  // https://crbug.com/832879.
   RequestNewWindowPermission(disposition, initial_rect, new_contents.release());
 }
 
@@ -1400,6 +1401,7 @@
                                       const std::string& frame_name,
                                       const GURL& target_url,
                                       WebContents* new_contents) {
+  // The `new_contents` is the one we just created in CreateNewGuestWindow.
   auto* guest = WebViewGuest::FromWebContents(new_contents);
   CHECK(guest);
   guest->SetOpener(this);
diff --git a/extensions/common/manifest_handlers/extension_action_handler.cc b/extensions/common/manifest_handlers/extension_action_handler.cc
index 6fb79399..8a4f334 100644
--- a/extensions/common/manifest_handlers/extension_action_handler.cc
+++ b/extensions/common/manifest_handlers/extension_action_handler.cc
@@ -123,10 +123,15 @@
   return type == Manifest::TYPE_EXTENSION || type == Manifest::TYPE_USER_SCRIPT;
 }
 
+bool ExtensionActionHandler::AlwaysValidateForType(Manifest::Type type) const {
+  return type == Manifest::TYPE_EXTENSION || type == Manifest::TYPE_USER_SCRIPT;
+}
+
 base::span<const char* const> ExtensionActionHandler::Keys() const {
   static constexpr const char* kKeys[] = {
       manifest_keys::kPageAction,
       manifest_keys::kBrowserAction,
+      manifest_keys::kAction,
   };
   return kKeys;
 }
diff --git a/extensions/common/manifest_handlers/extension_action_handler.h b/extensions/common/manifest_handlers/extension_action_handler.h
index dbe15cb..2a6cbb38 100644
--- a/extensions/common/manifest_handlers/extension_action_handler.h
+++ b/extensions/common/manifest_handlers/extension_action_handler.h
@@ -28,6 +28,7 @@
 
  private:
   bool AlwaysParseForType(Manifest::Type type) const override;
+  bool AlwaysValidateForType(Manifest::Type type) const override;
   base::span<const char* const> Keys() const override;
 };
 
diff --git a/extensions/common/manifest_handlers/extension_action_handler_unittest.cc b/extensions/common/manifest_handlers/extension_action_handler_unittest.cc
index 17361f6..e0465be 100644
--- a/extensions/common/manifest_handlers/extension_action_handler_unittest.cc
+++ b/extensions/common/manifest_handlers/extension_action_handler_unittest.cc
@@ -75,6 +75,19 @@
       error);
 }
 
+// Tests that an action is always validated in manifest V3.
+TEST(ExtensionActionHandlerTest, InvalidActionIcon_ManifestV3) {
+  base::FilePath extension_dir =
+      GetTestDataDir().AppendASCII("action_invalid_icon");
+  std::string error;
+  scoped_refptr<Extension> extension(file_util::LoadExtension(
+      extension_dir, mojom::ManifestLocation::kUnpacked, Extension::NO_FLAGS,
+      &error));
+  EXPECT_FALSE(extension);
+  EXPECT_EQ("Could not load icon 'nonexistent_icon.png' specified in 'action'.",
+            error);
+}
+
 using ExtensionActionHandlerManifestTest = ManifestTest;
 
 TEST_F(ExtensionActionHandlerManifestTest, NoActionSpecified_ManifestV2) {
diff --git a/extensions/renderer/api/automation/automation_ax_tree_wrapper.cc b/extensions/renderer/api/automation/automation_ax_tree_wrapper.cc
index b8b6f439..6cb4fd6 100644
--- a/extensions/renderer/api/automation/automation_ax_tree_wrapper.cc
+++ b/extensions/renderer/api/automation/automation_ax_tree_wrapper.cc
@@ -554,12 +554,7 @@
     const ui::AXNodeID node_id) const {
   AutomationAXTreeWrapper* tree_wrapper =
       owner_->GetAutomationAXTreeWrapperFromTreeID(tree_id);
-  return tree_wrapper ? tree_wrapper->GetNodeFromTree(node_id) : nullptr;
-}
-
-ui::AXNode* AutomationAXTreeWrapper::GetNodeFromTree(
-    const ui::AXNodeID node_id) const {
-  return ax_tree_->GetFromId(node_id);
+  return tree_wrapper ? tree_wrapper->GetNode(node_id) : nullptr;
 }
 
 ui::AXTreeID AutomationAXTreeWrapper::GetParentTreeID() const {
diff --git a/extensions/renderer/api/automation/automation_ax_tree_wrapper.h b/extensions/renderer/api/automation/automation_ax_tree_wrapper.h
index 46e5663..4850c1a 100644
--- a/extensions/renderer/api/automation/automation_ax_tree_wrapper.h
+++ b/extensions/renderer/api/automation/automation_ax_tree_wrapper.h
@@ -109,7 +109,6 @@
   // AXTreeManager overrides.
   ui::AXNode* GetNodeFromTree(const ui::AXTreeID& tree_id,
                               const ui::AXNodeID node_id) const override;
-  ui::AXNode* GetNodeFromTree(const ui::AXNodeID node_id) const override;
   ui::AXTreeID GetParentTreeID() const override;
   ui::AXNode* GetParentNodeFromParentTreeAsAXNode() const override;
 
diff --git a/extensions/test/data/manifest_handlers/action_invalid_icon/README b/extensions/test/data/manifest_handlers/action_invalid_icon/README
new file mode 100644
index 0000000..f8c04b60
--- /dev/null
+++ b/extensions/test/data/manifest_handlers/action_invalid_icon/README
@@ -0,0 +1,2 @@
+The is extension is meant to not have an icon that is being expected. This
+causes the "action" key to be invalid.
diff --git a/extensions/test/data/manifest_handlers/action_invalid_icon/manifest.json b/extensions/test/data/manifest_handlers/action_invalid_icon/manifest.json
new file mode 100644
index 0000000..befd15fd
--- /dev/null
+++ b/extensions/test/data/manifest_handlers/action_invalid_icon/manifest.json
@@ -0,0 +1,10 @@
+{
+  "name": "My extension with a nonexistent icon",
+  "version": "1.0",
+  "action": {
+    "default_icon": {
+      "16": "nonexistent_icon.png"
+    }
+  },
+  "manifest_version": 3
+}
diff --git a/fuchsia_web/webengine/browser/client_hints_browsertest.cc b/fuchsia_web/webengine/browser/client_hints_browsertest.cc
index c4f81f2..811cfbd 100644
--- a/fuchsia_web/webengine/browser/client_hints_browsertest.cc
+++ b/fuchsia_web/webengine/browser/client_hints_browsertest.cc
@@ -41,12 +41,14 @@
 
 }  // namespace
 
-class ClientHintsTest : public FrameImplTestBaseWithServer {
+// TODO(crbug.com/1356277): Client Hints temporarily disabled as it is causing
+// several apps to fail. Re-enable Client Hints tests after breakage is fixed.
+class DISABLED_ClientHintsTest : public FrameImplTestBaseWithServer {
  public:
-  ClientHintsTest() = default;
-  ~ClientHintsTest() override = default;
-  ClientHintsTest(const ClientHintsTest&) = delete;
-  ClientHintsTest& operator=(const ClientHintsTest&) = delete;
+  DISABLED_ClientHintsTest() = default;
+  ~DISABLED_ClientHintsTest() override = default;
+  DISABLED_ClientHintsTest(const DISABLED_ClientHintsTest&) = delete;
+  DISABLED_ClientHintsTest& operator=(const DISABLED_ClientHintsTest&) = delete;
 
   void SetUpOnMainThread() override {
     FrameImplTestBaseWithServer::SetUpOnMainThread();
@@ -122,7 +124,7 @@
   FrameForTest frame_for_test_;
 };
 
-IN_PROC_BROWSER_TEST_F(ClientHintsTest, NumericalClientHints) {
+IN_PROC_BROWSER_TEST_F(DISABLED_ClientHintsTest, NumericalClientHints) {
   SetClientHintsForTestServerToRequest(std::string(kRoundTripTimeCH) + "," +
                                        std::string(kDeviceMemoryCH));
   GetAndVerifyClientHint(kRoundTripTimeCH,
@@ -131,7 +133,7 @@
                          base::BindRepeating(&ExpectStringIsNonNegativeNumber));
 }
 
-IN_PROC_BROWSER_TEST_F(ClientHintsTest, InvalidClientHint) {
+IN_PROC_BROWSER_TEST_F(DISABLED_ClientHintsTest, InvalidClientHint) {
   // Check browser handles requests for an invalid Client Hint.
   SetClientHintsForTestServerToRequest("not-a-client-hint");
   GetAndVerifyClientHint("not-a-client-hint",
@@ -143,7 +145,8 @@
 // Low-entropy User Agent Client Hints are sent by default without the origin
 // needing to request them. For a list of low-entropy Client Hints, see
 // https://wicg.github.io/client-hints-infrastructure/#low-entropy-hint-table/
-IN_PROC_BROWSER_TEST_F(ClientHintsTest, LowEntropyClientHintsAreSentByDefault) {
+IN_PROC_BROWSER_TEST_F(DISABLED_ClientHintsTest,
+                       LowEntropyClientHintsAreSentByDefault) {
   GetAndVerifyClientHint(
       kUserAgentCH, base::BindRepeating([](std::string& str) {
         EXPECT_TRUE(str.find("Chromium") != std::string::npos);
@@ -152,7 +155,7 @@
       }));
 }
 
-IN_PROC_BROWSER_TEST_F(ClientHintsTest,
+IN_PROC_BROWSER_TEST_F(DISABLED_ClientHintsTest,
                        LowEntropyClientHintsAreSentWhenRequested) {
   SetClientHintsForTestServerToRequest(kUserAgentCH);
   GetAndVerifyClientHint(
@@ -163,7 +166,7 @@
       }));
 }
 
-IN_PROC_BROWSER_TEST_F(ClientHintsTest,
+IN_PROC_BROWSER_TEST_F(DISABLED_ClientHintsTest,
                        HighEntropyClientHintsAreNotSentByDefault) {
   GetAndVerifyClientHint(kFullVersionListCH,
                          base::BindRepeating([](std::string& str) {
@@ -171,7 +174,7 @@
                          }));
 }
 
-IN_PROC_BROWSER_TEST_F(ClientHintsTest,
+IN_PROC_BROWSER_TEST_F(DISABLED_ClientHintsTest,
                        HighEntropyClientHintsAreSentWhenRequested) {
   SetClientHintsForTestServerToRequest(kFullVersionListCH);
   GetAndVerifyClientHint(
@@ -182,7 +185,7 @@
       }));
 }
 
-IN_PROC_BROWSER_TEST_F(ClientHintsTest, ArchitectureIsArmOrX86) {
+IN_PROC_BROWSER_TEST_F(DISABLED_ClientHintsTest, ArchitectureIsArmOrX86) {
   SetClientHintsForTestServerToRequest(kArchCH);
   GetAndVerifyClientHint(kArchCH, base::BindRepeating([](std::string& str) {
 #if defined(ARCH_CPU_X86_64)
@@ -195,14 +198,14 @@
                          }));
 }
 
-IN_PROC_BROWSER_TEST_F(ClientHintsTest, BitnessIs64) {
+IN_PROC_BROWSER_TEST_F(DISABLED_ClientHintsTest, BitnessIs64) {
   SetClientHintsForTestServerToRequest(kBitnessCH);
   GetAndVerifyClientHint(kBitnessCH, base::BindRepeating([](std::string& str) {
                            EXPECT_EQ(str, "\"64\"");
                          }));
 }
 
-IN_PROC_BROWSER_TEST_F(ClientHintsTest, PlatformIsFuchsia) {
+IN_PROC_BROWSER_TEST_F(DISABLED_ClientHintsTest, PlatformIsFuchsia) {
   // Platform is a low-entropy Client Hint, so no need for test server to
   // request it.
   GetAndVerifyClientHint(kPlatformCH, base::BindRepeating([](std::string& str) {
@@ -210,7 +213,7 @@
                          }));
 }
 
-IN_PROC_BROWSER_TEST_F(ClientHintsTest, RemoveClientHint) {
+IN_PROC_BROWSER_TEST_F(DISABLED_ClientHintsTest, RemoveClientHint) {
   SetClientHintsForTestServerToRequest(std::string(kRoundTripTimeCH) + "," +
                                        std::string(kDeviceMemoryCH));
   GetAndVerifyClientHint(kDeviceMemoryCH,
@@ -225,7 +228,8 @@
                          }));
 }
 
-IN_PROC_BROWSER_TEST_F(ClientHintsTest, AdditionalClientHintsAreAlwaysSent) {
+IN_PROC_BROWSER_TEST_F(DISABLED_ClientHintsTest,
+                       AdditionalClientHintsAreAlwaysSent) {
   SetClientHintsForTestServerToRequest(kRoundTripTimeCH);
 
   // Enable device memory as an additional Client Hint.
diff --git a/fuchsia_web/webengine/browser/web_engine_browser_context.cc b/fuchsia_web/webengine/browser/web_engine_browser_context.cc
index e59e291a..813831ad 100644
--- a/fuchsia_web/webengine/browser/web_engine_browser_context.cc
+++ b/fuchsia_web/webengine/browser/web_engine_browser_context.cc
@@ -151,7 +151,9 @@
 
 content::ClientHintsControllerDelegate*
 WebEngineBrowserContext::GetClientHintsControllerDelegate() {
-  return &client_hints_delegate_;
+  // TODO(crbug.com/1356277): Temporarily disable Client Hints as it is causing
+  // several apps to fail. Re-enable Client Hints after breakage is fixed.
+  return nullptr;
 }
 
 content::BackgroundFetchDelegate*
diff --git a/gpu/command_buffer/client/webgpu_interface_stub.cc b/gpu/command_buffer/client/webgpu_interface_stub.cc
index 92e2c15..d63c3650 100644
--- a/gpu/command_buffer/client/webgpu_interface_stub.cc
+++ b/gpu/command_buffer/client/webgpu_interface_stub.cc
@@ -14,7 +14,7 @@
   APIChannelStub() = default;
 
   const DawnProcTable& GetProcs() const override { return procs_; }
-  WGPUInstance GetWGPUInstance() const override { return nullptr; };
+  WGPUInstance GetWGPUInstance() const override { return nullptr; }
   void Disconnect() override {}
 
   DawnProcTable* procs() { return &procs_; }
diff --git a/gpu/command_buffer/service/scheduler.cc b/gpu/command_buffer/service/scheduler.cc
index 484d1df..39fa45e 100644
--- a/gpu/command_buffer/service/scheduler.cc
+++ b/gpu/command_buffer/service/scheduler.cc
@@ -320,8 +320,8 @@
 }
 
 void Scheduler::Sequence::AddWaitingPriority(SchedulingPriority priority) {
-  TRACE_EVENT2("gpu", "Scheduler::Sequence::RemoveWaitingPriority",
-               "sequence_id", sequence_id_.GetUnsafeValue(), "new_priority",
+  TRACE_EVENT2("gpu", "Scheduler::Sequence::AddWaitingPriority", "sequence_id",
+               sequence_id_.GetUnsafeValue(), "new_priority",
                SchedulingPriorityToString(priority));
 
   waiting_priority_counts_[static_cast<int>(priority)]++;
diff --git a/gpu/command_buffer/service/shared_image/shared_image_backing.cc b/gpu/command_buffer/service/shared_image/shared_image_backing.cc
index db0f6d51..8737f2d 100644
--- a/gpu/command_buffer/service/shared_image/shared_image_backing.cc
+++ b/gpu/command_buffer/service/shared_image/shared_image_backing.cc
@@ -48,7 +48,7 @@
       return "CompoundImageBacking";
   }
   NOTREACHED();
-};
+}
 
 }  // namespace
 
diff --git a/gpu/config/gpu_finch_features.cc b/gpu/config/gpu_finch_features.cc
index 7081e00..f1e3f7f 100644
--- a/gpu/config/gpu_finch_features.cc
+++ b/gpu/config/gpu_finch_features.cc
@@ -56,7 +56,7 @@
 // Used to limit GL version to 2.0 for skia raster and compositing.
 const base::Feature kUseGles2ForOopR {
   "UseGles2ForOopR",
-#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_CHROMEOS)
+#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_WIN)
       base::FEATURE_DISABLED_BY_DEFAULT
 #else
       base::FEATURE_ENABLED_BY_DEFAULT
diff --git a/headless/BUILD.gn b/headless/BUILD.gn
index 2af2493..2a44aec2 100644
--- a/headless/BUILD.gn
+++ b/headless/BUILD.gn
@@ -949,6 +949,7 @@
   deps = [
     "//build:branding_buildflags",
     "//components/embedder_support",
+    "//components/policy/content",
     "//components/security_state/content",
     "//content",
     "//content/public/app",
diff --git a/infra/config/generated/builders/ci/linux-wpt-content-shell-fyi-rel/properties.json b/infra/config/generated/builders/ci/linux-wpt-content-shell-fyi-rel/properties.json
new file mode 100644
index 0000000..3aa4c6d2
--- /dev/null
+++ b/infra/config/generated/builders/ci/linux-wpt-content-shell-fyi-rel/properties.json
@@ -0,0 +1,53 @@
+{
+  "$build/chromium_tests_builder_config": {
+    "builder_config": {
+      "builder_db": {
+        "entries": [
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "linux-wpt-content-shell-fyi-rel",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "builder_group": "chromium.fyi",
+              "execution_mode": "COMPILE_AND_TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium",
+                "target_bits": 64
+              },
+              "legacy_gclient_config": {
+                "config": "chromium"
+              }
+            }
+          }
+        ]
+      },
+      "builder_ids": [
+        {
+          "bucket": "ci",
+          "builder": "linux-wpt-content-shell-fyi-rel",
+          "project": "chromium"
+        }
+      ]
+    }
+  },
+  "$build/reclient": {
+    "instance": "rbe-chromium-trusted",
+    "jobs": 250,
+    "metrics_project": "chromium-reclient-metrics"
+  },
+  "$recipe_engine/resultdb/test_presentation": {
+    "column_keys": [],
+    "grouping_keys": [
+      "status",
+      "v.test_suite"
+    ]
+  },
+  "builder_group": "chromium.fyi",
+  "recipe": "chromium"
+}
\ No newline at end of file
diff --git a/infra/config/generated/luci/cr-buildbucket.cfg b/infra/config/generated/luci/cr-buildbucket.cfg
index d3aaa77..2b71254 100644
--- a/infra/config/generated/luci/cr-buildbucket.cfg
+++ b/infra/config/generated/luci/cr-buildbucket.cfg
@@ -27097,7 +27097,7 @@
         '  "led_builder_is_bootstrapped": true,'
         '  "recipe": "chromium"'
         '}'
-      execution_timeout_secs: 10800
+      execution_timeout_secs: 18000
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
@@ -38648,6 +38648,87 @@
       }
     }
     builders {
+      name: "linux-wpt-content-shell-fyi-rel"
+      swarming_host: "chromium-swarm.appspot.com"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "free_space:standard"
+      dimensions: "os:Ubuntu-18.04"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
+      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/linux-wpt-content-shell-fyi-rel/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"'
+        '}'
+      execution_timeout_secs: 36000
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+      experimental: YES
+      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/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/.+"
+            }
+          }
+        }
+        history_options {
+          use_invocation_timestamp: true
+        }
+      }
+    }
+    builders {
       name: "linux-wpt-fyi-rel"
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builderless:1"
diff --git a/infra/config/generated/luci/luci-milo.cfg b/infra/config/generated/luci/luci-milo.cfg
index f755eb2..7fb69616 100644
--- a/infra/config/generated/luci/luci-milo.cfg
+++ b/infra/config/generated/luci/luci-milo.cfg
@@ -8095,6 +8095,10 @@
     category: "linux"
   }
   builders {
+    name: "buildbucket/luci.chromium.ci/linux-wpt-content-shell-fyi-rel"
+    category: "linux"
+  }
+  builders {
     name: "buildbucket/luci.chromium.ci/linux-wpt-fyi-rel"
     category: "linux"
   }
diff --git a/infra/config/generated/luci/luci-scheduler.cfg b/infra/config/generated/luci/luci-scheduler.cfg
index 003dc79e..cb7ecd7cd 100644
--- a/infra/config/generated/luci/luci-scheduler.cfg
+++ b/infra/config/generated/luci/luci-scheduler.cfg
@@ -6321,6 +6321,16 @@
   }
 }
 job {
+  id: "linux-wpt-content-shell-fyi-rel"
+  realm: "ci"
+  acl_sets: "ci"
+  buildbucket {
+    server: "cr-buildbucket.appspot.com"
+    bucket: "ci"
+    builder: "linux-wpt-content-shell-fyi-rel"
+  }
+}
+job {
   id: "linux-wpt-fyi-rel"
   realm: "ci"
   acl_sets: "ci"
@@ -7573,6 +7583,7 @@
   triggers: "linux-ubsan-vptr"
   triggers: "linux-upload-perfetto"
   triggers: "linux-win_cross-rel"
+  triggers: "linux-wpt-content-shell-fyi-rel"
   triggers: "linux-wpt-fyi-rel"
   triggers: "linux-wpt-identity-fyi-rel"
   triggers: "linux-wpt-input-fyi-rel"
diff --git a/infra/config/subprojects/chromium/ci/chromium.android.fyi.star b/infra/config/subprojects/chromium/ci/chromium.android.fyi.star
index a57d3c7..12faea9 100644
--- a/infra/config/subprojects/chromium/ci/chromium.android.fyi.star
+++ b/infra/config/subprojects/chromium/ci/chromium.android.fyi.star
@@ -178,6 +178,7 @@
         category = "reviver",
         short_name = "P",
     ),
+    execution_timeout = 5 * time.hour,
     # To avoid peak hours, we run it at 1 AM, 4 AM, 7 AM, 10AM, 1 PM UTC.
     schedule = "0 1,4,7,10,13 * * *",
     # Set to an empty list to avoid chromium-gitiles-trigger triggering new
diff --git a/infra/config/subprojects/chromium/ci/chromium.fyi.star b/infra/config/subprojects/chromium/ci/chromium.fyi.star
index 891e689..b6a29e4 100644
--- a/infra/config/subprojects/chromium/ci/chromium.fyi.star
+++ b/infra/config/subprojects/chromium/ci/chromium.fyi.star
@@ -717,6 +717,29 @@
 )
 
 ci.builder(
+    name = "linux-wpt-content-shell-fyi-rel",
+    console_view_entry = consoles.console_view_entry(
+        category = "linux",
+    ),
+    experimental = True,
+    os = os.LINUX_DEFAULT,
+    goma_backend = None,
+    reclient_jobs = reclient.jobs.DEFAULT,
+    reclient_instance = reclient.instance.DEFAULT_TRUSTED,
+    builder_spec = builder_config.builder_spec(
+        chromium_config = builder_config.chromium_config(
+            config = "chromium",
+            apply_configs = ["mb"],
+            build_config = builder_config.build_config.RELEASE,
+            target_bits = 64,
+        ),
+        gclient_config = builder_config.gclient_config(
+            config = "chromium",
+        ),
+    ),
+)
+
+ci.builder(
     name = "linux-wpt-fyi-rel",
     console_view_entry = consoles.console_view_entry(
         category = "linux",
diff --git a/ios/chrome/app/main_controller.mm b/ios/chrome/app/main_controller.mm
index c14e8242..b6c2fd5b 100644
--- a/ios/chrome/app/main_controller.mm
+++ b/ios/chrome/app/main_controller.mm
@@ -1308,33 +1308,15 @@
                                timePeriod:(browsing_data::TimePeriod)timePeriod
                                removeMask:(BrowsingDataRemoveMask)removeMask
                           completionBlock:(ProceduralBlock)completionBlock {
-  // TODO(crbug.com/632772): https://bugs.webkit.org/show_bug.cgi?id=149079
-  // makes it necessary to disable web usage while clearing browsing data.
-  // It is however unnecessary for off-the-record BrowserState (as the code
-  // is not invoked) and has undesired side-effect (cause all regular tabs
-  // to reload, see http://crbug.com/821753 for details).
-  BOOL disableWebUsageDuringRemoval =
+  BOOL willShowActivityIndicator =
       !browserState->IsOffTheRecord() &&
       IsRemoveDataMaskSet(removeMask, BrowsingDataRemoveMask::REMOVE_SITE_DATA);
-  BOOL willShowActivityIndicator = NO;
   BOOL didShowActivityIndicator = NO;
 
-  // TODO(crbug.com/632772): Visited links clearing doesn't require disabling
-  // web usage with iOS 13. Stop disabling web usage once iOS 12 is not
-  // supported.
-  willShowActivityIndicator = disableWebUsageDuringRemoval;
-  disableWebUsageDuringRemoval = NO;
-
   for (SceneState* sceneState in self.appState.connectedScenes) {
     // Assumes all scenes share `browserState`.
     id<BrowserInterfaceProvider> sceneInterface = sceneState.interfaceProvider;
-    if (disableWebUsageDuringRemoval) {
-      // Disables browsing and purges web views.
-      // Must be called only on the main thread.
-      DCHECK([NSThread isMainThread]);
-      sceneInterface.mainInterface.userInteractionEnabled = NO;
-      sceneInterface.incognitoInterface.userInteractionEnabled = NO;
-    } else if (willShowActivityIndicator) {
+    if (willShowActivityIndicator) {
       // Show activity overlay so users know that clear browsing data is in
       // progress.
       if (sceneInterface.mainInterface.browser) {
diff --git a/ios/chrome/browser/commerce/price_alert_util.mm b/ios/chrome/browser/commerce/price_alert_util.mm
index c0bec95..5569296 100644
--- a/ios/chrome/browser/commerce/price_alert_util.mm
+++ b/ios/chrome/browser/commerce/price_alert_util.mm
@@ -28,6 +28,11 @@
   if (browser_state->IsOffTheRecord()) {
     return false;
   }
+  // Price drop annotations are only enabled for en_US
+  NSLocale* current_locale = [NSLocale currentLocale];
+  if (![@"en_US" isEqualToString:current_locale.localeIdentifier]) {
+    return false;
+  }
   ChromeBrowserState* chrome_browser_state =
       ChromeBrowserState::FromBrowserState(browser_state);
   AuthenticationService* authentication_service =
diff --git a/ios/chrome/browser/overlays/overlay_browser_agent_base.mm b/ios/chrome/browser/overlays/overlay_browser_agent_base.mm
index 4cb779e7..1f6b0ca 100644
--- a/ios/chrome/browser/overlays/overlay_browser_agent_base.mm
+++ b/ios/chrome/browser/overlays/overlay_browser_agent_base.mm
@@ -30,11 +30,11 @@
   CallbackInstallerStorage& storage = installer_storages_[modality];
   storage.installers.push_back(std::move(installer));
   // Reset the storage's request support to nullptr.  This will cause the
-  // aggregate support for all callback installers added for |modality| to be
+  // aggregate support for all callback installers added for `modality` to be
   // regenerated the next time GetRequestSupport() is called.
   storage.request_support = nullptr;
   // Notify the installation driver if this is the first installer added for
-  // |modality|.
+  // `modality`.
   if (storage.installers.size() == 1U)
     installation_driver_.StartInstallingCallbacks(modality);
 }
diff --git a/ios/chrome/browser/overlays/overlay_browser_agent_base_unittest.mm b/ios/chrome/browser/overlays/overlay_browser_agent_base_unittest.mm
index 91b400e..2b20ba5 100644
--- a/ios/chrome/browser/overlays/overlay_browser_agent_base_unittest.mm
+++ b/ios/chrome/browser/overlays/overlay_browser_agent_base_unittest.mm
@@ -98,12 +98,12 @@
         ->mock_callback_receiver();
   }
 
-  // Returns |web_state_|'s request queue.
+  // Returns `web_state_`'s request queue.
   OverlayRequestQueue* queue() {
     return OverlayRequestQueue::FromWebState(web_state_, kModality);
   }
 
-  // Cancels all requests in |web_state_|'s queue.
+  // Cancels all requests in `web_state_`'s queue.
   void CancelRequests() { queue()->CancelAllRequests(); }
 
  protected:
diff --git a/ios/chrome/browser/overlays/overlay_callback_manager_impl_unittest.cc b/ios/chrome/browser/overlays/overlay_callback_manager_impl_unittest.cc
index fb7eae4b..a43dc9b 100644
--- a/ios/chrome/browser/overlays/overlay_callback_manager_impl_unittest.cc
+++ b/ios/chrome/browser/overlays/overlay_callback_manager_impl_unittest.cc
@@ -23,7 +23,7 @@
 TEST_F(OverlayCallbackManagerImplTest, CompletionCallbacks) {
   OverlayCallbackManagerImpl manager;
   void* kResponseData = &kResponseData;
-  // Add two completion callbacks that increment |callback_execution_count|.
+  // Add two completion callbacks that increment `callback_execution_count`.
   __block size_t callback_execution_count = 0;
   void (^callback_block)(OverlayResponse* response) =
       ^(OverlayResponse* response) {
diff --git a/ios/chrome/browser/overlays/overlay_presenter_impl.h b/ios/chrome/browser/overlays/overlay_presenter_impl.h
index 16340da3..1de68519 100644
--- a/ios/chrome/browser/overlays/overlay_presenter_impl.h
+++ b/ios/chrome/browser/overlays/overlay_presenter_impl.h
@@ -42,7 +42,7 @@
    public:
     ~Container() override;
 
-    // Returns the OverlayPresenterImpl for |modality|.
+    // Returns the OverlayPresenterImpl for `modality`.
     OverlayPresenterImpl* PresenterForModality(OverlayModality modality);
 
    private:
@@ -71,10 +71,10 @@
   void SetActiveWebState(web::WebState* web_state,
                          ActiveWebStateChangeReason reason);
 
-  // Fetches the request queue for |web_state|, creating it if necessary.
+  // Fetches the request queue for `web_state`, creating it if necessary.
   OverlayRequestQueueImpl* GetQueueForWebState(web::WebState* web_state) const;
 
-  // Returns the front request for |web_state|'s request queue.
+  // Returns the front request for `web_state`'s request queue.
   OverlayRequest* GetFrontRequestForWebState(web::WebState* web_state) const;
 
   // Returns the request queue for the active WebState.
@@ -85,36 +85,36 @@
 
   // Triggers the presentation of the overlay UI for the active request.  Does
   // nothing if there is no active request or if there is no UI delegate.  Must
-  // only be called when |presenting_| is false.
+  // only be called when `presenting_` is false.
   void PresentOverlayForActiveRequest();
 
-  // Notifies this object that the UI for |request| has finished being
-  // presented in |presentation_context|.  This function is called when the
+  // Notifies this object that the UI for `request` has finished being
+  // presented in `presentation_context`.  This function is called when the
   // OverlayPresentationCallback provided to the presentation context is
   // executed.
   void OverlayWasPresented(OverlayPresentationContext* presentation_context,
                            OverlayRequest* request);
 
-  // Notifies this object that the UI for |request| has finished being dismissed
-  // in |presentation_context| in for |reason|.  |queue| is |request|'s queue.
+  // Notifies this object that the UI for `request` has finished being dismissed
+  // in `presentation_context` in for `reason`.  `queue` is `request`'s queue.
   // This function is called when the OverlayDismissalCallback provided to
-  // |presentation_context| is executed.
+  // `presentation_context` is executed.
   void OverlayWasDismissed(OverlayPresentationContext* presentation_context,
                            OverlayRequest* request,
                            base::WeakPtr<OverlayRequestQueueImpl> queue,
                            OverlayDismissalReason reason);
 
-  // Used as a completion callback for |request|.  Cleans up state associated
-  // with |request|.
+  // Used as a completion callback for `request`.  Cleans up state associated
+  // with `request`.
   void OverlayWasCompleted(OverlayRequest* request, OverlayResponse* response);
 
-  // Cancels all overlays for |request|.
+  // Cancels all overlays for `request`.
   void CancelOverlayUIForRequest(OverlayRequest* request);
 
   // Cancels all overlays for the Browser.
   void CancelAllOverlayUI();
 
-  // Sets up and tears down observation and delegation for |web_state|'s request
+  // Sets up and tears down observation and delegation for `web_state`'s request
   // queue when it is added or removed from the Browser.
   void WebStateAddedToBrowser(web::WebState* web_state);
   void WebStateRemovedFromBrowser(web::WebState* web_state);
@@ -170,22 +170,22 @@
   // true from the beginning of the presentation until the end of the
   // dismissal.
   bool presenting_ = false;
-  // Whether |detached_presenting_request_queue_| has replaced this
+  // Whether `detached_presenting_request_queue_` has replaced this
   // presenter as its delegate. This property will help manage a situation where
   // the WebState replaces another presenter with this presenter while an
   // overlay request is still presenting, requiring this presenter to cleanup
   // references to the request before the request is dismissed.
   bool detached_queue_replaced_delegate_ = false;
-  // The OverlayRequestQueue owning |presented_request_| has recently been
+  // The OverlayRequestQueue owning `presented_request_` has recently been
   // detached.
   OverlayRequestQueueImpl* detached_presenting_request_queue_ = nullptr;
   // The request whose overlay UI is currently being presented.  The value is
-  // set when |presenting_| is set to true, and is reset to nullptr when
-  // |presenting_| is reset to false.  May be different from GetActiveRequest()
+  // set when `presenting_` is set to true, and is reset to nullptr when
+  // `presenting_` is reset to false.  May be different from GetActiveRequest()
   // if the front request of the active WebState's request queue is updated
   // while overlay UI is be presented.
   OverlayRequest* presented_request_ = nullptr;
-  // Whether the WebState that owns |presented_request_| is being detached.
+  // Whether the WebState that owns `presented_request_` is being detached.
   bool detaching_presenting_web_state_ = false;
   // Used to extend the lifetime of an OverlayRequest after being removed from
   // a queue until the completion of its dismissal flow.
diff --git a/ios/chrome/browser/overlays/overlay_presenter_impl.mm b/ios/chrome/browser/overlays/overlay_presenter_impl.mm
index d064562..369e3e6 100644
--- a/ios/chrome/browser/overlays/overlay_presenter_impl.mm
+++ b/ios/chrome/browser/overlays/overlay_presenter_impl.mm
@@ -94,7 +94,7 @@
 
   presentation_context_ = presentation_context;
 
-  // Reset |presenting| since it was tracking the status for the previous
+  // Reset `presenting` since it was tracking the status for the previous
   // delegate's presentation context.
   presenting_ = false;
   presented_request_ = nullptr;
@@ -214,7 +214,7 @@
     return;
 
   // Presentation cannot occur if the context is currently unable to show the UI
-  // for |request|.  Attempt to prepare the presentation context for |request|.
+  // for `request`.  Attempt to prepare the presentation context for `request`.
   if (!presentation_context_->CanShowUIForRequest(request)) {
     presentation_context_->PrepareToShowOverlayUI(request);
     return;
@@ -277,7 +277,7 @@
 
   // When the presenter has been replaced as the delegate of the active
   // OverlayRequestQueue, observers are notified of DidHideOverlay() and
-  // |presented_request_| is reset early. Thus, there is no need to do any
+  // `presented_request_` is reset early. Thus, there is no need to do any
   // dismissal bookkeeping since the request has been removed.
   if (detached_queue_replaced_delegate_) {
     presenting_ = false;
@@ -291,8 +291,8 @@
   DCHECK_EQ(presented_request_, request);
 
   // Pop the request for overlays dismissed by the user.  The check against
-  // |removed_request_awaiting_dismissal_| prevents the queue's front request
-  // from being popped if this dismissal was caused by |request|'s removal from
+  // `removed_request_awaiting_dismissal_` prevents the queue's front request
+  // from being popped if this dismissal was caused by `request`'s removal from
   // the queue.
   if (reason == OverlayDismissalReason::kUserInteraction && queue &&
       request != removed_request_awaiting_dismissal_.get()) {
@@ -306,7 +306,7 @@
   presenting_ = false;
   presented_request_ = nullptr;
   // The OverlayPresenter remains as the delegate for
-  // |detached_presenting_request_queue_| to ensure that |presented_request_| is
+  // `detached_presenting_request_queue_` to ensure that `presented_request_` is
   // not deleted before the dismissal of its UI is finished.  Since the UI is
   // now being dismissed, this reference is not needed anymore.
   detached_presenting_request_queue_ = nullptr;
@@ -317,8 +317,8 @@
       observer.DidHideOverlay(this, request);
   }
 
-  // Now that observers have been notified that the UI for |request| was hidden,
-  // |removed_request_awaiting_dismissal_| can be reset since the request no
+  // Now that observers have been notified that the UI for `request` was hidden,
+  // `removed_request_awaiting_dismissal_` can be reset since the request no
   // longer needs to be kept alive.
   removed_request_awaiting_dismissal_ = nullptr;
 
@@ -362,8 +362,8 @@
   OverlayRequestQueueImpl* queue = GetQueueForWebState(web_state);
   queue->RemoveObserver(this);
   // Only reset the delegate if there isn't a currently presented overlay or
-  // |presented_request_|'s WebState is not the WebState being removed. This
-  // will allow the presenter to extend the lifetime of |presented_request_| if
+  // `presented_request_`'s WebState is not the WebState being removed. This
+  // will allow the presenter to extend the lifetime of `presented_request_` if
   // it is removed from the queue before its dismissal finishes.
   if (!presented_request_ ||
       presented_request_->GetQueueWebState() != web_state) {
@@ -421,9 +421,9 @@
     OverlayRequestQueueImpl* queue) {
   if (!presented_request_ || presented_request_ != queue->front_request())
     return;
-  // If |presented_request_| is in the queue that is replacing this presenter
+  // If `presented_request_` is in the queue that is replacing this presenter
   // as the delegate, it is no longer possible to extend the lifetime of
-  // |presented_request_|. Thus, call DidHideOverlay while it is still valid
+  // `presented_request_`. Thus, call DidHideOverlay while it is still valid
   // and reset its reference.
   for (auto& observer : observers_) {
     if (observer.GetRequestSupport(this)->IsRequestSupported(
@@ -441,7 +441,7 @@
 void OverlayPresenterImpl::RequestAddedToQueue(OverlayRequestQueueImpl* queue,
                                                OverlayRequest* request,
                                                size_t index) {
-  // If |request| is not active, there is no need to trigger any presentation.
+  // If `request` is not active, there is no need to trigger any presentation.
   if (request != GetActiveRequest())
     return;
 
@@ -452,20 +452,20 @@
     return;
   }
 
-  // |request| is the new active request, but overlay UI is already
+  // `request` is the new active request, but overlay UI is already
   // presented.  This occurs when:
-  // 1. |request| is added after |presented_request_| is cancelled, but
+  // 1. `request` is added after `presented_request_` is cancelled, but
   //    before its UI is finished being dismissed,
-  // 2. |request| is added immediately after a WebState activation, but
+  // 2. `request` is added immediately after a WebState activation, but
   //    before the overlay UI from the previously active WebState's front
   //    request is finished being dismissed, or
-  // 3. |request| is inserted to the front of the active WebState's request
+  // 3. `request` is inserted to the front of the active WebState's request
   //    queue.
   //
   // For scenarios (1) and (2), the UI is already in the process of being
-  // dismissed, and |request|'s UI will be presented when that dismissal
+  // dismissed, and `request`'s UI will be presented when that dismissal
   // finishes.  For scenario (3), the UI for the presented request needs to
-  // be hidden so that the UI for |request| can be presented.
+  // be hidden so that the UI for `request` can be presented.
   bool should_dismiss_for_inserted_request =
       presented_request_ && queue->size() > 1 &&
       queue->GetRequest(/*index=*/1) == presented_request_;
diff --git a/ios/chrome/browser/overlays/overlay_presenter_impl_unittest.mm b/ios/chrome/browser/overlays/overlay_presenter_impl_unittest.mm
index 68b1e6b7..4daf9a89 100644
--- a/ios/chrome/browser/overlays/overlay_presenter_impl_unittest.mm
+++ b/ios/chrome/browser/overlays/overlay_presenter_impl_unittest.mm
@@ -162,8 +162,8 @@
   EXPECT_EQ(FakeOverlayPresentationContext::PresentationState::kPresented,
             presentation_context().GetPresentationState(request));
   EXPECT_TRUE(presenter().IsShowingOverlayUI());
-  // Insert a request in front of the |request| and verify that the inserted
-  // request's UI is presented while |request|'s UI is hidden.
+  // Insert a request in front of the `request` and verify that the inserted
+  // request's UI is presented while `request`'s UI is hidden.
   EXPECT_CALL(observer(), DidHideOverlay(&presenter(), request));
   OverlayRequest* inserted_request =
       InsertRequest(active_web_state(), /*index=*/0);
@@ -172,7 +172,7 @@
   EXPECT_EQ(FakeOverlayPresentationContext::PresentationState::kHidden,
             presentation_context().GetPresentationState(request));
   EXPECT_TRUE(presenter().IsShowingOverlayUI());
-  // Dismiss |inserted_request|'s UI check that the |request|'s UI is presented
+  // Dismiss `inserted_request`'s UI check that the `request`'s UI is presented
   // again.
   EXPECT_CALL(observer(), DidHideOverlay(&presenter(), inserted_request));
   EXPECT_CALL(observer(), WillShowOverlay(&presenter(), request,
@@ -260,7 +260,7 @@
   EXPECT_TRUE(presenter().IsShowingOverlayUI());
 
   // Reset the UI delegate to nullptr and verify that the overlay UI is
-  // cancelled in |new_presentation_context|'s context.
+  // cancelled in `new_presentation_context`'s context.
   EXPECT_CALL(observer(), DidHideOverlay(&presenter(), request));
   presenter().SetPresentationContext(nullptr);
   EXPECT_EQ(FakeOverlayPresentationContext::PresentationState::kCancelled,
@@ -350,7 +350,7 @@
             presentation_context().GetPresentationState(first_request));
   ASSERT_TRUE(presenter().IsShowingOverlayUI());
 
-  // Replace |first_web_state| with a new active WebState with a queued request.
+  // Replace `first_web_state` with a new active WebState with a queued request.
   auto passed_web_state = std::make_unique<web::FakeWebState>();
   web::WebState* replacement_web_state = passed_web_state.get();
   OverlayRequest* replacement_request = AddRequest(replacement_web_state);
@@ -537,7 +537,7 @@
       WebStateList::InsertionFlags::INSERT_ACTIVATE, WebStateOpener());
 
   // Reset the presentation capabilities to kNone.  Since the context can no
-  // longer support presenting |request|, it will be hidden.
+  // longer support presenting `request`, it will be hidden.
   presentation_context().SetPresentationCapabilities(
       OverlayPresentationContext::UIPresentationCapabilities::kNone);
 
@@ -579,7 +579,7 @@
   EXPECT_FALSE(queue->front_request());
 
   // Reset the presentation capabilities to kNone.  Since the context can no
-  // longer support presenting |request|, it will be hidden.
+  // longer support presenting `request`, it will be hidden.
   presentation_context().SetPresentationCapabilities(
       OverlayPresentationContext::UIPresentationCapabilities::kNone);
 
diff --git a/ios/chrome/browser/overlays/overlay_request_callback_installer.cc b/ios/chrome/browser/overlays/overlay_request_callback_installer.cc
index 7818251..b9913c1 100644
--- a/ios/chrome/browser/overlays/overlay_request_callback_installer.cc
+++ b/ios/chrome/browser/overlays/overlay_request_callback_installer.cc
@@ -15,7 +15,7 @@
 
 void OverlayRequestCallbackInstaller::InstallCallbacks(
     OverlayRequest* request) {
-  // Early return if |request| is unsupported or if callbacks have already been
+  // Early return if `request` is unsupported or if callbacks have already been
   // installed.
   if (!GetRequestSupport()->IsRequestSupported(request) ||
       requests_.find(request) != requests_.end()) {
@@ -23,7 +23,7 @@
   }
   requests_.insert(request);
 
-  // Add the completion callback to remove the request from |requests_|.
+  // Add the completion callback to remove the request from `requests_`.
   request->GetCallbackManager()->AddCompletionCallback(
       base::BindOnce(&OverlayRequestCallbackInstaller::OverlayCompleted,
                      weak_factory_.GetWeakPtr(), request));
diff --git a/ios/chrome/browser/overlays/overlay_request_callback_installer_unittest.cc b/ios/chrome/browser/overlays/overlay_request_callback_installer_unittest.cc
index 21ecbba..3c7d178 100644
--- a/ios/chrome/browser/overlays/overlay_request_callback_installer_unittest.cc
+++ b/ios/chrome/browser/overlays/overlay_request_callback_installer_unittest.cc
@@ -28,9 +28,9 @@
   }
   ~OverlayRequestCallbackInstallerTest() override = default;
 
-  // Dispatches an OverlayResponse created with DispatchInfo through |request|'s
+  // Dispatches an OverlayResponse created with DispatchInfo through `request`'s
   // callback manager.  The mock callback receiver will be notified to expect
-  // callback execution if |expect_callback_execution| is true.
+  // callback execution if `expect_callback_execution` is true.
   void DispatchResponse(OverlayRequest* request,
                         bool expect_callback_execution) {
     if (expect_callback_execution) {
@@ -91,6 +91,6 @@
   DispatchResponse(request.get(), /*expect_callback_execution=*/true);
 
   // Expect the completion callback to be executed upon destruction of
-  // |request|.
+  // `request`.
   EXPECT_CALL(mock_receiver_, CompletionCallback(request.get()));
 }
diff --git a/ios/chrome/browser/overlays/overlay_request_queue_callback_installer_impl.h b/ios/chrome/browser/overlays/overlay_request_queue_callback_installer_impl.h
index bce6d0f33..0e958ce 100644
--- a/ios/chrome/browser/overlays/overlay_request_queue_callback_installer_impl.h
+++ b/ios/chrome/browser/overlays/overlay_request_queue_callback_installer_impl.h
@@ -26,7 +26,7 @@
     RequestAddedObserver(web::WebState* web_state, OverlayModality modality);
     ~RequestAddedObserver() override;
 
-    // Adds |installer| to be executed for every request added to the queue.
+    // Adds `installer` to be executed for every request added to the queue.
     void AddInstaller(
         std::unique_ptr<OverlayRequestCallbackInstaller> installer);
 
diff --git a/ios/chrome/browser/overlays/overlay_request_queue_callback_installer_unittest.mm b/ios/chrome/browser/overlays/overlay_request_queue_callback_installer_unittest.mm
index deb89512b..c6eb8b3 100644
--- a/ios/chrome/browser/overlays/overlay_request_queue_callback_installer_unittest.mm
+++ b/ios/chrome/browser/overlays/overlay_request_queue_callback_installer_unittest.mm
@@ -58,7 +58,7 @@
   OverlayRequest* request = added_request.get();
   queue()->AddRequest(std::move(added_request));
 
-  // Dispatch a response through |request|, expecting the dispatch callback to
+  // Dispatch a response through `request`, expecting the dispatch callback to
   // be executed on the mock receiver.
   EXPECT_CALL(callback_receiver_,
               DispatchCallback(request, DispatchInfo::ResponseSupport()));
diff --git a/ios/chrome/browser/overlays/overlay_request_queue_impl.h b/ios/chrome/browser/overlays/overlay_request_queue_impl.h
index 056e7c1..c5ce4fca 100644
--- a/ios/chrome/browser/overlays/overlay_request_queue_impl.h
+++ b/ios/chrome/browser/overlays/overlay_request_queue_impl.h
@@ -29,7 +29,7 @@
   class Container : public web::WebStateUserData<Container> {
    public:
     ~Container() override;
-    // Returns the request queue for |modality|.
+    // Returns the request queue for `modality`.
     OverlayRequestQueueImpl* QueueForModality(OverlayModality modality);
 
    private:
@@ -44,7 +44,7 @@
   // Delegate class for the queue.
   class Delegate {
    public:
-    // Called when |request| is removed from |queue|.  |cancelled| is true if
+    // Called when `request` is removed from `queue`.  `cancelled` is true if
     // the request is removed by its cancel handler or by a call to
     // CancelAllRequests().
     virtual void OverlayRequestRemoved(OverlayRequestQueueImpl* queue,
@@ -58,16 +58,16 @@
   // Observer class for the queue.
   class Observer : public base::CheckedObserver {
    public:
-    // Called after |request| has been added to |queue|.
+    // Called after `request` has been added to `queue`.
     virtual void RequestAddedToQueue(OverlayRequestQueueImpl* queue,
                                      OverlayRequest* request,
                                      size_t index) {}
 
-    // Called when |queue| is about to be destroyed.
+    // Called when `queue` is about to be destroyed.
     virtual void OverlayRequestQueueDestroyed(OverlayRequestQueueImpl* queue) {}
   };
 
-  // Returns the request queue implementation for |web_state| at |modality|.
+  // Returns the request queue implementation for `web_state` at `modality`.
   static OverlayRequestQueueImpl* FromWebState(web::WebState* web_state,
                                                OverlayModality modality);
 
@@ -116,8 +116,8 @@
   // Private constructor called by container.
   explicit OverlayRequestQueueImpl(web::WebState* web_state);
 
-  // Removes the request at |index|, passing ownership of the removed request to
-  // the delegate.  |cancelled| is true if the request is removed by its cancel
+  // Removes the request at `index`, passing ownership of the removed request to
+  // the delegate.  `cancelled` is true if the request is removed by its cancel
   // handler or by a call to CancelAllRequests().
   void RemoveRequest(size_t index, bool cancelled);
 
diff --git a/ios/chrome/browser/overlays/overlay_request_queue_impl_unittest.mm b/ios/chrome/browser/overlays/overlay_request_queue_impl_unittest.mm
index 4922c039..accb255 100644
--- a/ios/chrome/browser/overlays/overlay_request_queue_impl_unittest.mm
+++ b/ios/chrome/browser/overlays/overlay_request_queue_impl_unittest.mm
@@ -36,12 +36,12 @@
   void OverlayRequestQueueWillReplaceDelegate(
       OverlayRequestQueueImpl* queue) override {}
 
-  // Whether |request| was removed from the queue.
+  // Whether `request` was removed from the queue.
   bool WasRequestRemoved(OverlayRequest* request) {
     return GetRemovedRequestStorage(request) != nullptr;
   }
 
-  // Whether |request| was removed from the queue for cancellation.
+  // Whether `request` was removed from the queue for cancellation.
   bool WasRequestCancelled(OverlayRequest* request) {
     const RemovedRequestStorage* storage = GetRemovedRequestStorage(request);
     return storage && storage->cancelled;
@@ -61,7 +61,7 @@
     bool cancelled;
   };
 
-  // Returns the request storage for |request|.
+  // Returns the request storage for `request`.
   const RemovedRequestStorage* GetRemovedRequestStorage(
       OverlayRequest* request) {
     for (auto& storage : removed_requests_) {
diff --git a/ios/chrome/browser/overlays/overlay_request_queue_util_unittest.mm b/ios/chrome/browser/overlays/overlay_request_queue_util_unittest.mm
index d0a71ad..c92ff51 100644
--- a/ios/chrome/browser/overlays/overlay_request_queue_util_unittest.mm
+++ b/ios/chrome/browser/overlays/overlay_request_queue_util_unittest.mm
@@ -34,7 +34,7 @@
 
 // Tests that the expected indices for matching configs returned.
 TEST_F(OverlayRequestQueueUtilTest, MatchingConfigs) {
-  // Add requests to |web_state|'s queue.
+  // Add requests to `web_state`'s queue.
   web::FakeWebState web_state;
   OverlayRequestQueue* queue =
       OverlayRequestQueue::FromWebState(&web_state, OverlayModality::kTesting);
diff --git a/ios/chrome/browser/overlays/public/common/confirmation/confirmation_overlay_response_util.h b/ios/chrome/browser/overlays/public/common/confirmation/confirmation_overlay_response_util.h
index a736591..b97e55b 100644
--- a/ios/chrome/browser/overlays/public/common/confirmation/confirmation_overlay_response_util.h
+++ b/ios/chrome/browser/overlays/public/common/confirmation/confirmation_overlay_response_util.h
@@ -8,7 +8,7 @@
 #import "ios/chrome/browser/overlays/public/web_content_area/alert_overlay.h"
 
 // Utility function for creating a ResponseConverter that returns a
-// ConfirmationOverlayResponse.  |confirm_button_index| is the button index of
+// ConfirmationOverlayResponse.  `confirm_button_index` is the button index of
 // an AlertRequest's button configs that corresponds with a confirm action.
 alert_overlays::ResponseConverter GetConfirmationResponseConverter(
     size_t confirm_button_index);
diff --git a/ios/chrome/browser/overlays/public/common/confirmation/confirmation_overlay_response_util.mm b/ios/chrome/browser/overlays/public/common/confirmation/confirmation_overlay_response_util.mm
index 8f1c010..f108a36 100644
--- a/ios/chrome/browser/overlays/public/common/confirmation/confirmation_overlay_response_util.mm
+++ b/ios/chrome/browser/overlays/public/common/confirmation/confirmation_overlay_response_util.mm
@@ -16,9 +16,9 @@
 using alert_overlays::ResponseConverter;
 
 namespace {
-// Parses the AlertResponse from |response| and produces a
+// Parses the AlertResponse from `response` and produces a
 // ConfirmationOverlayResponse if the alert response's tapped button is
-// |confirm_button_index|.
+// `confirm_button_index`.
 std::unique_ptr<OverlayResponse> CreateConfirmResponse(
     size_t confirm_button_index,
     std::unique_ptr<OverlayResponse> response) {
diff --git a/ios/chrome/browser/overlays/public/common/infobars/infobar_overlay_request_config.h b/ios/chrome/browser/overlays/public/common/infobars/infobar_overlay_request_config.h
index b9ecf12..3d9b425 100644
--- a/ios/chrome/browser/overlays/public/common/infobars/infobar_overlay_request_config.h
+++ b/ios/chrome/browser/overlays/public/common/infobars/infobar_overlay_request_config.h
@@ -21,11 +21,11 @@
 
   // The infobar that triggered this OverlayRequest.
   InfoBarIOS* infobar() const { return infobar_.get(); }
-  // |infobar_|'s type.
+  // `infobar_`'s type.
   InfobarType infobar_type() const { return infobar_type_; }
-  // Whether |infobar_| has a badge.
+  // Whether `infobar_` has a badge.
   bool has_badge() const { return has_badge_; }
-  // Whether the |infobar_| banner should be presented for a longer time.
+  // Whether the `infobar_` banner should be presented for a longer time.
   bool is_high_priority() const { return is_high_priority_; }
   // The overlay type for this infobar OverlayRequest.
   InfobarOverlayType overlay_type() const { return overlay_type_; }
diff --git a/ios/chrome/browser/overlays/public/infobar_banner/confirm_infobar_banner_overlay_request_config.h b/ios/chrome/browser/overlays/public/infobar_banner/confirm_infobar_banner_overlay_request_config.h
index 8b4e12c..ed895613 100644
--- a/ios/chrome/browser/overlays/public/infobar_banner/confirm_infobar_banner_overlay_request_config.h
+++ b/ios/chrome/browser/overlays/public/infobar_banner/confirm_infobar_banner_overlay_request_config.h
@@ -51,7 +51,7 @@
 
   // The InfoBar causing this banner.
   infobars::InfoBar* infobar_ = nullptr;
-  // Configuration data extracted from |infobar_|'s confirm delegate.
+  // Configuration data extracted from `infobar_`'s confirm delegate.
   std::u16string title_text_;
   std::u16string message_text_;
   std::u16string button_label_text_;
diff --git a/ios/chrome/browser/overlays/public/infobar_banner/save_address_profile_infobar_banner_overlay_request_config.h b/ios/chrome/browser/overlays/public/infobar_banner/save_address_profile_infobar_banner_overlay_request_config.h
index 1cbf0ef9..4f976f9 100644
--- a/ios/chrome/browser/overlays/public/infobar_banner/save_address_profile_infobar_banner_overlay_request_config.h
+++ b/ios/chrome/browser/overlays/public/infobar_banner/save_address_profile_infobar_banner_overlay_request_config.h
@@ -49,7 +49,7 @@
 
   // The InfoBar causing this banner.
   infobars::InfoBar* infobar_ = nullptr;
-  // Configuration data extracted from |infobar_|'s save address profile
+  // Configuration data extracted from `infobar_`'s save address profile
   // delegate.
   std::u16string message_text_;
   std::u16string description_;
diff --git a/ios/chrome/browser/overlays/public/infobar_banner/save_card_infobar_banner_overlay_request_config.h b/ios/chrome/browser/overlays/public/infobar_banner/save_card_infobar_banner_overlay_request_config.h
index 9af76b4..62af422 100644
--- a/ios/chrome/browser/overlays/public/infobar_banner/save_card_infobar_banner_overlay_request_config.h
+++ b/ios/chrome/browser/overlays/public/infobar_banner/save_card_infobar_banner_overlay_request_config.h
@@ -57,7 +57,7 @@
 
   // The InfoBar causing this banner.
   infobars::InfoBar* infobar_ = nullptr;
-  // Configuration data extracted from |infobar_|'s save card delegate.
+  // Configuration data extracted from `infobar_`'s save card delegate.
   std::u16string message_text_;
   std::u16string card_label_;
   std::u16string cardholder_name_;
diff --git a/ios/chrome/browser/overlays/public/infobar_banner/save_password_infobar_banner_overlay.h b/ios/chrome/browser/overlays/public/infobar_banner/save_password_infobar_banner_overlay.h
index 2a8e024..a81436e 100644
--- a/ios/chrome/browser/overlays/public/infobar_banner/save_password_infobar_banner_overlay.h
+++ b/ios/chrome/browser/overlays/public/infobar_banner/save_password_infobar_banner_overlay.h
@@ -44,7 +44,7 @@
 
   // The InfoBar causing this banner.
   infobars::InfoBar* infobar_ = nullptr;
-  // Configuration data extracted from |infobar_|'s save passwords delegate.
+  // Configuration data extracted from `infobar_`'s save passwords delegate.
   NSString* message_ = nil;
   NSString* username_ = nil;
   NSString* button_text_ = nil;
diff --git a/ios/chrome/browser/overlays/public/infobar_banner/translate_infobar_banner_overlay_request_config.h b/ios/chrome/browser/overlays/public/infobar_banner/translate_infobar_banner_overlay_request_config.h
index a524e61..4e7af09 100644
--- a/ios/chrome/browser/overlays/public/infobar_banner/translate_infobar_banner_overlay_request_config.h
+++ b/ios/chrome/browser/overlays/public/infobar_banner/translate_infobar_banner_overlay_request_config.h
@@ -42,7 +42,7 @@
 
   // The InfoBar causing this banner.
   infobars::InfoBar* const infobar_;
-  // Configuration data extracted from |infobar_|'s translate delegate.
+  // Configuration data extracted from `infobar_`'s translate delegate.
   std::u16string source_language_;
   std::u16string target_language_;
   translate::TranslateStep translate_step_;
diff --git a/ios/chrome/browser/overlays/public/infobar_banner/update_password_infobar_banner_overlay.h b/ios/chrome/browser/overlays/public/infobar_banner/update_password_infobar_banner_overlay.h
index 41a3f59..8b7e56e 100644
--- a/ios/chrome/browser/overlays/public/infobar_banner/update_password_infobar_banner_overlay.h
+++ b/ios/chrome/browser/overlays/public/infobar_banner/update_password_infobar_banner_overlay.h
@@ -44,7 +44,7 @@
 
   // The InfoBar causing this banner.
   infobars::InfoBar* infobar_ = nullptr;
-  // Configuration data extracted from |infobar_|'s update passwords delegate.
+  // Configuration data extracted from `infobar_`'s update passwords delegate.
   NSString* message_ = nil;
   NSString* username_ = nil;
   NSString* button_text_ = nil;
diff --git a/ios/chrome/browser/overlays/public/infobar_modal/password_infobar_modal_overlay_request_config.h b/ios/chrome/browser/overlays/public/infobar_modal/password_infobar_modal_overlay_request_config.h
index 53118a3..7f375b6 100644
--- a/ios/chrome/browser/overlays/public/infobar_modal/password_infobar_modal_overlay_request_config.h
+++ b/ios/chrome/browser/overlays/public/infobar_modal/password_infobar_modal_overlay_request_config.h
@@ -52,7 +52,7 @@
 
   // The InfoBar causing this modal.
   InfoBarIOS* infobar_ = nullptr;
-  // Configuration data extracted from |infobar_|'s save passwords delegate.
+  // Configuration data extracted from `infobar_`'s save passwords delegate.
   password_modal::PasswordAction action_;
   NSString* title_ = nil;
   NSString* username_ = nil;
diff --git a/ios/chrome/browser/overlays/public/infobar_modal/save_address_profile_infobar_modal_overlay_request_config.h b/ios/chrome/browser/overlays/public/infobar_modal/save_address_profile_infobar_modal_overlay_request_config.h
index 8b068fb..dae2b68 100644
--- a/ios/chrome/browser/overlays/public/infobar_modal/save_address_profile_infobar_modal_overlay_request_config.h
+++ b/ios/chrome/browser/overlays/public/infobar_modal/save_address_profile_infobar_modal_overlay_request_config.h
@@ -21,13 +21,13 @@
  public:
   ~SaveAddressProfileModalRequestConfig() override;
 
-  // Returns the envelope style address stored in |address_|..
+  // Returns the envelope style address stored in `address_`..
   std::u16string address() const { return address_; }
 
-  // Returns phone number stored in the |profile_|.
+  // Returns phone number stored in the `profile_`.
   std::u16string phoneNumber() const { return phoneNumber_; }
 
-  // Returns email stored in the |profile_|.
+  // Returns email stored in the `profile_`.
   std::u16string emailAddress() const { return emailAddress_; }
 
   // Returns the original profile's description for display.
@@ -35,7 +35,7 @@
     return update_modal_description_;
   }
 
-  // Returns |profile_diff_| containing the profile differences fetched from the
+  // Returns `profile_diff_` containing the profile differences fetched from the
   // delegate.
   NSMutableDictionary<NSNumber*, NSArray*>* profile_diff() const {
     return profile_diff_;
@@ -61,7 +61,7 @@
   // OverlayUserData:
   void CreateAuxiliaryData(base::SupportsUserData* user_data) override;
 
-  // Computes |profile_diff_| based on the map of
+  // Computes `profile_diff_` based on the map of
   // profile difference data fetched from the delegate.
   void StoreProfileDiff(
       const std::vector<autofill::ProfileValueDifference>& profile_diff);
@@ -69,13 +69,13 @@
   // The InfoBar causing this modal.
   InfoBarIOS* infobar_ = nullptr;
 
-  // Configuration data extracted from |infobar_|'s save address profile
+  // Configuration data extracted from `infobar_`'s save address profile
   // delegate.
   std::u16string address_;
   std::u16string emailAddress_;
   std::u16string phoneNumber_;
 
-  // Configuration data extracted from |infobar_|'s update address profile
+  // Configuration data extracted from `infobar_`'s update address profile
   // delegate.
   std::u16string update_modal_description_;
   // The key is AutofillUIType and the value consists of array
diff --git a/ios/chrome/browser/overlays/public/infobar_modal/save_card_infobar_modal_overlay_request_config.h b/ios/chrome/browser/overlays/public/infobar_modal/save_card_infobar_modal_overlay_request_config.h
index d584af8d..f6549c7 100644
--- a/ios/chrome/browser/overlays/public/infobar_modal/save_card_infobar_modal_overlay_request_config.h
+++ b/ios/chrome/browser/overlays/public/infobar_modal/save_card_infobar_modal_overlay_request_config.h
@@ -76,13 +76,13 @@
   void CreateAuxiliaryData(base::SupportsUserData* user_data) override;
 
   // Return an array of UI SaveCardMessageWithLinks model objects for
-  // |delegate|'s legal_message_lines_.
+  // `delegate`'s legal_message_lines_.
   NSMutableArray<SaveCardMessageWithLinks*>* LegalMessagesForModal(
       autofill::AutofillSaveCardInfoBarDelegateMobile* delegate);
 
   // The InfoBar causing this modal.
   InfoBarIOS* infobar_ = nullptr;
-  // Configuration data extracted from |infobar_|'s save card delegate.
+  // Configuration data extracted from `infobar_`'s save card delegate.
   std::u16string cardholder_name_;
   std::u16string expiration_date_month_;
   std::u16string expiration_date_year_;
diff --git a/ios/chrome/browser/overlays/public/infobar_modal/translate_infobar_modal_overlay_request_config.h b/ios/chrome/browser/overlays/public/infobar_modal/translate_infobar_modal_overlay_request_config.h
index a31820e..667d46f 100644
--- a/ios/chrome/browser/overlays/public/infobar_modal/translate_infobar_modal_overlay_request_config.h
+++ b/ios/chrome/browser/overlays/public/infobar_modal/translate_infobar_modal_overlay_request_config.h
@@ -54,7 +54,7 @@
 
   // The InfoBar causing this modal.
   InfoBarIOS* infobar_ = nullptr;
-  // Configuration data extracted from |infobar_|'s translate delegate.
+  // Configuration data extracted from `infobar_`'s translate delegate.
   translate::TranslateStep current_step_;
   std::u16string source_language_name_;
   std::u16string target_language_name_;
diff --git a/ios/chrome/browser/overlays/public/overlay_browser_agent_base.h b/ios/chrome/browser/overlays/public/overlay_browser_agent_base.h
index 1e84104..7a2d78b 100644
--- a/ios/chrome/browser/overlays/public/overlay_browser_agent_base.h
+++ b/ios/chrome/browser/overlays/public/overlay_browser_agent_base.h
@@ -29,18 +29,18 @@
   // Constructor to be called by subclasses.
   explicit OverlayBrowserAgentBase(Browser* browser);
 
-  // Called by subclasses in order to install callbacks using |installer| on
-  // supported OverlayRequests at |modality|.  |installer| must be non-null.
+  // Called by subclasses in order to install callbacks using `installer` on
+  // supported OverlayRequests at `modality`.  `installer` must be non-null.
   void AddInstaller(std::unique_ptr<OverlayRequestCallbackInstaller> installer,
                     OverlayModality modality);
 
   // Returns the aggregate request support for all callback installers added
-  // for |modality|.
+  // for `modality`.
   const OverlayRequestSupport* GetRequestSupport(OverlayModality modality);
 
  private:
-  // Installs the callbacks for |request| using the installers added via
-  // AddInstaller() for |modality|.
+  // Installs the callbacks for `request` using the installers added via
+  // AddInstaller() for `modality`.
   void InstallOverlayRequestCallbacks(OverlayRequest* request,
                                       OverlayModality modality);
 
@@ -49,13 +49,13 @@
   class CallbackInstallationDriver : public OverlayPresenterObserver {
    public:
     // Constructor for an installation driver for OverlayRequests presented via
-    // |browser|'s OverlayPresenters.
+    // `browser`'s OverlayPresenters.
     CallbackInstallationDriver(Browser* browser,
                                OverlayBrowserAgentBase* browser_agent);
     ~CallbackInstallationDriver() override;
 
     // Starts driving the BrowserAgent's installation of callbacks for requests
-    // whose UI is presented from |modality|'s presenter.
+    // whose UI is presented from `modality`'s presenter.
     void StartInstallingCallbacks(OverlayModality modality);
 
    private:
diff --git a/ios/chrome/browser/overlays/public/overlay_callback_manager.h b/ios/chrome/browser/overlays/public/overlay_callback_manager.h
index afb8b85..879fc5e 100644
--- a/ios/chrome/browser/overlays/public/overlay_callback_manager.h
+++ b/ios/chrome/browser/overlays/public/overlay_callback_manager.h
@@ -14,7 +14,7 @@
 // Completion callback for OverlayRequests.  If an overlay requires a completion
 // block to be executed after its UI is dismissed, OverlayPresenter clients can
 // provide a callback that uses the OverlayResponse provided to the request.
-// |response| may be null if no response has been provided.
+// `response` may be null if no response has been provided.
 typedef base::OnceCallback<void(OverlayResponse* response)>
     OverlayCompletionCallback;
 
@@ -27,7 +27,7 @@
   virtual ~OverlayCallbackManager() = default;
 
   // The completion response object for the request whose callbacks are being
-  // managed by this object.  |response| is passed as the argument for
+  // managed by this object.  `response` is passed as the argument for
   // completion callbacks when the overlay UI is finished or the request is
   // cancelled.
   virtual void SetCompletionResponse(
@@ -39,12 +39,12 @@
   // or the request is cancelled.
   virtual void AddCompletionCallback(OverlayCompletionCallback callback) = 0;
 
-  // Dispatches |response| to all callbacks that have been added for its
+  // Dispatches `response` to all callbacks that have been added for its
   // info type.  Used to send user interaction information back to the overlay's
   // requester for ongoing overlay UI.
   virtual void DispatchResponse(std::unique_ptr<OverlayResponse> response) = 0;
 
-  // Adds |callback| to be executed for dispatched responses.  The provided
+  // Adds `callback` to be executed for dispatched responses.  The provided
   // callbacks are not guaranteed to be called, as there is no guarantee that a
   // supported response will be sent for the overlay.
   virtual void AddDispatchCallback(OverlayDispatchCallback callback) = 0;
diff --git a/ios/chrome/browser/overlays/public/overlay_dismissal_callback.h b/ios/chrome/browser/overlays/public/overlay_dismissal_callback.h
index 83f355b..5d70d6b 100644
--- a/ios/chrome/browser/overlays/public/overlay_dismissal_callback.h
+++ b/ios/chrome/browser/overlays/public/overlay_dismissal_callback.h
@@ -21,7 +21,7 @@
 
 // Overlay UI presented by OverlayPresenter::Delegate are provided with an
 // OverlayDismissalCallback that is used to notify the presenter when requested
-// overlay UI has finished being dismissed.  |reason| is used to communicate
+// overlay UI has finished being dismissed.  `reason` is used to communicate
 // what triggered the dismissal.  Overlays that are hidden may be shown again,
 // so the callback will not update the OverlayRequestQueue. Overlays dismissed
 // for user interaction will never be shown again; executing the dismissal
diff --git a/ios/chrome/browser/overlays/public/overlay_dispatch_callback.h b/ios/chrome/browser/overlays/public/overlay_dispatch_callback.h
index 8db55db..19da7fe6 100644
--- a/ios/chrome/browser/overlays/public/overlay_dispatch_callback.h
+++ b/ios/chrome/browser/overlays/public/overlay_dispatch_callback.h
@@ -14,8 +14,8 @@
 // occurring in an ongoing overlay.
 class OverlayDispatchCallback {
  public:
-  // Constructor for a dispatch callback that executes |callback| with
-  // OverlayResponses that are supported by |support|.  |callback| and |support|
+  // Constructor for a dispatch callback that executes `callback` with
+  // OverlayResponses that are supported by `support`.  `callback` and `support`
   // must be non-null.
   OverlayDispatchCallback(
       base::RepeatingCallback<void(OverlayResponse* response)> callback,
@@ -23,8 +23,8 @@
   OverlayDispatchCallback(OverlayDispatchCallback&& other);
   ~OverlayDispatchCallback();
 
-  // Runs |callback_| with |response| iff the response is supported by
-  // |request_support_|.
+  // Runs `callback_` with `response` iff the response is supported by
+  // `request_support_`.
   void Run(OverlayResponse* response);
 
  private:
diff --git a/ios/chrome/browser/overlays/public/overlay_presentation_context.h b/ios/chrome/browser/overlays/public/overlay_presentation_context.h
index 936e17e1..fa811c1 100644
--- a/ios/chrome/browser/overlays/public/overlay_presentation_context.h
+++ b/ios/chrome/browser/overlays/public/overlay_presentation_context.h
@@ -16,13 +16,13 @@
 // Object that handles presenting the overlay UI for OverlayRequests.
 class OverlayPresentationContext {
  public:
-  // Returns the OverlayPresentationContextImpl for |browser| at |modality|.
+  // Returns the OverlayPresentationContextImpl for `browser` at `modality`.
   static OverlayPresentationContext* FromBrowser(Browser* browser,
                                                  OverlayModality modality);
 
   virtual ~OverlayPresentationContext() = default;
 
-  // Adds and removes |observer|.
+  // Adds and removes `observer`.
   virtual void AddObserver(OverlayPresentationContextObserver* observer) = 0;
   virtual void RemoveObserver(OverlayPresentationContextObserver* observer) = 0;
 
@@ -43,47 +43,47 @@
   // the current capabilities.
   virtual UIPresentationCapabilities GetPresentationCapabilities() const = 0;
 
-  // Returns whether the presentation context can show the UI for |request|
-  // while it has |capabilities|.
+  // Returns whether the presentation context can show the UI for `request`
+  // while it has `capabilities`.
   virtual bool CanShowUIForRequest(
       OverlayRequest* request,
       UIPresentationCapabilities capabilities) const = 0;
 
   // Returns whether the presentation context supports showing the UI for
-  // |request| with its current presentation capabilities.
+  // `request` with its current presentation capabilities.
   virtual bool CanShowUIForRequest(OverlayRequest* request) const = 0;
 
   // Whether overlay UI is currently shown in the context.
   virtual bool IsShowingOverlayUI() const = 0;
 
   // Instructs the presentation context to prepare itself to show the overlay UI
-  // for |request|.  If successful, updates the context's presentation
-  // capabilities to those required for |request|'s UI.  Has no effect if the
-  // context is incapable of supporting |request|.  For example, the context
+  // for `request`.  If successful, updates the context's presentation
+  // capabilities to those required for `request`'s UI.  Has no effect if the
+  // context is incapable of supporting `request`.  For example, the context
   // cannot support UIPresentationCapabilities::kPresented until it is added to
   // a window (OverlayPresentationContextObserver can be used to detect window
   // changes).
   virtual void PrepareToShowOverlayUI(OverlayRequest* request) = 0;
 
-  // Called to show the overlay UI for |request|. |presentation_callback| must
-  // be called when the UI is finished being presented. |dismissal_callback|
+  // Called to show the overlay UI for `request`. `presentation_callback` must
+  // be called when the UI is finished being presented. `dismissal_callback`
   // must be stored and called whenever the UI is finished being dismissed for
   // user interaction, hiding, or cancellation.  Must only be called when:
   // - IsShowingOverlayUI() returns false, and
-  // - CanShowUIForRequest() returns true for |request|.
+  // - CanShowUIForRequest() returns true for `request`.
   virtual void ShowOverlayUI(OverlayRequest* request,
                              OverlayPresentationCallback presentation_callback,
                              OverlayDismissalCallback dismissal_callback) = 0;
 
-  // Called to hide the overlay UI for |request|.  Hidden overlays may be shown
+  // Called to hide the overlay UI for `request`.  Hidden overlays may be shown
   // again, so they should be kept in memory or serialized so that the state can
   // be restored if shown again.  When hiding an overlay, the presented UI must
   // be dismissed, and the overlay's dismissal callback must must be executed
-  // upon the dismissal's completion.  Must only be called when |request| is
+  // upon the dismissal's completion.  Must only be called when `request` is
   // displayed within the context.
   virtual void HideOverlayUI(OverlayRequest* request) = 0;
 
-  // Called to cancel the overlay UI for |request|.  If the UI is presented, it
+  // Called to cancel the overlay UI for `request`.  If the UI is presented, it
   // should be dismissed and the dismissal callback should be executed upon the
   // dismissal's completion.  Otherwise, any state corresponding to any hidden
   // overlays should be cleaned up.
diff --git a/ios/chrome/browser/overlays/public/overlay_presentation_context_observer.h b/ios/chrome/browser/overlays/public/overlay_presentation_context_observer.h
index 581af79..945e062 100644
--- a/ios/chrome/browser/overlays/public/overlay_presentation_context_observer.h
+++ b/ios/chrome/browser/overlays/public/overlay_presentation_context_observer.h
@@ -15,20 +15,20 @@
  public:
   OverlayPresentationContextObserver() = default;
 
-  // Called before |presentation_context|'s activation state changes to
-  // |activating|.
+  // Called before `presentation_context`'s activation state changes to
+  // `activating`.
   virtual void OverlayPresentationContextWillChangePresentationCapabilities(
       OverlayPresentationContext* presentation_context,
       OverlayPresentationContext::UIPresentationCapabilities capabilities) {}
 
-  // Called after |presentation_context|'s activation state changes.
+  // Called after `presentation_context`'s activation state changes.
   virtual void OverlayPresentationContextDidChangePresentationCapabilities(
       OverlayPresentationContext* presentation_context) {}
 
   virtual void OverlayPresentationContextDidEnableUI(
       OverlayPresentationContext* presentation_context) {}
 
-  // Called when |presentation_context| moves to |window|.
+  // Called when `presentation_context` moves to `window`.
   virtual void OverlayPresentationContextDidMoveToWindow(
       OverlayPresentationContext* presentation_context,
       UIWindow* window) {}
diff --git a/ios/chrome/browser/overlays/public/overlay_presenter.h b/ios/chrome/browser/overlays/public/overlay_presenter.h
index 405fbf90..5bf6cb0 100644
--- a/ios/chrome/browser/overlays/public/overlay_presenter.h
+++ b/ios/chrome/browser/overlays/public/overlay_presenter.h
@@ -18,8 +18,8 @@
  public:
   virtual ~OverlayPresenter() = default;
 
-  // Retrieves the OverlayPresenter for |browser| that manages overlays at
-  // |modality|, creating one if necessary.
+  // Retrieves the OverlayPresenter for `browser` that manages overlays at
+  // `modality`, creating one if necessary.
   static OverlayPresenter* FromBrowser(Browser* browser,
                                        OverlayModality modality);
 
diff --git a/ios/chrome/browser/overlays/public/overlay_presenter_observer.h b/ios/chrome/browser/overlays/public/overlay_presenter_observer.h
index 2dfad26..8dc9d4b 100644
--- a/ios/chrome/browser/overlays/public/overlay_presenter_observer.h
+++ b/ios/chrome/browser/overlays/public/overlay_presenter_observer.h
@@ -25,23 +25,23 @@
   virtual const OverlayRequestSupport* GetRequestSupport(
       OverlayPresenter* presenter) const;
 
-  // Called when |presenter| is about to show the overlay UI for |request|.
-  // |initial_presentation| is true if this is the first time the UI for
-  // |request| is being shown in the current OverlayPresentationContext.
+  // Called when `presenter` is about to show the overlay UI for `request`.
+  // `initial_presentation` is true if this is the first time the UI for
+  // `request` is being shown in the current OverlayPresentationContext.
   virtual void WillShowOverlay(OverlayPresenter* presenter,
                                OverlayRequest* request,
                                bool initial_presentation) {}
 
-  // Called when |presenter| has finished showing the overlay UI for
-  // |request|.
+  // Called when `presenter` has finished showing the overlay UI for
+  // `request`.
   virtual void DidShowOverlay(OverlayPresenter* presenter,
                               OverlayRequest* request) {}
 
-  // Called when |presenter| is finished dismissing its overlay UI.
+  // Called when `presenter` is finished dismissing its overlay UI.
   virtual void DidHideOverlay(OverlayPresenter* presenter,
                               OverlayRequest* request) {}
 
-  // Called when |presenter| is destroyed.
+  // Called when `presenter` is destroyed.
   virtual void OverlayPresenterDestroyed(OverlayPresenter* presenter) {}
 };
 
diff --git a/ios/chrome/browser/overlays/public/overlay_request_callback_installer.h b/ios/chrome/browser/overlays/public/overlay_request_callback_installer.h
index c4500633..9e77792 100644
--- a/ios/chrome/browser/overlays/public/overlay_request_callback_installer.h
+++ b/ios/chrome/browser/overlays/public/overlay_request_callback_installer.h
@@ -20,8 +20,8 @@
   OverlayRequestCallbackInstaller();
   virtual ~OverlayRequestCallbackInstaller();
 
-  // Installs callbacks for |request|.  Will only install callbacks once per
-  // supported request if called more than once.  |request| must be non-null.
+  // Installs callbacks for `request`.  Will only install callbacks once per
+  // supported request if called more than once.  `request` must be non-null.
   void InstallCallbacks(OverlayRequest* request);
 
   // Returns the request support for this installer.  InstallCallbacksInternal()
@@ -30,14 +30,14 @@
   virtual const OverlayRequestSupport* GetRequestSupport() const;
 
  protected:
-  // Called from InstallCallbacks() if |request| is supported by
+  // Called from InstallCallbacks() if `request` is supported by
   // GetRequestSupport().  Subclasses should override to supply callbacks for a
   // specific kind of request.  Does nothing by default.
   virtual void InstallCallbacksInternal(OverlayRequest* request);
 
  private:
-  // Called as a completion callback for |request| to remove the completed
-  // request from |requests_|.
+  // Called as a completion callback for `request` to remove the completed
+  // request from `requests_`.
   void OverlayCompleted(OverlayRequest* request, OverlayResponse* response);
 
   // Set containing the requests for which callbacks have already been
diff --git a/ios/chrome/browser/overlays/public/overlay_request_cancel_handler.h b/ios/chrome/browser/overlays/public/overlay_request_cancel_handler.h
index 4c41000..943d942f 100644
--- a/ios/chrome/browser/overlays/public/overlay_request_cancel_handler.h
+++ b/ios/chrome/browser/overlays/public/overlay_request_cancel_handler.h
@@ -15,7 +15,7 @@
   virtual ~OverlayRequestCancelHandler() = default;
 
  protected:
-  // Constructor for a cancellation handler that cancels |request| from |queue|.
+  // Constructor for a cancellation handler that cancels `request` from `queue`.
   OverlayRequestCancelHandler(OverlayRequest* request,
                               OverlayRequestQueue* queue);
 
diff --git a/ios/chrome/browser/overlays/public/overlay_request_queue.h b/ios/chrome/browser/overlays/public/overlay_request_queue.h
index edcac9e..acfb6975 100644
--- a/ios/chrome/browser/overlays/public/overlay_request_queue.h
+++ b/ios/chrome/browser/overlays/public/overlay_request_queue.h
@@ -23,7 +23,7 @@
 
   virtual ~OverlayRequestQueue() = default;
 
-  // Returns the request queue for |web_state| at |modality|.
+  // Returns the request queue for `web_state` at `modality`.
   static OverlayRequestQueue* FromWebState(web::WebState* web_state,
                                            OverlayModality modality);
 
@@ -35,22 +35,22 @@
   // queue is updated.
   virtual OverlayRequest* front_request() const = 0;
 
-  // Returns the OverlayRequest at |index|.  |index| must be less than the
+  // Returns the OverlayRequest at `index`.  `index` must be less than the
   // queue's size.  Also supports array-style accessors.
   virtual OverlayRequest* GetRequest(size_t index) const = 0;
   OverlayRequest* operator[](size_t index) { return GetRequest(index); }
 
-  // Adds |request| to be displayed alongside the content area of queue's
-  // corresponding WebState.  |cancel_handler| may be used to cancel the
-  // request.  If |cancel_handler| is not provided, the request will be
+  // Adds `request` to be displayed alongside the content area of queue's
+  // corresponding WebState.  `cancel_handler` may be used to cancel the
+  // request.  If `cancel_handler` is not provided, the request will be
   // cancelled by default for committed, document-changing navigations.
   virtual void AddRequest(std::unique_ptr<OverlayRequest> request,
                           std::unique_ptr<OverlayRequestCancelHandler>
                               cancel_handler = nullptr) = 0;
 
-  // Inserts |request| into the queue at |index|.  |index| must be less than or
-  // equal to the queue's size.  |cancel_handler| may be used to cancel the
-  // request.  If |cancel_handler| is not provided, the request will be
+  // Inserts `request` into the queue at `index`.  `index` must be less than or
+  // equal to the queue's size.  `cancel_handler` may be used to cancel the
+  // request.  If `cancel_handler` is not provided, the request will be
   // cancelled by default for committed, document-changing navigations.
   // Inserting at index 0 will dismiss the currently visible overlay UI if it is
   // presented for that request.
@@ -68,7 +68,7 @@
  private:
   friend class OverlayRequestCancelHandler;
 
-  // Called by cancellation handlers to cancel |request|.
+  // Called by cancellation handlers to cancel `request`.
   virtual void CancelRequest(OverlayRequest* request) = 0;
 };
 
diff --git a/ios/chrome/browser/overlays/public/overlay_request_queue_callback_installer.h b/ios/chrome/browser/overlays/public/overlay_request_queue_callback_installer.h
index 25d33d35..30c91b3 100644
--- a/ios/chrome/browser/overlays/public/overlay_request_queue_callback_installer.h
+++ b/ios/chrome/browser/overlays/public/overlay_request_queue_callback_installer.h
@@ -19,7 +19,7 @@
 // OverlayRequestQueue for a given Browser and OverlayModality.
 class OverlayRequestQueueCallbackInstaller {
  public:
-  // Creates an installer for requests in |web_state|'s queue at |modality|.
+  // Creates an installer for requests in `web_state`'s queue at `modality`.
   static std::unique_ptr<OverlayRequestQueueCallbackInstaller> Create(
       web::WebState* web_state,
       OverlayModality modality);
diff --git a/ios/chrome/browser/overlays/public/overlay_request_queue_util.h b/ios/chrome/browser/overlays/public/overlay_request_queue_util.h
index cdfe472..77bed2b 100644
--- a/ios/chrome/browser/overlays/public/overlay_request_queue_util.h
+++ b/ios/chrome/browser/overlays/public/overlay_request_queue_util.h
@@ -12,8 +12,8 @@
 class OverlayRequest;
 class OverlayRequestQueue;
 
-// Searches through |queue| for requests for which |matcher| returns true.  If
-// a matching request is found, returns true and populates |index| with the
+// Searches through `queue` for requests for which `matcher` returns true.  If
+// a matching request is found, returns true and populates `index` with the
 // index of the first matching request.  Returns false if no matching request is
 // found.  All arguments must be non-null.
 bool GetIndexOfMatchingRequest(
diff --git a/ios/chrome/browser/overlays/public/overlay_request_support.h b/ios/chrome/browser/overlays/public/overlay_request_support.h
index a679073..c8c68d51 100644
--- a/ios/chrome/browser/overlays/public/overlay_request_support.h
+++ b/ios/chrome/browser/overlays/public/overlay_request_support.h
@@ -14,17 +14,17 @@
 class OverlayRequestSupport {
  public:
   // Creates an OverlayResponseSupport that aggregates the request support from
-  // the OverlayRequestSupports in |supports|.  Instances created with this
+  // the OverlayRequestSupports in `supports`.  Instances created with this
   // constructor will return true from IsRequestSupported() if any of the
-  // OverlayRequestSupports in |supports| returns true from IsRequestSupport()
+  // OverlayRequestSupports in `supports` returns true from IsRequestSupport()
   // for the same request.
   OverlayRequestSupport(
       const std::vector<const OverlayRequestSupport*>& supports);
   virtual ~OverlayRequestSupport();
 
-  // Whether |request| is supported by this instance.  The default
+  // Whether `request` is supported by this instance.  The default
   // implementation returns true is any OverlayRequestSupport in
-  // |aggregated_support_| returns true, or false if |aggregated_support_| is
+  // `aggregated_support_` returns true, or false if `aggregated_support_` is
   // empty.
   virtual bool IsRequestSupported(OverlayRequest* request) const;
 
diff --git a/ios/chrome/browser/overlays/public/overlay_response_support.h b/ios/chrome/browser/overlays/public/overlay_response_support.h
index 98c90e4a..c381f0e 100644
--- a/ios/chrome/browser/overlays/public/overlay_response_support.h
+++ b/ios/chrome/browser/overlays/public/overlay_response_support.h
@@ -14,17 +14,17 @@
 class OverlayResponseSupport {
  public:
   // Creates an OverlayResponseSupport that aggregates the support from
-  // the OverlayRequestSupports in |supports|.  Instances created with this
+  // the OverlayRequestSupports in `supports`.  Instances created with this
   // constructor will return true from IsResponseSupported() if any of the
-  // OverlayRequestSupports in |supports| returns true from
+  // OverlayRequestSupports in `supports` returns true from
   // IsResponseSupported() for the same response.
   OverlayResponseSupport(
       const std::vector<const OverlayResponseSupport*>& supports);
   virtual ~OverlayResponseSupport();
 
-  // Whether |response| is supported by this instance.  The default
+  // Whether `response` is supported by this instance.  The default
   // implementation returns true is any OverlayResponseSupport in
-  // |aggregated_support_| returns true, or false if |aggregated_support_| is
+  // `aggregated_support_` returns true, or false if `aggregated_support_` is
   // empty.
   virtual bool IsResponseSupported(OverlayResponse* response) const;
 
diff --git a/ios/chrome/browser/overlays/public/overlay_user_data.h b/ios/chrome/browser/overlays/public/overlay_user_data.h
index 97924d0f1..f6df407 100644
--- a/ios/chrome/browser/overlays/public/overlay_user_data.h
+++ b/ios/chrome/browser/overlays/public/overlay_user_data.h
@@ -43,10 +43,10 @@
 template <class DataType>
 class OverlayUserData : public base::SupportsUserData::Data {
  public:
-  // Creates an OverlayUserData of type DataType and adds it to |user_data|
+  // Creates an OverlayUserData of type DataType and adds it to `user_data`
   // under its key.  The DataType instance is constructed using the arguments
   // passed after the key to this function.  If a DataType instance already
-  // exists in |user_data|, no new object is created.  For example, if the
+  // exists in `user_data`, no new object is created.  For example, if the
   // constructor for an OverlayUserData of type StringData takes a string, one
   // can be created using:
   //
@@ -76,9 +76,9 @@
   static const void* UserDataKey() { return &DataType::kUserDataKey; }
 
  protected:
-  // Adds auxilliary OverlayUserData to |data|.  Used to allow multiple
+  // Adds auxilliary OverlayUserData to `data`.  Used to allow multiple
   // OverlayUserData templates to share common functionality in a separate data
-  // stored in |user_data|.
+  // stored in `user_data`.
   virtual void CreateAuxiliaryData(base::SupportsUserData* user_data) {}
 };
 
diff --git a/ios/chrome/browser/overlays/public/web_content_area/alert_overlay.h b/ios/chrome/browser/overlays/public/web_content_area/alert_overlay.h
index 0b8befeb..0583a3c 100644
--- a/ios/chrome/browser/overlays/public/web_content_area/alert_overlay.h
+++ b/ios/chrome/browser/overlays/public/web_content_area/alert_overlay.h
@@ -45,7 +45,7 @@
 //     std::unique_ptr<OverlayResponse> response) {
 //   AlertResponse* alert_response = response->GetInfo<AlertResponse>();
 //   return OverlayResponse::CreateWithInfo<FooResponse>(
-//       /* ... parse |alert_response| to create a FooResponse ... */);
+//       /* ... parse `alert_response` to create a FooResponse ... */);
 // }
 //
 // void FooRequest::CreateAuxiliaryData(base::SupportsUserData* user_data) {
@@ -56,7 +56,7 @@
 
 // Callback that converts an OverlayResponse created with an AlertResponse
 // to one exposing its feature-specific logic.  For example, a feature asking
-// for the email of a user with an alert can convert |alert_response| to an
+// for the email of a user with an alert can convert `alert_response` to an
 // OverlayResponse created with an OverlayResponseInfo that exposes the email
 // typed into a text field in the alert, rather than requiring the overlay
 // requester to parse the AlertResponse's text field values.
@@ -66,11 +66,11 @@
 
 // Config struct used to set up buttons shown in overlay UI for an AlertRequest.
 struct ButtonConfig {
-  // Creates a ButtonConfig with |title| and |style|.
+  // Creates a ButtonConfig with `title` and `style`.
   explicit ButtonConfig(NSString* title,
                         UIAlertActionStyle style = UIAlertActionStyleDefault);
-  // Creates a ButtonConfig with |title| and |style|. UMA User Action with
-  // |user_action_name| will be recorded when this button is tapped.
+  // Creates a ButtonConfig with `title` and `style`. UMA User Action with
+  // `user_action_name` will be recorded when this button is tapped.
   ButtonConfig(NSString* title,
                base::StringPiece user_action_name,
                UIAlertActionStyle style = UIAlertActionStyleDefault);
@@ -122,9 +122,9 @@
   OVERLAY_USER_DATA_SETUP(AlertRequest);
 
   // Constructor called by CreateForUserData().  All arguments are copied to the
-  // ivars below.  |title|, |message|, or both must be non-empty strings.
-  // |button_configs| must contain at least one ButtonConfig.
-  // |response_converter| must be non-null.
+  // ivars below.  `title`, `message`, or both must be non-empty strings.
+  // `button_configs` must contain at least one ButtonConfig.
+  // `response_converter` must be non-null.
   AlertRequest(NSString* title,
                NSString* message,
                NSString* accessibility_identifier,
diff --git a/ios/chrome/browser/overlays/public/web_content_area/java_script_dialog_overlay.mm b/ios/chrome/browser/overlays/public/web_content_area/java_script_dialog_overlay.mm
index a194158..e052a18 100644
--- a/ios/chrome/browser/overlays/public/web_content_area/java_script_dialog_overlay.mm
+++ b/ios/chrome/browser/overlays/public/web_content_area/java_script_dialog_overlay.mm
@@ -28,13 +28,13 @@
 // The index of the OK button in the alert button array.
 const size_t kButtonIndexOk = 0;
 
-// Whether a cancel button should be added for an overlay with |type|.
+// Whether a cancel button should be added for an overlay with `type`.
 bool DialogsWithTypeUseCancelButtons(web::JavaScriptDialogType type) {
   return type != web::JAVASCRIPT_DIALOG_TYPE_ALERT;
 }
 
 // Whether the dialog blocking button should be added for an overlay from
-// |source|.
+// `source`.
 bool ShouldAddBlockDialogsButton(web::WebState* web_state) {
   if (!web_state)
     return false;
@@ -43,12 +43,12 @@
   return blocking_state && blocking_state->show_blocking_option();
 }
 
-// The index of the dialog blocking button for a dialog with |type|.
+// The index of the dialog blocking button for a dialog with `type`.
 size_t GetBlockingOptionIndex(web::JavaScriptDialogType type) {
   return DialogsWithTypeUseCancelButtons(type) ? 2 : 1;
 }
 
-// Creates an JavaScript dialog response for a dialog with |type| from a
+// Creates an JavaScript dialog response for a dialog with `type` from a
 // response created with an AlertResponse.
 std::unique_ptr<OverlayResponse> CreateJavaScriptDialogResponse(
     web::JavaScriptDialogType type,
diff --git a/ios/chrome/browser/overlays/test/fake_overlay_presentation_context.h b/ios/chrome/browser/overlays/test/fake_overlay_presentation_context.h
index c9412d2c..291eeeb 100644
--- a/ios/chrome/browser/overlays/test/fake_overlay_presentation_context.h
+++ b/ios/chrome/browser/overlays/test/fake_overlay_presentation_context.h
@@ -41,8 +41,8 @@
   void SetDismissalCallbacksEnabled(bool enabled);
   bool AreDismissalCallbacksEnabled() const;
 
-  // Simulates the dismissal of overlay UI for |reason|.  If dismissal callbacks
-  // are enabled, triggers execution of |request|'s OverlayDismissalCallback.
+  // Simulates the dismissal of overlay UI for `reason`.  If dismissal callbacks
+  // are enabled, triggers execution of `request`'s OverlayDismissalCallback.
   void SimulateDismissalForRequest(OverlayRequest* request,
                                    OverlayDismissalReason reason);
 
diff --git a/ios/chrome/browser/overlays/test/fake_overlay_request_callback_installer.h b/ios/chrome/browser/overlays/test/fake_overlay_request_callback_installer.h
index 67eeb94..8eb0b05 100644
--- a/ios/chrome/browser/overlays/test/fake_overlay_request_callback_installer.h
+++ b/ios/chrome/browser/overlays/test/fake_overlay_request_callback_installer.h
@@ -17,14 +17,14 @@
 // by FakeOverlayRequestCallbackInstaller.
 class FakeOverlayRequestCallbackReceiver {
  public:
-  // Function used as the completion callback for |request|.  |response| is
-  // |request|'s completion response.  Executes CompletionCallback() with
-  // |request|.
+  // Function used as the completion callback for `request`.  `response` is
+  // `request`'s completion response.  Executes CompletionCallback() with
+  // `request`.
   void RunCompletionCallback(OverlayRequest* request,
                              OverlayResponse* response);
-  // Function used as the callback when |response| is dispatched through
-  // |request|.  Only executed if |response| is supported by |response_support|.
-  // Executes DispatchCallback() with |request| and |response_support|.
+  // Function used as the callback when `response` is dispatched through
+  // `request`.  Only executed if `response` is supported by `response_support`.
+  // Executes DispatchCallback() with `request` and `response_support`.
   void RunDispatchCallback(OverlayRequest* request,
                            const OverlayResponseSupport* response_support,
                            OverlayResponse* response);
@@ -61,12 +61,12 @@
     : public OverlayRequestCallbackInstaller {
  public:
   // Constructor for a fake callback installer that creates callbacks that are
-  // forwarded to |receiver|.  |receiver| must be non-null, and must outlive any
-  // requests passed to InstallCallback().  |dispatch_supports| is a list of
+  // forwarded to `receiver`.  `receiver` must be non-null, and must outlive any
+  // requests passed to InstallCallback().  `dispatch_supports` is a list of
   // OverlayResponseSupports for each dispatch response InfoType being tested
   // by this fake installer.  Every supported OverlayResponse dispatched through
   // a request with callbacks installed by this instance will trigger
-  // DispatchCallback() on |receiver| with the response support for that
+  // DispatchCallback() on `receiver` with the response support for that
   // response.
   FakeOverlayRequestCallbackInstaller(
       FakeOverlayRequestCallbackReceiver* receiver,
diff --git a/ios/chrome/browser/providers/lens/BUILD.gn b/ios/chrome/browser/providers/lens/BUILD.gn
index c3a2f01..15371b6 100644
--- a/ios/chrome/browser/providers/lens/BUILD.gn
+++ b/ios/chrome/browser/providers/lens/BUILD.gn
@@ -8,5 +8,6 @@
   deps = [
     "//base",
     "//ios/public/provider/chrome/browser/lens:lens_api",
+    "//ios/web/public/navigation",
   ]
 }
diff --git a/ios/chrome/browser/providers/lens/chromium_lens.mm b/ios/chrome/browser/providers/lens/chromium_lens.mm
index 1e39b42..0bdabce 100644
--- a/ios/chrome/browser/providers/lens/chromium_lens.mm
+++ b/ios/chrome/browser/providers/lens/chromium_lens.mm
@@ -4,8 +4,10 @@
 
 #import "ios/public/provider/chrome/browser/lens/lens_api.h"
 #import "ios/public/provider/chrome/browser/lens/lens_configuration.h"
+#import "ios/web/public/navigation/navigation_manager.h"
 
-#include "base/bind.h"
+#import "base/bind.h"
+#import "base/notreached.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 
 #import <UIKit/UIKit.h>
@@ -39,17 +41,13 @@
   return false;
 }
 
-void GenerateLensWebURLForImage(
+web::NavigationManager::WebLoadParams GenerateLensLoadParamsForImage(
     UIImage* image,
-    ios::provider::LensWebURLCompletion completion) {
-  NSError* error =
-      [NSError errorWithDomain:kChromiumLensProviderErrorDomain
-                          code:kChromiumLensProviderErrorNotImplemented
-                      userInfo:nil];
-  base::SequencedTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                                   base::BindOnce(^() {
-                                                     completion(nil, error);
-                                                   }));
+    LensEntrypoint entry_point,
+    bool is_incognito) {
+  // Lens is not supported in Chromium; this function will never be called.
+  NOTREACHED() << "Lens is not supported.";
+  return web::NavigationManager::WebLoadParams({});
 }
 
 }  // namespace provider
diff --git a/ios/chrome/browser/ui/lens/BUILD.gn b/ios/chrome/browser/ui/lens/BUILD.gn
index 872fd90..d5b8125 100644
--- a/ios/chrome/browser/ui/lens/BUILD.gn
+++ b/ios/chrome/browser/ui/lens/BUILD.gn
@@ -9,12 +9,14 @@
     "lens_coordinator.mm",
   ]
   deps = [
+    ":lens_entrypoint",
     "//ios/chrome/browser/browser_state:browser_state",
     "//ios/chrome/browser/main:public",
     "//ios/chrome/browser/ui/commands",
     "//ios/chrome/browser/ui/coordinators:chrome_coordinators",
     "//ios/chrome/browser/url_loading",
     "//ios/public/provider/chrome/browser/lens:lens_api",
+    "//ios/web/public/navigation",
   ]
 }
 
diff --git a/ios/chrome/browser/ui/lens/lens_coordinator.mm b/ios/chrome/browser/ui/lens/lens_coordinator.mm
index 89f7913c..334a14f 100644
--- a/ios/chrome/browser/ui/lens/lens_coordinator.mm
+++ b/ios/chrome/browser/ui/lens/lens_coordinator.mm
@@ -9,10 +9,12 @@
 #import "ios/chrome/browser/ui/commands/browser_commands.h"
 #import "ios/chrome/browser/ui/commands/command_dispatcher.h"
 #import "ios/chrome/browser/ui/commands/search_image_with_lens_command.h"
+#import "ios/chrome/browser/ui/lens/lens_entrypoint.h"
 #import "ios/chrome/browser/url_loading/url_loading_browser_agent.h"
 #import "ios/chrome/browser/url_loading/url_loading_params.h"
 #import "ios/public/provider/chrome/browser/lens/lens_api.h"
 #import "ios/public/provider/chrome/browser/lens/lens_configuration.h"
+#import "ios/web/public/navigation/navigation_manager.h"
 #import "net/base/mac/url_conversions.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
@@ -55,13 +57,10 @@
 #pragma mark - Commands
 
 - (void)searchImageWithLens:(SearchImageWithLensCommand*)command {
-  __weak LensCoordinator* weakSelf = self;
-  ios::provider::GenerateLensWebURLForImage(
-      command.image, ^(NSURL* url, NSError* error) {
-        if (url != nil) {
-          [weakSelf openWebURL:net::GURLWithNSURL(url)];
-        }
-      });
+  const bool isIncognito = self.browser->GetBrowserState()->IsOffTheRecord();
+  [self openWebLoadParams:ios::provider::GenerateLensLoadParamsForImage(
+                              command.image, LensEntrypoint::ContextMenu,
+                              isIncognito)];
 }
 
 #pragma mark - ChromeLensControllerDelegate
@@ -74,22 +73,17 @@
   self.viewController = nil;
 }
 
-- (void)lensControllerDidSelectURL:(NSURL*)URL {
-  // Dismiss the Lens view controller.
-  if (self.baseViewController.presentedViewController == self.viewController) {
-    [self.baseViewController dismissViewControllerAnimated:YES completion:nil];
-  }
-
-  self.viewController = nil;
-  [self openWebURL:net::GURLWithNSURL(URL)];
+- (void)lensControllerDidGenerateLoadParams:
+    (const web::NavigationManager::WebLoadParams&)params {
+  [self openWebLoadParams:params];
 }
 
 #pragma mark - Private
 
-- (void)openWebURL:(const GURL&)url {
+- (void)openWebLoadParams:(const web::NavigationManager::WebLoadParams&)params {
   if (!self.browser)
     return;
-  UrlLoadParams loadParams = UrlLoadParams::InNewTab(url);
+  UrlLoadParams loadParams = UrlLoadParams::InNewTab(params);
   loadParams.SetInBackground(NO);
   loadParams.in_incognito = self.browser->GetBrowserState()->IsOffTheRecord();
   loadParams.append_to = kCurrentTab;
diff --git a/ios/chrome/browser/ui/omnibox/zero_suggest_prefetch_helper.mm b/ios/chrome/browser/ui/omnibox/zero_suggest_prefetch_helper.mm
index 2010ed6..51efa01 100644
--- a/ios/chrome/browser/ui/omnibox/zero_suggest_prefetch_helper.mm
+++ b/ios/chrome/browser/ui/omnibox/zero_suggest_prefetch_helper.mm
@@ -88,7 +88,8 @@
   AutocompleteInput autocomplete_input(
       u"", metrics::OmniboxEventProto::NTP_ZPS_PREFETCH,
       AutocompleteSchemeClassifierImpl());
-  autocomplete_input.set_focus_type(OmniboxFocusType::ON_FOCUS);
+  autocomplete_input.set_focus_type(
+      metrics::OmniboxFocusType::INTERACTION_FOCUS);
   self.autocompleteController->StartPrefetch(autocomplete_input);
 }
 
diff --git a/ios/chrome/browser/ui/start_surface/start_surface_scene_agent.mm b/ios/chrome/browser/ui/start_surface/start_surface_scene_agent.mm
index cf85c3a..2218e29 100644
--- a/ios/chrome/browser/ui/start_surface/start_surface_scene_agent.mm
+++ b/ios/chrome/browser/ui/start_surface/start_surface_scene_agent.mm
@@ -68,10 +68,14 @@
       self.previousActivationLevel > SceneActivationLevelBackground) {
     if (base::FeatureList::IsEnabled(kRemoveExcessNTPs)) {
       // Remove duplicate NTP pages upon background event.
-      [self removeExcessNTPsInBrowser:self.sceneState.interfaceProvider
-                                          .mainInterface.browser];
-      [self removeExcessNTPsInBrowser:self.sceneState.interfaceProvider
-                                          .incognitoInterface.browser];
+      if (self.sceneState.interfaceProvider.mainInterface.browser) {
+        [self removeExcessNTPsInBrowser:self.sceneState.interfaceProvider
+                                            .mainInterface.browser];
+      }
+      if (self.sceneState.interfaceProvider.incognitoInterface.browser) {
+        [self removeExcessNTPsInBrowser:self.sceneState.interfaceProvider
+                                            .incognitoInterface.browser];
+      }
     }
   }
   if (level >= SceneActivationLevelForegroundInactive &&
diff --git a/ios/chrome/test/providers/lens/BUILD.gn b/ios/chrome/test/providers/lens/BUILD.gn
index 918d99d..ecd8abb9 100644
--- a/ios/chrome/test/providers/lens/BUILD.gn
+++ b/ios/chrome/test/providers/lens/BUILD.gn
@@ -9,5 +9,6 @@
   deps = [
     "//base",
     "//ios/public/provider/chrome/browser/lens:lens_api",
+    "//ios/web/public/navigation",
   ]
 }
diff --git a/ios/chrome/test/providers/lens/test_lens.mm b/ios/chrome/test/providers/lens/test_lens.mm
index fe6f1a09..62c3c1c 100644
--- a/ios/chrome/test/providers/lens/test_lens.mm
+++ b/ios/chrome/test/providers/lens/test_lens.mm
@@ -4,9 +4,11 @@
 
 #import "ios/public/provider/chrome/browser/lens/lens_api.h"
 #import "ios/public/provider/chrome/browser/lens/lens_configuration.h"
+#import "url/url_constants.h"
 
-#include "base/bind.h"
-#include "base/threading/sequenced_task_runner_handle.h"
+#import "base/bind.h"
+#import "base/notreached.h"
+#import "base/threading/sequenced_task_runner_handle.h"
 
 #import <UIKit/UIKit.h>
 
@@ -39,16 +41,13 @@
   return false;
 }
 
-void GenerateLensWebURLForImage(
+web::NavigationManager::WebLoadParams GenerateLensLoadParamsForImage(
     UIImage* image,
-    ios::provider::LensWebURLCompletion completion) {
-  NSError* error = [NSError errorWithDomain:kTestLensProviderErrorDomain
-                                       code:kTestLensProviderErrorNotImplemented
-                                   userInfo:nil];
-  base::SequencedTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                                   base::BindOnce(^() {
-                                                     completion(nil, error);
-                                                   }));
+    LensEntrypoint entry_point,
+    bool is_incognito) {
+  // Lens is not supported for tests.
+  NOTREACHED() << "Lens is not supported.";
+  return web::NavigationManager::WebLoadParams({});
 }
 
 }  // namespace provider
diff --git a/ios/public/provider/chrome/browser/lens/BUILD.gn b/ios/public/provider/chrome/browser/lens/BUILD.gn
index 7cd9971..7407f9c 100644
--- a/ios/public/provider/chrome/browser/lens/BUILD.gn
+++ b/ios/public/provider/chrome/browser/lens/BUILD.gn
@@ -8,6 +8,11 @@
     "lens_api.h",
     "lens_configuration.h",
     "lens_configuration.mm",
+    "lens_query.h",
+    "lens_query.mm",
   ]
-  deps = [ "//base" ]
+  deps = [
+    "//base",
+    "//ios/web/public/navigation:navigation",
+  ]
 }
diff --git a/ios/public/provider/chrome/browser/lens/lens_api.h b/ios/public/provider/chrome/browser/lens/lens_api.h
index 9686679..ecece03c 100644
--- a/ios/public/provider/chrome/browser/lens/lens_api.h
+++ b/ios/public/provider/chrome/browser/lens/lens_api.h
@@ -7,8 +7,11 @@
 
 #import <UIKit/UIKit.h>
 
+#import "ios/web/public/navigation/navigation_manager.h"
+
 @class LensConfiguration;
 @class UIViewController;
+enum class LensEntrypoint;
 
 // A delegate that can receive Lens events forwarded by a ChromeLensController.
 @protocol ChromeLensControllerDelegate <NSObject>
@@ -16,8 +19,10 @@
 // Called when the Lens view controller's dimiss button has been tapped.
 - (void)lensControllerDidTapDismissButton;
 
-// Called when a URL in the Lens view controller has been selected.
-- (void)lensControllerDidSelectURL:(NSURL*)url;
+// Called when the user selects an image and the Lens controller has prepared
+// `params` for loading a Lens web page.
+- (void)lensControllerDidGenerateLoadParams:
+    (const web::NavigationManager::WebLoadParams&)params;
 
 @end
 
@@ -28,18 +33,16 @@
 // A delegate that can receive Lens events forwarded by the controller.
 @property(nonatomic, weak) id<ChromeLensControllerDelegate> delegate;
 
-// Returns a Lens post-capture view controller for the given query image.
-- (UIViewController*)postCaptureViewControllerForImage:(UIImage*)image;
+// Returns an input selection UIViewController with the provided
+// web content frame.
+- (UIViewController*)inputSelectionViewControllerWithWebContentFrame:
+    (CGRect)webContentFrame;
 
 @end
 
 namespace ios {
 namespace provider {
 
-// Block invoked when the URL for Lens has been generated. Either
-// `url` or `error` is guaranteed to be non-nil.
-using LensWebURLCompletion = void (^)(NSURL* url, NSError* error);
-
 // Returns a controller for the given configuration that can facilitate
 // communication with the downstream Lens controller.
 id<ChromeLensController> NewChromeLensController(LensConfiguration* config);
@@ -47,11 +50,12 @@
 // Returns whether Lens is supported for the current build.
 bool IsLensSupported();
 
-// Generates an URL for a Lens image search. The `completion` will
-// be invoked asynchronously in the calling sequence when the url
-// has been generated.
-void GenerateLensWebURLForImage(UIImage* image,
-                                LensWebURLCompletion completion);
+// Generates web load params for a Lens image search for the given
+// 'image' and 'entry_point'.
+web::NavigationManager::WebLoadParams GenerateLensLoadParamsForImage(
+    UIImage* image,
+    LensEntrypoint entry_point,
+    bool is_incognito);
 
 }  // namespace provider
 }  // namespace ios
diff --git a/ios/public/provider/chrome/browser/lens/lens_configuration.h b/ios/public/provider/chrome/browser/lens/lens_configuration.h
index fc70d8a..d310d63 100644
--- a/ios/public/provider/chrome/browser/lens/lens_configuration.h
+++ b/ios/public/provider/chrome/browser/lens/lens_configuration.h
@@ -9,6 +9,7 @@
 
 @class ChromeIdentity;
 @protocol SingleSignOnService;
+enum class LensEntrypoint;
 
 // Configuration object used by the LensProvider.
 @interface LensConfiguration : NSObject
@@ -22,6 +23,9 @@
 // The SingleSignOnService instance to use by LensProvider.
 @property(nonatomic, strong) id<SingleSignOnService> ssoService;
 
+// The entry point from which Lens was entered.
+@property(nonatomic, assign) LensEntrypoint entrypoint;
+
 @end
 
 #endif  // IOS_PUBLIC_PROVIDER_CHROME_BROWSER_LENS_LENS_CONFIGURATION_H_
diff --git a/ios/public/provider/chrome/browser/lens/lens_query.h b/ios/public/provider/chrome/browser/lens/lens_query.h
new file mode 100644
index 0000000..3b54101a
--- /dev/null
+++ b/ios/public/provider/chrome/browser/lens/lens_query.h
@@ -0,0 +1,27 @@
+// 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.
+
+#ifndef IOS_PUBLIC_PROVIDER_CHROME_BROWSER_LENS_LENS_QUERY_H_
+#define IOS_PUBLIC_PROVIDER_CHROME_BROWSER_LENS_LENS_QUERY_H_
+
+#import <Foundation/Foundation.h>
+#import <UIKit/UIKit.h>
+
+enum class LensEntrypoint;
+
+// Query parameters used to open Lens.
+@interface LensQuery : NSObject
+
+// The current identity associated with the browser.
+@property(nonatomic, strong) UIImage* image;
+
+// Whether or not the browser is currently in incognito mode.
+@property(nonatomic, assign) BOOL isIncognito;
+
+// The entry point from which Lens was entered.
+@property(nonatomic, assign) LensEntrypoint entrypoint;
+
+@end
+
+#endif  // IOS_PUBLIC_PROVIDER_CHROME_BROWSER_LENS_LENS_QUERY_H_
diff --git a/ios/public/provider/chrome/browser/lens/lens_query.mm b/ios/public/provider/chrome/browser/lens/lens_query.mm
new file mode 100644
index 0000000..125e229
--- /dev/null
+++ b/ios/public/provider/chrome/browser/lens/lens_query.mm
@@ -0,0 +1,9 @@
+// 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.
+
+#import "ios/public/provider/chrome/browser/lens/lens_query.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
diff --git a/media/capture/video/shared_memory_buffer_tracker.cc b/media/capture/video/shared_memory_buffer_tracker.cc
index 7a372b1..5b3263b3 100644
--- a/media/capture/video/shared_memory_buffer_tracker.cc
+++ b/media/capture/video/shared_memory_buffer_tracker.cc
@@ -58,7 +58,7 @@
 namespace media {
 
 SharedMemoryBufferTracker::SharedMemoryBufferTracker(bool strict_pixel_format)
-    : strict_pixel_format_(strict_pixel_format){};
+    : strict_pixel_format_(strict_pixel_format) {}
 
 SharedMemoryBufferTracker::~SharedMemoryBufferTracker() = default;
 
diff --git a/media/capture/video/video_capture_device_factory.cc b/media/capture/video/video_capture_device_factory.cc
index ad91178a..9f3c285d 100644
--- a/media/capture/video/video_capture_device_factory.cc
+++ b/media/capture/video/video_capture_device_factory.cc
@@ -50,7 +50,7 @@
   return nullptr;
 }
 
-void VideoCaptureDeviceFactory::OnGpuInfoUpdate(const CHROME_LUID& luid){};
+void VideoCaptureDeviceFactory::OnGpuInfoUpdate(const CHROME_LUID& luid) {}
 #endif
 
 }  // namespace media
diff --git a/media/mojo/services/stable_video_decoder_service_unittest.cc b/media/mojo/services/stable_video_decoder_service_unittest.cc
index 3b8fb996..99a85106 100644
--- a/media/mojo/services/stable_video_decoder_service_unittest.cc
+++ b/media/mojo/services/stable_video_decoder_service_unittest.cc
@@ -82,7 +82,7 @@
   }
   std::unique_ptr<MojoDecoderBufferReader> TakeMojoDecoderBufferReader() {
     return std::move(mojo_decoder_buffer_reader_);
-  };
+  }
 
   // mojom::VideoDecoder implementation.
   MOCK_METHOD1(GetSupportedConfigs, void(GetSupportedConfigsCallback callback));
diff --git a/media/video/h265_poc_unittest.cc b/media/video/h265_poc_unittest.cc
index 85a856dc..b3ed73d 100644
--- a/media/video/h265_poc_unittest.cc
+++ b/media/video/h265_poc_unittest.cc
@@ -153,7 +153,7 @@
   slice_hdr_.slice_pic_order_cnt_lsb = 15;
   ComputePOC();
   ASSERT_EQ(15, poc_);
-};
+}
 
 TEST_F(H265POCTest, PicOrderCntInOrder) {
   sps_.log2_max_pic_order_cnt_lsb_minus4 = 12;
@@ -389,5 +389,5 @@
   slice_hdr_.slice_pic_order_cnt_lsb = 2;
   ComputePOC();
   ASSERT_EQ(2, poc_);
-};
-}  // namespace media
\ No newline at end of file
+}
+}  // namespace media
diff --git a/mojo/core/channel_mac.cc b/mojo/core/channel_mac.cc
index ce813f3..77d8c26 100644
--- a/mojo/core/channel_mac.cc
+++ b/mojo/core/channel_mac.cc
@@ -225,6 +225,7 @@
     send_buffer_.reset();
     receive_buffer_.reset();
     incoming_handles_.clear();
+    reject_writes_ = true;
 
     if (leak_handles_) {
       std::ignore = receive_port_.release();
@@ -715,7 +716,8 @@
 
   // Lock that protects the following members.
   base::Lock write_lock_;
-  // Whether writes should be rejected due to an internal error.
+  // Whether writes should be rejected due to an internal error or channel
+  // shutdown.
   bool reject_writes_ = false;
   // IO buffer for sending Mach messages.
   base::mac::ScopedMachVM send_buffer_;
diff --git a/mojo/core/core.cc b/mojo/core/core.cc
index fd9c942..d537061 100644
--- a/mojo/core/core.cc
+++ b/mojo/core/core.cc
@@ -755,13 +755,14 @@
       GetDispatcher(data_pipe_producer_handle));
   if (!dispatcher)
     return MOJO_RESULT_INVALID_ARGUMENT;
+  MojoBeginWriteDataFlags flags = MOJO_BEGIN_WRITE_DATA_FLAG_NONE;
   if (options) {
-    if (options->struct_size < sizeof(*options))
+    if (options->struct_size < sizeof(*options)) {
       return MOJO_RESULT_INVALID_ARGUMENT;
-    if (options->flags != MOJO_BEGIN_WRITE_DATA_FLAG_NONE)
-      return MOJO_RESULT_UNIMPLEMENTED;
+    }
+    flags = options->flags;
   }
-  return dispatcher->BeginWriteData(buffer, buffer_num_bytes);
+  return dispatcher->BeginWriteData(buffer, buffer_num_bytes, flags);
 }
 
 MojoResult Core::EndWriteData(MojoHandle data_pipe_producer_handle,
diff --git a/mojo/core/core_test_base.cc b/mojo/core/core_test_base.cc
index d9a1b4c9..69ba094 100644
--- a/mojo/core/core_test_base.cc
+++ b/mojo/core/core_test_base.cc
@@ -63,7 +63,8 @@
   }
 
   MojoResult BeginWriteData(void** buffer,
-                            uint32_t* buffer_num_bytes) override {
+                            uint32_t* buffer_num_bytes,
+                            MojoBeginWriteDataFlags flags) override {
     info_->IncrementBeginWriteDataCallCount();
     return MOJO_RESULT_UNIMPLEMENTED;
   }
diff --git a/mojo/core/data_pipe_producer_dispatcher.cc b/mojo/core/data_pipe_producer_dispatcher.cc
index f4281d9..789ebf7 100644
--- a/mojo/core/data_pipe_producer_dispatcher.cc
+++ b/mojo/core/data_pipe_producer_dispatcher.cc
@@ -163,7 +163,8 @@
 
 MojoResult DataPipeProducerDispatcher::BeginWriteData(
     void** buffer,
-    uint32_t* buffer_num_bytes) {
+    uint32_t* buffer_num_bytes,
+    MojoBeginWriteDataFlags flags) {
   base::AutoLock lock(lock_);
   if (!shared_ring_buffer_.IsValid() || in_transit_)
     return MOJO_RESULT_INVALID_ARGUMENT;
diff --git a/mojo/core/data_pipe_producer_dispatcher.h b/mojo/core/data_pipe_producer_dispatcher.h
index ad8286a1..067457e 100644
--- a/mojo/core/data_pipe_producer_dispatcher.h
+++ b/mojo/core/data_pipe_producer_dispatcher.h
@@ -47,7 +47,9 @@
   MojoResult WriteData(const void* elements,
                        uint32_t* num_bytes,
                        const MojoWriteDataOptions& options) override;
-  MojoResult BeginWriteData(void** buffer, uint32_t* buffer_num_bytes) override;
+  MojoResult BeginWriteData(void** buffer,
+                            uint32_t* buffer_num_bytes,
+                            MojoBeginWriteDataFlags flags) override;
   MojoResult EndWriteData(uint32_t num_bytes_written) override;
   HandleSignalsState GetHandleSignalsState() const override;
   MojoResult AddWatcherRef(const scoped_refptr<WatcherDispatcher>& watcher,
diff --git a/mojo/core/dispatcher.cc b/mojo/core/dispatcher.cc
index b8e64d9d..3536161 100644
--- a/mojo/core/dispatcher.cc
+++ b/mojo/core/dispatcher.cc
@@ -109,7 +109,8 @@
 }
 
 MojoResult Dispatcher::BeginWriteData(void** buffer,
-                                      uint32_t* buffer_num_bytes) {
+                                      uint32_t* buffer_num_bytes,
+                                      MojoBeginWriteDataFlags flags) {
   return MOJO_RESULT_INVALID_ARGUMENT;
 }
 
diff --git a/mojo/core/dispatcher.h b/mojo/core/dispatcher.h
index ef06325e..8bf01c3 100644
--- a/mojo/core/dispatcher.h
+++ b/mojo/core/dispatcher.h
@@ -17,6 +17,7 @@
 #include "mojo/core/handle_signals_state.h"
 #include "mojo/core/system_impl_export.h"
 #include "mojo/core/watch.h"
+#include "mojo/public/c/system/data_pipe.h"
 #include "mojo/public/c/system/quota.h"
 #include "mojo/public/c/system/trap.h"
 #include "mojo/public/c/system/types.h"
@@ -194,7 +195,9 @@
   // Supports the the |MojoBeginWriteData()| API if implemented by this
   // Dispatcher. Arguments correspond to the ones given to the original API
   // call. See |MojoBeginWriteData()| documentation.
-  virtual MojoResult BeginWriteData(void** buffer, uint32_t* buffer_num_bytes);
+  virtual MojoResult BeginWriteData(void** buffer,
+                                    uint32_t* buffer_num_bytes,
+                                    MojoBeginWriteDataFlags flags);
 
   // Supports the the |MojoEndWriteData()| API if implemented by this
   // Dispatcher. Arguments correspond to the ones given to the original API
diff --git a/mojo/public/c/system/data_pipe.h b/mojo/public/c/system/data_pipe.h
index 1a4ca5f..19efd39 100644
--- a/mojo/public/c/system/data_pipe.h
+++ b/mojo/public/c/system/data_pipe.h
@@ -74,6 +74,11 @@
 // No flags. Default behavior.
 #define MOJO_BEGIN_WRITE_DATA_FLAG_NONE ((uint32_t)0)
 
+// Indicates that the size hint provided to MojoBeginWriteData() must be treated
+// as a minimum requirement, and that the operation must fail if sufficient
+// capacity cannot be allocated.
+#define MOJO_BEGIN_WRITE_DATA_FLAG_ALL_OR_NONE ((uint32_t)1 << 0)
+
 // Options passed to |MojoBeginWriteData()|.
 struct MOJO_ALIGNAS(8) MojoBeginWriteDataOptions {
   // The size of this structure, used for versioning.
@@ -249,6 +254,17 @@
 // |data_pipe_producer_handle|. On success |*buffer| will be a pointer to which
 // the caller can write up to |*buffer_num_bytes| bytes of data.
 //
+// `*buffer_num_bytes` must be initialized on input. If non-zero it provides a
+// hint about the number of data bytes the producer is readily able to supply if
+// if the operation succeeds. If zero, no such hint is assumed and the value is
+// ignored.
+//
+// If MOJO_RESULT_BEGIN_WRITE_DATA_FLAG_ALL_OR_NONE is provided in
+// `options->flags`, then this hint is a minimum requirement for the operation
+// to succeed, and on success the output value of `*buffer_num_bytes` will be
+// at least as large as the input value. The flag is invalid to specify if the
+// input value of `*buffer_num_bytes` is zero.
+//
 // During a two-phase write, |data_pipe_producer_handle| is *not* writable.
 // If another caller tries to write to it by calling |MojoWriteData()| or
 // |MojoBeginWriteData()|, their request will fail with |MOJO_RESULT_BUSY|.
diff --git a/mojo/public/cpp/system/data_pipe_producer.cc b/mojo/public/cpp/system/data_pipe_producer.cc
index 34608091a..698cfdc9 100644
--- a/mojo/public/cpp/system/data_pipe_producer.cc
+++ b/mojo/public/cpp/system/data_pipe_producer.cc
@@ -112,7 +112,10 @@
       // Lock as much of the pipe as we can.
       void* pipe_buffer;
       uint32_t size = kDefaultMaxReadSize;
-      uint64_t max_data_size = data_source_->GetLength();
+
+      DCHECK_LE(bytes_transferred_, data_source_->GetLength());
+      const uint64_t max_data_size =
+          data_source_->GetLength() - bytes_transferred_;
       if (static_cast<uint64_t>(size) > max_data_size)
         size = static_cast<uint32_t>(max_data_size);
 
diff --git a/mojo/public/cpp/system/data_pipe_utils.cc b/mojo/public/cpp/system/data_pipe_utils.cc
index 3ee5466..6db4c8fc 100644
--- a/mojo/public/cpp/system/data_pipe_utils.cc
+++ b/mojo/public/cpp/system/data_pipe_utils.cc
@@ -67,7 +67,7 @@
   auto it = source.begin();
   for (;;) {
     void* buffer = nullptr;
-    uint32_t buffer_num_bytes = 0;
+    uint32_t buffer_num_bytes = static_cast<uint32_t>(source.end() - it);
     MojoResult result = destination->BeginWriteData(&buffer, &buffer_num_bytes,
                                                     MOJO_WRITE_DATA_FLAG_NONE);
     if (result == MOJO_RESULT_OK) {
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/module-test-utils.h.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/module-test-utils.h.tmpl
index 1f60def3..1b02076 100644
--- a/mojo/public/tools/bindings/generators/cpp_templates/module-test-utils.h.tmpl
+++ b/mojo/public/tools/bindings/generators/cpp_templates/module-test-utils.h.tmpl
@@ -68,6 +68,11 @@
 {%- for method in interface.methods if method.response_parameters != None %}
   void {{method.name}}(
       {{interface_macros.declare_sync_method_params("", method)}});
+  {% if method.response_parameters|length == 1 -%}
+    {%- set response_type = method.response_parameters[0].kind|cpp_wrapper_call_type -%}
+    {{response_type}} {{method.name}}({{interface_macros.declare_params("", method.parameters)}});
+  {%- endif %}
+
 {%- endfor %}
 
  private:
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/module.cc.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/module.cc.tmpl
index 2ddabd86..70fcbb30 100644
--- a/mojo/public/tools/bindings/generators/cpp_templates/module.cc.tmpl
+++ b/mojo/public/tools/bindings/generators/cpp_templates/module.cc.tmpl
@@ -193,6 +193,21 @@
 {%-   endfor %}));
   loop.Run();
 }
+
+{%   if method.response_parameters|length == 1 -%}
+{%-     set response_type = method.response_parameters[0].kind|cpp_wrapper_call_type -%}
+{{response_type}} {{interface.name}}AsyncWaiter::{{method.name}}(
+    {{interface_macros.declare_params("", method.parameters)}}) {
+  {{response_type}} async_wait_result;
+  {{method.name}}(
+{%-   for param in method.parameters -%}
+        std::move({{param.name}}),
+{%-   endfor -%}
+        &async_wait_result);
+  return async_wait_result;
+}
+{%-   endif %}
+
 {% endfor %}
 
 {% endfor %}
diff --git a/remoting/android/remoting_apk_tmpl.gni b/remoting/android/remoting_apk_tmpl.gni
index 112c265e..f38cd2c 100644
--- a/remoting/android/remoting_apk_tmpl.gni
+++ b/remoting/android/remoting_apk_tmpl.gni
@@ -19,11 +19,7 @@
       if (!defined(proguard_configs)) {
         proguard_configs = []
       }
-      proguard_configs += [
-        "//remoting/android/proguard.flags",
-        "//base/android/proguard/chromium_apk.flags",
-        "//base/android/proguard/chromium_code.flags",
-      ]
+      proguard_configs += [ "//remoting/android/proguard.flags" ]
     }
 
     android_manifest = "$root_gen_dir/remoting/android/AndroidManifest.xml"
diff --git a/services/audio/output_controller_unittest.cc b/services/audio/output_controller_unittest.cc
index 7369e7a..91340db 100644
--- a/services/audio/output_controller_unittest.cc
+++ b/services/audio/output_controller_unittest.cc
@@ -883,7 +883,7 @@
   void Start(AudioSourceCallback* callback) override {
     callback_ = callback;
     DidStart();
-  };
+  }
 
   void SimulateOnMoreDataCalled(const AudioParameters& params, bool is_mixing) {
     DCHECK(callback_);
diff --git a/services/network/public/cpp/net_adapters.cc b/services/network/public/cpp/net_adapters.cc
index 33a533f1..3b943c8 100644
--- a/services/network/public/cpp/net_adapters.cc
+++ b/services/network/public/cpp/net_adapters.cc
@@ -27,16 +27,16 @@
     mojo::ScopedDataPipeProducerHandle* handle,
     scoped_refptr<NetToMojoPendingBuffer>* pending,
     uint32_t* num_bytes) {
+  uint32_t max_bytes = kMaxBufSize;
+  if (base::FeatureList::IsEnabled(net::features::kOptimizeNetworkBuffers)) {
+    max_bytes = net::features::kOptimizeNetworkBuffersBytesReadLimit.Get();
+  }
+
   void* buf = nullptr;
-  *num_bytes = 0;
+  *num_bytes = max_bytes;
   MojoResult result =
       (*handle)->BeginWriteData(&buf, num_bytes, MOJO_WRITE_DATA_FLAG_NONE);
   if (result == MOJO_RESULT_OK) {
-    uint32_t max_bytes = kMaxBufSize;
-    if (base::FeatureList::IsEnabled(net::features::kOptimizeNetworkBuffers)) {
-      max_bytes = net::features::kOptimizeNetworkBuffersBytesReadLimit.Get();
-    }
-
     if (*num_bytes > max_bytes)
       *num_bytes = max_bytes;
 
diff --git a/services/network/websocket.cc b/services/network/websocket.cc
index 1b4da1a..332c5ff 100644
--- a/services/network/websocket.cc
+++ b/services/network/websocket.cc
@@ -697,8 +697,8 @@
   DCHECK_GT(payload->size(), 0u);
   MojoResult begin_result;
   void* buffer;
-  uint32_t writable_size = 0;
-  while (payload->size() > 0 &&
+  uint32_t writable_size;
+  while ((writable_size = static_cast<uint32_t>(payload->size())) > 0 &&
          (begin_result = writable_->BeginWriteData(
               &buffer, &writable_size, MOJO_WRITE_DATA_FLAG_NONE)) ==
              MOJO_RESULT_OK) {
diff --git a/testing/buildbot/chromium.chromiumos.json b/testing/buildbot/chromium.chromiumos.json
index 87723db..e3127f0 100644
--- a/testing/buildbot/chromium.chromiumos.json
+++ b/testing/buildbot/chromium.chromiumos.json
@@ -5774,21 +5774,21 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v107.0.5258.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v107.0.5259.0/test_ash_chrome"
         ],
         "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "interactive_ui_tests Lacros version skew testing ash 107.0.5258.0",
+        "name": "interactive_ui_tests Lacros version skew testing ash 107.0.5259.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v107.0.5258.0",
-              "revision": "version:107.0.5258.0"
+              "location": "lacros_version_skew_tests_v107.0.5259.0",
+              "revision": "version:107.0.5259.0"
             }
           ],
           "dimension_sets": [
@@ -5801,7 +5801,7 @@
         },
         "test": "interactive_ui_tests",
         "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/",
-        "variant_id": "Lacros version skew testing ash 107.0.5258.0"
+        "variant_id": "Lacros version skew testing ash 107.0.5259.0"
       },
       {
         "isolate_profile_data": true,
@@ -5939,21 +5939,21 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v107.0.5258.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v107.0.5259.0/test_ash_chrome"
         ],
         "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests Lacros version skew testing ash 107.0.5258.0",
+        "name": "lacros_chrome_browsertests Lacros version skew testing ash 107.0.5259.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v107.0.5258.0",
-              "revision": "version:107.0.5258.0"
+              "location": "lacros_version_skew_tests_v107.0.5259.0",
+              "revision": "version:107.0.5259.0"
             }
           ],
           "dimension_sets": [
@@ -5965,7 +5965,7 @@
         },
         "test": "lacros_chrome_browsertests",
         "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/",
-        "variant_id": "Lacros version skew testing ash 107.0.5258.0"
+        "variant_id": "Lacros version skew testing ash 107.0.5259.0"
       },
       {
         "args": [
@@ -6085,21 +6085,21 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v107.0.5258.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v107.0.5259.0/test_ash_chrome"
         ],
         "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 107.0.5258.0",
+        "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 107.0.5259.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v107.0.5258.0",
-              "revision": "version:107.0.5258.0"
+              "location": "lacros_version_skew_tests_v107.0.5259.0",
+              "revision": "version:107.0.5259.0"
             }
           ],
           "dimension_sets": [
@@ -6111,7 +6111,7 @@
         },
         "test": "lacros_chrome_browsertests_run_in_series",
         "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/",
-        "variant_id": "Lacros version skew testing ash 107.0.5258.0"
+        "variant_id": "Lacros version skew testing ash 107.0.5259.0"
       },
       {
         "isolate_profile_data": true,
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json
index b58a488..869f3a7 100644
--- a/testing/buildbot/chromium.fyi.json
+++ b/testing/buildbot/chromium.fyi.json
@@ -99225,21 +99225,21 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v107.0.5258.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v107.0.5259.0/test_ash_chrome"
         ],
         "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "interactive_ui_tests Lacros version skew testing ash 107.0.5258.0",
+        "name": "interactive_ui_tests Lacros version skew testing ash 107.0.5259.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v107.0.5258.0",
-              "revision": "version:107.0.5258.0"
+              "location": "lacros_version_skew_tests_v107.0.5259.0",
+              "revision": "version:107.0.5259.0"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -99247,7 +99247,7 @@
         },
         "test": "interactive_ui_tests",
         "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/",
-        "variant_id": "Lacros version skew testing ash 107.0.5258.0"
+        "variant_id": "Lacros version skew testing ash 107.0.5259.0"
       },
       {
         "isolate_profile_data": true,
@@ -99360,28 +99360,28 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v107.0.5258.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v107.0.5259.0/test_ash_chrome"
         ],
         "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests Lacros version skew testing ash 107.0.5258.0",
+        "name": "lacros_chrome_browsertests Lacros version skew testing ash 107.0.5259.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v107.0.5258.0",
-              "revision": "version:107.0.5258.0"
+              "location": "lacros_version_skew_tests_v107.0.5259.0",
+              "revision": "version:107.0.5259.0"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
         "test": "lacros_chrome_browsertests",
         "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/",
-        "variant_id": "Lacros version skew testing ash 107.0.5258.0"
+        "variant_id": "Lacros version skew testing ash 107.0.5259.0"
       },
       {
         "args": [
@@ -99481,28 +99481,28 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v107.0.5258.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v107.0.5259.0/test_ash_chrome"
         ],
         "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 107.0.5258.0",
+        "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 107.0.5259.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v107.0.5258.0",
-              "revision": "version:107.0.5258.0"
+              "location": "lacros_version_skew_tests_v107.0.5259.0",
+              "revision": "version:107.0.5259.0"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
         "test": "lacros_chrome_browsertests_run_in_series",
         "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/",
-        "variant_id": "Lacros version skew testing ash 107.0.5258.0"
+        "variant_id": "Lacros version skew testing ash 107.0.5259.0"
       },
       {
         "isolate_profile_data": true,
@@ -100835,20 +100835,20 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v107.0.5258.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v107.0.5259.0/test_ash_chrome"
         ],
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "interactive_ui_tests Lacros version skew testing ash 107.0.5258.0",
+        "name": "interactive_ui_tests Lacros version skew testing ash 107.0.5259.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v107.0.5258.0",
-              "revision": "version:107.0.5258.0"
+              "location": "lacros_version_skew_tests_v107.0.5259.0",
+              "revision": "version:107.0.5259.0"
             }
           ],
           "dimension_sets": [
@@ -100862,7 +100862,7 @@
         },
         "test": "interactive_ui_tests",
         "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/",
-        "variant_id": "Lacros version skew testing ash 107.0.5258.0"
+        "variant_id": "Lacros version skew testing ash 107.0.5259.0"
       },
       {
         "merge": {
@@ -101000,20 +101000,20 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v107.0.5258.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v107.0.5259.0/test_ash_chrome"
         ],
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests Lacros version skew testing ash 107.0.5258.0",
+        "name": "lacros_chrome_browsertests Lacros version skew testing ash 107.0.5259.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v107.0.5258.0",
-              "revision": "version:107.0.5258.0"
+              "location": "lacros_version_skew_tests_v107.0.5259.0",
+              "revision": "version:107.0.5259.0"
             }
           ],
           "dimension_sets": [
@@ -101026,7 +101026,7 @@
         },
         "test": "lacros_chrome_browsertests",
         "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/",
-        "variant_id": "Lacros version skew testing ash 107.0.5258.0"
+        "variant_id": "Lacros version skew testing ash 107.0.5259.0"
       },
       {
         "args": [
@@ -101146,20 +101146,20 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v107.0.5258.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v107.0.5259.0/test_ash_chrome"
         ],
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 107.0.5258.0",
+        "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 107.0.5259.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v107.0.5258.0",
-              "revision": "version:107.0.5258.0"
+              "location": "lacros_version_skew_tests_v107.0.5259.0",
+              "revision": "version:107.0.5259.0"
             }
           ],
           "dimension_sets": [
@@ -101172,7 +101172,7 @@
         },
         "test": "lacros_chrome_browsertests_run_in_series",
         "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/",
-        "variant_id": "Lacros version skew testing ash 107.0.5258.0"
+        "variant_id": "Lacros version skew testing ash 107.0.5259.0"
       },
       {
         "merge": {
@@ -102680,20 +102680,20 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v107.0.5258.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v107.0.5259.0/test_ash_chrome"
         ],
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "interactive_ui_tests Lacros version skew testing ash 107.0.5258.0",
+        "name": "interactive_ui_tests Lacros version skew testing ash 107.0.5259.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v107.0.5258.0",
-              "revision": "version:107.0.5258.0"
+              "location": "lacros_version_skew_tests_v107.0.5259.0",
+              "revision": "version:107.0.5259.0"
             }
           ],
           "dimension_sets": [
@@ -102707,7 +102707,7 @@
         },
         "test": "interactive_ui_tests",
         "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/",
-        "variant_id": "Lacros version skew testing ash 107.0.5258.0"
+        "variant_id": "Lacros version skew testing ash 107.0.5259.0"
       },
       {
         "merge": {
@@ -102845,20 +102845,20 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v107.0.5258.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v107.0.5259.0/test_ash_chrome"
         ],
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests Lacros version skew testing ash 107.0.5258.0",
+        "name": "lacros_chrome_browsertests Lacros version skew testing ash 107.0.5259.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v107.0.5258.0",
-              "revision": "version:107.0.5258.0"
+              "location": "lacros_version_skew_tests_v107.0.5259.0",
+              "revision": "version:107.0.5259.0"
             }
           ],
           "dimension_sets": [
@@ -102871,7 +102871,7 @@
         },
         "test": "lacros_chrome_browsertests",
         "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/",
-        "variant_id": "Lacros version skew testing ash 107.0.5258.0"
+        "variant_id": "Lacros version skew testing ash 107.0.5259.0"
       },
       {
         "args": [
@@ -102991,20 +102991,20 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v107.0.5258.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v107.0.5259.0/test_ash_chrome"
         ],
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 107.0.5258.0",
+        "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 107.0.5259.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v107.0.5258.0",
-              "revision": "version:107.0.5258.0"
+              "location": "lacros_version_skew_tests_v107.0.5259.0",
+              "revision": "version:107.0.5259.0"
             }
           ],
           "dimension_sets": [
@@ -103017,7 +103017,7 @@
         },
         "test": "lacros_chrome_browsertests_run_in_series",
         "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/",
-        "variant_id": "Lacros version skew testing ash 107.0.5258.0"
+        "variant_id": "Lacros version skew testing ash 107.0.5259.0"
       },
       {
         "merge": {
@@ -103826,20 +103826,20 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v107.0.5258.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v107.0.5259.0/test_ash_chrome"
         ],
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "interactive_ui_tests Lacros version skew testing ash 107.0.5258.0",
+        "name": "interactive_ui_tests Lacros version skew testing ash 107.0.5259.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v107.0.5258.0",
-              "revision": "version:107.0.5258.0"
+              "location": "lacros_version_skew_tests_v107.0.5259.0",
+              "revision": "version:107.0.5259.0"
             }
           ],
           "dimension_sets": [
@@ -103852,7 +103852,7 @@
         },
         "test": "interactive_ui_tests",
         "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/",
-        "variant_id": "Lacros version skew testing ash 107.0.5258.0"
+        "variant_id": "Lacros version skew testing ash 107.0.5259.0"
       }
     ]
   },
@@ -106422,6 +106422,43 @@
       }
     ]
   },
+  "linux-wpt-content-shell-fyi-rel": {
+    "isolated_scripts": [
+      {
+        "args": [
+          "--child-processes=8",
+          "--run-by-dir=0",
+          "--no-restart-on-new-group",
+          "--product=content_shell"
+        ],
+        "experiment_percentage": 100,
+        "isolate_name": "wpt_tests_isolate",
+        "merge": {
+          "args": [
+            "--verbose"
+          ],
+          "script": "//third_party/blink/tools/merge_web_test_results.py"
+        },
+        "name": "wpt_tests_suite",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "results_handler": "layout tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-18.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 15
+        },
+        "test_id_prefix": "ninja://:wpt_tests_isolate/"
+      }
+    ]
+  },
   "linux-wpt-fyi-rel": {
     "isolated_scripts": [
       {
diff --git a/testing/buildbot/chromium.memory.json b/testing/buildbot/chromium.memory.json
index e137b2c..7d0824d 100644
--- a/testing/buildbot/chromium.memory.json
+++ b/testing/buildbot/chromium.memory.json
@@ -20863,21 +20863,21 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v107.0.5258.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v107.0.5259.0/test_ash_chrome"
         ],
         "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "interactive_ui_tests Lacros version skew testing ash 107.0.5258.0",
+        "name": "interactive_ui_tests Lacros version skew testing ash 107.0.5259.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v107.0.5258.0",
-              "revision": "version:107.0.5258.0"
+              "location": "lacros_version_skew_tests_v107.0.5259.0",
+              "revision": "version:107.0.5259.0"
             }
           ],
           "dimension_sets": [
@@ -20890,7 +20890,7 @@
         },
         "test": "interactive_ui_tests",
         "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/",
-        "variant_id": "Lacros version skew testing ash 107.0.5258.0"
+        "variant_id": "Lacros version skew testing ash 107.0.5259.0"
       },
       {
         "isolate_profile_data": true,
@@ -21028,21 +21028,21 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v107.0.5258.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v107.0.5259.0/test_ash_chrome"
         ],
         "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests Lacros version skew testing ash 107.0.5258.0",
+        "name": "lacros_chrome_browsertests Lacros version skew testing ash 107.0.5259.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v107.0.5258.0",
-              "revision": "version:107.0.5258.0"
+              "location": "lacros_version_skew_tests_v107.0.5259.0",
+              "revision": "version:107.0.5259.0"
             }
           ],
           "dimension_sets": [
@@ -21054,7 +21054,7 @@
         },
         "test": "lacros_chrome_browsertests",
         "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/",
-        "variant_id": "Lacros version skew testing ash 107.0.5258.0"
+        "variant_id": "Lacros version skew testing ash 107.0.5259.0"
       },
       {
         "args": [
@@ -21174,21 +21174,21 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v107.0.5258.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v107.0.5259.0/test_ash_chrome"
         ],
         "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 107.0.5258.0",
+        "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 107.0.5259.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v107.0.5258.0",
-              "revision": "version:107.0.5258.0"
+              "location": "lacros_version_skew_tests_v107.0.5259.0",
+              "revision": "version:107.0.5259.0"
             }
           ],
           "dimension_sets": [
@@ -21200,7 +21200,7 @@
         },
         "test": "lacros_chrome_browsertests_run_in_series",
         "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/",
-        "variant_id": "Lacros version skew testing ash 107.0.5258.0"
+        "variant_id": "Lacros version skew testing ash 107.0.5259.0"
       },
       {
         "isolate_profile_data": true,
diff --git a/testing/buildbot/chromium.webrtc.json b/testing/buildbot/chromium.webrtc.json
index 4385864..ca2f1e2 100644
--- a/testing/buildbot/chromium.webrtc.json
+++ b/testing/buildbot/chromium.webrtc.json
@@ -111,7 +111,6 @@
   "WebRTC Chromium Linux Tester": {
     "gtest_tests": [
       {
-        "annotate": "graphing",
         "args": [
           "--gtest_filter=WebRtcStatsPerfBrowserTest.*:WebRtcVideoDisplayPerfBrowserTests*:WebRtcVideoQualityBrowserTests*:WebRtcVideoHighBitrateBrowserTest*:WebRtcWebcamBrowserTests*",
           "--run-manual",
@@ -125,11 +124,6 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "perf_builder_name_alias": "chromium-webrtc-rel-linux",
-        "perf_config": {
-          "a_default_rev": "r_webrtc_git",
-          "r_webrtc_git": "${webrtc_got_rev}"
-        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -153,7 +147,6 @@
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
         "name": "browser_tests_functional",
-        "perf_builder_name_alias": "chromium-webrtc-rel-linux",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -176,7 +169,6 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "perf_builder_name_alias": "chromium-webrtc-rel-linux",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -200,7 +192,6 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "perf_builder_name_alias": "chromium-webrtc-rel-linux",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -222,7 +213,6 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "perf_builder_name_alias": "chromium-webrtc-rel-linux",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -246,7 +236,6 @@
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
         "name": "content_browsertests_sequential",
-        "perf_builder_name_alias": "chromium-webrtc-rel-linux",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -271,7 +260,6 @@
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
         "name": "content_browsertests_stress",
-        "perf_builder_name_alias": "chromium-webrtc-rel-linux",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -292,7 +280,6 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "perf_builder_name_alias": "chromium-webrtc-rel-linux",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -313,7 +300,6 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "perf_builder_name_alias": "chromium-webrtc-rel-linux",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -336,7 +322,6 @@
   "WebRTC Chromium Mac Tester": {
     "gtest_tests": [
       {
-        "annotate": "graphing",
         "args": [
           "--gtest_filter=WebRtcStatsPerfBrowserTest.*:WebRtcVideoDisplayPerfBrowserTests*:WebRtcVideoQualityBrowserTests*:WebRtcVideoHighBitrateBrowserTest*:WebRtcWebcamBrowserTests*",
           "--run-manual",
@@ -350,11 +335,6 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "perf_builder_name_alias": "chromium-webrtc-rel-mac",
-        "perf_config": {
-          "a_default_rev": "r_webrtc_git",
-          "r_webrtc_git": "${webrtc_got_rev}"
-        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -379,7 +359,6 @@
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
         "name": "browser_tests_functional",
-        "perf_builder_name_alias": "chromium-webrtc-rel-mac",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -403,7 +382,6 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "perf_builder_name_alias": "chromium-webrtc-rel-mac",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -428,7 +406,6 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "perf_builder_name_alias": "chromium-webrtc-rel-mac",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -451,7 +428,6 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "perf_builder_name_alias": "chromium-webrtc-rel-mac",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -476,7 +452,6 @@
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
         "name": "content_browsertests_sequential",
-        "perf_builder_name_alias": "chromium-webrtc-rel-mac",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -502,7 +477,6 @@
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
         "name": "content_browsertests_stress",
-        "perf_builder_name_alias": "chromium-webrtc-rel-mac",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -524,7 +498,6 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "perf_builder_name_alias": "chromium-webrtc-rel-mac",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -546,7 +519,6 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "perf_builder_name_alias": "chromium-webrtc-rel-mac",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -570,7 +542,6 @@
   "WebRTC Chromium Win10 Tester": {
     "gtest_tests": [
       {
-        "annotate": "graphing",
         "args": [
           "--gtest_filter=WebRtcStatsPerfBrowserTest.*:WebRtcVideoDisplayPerfBrowserTests*:WebRtcVideoQualityBrowserTests*:WebRtcVideoHighBitrateBrowserTest*:WebRtcWebcamBrowserTests*",
           "--run-manual",
@@ -584,11 +555,6 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "perf_builder_name_alias": "chromium-webrtc-rel-win10",
-        "perf_config": {
-          "a_default_rev": "r_webrtc_git",
-          "r_webrtc_git": "${webrtc_got_rev}"
-        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -612,7 +578,6 @@
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
         "name": "browser_tests_functional",
-        "perf_builder_name_alias": "chromium-webrtc-rel-win10",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -635,7 +600,6 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "perf_builder_name_alias": "chromium-webrtc-rel-win10",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -659,7 +623,6 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "perf_builder_name_alias": "chromium-webrtc-rel-win10",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -681,7 +644,6 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "perf_builder_name_alias": "chromium-webrtc-rel-win10",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -705,7 +667,6 @@
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
         "name": "content_browsertests_sequential",
-        "perf_builder_name_alias": "chromium-webrtc-rel-win10",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -730,7 +691,6 @@
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
         "name": "content_browsertests_stress",
-        "perf_builder_name_alias": "chromium-webrtc-rel-win10",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -751,7 +711,6 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "perf_builder_name_alias": "chromium-webrtc-rel-win10",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -772,7 +731,6 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "perf_builder_name_alias": "chromium-webrtc-rel-win10",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
diff --git a/testing/buildbot/chromium.win.json b/testing/buildbot/chromium.win.json
index a46b331..9c938c0 100644
--- a/testing/buildbot/chromium.win.json
+++ b/testing/buildbot/chromium.win.json
@@ -7,7 +7,9 @@
         "args": [
           "--num-retries=3",
           "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
-          "--git-revision=${got_revision}"
+          "--git-revision=${got_revision}",
+          "--exit-after-n-crashes-or-timeouts",
+          "150"
         ],
         "check_flakiness_for_new_tests": false,
         "isolate_name": "blink_web_tests",
diff --git a/testing/buildbot/filters/fuchsia.browser_tests.filter b/testing/buildbot/filters/fuchsia.browser_tests.filter
index ce4d836..4c56be52 100644
--- a/testing/buildbot/filters/fuchsia.browser_tests.filter
+++ b/testing/buildbot/filters/fuchsia.browser_tests.filter
@@ -126,10 +126,6 @@
 -ExtensionWebRequestApiTest.WebRequestPacRequestProtection
 -ExtensionWebRequestApiTest.WebSocketRequestOnWorker
 
-# TODO(crbug.com/1326970): //chrome/test/data/policy/policy_test_cases.json doesn't seem to account
-# for "fuchsia"
--PolicyPrefsTestCoverageTest.AllPoliciesHaveATestCase
-
 # TODO(crbug.com/1326971):
 # ../../chrome/browser/privacy_budget/privacy_budget_browsertest.cc:505: Failure
 # Value of: base::FeatureList::IsEnabled(features::kIdentifiabilityStudy)
diff --git a/testing/buildbot/mixins.pyl b/testing/buildbot/mixins.pyl
index bc6ed6a..8e1da0a2 100644
--- a/testing/buildbot/mixins.pyl
+++ b/testing/buildbot/mixins.pyl
@@ -379,15 +379,6 @@
       'service_account': 'chromium-tester@chops-service-accounts.iam.gserviceaccount.com',
     },
   },
-  'chromium-webrtc-rel-linux': {
-    'perf_builder_name_alias': 'chromium-webrtc-rel-linux',
-  },
-  'chromium-webrtc-rel-mac': {
-    'perf_builder_name_alias': 'chromium-webrtc-rel-mac',
-  },
-  'chromium-webrtc-rel-win10': {
-    'perf_builder_name_alias': 'chromium-webrtc-rel-win10',
-  },
   # Used for invert CQ tests selection. Adding ci_only: False to
   # test_suite_exceptions.pyl to select tests that are allowed on CQ builders.
   'ci_only': {
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl
index 689264a6..0a5aa6a00 100644
--- a/testing/buildbot/test_suite_exceptions.pyl
+++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -367,6 +367,12 @@
           'shards': 8,
         },
       },
+      'WebKit Win10': {
+        'args': [
+	  '--exit-after-n-crashes-or-timeouts',
+	  '150',
+        ],
+      },
       'Win10 Tests x64': {
         'args': [
           '--target',
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl
index 47ffe892..fa412a3 100644
--- a/testing/buildbot/test_suites.pyl
+++ b/testing/buildbot/test_suites.pyl
@@ -4810,11 +4810,6 @@
           '--test-launcher-bot-mode',
           '--test-launcher-print-test-stdio=always',
         ],
-        'annotate': 'graphing',
-        'perf_config': {
-          'a_default_rev': 'r_webrtc_git',
-          'r_webrtc_git': '${webrtc_got_rev}'
-        },
       },
       # Run capture unittests as well since our bots have real webcams.
       'capture_unittests': {
@@ -5128,6 +5123,29 @@
       },
     },
 
+    'wpt_web_tests_content_shell': {
+      'wpt_tests_suite': {
+        'args': [
+          '--child-processes=8',
+          '--run-by-dir=0',
+          '--no-restart-on-new-group',
+          '--product=content_shell'
+        ],
+        'merge': {
+          'args': [
+            '--verbose',
+          ],
+          'script': '//third_party/blink/tools/merge_web_test_results.py',
+        },
+        'isolate_name': 'wpt_tests_isolate',
+        'results_handler': 'layout tests',
+        'swarming': {
+          'shards': 15,
+        },
+        'experiment_percentage': 100,
+      },
+    },
+
     'wpt_web_tests_identity': {
       'wpt_tests_suite': {
         'args': [
diff --git a/testing/buildbot/variants.pyl b/testing/buildbot/variants.pyl
index 6662f155..b69115c0 100644
--- a/testing/buildbot/variants.pyl
+++ b/testing/buildbot/variants.pyl
@@ -22,15 +22,15 @@
   },
   'LACROS_VERSION_SKEW_CANARY': {
     'args': [
-      '--ash-chrome-path-override=../../lacros_version_skew_tests_v107.0.5258.0/test_ash_chrome',
+      '--ash-chrome-path-override=../../lacros_version_skew_tests_v107.0.5259.0/test_ash_chrome',
     ],
-    'identifier': 'Lacros version skew testing ash 107.0.5258.0',
+    'identifier': 'Lacros version skew testing ash 107.0.5259.0',
     'swarming': {
       'cipd_packages': [
         {
           'cipd_package': 'chromium/testing/linux-ash-chromium/x86_64/ash.zip',
-          'location': 'lacros_version_skew_tests_v107.0.5258.0',
-          'revision': 'version:107.0.5258.0',
+          'location': 'lacros_version_skew_tests_v107.0.5259.0',
+          'revision': 'version:107.0.5259.0',
         },
       ],
     },
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl
index 83798c6..13ce7eb 100644
--- a/testing/buildbot/waterfalls.pyl
+++ b/testing/buildbot/waterfalls.pyl
@@ -3739,6 +3739,15 @@
         },
         'use_swarming': False,
       },
+      'linux-wpt-content-shell-fyi-rel': {
+        'mixins': [
+          'has_native_resultdb_integration',
+          'linux-bionic',
+        ],
+        'test_suites': {
+          'isolated_scripts': 'wpt_web_tests_content_shell',
+        },
+      },
       'linux-wpt-fyi-rel': {
         'mixins': [
           'has_native_resultdb_integration',
@@ -6090,13 +6099,6 @@
       'WebRTC Chromium Linux Tester': {
         'mixins': [
           'linux-bionic',
-          # Set an alias for builder name used in perf dashboard.
-          # Historically, webrtc perf tests had perf-id rather than builder
-          # name to present their data in perf dashboard. As perf-id was
-          # deprecated in perf dashboard, we add perf_builder_name_alias
-          # field to replace perf-id, keeping the metrics in perf dashboard
-          # consistent.
-          'chromium-webrtc-rel-linux',
         ],
         'test_suites': {
           'gtest_tests': 'webrtc_chromium_tests_with_baremetal_tests',
@@ -6109,7 +6111,6 @@
       },
       'WebRTC Chromium Mac Tester': {
         'mixins': [
-          'chromium-webrtc-rel-mac',
           'mac_12_x64',
         ],
         'test_suites': {
@@ -6129,9 +6130,6 @@
             },
           ]
         },
-        'mixins': [
-          'chromium-webrtc-rel-win10',
-        ],
         'test_suites': {
           'gtest_tests': 'webrtc_chromium_tests_with_baremetal_tests',
         },
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index 41b5c1e8..6a8dcae 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -2890,21 +2890,6 @@
             ]
         }
     ],
-    "CleanUndecryptablePasswordsLinuxDuringInitialSync": [
-        {
-            "platforms": [
-                "linux"
-            ],
-            "experiments": [
-                {
-                    "name": "Enabled",
-                    "enable_features": [
-                        "SyncUndecryptablePasswordsLinux"
-                    ]
-                }
-            ]
-        }
-    ],
     "Collections": [
         {
             "platforms": [
@@ -3446,6 +3431,21 @@
             ]
         }
     ],
+    "CrosDeviceActiveCountingMonthlyCheckMembership": [
+        {
+            "platforms": [
+                "chromeos"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "DeviceActiveClientMonthlyCheckMembership"
+                    ]
+                }
+            ]
+        }
+    ],
     "CrosLazyLoginWebUI": [
         {
             "platforms": [
@@ -3623,30 +3623,6 @@
             ]
         }
     ],
-    "DeprioritizeTimersUntilDOMContentLoadedExperiment": [
-        {
-            "platforms": [
-                "android",
-                "chromeos",
-                "chromeos_lacros",
-                "ios",
-                "linux",
-                "mac",
-                "windows"
-            ],
-            "experiments": [
-                {
-                    "name": "DeprioritizeTimersUntilDOMContentLoaded_20211112",
-                    "params": {
-                        "DeprioritizeDOMTimersPhase": "ondomcontentloaded"
-                    },
-                    "enable_features": [
-                        "DeprioritizeDOMTimersDuringPageLoading"
-                    ]
-                }
-            ]
-        }
-    ],
     "DesktopNtpModules": [
         {
             "platforms": [
@@ -3658,13 +3634,10 @@
                 {
                     "name": "RecipeTasksRuleBasedDiscountDriveManagedUsersCartOptimizeRecipeTasksSAPIV2Fre_Enabled",
                     "params": {
-                        "NtpDriveModuleExperimentGroupParam": "foo:bar",
-                        "NtpDriveModuleManagedUsersOnlyParam": "true",
                         "NtpModulesLoadTimeoutMillisecondsParam": "3000",
                         "use_sapi_v2": "true"
                     },
                     "enable_features": [
-                        "NtpDriveModule",
                         "NtpModulesLoadTimeoutMilliseconds",
                         "NtpPhotosModule"
                     ],
@@ -3675,13 +3648,10 @@
                 {
                     "name": "Recipes_SAPIV2_20220415",
                     "params": {
-                        "NtpDriveModuleExperimentGroupParam": "foo:bar",
-                        "NtpDriveModuleManagedUsersOnlyParam": "true",
                         "NtpModulesLoadTimeoutMillisecondsParam": "3000",
                         "use_sapi_v2": "true"
                     },
                     "enable_features": [
-                        "NtpDriveModule",
                         "NtpModulesLoadTimeoutMilliseconds",
                         "NtpRecipeTasksModule"
                     ],
@@ -3692,12 +3662,9 @@
                 {
                     "name": "Recipes_SAPIV2_Control_20220415",
                     "params": {
-                        "NtpDriveModuleExperimentGroupParam": "foo:bar",
-                        "NtpDriveModuleManagedUsersOnlyParam": "true",
                         "NtpModulesLoadTimeoutMillisecondsParam": "3000"
                     },
                     "enable_features": [
-                        "NtpDriveModule",
                         "NtpModulesLoadTimeoutMilliseconds",
                         "NtpRecipeTasksModule"
                     ],
@@ -6972,6 +6939,29 @@
             ]
         }
     ],
+    "PageContentAnnotationsAndroid": [
+        {
+            "platforms": [
+                "android"
+            ],
+            "experiments": [
+                {
+                    "name": "EnabledNoFilters_20220502",
+                    "params": {
+                        "extract_related_searches": "true",
+                        "models_to_execute_v2": "OPTIMIZATION_TARGET_PAGE_ENTITIES:de:en:en-AU:en-CA:en-GB:en-US:es:fr:it:nl:pt:tr",
+                        "supported_locales": "de,en,en-AU,en-CA,en-GB,en-US,es,fr,it,nl,pt,tr",
+                        "write_to_history_service": "true"
+                    },
+                    "enable_features": [
+                        "PageContentAnnotations",
+                        "PageEntitiesModelBypassFilters",
+                        "PageEntitiesPageContentAnnotations"
+                    ]
+                }
+            ]
+        }
+    ],
     "PageInfoAboutThisSiteMoreInfo": [
         {
             "platforms": [
diff --git a/third_party/androidx/fetch_all_androidx.py b/third_party/androidx/fetch_all_androidx.py
index f52e24c..2988deb 100755
--- a/third_party/androidx/fetch_all_androidx.py
+++ b/third_party/androidx/fetch_all_androidx.py
@@ -50,17 +50,6 @@
     #('androidx_core_core/core-1.9.0-SNAPSHOT.aar',
     # 'https://androidx.dev/snapshots/builds/8545498/artifacts/repository/'
     # 'androidx/core/core/1.8.0-SNAPSHOT/core-1.8.0-20220505.122105-1.aar'),
-
-    # Context: https://crbug.com/1349920 and https://crbug.com/1349521
-    ('androidx_appcompat_appcompat/appcompat-1.7.0-SNAPSHOT.aar',
-     'https://androidx.dev/snapshots/builds/8811104/artifacts/repository/'
-     'androidx/appcompat/appcompat/1.5.0-SNAPSHOT/'
-     'appcompat-1.5.0-20220708.124951-1.aar'),
-    ('androidx_appcompat_appcompat_resources/'
-     'appcompat-resources-1.7.0-SNAPSHOT.aar',
-     'https://androidx.dev/snapshots/builds/8811104/artifacts/repository/'
-     'androidx/appcompat/appcompat-resources/1.5.0-SNAPSHOT/'
-     'appcompat-resources-1.5.0-20220708.124951-1.aar'),
 ]
 
 
diff --git a/third_party/blink/common/fenced_frame/fenced_frame_utils.cc b/third_party/blink/common/fenced_frame/fenced_frame_utils.cc
index 0b2f939..1932339d 100644
--- a/third_party/blink/common/fenced_frame/fenced_frame_utils.cc
+++ b/third_party/blink/common/fenced_frame/fenced_frame_utils.cc
@@ -16,8 +16,9 @@
 bool IsValidFencedFrameURL(const GURL& url) {
   if (!url.is_valid())
     return false;
-  return url.SchemeIs(url::kHttpsScheme) || url.IsAboutBlank() ||
-         net::IsLocalhost(url);
+  return (url.SchemeIs(url::kHttpsScheme) || url.IsAboutBlank() ||
+          net::IsLocalhost(url)) &&
+         !url.parsed_for_possibly_invalid_spec().potentially_dangling_markup;
 }
 
 const char kURNUUIDprefix[] = "urn:uuid:";
diff --git a/third_party/blink/common/origin_trials/trial_token_validator_unittest.cc b/third_party/blink/common/origin_trials/trial_token_validator_unittest.cc
index 4e74c02..252e89d 100644
--- a/third_party/blink/common/origin_trials/trial_token_validator_unittest.cc
+++ b/third_party/blink/common/origin_trials/trial_token_validator_unittest.cc
@@ -479,7 +479,7 @@
   virtual std::unique_ptr<const ValidateTokenWrapper> CreateWrapper(
       const blink::TrialTokenValidator& validator) const {
     return std::make_unique<ValidateTokenWrapper>(validator);
-  };
+  }
 };
 
 class ValidateTokenAndTrialWrapperFactory : public ValidateTokenWrapperFactory {
@@ -488,7 +488,7 @@
   std::unique_ptr<const ValidateTokenWrapper> CreateWrapper(
       const blink::TrialTokenValidator& validator) const override {
     return std::make_unique<ValidateTokenAndTrialWrapper>(validator);
-  };
+  }
 };
 
 class ValidateTokenAndTrialWithOriginInfoWrapperFactory
@@ -499,7 +499,7 @@
       const blink::TrialTokenValidator& validator) const override {
     return std::make_unique<ValidateTokenAndTrialWithOriginInfoWrapper>(
         validator);
-  };
+  }
 };
 
 // Test suite for tests where TrialTokenValidator::ValidateToken and
diff --git a/third_party/blink/public/common/privacy_budget/identifiability_study_settings_provider.h b/third_party/blink/public/common/privacy_budget/identifiability_study_settings_provider.h
index f226a56..fee0f51 100644
--- a/third_party/blink/public/common/privacy_budget/identifiability_study_settings_provider.h
+++ b/third_party/blink/public/common/privacy_budget/identifiability_study_settings_provider.h
@@ -42,7 +42,7 @@
   // Returns the list of font families which should be actively sampled.
   virtual std::vector<std::string> FontFamiliesToActivelySample() const {
     return std::vector<std::string>();
-  };
+  }
 };
 
 }  // namespace blink
diff --git a/third_party/blink/public/mojom/manifest/manifest.mojom b/third_party/blink/public/mojom/manifest/manifest.mojom
index b2347fdf..463665f8 100644
--- a/third_party/blink/public/mojom/manifest/manifest.mojom
+++ b/third_party/blink/public/mojom/manifest/manifest.mojom
@@ -176,7 +176,7 @@
 // https://www.w3.org/TR/manifest-app-info/#screenshots-member. This includes
 // a ImageResource with some additional members.
 struct ManifestScreenshot {
-  enum Platform {
+  enum FormFactor {
     kUnknown = 0,
     kWide,
     kNarrow,
@@ -184,8 +184,8 @@
 
   ManifestImageResource image;
 
-  // The distribution platform for which a given screenshot applies.
-  Platform platform;
+  // The form factor for which a given screenshot applies.
+  FormFactor form_factor;
 };
 
 // Structure representing a share target file.
diff --git a/third_party/blink/renderer/bindings/core/v8/script_streamer.h b/third_party/blink/renderer/bindings/core/v8/script_streamer.h
index 80f0b22..a599467 100644
--- a/third_party/blink/renderer/bindings/core/v8/script_streamer.h
+++ b/third_party/blink/renderer/bindings/core/v8/script_streamer.h
@@ -283,7 +283,7 @@
   void Cancel() { cancelled_.Set(); }
 
   // This may return false if V8 failed to create a background streaming task.
-  bool CanStream() const { return task_.get(); };
+  bool CanStream() const { return task_.get(); }
 
   v8::ScriptCompiler::StreamedSource* Source(v8::ScriptType expected_type);
 
diff --git a/third_party/blink/renderer/core/animation/element_animations.cc b/third_party/blink/renderer/core/animation/element_animations.cc
index 865ba92..0251eda 100644
--- a/third_party/blink/renderer/core/animation/element_animations.cc
+++ b/third_party/blink/renderer/core/animation/element_animations.cc
@@ -39,7 +39,7 @@
 ElementAnimations::ElementAnimations()
     : animation_style_change_(false),
       composited_background_color_status_(static_cast<unsigned>(
-          CompositedPaintStatus::kNeedsRepaintOrNoAnimation)){};
+          CompositedPaintStatus::kNeedsRepaintOrNoAnimation)) {}
 
 ElementAnimations::~ElementAnimations() = default;
 
diff --git a/third_party/blink/renderer/core/css/selector_checker.h b/third_party/blink/renderer/core/css/selector_checker.h
index 0ceb4a8b..aea56096 100644
--- a/third_party/blink/renderer/core/css/selector_checker.h
+++ b/third_party/blink/renderer/core/css/selector_checker.h
@@ -342,8 +342,8 @@
 }  // namespace blink
 
 WTF_ALLOW_MOVE_INIT_AND_COMPARE_WITH_MEM_FUNCTIONS(
-    blink::SelectorChecker::StyleScopeActivation);
+    blink::SelectorChecker::StyleScopeActivation)
 WTF_ALLOW_MOVE_INIT_AND_COMPARE_WITH_MEM_FUNCTIONS(
-    blink::SelectorChecker::StyleScopeFrame);
+    blink::SelectorChecker::StyleScopeFrame)
 
 #endif  // THIRD_PARTY_BLINK_RENDERER_CORE_CSS_SELECTOR_CHECKER_H_
diff --git a/third_party/blink/renderer/core/document_transition/document_transition.h b/third_party/blink/renderer/core/document_transition/document_transition.h
index 70f8aa17..b08fdb7 100644
--- a/third_party/blink/renderer/core/document_transition/document_transition.h
+++ b/third_party/blink/renderer/core/document_transition/document_transition.h
@@ -132,6 +132,7 @@
 
  private:
   friend class DocumentTransitionTest;
+  friend class AXDocumentTransitionTest;
 
   enum class State { kIdle, kCapturing, kCaptured, kStarted };
 
diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink/renderer/core/dom/document.cc
index 78c5e19..c264de8 100644
--- a/third_party/blink/renderer/core/dom/document.cc
+++ b/third_party/blink/renderer/core/dom/document.cc
@@ -6187,7 +6187,6 @@
 }
 
 ScriptPromise Document::requestStorageAccess(ScriptState* script_state) {
-  DCHECK(GetFrame());
   ScriptPromiseResolver* resolver =
       MakeGarbageCollected<ScriptPromiseResolver>(script_state);
 
@@ -6195,6 +6194,17 @@
   // can be changed when it is resolved or rejected.
   ScriptPromise promise = resolver->Promise();
 
+  if (!GetFrame()) {
+    FireRequestStorageAccessHistogram(RequestStorageResult::REJECTED_NO_ORIGIN);
+
+    // Note that in detached frames, resolvers are not able to return a promise.
+    return ScriptPromise::RejectWithDOMException(
+        script_state, MakeGarbageCollected<DOMException>(
+                          DOMExceptionCode::kSecurityError,
+                          "requestStorageAccess Cannot be used unless the "
+                          "document is fully active."));
+  }
+
   const bool has_user_gesture =
       LocalFrame::HasTransientUserActivation(GetFrame());
   if (!has_user_gesture) {
@@ -6209,18 +6219,6 @@
     return promise;
   }
 
-  if (!TopFrameOrigin()) {
-    AddConsoleMessage(MakeGarbageCollected<ConsoleMessage>(
-        mojom::blink::ConsoleMessageSource::kSecurity,
-        mojom::blink::ConsoleMessageLevel::kError,
-        "requestStorageAccess: Cannot execute in documents lacking top-frame "
-        "origins."));
-    FireRequestStorageAccessHistogram(RequestStorageResult::REJECTED_NO_ORIGIN);
-
-    resolver->Reject();
-    return promise;
-  }
-
   if (dom_window_->GetSecurityOrigin()->IsOpaque()) {
     AddConsoleMessage(MakeGarbageCollected<ConsoleMessage>(
         mojom::blink::ConsoleMessageSource::kSecurity,
diff --git a/third_party/blink/renderer/core/dom/node.h b/third_party/blink/renderer/core/dom/node.h
index edca080..c3be78f4 100644
--- a/third_party/blink/renderer/core/dom/node.h
+++ b/third_party/blink/renderer/core/dom/node.h
@@ -355,6 +355,9 @@
   DISABLE_CFI_PERF bool IsBackdropPseudoElement() const {
     return GetPseudoId() == kPseudoIdBackdrop;
   }
+  DISABLE_CFI_PERF bool IsDocumentTransitionPseudoElement() const {
+    return IsTransitionPseudoElement(GetPseudoId());
+  }
   virtual PseudoId GetPseudoId() const { return kPseudoIdNone; }
 
   CustomElementState GetCustomElementState() const {
diff --git a/third_party/blink/renderer/core/frame/browser_controls_test.cc b/third_party/blink/renderer/core/frame/browser_controls_test.cc
index c792a03..0bb666e 100644
--- a/third_party/blink/renderer/core/frame/browser_controls_test.cc
+++ b/third_party/blink/renderer/core/frame/browser_controls_test.cc
@@ -62,7 +62,7 @@
 // From browser_controls_offset_manager.cc.
 const int64_t kShowHideMaxDurationMs = 200;
 
-};  // namespace
+}  // namespace
 
 // These tests cover interactions between scrolling and browser controls, with a
 // focus on Blink-observable side effects. Scrolling happens in the compositor,
diff --git a/third_party/blink/renderer/core/html/html_iframe_element.cc b/third_party/blink/renderer/core/html/html_iframe_element.cc
index 3fd5701d..ff6d21e3 100644
--- a/third_party/blink/renderer/core/html/html_iframe_element.cc
+++ b/third_party/blink/renderer/core/html/html_iframe_element.cc
@@ -78,7 +78,7 @@
           base::FeatureList::IsEnabled(features::kAnonymousIframeOriginTrial));
 }
 
-};  // namespace
+}  // namespace
 
 HTMLIFrameElement::HTMLIFrameElement(Document& document)
     : HTMLFrameElementBase(html_names::kIFrameTag, document),
diff --git a/third_party/blink/renderer/core/html/parser/background_html_token_producer.cc b/third_party/blink/renderer/core/html/parser/background_html_token_producer.cc
index dab21663..b043e1e1 100644
--- a/third_party/blink/renderer/core/html/parser/background_html_token_producer.cc
+++ b/third_party/blink/renderer/core/html/parser/background_html_token_producer.cc
@@ -246,6 +246,8 @@
 
   if (end_of_file) {
     input_.Append(SegmentedString(String(&kEndOfFileMarker, 1)));
+    if (in_progress_token_data_.has_value())
+      ++in_progress_token_data_->string_length_at_start_of_token;
     input_.Close();
   }
   return result;
diff --git a/third_party/blink/renderer/core/html/parser/html_token_producer_test.cc b/third_party/blink/renderer/core/html/parser/html_token_producer_test.cc
index 40acd72..20268e8 100644
--- a/third_party/blink/renderer/core/html/parser/html_token_producer_test.cc
+++ b/third_party/blink/renderer/core/html/parser/html_token_producer_test.cc
@@ -53,6 +53,26 @@
   EXPECT_TRUE(producer.IsUsingBackgroundProducer());
 }
 
+TEST_F(HTMLTokenProducerTest, TagSplitAcrossSegmentReachesEnd) {
+  HTMLInputStream input_stream;
+  HTMLTokenProducer producer(input_stream, HTMLParserOptions(), true,
+                             HTMLTokenizer::kDataState);
+  String string("<bo");
+  input_stream.AppendToEnd(SegmentedString(string));
+  producer.AppendToEnd(string);
+  ASSERT_FALSE(producer.ParseNextToken());
+
+  input_stream.AppendToEnd(SegmentedString("dy>"));
+  producer.AppendToEnd(String("dy>"));
+  input_stream.MarkEndOfFile();
+  producer.MarkEndOfFile();
+  // Read all the remaining tokens.
+  while (producer.ParseNextToken())
+    ;
+  // Should be at the end of input.
+  EXPECT_EQ(0u, input_stream.length());
+}
+
 TEST_F(HTMLTokenProducerTest, TagSplitAcrossSegments) {
   HTMLInputStream input_stream;
   HTMLTokenProducer producer(input_stream, HTMLParserOptions(), true,
diff --git a/third_party/blink/renderer/core/layout/layout_theme_default.cc b/third_party/blink/renderer/core/layout/layout_theme_default.cc
index ac7fe0e..7d19cb8 100644
--- a/third_party/blink/renderer/core/layout/layout_theme_default.cc
+++ b/third_party/blink/renderer/core/layout/layout_theme_default.cc
@@ -164,11 +164,16 @@
                                             Color active_foreground_color,
                                             Color inactive_background_color,
                                             Color inactive_foreground_color) {
-  active_selection_background_color_ = active_background_color;
-  active_selection_foreground_color_ = active_foreground_color;
-  inactive_selection_background_color_ = inactive_background_color;
-  inactive_selection_foreground_color_ = inactive_foreground_color;
-  PlatformColorsDidChange();
+  if (active_selection_background_color_ != active_background_color ||
+      active_selection_foreground_color_ != active_foreground_color ||
+      inactive_selection_background_color_ != inactive_background_color ||
+      inactive_selection_foreground_color_ != inactive_foreground_color) {
+    active_selection_background_color_ = active_background_color;
+    active_selection_foreground_color_ = active_foreground_color;
+    inactive_selection_background_color_ = inactive_background_color;
+    inactive_selection_foreground_color_ = inactive_foreground_color;
+    PlatformColorsDidChange();
+  }
 }
 
 void LayoutThemeDefault::AdjustInnerSpinButtonStyle(
diff --git a/third_party/blink/renderer/core/layout/layout_theme_test.cc b/third_party/blink/renderer/core/layout/layout_theme_test.cc
index c6752c6..d0eb8a32 100644
--- a/third_party/blink/renderer/core/layout/layout_theme_test.cc
+++ b/third_party/blink/renderer/core/layout/layout_theme_test.cc
@@ -133,6 +133,25 @@
             LayoutTheme::GetTheme().ActiveSelectionForegroundColor(
                 mojom::blink::ColorScheme::kLight));
 }
+
+TEST_F(LayoutThemeTest, SetSelectionColorsNoInvalidation) {
+  LayoutTheme::GetTheme().SetSelectionColors(Color::kWhite, Color::kWhite,
+                                             Color::kWhite, Color::kWhite);
+
+  SetHtmlInnerHTML("<body>");
+  EXPECT_EQ(GetDocument().documentElement()->GetStyleChangeType(),
+            StyleChangeType::kNoStyleChange);
+  EXPECT_EQ(Color::kWhite,
+            LayoutTheme::GetTheme().ActiveSelectionForegroundColor(
+                mojom::blink::ColorScheme::kLight));
+
+  // Setting selection colors to the same values should not cause style
+  // recalculation.
+  LayoutTheme::GetTheme().SetSelectionColors(Color::kWhite, Color::kWhite,
+                                             Color::kWhite, Color::kWhite);
+  EXPECT_EQ(GetDocument().documentElement()->GetStyleChangeType(),
+            StyleChangeType::kNoStyleChange);
+}
 #endif  // !BUILDFLAG(IS_MAC)
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/layout/ng/ng_anchor_query.cc b/third_party/blink/renderer/core/layout/ng/ng_anchor_query.cc
index 68fea645..707e175 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_anchor_query.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_anchor_query.cc
@@ -70,8 +70,9 @@
                                const NGPhysicalFragment& fragment,
                                const LogicalRect& rect) {
   DCHECK(fragment.GetLayoutObject());
-  Set(name, MakeGarbageCollected<NGLogicalAnchorReference>(
-                fragment, rect, fragment.IsPositioned()));
+  Set(name,
+      MakeGarbageCollected<NGLogicalAnchorReference>(
+          fragment, rect, /* is_invalid */ fragment.IsOutOfFlowPositioned()));
 }
 
 void NGLogicalAnchorQuery::Set(const AtomicString& name,
@@ -108,12 +109,12 @@
     const NGPhysicalAnchorQuery& physical_query,
     const WritingModeConverter& converter,
     const LogicalOffset& additional_offset,
-    bool is_positioned) {
+    bool is_invalid) {
   for (const auto& it : physical_query.anchor_references_) {
     LogicalRect rect = converter.ToLogical(it.value->rect);
     rect.offset += additional_offset;
     Set(it.key, MakeGarbageCollected<NGLogicalAnchorReference>(
-                    *it.value->fragment, rect, is_positioned));
+                    *it.value->fragment, rect, is_invalid));
   }
 }
 
diff --git a/third_party/blink/renderer/core/layout/ng/ng_anchor_query.h b/third_party/blink/renderer/core/layout/ng/ng_anchor_query.h
index 3112824..651c61e 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_anchor_query.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_anchor_query.h
@@ -99,7 +99,7 @@
   void SetFromPhysical(const NGPhysicalAnchorQuery& physical_query,
                        const WritingModeConverter& converter,
                        const LogicalOffset& additional_offset,
-                       bool is_positioned);
+                       bool is_invalid);
   void SetAsStitched(base::span<const NGLogicalLink> children,
                      WritingDirectionMode writing_direction);
 
diff --git a/third_party/blink/renderer/core/layout/ng/ng_anchor_query_test.cc b/third_party/blink/renderer/core/layout/ng/ng_anchor_query_test.cc
index 1dfb80fe..a3fff93 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_anchor_query_test.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_anchor_query_test.cc
@@ -182,31 +182,38 @@
     <div id="container" style="position: relative">
       <div id="static1">
         <div id="rel2" style="position: relative">
-          <div id="rel1" style="position: relative">
-            <div style="anchor-name: --static"></div>
-            <div style="anchor-name: --abspos; position: absolute"></div>
+          <div id="abs1" style="position: absolute">
+            <div id="rel1" style="position: relative">
+              <div style="anchor-name: --static"></div>
+              <div style="anchor-name: --abspos; position: absolute"></div>
+            </div>
           </div>
+        </div>
       </div>
     </div>
   )HTML");
   // For `rel1`, only `--static` is valid because "if el has the same containing
-  // block as the querying element, el is not positioned."
+  // block as the querying element, el is not absolutely positioned."
   EXPECT_THAT(ValidAnchorNames(*GetElementById("rel1")),
               testing::ElementsAre("--static"));
-  // For `rel2`, nothing is valid because "if el has a different containing
+  // For `abs1`, all anchors are valid because "if el has a different containing
   // block from the querying element, the last containing block in el's
   // containing block chain before reaching the querying element's containing
-  // block is not positioned." The "last containing block" is `rel1`, which is
-  // positioned (has `position: relative`.)
+  // block is not absolutely positioned." The "last containing block" is `rel1`,
+  // which is not absolutely positioned (has `position: relative`.)
+  EXPECT_THAT(ValidAnchorNames(*GetElementById("abs1")),
+              testing::ElementsAre("--abspos", "--static"));
+  // For the same reason, `rel2` has no anchors because the "last containing
+  // block" is `abs1`.
   EXPECT_THAT(ValidAnchorNames(*GetElementById("rel2")),
               testing::ElementsAre());
-  // Same for `static1`. Its last containing block is `rel2`. It's not visible
-  // to the web though, as the `static1` can't be a containing block of
-  // positioned objects. This is to test the internal propagation mechanism.
+  // The last containing block for `static1` is `rel2`. It's not visible to the
+  // web though, as the `static1` can't be a containing block of positioned
+  // objects. This is to test the internal propagation mechanism.
   EXPECT_THAT(ValidAnchorNames(*GetElementById("static1")),
-              testing::ElementsAre());
+              testing::ElementsAre("--abspos", "--static"));
   // For `container`, the last containing block is `static1`, which is not
-  // positioned, so all anchor names are valid.
+  // absolutely positioned, so all anchor names are valid.
   EXPECT_THAT(ValidAnchorNames(*GetElementById("container")),
               testing::ElementsAre("--abspos", "--static"));
 }
diff --git a/third_party/blink/renderer/core/layout/ng/ng_container_fragment_builder.cc b/third_party/blink/renderer/core/layout/ng/ng_container_fragment_builder.cc
index f994bda..d23921a1 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_container_fragment_builder.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_container_fragment_builder.cc
@@ -404,8 +404,9 @@
 
   // Collect any anchor references.
   if (const NGPhysicalAnchorQuery* anchor_query = fragment.AnchorQuery()) {
-    anchor_query_.SetFromPhysical(*anchor_query, converter, adjusted_offset,
-                                  fragment.IsPositioned());
+    anchor_query_.SetFromPhysical(
+        *anchor_query, converter, adjusted_offset,
+        /* is_invalid */ fragment.IsOutOfFlowPositioned());
   }
 
   NGFragmentedOutOfFlowData* oof_data = fragment.FragmentedOutOfFlowData();
diff --git a/third_party/blink/renderer/core/loader/resource/css_style_sheet_resource.cc b/third_party/blink/renderer/core/loader/resource/css_style_sheet_resource.cc
index d16551db..da42845 100644
--- a/third_party/blink/renderer/core/loader/resource/css_style_sheet_resource.cc
+++ b/third_party/blink/renderer/core/loader/resource/css_style_sheet_resource.cc
@@ -184,8 +184,6 @@
         response_body_loader_client->DidCancelLoadingBody();
         break;
       case MOJO_RESULT_FAILED_PRECONDITION:
-        DCHECK(info);
-        DCHECK(!decoded_sheet_text.IsNull());
         response_body_loader_client->DidReceiveDecodedData(decoded_sheet_text,
                                                            std::move(info));
         response_body_loader_client->DidFinishLoadingBody();
@@ -369,7 +367,7 @@
         // already be set.
         DCHECK(!decoded_sheet_text_.IsNull());
       } else {
-        DCHECK(decoded_sheet_text_.IsNull());
+        DCHECK(LoadFailedOrCanceled() || decoded_sheet_text_.IsNull());
       }
       break;
     case LoadingState::kLoading:
diff --git a/third_party/blink/renderer/core/streams/readable_stream_test.cc b/third_party/blink/renderer/core/streams/readable_stream_test.cc
index 427ecce..e60f944 100644
--- a/third_party/blink/renderer/core/streams/readable_stream_test.cc
+++ b/third_party/blink/renderer/core/streams/readable_stream_test.cc
@@ -726,7 +726,7 @@
 
   Mock::VerifyAndClear(mock);
   Mock::AllowLeak(mock);
-};
+}
 
 bool IsTypeError(ScriptState* script_state,
                  ScriptValue value,
diff --git a/third_party/blink/renderer/core/timing/Pointer_interaction_state_machine.md b/third_party/blink/renderer/core/timing/Pointer_interaction_state_machine.md
new file mode 100644
index 0000000..9aa1af7e
--- /dev/null
+++ b/third_party/blink/renderer/core/timing/Pointer_interaction_state_machine.md
@@ -0,0 +1,185 @@
+# Event Timing - Pointer Interaction State Machine
+Aoyuan Zuo, August 09 2022
+
+[TOC]
+
+## Background
+A pointer interaction is a group of event handlers that fire during the same logical user gesture from a pointer device such as mouse, pen, or finger. For example, A single "tap" interaction on a touchscreen device should include multiple events, such as `pointerdown`, `pointerup`, and `click`. [EventTiming](https://w3c.github.io/event-timing/) group up certain events as interactions by assigning the same & non-trivial [interactionId](https://www.w3.org/TR/2022/WD-event-timing-20220524/#dom-performanceeventtiming-interactionid) following a state machine logic located in [`responsiveness_metrics.cc -> ResponsivenessMetrics::SetPointerIdAndRecordLatency()`](https://chromium.googlesource.com/chromium/src/+/main/third_party/blink/renderer/core/timing/responsiveness_metrics.cc#216). This doc visualizes this state machine to help people understand its logic.
+
+## Diagram
+
+![state diagram](/docs/images/Pointer_interaction_state_machine_diagram.png)
+
+*** note
+### Note:
+* Each [pointer_id](https://www.w3.org/TR/pointerevents3/#dom-pointerevent-pointerid) has its own state machine. That means, when there are multiple pointer interactions happening at the same time, you should expect multiple state machines running at the same time, and each pointer_id maps to a unique state machine. Most of the time state machines won't interfere with each other, except for the transition [click/flush[11]](#click_flush) -- when any state machine triggers a flush(either by `pointerdown`, or by 1 sec timer times out from `pointerup`), it will flush for all exiting state machines(i.e. any state machine that is currently at [Waiting click[3]](#waiting-click) state, transition [click/flush[11]](#click_flush) will be triggered and move to [Interaction finished[4]](#interaction-finished) state).
+* `Click`'s pointer_id can be inaccurate. Whenever we receive a `click` event, we'll use the pointer_id of the most recent `pointerdown` or `pointerup` event we've seen among all state machines as if current `click` entry's pointer_id.
+* All pointer events except `pointerdown` are always dispatched at the time we receive it for event timing, which will not be explicitly mentioned in this doc. Only `pointerdown` events are delayed for dispatching event timing. We do so since `pointerdown`'s interactionId cannot be determined at the time we receive it. Thus, dispatching `pointerdown` has been specially mentioned in each transition in the [transitions section](#transitions) below.
+***
+
+*** promo
+## Terminologies:
+* **Flush the map**:
+
+  We flush all the entries in `pointer_id_entry_map_` that are waiting for `click`(at [state[3]](#waiting-click)) to finish up current interaction. We do so since either we have waited long enough(1 sec) or we know we won't be able to see any from now on(this is the case when `last_pointer_id_` has been overwritten by a new `pointerdown` event).
+
+  What it actually does is, for all entries in `pointer_id_entry_map_`:
+    * If it's an `pointerup` entry, record tap or click UKM. Then erase from the map.
+    * If it's an `pointerdown` entry with timestamp length > 1(i.e. We've seen both `pointerdown` & `pointerup` in its interaction), dispatch `pointerdown` for event timing and record tap or click UKM. Then erase from the map.
+    * Others, that is a `pointerdown` entry with timestamp length == 1(i.e. We've only seen `pointerdown` in its interaction), keep it in the map and do nothing, as it's still waiting for more events(either `pointerup` or `click` or both) to show up to finish their interactions.
+
+* **Flush timer**:
+
+  `pointer_flush_timer_` is a 1 second unique timer shared between all state machines. When it times out, it'll trigger a flush for `pointer_id_entry_map_`.
+***
+
+- - - -
+
+## States
+
+### `[1]` No entry
+The initial state. Either no entry of the pointer_id has been seen or previous ones have been cancelled.
+`pointer_id_entry_map_` does not contain any entry with key equal to pointer_id.
+
+### `[2]` Have pointerdown entry
+An intermediate state. In this state, we have seen the `pointerdown` entry for the current interaction, and are waiting for more events(`pointerup` or `click` or both) from the same interaction to show up.
+`pointer_id_entry_map_` currently contains the `pointerdown` entry of the interaction that this state machine represent.
+
+### `[3]` Waiting click
+An intermediate state. In this state, we have seen either the `pointerdown` entry, or `pointerup` entry, or both for the current interaction, and are solely waiting for `click` to finish current interaction, which may or may not show up.
+
+**Note** `pointer_id_entry_map_` could contain different entries in this state depending on how you transited into this state:
+* if transited from [No entry](#no-entry) state through [pointerup[8]](#explanation-pointerup-2), then the map should contain a `pointerup` entry.
+* if transited from [Have pointerdown entry](#have-pointerdown-entry) state through [pointerup[7]](#explanation-pointerup-1), then the map should contain a `pointerdown` entry with its timestamp length > 1.
+
+### `[4]` Interaction finished
+This is the end of an interaction lifecycle.
+
+- - - -
+
+## Transitions
+
+### `[5]` pointerdown
+*** aside
+Flush pointer map and stop any ongoing flush timer from any state machines.
+
+Save the `pointerdown` entry to the map and update `last_pointer_id_` with current `pointerdown` entry's pointer_id for potential future click entry.
+***
+
+### `[6]` pointercancel
+This can happen when dragging an element on the page. Since dragging is a continuous interaction which will be covered separately by smoothness metrics, the `pointerdown`'s interactionId & the `pointercancel`'s will remain 0.
+*** aside
+Dispatch the `pointerdown` entry saved in `pointer_id_entry_map_` for event timing and erase it from the map.
+
+Clear `last_pointer_id_`.
+***
+
+### `[7]` pointerup
+*** aside
+Generate a new interaction id and assign it to both current `pointerup` entry and the saved `pointerdown` entry in map.
+
+Dispatch the `pointerdown` entry saved in `pointer_id_entry_map_` for event timing.
+
+Add `pointerup`'s timestamp to the saved `pointerdown` entry in map.
+
+Start 1 sec flush timer if it's currently not active.
+
+Update `last_pointer_id_` with current `pointerup` entry's pointer_id for potential future `click` entry.
+***
+
+### `[8]` pointerup
+*** aside
+Generate a new interaction id and assign it to current `pointerup` entry.
+
+Save current `pointerup` entry to `pointer_id_entry_map_` in case a click event show up in future.
+
+Start 1 sec flush timer if it's currently not active.
+
+Update `last_pointer_id_` with current `pointerup` entry's pointer_id for potential future click entry.
+***
+
+### `[9]` pointercancel
+*** aside
+Dispatch the entry saved in `pointer_id_entry_map_` for event timing if it's `pointerdown`; no need to dispatch if it's `pointerup`.
+
+Erase it from the map and clear `last_pointer_id_`.
+***
+
+### `[10]` click
+In this case we've only seen `pointerdown` and `click`. This could happen for instances like contextmenu.
+*** aside
+Generate a new interaction id and assign it to both current `click` entry and the saved `pointerdown` entry in map.
+
+Add `click`'s timestamp to the saved `pointerdown` entry and record click UKM.
+
+Erase `pointerdown` entry from the map and clear `last_pointer_id_`.
+***
+
+### `[11]` click/flush
+This transition can be triggered in two different scenarios:
+* by a click event: In this case, we received a click event, and by treating `last_pointer_id_` as its pointer_id, we've found a matching entry in the map -- either a `pointerdown` entry with timestamp length > 1(i.e. we've seen both `pointerdown` & `pointerup`), or a `pointerup` entry in the map(i.e. we've only seen the `pointerup` entry).
+
+  In this case, we do:
+  *** aside
+  Assign map entry(either a `pointerdown` or `pointerup`)'s interactionId to the current `click` entry.
+
+  Add `click`'s timestamp to the map entry's timestamps and record click UKM.
+
+  Erase the map entry from the map and clear `last_pointer_id_`.
+  ***
+
+* by a map flush that's triggered by:
+  * the flush timer times out and the timer was initiated by the `pointerup` event of current interaction.
+  * the flush timer times out and the timer was initiated by a `pointerup` event from other interactions.
+  * a `pointerdown` event from other interactions.
+
+  In this case, we do:
+  *** aside
+  Dispatch the saved `pointerdown` entry in map for event timing if it's an `pointerdown` entry with timestamp length > 1(i.e. We've seen both `pointerdown` & `pointerup` in this interaction).
+
+  Record tap or click UKM.
+
+  Erase the entry from the map.
+  ***
+
+### `[12]` click
+In this case, there is no previous pointerdown or pointerup entry. This can happen when the user clicks using a non-pointer device.
+*** aside
+Generate a new interactionId. No need to add to the map since this is the last event in the interaction.
+
+Record click UKM and clear `last_pointer_id_`.
+***
+
+- - - -
+
+## Mermaid diagram source file
+
+We rely on gitiles to render out markdown files, however it does not support
+rendering mermaid at the moment. Mermaid is the tool we use to generate the
+state machine diagram. In order to make future maintenance easier, here I keep a
+copy of the mermaid source file so that people can use it to regenerate the
+diagram and make updates.
+
+Note: When you update the state diagram, please keep the source file below up to
+date as well.
+
+```
+stateDiagram-v2
+
+no_entry : No entry [1]
+have_pointer_down : Have pointerdown entry [2]
+have_pointer_up : Waiting click [3]
+interaction_finished: Interaction finished [4]
+
+   [*] --> no_entry
+   no_entry --> have_pointer_down : pointerdown [5]
+   have_pointer_down --> no_entry : pointercancel [6]
+   have_pointer_down --> have_pointer_up : pointerup [7]
+   no_entry --> have_pointer_up : pointerup [8]
+   have_pointer_up --> no_entry : pointercancel [9]
+   have_pointer_down --> interaction_finished : click [10]
+   have_pointer_up --> interaction_finished : click/flush [11]
+   no_entry --> interaction_finished : click [12]
+   interaction_finished --> [*]
+
+```
diff --git a/third_party/blink/renderer/core/timing/README.md b/third_party/blink/renderer/core/timing/README.md
index f54bd53..359263a 100644
--- a/third_party/blink/renderer/core/timing/README.md
+++ b/third_party/blink/renderer/core/timing/README.md
@@ -38,11 +38,28 @@
 
 The [PerformanceEventTiming](https://w3c.github.io/event-timing/) interface
 provides timing information about the latency of the first discrete user
-interaction, specifically one of `key down`, `mouse down`, `click`, a
-`pointer down` followed by a `pointer up`. (Pointer down may be the start of
+interaction, specifically one of `keydown`, `mousedown`, `click`, a
+`pointerdown` followed by a `pointerup`. (Pointer down may be the start of
 scrolling, which is not tracked.) This is a subset of the EventTiming API, and
 provides key metrics to help measure and optimize the first impression on
 responsiveness of web users.
 [FirstInputStateMachine](First_input_state_machine.md) visualizes the state
 machine logic of how the first input event timing entry got dispatched from a
 pipeline of performance event entries.
+
+# Event Timing - Interactions
+
+The [PerformanceEventTiming](https://w3c.github.io/event-timing/) interface
+exposes timing information for each non-continuous
+event([fullList](https://w3c.github.io/event-timing/#sec-events-exposed)).
+Certain events can be further grouped up as interactions by assigning the same
+non-trivial [interactionId](https://www.w3.org/TR/2022/WD-event-timing-20220524/#dom-performanceeventtiming-interactionid).
+Others will have interactionId with value 0. The purpose of defining an
+interaction is to group events that fire during the same logical user gesture,
+so further analysis like [INP](https://web.dev/inp/) can be done to better reflect the page
+responsiveness on user interactions.
+
+[PointerInteractionStateMachine](Pointer_interaction_state_machine.md)
+visualizes the state machine logic of how the pointer related events
+(`pointerdown`, `pointerup`, `pointercancel`, `click`) get grouped up as a
+single interaction and get dispatched from the event timing pipeline.
diff --git a/third_party/blink/renderer/core/timing/back_forward_cache_restoration.h b/third_party/blink/renderer/core/timing/back_forward_cache_restoration.h
index e6c0e08..19e0dad7 100644
--- a/third_party/blink/renderer/core/timing/back_forward_cache_restoration.h
+++ b/third_party/blink/renderer/core/timing/back_forward_cache_restoration.h
@@ -25,8 +25,8 @@
 
   DOMHighResTimeStamp pageshowEventStart() const {
     return pageshow_event_start_;
-  };
-  DOMHighResTimeStamp pageshowEventEnd() const { return pageshow_event_end_; };
+  }
+  DOMHighResTimeStamp pageshowEventEnd() const { return pageshow_event_end_; }
 
   void Trace(Visitor*) const override;
 
diff --git a/third_party/blink/renderer/core/timing/responsiveness_metrics.cc b/third_party/blink/renderer/core/timing/responsiveness_metrics.cc
index da3ddc2..49200c6 100644
--- a/third_party/blink/renderer/core/timing/responsiveness_metrics.cc
+++ b/third_party/blink/renderer/core/timing/responsiveness_metrics.cc
@@ -213,6 +213,10 @@
                            pointer_info.GetTimeStamps());
 }
 
+// Event timing pointer events processing
+//
+// See also ./Pointer_interaction_state_machine.md to help understand the logic
+// below that how event timing group up pointer events as interactions.
 bool ResponsivenessMetrics::SetPointerIdAndRecordLatency(
     PerformanceEventTiming* entry,
     PointerId pointer_id,
@@ -223,7 +227,7 @@
                            : nullptr;
   LocalDOMWindow* window = window_performance_->DomWindow();
   if (event_type == event_type_names::kPointercancel && pointer_info) {
-    MaybeNotifyPointerdown(pointer_info->GetEntry());
+    NotifyPointerdown(pointer_info->GetEntry());
     // The pointer id of the pointerdown is no longer needed.
     pointer_id_entry_map_.erase(pointer_id);
     last_pointer_id_ = absl::nullopt;
@@ -231,7 +235,7 @@
     if (pointer_info) {
       // Flush the existing entry. We are starting a new interaction.
       RecordDragTapOrClickUKM(window, *pointer_info);
-      MaybeNotifyPointerdown(pointer_info->GetEntry());
+      NotifyPointerdown(pointer_info->GetEntry());
       pointer_id_entry_map_.erase(pointer_id);
     }
     // Any existing entry in the map cannot fire a click.
@@ -254,7 +258,7 @@
       // Set interaction id and notify the pointer down entry.
       PerformanceEventTiming* pointer_down_entry = pointer_info->GetEntry();
       pointer_down_entry->SetInteractionId(GetCurrentInteractionId());
-      MaybeNotifyPointerdown(pointer_down_entry);
+      NotifyPointerdown(pointer_down_entry);
       pointer_info->GetTimeStamps().push_back(event_timestamps);
     } else {
       // There is no matching pointerdown: Set the map using pointerup, in
@@ -343,7 +347,7 @@
         RecordKeyboardUKM(window_performance_->DomWindow(),
                           {previous_entry->GetTimeStamps()});
       }
-      window_performance_->MaybeNotifyInteractionAndAddEventTimingBuffer(
+      window_performance_->NotifyAndAddEventTimingBuffer(
           previous_entry->GetEntry());
     }
     key_code_entry_map_.Set(
@@ -360,7 +364,7 @@
     // Generate a new interaction id for the keydown-keyup pair.
     UpdateInteractionId();
     previous_entry->GetEntry()->SetInteractionId(GetCurrentInteractionId());
-    window_performance_->MaybeNotifyInteractionAndAddEventTimingBuffer(
+    window_performance_->NotifyAndAddEventTimingBuffer(
         previous_entry->GetEntry());
     entry->SetInteractionId(GetCurrentInteractionId());
     RecordKeyboardUKM(window_performance_->DomWindow(),
@@ -369,8 +373,7 @@
   } else if (event_type == event_type_names::kCompositionstart) {
     composition_started_ = true;
     for (auto key_entry : key_code_entry_map_.Values()) {
-      window_performance_->MaybeNotifyInteractionAndAddEventTimingBuffer(
-          key_entry->GetEntry());
+      window_performance_->NotifyAndAddEventTimingBuffer(key_entry->GetEntry());
     }
     key_code_entry_map_.clear();
   } else if (event_type == event_type_names::kCompositionend) {
@@ -427,7 +430,7 @@
     // event for this |item|, which means we have pointerdown and pointerup.
     if (entry->name() == event_type_names::kPointerup ||
         item.value->GetTimeStamps().size() > 1u) {
-      MaybeNotifyPointerdown(entry);
+      NotifyPointerdown(entry);
       RecordDragTapOrClickUKM(window, *item.value);
       pointer_ids_to_remove.push_back(item.key);
     }
@@ -435,12 +438,12 @@
   pointer_id_entry_map_.RemoveAll(pointer_ids_to_remove);
 }
 
-void ResponsivenessMetrics::MaybeNotifyPointerdown(
+void ResponsivenessMetrics::NotifyPointerdown(
     PerformanceEventTiming* entry) const {
   // We only delay dispatching entries when they are pointerdown.
   if (entry->name() != event_type_names::kPointerdown)
     return;
-  window_performance_->MaybeNotifyInteractionAndAddEventTimingBuffer(entry);
+  window_performance_->NotifyAndAddEventTimingBuffer(entry);
 }
 
 void ResponsivenessMetrics::KeyboardEntryAndTimestamps::Trace(
diff --git a/third_party/blink/renderer/core/timing/responsiveness_metrics.h b/third_party/blink/renderer/core/timing/responsiveness_metrics.h
index 12c3b4b..b51fd90 100644
--- a/third_party/blink/renderer/core/timing/responsiveness_metrics.h
+++ b/third_party/blink/renderer/core/timing/responsiveness_metrics.h
@@ -150,7 +150,7 @@
   // for a click to occur.
   void FlushPointerMap();
 
-  void MaybeNotifyPointerdown(PerformanceEventTiming* entry) const;
+  void NotifyPointerdown(PerformanceEventTiming* entry) const;
 
   Member<WindowPerformance> window_performance_;
 
diff --git a/third_party/blink/renderer/core/timing/window_performance.cc b/third_party/blink/renderer/core/timing/window_performance.cc
index 13c892a0..e28a14d 100644
--- a/third_party/blink/renderer/core/timing/window_performance.cc
+++ b/third_party/blink/renderer/core/timing/window_performance.cc
@@ -575,11 +575,6 @@
   }
 }
 
-void WindowPerformance::MaybeNotifyInteractionAndAddEventTimingBuffer(
-    PerformanceEventTiming* entry) {
-  NotifyAndAddEventTimingBuffer(entry);
-}
-
 bool WindowPerformance::SetInteractionIdAndRecordLatency(
     PerformanceEventTiming* entry,
     absl::optional<int> key_code,
diff --git a/third_party/blink/renderer/core/timing/window_performance.h b/third_party/blink/renderer/core/timing/window_performance.h
index d474814d..a94a4eed 100644
--- a/third_party/blink/renderer/core/timing/window_performance.h
+++ b/third_party/blink/renderer/core/timing/window_performance.h
@@ -203,10 +203,6 @@
   // timing buffer if needed.
   void NotifyAndAddEventTimingBuffer(PerformanceEventTiming* entry);
 
-  // NotifyAndAddEventTimingBuffer() when interactionId feature is enabled.
-  void MaybeNotifyInteractionAndAddEventTimingBuffer(
-      PerformanceEventTiming* entry);
-
   // The last time the page visibility was changed.
   base::TimeTicks last_visibility_change_timestamp_;
 
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 e9f6a54..d13a58f 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
@@ -1249,8 +1249,10 @@
   }
 
   // The remaining possible pseudo element types are not relevant.
-  if (node.IsBackdropPseudoElement())
+  if (node.IsBackdropPseudoElement() ||
+      node.IsDocumentTransitionPseudoElement()) {
     return false;
+  }
 
   // If this is reached, then a new pseudo element type was added and is not
   // yet handled by accessibility. See  PseudoElementTagName() in
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object_cache_test.cc b/third_party/blink/renderer/modules/accessibility/ax_object_cache_test.cc
index c27a732a..94f80aa 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_object_cache_test.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_object_cache_test.cc
@@ -5,11 +5,21 @@
 #include "third_party/blink/renderer/core/accessibility/ax_object_cache.h"
 
 #include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/blink/renderer/bindings/core/v8/script_promise_tester.h"
+#include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_testing.h"
+#include "third_party/blink/renderer/bindings/core/v8/v8_document_transition_callback.h"
+#include "third_party/blink/renderer/core/document_transition/document_transition.h"
+#include "third_party/blink/renderer/core/document_transition/document_transition_supplement.h"
 #include "third_party/blink/renderer/core/dom/document.h"
 #include "third_party/blink/renderer/core/dom/element.h"
+#include "third_party/blink/renderer/core/dom/pseudo_element.h"
+#include "third_party/blink/renderer/core/frame/frame_test_helpers.h"
+#include "third_party/blink/renderer/core/testing/mock_function_scope.h"
 #include "third_party/blink/renderer/modules/accessibility/ax_object.h"
 #include "third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h"
 #include "third_party/blink/renderer/modules/accessibility/testing/accessibility_test.h"
+#include "third_party/blink/renderer/platform/bindings/script_state.h"
+#include "third_party/blink/renderer/platform/testing/unit_test_helpers.h"
 
 namespace blink {
 
@@ -94,4 +104,135 @@
   ASSERT_EQ(0u, MockAXObject::num_children_changed_calls_);
 }
 
+class AXDocumentTransitionTest : public testing::Test,
+                                 private ScopedDocumentTransitionForTest {
+ public:
+  AXDocumentTransitionTest() : ScopedDocumentTransitionForTest(true) {}
+
+  void SetUp() override {
+    web_view_helper_ = std::make_unique<frame_test_helpers::WebViewHelper>();
+    web_view_helper_->Initialize();
+    web_view_helper_->Resize(gfx::Size(200, 200));
+  }
+
+  void TearDown() override { web_view_helper_.reset(); }
+
+  Document& GetDocument() {
+    return *web_view_helper_->GetWebView()
+                ->MainFrameImpl()
+                ->GetFrame()
+                ->GetDocument();
+  }
+
+  void UpdateAllLifecyclePhasesAndFinishDirectives() {
+    UpdateAllLifecyclePhasesForTest();
+    for (auto& callback :
+         LayerTreeHost()->TakeDocumentTransitionCallbacksForTesting()) {
+      std::move(callback).Run();
+    }
+  }
+
+  cc::LayerTreeHost* LayerTreeHost() {
+    return web_view_helper_->LocalMainFrame()
+        ->FrameWidgetImpl()
+        ->LayerTreeHostForTesting();
+  }
+
+  void SetHtmlInnerHTML(const String& content) {
+    GetDocument().body()->setInnerHTML(content);
+    UpdateAllLifecyclePhasesForTest();
+  }
+
+  void UpdateAllLifecyclePhasesForTest() {
+    web_view_helper_->GetWebView()->MainFrameWidget()->UpdateAllLifecyclePhases(
+        DocumentUpdateReason::kTest);
+  }
+
+  using State = DocumentTransition::State;
+
+  State GetState(DocumentTransition* transition) const {
+    return transition->state_;
+  }
+
+ protected:
+  std::unique_ptr<frame_test_helpers::WebViewHelper> web_view_helper_;
+};
+
+TEST_F(AXDocumentTransitionTest, TransitionPseudoNotRelevant) {
+  SetHtmlInnerHTML(R"HTML(
+    <style>
+      .shared {
+        width: 100px;
+        height: 100px;
+        page-transition-tag: shared;
+        contain: layout;
+        background: green;
+      }
+    </style>
+    <div id=target class=shared></div>
+  )HTML");
+
+  auto* transition =
+      DocumentTransitionSupplement::EnsureDocumentTransition(GetDocument());
+  ASSERT_TRUE(transition->StartNewTransition());
+
+  V8TestingScope v8_scope;
+  ScriptState* script_state = v8_scope.GetScriptState();
+  ExceptionState& exception_state = v8_scope.GetExceptionState();
+
+  MockFunctionScope funcs(script_state);
+  auto* document_transition_callback =
+      V8DocumentTransitionCallback::Create(funcs.ExpectCall());
+
+  ScriptPromiseTester start_tester(
+      script_state,
+      transition->start(script_state, document_transition_callback,
+                        exception_state));
+  EXPECT_EQ(GetState(transition), State::kCapturing);
+
+  UpdateAllLifecyclePhasesAndFinishDirectives();
+  EXPECT_EQ(GetState(transition), State::kCaptured);
+
+  // We should have a start request from the async callback passed to start()
+  // resolving.
+  test::RunPendingTasks();
+  auto start_request = transition->TakePendingRequest();
+  EXPECT_TRUE(start_request);
+  EXPECT_EQ(GetState(transition), State::kStarted);
+
+  UpdateAllLifecyclePhasesAndFinishDirectives();
+
+  // We should have a transition pseudo
+  auto* transition_pseudo = GetDocument().documentElement()->GetPseudoElement(
+      kPseudoIdPageTransition);
+  ASSERT_TRUE(transition_pseudo);
+  auto* container_pseudo = transition_pseudo->GetPseudoElement(
+      kPseudoIdPageTransitionContainer, "shared");
+  ASSERT_TRUE(container_pseudo);
+  auto* image_wrapper_pseudo = container_pseudo->GetPseudoElement(
+      kPseudoIdPageTransitionImageWrapper, "shared");
+  ASSERT_TRUE(image_wrapper_pseudo);
+  auto* incoming_image_pseudo = image_wrapper_pseudo->GetPseudoElement(
+      kPseudoIdPageTransitionIncomingImage, "shared");
+  ASSERT_TRUE(incoming_image_pseudo);
+  auto* outgoing_image_pseudo = image_wrapper_pseudo->GetPseudoElement(
+      kPseudoIdPageTransitionOutgoingImage, "shared");
+  ASSERT_TRUE(outgoing_image_pseudo);
+
+  ASSERT_TRUE(transition_pseudo->GetLayoutObject());
+  ASSERT_TRUE(container_pseudo->GetLayoutObject());
+  ASSERT_TRUE(image_wrapper_pseudo->GetLayoutObject());
+  ASSERT_TRUE(incoming_image_pseudo->GetLayoutObject());
+  ASSERT_TRUE(outgoing_image_pseudo->GetLayoutObject());
+
+  EXPECT_FALSE(AXObjectCacheImpl::IsRelevantPseudoElement(*transition_pseudo));
+  EXPECT_FALSE(AXObjectCacheImpl::IsRelevantPseudoElement(*container_pseudo));
+  EXPECT_FALSE(
+      AXObjectCacheImpl::IsRelevantPseudoElement(*image_wrapper_pseudo));
+  EXPECT_FALSE(
+      AXObjectCacheImpl::IsRelevantPseudoElement(*incoming_image_pseudo));
+  EXPECT_FALSE(
+      AXObjectCacheImpl::IsRelevantPseudoElement(*outgoing_image_pseudo));
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/manifest/manifest_parser.cc b/third_party/blink/renderer/modules/manifest/manifest_parser.cc
index 254ff97..ca57c51 100644
--- a/third_party/blink/renderer/modules/manifest/manifest_parser.cc
+++ b/third_party/blink/renderer/modules/manifest/manifest_parser.cc
@@ -663,27 +663,28 @@
   return purposes;
 }
 
-mojom::blink::ManifestScreenshot::Platform
-ManifestParser::ParseScreenshotPlatform(const JSONObject* screenshot) {
-  absl::optional<String> platform_str =
-      ParseString(screenshot, "platform", Trim(false));
+mojom::blink::ManifestScreenshot::FormFactor
+ManifestParser::ParseScreenshotFormFactor(const JSONObject* screenshot) {
+  absl::optional<String> form_factor_str =
+      ParseString(screenshot, "form_factor", Trim(false));
 
-  if (!platform_str.has_value()) {
-    return mojom::blink::ManifestScreenshot::Platform::kUnknown;
+  if (!form_factor_str.has_value()) {
+    return mojom::blink::ManifestScreenshot::FormFactor::kUnknown;
   }
 
-  String platform = platform_str.value();
+  String form_factor = form_factor_str.value();
 
-  if (EqualIgnoringASCIICase(platform, "wide")) {
-    return mojom::blink::ManifestScreenshot::Platform::kWide;
-  } else if (EqualIgnoringASCIICase(platform, "narrow")) {
-    return mojom::blink::ManifestScreenshot::Platform::kNarrow;
+  if (EqualIgnoringASCIICase(form_factor, "wide")) {
+    return mojom::blink::ManifestScreenshot::FormFactor::kWide;
+  } else if (EqualIgnoringASCIICase(form_factor, "narrow")) {
+    return mojom::blink::ManifestScreenshot::FormFactor::kNarrow;
   }
 
   AddErrorInfo(
-      "property 'platform' on screenshots has an invalid value, ignoring it.");
+      "property 'form_factor' on screenshots has an invalid value, ignoring "
+      "it.");
 
-  return mojom::blink::ManifestScreenshot::Platform::kUnknown;
+  return mojom::blink::ManifestScreenshot::FormFactor::kUnknown;
 }
 
 Vector<mojom::blink::ManifestImageResourcePtr> ManifestParser::ParseIcons(
@@ -715,7 +716,7 @@
       continue;
 
     screenshot->image = std::move(*image);
-    screenshot->platform = ParseScreenshotPlatform(screenshot_object);
+    screenshot->form_factor = ParseScreenshotFormFactor(screenshot_object);
 
     screenshots.push_back(std::move(screenshot));
   }
diff --git a/third_party/blink/renderer/modules/manifest/manifest_parser.h b/third_party/blink/renderer/modules/manifest/manifest_parser.h
index 92e786cc..634a526 100644
--- a/third_party/blink/renderer/modules/manifest/manifest_parser.h
+++ b/third_party/blink/renderer/modules/manifest/manifest_parser.h
@@ -223,9 +223,9 @@
   Vector<mojom::blink::ManifestScreenshotPtr> ParseScreenshots(
       const JSONObject* object);
 
-  // Parse the 'platform' field of 'screenshots' as defined in:
-  // https://www.w3.org/TR/manifest-app-info/#platform-member
-  mojom::blink::ManifestScreenshot::Platform ParseScreenshotPlatform(
+  // Parse the 'form_factor' field of 'screenshots' as defined in:
+  // https://www.w3.org/TR/manifest-app-info/#form_factor-member
+  mojom::blink::ManifestScreenshot::FormFactor ParseScreenshotFormFactor(
       const JSONObject* screenshot);
 
   // A helper function for parsing ImageResources under |key| in the manifest.
diff --git a/third_party/blink/renderer/modules/manifest/manifest_parser_unittest.cc b/third_party/blink/renderer/modules/manifest/manifest_parser_unittest.cc
index 83d95bed..568af04 100644
--- a/third_party/blink/renderer/modules/manifest/manifest_parser_unittest.cc
+++ b/third_party/blink/renderer/modules/manifest/manifest_parser_unittest.cc
@@ -1168,17 +1168,17 @@
   }
 }
 
-TEST_F(ManifestParserTest, ScreenshotPlatformParseRules) {
+TEST_F(ManifestParserTest, ScreenshotFormFactorParseRules) {
   // Smoke test.
   {
     auto& manifest = ParseManifest(
-        R"({ "screenshots": [{ "src": "foo.jpg", "platform": "narrow" }] })");
+        R"({ "screenshots": [{ "src": "foo.jpg", "form_factor": "narrow" }] })");
     EXPECT_FALSE(manifest->screenshots.IsEmpty());
 
     auto& screenshots = manifest->screenshots;
     EXPECT_EQ(screenshots.size(), 1u);
-    EXPECT_EQ(screenshots[0]->platform,
-              mojom::blink::ManifestScreenshot::Platform::kNarrow);
+    EXPECT_EQ(screenshots[0]->form_factor,
+              mojom::blink::ManifestScreenshot::FormFactor::kNarrow);
     EXPECT_FALSE(IsManifestEmpty(manifest));
     EXPECT_EQ(0u, GetErrorCount());
   }
@@ -1191,8 +1191,8 @@
 
     auto& screenshots = manifest->screenshots;
     EXPECT_EQ(screenshots.size(), 1u);
-    EXPECT_EQ(screenshots[0]->platform,
-              mojom::blink::ManifestScreenshot::Platform::kUnknown);
+    EXPECT_EQ(screenshots[0]->form_factor,
+              mojom::blink::ManifestScreenshot::FormFactor::kUnknown);
     EXPECT_FALSE(IsManifestEmpty(manifest));
     EXPECT_EQ(0u, GetErrorCount());
   }
@@ -1200,13 +1200,13 @@
   // Invalid type.
   {
     auto& manifest = ParseManifest(
-        R"({ "screenshots": [{ "src": "foo.jpg", "platform": 1}] })");
+        R"({ "screenshots": [{ "src": "foo.jpg", "form_factor": 1}] })");
     EXPECT_FALSE(manifest->screenshots.IsEmpty());
 
     auto& screenshots = manifest->screenshots;
     EXPECT_EQ(screenshots.size(), 1u);
-    EXPECT_EQ(screenshots[0]->platform,
-              mojom::blink::ManifestScreenshot::Platform::kUnknown);
+    EXPECT_EQ(screenshots[0]->form_factor,
+              mojom::blink::ManifestScreenshot::FormFactor::kUnknown);
     EXPECT_FALSE(IsManifestEmpty(manifest));
     EXPECT_EQ(1u, GetErrorCount());
   }
@@ -1214,13 +1214,13 @@
   // Unrecognized string.
   {
     auto& manifest = ParseManifest(
-        R"({ "screenshots": [{ "src": "foo.jpg", "platform": "windows"}] })");
+        R"({ "screenshots": [{ "src": "foo.jpg", "form_factor": "windows"}] })");
     EXPECT_FALSE(manifest->screenshots.IsEmpty());
 
     auto& screenshots = manifest->screenshots;
     EXPECT_EQ(screenshots.size(), 1u);
-    EXPECT_EQ(screenshots[0]->platform,
-              mojom::blink::ManifestScreenshot::Platform::kUnknown);
+    EXPECT_EQ(screenshots[0]->form_factor,
+              mojom::blink::ManifestScreenshot::FormFactor::kUnknown);
     EXPECT_FALSE(IsManifestEmpty(manifest));
     EXPECT_EQ(1u, GetErrorCount());
   }
diff --git a/third_party/blink/renderer/modules/mediastream/media_stream_video_track.h b/third_party/blink/renderer/modules/mediastream/media_stream_video_track.h
index 34c7cf4..d4b6ac3 100644
--- a/third_party/blink/renderer/modules/mediastream/media_stream_video_track.h
+++ b/third_party/blink/renderer/modules/mediastream/media_stream_video_track.h
@@ -194,7 +194,7 @@
 
   MediaStreamTrackPlatform::StreamType Type() const override {
     return MediaStreamTrackPlatform::StreamType::kVideo;
-  };
+  }
 
  private:
   FRIEND_TEST_ALL_PREFIXES(MediaStreamRemoteVideoSourceTest, StartTrack);
diff --git a/third_party/blink/renderer/modules/mediastream/mock_media_stream_track.h b/third_party/blink/renderer/modules/mediastream/mock_media_stream_track.h
index 51c7609..8f42848 100644
--- a/third_party/blink/renderer/modules/mediastream/mock_media_stream_track.h
+++ b/third_party/blink/renderer/modules/mediastream/mock_media_stream_track.h
@@ -85,8 +85,8 @@
 
   const AtomicString& InterfaceName() const override;
 
-  ExecutionContext* GetExecutionContext() const override { return context_; };
-  void SetExecutionContext(ExecutionContext* context) { context_ = context; };
+  ExecutionContext* GetExecutionContext() const override { return context_; }
+  void SetExecutionContext(ExecutionContext* context) { context_ = context; }
 
   bool HasPendingActivity() const override { return false; }
 
diff --git a/third_party/blink/renderer/modules/webcodecs/decoder_template.h b/third_party/blink/renderer/modules/webcodecs/decoder_template.h
index d9dd07d..cdb6a88 100644
--- a/third_party/blink/renderer/modules/webcodecs/decoder_template.h
+++ b/third_party/blink/renderer/modules/webcodecs/decoder_template.h
@@ -60,7 +60,7 @@
   ~DecoderTemplate() override;
 
   uint32_t decodeQueueSize();
-  DEFINE_ATTRIBUTE_EVENT_LISTENER(dequeue, kDequeue);
+  DEFINE_ATTRIBUTE_EVENT_LISTENER(dequeue, kDequeue)
   void configure(const ConfigType*, ExceptionState&);
   void decode(const InputType*, ExceptionState&);
   ScriptPromise flush(ExceptionState&);
diff --git a/third_party/blink/renderer/modules/webcodecs/encoder_base.h b/third_party/blink/renderer/modules/webcodecs/encoder_base.h
index 54e17bca..2f4d364 100644
--- a/third_party/blink/renderer/modules/webcodecs/encoder_base.h
+++ b/third_party/blink/renderer/modules/webcodecs/encoder_base.h
@@ -55,7 +55,7 @@
   // *_encoder.idl implementation.
   uint32_t encodeQueueSize() { return requested_encodes_; }
 
-  DEFINE_ATTRIBUTE_EVENT_LISTENER(dequeue, kDequeue);
+  DEFINE_ATTRIBUTE_EVENT_LISTENER(dequeue, kDequeue)
 
   void configure(const ConfigType*, ExceptionState&);
 
diff --git a/third_party/blink/renderer/modules/webgpu/dawn_object.h b/third_party/blink/renderer/modules/webgpu/dawn_object.h
index e1b87d76..896ee8a4 100644
--- a/third_party/blink/renderer/modules/webgpu/dawn_object.h
+++ b/third_party/blink/renderer/modules/webgpu/dawn_object.h
@@ -93,7 +93,7 @@
   const String& label() const { return label_; }
   void setLabel(const String& value);
 
-  virtual void setLabelImpl(const String& value){};
+  virtual void setLabelImpl(const String& value) {}
 
  private:
   scoped_refptr<DawnControlClientHolder> dawn_control_client_;
diff --git a/third_party/blink/renderer/modules/websockets/websocket_channel_impl.cc b/third_party/blink/renderer/modules/websockets/websocket_channel_impl.cc
index 8bb6ff3..c2f5c15 100644
--- a/third_party/blink/renderer/modules/websockets/websocket_channel_impl.cc
+++ b/third_party/blink/renderer/modules/websockets/websocket_channel_impl.cc
@@ -1127,8 +1127,8 @@
     uint64_t* consumed_buffered_amount) {
   MojoResult begin_result = MOJO_RESULT_OK;
   void* buffer;
-  uint32_t writable_size = 0;
-  while (data->size() > 0 &&
+  uint32_t writable_size;
+  while ((writable_size = static_cast<uint32_t>(data->size())) > 0 &&
          (begin_result = writable_->BeginWriteData(
               &buffer, &writable_size, MOJO_WRITE_DATA_FLAG_NONE)) ==
              MOJO_RESULT_OK) {
diff --git a/third_party/blink/renderer/platform/bindings/cross_thread_copier.h b/third_party/blink/renderer/platform/bindings/cross_thread_copier.h
index c6f71384..e182984 100644
--- a/third_party/blink/renderer/platform/bindings/cross_thread_copier.h
+++ b/third_party/blink/renderer/platform/bindings/cross_thread_copier.h
@@ -15,7 +15,7 @@
   static blink::ExceptionContext Copy(
       blink::ExceptionContext exception_context) {
     return exception_context;
-  };
+  }
 };
 
 }  // namespace WTF
diff --git a/third_party/blink/renderer/platform/fonts/font_platform_data_cache.h b/third_party/blink/renderer/platform/fonts/font_platform_data_cache.h
index 72da977..4e1d981 100644
--- a/third_party/blink/renderer/platform/fonts/font_platform_data_cache.h
+++ b/third_party/blink/renderer/platform/fonts/font_platform_data_cache.h
@@ -120,7 +120,6 @@
   mutable LockForParallelTextShaping lock_;
   HashMap<FontCacheKey, scoped_refptr<SizedFontPlatformDataSet>> map_
       GUARDED_BY(lock_);
-  ;
 
   // A maximum float value to which we limit incoming font sizes. This is the
   // smallest float so that multiplying it by
diff --git a/third_party/blink/renderer/platform/mediastream/media_stream_audio_track.h b/third_party/blink/renderer/platform/mediastream/media_stream_audio_track.h
index 54c2df90..30945145 100644
--- a/third_party/blink/renderer/platform/mediastream/media_stream_audio_track.h
+++ b/third_party/blink/renderer/platform/mediastream/media_stream_audio_track.h
@@ -103,7 +103,7 @@
 
   MediaStreamTrackPlatform::StreamType Type() const override {
     return MediaStreamTrackPlatform::StreamType::kAudio;
-  };
+  }
 
  private:
   // In debug builds, check that all methods that could cause object graph
diff --git a/third_party/blink/renderer/platform/scheduler/common/features.h b/third_party/blink/renderer/platform/scheduler/common/features.h
index 2813b3d..cd12e474 100644
--- a/third_party/blink/renderer/platform/scheduler/common/features.h
+++ b/third_party/blink/renderer/platform/scheduler/common/features.h
@@ -177,13 +177,6 @@
 PLATFORM_EXPORT extern const base::FeatureParam<DeprioritizeDOMTimersPhase>
     kDeprioritizeDOMTimersPhase;
 
-// Killswitch for prioritizing cross-process postMessage forwarding.
-//
-// TODO(crbug.com/1212894): Remove after M95.
-const base::Feature kDisablePrioritizedPostMessageForwarding{
-    "DisablePrioritizedPostMessageForwarding",
-    base::FEATURE_DISABLED_BY_DEFAULT};
-
 // Finch flag for preventing rendering starvation during threaded scrolling.
 // With this feature enabled, the existing delay-based rendering anti-starvation
 // applies, and the compositor task queue priority is controlled with the
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl.cc b/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl.cc
index cb77db1c..01007c2 100644
--- a/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl.cc
+++ b/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl.cc
@@ -489,21 +489,16 @@
       // pausable in order to maintain this invariant, otherwise they might run
       // in a nested event loop before the task completes, e.g. debugger
       // breakpoints or javascript dialogs.
-      if (base::FeatureList::IsEnabled(
-              kDisablePrioritizedPostMessageForwarding)) {
-        // This matches the pre-kInternalPostMessageForwarding behavior.
-        return PausableTaskQueueTraits();
-      } else {
-        // Freezing this task type would prevent transmission of postMessages to
-        // remote frames that occurred in unfreezable tasks or from tasks that
-        // ran prior to being frozen (e.g. freeze event handler), which is not
-        // desirable. The messages are still queued on the receiving side, which
-        // is where frozenness should be assessed.
-        return PausableTaskQueueTraits()
-            .SetCanBeFrozen(false)
-            .SetPrioritisationType(
-                QueueTraits::PrioritisationType::kPostMessageForwarding);
-      }
+      //
+      // Freezing this task type would prevent transmission of postMessages to
+      // remote frames that occurred in unfreezable tasks or from tasks that ran
+      // prior to being frozen (e.g. freeze event handler), which is not
+      // desirable. The messages are still queued on the receiving side, which
+      // is where frozenness should be assessed.
+      return PausableTaskQueueTraits()
+          .SetCanBeFrozen(false)
+          .SetPrioritisationType(
+              QueueTraits::PrioritisationType::kPostMessageForwarding);
     case TaskType::kDeprecatedNone:
     case TaskType::kMainThreadTaskQueueV8:
     case TaskType::kMainThreadTaskQueueCompositor:
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl_unittest.cc b/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl_unittest.cc
index b360c2e..f318d82 100644
--- a/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl_unittest.cc
+++ b/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl_unittest.cc
@@ -4086,29 +4086,13 @@
                                    start + base::Milliseconds(1000)));
 }
 
-class FrameSchedulerImplDisablePrioritizedPostMessageForwarding
-    : public FrameSchedulerImplTest {
- public:
-  FrameSchedulerImplDisablePrioritizedPostMessageForwarding()
-      : FrameSchedulerImplTest({kDisablePrioritizedPostMessageForwarding}, {}) {
-  }
-};
-
-TEST_F(FrameSchedulerImplTest, PostMessageForwardingHasControlPriority) {
+TEST_F(FrameSchedulerImplTest, PostMessageForwardingHasVeryHighPriority) {
   auto task_queue = GetTaskQueue(TaskType::kInternalPostMessageForwarding);
 
   EXPECT_EQ(TaskQueue::QueuePriority::kVeryHighPriority,
             task_queue->GetQueuePriority());
 }
 
-TEST_F(FrameSchedulerImplDisablePrioritizedPostMessageForwarding,
-       PostMessageForwardingHasNormalPriority) {
-  auto task_queue = GetTaskQueue(TaskType::kInternalPostMessageForwarding);
-
-  EXPECT_EQ(TaskQueue::QueuePriority::kNormalPriority,
-            task_queue->GetQueuePriority());
-}
-
 }  // namespace frame_scheduler_impl_unittest
 }  // namespace scheduler
 }  // namespace blink
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl.cc b/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl.cc
index 4ea05075..400094e 100644
--- a/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl.cc
+++ b/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl.cc
@@ -337,8 +337,8 @@
 }
 
 bool PageSchedulerImpl::IsLoading() const {
-  return main_thread_scheduler_->current_use_case() == UseCase::kEarlyLoading ||
-         main_thread_scheduler_->current_use_case() == UseCase::kLoading;
+  return IsWaitingForMainFrameContentfulPaint() ||
+         IsWaitingForMainFrameMeaningfulPaint();
 }
 
 bool PageSchedulerImpl::IsOrdinary() const {
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl_unittest.cc b/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl_unittest.cc
index a173aa0..f376ac5 100644
--- a/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl_unittest.cc
+++ b/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl_unittest.cc
@@ -402,6 +402,30 @@
   EXPECT_EQ(1, run_count2);
 }
 
+TEST_F(PageSchedulerImplTest, IsLoadingTest) {
+  // 1st Page is loaded.
+  EXPECT_FALSE(page_scheduler_->IsLoading());
+
+  std::unique_ptr<PageSchedulerImpl> page_scheduler2 =
+      CreatePageScheduler(nullptr, scheduler_.get(), *agent_group_scheduler_);
+  std::unique_ptr<FrameSchedulerImpl> frame_scheduler2 =
+      CreateFrameScheduler(page_scheduler2.get(), nullptr,
+                           /*is_in_embedded_frame_tree=*/false,
+                           FrameScheduler::FrameType::kMainFrame);
+
+  // 1st Page is loaded. 2nd page is loading.
+  EXPECT_FALSE(page_scheduler_->IsLoading());
+  EXPECT_TRUE(page_scheduler2->IsLoading());
+
+  // 2nd page finishes loading.
+  frame_scheduler2->OnFirstContentfulPaintInMainFrame();
+  frame_scheduler2->OnFirstMeaningfulPaint();
+
+  // Both pages are loaded.
+  EXPECT_FALSE(page_scheduler_->IsLoading());
+  EXPECT_FALSE(page_scheduler2->IsLoading());
+}
+
 namespace {
 
 void RunVirtualTimeRecorderTask(const base::TickClock* clock,
diff --git a/third_party/blink/renderer/platform/text/layout_locale.cc b/third_party/blink/renderer/platform/text/layout_locale.cc
index aad39b9..c1c672e 100644
--- a/third_party/blink/renderer/platform/text/layout_locale.cc
+++ b/third_party/blink/renderer/platform/text/layout_locale.cc
@@ -75,7 +75,7 @@
   ulocdata_close(uld);
 
   return QuotesData::Create(open1[0], close1[0], open2[0], close2[0]);
-};
+}
 
 }  // namespace
 
diff --git a/third_party/blink/tools/blinkpy/common/system/executive_mock.py b/third_party/blink/tools/blinkpy/common/system/executive_mock.py
index 713e2808..f108e00d9 100644
--- a/third_party/blink/tools/blinkpy/common/system/executive_mock.py
+++ b/third_party/blink/tools/blinkpy/common/system/executive_mock.py
@@ -27,26 +27,35 @@
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 import collections
+import contextlib
+import io
 import logging
 import os
+from unittest.mock import Mock, patch
+
 import six
 
 from blinkpy.common.system.executive import ScriptError
 
-from six import StringIO
-
 _log = logging.getLogger(__name__)
 
 
 class MockProcess(object):
-    def __init__(self, stdout='MOCK STDOUT\n', stderr='', returncode=0):
+    def __init__(self, args, stdout='MOCK STDOUT\n', stderr='', returncode=0):
+        self.args = args
         self.pid = 42
-        self.stdout = StringIO(stdout)
-        self.stderr = StringIO(stderr)
-        self.stdin = StringIO()
+        self.stdout = io.StringIO(stdout)
+        self.stderr = io.StringIO(stderr)
+        self.stdin = io.StringIO()
         self.returncode = returncode
 
-    def wait(self):
+    def __enter__(self):
+        return self
+
+    def __exit__(self, _exc_type, _exc, _traceback):
+        pass
+
+    def wait(self, timeout=None):
         return
 
     def poll(self):
@@ -56,9 +65,12 @@
             return None
         return self.returncode
 
-    def communicate(self, *_):
+    def communicate(self, input=None, timeout=None):
         return (self.stdout.getvalue(), self.stderr.getvalue())
 
+    def send_signal(self, signal):
+        pass
+
     def kill(self):
         return
 
@@ -115,7 +127,7 @@
         return running_pids
 
     def command_for_printing(self, args):
-        string_args = list(map(six.text_type, args))
+        string_args = list(map(six.ensure_text, args))
         return ' '.join(string_args)
 
     # The argument list should match Executive.run_command, even if
@@ -170,8 +182,8 @@
         output = self._output
         if return_stderr:
             output += self._stderr
-        if decode_output and not isinstance(output, six.text_type):
-            output = output.decode('utf-8')
+        if decode_output:
+            output = six.ensure_text(output)
 
         return output
 
@@ -196,10 +208,10 @@
                 env_string = ', env=%s' % env
             _log.info('MOCK popen: %s%s%s', args, cwd_string, env_string)
         if not self._proc:
-            self._proc = MockProcess(
-                stdout=self._output,
-                stderr=self._stderr,
-                returncode=self._exit_code)
+            self._proc = MockProcess(args,
+                                     stdout=self._output,
+                                     stderr=self._stderr,
+                                     returncode=self._exit_code)
         return self._proc
 
     def call(self, args, **_):
@@ -241,6 +253,21 @@
 
         return get_args(self.full_calls)
 
+    def _run_mock(self, args, **_options):
+        self._append_call(args)
+        completed_process = Mock()
+        completed_process.args = ['echo']
+        completed_process.returncode = 0
+        completed_process.stdout = completed_process.stderr = b''
+        return completed_process
+
+    @contextlib.contextmanager
+    def patch_builtins(self):
+        with contextlib.ExitStack() as stack:
+            stack.enter_context(patch('subprocess.run', self._run_mock))
+            stack.enter_context(patch('subprocess.Popen', self.popen))
+            yield
+
 
 def mock_git_commands(vals, strict=False):
     # TODO(robertma): Support optional look-up by arguments.
diff --git a/third_party/blink/tools/blinkpy/common/system/filesystem_mock.py b/third_party/blink/tools/blinkpy/common/system/filesystem_mock.py
index ee9a5b124..2397df79 100644
--- a/third_party/blink/tools/blinkpy/common/system/filesystem_mock.py
+++ b/third_party/blink/tools/blinkpy/common/system/filesystem_mock.py
@@ -26,17 +26,19 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+import contextlib
 import errno
 import hashlib
 import io
 import os
 import re
 import unittest
+from unittest.mock import patch
+
+import six
 
 from blinkpy.common.system.filesystem import _remove_contents, _sanitize_filename
 
-from six import ensure_binary
-
 _TEXT_ENCODING = 'utf-8'
 
 
@@ -44,7 +46,7 @@
     # Iterate over a copy while the underlying mapping is mutated.
     for path, contents in list(file_contents.items()):
         if contents is not None:
-            contents = ensure_binary(contents, _TEXT_ENCODING)
+            contents = six.ensure_binary(contents, _TEXT_ENCODING)
         file_contents[path] = contents
 
 
@@ -210,6 +212,13 @@
         return re.sub(re.escape(os.path.sep), self.sep, os.path.join(*comps))
 
     def join(self, *comps):
+        # The real `os.path.join` accepts both strings and bytes:
+        #   (*bytes) -> bytes
+        #   (*str) -> str
+        # Record what type the caller originally passed, perform the join with
+        # text strings, then coerce the return value to the original argument
+        # type.
+        binary_mode = all(isinstance(comp, bytes) for comp in comps)
         # This function is called a lot, so we optimize it; there are
         # unit tests to check that we match _slow_but_correct_join(), above.
         path = ''
@@ -217,16 +226,17 @@
         for comp in comps:
             if not comp:
                 continue
+            comp = six.ensure_text(comp)
             if comp[0] == sep:
                 path = comp
                 continue
             if path:
                 path += sep
             path += comp
-        if comps[-1] == '' and path:
+        if six.ensure_text(comps[-1]) == '' and path:
             path += '/'
         path = path.replace(sep + sep, sep)
-        return path
+        return path.encode() if binary_mode else path
 
     def listdir(self, path):
         _, directories, files = list(self.walk(path))[0]
@@ -475,6 +485,26 @@
     def sanitize_filename(self, filename, replacement='_'):
         return _sanitize_filename(filename, replacement)
 
+    def _open_mock(self, filename, mode='r', **_kwargs):
+        """A mock for Python's built-in `open` backed by this Blink FS."""
+        mode_match = re.match(r'([rwa])(b?)', mode)
+        open_func_map = {
+            ('r', ''): self.open_text_file_for_reading,
+            ('w', ''): self.open_text_file_for_writing,
+            ('r', 'b'): self.open_binary_file_for_reading,
+            ('w', 'b'): self.open_binary_file_for_writing,
+        }
+        return open_func_map[mode_match.groups()](filename)
+
+    @contextlib.contextmanager
+    def patch_builtins(self):
+        with contextlib.ExitStack() as stack:
+            stack.enter_context(patch('builtins.open', self._open_mock))
+            stack.enter_context(patch('os.path.join', self.join))
+            stack.enter_context(patch('os.path.isfile', self.isfile))
+            stack.enter_context(patch('os.path.isdir', self.isdir))
+            yield
+
 
 class BufferedReader(io.BufferedReader):
     def __init__(self, raw, **options):
diff --git a/third_party/blink/tools/blinkpy/tool/commands/update_metadata.py b/third_party/blink/tools/blinkpy/tool/commands/update_metadata.py
index 2858883d..bf04082 100644
--- a/third_party/blink/tools/blinkpy/tool/commands/update_metadata.py
+++ b/third_party/blink/tools/blinkpy/tool/commands/update_metadata.py
@@ -1,26 +1,33 @@
 # Copyright 2022 The Chromium Authors. All rights reserved.
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
+
 """Update WPT metadata from builder results."""
 
 from concurrent.futures import Executor, ThreadPoolExecutor
 import contextlib
+import io
 import json
 import logging
+import pathlib
 import optparse
 import re
-from typing import Iterator, List, Optional
+from typing import Iterator, List, Mapping, Optional
 
+from blinkpy.common import path_finder
 from blinkpy.common.host import Host
 from blinkpy.common.net.git_cl import BuildStatuses, GitCL
 from blinkpy.common.net.rpc import Build, RPCError
-from blinkpy.tool import grammar
 from blinkpy.tool.commands.build_resolver import (
     BuildResolver,
     UnresolvedBuildException,
 )
 from blinkpy.tool.commands.command import Command
 from blinkpy.tool.commands.rebaseline_cl import RebaselineCL
+from blinkpy.web_tests.port.base import Port
+
+path_finder.bootstrap_wpt_imports()
+from wptrunner import metadata, testloader
 
 _log = logging.getLogger(__name__)
 
@@ -76,6 +83,9 @@
             optparse.make_option('--keep-statuses',
                                  action='store_true',
                                  help='Keep all existing statuses.'),
+            # TODO(crbug.com/1299650): Support nargs='*' after migrating to
+            # argparse to allow usage with shell glob expansion. Example:
+            #   --report out/*/wpt_reports*android*.json
             optparse.make_option(
                 '--report',
                 dest='reports',
@@ -113,6 +123,9 @@
             self._tool.builders,
             self.git_cl,
             can_trigger_jobs=(options.trigger_jobs and not options.dry_run))
+        updater = MetadataUpdater.from_path_finder(
+            path_finder.PathFinder(self._tool.filesystem),
+            self._explicit_include_patterns(options, args))
         try:
             build_statuses = build_resolver.resolve_builds(
                 self._select_builds(options), options.patchset)
@@ -121,24 +134,13 @@
                 stack.enter_context(self._io_pool)
                 for report in self.gather_reports(build_statuses,
                                                   options.reports or []):
-                    results, run_info = report['results'], report['run_info']
-                    _log.info(
-                        '%s (product: %s, os: %s, os_version: %s, '
-                        'cpu: %s-%s, flag_specific: %s)',
-                        grammar.pluralize('test', len(results)),
-                        run_info.get('product', '?'), run_info.get('os', '?'),
-                        run_info.get('version', '?'),
-                        run_info.get('processor', '?'),
-                        str(run_info.get('bits', '?')),
-                        run_info.get('flag_specific', '-'))
+                    updater.collect_results(report)
+                updater.update()
         except RPCError as error:
             _log.error('%s', error)
             _log.error('Request payload: %s',
                        json.dumps(error.request_body, indent=2))
             return 1
-        except json.JSONDecodeError as error:
-            _log.error('Unable to parse wptreport: %s', str(error))
-            return 1
         except (UnresolvedBuildException, OSError) as error:
             _log.error('%s', error)
             return 1
@@ -153,9 +155,17 @@
         builders = self._tool.builders.all_try_builder_names()
         return [Build(builder) for builder in builders]
 
+    def _explicit_include_patterns(self, options: optparse.Values,
+                                   args: List[str]) -> List[str]:
+        patterns = list(args)
+        if options.test_name_file:
+            patterns.extend(
+                testloader.read_include_from_file(options.test_name_file))
+        return patterns
+
     def gather_reports(self, build_statuses: BuildStatuses,
                        report_paths: List[str]):
-        """Lazily fetches and parses wptreports.
+        """Lazily fetches wptreports.
 
         Arguments:
             build_statuses: Builds to fetch wptreport artifacts from. Builds
@@ -163,12 +173,13 @@
             report_paths: Paths to wptreport files on disk.
 
         Yields:
-            JSON objects corresponding to wptrunner suite runs. The objects are
-            not ordered in any particular way.
+            Seekable text buffers whose format is understood by the wptrunner
+            metadata updater (e.g., newline-delimited JSON objects, each
+            corresponding to a suite run). The buffers are not yielded in any
+            particular order.
 
         Raises:
             OSError: If a local wptreport is not readable.
-            json.JSONDecodeError: If any wptreport line is not valid JSON.
         """
         build_ids = [
             build.build_id for build, (_, status) in build_statuses.items()
@@ -184,18 +195,20 @@
                 self._fetch_report_contents(urls, report_paths)):
             _log.info('Processing wptrunner report (%d/%d)', i + 1,
                       total_reports)
-            yield from _parse_report_contents(contents)
+            yield contents
 
-    def _fetch_report_contents(self, urls: List[str],
-                               report_paths: List[str]) -> Iterator[str]:
+    def _fetch_report_contents(self, urls: List[str], report_paths: List[str]
+                               ) -> Iterator[io.TextIOBase]:
+        fs = self._tool.filesystem
         for path in report_paths:
-            yield self._tool.filesystem.read_text_file(path)
+            with fs.open_text_file_for_reading(path) as file_handle:
+                yield file_handle
             _log.debug('Read report from %r', path)
         responses = self._io_pool.map(self._tool.web.get_binary, urls)
         for url, response in zip(urls, responses):
             _log.debug('Fetched report from %r (size: %d bytes)', url,
                        len(response))
-            yield response.decode()
+            yield io.StringIO(response.decode())
 
     @contextlib.contextmanager
     def _trace(self, message: str, *args) -> Iterator[None]:
@@ -224,12 +237,80 @@
         setattr(parser.values, option.dest, reports)
 
 
-def _parse_report_contents(contents: str):
-    try:
-        yield from map(json.loads, contents.splitlines())
-    except json.JSONDecodeError:
-        # Allow a single object written across multiple lines.
-        yield json.loads(contents)
+TestFileMap = Mapping[str, metadata.TestFileData]
+
+
+class MetadataUpdater:
+    def __init__(self, test_files: TestFileMap):
+        self._test_files = test_files
+        self._updater = metadata.ExpectedUpdater(self._test_files)
+
+    @classmethod
+    def from_path_finder(cls,
+                         finder: path_finder.PathFinder,
+                         include: Optional[List[str]] = None
+                         ) -> 'MetadataUpdater':
+        """Construct a metadata updater from a path finder.
+
+        Arguments:
+            finder: Path finder. Each WPT root is used as both the test and
+                metadata root. The manifest is read from `MANIFEST.json` at the
+                WPT root.
+            include: A list of test patterns that are resolved into test IDs to
+                update. The resolution works the same way as `wpt run`:
+                  * Directories are expanded to include all children (e.g.,
+                    `a/` includes `a/b.html?c`).
+                  * Test files are expanded to include all variants (e.g.,
+                    `a.html` includes `a.html?b` and `a.html?c`).
+        """
+        # See: https://github.com/web-platform-tests/wpt/blob/merge_pr_35574/tools/wptrunner/wptrunner/testloader.py#L171-L199
+        test_paths = {}
+        for rel_path_to_wpt_root, url_base in Port.WPT_DIRS.items():
+            wpt_root = finder.path_from_web_tests(rel_path_to_wpt_root)
+            test_paths[url_base] = {
+                'tests_path':
+                wpt_root,
+                'metadata_path':
+                wpt_root,
+                'manifest_path':
+                finder.path_from_web_tests(rel_path_to_wpt_root,
+                                           'MANIFEST.json'),
+            }
+        manifests = testloader.ManifestLoader(test_paths).load()
+        # TODO(crbug.com/1299650): Validate the include list instead of silently
+        # ignoring the bad test pattern.
+        test_filter = testloader.TestFilter(manifests, include=include)
+        test_files = {}
+        for manifest, paths in manifests.items():
+            # Unfortunately, test filtering is tightly coupled to the
+            # `testloader.TestLoader` API. Monkey-patching here is the cleanest
+            # way to filter tests to be updated without loading more tests than
+            # are necessary.
+            manifest.itertypes = _compose(test_filter, manifest.itertypes)
+            test_files.update(
+                metadata.create_test_tree(paths['metadata_path'], manifest))
+        return MetadataUpdater(test_files)
+
+    def collect_results(self, report: io.TextIOBase):
+        """Parse and record test results."""
+        self._updater.update_from_log(report)
+
+    def update(self):
+        """Update the AST of each metadata file and serialize them to disk."""
+        test_files_to_update = {
+            test_file
+            for test_file in self._test_files.values()
+            if not test_file.test_path.endswith('__dir__')
+        }
+        for i, test_file in enumerate(
+                sorted(test_files_to_update, key=lambda f: f.test_path)):
+            _log.info("Updating '%s' (%d/%d)",
+                      pathlib.Path(test_file.test_path).as_posix(), i + 1,
+                      len(test_files_to_update))
+
+
+def _compose(f, g):
+    return lambda *args, **kwargs: f(g(*args, **kwargs))
 
 
 def _parse_build_specifiers(option: optparse.Option, _opt_str: str, value: str,
diff --git a/third_party/blink/tools/blinkpy/tool/commands/update_metadata_unittest.py b/third_party/blink/tools/blinkpy/tool/commands/update_metadata_unittest.py
index 3536be3..3dba6fb 100644
--- a/third_party/blink/tools/blinkpy/tool/commands/update_metadata_unittest.py
+++ b/third_party/blink/tools/blinkpy/tool/commands/update_metadata_unittest.py
@@ -6,9 +6,11 @@
 import io
 import json
 import optparse
+import textwrap
 import unittest
 from unittest.mock import patch
 
+from blinkpy.common.path_finder import PathFinder
 from blinkpy.common.net.git_cl import TryJobStatus
 from blinkpy.common.net.git_cl_mock import MockGitCL
 from blinkpy.common.net.rpc import Build, RPCError
@@ -49,7 +51,53 @@
         self.git_cl = MockGitCL(self.tool, self.builds)
         self.command = UpdateMetadata(self.tool, self.git_cl)
 
-    def test_execute_basic(self):
+        finder = PathFinder(self.tool.filesystem)
+        self.tool.filesystem.write_text_file(
+            finder.path_from_web_tests('external', 'wpt', 'MANIFEST.json'),
+            json.dumps({
+                'version': 8,
+                'items': {
+                    'reftest': {
+                        'fail.html': [
+                            'c3f2fb6f436da59d43aeda0a7e8a018084557033',
+                            [None, [['reftest-ref.html', '==']], {}],
+                        ],
+                    },
+                    'testharness': {
+                        'pass.html': [
+                            'd933fd981d4a33ba82fb2b000234859bdda1494e',
+                            [None, {}],
+                        ],
+                        'crash.html': [
+                            'd933fd981d4a33ba82fb2b000234859bdda1494e',
+                            [None, {}],
+                        ],
+                        'variant.html': [
+                            'b8db5972284d1ac6bbda0da81621d9bca5d04ee7',
+                            ['variant.html?foo=bar/abc', {}],
+                            ['variant.html?foo=baz', {}],
+                        ],
+                    },
+                },
+            }))
+        self.tool.filesystem.write_text_file(
+            finder.path_from_web_tests('wpt_internal', 'MANIFEST.json'),
+            json.dumps({
+                'version': 8,
+                'url_base': '/wpt_internal/',
+                'items': {
+                    'testharness': {
+                        'dir': {
+                            'multiglob.https.any.js': [
+                                'd6498c3e388e0c637830fa080cca78b0ab0e5305',
+                                ['dir/multiglob.https.any.window.html', {}],
+                                ['dir/multiglob.https.any.worker.html', {}],
+                            ],
+                        },
+                    },
+                },
+            }))
+
         self.tool.web.append_prpc_response({
             'artifacts': [{
                 'artifactId':
@@ -68,22 +116,72 @@
                 'product': 'chrome',
             },
             'results': [{
-                'expected': 'OK',
-                'status': 'CRASH',
+                'test':
+                '/crash.html',
+                'subtests': [{
+                    'name': 'this assertion crashes',
+                    'status': 'CRASH',
+                    'message': None,
+                    'expected': 'PASS',
+                    'known_intermittent': [],
+                }],
+                'expected':
+                'OK',
+                'status':
+                'CRASH',
             }],
         }).encode()
-        exit_code = self.command.main([])
+
+    @contextlib.contextmanager
+    def _patch_builtins(self):
+        with contextlib.ExitStack() as stack:
+            stack.enter_context(self.tool.filesystem.patch_builtins())
+            stack.enter_context(self.tool.executive.patch_builtins())
+            yield stack
+
+    def test_execute_all(self):
+        with self._patch_builtins():
+            exit_code = self.command.main([])
+        self.assertEqual(exit_code, 0)
+        # Even tests that pass may require an update if a subtest was added or
+        # removed.
+        self.assertLog([
+            'INFO: All builds finished.\n',
+            'INFO: Processing wptrunner report (1/1)\n',
+            "INFO: Updating 'crash.html' (1/5)\n",
+            "INFO: Updating 'dir/multiglob.https.any.js' (2/5)\n",
+            "INFO: Updating 'fail.html' (3/5)\n",
+            "INFO: Updating 'pass.html' (4/5)\n",
+            "INFO: Updating 'variant.html' (5/5)\n",
+        ])
+
+    def test_execute_explicit_include_patterns(self):
+        self.tool.filesystem.write_text_file(
+            'test-names.txt',
+            textwrap.dedent("""\
+                # Ignore this line
+                wpt_internal/dir
+                  # Ignore this line too
+                """))
+        with self._patch_builtins():
+            exit_code = self.command.main([
+                '--test-name-file=test-names.txt',
+                'variant.html',
+                'pass.html',
+            ])
         self.assertEqual(exit_code, 0)
         self.assertLog([
             'INFO: All builds finished.\n',
             'INFO: Processing wptrunner report (1/1)\n',
-            'INFO: 1 test (product: chrome, os: mac, os_version: 12, '
-            'cpu: arm-64, flag_specific: -)\n',
+            "INFO: Updating 'dir/multiglob.https.any.js' (1/3)\n",
+            "INFO: Updating 'pass.html' (2/3)\n",
+            "INFO: Updating 'variant.html' (3/3)\n",
         ])
 
     def test_execute_with_no_issue_number_aborts(self):
         self.command.git_cl = MockGitCL(self.tool, issue_number='None')
-        exit_code = self.command.main([])
+        with self._patch_builtins():
+            exit_code = self.command.main([])
         self.assertEqual(exit_code, 1)
         self.assertLog(['ERROR: No issue number for current branch.\n'])
 
@@ -93,7 +191,8 @@
                 Build('test-linux-rel', 1000, '1000'):
                 TryJobStatus.from_bb_status('STARTED'),
             })
-        exit_code = self.command.main([])
+        with self._patch_builtins():
+            exit_code = self.command.main([])
         self.assertEqual(exit_code, 1)
         self.assertLog([
             'INFO: No finished builds.\n',
@@ -107,9 +206,11 @@
 
     def test_execute_with_rpc_error(self):
         error = RPCError('mock error', 'getBuild', {'id': '123'}, 400)
-        with patch.object(self.command.git_cl.bb_client,
-                          'execute_batch',
-                          side_effect=error):
+        with self._patch_builtins() as stack:
+            stack.enter_context(
+                patch.object(self.command.git_cl.bb_client,
+                             'execute_batch',
+                             side_effect=error))
             exit_code = self.command.main(['--build=Test Linux Tests'])
             self.assertEqual(exit_code, 1)
             self.assertLog([
@@ -121,13 +222,15 @@
 
     def test_execute_no_trigger_jobs(self):
         self.command.git_cl = MockGitCL(self.tool, {})
-        exit_code = self.command.main(['--no-trigger-jobs'])
+        with self._patch_builtins():
+            exit_code = self.command.main(['--no-trigger-jobs'])
         self.assertEqual(exit_code, 1)
         self.assertLog([
             "ERROR: Aborted: no try jobs and '--no-trigger-jobs' or "
             "'--dry-run' passed.\n",
         ])
-        exit_code = self.command.main(['--dry-run'])
+        with self._patch_builtins():
+            exit_code = self.command.main(['--dry-run'])
         self.assertEqual(exit_code, 1)
         self.assertLog([
             "ERROR: Aborted: no try jobs and '--no-trigger-jobs' or "
@@ -136,51 +239,30 @@
         self.assertEqual(self.command.git_cl.calls, [])
 
     def test_gather_reports(self):
-        self.tool.filesystem.write_text_file(
-            'wptreport.json',
-            json.dumps({
-                'run_info': {
-                    'os': 'mac',
-                },
-                'results': [],
-            },
-                       indent=2))
-        self.tool.web.append_prpc_response({
-            'artifacts': [{
-                'artifactId':
-                'wpt_reports_chrome_01.json',
-                'fetchUrl':
-                'https://cr.dev/123/wptreport.json?token=abc',
-            }],
-        })
-
-        report_from_builder = json.dumps({
+        local_report = {
             'run_info': {
-                'os': 'linux',
+                'os': 'mac',
             },
             'results': [],
-        }) + '\n'
+        }
+        self.tool.filesystem.write_text_file(
+            'report1.json', json.dumps(local_report, indent=2))
         # Simulate a retry within a shard.
-        url = 'https://cr.dev/123/wptreport.json?token=abc'
-        self.tool.web.urls[url] = 2 * report_from_builder.encode()
+        self.tool.filesystem.write_text_file(
+            'report2.json', '\n'.join([json.dumps(local_report)] * 2))
 
-        report1, report2, report3 = sorted(
-            self.command.gather_reports(self.builds, ['wptreport.json']),
-            key=lambda report: report['run_info']['os'])
-        self.assertEqual(report1['run_info'], {'os': 'linux'})
-        self.assertEqual(report2['run_info'], {'os': 'linux'})
-        self.assertEqual(report3['run_info'], {'os': 'mac'})
+        reports = list(
+            self.command.gather_reports(self.builds,
+                                        ['report1.json', 'report2.json']))
+        self.assertEqual(len(reports), 3)
         self.assertLog([
-            'INFO: Processing wptrunner report (1/2)\n',
-            'INFO: Processing wptrunner report (2/2)\n',
+            'INFO: Processing wptrunner report (1/3)\n',
+            'INFO: Processing wptrunner report (2/3)\n',
+            'INFO: Processing wptrunner report (3/3)\n',
         ])
 
-    def test_gather_reports_invalid_json(self):
-        self.tool.filesystem.write_text_file('invalid.json', '{')
-        with self.assertRaises(json.JSONDecodeError):
-            list(self.command.gather_reports({}, ['invalid.json']))
-
     def test_gather_reports_no_artifacts(self):
+        self.tool.web.responses.clear()
         self.tool.web.append_prpc_response({'artifacts': []})
         self.assertEqual(list(self.command.gather_reports(self.builds, [])),
                          [])
diff --git a/third_party/blink/tools/blinkpy/w3c/wpt_results_processor_unittest.py b/third_party/blink/tools/blinkpy/w3c/wpt_results_processor_unittest.py
index be33588..6d8d4bf 100644
--- a/third_party/blink/tools/blinkpy/w3c/wpt_results_processor_unittest.py
+++ b/third_party/blink/tools/blinkpy/w3c/wpt_results_processor_unittest.py
@@ -134,24 +134,6 @@
         """Loads the json output after post-processing."""
         return json.loads(self.fs.read_text_file(filename))
 
-    def _open_mock(self, filename, mode='r', **_kwargs):
-        """A mock for Python's built-in `open` backed by a Blink FS."""
-        mode_match = re.match(r'([rwa])(b?)', mode).groups()
-        open_func_map = {
-            ('r', ''): self.fs.open_text_file_for_reading,
-            ('w', ''): self.fs.open_text_file_for_writing,
-            ('r', 'b'): self.fs.open_binary_file_for_reading,
-            ('w', 'b'): self.fs.open_binary_file_for_writing,
-        }
-        return open_func_map[mode_match](filename)
-
-    @contextlib.contextmanager
-    def _mock_filesystem_builtins(self):
-        with contextlib.ExitStack() as stack:
-            stack.enter_context(patch('builtins.open', self._open_mock))
-            stack.enter_context(patch('os.path.join', self.fs.join))
-            yield
-
     def test_result_sink_for_test_expected_result(self):
         json_dict = {
             'tests': {
@@ -652,7 +634,7 @@
             self.fs.join(self.processor.web_tests_dir, 'external', 'wpt',
                          'test.html.ini'), checked_in_metadata)
 
-        with self._mock_filesystem_builtins():
+        with self.fs.patch_builtins():
             self.processor.process_wpt_results(OUTPUT_JSON_FILENAME)
         artifacts_subdir = self.fs.join(self.processor.artifacts_dir,
                                         'external', 'wpt')
@@ -735,7 +717,7 @@
                   [bracket is not matched
                 """))
 
-        with self._mock_filesystem_builtins():
+        with self.fs.patch_builtins():
             self.processor.process_wpt_results(OUTPUT_JSON_FILENAME)
 
         path_from_out_dir_base = self.fs.join('layout-test-results',
@@ -786,7 +768,7 @@
                 [variant.html?foo=baz]
                   expected: TIMEOUT
                 """))
-        with self._mock_filesystem_builtins():
+        with self.fs.patch_builtins():
             self.processor.process_wpt_results(OUTPUT_JSON_FILENAME)
         variant_metadata = textwrap.dedent("""\
             [variant.html?foo=bar/abc]
@@ -860,7 +842,7 @@
                   expected: FAIL
                 """))
 
-        with self._mock_filesystem_builtins():
+        with self.fs.patch_builtins():
             self.processor.process_wpt_results(OUTPUT_JSON_FILENAME)
         artifacts_subdir = self.fs.join(self.processor.artifacts_dir,
                                         'external', 'wpt')
diff --git a/third_party/blink/tools/blinkpy/web_tests/controllers/web_test_runner.py b/third_party/blink/tools/blinkpy/web_tests/controllers/web_test_runner.py
index 1a3633c..0f9fedb 100644
--- a/third_party/blink/tools/blinkpy/web_tests/controllers/web_test_runner.py
+++ b/third_party/blink/tools/blinkpy/web_tests/controllers/web_test_runner.py
@@ -182,7 +182,7 @@
 
     def _worker_factory(self, worker_connection):
         return Worker(worker_connection, self._results_directory,
-                      self._options)
+                      self._options, self._port.child_kwargs())
 
     def _mark_interrupted_tests_as_skipped(self, test_run_results):
         for test_input in self._test_inputs:
@@ -265,7 +265,7 @@
 
 
 class Worker(object):
-    def __init__(self, caller, results_directory, options):
+    def __init__(self, caller, results_directory, options, port_kwargs):
         self._caller = caller
         self._worker_number = caller.worker_number
         self._name = caller.name
@@ -274,6 +274,7 @@
         # in the workers (this also prevents race conditions among workers).
         self._options = copy.copy(options)
         self._options.manifest_update = False
+        self._port_kwargs = port_kwargs
 
         # The remaining fields are initialized in start()
         self._host = None
@@ -294,7 +295,8 @@
         self._host = self._caller.host
         self._filesystem = self._host.filesystem
         self._port = self._host.port_factory.get(self._options.platform,
-                                                 self._options)
+                                                 self._options,
+                                                 **self._port_kwargs)
         self._driver = self._port.create_driver(self._worker_number)
         self._batch_count = 0
 
diff --git a/third_party/blink/tools/blinkpy/web_tests/controllers/web_test_runner_unittest.py b/third_party/blink/tools/blinkpy/web_tests/controllers/web_test_runner_unittest.py
index 7270cf5..6e9d638 100644
--- a/third_party/blink/tools/blinkpy/web_tests/controllers/web_test_runner_unittest.py
+++ b/third_party/blink/tools/blinkpy/web_tests/controllers/web_test_runner_unittest.py
@@ -408,6 +408,6 @@
         # pylint: disable=protected-access
         options = run_web_tests.parse_args(['--platform',
                                             'test-mac-mac10.11'])[0]
-        worker = Worker(self.DummyCaller(), '/results', options)
+        worker = Worker(self.DummyCaller(), '/results', options, {})
         self.assertTrue(options.manifest_update)
         self.assertFalse(worker._options.manifest_update)
diff --git a/third_party/blink/tools/blinkpy/web_tests/lint_test_expectations.py b/third_party/blink/tools/blinkpy/web_tests/lint_test_expectations.py
index 2cb715b..f5215554 100644
--- a/third_party/blink/tools/blinkpy/web_tests/lint_test_expectations.py
+++ b/third_party/blink/tools/blinkpy/web_tests/lint_test_expectations.py
@@ -407,8 +407,7 @@
     failures += f
     warnings += w
     failures.extend(check_virtual_test_suites(host, options))
-    # Disabled until crbug.com/1322981 is fixed.
-    #failures.extend(check_smoke_tests(host, options))
+    failures.extend(check_smoke_tests(host, options))
 
     if options.json:
         with open(options.json, 'w') as f:
diff --git a/third_party/blink/tools/blinkpy/web_tests/port/android.py b/third_party/blink/tools/blinkpy/web_tests/port/android.py
index 72f7f63..b22d0ae 100644
--- a/third_party/blink/tools/blinkpy/web_tests/port/android.py
+++ b/third_party/blink/tools/blinkpy/web_tests/port/android.py
@@ -306,13 +306,21 @@
 
     BUILD_REQUIREMENTS_URL = 'https://www.chromium.org/developers/how-tos/android-build-instructions'
 
-    def __init__(self, host, port_name='', apk='', product='', options=None, **kwargs):
+    def __init__(self,
+                 host,
+                 port_name='',
+                 apk='',
+                 product='',
+                 options=None,
+                 prepared_devices=[],
+                 **kwargs):
         super(AndroidPort, self).__init__(
             host, port_name, options=options, **kwargs)
         self._operating_system = 'android'
         self._version = 'pie'
         fs = host.filesystem
         self._local_port = factory.PortFactory(host).get(**kwargs)
+        self._prepared_devices = prepared_devices
         if apk or product:
             self._driver_details = DriverDetails(apk)
             browser_type = fs.splitext(fs.basename(apk))[0].lower()
@@ -351,8 +359,7 @@
                 logging.DEBUG if self._debug_logging
                 and self.get_option('debug_rwt_logging') else logging.WARNING)
 
-            prepared_devices = self.get_option('prepared_devices', [])
-            for serial in prepared_devices:
+            for serial in self._prepared_devices:
                 self._devices.set_device_prepared(serial)
 
     def bot_expectations(self):
@@ -544,16 +551,19 @@
         # By setting this on the options object, we can propagate the list
         # of prepared devices to the workers (it is read in __init__()).
         if self._devices._prepared_devices:
-            self._options.prepared_devices = self._devices.prepared_devices()
+            self._prepared_devices = self._devices.prepared_devices()
         else:
             # We were called with --no-build, so assume the devices are up to date.
-            self._options.prepared_devices = [
+            self._prepared_devices = [
                 d.get_serial()
                 for d in self._devices.usable_devices(self.host.executive)
             ]
 
+    def child_kwargs(self):
+        return {"prepared_devices": self._prepared_devices}
+
     def num_workers(self, requested_num_workers):
-        return min(len(self._options.prepared_devices), requested_num_workers)
+        return min(len(self._prepared_devices), requested_num_workers)
 
     def check_sys_deps(self):
         # _get_font_files() will throw if any of the required fonts is missing.
diff --git a/third_party/blink/tools/blinkpy/web_tests/port/base.py b/third_party/blink/tools/blinkpy/web_tests/port/base.py
index dde83ed..6f6d320 100644
--- a/third_party/blink/tools/blinkpy/web_tests/port/base.py
+++ b/third_party/blink/tools/blinkpy/web_tests/port/base.py
@@ -40,6 +40,7 @@
 import sys
 import tempfile
 from collections import defaultdict
+from copy import deepcopy
 
 import six
 from six.moves import zip_longest
@@ -248,7 +249,7 @@
 
         # FIXME: Ideally we'd have a package-wide way to get a well-formed
         # options object that had all of the necessary options defined on it.
-        self._options = options or optparse.Values()
+        self._options = deepcopy(options) or optparse.Values()
 
         self.host = host
         self._executive = host.executive
@@ -263,6 +264,8 @@
         self._http_lock = None  # FIXME: Why does this live on the port object?
         self._dump_reader = None
 
+        # Configuration and target are always set by PortFactory so this is only
+        # relevant in cases where a Port is created without it (testing mostly).
         if not hasattr(options, 'configuration') or not options.configuration:
             self.set_option_default('configuration',
                                     self.default_configuration())
@@ -1594,6 +1597,14 @@
         """Returns the number of available workers (possibly less than the number requested)."""
         return requested_num_workers
 
+    def child_kwargs(self):
+        """Returns additional kwargs to pass to the Port objects in the worker processes.
+        This can be used to transmit additional state such as initialized emulators.
+
+        Note: these must be able to be pickled.
+        """
+        return {}
+
     def clean_up_test_run(self):
         """Performs port-specific work at the end of a test run."""
         if self._image_differ:
diff --git a/third_party/blink/tools/blinkpy/web_tests/port/base_unittest.py b/third_party/blink/tools/blinkpy/web_tests/port/base_unittest.py
index 4a722ff..3abaa9b3 100644
--- a/third_party/blink/tools/blinkpy/web_tests/port/base_unittest.py
+++ b/third_party/blink/tools/blinkpy/web_tests/port/base_unittest.py
@@ -95,6 +95,11 @@
         port = self.make_port(options=options)
         self.assertEqual(port.get_option('foo'), 'bar')
 
+    def test_options_unchanged(self):
+        options = optparse.Values()
+        self.make_port(options=options)
+        self.assertEqual(options, optparse.Values())
+
     def test_get_option__unset(self):
         port = self.make_port()
         self.assertIsNone(port.get_option('foo'))
diff --git a/third_party/blink/tools/blinkpy/web_tests/port/factory.py b/third_party/blink/tools/blinkpy/web_tests/port/factory.py
index 2f85644..991c393 100644
--- a/third_party/blink/tools/blinkpy/web_tests/port/factory.py
+++ b/third_party/blink/tools/blinkpy/web_tests/port/factory.py
@@ -31,6 +31,7 @@
 import optparse
 import re
 import sys
+from copy import deepcopy
 
 from blinkpy.common.path_finder import PathFinder
 
@@ -66,19 +67,20 @@
         appropriate port on this platform.
         """
         port_name = port_name or self._default_port()
+        port_options = deepcopy(options) or optparse.Values()
 
-        _check_configuration_and_target(self._host.filesystem, options)
+        _update_configuration_and_target(self._host.filesystem, port_options)
 
         port_class, class_name = self.get_port_class(port_name)
         if port_class is None:
             raise NotImplementedError('unsupported platform: "%s"' % port_name)
 
         full_port_name = port_class.determine_full_port_name(
-            self._host, options,
+            self._host, port_options,
             class_name if 'browser_test' in port_name else port_name)
         return port_class(self._host,
                           full_port_name,
-                          options=options,
+                          options=port_options,
                           **kwargs)
 
     @classmethod
@@ -214,14 +216,14 @@
     })
 
 
-def _check_configuration_and_target(host, options):
-    """Updates options.configuration based on options.target."""
-    if not options or not getattr(options, 'target', None):
-        return
+def _update_configuration_and_target(host, options):
+    """Updates options.configuration and options.target based on a best guess."""
+    if not getattr(options, 'target', None):
+        options.target = getattr(options, 'configuration', None) or 'Release'
 
     gn_configuration = _read_configuration_from_gn(host, options)
     if gn_configuration:
-        expected_configuration = getattr(options, 'configuration')
+        expected_configuration = getattr(options, 'configuration', None)
         if expected_configuration not in (None, gn_configuration):
             raise ValueError('Configuration does not match the GN build args. '
                              'Expected "%s" but got "%s".' %
diff --git a/third_party/blink/tools/blinkpy/web_tests/port/factory_unittest.py b/third_party/blink/tools/blinkpy/web_tests/port/factory_unittest.py
index 59e73d6..5dc09d34 100644
--- a/third_party/blink/tools/blinkpy/web_tests/port/factory_unittest.py
+++ b/third_party/blink/tools/blinkpy/web_tests/port/factory_unittest.py
@@ -101,6 +101,12 @@
             factory.PortFactory(host).get_from_builder_name(
                 'My Fake Mac11 Builder').name(), 'mac-mac11')
 
+    def test_options_is_unchanged(self):
+        host = MockHost()
+        options = optparse.Values()
+        factory.PortFactory(host).get(options=options)
+        self.assertEqual(options, optparse.Values())
+
     def get_port(self, target=None, configuration=None, files=None):
         host = MockHost()
         finder = PathFinder(host.filesystem)
@@ -190,3 +196,7 @@
                 target='Debug',
                 configuration='Release',
                 files={'out/Debug/toolchain.ninja': ''})
+
+    def test_no_target_has_correct_config(self):
+        port = self.get_port(files={'out/Release/args.gn': 'is_debug = true'})
+        self.assertEqual(port._options.configuration, 'Debug')
diff --git a/third_party/blink/tools/blinkpy/web_tests/port/fuchsia.py b/third_party/blink/tools/blinkpy/web_tests/port/fuchsia.py
index 9261b9f..51b4e2e 100644
--- a/third_party/blink/tools/blinkpy/web_tests/port/fuchsia.py
+++ b/third_party/blink/tools/blinkpy/web_tests/port/fuchsia.py
@@ -193,7 +193,7 @@
         ['fuchsia'] + linux.LinuxPort.latest_platform_fallback_path()
     }
 
-    def __init__(self, host, port_name, **kwargs):
+    def __init__(self, host, port_name, target_host=None, **kwargs):
         super(FuchsiaPort, self).__init__(host, port_name, **kwargs)
 
         self._operating_system = 'fuchsia'
@@ -208,7 +208,7 @@
         # Used to implement methods that depend on the host platform.
         self._host_port = factory.PortFactory(host).get(**kwargs)
 
-        self._target_host = self.get_option('fuchsia_target')
+        self._target_host = target_host
         self._zircon_logger = None
         _import_fuchsia_runner()
 
@@ -259,10 +259,6 @@
                 self._zircon_logger = SubprocessOutputLogger(symbolized_klog_proc,
                     'Zircon')
 
-            # Save fuchsia_target in _options, so it can be shared with other
-            # workers.
-            self._options.fuchsia_target = self._target_host
-
         except fuchsia_target.FuchsiaTargetException as e:
             _log.error('Failed to start qemu: %s.', str(e))
             return exit_codes.NO_DEVICES_EXIT_STATUS
@@ -272,6 +268,9 @@
             self._target_host.cleanup()
             self._target_host = None
 
+    def child_kwargs(self):
+        return {"target_host": self._target_host}
+
     def num_workers(self, requested_num_workers):
         # Allow for multi-process / multi-threading overhead in the browser
         # by allocating two CPU cores per-worker.
diff --git a/third_party/blink/tools/blinkpy/web_tests/port/linux_unittest.py b/third_party/blink/tools/blinkpy/web_tests/port/linux_unittest.py
index 9ee1d034..329abaf 100644
--- a/third_party/blink/tools/blinkpy/web_tests/port/linux_unittest.py
+++ b/third_party/blink/tools/blinkpy/web_tests/port/linux_unittest.py
@@ -276,7 +276,7 @@
         # Xvfb is started via Executive.popen, which returns an object for the
         # process. Here we set up a fake process object that acts as if it has
         # exited with return code 1 immediately.
-        proc = MockProcess(stdout='', stderr='', returncode=3)
+        proc = MockProcess(['Xvfb'], stdout='', stderr='', returncode=3)
         port.host.executive = MockExecutive(
             run_command_fn=run_command_fake, proc=proc)
         self.set_logging_level(logging.DEBUG)
diff --git a/third_party/blink/tools/blinkpy/web_tests/run_web_tests.py b/third_party/blink/tools/blinkpy/web_tests/run_web_tests.py
index 4831bab8..fdb539f 100644
--- a/third_party/blink/tools/blinkpy/web_tests/run_web_tests.py
+++ b/third_party/blink/tools/blinkpy/web_tests/run_web_tests.py
@@ -723,7 +723,10 @@
                                   str(port.default_max_locked_shards())))
 
     if not options.configuration:
-        options.configuration = port.default_configuration()
+        options.configuration = port.get_option('configuration')
+
+    if not options.target:
+        options.target = port.get_option('target')
 
     if not options.timeout_ms:
         options.timeout_ms = str(port.timeout_ms())
diff --git a/third_party/blink/tools/blinkpy/web_tests/views/printing.py b/third_party/blink/tools/blinkpy/web_tests/views/printing.py
index a879c8fa..2f0b0e96 100644
--- a/third_party/blink/tools/blinkpy/web_tests/views/printing.py
+++ b/third_party/blink/tools/blinkpy/web_tests/views/printing.py
@@ -113,7 +113,8 @@
         fallback_path = [fs.split(x)[1] for x in port.baseline_search_path()]
         self._print_default(
             'Baseline search path: %s -> generic' % ' -> '.join(fallback_path))
-        self._print_default('Using %s build' % self._options.configuration)
+        self._print_default('Using %s build' %
+                            port.get_option('configuration'))
         self._print_default(
             'Regular timeout: %s, slow test timeout: %s' %
             (self._options.timeout_ms, self._options.slow_timeout_ms))
diff --git a/third_party/blink/web_tests/FlagExpectations/disable-layout-ng b/third_party/blink/web_tests/FlagExpectations/disable-layout-ng
index 6423654..c1068df 100644
--- a/third_party/blink/web_tests/FlagExpectations/disable-layout-ng
+++ b/third_party/blink/web_tests/FlagExpectations/disable-layout-ng
@@ -2037,6 +2037,10 @@
 crbug.com/1321217 virtual/document-transition/wpt_internal/document-transition/old-content-with-overflow.html [ Skip ]
 crbug.com/1321217 virtual/document-transition/wpt_internal/document-transition/new-content-with-overflow.html [ Skip ]
 crbug.com/1303102 virtual/document-transition/wpt_internal/document-transition/no-root-capture.html [ Skip ]
+crbug.com/1303102 virtual/document-transition/wpt_internal/document-transition/new-content-captures-different-size.html [ Skip ]
+crbug.com/1303102 virtual/document-transition/wpt_internal/document-transition/old-content-captures-different-size.html [ Skip ]
+crbug.com/1303102 virtual/document-transition-wide-gamut/wpt_internal/document-transition/old-content-captures-different-size.html [ Skip ]
+crbug.com/1303102 virtual/document-transition-wide-gamut/wpt_internal/document-transition/new-content-captures-different-size.html [ Skip ]
 
 crbug.com/1303102 virtual/document-transition-wide-gamut/wpt_internal/document-transition/new-content-with-overflow-zoomed.html [ Skip ]
 crbug.com/1303102 virtual/document-transition-wide-gamut/wpt_internal/document-transition/old-content-with-overflow-zoomed.html [ Skip ]
diff --git a/third_party/blink/web_tests/FlagExpectations/highdpi b/third_party/blink/web_tests/FlagExpectations/highdpi
index cbed735..5c9c4458 100644
--- a/third_party/blink/web_tests/FlagExpectations/highdpi
+++ b/third_party/blink/web_tests/FlagExpectations/highdpi
@@ -1367,17 +1367,15 @@
 
 # ref tests that fail in highdpi
 crbug.com/1179572 animations/cross-fade-webkit-mask-box-image.html [ Failure ]
-crbug.com/1295280 virtual/document-transition/wpt_internal/document-transition/css-tags-paint-order-with-entry.html [ Failure ]
-crbug.com/1295280 virtual/document-transition/wpt_internal/document-transition/old-content-captures-opacity.html [ Failure ]
-crbug.com/1295281 virtual/document-transition/wpt_internal/document-transition/new-content-captures-different-size.html [ Failure ]
-crbug.com/1295281 virtual/document-transition/wpt_internal/document-transition/old-content-captures-different-size.html [ Failure ]
-crbug.com/1311421 virtual/document-transition/wpt_internal/document-transition/content-with-clip-max-texture-size.html [ Failure ]
-crbug.com/1295281 virtual/document-transition/wpt_internal/document-transition/old-content-object-fit-fill.html [ Failure ]
-crbug.com/1295281 virtual/document-transition/wpt_internal/document-transition/new-content-object-fit-fill.html [ Failure ]
-crbug.com/1329180 virtual/document-transition/wpt_internal/document-transition/new-and-old-sizes-match.html [ Failure ]
-crbug.com/1295280 virtual/document-transition/wpt_internal/document-transition/old-content-with-overflow-zoomed.html [ Failure ]
-crbug.com/1295280 virtual/document-transition/wpt_internal/document-transition/new-content-with-overflow-zoomed.html [ Failure ]
+
+crbug.com/1353771 virtual/document-transition/wpt_internal/document-transition/content-with-clip-max-texture-size.html [ Failure ]
+crbug.com/1353771 virtual/document-transition/wpt_internal/document-transition/new-content-with-overflow-zoomed.html [ Failure ]
+crbug.com/1353771 virtual/document-transition/wpt_internal/document-transition/old-content-with-overflow-zoomed.html [ Failure ]
+crbug.com/1353771 virtual/document-transition-wide-gamut/wpt_internal/document-transition/content-with-clip-max-texture-size.html [ Failure ]
+crbug.com/1353771 virtual/document-transition-wide-gamut/wpt_internal/document-transition/new-content-with-overflow-zoomed.html [ Failure ]
+crbug.com/1353771 virtual/document-transition-wide-gamut/wpt_internal/document-transition/old-content-with-overflow-zoomed.html [ Failure ]
 crbug.com/1351422 virtual/document-transition/wpt_internal/document-transition/content-visibility-auto-shared-element.html [ Failure ]
+crbug.com/1351422 virtual/document-transition-wide-gamut/wpt_internal/document-transition/content-visibility-auto-shared-element.html [ Failure ]
 
 crbug.com/1314903 external/wpt/css/css-sizing/contain-intrinsic-size/animation/contain-intrinsic-size-interpolation.html [ Failure ]
 
@@ -1837,15 +1835,6 @@
 # crbug.com/1339051: some ref tests generate output with minor differences.
 crbug.com/1339051 compositing/text-on-scaled-layer.html [ Failure ]
 crbug.com/1339051 fast/forms/suggestion-picker/month-suggestion-picker-appearance-rtl.html [ Failure ]
-crbug.com/1339051 virtual/document-transition/wpt_internal/document-transition/content-with-clip.html [ Failure ]
-crbug.com/1339051 virtual/document-transition/wpt_internal/document-transition/content-with-transform-new-image.html [ Failure ]
-crbug.com/1339051 virtual/document-transition/wpt_internal/document-transition/content-with-transform-old-image.html [ Failure ]
-crbug.com/1339051 virtual/document-transition/wpt_internal/document-transition/new-content-scaling.html [ Failure ]
-crbug.com/1339051 virtual/document-transition/wpt_internal/document-transition/object-view-box-old-image.html [ Failure ]
-crbug.com/1339051 virtual/document-transition/wpt_internal/document-transition/old-content-captures-root.html [ Failure ]
-crbug.com/1339051 virtual/document-transition/wpt_internal/document-transition/old-content-object-view-box-clip-path-reference.html [ Failure ]
-crbug.com/1339051 virtual/document-transition/wpt_internal/document-transition/root-captured-as-different-tag.html [ Failure ]
-crbug.com/1339051 virtual/document-transition/wpt_internal/document-transition/web-animations-api.html [ Failure ]
 
 # Flaky
 crbug.com/1355662 external/wpt/compute-pressure/compute_pressure_detached_iframe.tentative.https.html [ Failure ]
diff --git a/third_party/blink/web_tests/SmokeTests/Mac.txt b/third_party/blink/web_tests/SmokeTests/Mac.txt
index 0293dc0..2dd2779 100644
--- a/third_party/blink/web_tests/SmokeTests/Mac.txt
+++ b/third_party/blink/web_tests/SmokeTests/Mac.txt
@@ -975,7 +975,9 @@
 http/tests/images/image-decode-in-frame.html
 http/tests/inspector-protocol/dom/dom-getFrameOwner.js
 http/tests/inspector-protocol/emulation/emulation-oopifs.js
-http/tests/inspector-protocol/network/blocked-cookie-same-site-strict.js
+http/tests/inspector-protocol/network/blocked-cookie-same-site-strict-browser-navigate.js
+http/tests/inspector-protocol/network/blocked-cookie-same-site-strict-js-navigate.js
+http/tests/inspector-protocol/network/blocked-cookie-same-site-strict-js-subresource.js
 http/tests/inspector-protocol/network/navigate-iframe-out2in.js
 http/tests/inspector-protocol/network/xhr-post-replay-cors.js
 http/tests/inspector-protocol/page/page-lifecycleEvents.js
@@ -1441,8 +1443,6 @@
 virtual/backface-visibility-interop/paint/invalidation/window-resize/window-resize-background-image-fixed-scrolling-contents.html
 virtual/background-svg-in-lcp/external/wpt/largest-contentful-paint/multiple-redirects-TAO.html
 virtual/background-svg-in-lcp/external/wpt/largest-contentful-paint/toJSON.html
-virtual/clipboard-custom-formats/clipboard/async-clipboard/async-custom-format-write-read.tentative.https.html
-virtual/clipboard-custom-formats/clipboard/async-clipboard/async-custom-formats-write-read.tentative.https.html
 virtual/composite-relative-keyframes/external/wpt/css/css-transforms/animation/transform-interpolation-005.html
 virtual/compositor-threaded-percent-based-scrolling/fast/scrolling/resize-corner-tracking-touch.html
 virtual/compositor-threaded-percent-based-scrolling/fast/scrolling/subpixel-overflow-mouse-drag.html
@@ -1450,8 +1450,6 @@
 virtual/controls-refresh-hc/fast/forms/color-scheme/media/video-overlay-menu.html
 virtual/controls-refresh-hc/fast/forms/color-scheme/media/video-overlay-play-button.html
 virtual/controls-refresh-hc/fast/forms/color-scheme/range/range-pressed-state.html
-virtual/css-calc-infinity-and-nan-disabled/external/wpt/css/css-values/cap-unit-001.html
-virtual/css-calc-infinity-and-nan-disabled/external/wpt/css/css-values/ch-unit-011.html
 virtual/dark-color-scheme/fast/forms/color-scheme/media/video-overlay-menu.html
 virtual/dark-color-scheme/fast/forms/color-scheme/media/video-overlay-play-button.html
 virtual/dark-color-scheme/fast/forms/color-scheme/scrollbar/dynamic-color-scheme-change.html
@@ -1467,8 +1465,6 @@
 virtual/dark-mode-default/dark-mode/images/image.html
 virtual/dark-mode-images-filter-all/dark-mode/images/image.html
 virtual/dark-mode-images-filter-none/dark-mode/images/image.html
-virtual/disable-ua-ch-platform/external/wpt/client-hints/accept-ch-non-secure.http.html
-virtual/disable-ua-ch-platform/external/wpt/client-hints/accept-ch-stickiness/same-origin-navigation.https.html
 virtual/disable-ua-client-hint/external/wpt/client-hints/accept-ch-cache-revalidation.https.html
 virtual/disable-ua-client-hint/external/wpt/client-hints/accept-ch-stickiness/same-origin-iframe.https.html
 virtual/disable-ua-client-hint/external/wpt/client-hints/accept-ch-stickiness/same-origin-navigation.https.html
@@ -1543,9 +1539,6 @@
 virtual/layout_ng_printing/printing/tfoot-repeats-at-bottom-of-each-page.html
 virtual/layout_ng_printing/printing/thead-repeats-at-top-of-each-page-multiple-tables.html
 virtual/layout_ng_printing/printing/thead-repeats-at-top-of-each-page.html
-virtual/layout_ng_table_frag/external/wpt/css/css-break/table/break-inside-cell-000.html
-virtual/layout_ng_table_frag/external/wpt/css/css-break/table/break-inside-cell-001.html
-virtual/layout_ng_table_frag/external/wpt/css/css-break/table/sections-and-captions-mixed-order.html
 virtual/no-alloc-direct-call/external/wpt/html/canvas/element/compositing/2d.composite.canvas.source-out.html
 virtual/no-alloc-direct-call/external/wpt/html/canvas/element/compositing/2d.composite.clip.xor.html
 virtual/no-alloc-direct-call/external/wpt/html/canvas/element/compositing/2d.composite.operation.darker.html
@@ -1661,8 +1654,12 @@
 virtual/oopr-canvas2d/fast/canvas/image-object-in-canvas.html
 virtual/oopr-canvas2d/fast/canvas/quadraticCurveTo.xml
 virtual/overlay-scrollbar/plugin-overlay-scrollbar-mouse-capture.html
-virtual/partitioned-cookies-first-party-sets/http/tests/inspector-protocol/network/blocked-setcookie-same-site-lax.js
-virtual/partitioned-cookies/http/tests/inspector-protocol/network/blocked-cookie-same-site-strict.js
+virtual/partitioned-cookies-first-party-sets/http/tests/inspector-protocol/network/blocked-setcookie-same-site-lax-browser-navigate.js
+virtual/partitioned-cookies-first-party-sets/http/tests/inspector-protocol/network/blocked-setcookie-same-site-lax-js-navigate.js
+virtual/partitioned-cookies-first-party-sets/http/tests/inspector-protocol/network/blocked-setcookie-same-site-lax-js-subresource.js
+virtual/partitioned-cookies/http/tests/inspector-protocol/network/blocked-cookie-same-site-strict-browser-navigate.js
+virtual/partitioned-cookies/http/tests/inspector-protocol/network/blocked-cookie-same-site-strict-js-navigate.js
+virtual/partitioned-cookies/http/tests/inspector-protocol/network/blocked-cookie-same-site-strict-js-subresource.js
 virtual/plz-dedicated-worker/external/wpt/content-security-policy/inside-worker/serviceworker-report-only.https.sub.html
 virtual/plz-dedicated-worker/external/wpt/fetch/api/basic/http-response-code.any.html
 virtual/plz-dedicated-worker/external/wpt/fetch/api/basic/request-upload.any.html
@@ -1736,8 +1733,6 @@
 virtual/split-http-cache/external/wpt/signed-exchange/reporting/sxg-reporting-prefetch-mi_error.tentative.html
 virtual/stable/media/stable/video-object-fit-stable.html
 virtual/storage-access-api/external/wpt/storage-access-api/storageAccess.testdriver.sub.html
-virtual/system-color-compute/external/wpt/css/css-color/color-function-parsing.html
-virtual/system-color-compute/external/wpt/css/css-color/parsing/relative-color-valid.html
 virtual/text-antialias/apply-start-width-after-skipped-text.html
 virtual/text-antialias/atomic-inline-before-ellipsis.html
 virtual/text-antialias/atsui-multiple-renderers.html
@@ -2068,7 +2063,6 @@
 virtual/use-common-select-popup/fast/forms/color-scheme/select/select-multiple-appearance-basic.html
 virtual/use-common-select-popup/fast/forms/color-scheme/select/select-multiple-hover-focused-unselected.html
 virtual/use-common-select-popup/fast/forms/color-scheme/select/select-popup-appearance-basic.html
-virtual/v8-off-thread-finalization/external/wpt/html/semantics/scripting-1/the-script-element/script-text-modifications.html
 virtual/web-bluetooth-new-permissions-backend/external/wpt/bluetooth/characteristic/notifications/service-is-removed.https.window.html
 virtual/web-bluetooth-new-permissions-backend/external/wpt/bluetooth/characteristic/writeValue/write-succeeds.https.window.html
 virtual/web-bluetooth-new-permissions-backend/external/wpt/bluetooth/requestDevice/canonicalizeFilter/empty-services-member.https.window.html
@@ -2086,36 +2080,6 @@
 virtual/web-bluetooth-new-permissions-backend/wpt_internal/bluetooth/service/getCharacteristic/gen-device-goes-out-of-range.https.html
 virtual/web-bluetooth-new-permissions-backend/wpt_internal/bluetooth/service/getCharacteristic/gen-disconnect-called-before.https.html
 virtual/web-bluetooth-new-permissions-backend/wpt_internal/bluetooth/service/getCharacteristics/correct-characteristics.https.html
-virtual/webrtc-wpt-plan-b/external/wpt/webrtc/RTCDTMFSender-insertDTMF.https.html
-virtual/webrtc-wpt-plan-b/external/wpt/webrtc/RTCDTMFSender-ontonechange-long.https.html
-virtual/webrtc-wpt-plan-b/external/wpt/webrtc/RTCDTMFSender-ontonechange.https.html
-virtual/webrtc-wpt-plan-b/external/wpt/webrtc/RTCDataChannel-bufferedAmount.html
-virtual/webrtc-wpt-plan-b/external/wpt/webrtc/RTCDataChannel-close.html
-virtual/webrtc-wpt-plan-b/external/wpt/webrtc/RTCDataChannel-iceRestart.html
-virtual/webrtc-wpt-plan-b/external/wpt/webrtc/RTCDataChannel-send-blob-order.html
-virtual/webrtc-wpt-plan-b/external/wpt/webrtc/RTCDataChannel-send.html
-virtual/webrtc-wpt-plan-b/external/wpt/webrtc/RTCDtlsTransport-state.html
-virtual/webrtc-wpt-plan-b/external/wpt/webrtc/RTCIceTransport.html
-virtual/webrtc-wpt-plan-b/external/wpt/webrtc/RTCPeerConnection-connectionState.https.html
-virtual/webrtc-wpt-plan-b/external/wpt/webrtc/RTCPeerConnection-createDataChannel.html
-virtual/webrtc-wpt-plan-b/external/wpt/webrtc/RTCPeerConnection-getStats.https.html
-virtual/webrtc-wpt-plan-b/external/wpt/webrtc/RTCPeerConnection-iceConnectionState-disconnected.https.html
-virtual/webrtc-wpt-plan-b/external/wpt/webrtc/RTCPeerConnection-ondatachannel.html
-virtual/webrtc-wpt-plan-b/external/wpt/webrtc/RTCPeerConnection-onsignalingstatechanged.https.html
-virtual/webrtc-wpt-plan-b/external/wpt/webrtc/RTCPeerConnection-setRemoteDescription-pranswer.html
-virtual/webrtc-wpt-plan-b/external/wpt/webrtc/RTCPeerConnection-track-stats.https.html
-virtual/webrtc-wpt-plan-b/external/wpt/webrtc/RTCPeerConnection-videoDetectorTest.html
-virtual/webrtc-wpt-plan-b/external/wpt/webrtc/RTCRtpReceiver-getParameters.html
-virtual/webrtc-wpt-plan-b/external/wpt/webrtc/getstats.html
-virtual/webrtc-wpt-plan-b/external/wpt/webrtc/protocol/bundle.https.html
-virtual/webrtc-wpt-plan-b/external/wpt/webrtc/protocol/candidate-exchange.https.html
-virtual/webrtc-wpt-plan-b/external/wpt/webrtc/protocol/dtls-fingerprint-validation.html
-virtual/webrtc-wpt-plan-b/external/wpt/webrtc/protocol/handover-datachannel.html
-virtual/webrtc-wpt-plan-b/external/wpt/webrtc/protocol/ice-state.https.html
-virtual/webrtc-wpt-plan-b/external/wpt/webrtc/protocol/rtp-clockrate.html
-virtual/webrtc-wpt-plan-b/external/wpt/webrtc/protocol/split.https.html
-virtual/webrtc-wpt-plan-b/external/wpt/webrtc/protocol/video-codecs.https.html
-virtual/webrtc-wpt-plan-b/external/wpt/webrtc/simplecall.https.html
 webaudio/Analyser/realtimeanalyser-freq-data.html
 webaudio/AudioBufferSource/audiobuffersource-detune-modulation.html
 webaudio/AudioBufferSource/audiobuffersource-playbackrate-modulation.html
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index 0178524a..7338e38 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -303,18 +303,6 @@
 crbug.com/1276999 virtual/document-transition/* [ Pass ]
 crbug.com/1276999 virtual/document-transition-wide-gamut/* [ Pass ]
 
-crbug.com/1295280 virtual/document-transition/wpt_internal/document-transition/old-content-captures-opacity.html [ Failure ]
-crbug.com/1295281 virtual/document-transition/wpt_internal/document-transition/new-content-captures-different-size.html [ Failure ]
-crbug.com/1295281 virtual/document-transition/wpt_internal/document-transition/old-content-captures-different-size.html [ Failure ]
-
-crbug.com/1311705 virtual/document-transition-wide-gamut/wpt_internal/document-transition/new-content-captures-clip-path.html [ Failure ]
-crbug.com/1311705 virtual/document-transition-wide-gamut/wpt_internal/document-transition/content-with-transform-new-image.html [ Failure ]
-crbug.com/1311705 virtual/document-transition-wide-gamut/wpt_internal/document-transition/content-with-transform-old-image.html [ Failure ]
-crbug.com/1311705 virtual/document-transition-wide-gamut/wpt_internal/document-transition/new-content-captures-different-size.html [ Failure ]
-crbug.com/1311705 virtual/document-transition-wide-gamut/wpt_internal/document-transition/object-view-box-old-image.html [ Failure ]
-crbug.com/1311705 virtual/document-transition-wide-gamut/wpt_internal/document-transition/old-content-captures-different-size.html [ Failure ]
-crbug.com/1311705 virtual/document-transition-wide-gamut/wpt_internal/document-transition/old-content-captures-opacity.html [ Failure ]
-
 crbug.com/1351556 virtual/document-transition-wide-gamut/wpt_internal/document-transition/commit-timeout-crash.html [ Failure Timeout ]
 crbug.com/1351556 [ Win ] virtual/document-transition-wide-gamut/wpt_internal/document-transition/nothing-captured.html [ Failure Timeout ]
 crbug.com/1351556 [ Mac11 ] virtual/document-transition-wide-gamut/wpt_internal/document-transition/nothing-captured.html [ Failure Timeout ]
@@ -5017,8 +5005,9 @@
 crbug.com/1317067 external/wpt/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/a-user-click-during-pageshow.html [ Timeout ]
 crbug.com/1317067 external/wpt/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/a-user-click-during-load.html [ Timeout ]
 
-# Flaky on Mac, it seems, both 10.5 and 11 Arm.
-crbug.com/1350611 [ Mac ] external/wpt/html/browsers/browsing-the-web/remote-context-helper-tests/navigation-same-document.window.html [ Failure Pass ]
+# Flaky on both linux and mac.
+crbug.com/1350611 [ Mac ] external/wpt/html/browsers/browsing-the-web/remote-context-helper-tests/navigation-same-document.window.html [ Failure Pass Timeout ]
+crbug.com/1350611 [ Linux ] external/wpt/html/browsers/browsing-the-web/remote-context-helper-tests/navigation-same-document.window.html [ Failure Pass Timeout ]
 
 # Tests time out, and also give different results.
 crbug.com/1299834 external/wpt/html/browsers/the-window-object/open-close/open-features-non-integer-screenx.html [ Skip Timeout ]
diff --git a/third_party/blink/web_tests/android/WebviewWPTExpectations b/third_party/blink/web_tests/android/WebviewWPTExpectations
index 56616e8..3dc9dd0 100644
--- a/third_party/blink/web_tests/android/WebviewWPTExpectations
+++ b/third_party/blink/web_tests/android/WebviewWPTExpectations
@@ -2870,7 +2870,6 @@
 crbug.com/1050754 external/wpt/html/semantics/forms/the-form-element/form-nameditem.html [ Failure Pass ]
 crbug.com/1050754 external/wpt/html/semantics/forms/the-input-element/datetime-local.html [ Failure Pass ]
 crbug.com/1050754 external/wpt/html/semantics/forms/the-input-element/hidden-charset-case-sensitive.html [ Failure Pass ]
-crbug.com/1050754 external/wpt/html/semantics/forms/the-input-element/range.html [ Failure Pass ]
 crbug.com/1050754 external/wpt/html/semantics/forms/the-input-element/time-focus-dynamic-value-change.html [ Failure ]
 crbug.com/1050754 external/wpt/html/semantics/forms/the-input-element/type-change-state.html [ Failure Pass ]
 crbug.com/1050754 external/wpt/html/semantics/forms/the-label-element/forward-focus-to-associated-element.html [ Timeout ]
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
index 69a9135e..d2944e714 100644
--- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
+++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
@@ -3291,6 +3291,13 @@
        null,
        {}
       ]
+     ],
+     "text-combine-webkit-crash.html": [
+      "228f066f2360850ea881be2203753b7cef2a7685",
+      [
+       null,
+       {}
+      ]
      ]
     },
     "cssom": {
@@ -325835,11 +325842,11 @@
       []
      ],
      "pending_beacon-helper.js": [
-      "36f9c3bb3b4eb91c4da81413504bb78046b1938f",
+      "73c46a4014471ef825221a24147c7daebc47871d",
       []
      ],
      "set_beacon.py": [
-      "996299e2532c069723ca57a404a1c7477d8a8110",
+      "1c71f23e57849481b7deb204cb859ef25f6e4356",
       []
      ]
     }
@@ -333065,6 +333072,10 @@
        "fb00852caa9d6eaa0134662b7fe01f085641509e",
        []
       ],
+      "web-nfc.https.html": [
+       "61207ab346db4393d2045bcad3cc50da1a47e38a",
+       []
+      ],
       "web-usb.https.html": [
        "555825a81c530fe3f3e948c432412d22a7718ffc",
        []
@@ -333166,7 +333177,7 @@
      []
     ],
     "helpers.js": [
-     "c8c40646481a055cd1b7abf693e8f45cab769fba",
+     "4049ff7ffefc95285c7079086da34fcefbdad04f",
      []
     ],
     "resources": {
@@ -395789,6 +395800,15 @@
        {}
       ]
      ],
+     "scroll-preserve-3d.html": [
+      "ffedc2f5cd3f59d575e7d1dbf54ef4cfc5352c5a",
+      [
+       null,
+       {
+        "testdriver": true
+       }
+      ]
+     ],
      "transform-2d-getComputedStyle-001.html": [
       "8fc4f9380fe4739334032975da15f626964277d3",
       [
@@ -479703,7 +479723,7 @@
         ]
        ],
        "range.html": [
-        "577611bb802552a04cb493139bc5f8e8deac912c",
+        "45f63c674a1a5c0afee3846523a7724e3f7fe120",
         [
          null,
          {}
@@ -506996,7 +507016,7 @@
      ]
     ],
     "pending_post_beacon-cors.tentative.https.window.js": [
-     "9545101f1362cb40a150d19c22a95818d19a8d95",
+     "7bdfc3be532531e65750382f7b53167f47766d7a",
      [
       "pending_beacon/pending_post_beacon-cors.tentative.https.window.html",
       {
@@ -526217,7 +526237,7 @@
       ]
      ],
      "animation-timeline-named-scroll-progress-timeline.tentative.html": [
-      "61e8522bf6cef020c31b51911184f45e660a69da",
+      "915aaa1b36b060e0d2fe30fa48705d46138009fd",
       [
        null,
        {}
@@ -526251,13 +526271,6 @@
        {}
       ]
      ],
-     "at-scroll-timeline-dynamic.tentative.html": [
-      "b646623acfd86232c5f63b4091bfc4e5f20c4770",
-      [
-       null,
-       {}
-      ]
-     ],
      "at-scroll-timeline-ignored.tentative.html": [
       "44d4155f74bbbef2f7408abde84918b78e5bdfdf",
       [
@@ -526363,6 +526376,13 @@
        {}
       ]
      ],
+     "scroll-timeline-dynamic.tentative.html": [
+      "7bf35cd04d834836935bd71f2846bcbaea376df4",
+      [
+       null,
+       {}
+      ]
+     ],
      "scroll-timeline-name-computed.tentative.html": [
       "1acb964ef7455ab30c4c627c24f12b9c186753d0",
       [
@@ -533089,6 +533109,15 @@
        }
       ]
      ],
+     "restriction-web-nfc.https.html": [
+      "8e0825537e3882cbe431933b3ea9ac79ce7da1e7",
+      [
+       null,
+       {
+        "timeout": "long"
+       }
+      ]
+     ],
      "restriction-web-usb.https.html": [
       "9d96a39c9c5528e3c0d41ba013343b6a4cbf0528",
       [
@@ -533719,7 +533748,7 @@
      ]
     ],
     "requestStorageAccess.sub.window.js": [
-     "23d190f76a135b17e03edd4fd8b6c9c198c577eb",
+     "432ae1a8087fb2da162ef646ba4dc9161ef2448b",
      [
       "storage-access-api/requestStorageAccess.sub.window.html",
       {
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-input-element/range.html b/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-input-element/range.html
index 577611b..45f63c67 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-input-element/range.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-input-element/range.html
@@ -222,8 +222,8 @@
       test(
         function() {
           var e = document.getElementById('should_skip_whitespace');
-          assert_equals(e.value, "123")
-        }, "Skip ASCII whitespace within input"
+          assert_equals(e.value, "50")
+        }, "Input should be reset to the default value when value attribute has whitespace"
       );
 
       test(
diff --git a/third_party/blink/web_tests/external/wpt/storage-access-api/helpers.js b/third_party/blink/web_tests/external/wpt/storage-access-api/helpers.js
index 9bc2451..4049ff7 100644
--- a/third_party/blink/web_tests/external/wpt/storage-access-api/helpers.js
+++ b/third_party/blink/web_tests/external/wpt/storage-access-api/helpers.js
@@ -34,6 +34,20 @@
     return result;
 }
 
+function RunRequestStorageAccessInDetachedFrame() {
+  let nestedFrame = document.createElement('iframe');
+  document.body.append(nestedFrame);
+  const inner_doc = nestedFrame.contentDocument;
+  nestedFrame.remove();
+  return inner_doc.requestStorageAccess();
+}
+
+function RunRequestStorageAccessViaDomParser() {
+  let parser = new DOMParser();
+  let doc = parser.parseFromString('<html></html>', 'text/html');
+  return doc.requestStorageAccess();
+}
+
 let g_clickID = 0;
 function ClickButtonWithGesture(onClickMethod) {
   // Append some formatting and information so non WebDriver instances can complete this test too.
diff --git a/third_party/blink/web_tests/external/wpt/storage-access-api/requestStorageAccess.sub.window.js b/third_party/blink/web_tests/external/wpt/storage-access-api/requestStorageAccess.sub.window.js
index 1366a1d..432ae1a 100644
--- a/third_party/blink/web_tests/external/wpt/storage-access-api/requestStorageAccess.sub.window.js
+++ b/third_party/blink/web_tests/external/wpt/storage-access-api/requestStorageAccess.sub.window.js
@@ -40,6 +40,22 @@
   // This specific test will run only as a top level test (not as a worker).
   // Specific requestStorageAccess() scenarios will be tested within the context
   // of various iFrames
+  promise_test(async t => {
+    let promise = RunRequestStorageAccessInDetachedFrame();
+    let description = "document.requestStorageAccess() call in a detached frame";
+    return promise.then(t.unreached_func("Should have rejected: " + description)).catch(function (e) {
+
+      assert_equals(e.name, 'SecurityError', description);
+    });
+  }, "[non-fully-active] document.requestStorageAccess() should not resolve when run in a detached frame");
+
+  promise_test(async t => {
+    let promise = RunRequestStorageAccessViaDomParser();
+    let description = "document.requestStorageAccess() in a detached DOMParser result";
+    return promise.then(t.unreached_func("Should have rejected: " + description)).catch(function (e) {
+      assert_equals(e.name, 'SecurityError', description);
+    });
+  }, "[non-fully-active] document.requestStorageAccess() should not resolve when run in a detached DOMParser document");
 
   // Create a test with a single-child same-origin iframe.
   let sameOriginFramePromise = RunTestsInIFrame(
@@ -57,7 +73,7 @@
   // Validate the nested-iframe scenario where the cross-origin frame
   // containing the tests is not the first child.
   let nestedCrossOriginFramePromise = RunTestsInNestedIFrame(
-      'http://{{domains[www]}}:{{ports[http][0]}}/storage-access-api/resources/requestStorageAccess-iframe.html?testCase=nested-cross-origin-frame&rootdocument=false')
+      'http://{{domains[www]}}:{{ports[http][0]}}/storage-access-api/resources/requestStorageAccess-iframe.html?testCase=nested-cross-origin-frame&rootdocument=false');
 
   // Because the iframe tests expect no user activation, and because they
   // load asynchronously, we want to first run those tests before simulating
diff --git a/third_party/blink/web_tests/fast/events/touch/touch-rect-crash-on-unpromote-layer.html b/third_party/blink/web_tests/fast/events/touch/touch-rect-crash-on-unpromote-layer.html
index 1ce7645..db45af2 100644
--- a/third_party/blink/web_tests/fast/events/touch/touch-rect-crash-on-unpromote-layer.html
+++ b/third_party/blink/web_tests/fast/events/touch/touch-rect-crash-on-unpromote-layer.html
@@ -1,7 +1,6 @@
 <!DOCTYPE HTML>
 <html>
 <head>
-<script src="../../../resources/js-test.js"></script>
 <style>
 #layer {
   position: relative;
@@ -23,7 +22,7 @@
 <script src="../../../resources/js-test.js"></script>
 <script src="../../../resources/run-after-layout-and-paint.js"></script>
 <script>
-  jsTestIsAsync = true;
+  window.jsTestIsAsync = true;
   description("Make sure we don't crash when a layer with a touch event handler becomes non-composited");
 
   var layer = document.getElementById('layer');
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/html/semantics/forms/the-input-element/range-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/html/semantics/forms/the-input-element/range-expected.txt
index 423f1cc..67c2ff1 100644
--- a/third_party/blink/web_tests/platform/generic/external/wpt/html/semantics/forms/the-input-element/range-expected.txt
+++ b/third_party/blink/web_tests/platform/generic/external/wpt/html/semantics/forms/the-input-element/range-expected.txt
@@ -21,7 +21,7 @@
 PASS Performing stepDown()
 PASS Performing stepUp() beyond the value of the max attribute
 PASS Performing stepDown() beyond the value of the min attribute
-FAIL Skip ASCII whitespace within input assert_equals: expected "123" but got "50"
+PASS Input should be reset to the default value when value attribute has whitespace
 PASS Multiply value by ten raised to the exponentth power with `e`
 PASS Multiply value by ten raised to the exponentth power with `E`
 Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/platform/generic/fast/forms/interactive-validation-attach-assertion-expected.txt b/third_party/blink/web_tests/platform/generic/fast/forms/interactive-validation-attach-assertion-expected.txt
index 64927ff..b7102ce 100644
--- a/third_party/blink/web_tests/platform/generic/fast/forms/interactive-validation-attach-assertion-expected.txt
+++ b/third_party/blink/web_tests/platform/generic/fast/forms/interactive-validation-attach-assertion-expected.txt
@@ -1,6 +1,6 @@
  
+PASS Not crashed.
 PASS successfullyParsed is true
 
 TEST COMPLETE
 
-PASS Not crashed.
diff --git a/third_party/blink/web_tests/platform/generic/virtual/fenced-frame-mparch/wpt_internal/fenced_frame/disallowed-navigations-dangling-markup.https-expected.txt b/third_party/blink/web_tests/platform/generic/virtual/fenced-frame-mparch/wpt_internal/fenced_frame/disallowed-navigations-dangling-markup.https-expected.txt
new file mode 100644
index 0000000..038eeb8
--- /dev/null
+++ b/third_party/blink/web_tests/platform/generic/virtual/fenced-frame-mparch/wpt_internal/fenced_frame/disallowed-navigations-dangling-markup.https-expected.txt
@@ -0,0 +1,27 @@
+This is a testharness.js-based test.
+PASS fenced frame mode=opaque-ads dangling-markup URL with 'blo
+ck<ed'
+PASS fenced frame mode=opaque-ads dangling-markup URL with 'blo\rck<ed'
+PASS fenced frame mode=opaque-ads dangling-markup URL with 'blo	ck<ed'
+PASS fenced frame mode=opaque-ads dangling-markup URL with 'blo<ck
+ed'
+PASS fenced frame mode=opaque-ads dangling-markup URL with 'blo<ck\red'
+PASS fenced frame mode=opaque-ads dangling-markup URL with 'blo<ck	ed'
+PASS fenced frame mode=default dangling-markup URL with 'blo
+ck<ed'
+PASS fenced frame mode=default dangling-markup URL with 'blo\rck<ed'
+PASS fenced frame mode=default dangling-markup URL with 'blo	ck<ed'
+PASS fenced frame mode=default dangling-markup URL with 'blo<ck
+ed'
+PASS fenced frame mode=default dangling-markup URL with 'blo<ck\red'
+PASS fenced frame mode=default dangling-markup URL with 'blo<ck	ed'
+FAIL fenced frame opaque URN => https: URL with dangling markup 'blo
+ck<ed' assert_equals: expected "NOT LOADED" but got "https://web-platform.test:8444/wpt_internal/fenced_frame/resources/report-url.html?blo<cked="
+FAIL fenced frame opaque URN => https: URL with dangling markup 'blo\rck<ed' assert_equals: expected "NOT LOADED" but got "https://web-platform.test:8444/wpt_internal/fenced_frame/resources/report-url.html?blo<cked="
+FAIL fenced frame opaque URN => https: URL with dangling markup 'blo	ck<ed' assert_equals: expected "NOT LOADED" but got "https://web-platform.test:8444/wpt_internal/fenced_frame/resources/report-url.html?blo<cked="
+FAIL fenced frame opaque URN => https: URL with dangling markup 'blo<ck
+ed' assert_equals: expected "NOT LOADED" but got "https://web-platform.test:8444/wpt_internal/fenced_frame/resources/report-url.html?blo<cked="
+FAIL fenced frame opaque URN => https: URL with dangling markup 'blo<ck\red' assert_equals: expected "NOT LOADED" but got "https://web-platform.test:8444/wpt_internal/fenced_frame/resources/report-url.html?blo<cked="
+FAIL fenced frame opaque URN => https: URL with dangling markup 'blo<ck	ed' assert_equals: expected "NOT LOADED" but got "https://web-platform.test:8444/wpt_internal/fenced_frame/resources/report-url.html?blo<cked="
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/generic/virtual/fenced-frame-shadow-dom/wpt_internal/fenced_frame/disallowed-navigations-dangling-markup.https-expected.txt b/third_party/blink/web_tests/platform/generic/virtual/fenced-frame-shadow-dom/wpt_internal/fenced_frame/disallowed-navigations-dangling-markup.https-expected.txt
new file mode 100644
index 0000000..c29e71a
--- /dev/null
+++ b/third_party/blink/web_tests/platform/generic/virtual/fenced-frame-shadow-dom/wpt_internal/fenced_frame/disallowed-navigations-dangling-markup.https-expected.txt
@@ -0,0 +1,28 @@
+This is a testharness.js-based test.
+Harness Error. harness_status.status = 1 , harness_status.message = ResizeObserver loop limit exceeded
+PASS fenced frame mode=opaque-ads dangling-markup URL with 'blo
+ck<ed'
+PASS fenced frame mode=opaque-ads dangling-markup URL with 'blo\rck<ed'
+PASS fenced frame mode=opaque-ads dangling-markup URL with 'blo	ck<ed'
+PASS fenced frame mode=opaque-ads dangling-markup URL with 'blo<ck
+ed'
+PASS fenced frame mode=opaque-ads dangling-markup URL with 'blo<ck\red'
+PASS fenced frame mode=opaque-ads dangling-markup URL with 'blo<ck	ed'
+PASS fenced frame mode=default dangling-markup URL with 'blo
+ck<ed'
+PASS fenced frame mode=default dangling-markup URL with 'blo\rck<ed'
+PASS fenced frame mode=default dangling-markup URL with 'blo	ck<ed'
+PASS fenced frame mode=default dangling-markup URL with 'blo<ck
+ed'
+PASS fenced frame mode=default dangling-markup URL with 'blo<ck\red'
+PASS fenced frame mode=default dangling-markup URL with 'blo<ck	ed'
+FAIL fenced frame opaque URN => https: URL with dangling markup 'blo
+ck<ed' assert_equals: expected "NOT LOADED" but got "https://web-platform.test:8444/wpt_internal/fenced_frame/resources/report-url.html?blo<cked="
+FAIL fenced frame opaque URN => https: URL with dangling markup 'blo\rck<ed' assert_equals: expected "NOT LOADED" but got "https://web-platform.test:8444/wpt_internal/fenced_frame/resources/report-url.html?blo<cked="
+FAIL fenced frame opaque URN => https: URL with dangling markup 'blo	ck<ed' assert_equals: expected "NOT LOADED" but got "https://web-platform.test:8444/wpt_internal/fenced_frame/resources/report-url.html?blo<cked="
+FAIL fenced frame opaque URN => https: URL with dangling markup 'blo<ck
+ed' assert_equals: expected "NOT LOADED" but got "https://web-platform.test:8444/wpt_internal/fenced_frame/resources/report-url.html?blo<cked="
+FAIL fenced frame opaque URN => https: URL with dangling markup 'blo<ck\red' assert_equals: expected "NOT LOADED" but got "https://web-platform.test:8444/wpt_internal/fenced_frame/resources/report-url.html?blo<cked="
+FAIL fenced frame opaque URN => https: URL with dangling markup 'blo<ck	ed' assert_equals: expected "NOT LOADED" but got "https://web-platform.test:8444/wpt_internal/fenced_frame/resources/report-url.html?blo<cked="
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/wpt_internal/css/css-anchor-position/anchor-name-002.html b/third_party/blink/web_tests/wpt_internal/css/css-anchor-position/anchor-name-002.html
index 9025769..58b25b1 100644
--- a/third_party/blink/web_tests/wpt_internal/css/css-anchor-position/anchor-name-002.html
+++ b/third_party/blink/web_tests/wpt_internal/css/css-anchor-position/anchor-name-002.html
@@ -8,6 +8,9 @@
 .relpos {
   position: relative;
 }
+.abspos {
+  position: absolute;
+}
 .anchor1 {
   anchor-name: --a1;
   width: 10px;
@@ -25,14 +28,19 @@
   <div class="relpos">
     <div>
       <div class="relpos">
-        <div class="relpos">
-          <div class="anchor1" style="position: absolute"></div>
-          <!-- This target should not find the anchor, because the anchor is
-            positioned. -->
-          <div class="target" data-expected-width=0></div>
+        <div class="abspos">
+          <div class="relpos">
+            <div class="anchor1" style="position: absolute"></div>
+            <!-- This target should not find the anchor, because the anchor is
+              positioned. -->
+            <div class="target" data-expected-width=0></div>
+          </div>
+          <!-- This target should find the anchor, because the last containing
+            block has `position: relative`. -->
+          <div class="target" data-expected-width=10></div>
         </div>
         <!-- This target should not find the anchor, because the last containing
-          block has `position: relative`. -->
+          block has `position: absolute`. -->
         <div class="target" data-expected-width=0></div>
       </div>
     </div>
diff --git a/third_party/blink/web_tests/wpt_internal/document-transition/content-with-transform-new-image.html b/third_party/blink/web_tests/wpt_internal/document-transition/content-with-transform-new-image.html
index 3540360..7297004 100644
--- a/third_party/blink/web_tests/wpt_internal/document-transition/content-with-transform-new-image.html
+++ b/third_party/blink/web_tests/wpt_internal/document-transition/content-with-transform-new-image.html
@@ -4,6 +4,7 @@
 <link rel="help" href="https://github.com/WICG/shared-element-transitions">
 <link rel="author" href="mailto:khushalsagar@chromium.org">
 <link rel="match" href="content-with-transform-ref.html">
+<meta name="fuzzy" content="content-with-transform-ref.html:0-1;0-500">
 
 <script src="/common/reftest-wait.js"></script>
 <style>
diff --git a/third_party/blink/web_tests/wpt_internal/document-transition/content-with-transform-old-image.html b/third_party/blink/web_tests/wpt_internal/document-transition/content-with-transform-old-image.html
index c0b9bef..786787c 100644
--- a/third_party/blink/web_tests/wpt_internal/document-transition/content-with-transform-old-image.html
+++ b/third_party/blink/web_tests/wpt_internal/document-transition/content-with-transform-old-image.html
@@ -4,6 +4,7 @@
 <link rel="help" href="https://github.com/WICG/shared-element-transitions">
 <link rel="author" href="mailto:khushalsagar@chromium.org">
 <link rel="match" href="content-with-transform-ref.html">
+<meta name="fuzzy" content="content-with-transform-ref.html:0-1;0-400">
 
 <script src="/common/reftest-wait.js"></script>
 <style>
diff --git a/third_party/blink/web_tests/wpt_internal/document-transition/css-tags-paint-order-with-entry.html b/third_party/blink/web_tests/wpt_internal/document-transition/css-tags-paint-order-with-entry.html
index 2fb54f7..052e45bb0 100644
--- a/third_party/blink/web_tests/wpt_internal/document-transition/css-tags-paint-order-with-entry.html
+++ b/third_party/blink/web_tests/wpt_internal/document-transition/css-tags-paint-order-with-entry.html
@@ -4,6 +4,7 @@
 <link rel="help" href="https://github.com/WICG/shared-element-transitions">
 <link rel="author" href="mailto:vmpstr@chromium.org">
 <link rel="match" href="css-tags-paint-order-with-entry-ref.html">
+<meta name="fuzzy" content="css-tags-paint-order-with-entry-ref.html:0-120;0-300">
 
 <script src="/common/reftest-wait.js"></script>
 <style>
diff --git a/third_party/blink/web_tests/wpt_internal/document-transition/new-and-old-sizes-match.html b/third_party/blink/web_tests/wpt_internal/document-transition/new-and-old-sizes-match.html
index 92efd3ec..f27fc4f 100644
--- a/third_party/blink/web_tests/wpt_internal/document-transition/new-and-old-sizes-match.html
+++ b/third_party/blink/web_tests/wpt_internal/document-transition/new-and-old-sizes-match.html
@@ -4,6 +4,7 @@
 <link rel="help" href="https://github.com/WICG/shared-element-transitions">
 <link rel="author" href="mailto:vmpstr@chromium.org">
 <link rel="match" href="new-and-old-sizes-match-ref.html">
+<meta name="fuzzy" content="new-and-old-sizes-match-ref.html:0-1;0-300">
 <script src="/common/reftest-wait.js"></script>
 <style>
 .box {
diff --git a/third_party/blink/web_tests/wpt_internal/document-transition/new-content-captures-clip-path.html b/third_party/blink/web_tests/wpt_internal/document-transition/new-content-captures-clip-path.html
index 46226b0..15c3512 100644
--- a/third_party/blink/web_tests/wpt_internal/document-transition/new-content-captures-clip-path.html
+++ b/third_party/blink/web_tests/wpt_internal/document-transition/new-content-captures-clip-path.html
@@ -4,6 +4,7 @@
 <link rel="help" href="https://github.com/WICG/shared-element-transitions">
 <link rel="author" href="mailto:vmpstr@chromium.org">
 <link rel="match" href="new-content-captures-clip-path-ref.html">
+<meta name="fuzzy" content="new-content-captures-clip-path-ref.html:0-1;0-500">
 <script src="/common/reftest-wait.js"></script>
 <style>
 .box {
diff --git a/third_party/blink/web_tests/wpt_internal/document-transition/new-content-captures-different-size.html b/third_party/blink/web_tests/wpt_internal/document-transition/new-content-captures-different-size.html
index 6e48c65..cdec862 100644
--- a/third_party/blink/web_tests/wpt_internal/document-transition/new-content-captures-different-size.html
+++ b/third_party/blink/web_tests/wpt_internal/document-transition/new-content-captures-different-size.html
@@ -4,6 +4,7 @@
 <link rel="help" href="https://github.com/WICG/shared-element-transitions">
 <link rel="author" href="mailto:vmpstr@chromium.org">
 <link rel="match" href="new-content-captures-different-size-ref.html">
+<meta name=fuzzy content="new-content-captures-different-size-ref.html:0-40;0-30000">
 <script src="/common/reftest-wait.js"></script>
 <style>
 .box {
diff --git a/third_party/blink/web_tests/wpt_internal/document-transition/new-content-object-fit-fill.html b/third_party/blink/web_tests/wpt_internal/document-transition/new-content-object-fit-fill.html
index 34cfe59..3b8cf404 100644
--- a/third_party/blink/web_tests/wpt_internal/document-transition/new-content-object-fit-fill.html
+++ b/third_party/blink/web_tests/wpt_internal/document-transition/new-content-object-fit-fill.html
@@ -4,6 +4,7 @@
 <link rel="help" href="https://github.com/WICG/shared-element-transitions">
 <link rel="author" href="mailto:vmpstr@chromium.org">
 <link rel="match" href="content-object-fit-fill-ref.html">
+<meta name="fuzzy" content="content-object-fit-fill-ref.html:0-60;0-20">
 <script src="/common/reftest-wait.js"></script>
 <style>
 #target {
diff --git a/third_party/blink/web_tests/wpt_internal/document-transition/new-content-scaling.html b/third_party/blink/web_tests/wpt_internal/document-transition/new-content-scaling.html
index d929f944..00817dde 100644
--- a/third_party/blink/web_tests/wpt_internal/document-transition/new-content-scaling.html
+++ b/third_party/blink/web_tests/wpt_internal/document-transition/new-content-scaling.html
@@ -4,6 +4,7 @@
 <link rel="help" href="https://github.com/WICG/shared-element-transitions">
 <link rel="author" href="mailto:vmpstr@chromium.org">
 <link rel="match" href="new-content-scaling-ref.html">
+<meta name="fuzzy" content="new-content-scaling-ref.html:0-1;0-200">
 <script src="/common/reftest-wait.js"></script>
 <style>
 .shared {
diff --git a/third_party/blink/web_tests/wpt_internal/document-transition/object-view-box-old-image.html b/third_party/blink/web_tests/wpt_internal/document-transition/object-view-box-old-image.html
index 0666714..8c31e96a 100644
--- a/third_party/blink/web_tests/wpt_internal/document-transition/object-view-box-old-image.html
+++ b/third_party/blink/web_tests/wpt_internal/document-transition/object-view-box-old-image.html
@@ -4,6 +4,7 @@
 <link rel="help" href="https://github.com/WICG/shared-element-transitions">
 <link rel="author" href="mailto:khushalsagar@chromium.org">
 <link rel="match" href="object-view-box-ref.html">
+<meta name="fuzzy" content="object-view-box-ref.html:0-1;0-300">
 
 <script src="/common/reftest-wait.js"></script>
 <style>
diff --git a/third_party/blink/web_tests/wpt_internal/document-transition/old-content-captures-different-size-ref.html b/third_party/blink/web_tests/wpt_internal/document-transition/old-content-captures-different-size-ref.html
index b42952d1..11178f4 100644
--- a/third_party/blink/web_tests/wpt_internal/document-transition/old-content-captures-different-size-ref.html
+++ b/third_party/blink/web_tests/wpt_internal/document-transition/old-content-captures-different-size-ref.html
@@ -23,7 +23,7 @@
   left: 20px;
 }
 #e3 {
-  clip-path: blur(5px);
+  filter: blur(5px);
   top: 300px;
   left: 20px;
 }
diff --git a/third_party/blink/web_tests/wpt_internal/document-transition/old-content-captures-different-size.html b/third_party/blink/web_tests/wpt_internal/document-transition/old-content-captures-different-size.html
index 30d835e..5d95fac1 100644
--- a/third_party/blink/web_tests/wpt_internal/document-transition/old-content-captures-different-size.html
+++ b/third_party/blink/web_tests/wpt_internal/document-transition/old-content-captures-different-size.html
@@ -4,6 +4,7 @@
 <link rel="help" href="https://github.com/WICG/shared-element-transitions">
 <link rel="author" href="mailto:vmpstr@chromium.org">
 <link rel="match" href="old-content-captures-different-size-ref.html">
+<meta name=fuzzy content="old-content-captures-different-size-ref.html:0-40;0-30000">
 <script src="/common/reftest-wait.js"></script>
 <style>
 .box {
diff --git a/third_party/blink/web_tests/wpt_internal/document-transition/old-content-captures-opacity.html b/third_party/blink/web_tests/wpt_internal/document-transition/old-content-captures-opacity.html
index 204af0f..91a93d3 100644
--- a/third_party/blink/web_tests/wpt_internal/document-transition/old-content-captures-opacity.html
+++ b/third_party/blink/web_tests/wpt_internal/document-transition/old-content-captures-opacity.html
@@ -4,7 +4,7 @@
 <link rel="help" href="https://github.com/WICG/shared-element-transitions">
 <link rel="author" href="mailto:vmpstr@chromium.org">
 <link rel="match" href="old-content-captures-opacity-ref.html">
-<meta name=fuzzy content="maxDifference=10;totalPixels=30000">
+<meta name=fuzzy content="old-content-captures-opacity-ref.html:0-1;0-50000">
 
 <script src="/common/reftest-wait.js"></script>
 <style>
diff --git a/third_party/blink/web_tests/wpt_internal/document-transition/old-content-captures-root.html b/third_party/blink/web_tests/wpt_internal/document-transition/old-content-captures-root.html
index 7b44c8b..39bb9e0 100644
--- a/third_party/blink/web_tests/wpt_internal/document-transition/old-content-captures-root.html
+++ b/third_party/blink/web_tests/wpt_internal/document-transition/old-content-captures-root.html
@@ -4,6 +4,7 @@
 <link rel="help" href="https://github.com/WICG/shared-element-transitions">
 <link rel="author" href="mailto:vmpstr@chromium.org">
 <link rel="match" href="old-content-captures-root-ref.html">
+<meta name="fuzzy" content="old-content-captures-root-ref.html:0-1;0-500">
 <script src="/common/reftest-wait.js"></script>
 <style>
 .box {
diff --git a/third_party/blink/web_tests/wpt_internal/document-transition/old-content-object-fit-fill.html b/third_party/blink/web_tests/wpt_internal/document-transition/old-content-object-fit-fill.html
index cb7e96a..456e7e14 100644
--- a/third_party/blink/web_tests/wpt_internal/document-transition/old-content-object-fit-fill.html
+++ b/third_party/blink/web_tests/wpt_internal/document-transition/old-content-object-fit-fill.html
@@ -4,6 +4,7 @@
 <link rel="help" href="https://github.com/WICG/shared-element-transitions">
 <link rel="author" href="mailto:vmpstr@chromium.org">
 <link rel="match" href="content-object-fit-fill-ref.html">
+<meta name="fuzzy" content="content-object-fit-fill-ref.html:0-60;0-20">
 <script src="/common/reftest-wait.js"></script>
 <style>
 #target {
diff --git a/third_party/blink/web_tests/wpt_internal/document-transition/old-content-object-view-box-clip-path-reference.html b/third_party/blink/web_tests/wpt_internal/document-transition/old-content-object-view-box-clip-path-reference.html
index 205b4a80..f3b63e5 100644
--- a/third_party/blink/web_tests/wpt_internal/document-transition/old-content-object-view-box-clip-path-reference.html
+++ b/third_party/blink/web_tests/wpt_internal/document-transition/old-content-object-view-box-clip-path-reference.html
@@ -4,6 +4,7 @@
 <link rel="help" href="https://github.com/WICG/shared-element-transitions">
 <link rel="author" href="mailto:vmpstr@chromium.org">
 <link rel="match" href="old-content-object-view-box-clip-path-reference-ref.html">
+<meta name="fuzzy" content="old-content-object-view-box-clip-path-reference-ref.html:0-1;0-100">
 <script src="/common/reftest-wait.js"></script>
 <style>
 .target {
diff --git a/third_party/blink/web_tests/wpt_internal/document-transition/old-content-object-view-box-clip-path.html b/third_party/blink/web_tests/wpt_internal/document-transition/old-content-object-view-box-clip-path.html
index 2ce154ef2..a7eb499d 100644
--- a/third_party/blink/web_tests/wpt_internal/document-transition/old-content-object-view-box-clip-path.html
+++ b/third_party/blink/web_tests/wpt_internal/document-transition/old-content-object-view-box-clip-path.html
@@ -4,6 +4,7 @@
 <link rel="help" href="https://github.com/WICG/shared-element-transitions">
 <link rel="author" href="mailto:vmpstr@chromium.org">
 <link rel="match" href="old-content-object-view-box-clip-path-ref.html">
+<meta name="fuzzy" content="old-content-object-view-box-clip-path-ref.html:0-1;0-30">
 <script src="/common/reftest-wait.js"></script>
 <style>
 .target {
diff --git a/third_party/blink/web_tests/wpt_internal/document-transition/root-captured-as-different-tag.html b/third_party/blink/web_tests/wpt_internal/document-transition/root-captured-as-different-tag.html
index a8e7099c..f4b7d73b 100644
--- a/third_party/blink/web_tests/wpt_internal/document-transition/root-captured-as-different-tag.html
+++ b/third_party/blink/web_tests/wpt_internal/document-transition/root-captured-as-different-tag.html
@@ -4,6 +4,7 @@
 <link rel="help" href="https://github.com/WICG/shared-element-transitions">
 <link rel="author" href="mailto:vmpstr@chromium.org">
 <link rel="match" href="old-content-captures-root-ref.html">
+<meta name="fuzzy" content="old-content-captures-root-ref.html:0-1;0-500">
 <script src="/common/reftest-wait.js"></script>
 <style>
 :root { page-transition-tag: another-root; }
diff --git a/third_party/blink/web_tests/wpt_internal/document-transition/web-animations-api.html b/third_party/blink/web_tests/wpt_internal/document-transition/web-animations-api.html
index 7015f70..93f66efd 100644
--- a/third_party/blink/web_tests/wpt_internal/document-transition/web-animations-api.html
+++ b/third_party/blink/web_tests/wpt_internal/document-transition/web-animations-api.html
@@ -4,6 +4,7 @@
 <link rel="help" href="https://github.com/WICG/shared-element-transitions">
 <link rel="author" href="mailto:khushalsagar@chromium.org">
 <link rel="match" href="web-animations-api-ref.html">
+<meta name="fuzzy" content="web-animations-api-ref.html:0-2;0-500">
 
 <script src="/common/reftest-wait.js"></script>
 <style>
diff --git a/third_party/blink/web_tests/wpt_internal/fenced_frame/disallowed-navigations-dangling-markup.https.html b/third_party/blink/web_tests/wpt_internal/fenced_frame/disallowed-navigations-dangling-markup.https.html
new file mode 100644
index 0000000..6eecc92c
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/fenced_frame/disallowed-navigations-dangling-markup.https.html
@@ -0,0 +1,80 @@
+<!DOCTYPE html>
+<title>Fenced frame disallowed navigations with potentially-dangling markup</title>
+<meta name="timeout" content="long">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/dispatcher/dispatcher.js"></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="/common/utils.js"></script>
+<script src="resources/utils.js"></script>
+<script src="/fetch/private-network-access/resources/support.sub.js"></script>
+
+<body>
+
+<script>
+// These are used in tests that rely on URLs containing dangling markup. See
+// https://github.com/whatwg/fetch/pull/519.
+const kDanglingMarkupSubstrings = [
+  "blo\nck<ed",
+  "blo\rck<ed",
+  "blo\tck<ed",
+  "blo<ck\ned",
+  "blo<ck\red",
+  "blo<ck\ted",
+];
+
+function getTimeoutPromise(t) {
+  return new Promise(resolve =>
+      t.step_timeout(() => resolve("NOT LOADED"), 1500));
+}
+
+// The following tests ensure that an embedder cannot navigate a fenced frame
+// (with different modes) to https URLs with dangling markup
+for (const mode of ['opaque-ads', 'default']) {
+  // These tests assert that fenced frames cannot be navigated to HTTPs URLs
+  // with dangling markup.
+  for (substring of kDanglingMarkupSubstrings) {
+    promise_test(async t => {
+      const key = token();
+      let url_string = generateURL("resources/embeddee.html?blocked", [key]).toString();
+      url_string = url_string.replace("blocked", substring);
+      const fencedframe = attachFencedFrame(url_string, /*mode=*/mode);
+      const loaded_promise = nextValueFromServer(key);
+      const result = await Promise.any([loaded_promise, getTimeoutPromise(t)]);
+      assert_equals(result, "NOT LOADED");
+    }, `fenced frame mode=${mode} dangling-markup URL with '${substring}'`);
+  }
+} // end for.
+
+// These tests assert that fenced frames cannot be navigated to a urn:uuid URL
+// that represents an HTTPS URLs with dangling markup.
+for (substring of kDanglingMarkupSubstrings) {
+  promise_test(async t => {
+    const key = token();
+
+    // Copied from from `generateURN()`, since we have to modify the final URL
+    // that goes into `selectURL`.
+    try {
+      await sharedStorage.worklet.addModule(
+        "/wpt_internal/shared_storage/resources/simple-module.js");
+    } catch (e) {
+      // See documentation in `generateURN()`.
+    }
+
+    let url_string = generateURL("resources/report-url.html?blocked", [key]).toString();
+    url_string = url_string.replace("blocked", substring);
+
+    const urn = await sharedStorage.selectURL(
+      "test-url-selection-operation", [{url: url_string}], {data: {'mockResult': 0}}
+    );
+
+    const fencedframe = attachFencedFrame(urn, /*mode=*/'opaque-ads');
+    const loaded_promise = nextValueFromServer(key);
+    const result = await Promise.any([loaded_promise, getTimeoutPromise(t)]);
+    assert_equals(result, "NOT LOADED");
+  }, `fenced frame opaque URN => https: URL with dangling markup '${substring}'`);
+}
+
+</script>
+
+</body>
diff --git a/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/report-url.html b/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/report-url.html
new file mode 100644
index 0000000..e0b7d09
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/report-url.html
@@ -0,0 +1,7 @@
+<!DOCTYPE html>
+<script src="utils.js"></script>
+<title>A page embedded as a fenced frame that reports the document URL</title>
+<script>
+const [uuid] = parseKeylist();
+writeValueToServer(uuid, location.href);
+</script>
diff --git a/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/report-url.html.headers b/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/report-url.html.headers
new file mode 100644
index 0000000..6247f6d
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/report-url.html.headers
@@ -0,0 +1 @@
+Supports-Loading-Mode: fenced-frame
\ No newline at end of file
diff --git a/third_party/closure_compiler/interfaces/networking_private_interface.js b/third_party/closure_compiler/interfaces/networking_private_interface.js
index 3b243b3..c67276a 100644
--- a/third_party/closure_compiler/interfaces/networking_private_interface.js
+++ b/third_party/closure_compiler/interfaces/networking_private_interface.js
@@ -7,8 +7,6 @@
 
 /** @fileoverview Interface for networkingPrivate that can be overriden. */
 
-assertNotReached('Interface file for Closure Compiler should not be executed.');
-
 /** @interface */
 function NetworkingPrivate() {}
 
@@ -21,7 +19,7 @@
    *     callback Called with the network properties when received.
    * @see https://developer.chrome.com/extensions/networkingPrivate#method-getProperties
    */
-  getProperties: assertNotReached,
+  getProperties: function(networkGuid, callback) {},
 
   /**
    * Gets the merged properties of the network with id networkGuid from the
@@ -32,7 +30,7 @@
    *     callback Called with the managed network properties when received.
    * @see https://developer.chrome.com/extensions/networkingPrivate#method-getManagedProperties
    */
-  getManagedProperties: assertNotReached,
+  getManagedProperties: function(networkGuid, callback) {},
 
   /**
    * Gets the cached read-only properties of the network with id networkGuid.
@@ -48,7 +46,7 @@
    *     callback Called immediately with the network state properties.
    * @see https://developer.chrome.com/extensions/networkingPrivate#method-getState
    */
-  getState: assertNotReached,
+  getState: function(networkGuid, callback) {},
 
   /**
    * Sets the properties of the network with id networkGuid.
@@ -58,7 +56,7 @@
    * @param {function():void=} callback Called when the operation has completed.
    * @see https://developer.chrome.com/extensions/networkingPrivate#method-setProperties
    */
-  setProperties: assertNotReached,
+  setProperties: function(networkGuid, properties, callback) {},
 
   /**
    * Creates a new network configuration from properties. If a matching
@@ -72,7 +70,7 @@
    *     network configuration once     the network has been created.
    * @see https://developer.chrome.com/extensions/networkingPrivate#method-createNetwork
    */
-  createNetwork: assertNotReached,
+  createNetwork: function(shared, properties, callback) {},
 
   /**
    * Forgets a network configuration by clearing any configured properties for
@@ -84,7 +82,7 @@
    * @param {function():void=} callback Called when the operation has completed.
    * @see https://developer.chrome.com/extensions/networkingPrivate#method-forgetNetwork
    */
-  forgetNetwork: assertNotReached,
+  forgetNetwork: function(networkGuid, callback) {},
 
   /**
    * Returns a list of network objects with the same properties provided by
@@ -99,7 +97,7 @@
    *     properties when received.
    * @see https://developer.chrome.com/extensions/networkingPrivate#method-getNetworks
    */
-  getNetworks: assertNotReached,
+  getNetworks: function(filter, callback) {},
 
   /**
    * Returns a list of $(ref:networkingPrivate.DeviceStateProperties) objects.
@@ -107,7 +105,7 @@
    *     callback Called with a list of devices and their state.
    * @see https://developer.chrome.com/extensions/networkingPrivate#method-getDeviceStates
    */
-  getDeviceStates: assertNotReached,
+  getDeviceStates: function(callback) {},
 
   /**
    * Enables any devices matching the specified network type. Note, the type
@@ -116,7 +114,7 @@
    *     network to enable.
    * @see https://developer.chrome.com/extensions/networkingPrivate#method-enableNetworkType
    */
-  enableNetworkType: assertNotReached,
+  enableNetworkType: function(networkType) {},
 
   /**
    * Disables any devices matching the specified network type. See note for
@@ -125,7 +123,7 @@
    *     network to disable.
    * @see https://developer.chrome.com/extensions/networkingPrivate#method-disableNetworkType
    */
-  disableNetworkType: assertNotReached,
+  disableNetworkType: function(networkType) {},
 
   /**
    * Requests that the networking subsystem scan for new networks and update the
@@ -137,7 +135,7 @@
    *     scan will be requested if supported.
    * @see https://developer.chrome.com/extensions/networkingPrivate#method-requestNetworkScan
    */
-  requestNetworkScan: assertNotReached,
+  requestNetworkScan: function(networkType) {},
 
   /**
    * Starts a connection to the network with networkGuid.
@@ -148,7 +146,7 @@
    *     changes.
    * @see https://developer.chrome.com/extensions/networkingPrivate#method-startConnect
    */
-  startConnect: assertNotReached,
+  startConnect: function(networkGuid, callback) {},
 
   /**
    * Starts a disconnect from the network with networkGuid.
@@ -157,7 +155,7 @@
    *     been sent. See note     for $(ref:startConnect).
    * @see https://developer.chrome.com/extensions/networkingPrivate#method-startDisconnect
    */
-  startDisconnect: assertNotReached,
+  startDisconnect: function(networkGuid, callback) {},
 
   /**
    * Starts activation of the Cellular network with networkGuid. If called for a
@@ -170,7 +168,7 @@
    *     been sent. See note     for $(ref:startConnect).
    * @see https://developer.chrome.com/extensions/networkingPrivate#method-startActivate
    */
-  startActivate: assertNotReached,
+  startActivate: function(networkGuid, carrier, callback) {},
 
   /**
    * Returns captive portal status for the network matching 'networkGuid'.
@@ -181,7 +179,7 @@
    *     network captive portal status.
    * @see https://developer.chrome.com/extensions/networkingPrivate#method-getCaptivePortalStatus
    */
-  getCaptivePortalStatus: assertNotReached,
+  getCaptivePortalStatus: function(networkGuid, callback) {},
 
   /**
    * Unlocks a Cellular SIM card. * If the SIM is PIN locked, |pin| will be used
@@ -197,7 +195,7 @@
    * @param {function():void=} callback Called when the operation has completed.
    * @see https://developer.chrome.com/extensions/networkingPrivate#method-unlockCellularSim
    */
-  unlockCellularSim: assertNotReached,
+  unlockCellularSim: function(networkGuid, pin, puk, callback) {},
 
   /**
    * Sets whether or not SIM locking is enabled (i.e a PIN will be required when
@@ -214,7 +212,7 @@
    * @param {function():void=} callback Called when the operation has completed.
    * @see https://developer.chrome.com/extensions/networkingPrivate#method-setCellularSimState
    */
-  setCellularSimState: assertNotReached,
+  setCellularSimState: function(networkGuid, simState, callback) {},
 
   /**
    * Selects which Cellular Mobile Network to use. |networkId| must be the
@@ -226,7 +224,7 @@
    * @param {function():void=} callback Called when the operation has completed.
    * @see https://developer.chrome.com/extensions/networkingPrivate#method-selectCellularMobileNetwork
    */
-  selectCellularMobileNetwork: assertNotReached,
+  selectCellularMobileNetwork: function(networkGuid, networkId, callback) {},
 
   /**
    * Gets the global policy properties. These properties are not expected to
@@ -234,14 +232,14 @@
    * @param {function(!chrome.networkingPrivate.GlobalPolicy):void} callback
    * @see https://developer.chrome.com/extensions/networkingPrivate#method-getGlobalPolicy
    */
-  getGlobalPolicy: assertNotReached,
+  getGlobalPolicy: function(callback) {},
 
   /**
    * Gets the lists of certificates available for network configuration.
    * @param {function(!chrome.networkingPrivate.CertificateLists):void} callback
    * @see https://developer.chrome.com/extensions/networkingPrivate#method-getCertificateLists
    */
-  getCertificateLists: assertNotReached,
+  getCertificateLists: function(callback) {},
 };
 
 /**
diff --git a/third_party/libvpx/BUILD.gn b/third_party/libvpx/BUILD.gn
index 3125138d9..71352275 100644
--- a/third_party/libvpx/BUILD.gn
+++ b/third_party/libvpx/BUILD.gn
@@ -401,6 +401,9 @@
     }
   } else if (current_cpu == "ppc64") {
     sources = libvpx_srcs_ppc64
+  } else if (current_cpu == "riscv64") {
+    sources = libvpx_srcs_generic
+    public_deps = [ ":libvpx_generic_headers" ]
   }
 
   configs -= [ "//build/config/compiler:chromium_code" ]
diff --git a/third_party/metrics_proto/BUILD.gn b/third_party/metrics_proto/BUILD.gn
index d038d7a..da5c089 100644
--- a/third_party/metrics_proto/BUILD.gn
+++ b/third_party/metrics_proto/BUILD.gn
@@ -21,6 +21,7 @@
   "histogram_event.proto",
   "memory_leak_report.proto",
   "omnibox_event.proto",
+  "omnibox_focus_type.proto",
   "omnibox_input_type.proto",
   "perf_data.proto",
   "perf_stat.proto",
diff --git a/third_party/metrics_proto/README.chromium b/third_party/metrics_proto/README.chromium
index 8e87fd7..74ddf82ec 100644
--- a/third_party/metrics_proto/README.chromium
+++ b/third_party/metrics_proto/README.chromium
@@ -1,8 +1,8 @@
 Name: Metrics Protos
 Short Name: metrics_proto
 URL: This is the canonical public repository
-Version: 468932399
-Date: 2022/08/20 UTC
+Version: 469513741
+Date: 2022/08/23 UTC
 License: BSD
 Security Critical: Yes
 
diff --git a/third_party/metrics_proto/omnibox_focus_type.proto b/third_party/metrics_proto/omnibox_focus_type.proto
new file mode 100644
index 0000000..3fea37a
--- /dev/null
+++ b/third_party/metrics_proto/omnibox_focus_type.proto
@@ -0,0 +1,43 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+syntax = "proto2";
+
+option optimize_for = LITE_RUNTIME;
+option java_package = "org.chromium.components.metrics";
+
+option java_outer_classname = "OmniboxFocusTypeProtos";
+
+package metrics;
+
+// For search requests, this enum specifies how the user last interacted with
+// the UI control. This is used for both the omnibox and NTP realbox.
+//
+// It is somewhat of a misnomer to call it OmniboxFocusType, since the enum now
+// covers UI interactions unrelated to focus. But we are keeping the old name to
+// match the "oft" CGI param.
+//
+// These values are used as HTTP CGI parameter values. Entries should not be
+// renumbered and numeric values should never be reused.
+enum OmniboxFocusType {
+  // The default value. This is used for any search requests without any
+  // special interaction annotation, including: normal omnibox searches,
+  // as-you-type omnibox suggestions, as well as non-omnibox searches.
+  INTERACTION_DEFAULT = 0;
+
+  // This search request is triggered by the user focusing the omnibox.
+  INTERACTION_FOCUS = 1;
+
+  // This search request is triggered by the user deleting all of the
+  // omnibox permanent text at once, i.e. user is on "https://example.com",
+  // does Ctrl+L which selects the whole URL, then presses Backspace.
+  //
+  // Note that INTERACTION_CLOBBER applies in fairly limited circumstances. For
+  // example, the following cases do NOT qualify and are instead marked as
+  // INTERACTION_DEFAULT:
+  //  - User deletes their own typed text.
+  //  - User deletes the permanent text one character at a time.
+  //  - User uses Cut (Ctrl+X) to delete the permanent text.
+  INTERACTION_CLOBBER = 2;
+}
diff --git a/third_party/nearby/README.chromium b/third_party/nearby/README.chromium
index a75e67d..239c15b 100644
--- a/third_party/nearby/README.chromium
+++ b/third_party/nearby/README.chromium
@@ -1,7 +1,7 @@
 Name: Nearby Connections Library
 Short Name: Nearby
 URL: https://github.com/google/nearby
-Version: 01a4daffd286651c408572e0096448d83f1e51f6
+Version: 6b692c120dcdf34b44d82dc58397ad0f42db1b96
 License: Apache 2.0
 License File: LICENSE
 Security Critical: yes
diff --git a/third_party/omnibox_proto/README.chromium b/third_party/omnibox_proto/README.chromium
index 5f89428..da38060 100644
--- a/third_party/omnibox_proto/README.chromium
+++ b/third_party/omnibox_proto/README.chromium
@@ -1,8 +1,8 @@
 Name: Omnibox Protos
 Short Name: omnibox_proto
 URL: This is the canonical public repository
-Version: 467792133
-Date: 2022/08/15 UTC
+Version: 469618914
+Date: 2022/08/24 UTC
 License: BSD
 Security Critical: Yes
 
diff --git a/third_party/omnibox_proto/group_config_info.proto b/third_party/omnibox_proto/group_config_info.proto
index a91b209..14d53538 100644
--- a/third_party/omnibox_proto/group_config_info.proto
+++ b/third_party/omnibox_proto/group_config_info.proto
@@ -8,7 +8,7 @@
 option java_package = 'org.chromium.components.omnibox';
 option java_outer_classname = 'GroupConfigInfoProto';
 
-package omnibox_proto;
+package omnibox;
 
 // Suggestion group configurations supported by the Chrome Omnibox.
 message GroupConfigInfo {
diff --git a/third_party/protobuf/README.chromium b/third_party/protobuf/README.chromium
index e42357a..2fcb30e 100644
--- a/third_party/protobuf/README.chromium
+++ b/third_party/protobuf/README.chromium
@@ -132,3 +132,10 @@
 
   Imports https://critique.corp.google.com/cl/466986872.
 
+- 0034-change-macro-to-avoid-pedantic-warning.patch
+
+  Avoid hitting -Wextra-semi.
+
+  Imports (rebased):
+  https://github.com/protocolbuffers/protobuf/commit/def602dd07b7eae1cac6823705975317b5607fc3
+
diff --git a/third_party/protobuf/patches/0034-change-macro-to-avoid-pedantic-warning.patch b/third_party/protobuf/patches/0034-change-macro-to-avoid-pedantic-warning.patch
new file mode 100644
index 0000000..35532715
--- /dev/null
+++ b/third_party/protobuf/patches/0034-change-macro-to-avoid-pedantic-warning.patch
@@ -0,0 +1,25 @@
+From def602dd07b7eae1cac6823705975317b5607fc3 Mon Sep 17 00:00:00 2001
+From: Marjolein Heyndrickx <marjoleinheyndrickx@gmail.com>
+Date: Fri, 12 Aug 2022 11:22:09 +0200
+Subject: [PATCH] change macro to avoid pedantic warning
+
+---
+ src/google/protobuf/descriptor.h | 18 +++++++++---------
+ 1 file changed, 9 insertions(+), 9 deletions(-)
+
+diff --git a/third_party/protobuf/src/google/protobuf/descriptor.h b/third_party/protobuf/src/google/protobuf/descriptor.h
+index 699afd968..653f73443 100644
+--- a/third_party/protobuf/src/google/protobuf/descriptor.h
++++ b/third_party/protobuf/src/google/protobuf/descriptor.h
+@@ -199,7 +199,7 @@ namespace internal {
+ //
+ 
+ #if !defined(PROTOBUF_INTERNAL_CHECK_CLASS_SIZE)
+-#define PROTOBUF_INTERNAL_CHECK_CLASS_SIZE(t, expected)
++#define PROTOBUF_INTERNAL_CHECK_CLASS_SIZE(t, expected) static_assert(true, "")
+ #endif
+ 
+ class FlatAllocator;
+-- 
+2.37.1.595.g718a3a8f04-goog
+
diff --git a/third_party/protobuf/src/google/protobuf/descriptor.h b/third_party/protobuf/src/google/protobuf/descriptor.h
index 1b8728e..62fbfd4 100644
--- a/third_party/protobuf/src/google/protobuf/descriptor.h
+++ b/third_party/protobuf/src/google/protobuf/descriptor.h
@@ -195,7 +195,7 @@
 //
 
 #if !defined(PROTOBUF_INTERNAL_CHECK_CLASS_SIZE)
-#define PROTOBUF_INTERNAL_CHECK_CLASS_SIZE(t, expected)
+#define PROTOBUF_INTERNAL_CHECK_CLASS_SIZE(t, expected) static_assert(true, "")
 #endif
 
 class FlatAllocator;
diff --git a/tools/clang/scripts/package.py b/tools/clang/scripts/package.py
index 61d3b06..380d14c 100755
--- a/tools/clang/scripts/package.py
+++ b/tools/clang/scripts/package.py
@@ -595,6 +595,15 @@
   PackageInArchive(clang_tidy_dir, clang_tidy_dir)
   MaybeUpload(args.upload, clang_tidy_dir + '.t*z', gcs_platform)
 
+  # Zip up clangd for users who opt into it.
+  clangd_dir = 'clangd-' + stamp
+  shutil.rmtree(clangd_dir, ignore_errors=True)
+  os.makedirs(os.path.join(clangd_dir, 'bin'))
+  shutil.copy(os.path.join(LLVM_RELEASE_DIR, 'bin', 'clangd' + exe_ext),
+              os.path.join(clangd_dir, 'bin'))
+  PackageInArchive(clangd_dir, clangd_dir)
+  MaybeUpload(args.upload, clangd_dir + '.t*z', gcs_platform)
+
   # Zip up clang-format so we can update it (separately from the clang roll).
   clang_format_dir = 'clang-format-' + stamp
   shutil.rmtree(clang_format_dir, ignore_errors=True)
diff --git a/tools/clang/scripts/update.py b/tools/clang/scripts/update.py
index ca8dc89..3114812d 100755
--- a/tools/clang/scripts/update.py
+++ b/tools/clang/scripts/update.py
@@ -36,7 +36,7 @@
 # Reverting problematic clang rolls is safe, though.
 # This is the output of `git describe` and is usable as a commit-ish.
 CLANG_REVISION = 'llvmorg-16-init-907-g8b740747'
-CLANG_SUB_REVISION = 3
+CLANG_SUB_REVISION = 4
 
 PACKAGE_VERSION = '%s-%s' % (CLANG_REVISION, CLANG_SUB_REVISION)
 RELEASE_VERSION = '16.0.0'
@@ -245,7 +245,8 @@
     package_file = 'llvm-code-coverage'
   elif package_name == 'objdump':
     package_file = 'llvmobjdump'
-  elif package_name in ['clang-libs', 'clang-tidy', 'libclang', 'translation_unit']:
+  elif package_name in ['clang-libs', 'clang-tidy', 'clangd', 'libclang',
+                        'translation_unit']:
     package_file = package_name
   else:
     print('Unknown package: "%s".' % package_name)
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl
index 6f201cfd..9b4611f 100644
--- a/tools/mb/mb_config.pyl
+++ b/tools/mb/mb_config.pyl
@@ -449,6 +449,7 @@
       'linux-perfetto-rel': 'perfetto_release_bot_reclient',
       'linux-rel-no-external-ip': 'gpu_tests_release_bot_do_typecheck_reclient',
       'linux-upload-perfetto': 'release_bot_perfetto_zlib_reclient',
+      'linux-wpt-content-shell-fyi-rel': 'release_trybot_minimal_symbols_reclient',
       'linux-wpt-fyi-rel': 'release_trybot_minimal_symbols_reclient',
       'linux-wpt-identity-fyi-rel': 'release_bot_minimal_symbols_reclient',
       'linux-wpt-input-fyi-rel': 'release_bot_minimal_symbols_reclient',
@@ -1167,7 +1168,7 @@
       'linux-wpt-identity-fyi-rel': 'release_trybot',
       'linux-wpt-input-fyi-rel': 'release_trybot',
       'linux_chromium_archive_rel_ng': 'release_bot',
-      'linux_chromium_asan_rel_ng': 'asan_lsan_release_trybot',
+      'linux_chromium_asan_rel_ng': 'asan_lsan_release_trybot_minimum_symbols_reclient',
       'linux_chromium_cfi_rel_ng': 'cfi_full_cfi_icall_cfi_diag_thin_lto_release_static_dcheck_always_on_goma',
       'linux_chromium_chromeos_asan_rel_ng': 'asan_lsan_chromeos_release_bot_dcheck_always_on',
       'linux_chromium_chromeos_msan_focal': 'chromeos_msan_release_bot',
diff --git a/tools/mb/mb_config_expectations/chromium.fyi.json b/tools/mb/mb_config_expectations/chromium.fyi.json
index 8ac841a..cfa0f0a7 100644
--- a/tools/mb/mb_config_expectations/chromium.fyi.json
+++ b/tools/mb/mb_config_expectations/chromium.fyi.json
@@ -1394,6 +1394,15 @@
       "use_remoteexec": true
     }
   },
+  "linux-wpt-content-shell-fyi-rel": {
+    "gn_args": {
+      "dcheck_always_on": true,
+      "is_component_build": false,
+      "is_debug": false,
+      "symbol_level": 1,
+      "use_remoteexec": true
+    }
+  },
   "linux-wpt-fyi-rel": {
     "gn_args": {
       "dcheck_always_on": true,
diff --git a/tools/mb/mb_config_expectations/tryserver.chromium.linux.json b/tools/mb/mb_config_expectations/tryserver.chromium.linux.json
index 6a17271..f2a8369 100644
--- a/tools/mb/mb_config_expectations/tryserver.chromium.linux.json
+++ b/tools/mb/mb_config_expectations/tryserver.chromium.linux.json
@@ -611,7 +611,7 @@
       "is_debug": false,
       "is_lsan": true,
       "symbol_level": 1,
-      "use_goma": true
+      "use_remoteexec": true
     }
   },
   "linux_chromium_cfi_rel_ng": {
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index b80b049..8e5ec98 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -50,25 +50,13 @@
       label="LoadEventEnd+LoadEventStart+FinishAllLoads+FinishDoc missing"/>
 </enum>
 
-<enum name="AboutThisSiteBannerInteraction">
-  <int value="0" label="kUrlOpened"/>
-  <int value="1" label="kDismissed"/>
-</enum>
-
-<enum name="AboutThisSiteBannerStatus">
-  <int value="0" label="kNoHints"/>
-  <int value="1" label="kShown"/>
-  <int value="2" label="kInvalidOrMissingBannerInfo"/>
-  <int value="3" label="kNavigatedAway"/>
-  <int value="4" label="kNotAllowedToShow"/>
-</enum>
-
 <enum name="AboutThisSiteInteraction">
   <int value="0" label="kNotShown"/>
   <int value="1" label="kShownWithDescription"/>
   <int value="2" label="kShownWithoutDescription"/>
   <int value="3" label="kClickedWithDescription"/>
   <int value="4" label="kClickedWithoutDescription"/>
+  <int value="5" label="kOpenedDirectlyFromSidePanel"/>
 </enum>
 
 <enum name="AboutThisSiteStatus">
@@ -32285,6 +32273,7 @@
   <int value="1005" label="LoadCryptoTokenExtension"/>
   <int value="1006" label="HighEfficiencyModeEnabled"/>
   <int value="1007" label="DevicePrintingClientNameTemplate"/>
+  <int value="1008" label="ReportDeviceSignalStrengthEventDrivenTelemetry"/>
 </enum>
 
 <enum name="EnterprisePoliciesSources">
@@ -41402,6 +41391,15 @@
   <int value="6" label="kSuccessNoHelpContentClicked"/>
 </enum>
 
+<enum name="FeedbackAppHelpContentOutcome">
+  <int value="0" label="kContinueHelpContentClicked"/>
+  <int value="1" label="kContinueNoHelpContentClicked"/>
+  <int value="2" label="kContinueNoResultFound"/>
+  <int value="3" label="kQuitHelpContentClicked"/>
+  <int value="4" label="kQuitNoHelpContentClicked"/>
+  <int value="5" label="kQuitNoResultFound"/>
+</enum>
+
 <enum name="FeedbackAppPostSubmitAction">
   <int value="0" label="kSendNewReport"/>
   <int value="1" label="kClickDoneButton"/>
@@ -50448,7 +50446,7 @@
   <int value="5" label="DOWNLOAD_REQUEST_INFOBAR_DELEGATE_ANDROID (Obsolete)"/>
   <int value="6" label="FULLSCREEN_INFOBAR_DELEGATE (Obsolete)"/>
   <int value="7" label="HUNG_PLUGIN_INFOBAR_DELEGATE"/>
-  <int value="8" label="HUNG_RENDERER_INFOBAR_DELEGATE_ANDROID"/>
+  <int value="8" label="HUNG_RENDERER_INFOBAR_DELEGATE_ANDROID (Obsolete)"/>
   <int value="9" label="MEDIA_STREAM_INFOBAR_DELEGATE_ANDROID (Obsolete)"/>
   <int value="10" label="MEDIA_THROTTLE_INFOBAR_DELEGATE (Obsolete)"/>
   <int value="11" label="REQUEST_QUOTA_INFOBAR_DELEGATE (Obsolete)"/>
@@ -51429,6 +51427,16 @@
   <int value="2" label="Intent picker dialog shown automatically"/>
 </enum>
 
+<enum name="IntentUriNavigationResult">
+  <int value="0" label="Intent with an unused fallback URL was launched"/>
+  <int value="1" label="Intent fallback URL was used"/>
+  <int value="2" label="Intent with an unused fallback URL was blocked"/>
+  <int value="3" label="Intent with a fallback URL prompted the user"/>
+  <int value="4" label="Intent without a fallback URL was launched"/>
+  <int value="5" label="Intent without a fallback URL was blocked"/>
+  <int value="6" label="Intent without a fallback URL prompted the user"/>
+</enum>
+
 <enum name="InterceptionType">
   <int value="0" label="Not intercepted"/>
   <int value="1" label="Other"/>
@@ -56607,6 +56615,8 @@
   <int value="-1696619241" label="OmniboxWrapPopupPosition:disabled"/>
   <int value="-1696366449" label="disable-permissions-bubbles"/>
   <int value="-1695774453" label="skip-extra-ash-window-positioning"/>
+  <int value="-1695608731"
+      label="PageInfoAboutThisSiteDescriptionPlaceholder:disabled"/>
   <int value="-1694900665" label="HandwritingGestureEditing:enabled"/>
   <int value="-1693498375" label="CdmFactoryDaemon:enabled"/>
   <int value="-1693140558" label="FiltersInRecentsV2:disabled"/>
@@ -60890,6 +60900,8 @@
   <int value="948521531" label="StylusHandwriting:disabled"/>
   <int value="951111587" label="MediaAppPhotosIntegrationVideo:disabled"/>
   <int value="952558794" label="enable-remote-assistance"/>
+  <int value="952625847"
+      label="AboutThisSitePersistentSidePanelEntry:disabled"/>
   <int value="955340765" label="ChromeHomeOptOutSnackbar:enabled"/>
   <int value="955425932" label="EnterpriseReportingInChromeOS:enabled"/>
   <int value="955901619" label="EmojiSuggestAddition:disabled"/>
@@ -61679,7 +61691,11 @@
   <int value="1442798825" label="enable-quic"/>
   <int value="1442830837" label="MemoryAblation:disabled"/>
   <int value="1443830588" label="VerticalSnap:disabled"/>
+  <int value="1443836294"
+      label="AboutThisSitePersistentSidePanelEntry:enabled"/>
   <int value="1444066555" label="MessagesForAndroidSyncError:disabled"/>
+  <int value="1444347795"
+      label="PageInfoAboutThisSiteDescriptionPlaceholder:enabled"/>
   <int value="1444719196"
       label="CellularBypassESimInstallationConnectivityCheck:enabled"/>
   <int value="1446066818" label="WebRtcAnalogAgcClippingControl:enabled"/>
@@ -66475,14 +66491,6 @@
   <int value="4" label="No thanks"/>
 </enum>
 
-<enum name="MobileHungRendererInfoBarEvent">
-  <int value="0" label="Clicked the 'Wait' button"/>
-  <int value="1" label="Clicked the 'Kill' button"/>
-  <int value="2" label="Clicked the 'X' (close) button)"/>
-  <int value="3" label="Infobar dismissed after renderer became responsive"/>
-  <int value="4" label="Infobar dismissed after tab closed"/>
-</enum>
-
 <enum name="MobileMessagesBadgeState">
   <int value="0" label="Inactive"/>
   <int value="1" label="Active"/>
diff --git a/tools/metrics/histograms/metadata/android/histograms.xml b/tools/metrics/histograms/metadata/android/histograms.xml
index e2a2af9..8a8b5dde 100644
--- a/tools/metrics/histograms/metadata/android/histograms.xml
+++ b/tools/metrics/histograms/metadata/android/histograms.xml
@@ -1916,6 +1916,16 @@
   </summary>
 </histogram>
 
+<histogram name="Android.Intent.IntentUriNavigationResult"
+    enum="IntentUriNavigationResult" expires_after="2023-08-16">
+  <owner>mthiesse@chromium.org</owner>
+  <owner>yfriedman@chromium.org</owner>
+  <summary>
+    Recorded when a navigation to an Intent URI occurs. Records the results of
+    the navigation.
+  </summary>
+</histogram>
+
 <histogram name="Android.Intent.IntentUriWithSelector" enum="Boolean"
     expires_after="2023-02-12">
   <owner>mthiesse@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/others/histograms.xml b/tools/metrics/histograms/metadata/others/histograms.xml
index 9df01fb..8ca1c3a48 100644
--- a/tools/metrics/histograms/metadata/others/histograms.xml
+++ b/tools/metrics/histograms/metadata/others/histograms.xml
@@ -3575,7 +3575,7 @@
 </histogram>
 
 <histogram name="Conversions.EnqueueEventAllowed" enum="BooleanAllowed"
-    expires_after="2022-10-04">
+    expires_after="2023-02-04">
   <owner>apaseltiner@chromium.org</owner>
   <owner>johnidel@chromium.org</owner>
   <owner>measurement-api-dev+metrics@google.com</owner>
@@ -5769,6 +5769,18 @@
   </summary>
 </histogram>
 
+<histogram name="Feedback.ChromeOSApp.HelpContentOutcome"
+    enum="FeedbackAppHelpContentOutcome" expires_after="2023-07-27">
+  <owner>longbowei@google.com</owner>
+  <owner>xiangdongkong@google.com</owner>
+  <owner>cros-feedback-app@google.com</owner>
+  <summary>
+    Record the outcome of checking help contents. Fires when user leaves the
+    search page by clicking continue or by clicking x on top right to close the
+    app.
+  </summary>
+</histogram>
+
 <histogram name="Feedback.ChromeOSApp.IncludedEmail" units="boolean"
     expires_after="2023-07-27">
   <owner>longbowei@google.com</owner>
@@ -5847,6 +5859,23 @@
   </summary>
 </histogram>
 
+<histogram name="Feedback.ChromeOSApp.TimeOnPage.{FeedbackAppPage}" units="s"
+    expires_after="2023-07-27">
+  <owner>longbowei@google.com</owner>
+  <owner>xiangdongkong@google.com</owner>
+  <owner>cros-feedback-app@google.com</owner>
+  <summary>
+    Records the duration that the Feedback App is open on {FeedbackAppPage}
+    page. Fires when the user closes the app or starts new report after feedback
+    report has been sent.
+  </summary>
+  <token key="FeedbackAppPage">
+    <variant name="ConfirmationPage"/>
+    <variant name="SearchPage"/>
+    <variant name="ShareDataPage"/>
+  </token>
+</histogram>
+
 <histogram name="Feedback.ChromeOSApp.ViewedHelpContent" units="boolean"
     expires_after="2023-07-27">
   <owner>longbowei@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/power/histograms.xml b/tools/metrics/histograms/metadata/power/histograms.xml
index 8a1ac85..9364ad12 100644
--- a/tools/metrics/histograms/metadata/power/histograms.xml
+++ b/tools/metrics/histograms/metadata/power/histograms.xml
@@ -134,19 +134,19 @@
                but there was in the last 2 minutes"/>
 </variants>
 
-<histogram name="PerformanceMonitor.AverageCPU5.Total{UsageScenario}"
+<histogram name="PerformanceMonitor.AverageCPU6.Total{UsageScenario}"
     units="1/100 %" expires_after="2022-11-30">
   <owner>fdoray@chromium.org</owner>
   <owner>pmonette@chromium.org</owner>
   <owner>catan-team@chromium.org</owner>
   <summary>
-    See definition of PerformanceClass.AverageCPU5.ProcessName. This is recorded
+    See definition of PerformanceClass.AverageCPU6.ProcessName. This is recorded
     for {UsageScenario} (see go/chrome_power_use_per_scenario).
   </summary>
   <token key="UsageScenario" variants="UsageScenario"/>
 </histogram>
 
-<histogram name="PerformanceMonitor.AverageCPU5.{ProcessName}" units="1/100 %"
+<histogram name="PerformanceMonitor.AverageCPU6.{ProcessName}" units="1/100 %"
     expires_after="2022-11-30">
   <owner>fdoray@chromium.org</owner>
   <owner>pmonette@chromium.org</owner>
@@ -160,12 +160,11 @@
     type {ProcessName} existed during the interval, a sample of zero is still
     emitted.
 
+    Not recorded on Android.
+
     NOTE: This metric has one significant limitation, it doesn't report the CPU
-    usage of processes that terminate before the end of the interval. This means
-    that short lived processes will rarely be included in the data. Furthermore,
-    we know that short-lived processes are very common (see
-    Renderer.ProcessLifetime). A future version of this metric will address this
-    limitation.
+    usage of non-renderer processes that terminate before the end of the
+    interval.
 
     ANOTHER NOTE: On Windows, this is not recorded on CPUs that do not support
     constant rate TSC.
diff --git a/tools/metrics/histograms/metadata/privacy/histograms.xml b/tools/metrics/histograms/metadata/privacy/histograms.xml
index 0cb2270..681222db 100644
--- a/tools/metrics/histograms/metadata/privacy/histograms.xml
+++ b/tools/metrics/histograms/metadata/privacy/histograms.xml
@@ -19,29 +19,13 @@
 
 <histograms>
 
-<histogram name="Privacy.AboutThisSite.BannerInteraction"
-    enum="AboutThisSiteBannerInteraction" expires_after="2022-08-21">
+<histogram name="Privacy.AboutThisSite.PageLoadValidation"
+    enum="AboutThisSiteStatus" expires_after="2022-12-21">
   <owner>dullweber@chromium.org</owner>
-  <owner>harrisonsean@chromium.org</owner>
+  <owner>olesiamarukhno@chromium.org</owner>
   <summary>
-    Recorded when a user interacts with an AboutThisSite banner.
-  </summary>
-</histogram>
-
-<histogram name="Privacy.AboutThisSite.BannerStatus"
-    enum="AboutThisSiteBannerStatus" expires_after="2022-08-21">
-  <owner>dullweber@chromium.org</owner>
-  <owner>harrisonsean@chromium.org</owner>
-  <summary>Whether an AboutThisSiteBanner was shown on pageload.</summary>
-</histogram>
-
-<histogram name="Privacy.AboutThisSite.BannerValidation"
-    enum="AboutThisSiteStatus" expires_after="2022-08-21">
-  <owner>dullweber@chromium.org</owner>
-  <owner>harrisonsean@chromium.org</owner>
-  <summary>
-    Whether an AboutThisSiteBanner had a valid proto. Recorded when optimization
-    hints are available on pageload.
+    Whether AboutThisSite had a valid proto. Recorded when optimization hints
+    are available on pageload.
   </summary>
 </histogram>
 
diff --git a/tools/metrics/histograms/metadata/tab/histograms.xml b/tools/metrics/histograms/metadata/tab/histograms.xml
index 27f51a6c..ea94082 100644
--- a/tools/metrics/histograms/metadata/tab/histograms.xml
+++ b/tools/metrics/histograms/metadata/tab/histograms.xml
@@ -421,13 +421,16 @@
   </summary>
 </histogram>
 
-<histogram name="Tab.PerceivedRestoreTime" units="ms" expires_after="M88">
+<histogram name="Tab.PerceivedRestoreTime" units="ms" expires_after="M108">
+  <owner>ckitagawa@chromium.org</owner>
   <owner>dtrainor@chromium.org</owner>
   <owner>yfriedman@chromium.org</owner>
   <summary>
     [Android] User-perceived load time for a successful tab restore, measured
     from the first time the user sees the tab being restored until the load
     completes.
+
+    Warning this historgram was expired between M89 and 2022-08-24.
   </summary>
 </histogram>
 
@@ -621,12 +624,15 @@
 </histogram>
 
 <histogram name="Tab.StatusWhenSwitchedBackToForeground" enum="TabStatus"
-    expires_after="M85">
+    expires_after="M108">
+  <owner>ckitagawa@chromium.org</owner>
   <owner>marq@chromium.org</owner>
   <summary>
     [Android and iOS] The status of a tab collected each time the user switches
     to it on mobile. That does not include tabs being created at the time the
     user switches to them, such as NTP or tabs opened to handle intents.
+
+    Warning this historgram was expired between M86 and 2022-08-24.
   </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 93ef5a4..8ce797d 100644
--- a/tools/perf/core/perfetto_binary_roller/binary_deps.json
+++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -6,7 +6,7 @@
         },
         "win": {
             "hash": "87327c1da573e3146b882b577bc9116995d32644",
-            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/a82ecd97e644d25ac660fffe894e2b4adee3493f/trace_processor_shell.exe"
+            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/ee7e55c548972cb286c595a89e308768cff1f379/trace_processor_shell.exe"
         },
         "linux_arm": {
             "hash": "58893933be305d3bfe0a72ebebcacde2ac3ca893",
@@ -22,7 +22,7 @@
         },
         "linux": {
             "hash": "f691d2e3d4bad34388f5ad4cca91a40ea4152f4f",
-            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/95904362be483d694624c5c601a67f4325ce128a/trace_processor_shell"
+            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/ee7e55c548972cb286c595a89e308768cff1f379/trace_processor_shell"
         }
     },
     "power_profile.sql": {
diff --git a/ui/accessibility/accessibility_features.cc b/ui/accessibility/accessibility_features.cc
index 08048282..f1e009d 100644
--- a/ui/accessibility/accessibility_features.cc
+++ b/ui/accessibility/accessibility_features.cc
@@ -106,15 +106,6 @@
 #endif  // BUILDFLAG(IS_WIN)
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
-const base::Feature kMagnifierContinuousMouseFollowingModeSetting{
-    "MagnifierContinuousMouseFollowingModeSetting",
-    base::FEATURE_ENABLED_BY_DEFAULT};
-
-bool IsMagnifierContinuousMouseFollowingModeSettingEnabled() {
-  return base::FeatureList::IsEnabled(
-      ::features::kMagnifierContinuousMouseFollowingModeSetting);
-}
-
 const base::Feature kDockedMagnifierResizing{"DockedMagnifierResizing",
                                              base::FEATURE_ENABLED_BY_DEFAULT};
 
diff --git a/ui/accessibility/accessibility_features.h b/ui/accessibility/accessibility_features.h
index 7b4275a4..1ae4497 100644
--- a/ui/accessibility/accessibility_features.h
+++ b/ui/accessibility/accessibility_features.h
@@ -87,15 +87,6 @@
 #endif  // BUILDFLAG(IS_WIN)
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
-// Enables ability to choose new continuous mouse following mode in Magnifier
-// settings.
-AX_BASE_EXPORT extern const base::Feature
-    kMagnifierContinuousMouseFollowingModeSetting;
-
-// Returns true if the feature to allow choosing the new continuous mouse
-// following mode in Magnifier settings is enabled.
-AX_BASE_EXPORT bool IsMagnifierContinuousMouseFollowingModeSettingEnabled();
-
 // Enables ability to resize Docked Magnifier.
 AX_BASE_EXPORT extern const base::Feature kDockedMagnifierResizing;
 
diff --git a/ui/accessibility/ax_node_position_unittest.cc b/ui/accessibility/ax_node_position_unittest.cc
index 0e5e561..07cc05b 100644
--- a/ui/accessibility/ax_node_position_unittest.cc
+++ b/ui/accessibility/ax_node_position_unittest.cc
@@ -4420,7 +4420,7 @@
 
   // TODO(nektar): AXTree has a bug whereby it doesn't update the unignored
   // cached values when the ignored state is flipped on the root.
-  GetNodeFromTree(root_data.id)->UpdateUnignoredCachedValues();
+  GetNode(root_data.id)->UpdateUnignoredCachedValues();
 
   text_position = AXNodePosition::CreateTextPosition(
       GetTreeID(), root_data.id, 0 /* text_offset */,
diff --git a/ui/accessibility/ax_position.h b/ui/accessibility/ax_position.h
index 3ada31c..5b7d39635 100644
--- a/ui/accessibility/ax_position.h
+++ b/ui/accessibility/ax_position.h
@@ -418,7 +418,7 @@
 
     const AXTreeManager* manager = GetManager();
     if (manager)
-      return manager->GetNodeFromTree(anchor_id());
+      return manager->GetNode(anchor_id());
 
     return nullptr;
   }
diff --git a/ui/accessibility/ax_range_unittest.cc b/ui/accessibility/ax_range_unittest.cc
index 918b615..6501f20 100644
--- a/ui/accessibility/ax_range_unittest.cc
+++ b/ui/accessibility/ax_range_unittest.cc
@@ -69,7 +69,7 @@
     if (tree_manager_->GetTreeID() != tree_id)
       return gfx::Rect();
 
-    AXNode* node = tree_manager_->GetNodeFromTree(node_id);
+    AXNode* node = tree_manager_->GetNode(node_id);
     if (!node)
       return gfx::Rect();
 
@@ -86,7 +86,7 @@
     if (tree_manager_->GetTreeID() != tree_id)
       return gfx::Rect();
 
-    AXNode* node = tree_manager_->GetNodeFromTree(node_id);
+    AXNode* node = tree_manager_->GetNode(node_id);
     if (!node)
       return gfx::Rect();
 
@@ -419,16 +419,16 @@
 }  // namespace
 
 TEST_F(AXRangeTest, RangeOfContents) {
-  const AXNode* root = GetNodeFromTree(ROOT_ID);
+  const AXNode* root = GetNode(ROOT_ID);
   const TestPositionRange root_range =
       TestPositionRange::RangeOfContents(*root);
-  const AXNode* text_field = GetNodeFromTree(TEXT_FIELD_ID);
+  const AXNode* text_field = GetNode(TEXT_FIELD_ID);
   const TestPositionRange text_field_range =
       TestPositionRange::RangeOfContents(*text_field);
-  const AXNode* static_text = GetNodeFromTree(STATIC_TEXT1_ID);
+  const AXNode* static_text = GetNode(STATIC_TEXT1_ID);
   const TestPositionRange static_text_range =
       TestPositionRange::RangeOfContents(*static_text);
-  const AXNode* inline_box = GetNodeFromTree(INLINE_BOX1_ID);
+  const AXNode* inline_box = GetNode(INLINE_BOX1_ID);
   const TestPositionRange inline_box_range =
       TestPositionRange::RangeOfContents(*inline_box);
 
diff --git a/ui/accessibility/ax_tree_manager.cc b/ui/accessibility/ax_tree_manager.cc
index 5df0bcf3..130be1c9 100644
--- a/ui/accessibility/ax_tree_manager.cc
+++ b/ui/accessibility/ax_tree_manager.cc
@@ -55,6 +55,8 @@
       ax_tree_(std::move(tree)),
       event_generator_(ax_tree()) {
   GetMap().AddTreeManager(ax_tree_id_, this);
+  if (ax_tree())
+    tree_observation_.Observe(ax_tree());
 }
 
 AXTreeManager::AXTreeManager(const AXTreeID& tree_id,
@@ -67,6 +69,10 @@
     tree_observation_.Observe(ax_tree());
 }
 
+AXNode* AXTreeManager::GetNode(const AXNodeID node_id) const {
+  return ax_tree_ ? ax_tree_->GetFromId(node_id) : nullptr;
+}
+
 AXTreeID AXTreeManager::GetTreeID() const {
   return ax_tree_ ? ax_tree_->data().tree_id : AXTreeIDUnknown();
 }
diff --git a/ui/accessibility/ax_tree_manager.h b/ui/accessibility/ax_tree_manager.h
index 2a2dfac..62ae882 100644
--- a/ui/accessibility/ax_tree_manager.h
+++ b/ui/accessibility/ax_tree_manager.h
@@ -40,7 +40,7 @@
 
   // Returns the AXNode in the current tree that has the given |node_id|.
   // Returns nullptr if |node_id| is not found.
-  virtual AXNode* GetNodeFromTree(const AXNodeID node_id) const = 0;
+  virtual AXNode* GetNode(const AXNodeID node_id) const;
 
   // Returns the tree id of the tree managed by this AXTreeManager.
   AXTreeID GetTreeID() const;
diff --git a/ui/accessibility/platform/ax_platform_node_win_unittest.cc b/ui/accessibility/platform/ax_platform_node_win_unittest.cc
index 9c9dfb7..8d8fe7f8 100644
--- a/ui/accessibility/platform/ax_platform_node_win_unittest.cc
+++ b/ui/accessibility/platform/ax_platform_node_win_unittest.cc
@@ -294,7 +294,7 @@
 
 template <typename T>
 ComPtr<T> AXPlatformNodeWinTest::QueryInterfaceFromNodeId(AXNodeID id) {
-  return QueryInterfaceFromNode<T>(GetNodeFromTree(id));
+  return QueryInterfaceFromNode<T>(GetNode(id));
 }
 
 template <typename T>
diff --git a/ui/accessibility/test_ax_tree_manager.cc b/ui/accessibility/test_ax_tree_manager.cc
index 8e546fb..d5d6bb8 100644
--- a/ui/accessibility/test_ax_tree_manager.cc
+++ b/ui/accessibility/test_ax_tree_manager.cc
@@ -65,10 +65,6 @@
                                               : nullptr;
 }
 
-AXNode* TestAXTreeManager::GetNodeFromTree(const AXNodeID node_id) const {
-  return ax_tree_ ? ax_tree_->GetFromId(node_id) : nullptr;
-}
-
 AXNode* TestAXTreeManager::GetParentNodeFromParentTreeAsAXNode() const {
   AXTreeID parent_tree_id = GetParentTreeID();
   TestAXTreeManager* parent_manager =
diff --git a/ui/accessibility/test_ax_tree_manager.h b/ui/accessibility/test_ax_tree_manager.h
index 71e3740..1d84fdbf 100644
--- a/ui/accessibility/test_ax_tree_manager.h
+++ b/ui/accessibility/test_ax_tree_manager.h
@@ -46,7 +46,6 @@
   // AXTreeManager implementation.
   AXNode* GetNodeFromTree(const AXTreeID& tree_id,
                           const AXNodeID node_id) const override;
-  AXNode* GetNodeFromTree(const AXNodeID node_id) const override;
   AXNode* GetParentNodeFromParentTreeAsAXNode() const override;
 };
 
diff --git a/ui/aura/window_tree_host.h b/ui/aura/window_tree_host.h
index b82002bb..bbb3b69 100644
--- a/ui/aura/window_tree_host.h
+++ b/ui/aura/window_tree_host.h
@@ -300,7 +300,7 @@
   // absl::nullopt if the state is not known.
   absl::optional<bool> on_current_workspace() const {
     return on_current_workspace_;
-  };
+  }
 
   // Determining if a host's window is on the current workspace can be very
   // expensive COM call on Windows, so this caches that information.
diff --git a/ui/base/models/dialog_model.cc b/ui/base/models/dialog_model.cc
index 69ef68b3..942829f2 100644
--- a/ui/base/models/dialog_model.cc
+++ b/ui/base/models/dialog_model.cc
@@ -97,10 +97,11 @@
 
 DialogModel::~DialogModel() = default;
 
-void DialogModel::AddBodyText(const DialogModelLabel& label,
-                              ElementIdentifier id) {
-  AddField(
-      std::make_unique<DialogModelBodyText>(GetPassKey(), this, label, id));
+void DialogModel::AddParagraph(const DialogModelLabel& label,
+                               std::u16string header,
+                               ElementIdentifier id) {
+  AddField(std::make_unique<DialogModelParagraph>(GetPassKey(), this, label,
+                                                  header, id));
 }
 
 void DialogModel::AddCheckbox(ElementIdentifier id,
diff --git a/ui/base/models/dialog_model.h b/ui/base/models/dialog_model.h
index 23bc086..f7da804 100644
--- a/ui/base/models/dialog_model.h
+++ b/ui/base/models/dialog_model.h
@@ -220,10 +220,11 @@
     // Adds an extra link to the dialog.
     Builder& AddExtraLink(ui::DialogModelLabel::Link link);
 
-    // Adds body text. See DialogModel::AddBodyText().
-    Builder& AddBodyText(const DialogModelLabel& label,
-                         ElementIdentifier id = ElementIdentifier()) {
-      model_->AddBodyText(label, id);
+    // Adds a paragraph. See DialogModel::AddParagraph().
+    Builder& AddParagraph(const DialogModelLabel& label,
+                          std::u16string header = std::u16string(),
+                          ElementIdentifier id = ElementIdentifier()) {
+      model_->AddParagraph(label, header, id);
       return *this;
     }
 
@@ -302,9 +303,11 @@
   // during Host construction where it takes ownership of |this|.
   DialogModelHost* host() { return host_; }
 
-  // Adds body text at the end of the dialog model.
-  void AddBodyText(const DialogModelLabel& label,
-                   ElementIdentifier id = ElementIdentifier());
+  // Adds a paragraph at the end of the dialog model. A paragraph consists of a
+  // label and an optional header.
+  void AddParagraph(const DialogModelLabel& label,
+                    std::u16string header,
+                    ElementIdentifier id = ElementIdentifier());
 
   // Adds a checkbox ([checkbox] label) at the end of the dialog model.
   void AddCheckbox(ElementIdentifier id,
diff --git a/ui/base/models/dialog_model_field.cc b/ui/base/models/dialog_model_field.cc
index 9cd3a52..7c76cd6 100644
--- a/ui/base/models/dialog_model_field.cc
+++ b/ui/base/models/dialog_model_field.cc
@@ -74,9 +74,9 @@
   return AsButton();
 }
 
-DialogModelBodyText* DialogModelField::AsBodyText(
+DialogModelParagraph* DialogModelField::AsParagraph(
     base::PassKey<DialogModelHost>) {
-  return AsBodyText();
+  return AsParagraph();
 }
 
 DialogModelCheckbox* DialogModelField::AsCheckbox(
@@ -114,9 +114,9 @@
   return static_cast<DialogModelButton*>(this);
 }
 
-DialogModelBodyText* DialogModelField::AsBodyText() {
-  DCHECK_EQ(type_, kBodyText);
-  return static_cast<DialogModelBodyText*>(this);
+DialogModelParagraph* DialogModelField::AsParagraph() {
+  DCHECK_EQ(type_, kParagraph);
+  return static_cast<DialogModelParagraph*>(this);
 }
 
 DialogModelCheckbox* DialogModelField::AsCheckbox() {
@@ -184,13 +184,16 @@
   callback_.Run(event);
 }
 
-DialogModelBodyText::DialogModelBodyText(base::PassKey<DialogModel> pass_key,
-                                         DialogModel* model,
-                                         const DialogModelLabel& label,
-                                         ElementIdentifier id)
-    : DialogModelField(pass_key, model, kBodyText, id, {}), label_(label) {}
+DialogModelParagraph::DialogModelParagraph(base::PassKey<DialogModel> pass_key,
+                                           DialogModel* model,
+                                           const DialogModelLabel& label,
+                                           std::u16string header,
+                                           ElementIdentifier id)
+    : DialogModelField(pass_key, model, kParagraph, id, {}),
+      label_(label),
+      header_(header) {}
 
-DialogModelBodyText::~DialogModelBodyText() = default;
+DialogModelParagraph::~DialogModelParagraph() = default;
 
 DialogModelCheckbox::DialogModelCheckbox(
     base::PassKey<DialogModel> pass_key,
diff --git a/ui/base/models/dialog_model_field.h b/ui/base/models/dialog_model_field.h
index 37bded46..adbd788 100644
--- a/ui/base/models/dialog_model_field.h
+++ b/ui/base/models/dialog_model_field.h
@@ -22,7 +22,7 @@
 
 class DialogModel;
 class DialogModelButton;
-class DialogModelBodyText;
+class DialogModelParagraph;
 class DialogModelCheckbox;
 class DialogModelCombobox;
 class DialogModelCustomField;
@@ -34,8 +34,8 @@
 // TODO(pbos): Move this to separate header.
 // DialogModelLabel is an exception to below classes. This is not a
 // DialogModelField but rather represents a text label and styling. This is used
-// with DialogModelBodyText and DialogModelCheckbox for instance and has support
-// for showing a link.
+// with DialogModelParagraph and DialogModelCheckbox for instance and has
+// support for showing a link.
 class COMPONENT_EXPORT(UI_BASE) DialogModelLabel {
  public:
   struct COMPONENT_EXPORT(UI_BASE) Link {
@@ -117,7 +117,7 @@
  public:
   enum Type {
     kButton,
-    kBodyText,
+    kParagraph,
     kCheckbox,
     kCombobox,
     kCustom,
@@ -139,7 +139,7 @@
   }
   ElementIdentifier id(base::PassKey<DialogModelHost>) const { return id_; }
   DialogModelButton* AsButton(base::PassKey<DialogModelHost>);
-  DialogModelBodyText* AsBodyText(base::PassKey<DialogModelHost>);
+  DialogModelParagraph* AsParagraph(base::PassKey<DialogModelHost>);
   DialogModelCheckbox* AsCheckbox(base::PassKey<DialogModelHost>);
   DialogModelCombobox* AsCombobox(base::PassKey<DialogModelHost>);
   DialogModelMenuItem* AsMenuItem(base::PassKey<DialogModelHost>);
@@ -157,7 +157,7 @@
                    base::flat_set<Accelerator> accelerators);
 
   DialogModelButton* AsButton();
-  DialogModelBodyText* AsBodyText();
+  DialogModelParagraph* AsParagraph();
   DialogModelCheckbox* AsCheckbox();
   DialogModelCombobox* AsCombobox();
   const DialogModelMenuItem* AsMenuItem() const;
@@ -224,25 +224,31 @@
   base::RepeatingCallback<void(const Event&)> callback_;
 };
 
-// Field class representing body text.
-class COMPONENT_EXPORT(UI_BASE) DialogModelBodyText : public DialogModelField {
+// Field class representing a paragraph.
+class COMPONENT_EXPORT(UI_BASE) DialogModelParagraph : public DialogModelField {
  public:
   // Note that this is constructed through a DialogModel which adds it to model
   // fields.
-  DialogModelBodyText(base::PassKey<DialogModel> pass_key,
-                      DialogModel* model,
-                      const DialogModelLabel& label,
-                      ElementIdentifier id);
-  DialogModelBodyText(const DialogModelBodyText&) = delete;
-  DialogModelBodyText& operator=(const DialogModelBodyText&) = delete;
-  ~DialogModelBodyText() override;
+  DialogModelParagraph(base::PassKey<DialogModel> pass_key,
+                       DialogModel* model,
+                       const DialogModelLabel& label,
+                       std::u16string header,
+                       ElementIdentifier id);
+  DialogModelParagraph(const DialogModelParagraph&) = delete;
+  DialogModelParagraph& operator=(const DialogModelParagraph&) = delete;
+  ~DialogModelParagraph() override;
 
   const DialogModelLabel& label(base::PassKey<DialogModelHost>) const {
     return label_;
   }
 
+  const std::u16string header(base::PassKey<DialogModelHost>) const {
+    return header_;
+  }
+
  private:
   const DialogModelLabel label_;
+  const std::u16string header_;
 };
 
 // Field class representing a checkbox with descriptive text.
diff --git a/ui/display/manager/content_protection_key_manager.cc b/ui/display/manager/content_protection_key_manager.cc
index e13f88a..78b6b79 100644
--- a/ui/display/manager/content_protection_key_manager.cc
+++ b/ui/display/manager/content_protection_key_manager.cc
@@ -67,4 +67,4 @@
   std::move(on_key_set).Run();
 }
 
-};  // namespace display
+}  // namespace display
diff --git a/ui/display/util/display_util.cc b/ui/display/util/display_util.cc
index 2272f212..cbd85a3 100644
--- a/ui/display/util/display_util.cc
+++ b/ui/display/util/display_util.cc
@@ -23,7 +23,7 @@
 base::flat_set<int64_t>* internal_display_ids() {
   static base::NoDestructor<base::flat_set<int64_t>> display_ids;
   return display_ids.get();
-};
+}
 
 // A list of bogus sizes in mm that should be ignored.
 // See crbug.com/136533. The first element maintains the minimum
diff --git a/ui/events/ozone/events_ozone.cc b/ui/events/ozone/events_ozone.cc
index 8476316..77b5712 100644
--- a/ui/events/ozone/events_ozone.cc
+++ b/ui/events/ozone/events_ozone.cc
@@ -44,8 +44,11 @@
     std::move(callback).Run(&scroll_event);
     handled = scroll_event.handled();
   } else if (event->IsGestureEvent()) {
-    std::move(callback).Run(event);
-    handled = event->handled();
+    // TODO(https://crbug.com/1355835: Missing ui::GestureEvent(const
+    // PlatformEvent&) ctor).
+    auto gesture_event = *(event->AsGestureEvent());
+    std::move(callback).Run(&gesture_event);
+    handled = gesture_event.handled();
     // TODO(mohsen): Use the same pattern for scroll/touch/wheel events.
     // Apparently, there is no need for them to wrap the |event|.
   } else {
diff --git a/ui/ozone/demo/simple_renderer_factory.h b/ui/ozone/demo/simple_renderer_factory.h
index 94a1b23..091e969d 100644
--- a/ui/ozone/demo/simple_renderer_factory.h
+++ b/ui/ozone/demo/simple_renderer_factory.h
@@ -16,7 +16,7 @@
 
 namespace gl {
 class GLDisplay;
-};
+}
 
 namespace ui {
 
diff --git a/ui/ozone/demo/skia/skia_renderer_factory.h b/ui/ozone/demo/skia/skia_renderer_factory.h
index 372382d..650da58 100644
--- a/ui/ozone/demo/skia/skia_renderer_factory.h
+++ b/ui/ozone/demo/skia/skia_renderer_factory.h
@@ -13,7 +13,7 @@
 
 namespace gl {
 class GLDisplay;
-};
+}
 
 namespace ui {
 
diff --git a/ui/ozone/platform/wayland/host/wayland_event_source.cc b/ui/ozone/platform/wayland/host/wayland_event_source.cc
index bd1f434..39c5100 100644
--- a/ui/ozone/platform/wayland/host/wayland_event_source.cc
+++ b/ui/ozone/platform/wayland/host/wayland_event_source.cc
@@ -602,7 +602,13 @@
   GestureEvent event(location.x(), location.y(), 0 /* flags */, timestamp,
                      details);
   event.set_source_device_id(device_id);
-  DispatchEvent(&event);
+
+  auto* target = window_manager_->GetCurrentPointerFocusedWindow();
+  // A window may be deleted when the event arrived from the server.
+  if (!target)
+    return;
+
+  SetTargetAndDispatchEvent(&event, target);
 }
 
 void WaylandEventSource::SetRelativePointerMotionEnabled(bool enabled) {
diff --git a/ui/ozone/platform/wayland/host/wayland_output.cc b/ui/ozone/platform/wayland/host/wayland_output.cc
index 4901167..905118d 100644
--- a/ui/ozone/platform/wayland/host/wayland_output.cc
+++ b/ui/ozone/platform/wayland/host/wayland_output.cc
@@ -55,7 +55,7 @@
   connection->wayland_output_manager_->AddWaylandOutput(name, output.release());
 }
 
-WaylandOutput::WaylandOutput(uint32_t output_id,
+WaylandOutput::WaylandOutput(Id output_id,
                              wl_output* output,
                              WaylandConnection* connection)
     : output_id_(output_id), output_(output), connection_(connection) {
diff --git a/ui/ozone/platform/wayland/host/wayland_output.h b/ui/ozone/platform/wayland/host/wayland_output.h
index f6e9513..414b3cb 100644
--- a/ui/ozone/platform/wayland/host/wayland_output.h
+++ b/ui/ozone/platform/wayland/host/wayland_output.h
@@ -5,7 +5,7 @@
 #ifndef UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_OUTPUT_H_
 #define UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_OUTPUT_H_
 
-#include <stdint.h>
+#include <cstdint>
 
 #include "base/memory/raw_ptr.h"
 #include "ui/display/types/display_snapshot.h"
@@ -21,10 +21,18 @@
 class WaylandConnection;
 class WaylandZAuraOutput;
 
-// WaylandOutput objects keep track of the current output of display
-// that are available to the application.
+// WaylandOutput objects keep track of wl_output information received through
+// the Wayland protocol, along with other related protocol extensions, such as,
+// xdg-output and ChromeOS's aura-shell.
 class WaylandOutput : public wl::GlobalObjectRegistrar<WaylandOutput> {
  public:
+  // Instances of this class are identified by an 32-bit unsigned int value,
+  // corresponding to its global wl_output object 'name' value. It is mostly
+  // used interchangeably with WaylandScreen's display::Display::id property,
+  // which is an int64_t instead, though it is worth bearing in mind they are
+  // slightly different, under the hood.
+  using Id = uint32_t;
+
   static constexpr char kInterfaceName[] = "wl_output";
 
   static void Instantiate(WaylandConnection* connection,
@@ -35,7 +43,7 @@
 
   class Delegate {
    public:
-    virtual void OnOutputHandleMetrics(uint32_t output_id,
+    virtual void OnOutputHandleMetrics(Id output_id,
                                        const gfx::Point& origin,
                                        const gfx::Size& logical_size,
                                        const gfx::Size& physical_size,
@@ -49,9 +57,7 @@
     virtual ~Delegate() = default;
   };
 
-  WaylandOutput(uint32_t output_id,
-                wl_output* output,
-                WaylandConnection* connection);
+  WaylandOutput(Id output_id, wl_output* output, WaylandConnection* connection);
 
   WaylandOutput(const WaylandOutput&) = delete;
   WaylandOutput& operator=(const WaylandOutput&) = delete;
@@ -64,7 +70,7 @@
   void InitializeColorManagementOutput(WaylandZcrColorManager* manager);
   float GetUIScaleFactor() const;
 
-  uint32_t output_id() const { return output_id_; }
+  Id output_id() const { return output_id_; }
   bool has_output(wl_output* output) const { return output_.get() == output; }
   float scale_factor() const { return scale_factor_; }
   int32_t panel_transform() const { return panel_transform_; }
@@ -117,7 +123,7 @@
                                 struct wl_output* wl_output,
                                 int32_t factor);
 
-  const uint32_t output_id_ = 0;
+  const Id output_id_ = 0;
   wl::Object<wl_output> output_;
   std::unique_ptr<XDGOutput> xdg_output_;
   std::unique_ptr<WaylandZAuraOutput> aura_output_;
diff --git a/ui/ozone/platform/wayland/host/wayland_output_manager.cc b/ui/ozone/platform/wayland/host/wayland_output_manager.cc
index 52d4e4e..439f9d1 100644
--- a/ui/ozone/platform/wayland/host/wayland_output_manager.cc
+++ b/ui/ozone/platform/wayland/host/wayland_output_manager.cc
@@ -4,9 +4,9 @@
 
 #include "ui/ozone/platform/wayland/host/wayland_output_manager.h"
 
-#include <algorithm>
 #include <cstdint>
 #include <memory>
+#include <string>
 
 #include "ui/ozone/platform/wayland/host/wayland_connection.h"
 #include "ui/ozone/platform/wayland/host/wayland_output.h"
@@ -31,7 +31,7 @@
   return false;
 }
 
-void WaylandOutputManager::AddWaylandOutput(uint32_t output_id,
+void WaylandOutputManager::AddWaylandOutput(WaylandOutput::Id output_id,
                                             wl_output* output) {
   // Make sure an output with |output_id| has not been added yet. It's very
   // unlikely to happen, unless a compositor has a bug in the numeric names
@@ -59,7 +59,7 @@
   output_list_[output_id] = std::move(wayland_output);
 }
 
-void WaylandOutputManager::RemoveWaylandOutput(uint32_t output_id) {
+void WaylandOutputManager::RemoveWaylandOutput(WaylandOutput::Id output_id) {
   // Check the comment in the WaylandConnection::GlobalRemove.
   if (!GetOutput(output_id))
     return;
@@ -126,7 +126,7 @@
   }
 }
 
-WaylandOutput* WaylandOutputManager::GetOutput(uint32_t id) const {
+WaylandOutput* WaylandOutputManager::GetOutput(WaylandOutput::Id id) const {
   auto it = output_list_.find(id);
   if (it == output_list_.end())
     return nullptr;
@@ -145,7 +145,7 @@
   return output_list_;
 }
 
-void WaylandOutputManager::OnOutputHandleMetrics(uint32_t output_id,
+void WaylandOutputManager::OnOutputHandleMetrics(WaylandOutput::Id output_id,
                                                  const gfx::Point& origin,
                                                  const gfx::Size& logical_size,
                                                  const gfx::Size& physical_size,
@@ -167,7 +167,7 @@
   const bool is_primary =
       wayland_screen_ && output_id == wayland_screen_->GetPrimaryDisplay().id();
   for (auto* window : connection_->wayland_window_manager()->GetAllWindows()) {
-    uint32_t entered_output = window->GetPreferredEnteredOutputId();
+    auto entered_output = window->GetPreferredEnteredOutputId();
     if (entered_output == output_id || (!entered_output && is_primary))
       window->UpdateWindowScale(true);
   }
diff --git a/ui/ozone/platform/wayland/host/wayland_output_manager.h b/ui/ozone/platform/wayland/host/wayland_output_manager.h
index e3b7d55..63bf11f 100644
--- a/ui/ozone/platform/wayland/host/wayland_output_manager.h
+++ b/ui/ozone/platform/wayland/host/wayland_output_manager.h
@@ -24,7 +24,8 @@
 
 class WaylandOutputManager : public WaylandOutput::Delegate {
  public:
-  using OutputList = base::flat_map<uint32_t, std::unique_ptr<WaylandOutput>>;
+  using OutputList =
+      base::flat_map<WaylandOutput::Id, std::unique_ptr<WaylandOutput>>;
 
   explicit WaylandOutputManager(WaylandConnection* connection);
 
@@ -37,8 +38,8 @@
   // compositor.
   bool IsOutputReady() const;
 
-  void AddWaylandOutput(const uint32_t output_id, wl_output* output);
-  void RemoveWaylandOutput(const uint32_t output_id);
+  void AddWaylandOutput(WaylandOutput::Id output_id, wl_output* output);
+  void RemoveWaylandOutput(WaylandOutput::Id output_id);
 
   void InitializeAllXdgOutputs();
   void InitializeAllZAuraOutputs();
@@ -50,7 +51,7 @@
   // Feeds a new platform screen with existing outputs.
   void InitWaylandScreen(WaylandScreen* screen);
 
-  WaylandOutput* GetOutput(uint32_t id) const;
+  WaylandOutput* GetOutput(WaylandOutput::Id id) const;
   WaylandOutput* GetPrimaryOutput() const;
   const OutputList& GetAllOutputs() const;
 
@@ -58,7 +59,7 @@
 
  private:
   // WaylandOutput::Delegate:
-  void OnOutputHandleMetrics(uint32_t output_id,
+  void OnOutputHandleMetrics(WaylandOutput::Id output_id,
                              const gfx::Point& origin,
                              const gfx::Size& logical_size,
                              const gfx::Size& physical_size,
diff --git a/ui/ozone/platform/wayland/host/wayland_screen.cc b/ui/ozone/platform/wayland/host/wayland_screen.cc
index 6379cdb..72f5ee94 100644
--- a/ui/ozone/platform/wayland/host/wayland_screen.cc
+++ b/ui/ozone/platform/wayland/host/wayland_screen.cc
@@ -28,6 +28,7 @@
 #include "ui/ozone/platform/wayland/host/wayland_buffer_manager_host.h"
 #include "ui/ozone/platform/wayland/host/wayland_connection.h"
 #include "ui/ozone/platform/wayland/host/wayland_cursor_position.h"
+#include "ui/ozone/platform/wayland/host/wayland_output.h"
 #include "ui/ozone/platform/wayland/host/wayland_output_manager.h"
 #include "ui/ozone/platform/wayland/host/wayland_window.h"
 #include "ui/ozone/platform/wayland/host/wayland_zcr_color_management_output.h"
@@ -120,7 +121,7 @@
 
 WaylandScreen::~WaylandScreen() = default;
 
-void WaylandScreen::OnOutputAddedOrUpdated(uint32_t output_id,
+void WaylandScreen::OnOutputAddedOrUpdated(WaylandOutput::Id output_id,
                                            const gfx::Point& origin,
                                            const gfx::Size& logical_size,
                                            const gfx::Size& physical_size,
@@ -133,7 +134,7 @@
                      scale, panel_transform, logical_transform, label);
 }
 
-void WaylandScreen::OnOutputRemoved(uint32_t output_id) {
+void WaylandScreen::OnOutputRemoved(WaylandOutput::Id output_id) {
   if (output_id == GetPrimaryDisplay().id()) {
     // First, set a new primary display as required by the |display_list_|. It's
     // safe to set any of the displays to be a primary one. Once the output is
@@ -159,7 +160,7 @@
   }
 }
 
-void WaylandScreen::AddOrUpdateDisplay(uint32_t output_id,
+void WaylandScreen::AddOrUpdateDisplay(WaylandOutput::Id output_id,
                                        const gfx::Point& origin,
                                        const gfx::Size& logical_size,
                                        const gfx::Size& physical_size,
@@ -289,12 +290,12 @@
   // enter events immediately, which can result in empty container of entered
   // ids (check comments in WaylandWindow::OnEnteredOutputIdRemoved). In this
   // case, it's also safe to return the primary display.
-  if (entered_output_id == 0)
+  if (!entered_output_id.has_value())
     return GetPrimaryDisplay();
 
   DCHECK(!display_list_.displays().empty());
   for (const auto& display : display_list_.displays()) {
-    if (display.id() == entered_output_id)
+    if (display.id() == entered_output_id.value())
       return display;
   }
 
diff --git a/ui/ozone/platform/wayland/host/wayland_screen_unittest.cc b/ui/ozone/platform/wayland/host/wayland_screen_unittest.cc
index 7ac5199..8ab5b23 100644
--- a/ui/ozone/platform/wayland/host/wayland_screen_unittest.cc
+++ b/ui/ozone/platform/wayland/host/wayland_screen_unittest.cc
@@ -833,7 +833,7 @@
   // been already initialized with |output_|'s scale.
   wl_surface_send_leave(surface_->resource(), output_->resource());
   Sync();
-  ASSERT_EQ(0u, window_->GetPreferredEnteredOutputId());
+  EXPECT_FALSE(window_->GetPreferredEnteredOutputId());
 
   // Change |output_|'s scale and make sure |window_|'s scale is update
   // accordingly.
diff --git a/ui/ozone/platform/wayland/host/wayland_surface.cc b/ui/ozone/platform/wayland/host/wayland_surface.cc
index 77e002a..510dbd7 100644
--- a/ui/ozone/platform/wayland/host/wayland_surface.cc
+++ b/ui/ozone/platform/wayland/host/wayland_surface.cc
@@ -687,7 +687,8 @@
 WaylandSurface::State::~State() = default;
 
 WaylandSurface::State& WaylandSurface::State::operator=(
-    WaylandSurface::State& other) {
+    const WaylandSurface::State& other) {
+  damage_px = other.damage_px;
   opaque_region_px = other.opaque_region_px;
   input_region_px = other.input_region_px;
   buffer_id = other.buffer_id;
@@ -698,8 +699,8 @@
   crop = other.crop;
   viewport_px = other.viewport_px;
   opacity = other.opacity;
-  rounded_clip_bounds = other.rounded_clip_bounds;
   use_blending = other.use_blending;
+  rounded_clip_bounds = other.rounded_clip_bounds;
   priority_hint = other.priority_hint;
   background_color = other.background_color;
   return *this;
diff --git a/ui/ozone/platform/wayland/host/wayland_surface.h b/ui/ozone/platform/wayland/host/wayland_surface.h
index 526a598..5ca76cbf 100644
--- a/ui/ozone/platform/wayland/host/wayland_surface.h
+++ b/ui/ozone/platform/wayland/host/wayland_surface.h
@@ -203,7 +203,7 @@
   struct State {
     State();
     State(const State& other) = delete;
-    State& operator=(State& other);
+    State& operator=(const State& other);
     ~State();
 
     std::vector<gfx::Rect> damage_px;
diff --git a/ui/ozone/platform/wayland/host/wayland_window.cc b/ui/ozone/platform/wayland/host/wayland_window.cc
index 1e7aab70..fe929cb9 100644
--- a/ui/ozone/platform/wayland/host/wayland_window.cc
+++ b/ui/ozone/platform/wayland/host/wayland_window.cc
@@ -15,6 +15,7 @@
 #include "base/run_loop.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "build/chromeos_buildflags.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "ui/base/cursor/cursor.h"
 #include "ui/base/cursor/mojom/cursor_type.mojom.h"
 #include "ui/base/cursor/platform_cursor.h"
@@ -37,6 +38,7 @@
 #include "ui/ozone/platform/wayland/host/wayland_data_drag_controller.h"
 #include "ui/ozone/platform/wayland/host/wayland_event_source.h"
 #include "ui/ozone/platform/wayland/host/wayland_frame_manager.h"
+#include "ui/ozone/platform/wayland/host/wayland_output.h"
 #include "ui/ozone/platform/wayland/host/wayland_output_manager.h"
 #include "ui/ozone/platform/wayland/host/wayland_screen.h"
 #include "ui/ozone/platform/wayland/host/wayland_subsurface.h"
@@ -107,21 +109,19 @@
 void WaylandWindow::UpdateWindowScale(bool update_bounds) {
   DCHECK(connection_->wayland_output_manager());
 
+  const auto* output_manager = connection_->wayland_output_manager();
   auto preferred_outputs_id = GetPreferredEnteredOutputId();
-  if (preferred_outputs_id == 0) {
-    // If non of the output are entered, use primary output. This is what
-    // WaylandScreen returns back to ScreenOzone.
-    auto* primary_output =
-        connection_->wayland_output_manager()->GetPrimaryOutput();
-    // We don't know our primary output - WaylandScreen hasn't been created
-    // yet.
+  if (!preferred_outputs_id.has_value()) {
+    // If no output was entered yet, use primary output. This is similar to what
+    // PlatformScreen implementation is expected to return to higher layer.
+    auto* primary_output = output_manager->GetPrimaryOutput();
+    // Primary output is unknown. i.e: WaylandScreen was not created yet.
     if (!primary_output)
       return;
     preferred_outputs_id = primary_output->output_id();
   }
 
-  auto* output =
-      connection_->wayland_output_manager()->GetOutput(preferred_outputs_id);
+  auto* output = output_manager->GetOutput(preferred_outputs_id.value());
   // There can be a race between sending leave output event and destroying
   // wl_outputs. Thus, explicitly check if the output exist.
   if (!output)
@@ -150,7 +150,7 @@
   return changed;
 }
 
-uint32_t WaylandWindow::GetPreferredEnteredOutputId() {
+absl::optional<WaylandOutput::Id> WaylandWindow::GetPreferredEnteredOutputId() {
   // Child windows don't store entered outputs. Instead, take the window's
   // root parent window and use its preferred output.
   if (parent_window_)
@@ -160,38 +160,38 @@
   // still a non toplevel window that doesn't have a parent (for example, a
   // wl_surface that is being dragged).
   if (root_surface_->entered_outputs().empty())
-    return 0;
+    return absl::nullopt;
 
   // PlatformWindowType::kPopup are created as toplevel windows as well.
   DCHECK(type() == PlatformWindowType::kWindow ||
          type() == PlatformWindowType::kPopup);
 
+  WaylandOutput::Id preferred_id = root_surface_->entered_outputs().front();
+  const auto* output_manager = connection_->wayland_output_manager();
+
   // A window can be located on two or more displays. Thus, return the id of the
   // output that has the biggest scale factor. Otherwise, use the very first one
   // that was entered. This way, we can be sure that the contents of the Window
   // are rendered at correct dpi when a user moves the window between displays.
-  uint32_t preferred_output_id = *root_surface_->entered_outputs().begin();
-  for (uint32_t output_id : root_surface_->entered_outputs()) {
-    auto* output_manager = connection_->wayland_output_manager();
+  for (WaylandOutput::Id output_id : root_surface_->entered_outputs()) {
     auto* output = output_manager->GetOutput(output_id);
-    auto* preferred_output = output_manager->GetOutput(preferred_output_id);
+    auto* preferred_output = output_manager->GetOutput(preferred_id);
     // The compositor may have told the surface to enter the output that the
     // client is not aware of.  In such an event, we cannot evaluate scales, and
     // can only return the default, which means falling back to the primary
-    // display in the code that calls this.
-    // DCHECKS below are kept for trying to catch the situation in developer's
-    // builds and find the way to reproduce the issue.
-    // See crbug.com/1323635
+    // display in the code that calls this. DCHECKS below are kept for trying to
+    // catch the situation in developer's builds and find the way to reproduce
+    // the issue. See crbug.com/1323635.
     DCHECK(output) << " output " << output_id << " not found!";
-    DCHECK(preferred_output)
-        << " output " << preferred_output_id << " not found!";
+    DCHECK(preferred_output) << " output " << preferred_id << " not found!";
     if (!output || !preferred_output)
-      return 0;
+      return absl::nullopt;
+
     if (output->scale_factor() > preferred_output->scale_factor())
-      preferred_output_id = output_id;
+      preferred_id = output_id;
   }
 
-  return preferred_output_id;
+  return preferred_id;
 }
 
 void WaylandWindow::OnPointerFocusChanged(bool focused) {
diff --git a/ui/ozone/platform/wayland/host/wayland_window.h b/ui/ozone/platform/wayland/host/wayland_window.h
index 404431a..8423df6 100644
--- a/ui/ozone/platform/wayland/host/wayland_window.h
+++ b/ui/ozone/platform/wayland/host/wayland_window.h
@@ -19,6 +19,7 @@
 #include "base/memory/scoped_refptr.h"
 #include "base/memory/weak_ptr.h"
 #include "base/task/single_thread_task_runner.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "ui/base/dragdrop/mojom/drag_drop_types.mojom-forward.h"
 #include "ui/events/event_target.h"
 #include "ui/events/platform/platform_event_dispatcher.h"
@@ -27,6 +28,7 @@
 #include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/native_widget_types.h"
 #include "ui/ozone/platform/wayland/common/wayland_object.h"
+#include "ui/ozone/platform/wayland/host/wayland_output.h"
 #include "ui/ozone/platform/wayland/host/wayland_surface.h"
 #include "ui/platform_window/platform_window.h"
 #include "ui/platform_window/platform_window_delegate.h"
@@ -132,12 +134,12 @@
   float window_scale() const { return window_scale_; }
   float ui_scale() const { return ui_scale_; }
 
-  // A preferred output is the one with the largest scale. This is needed to
-  // properly render contents as it seems like an expectation of Wayland.
-  // However, if all the outputs the window is located at have the same scale
-  // factor, the very first entered output is chosen as there is no way to
-  // figure out what output the window occupies the most.
-  uint32_t GetPreferredEnteredOutputId();
+  // Returns the preferred entered output id, if any. The preferred output is
+  // the one with the largest scale. This is needed to properly render contents
+  // as it seems like an expectation of Wayland. However, if all the entered
+  // outputs have the same scale factor, the very first entered output is chosen
+  // as there is no way to figure out what output the window occupies the most.
+  absl::optional<WaylandOutput::Id> GetPreferredEnteredOutputId();
 
   // Returns current type of the window.
   PlatformWindowType type() const { return type_; }
diff --git a/ui/ozone/platform/wayland/host/wayland_window_unittest.cc b/ui/ozone/platform/wayland/host/wayland_window_unittest.cc
index bce576d..f533ae6 100644
--- a/ui/ozone/platform/wayland/host/wayland_window_unittest.cc
+++ b/ui/ozone/platform/wayland/host/wayland_window_unittest.cc
@@ -2149,7 +2149,9 @@
 
   // The window must prefer the output that it entered first.
   uint32_t expected_entered_output_id = *entered_outputs.begin();
-  EXPECT_EQ(expected_entered_output_id, window_->GetPreferredEnteredOutputId());
+  EXPECT_TRUE(window_->GetPreferredEnteredOutputId());
+  EXPECT_EQ(expected_entered_output_id,
+            *window_->GetPreferredEnteredOutputId());
 
   // Create the third output and pretend the window entered 3 outputs at the
   // same time.
@@ -2165,7 +2167,9 @@
   EXPECT_EQ(3u, entered_outputs.size());
 
   // but it still must prefer the output that it entered first.
-  EXPECT_EQ(expected_entered_output_id, window_->GetPreferredEnteredOutputId());
+  EXPECT_TRUE(window_->GetPreferredEnteredOutputId());
+  EXPECT_EQ(expected_entered_output_id,
+            *window_->GetPreferredEnteredOutputId());
 
   // Pretend that the output2 has scale factor equals to 2 now.
   output2->SetScale(2);
@@ -2183,7 +2187,9 @@
   EXPECT_EQ(2, expected_entered_output->scale_factor());
 
   // The window_ must return the output with largest scale.
-  EXPECT_EQ(expected_entered_output_id, window_->GetPreferredEnteredOutputId());
+  EXPECT_TRUE(window_->GetPreferredEnteredOutputId());
+  EXPECT_EQ(expected_entered_output_id,
+            *window_->GetPreferredEnteredOutputId());
 
   // Now, the output1 changes its scale factor to 2 as well.
   output1->SetScale(2);
@@ -2192,8 +2198,10 @@
 
   // It must be the very first output now.
   entered_outputs = window_->root_surface()->entered_outputs();
-  expected_entered_output_id = *entered_outputs.begin();
-  EXPECT_EQ(expected_entered_output_id, window_->GetPreferredEnteredOutputId());
+  expected_entered_output_id = entered_outputs.front();
+  EXPECT_TRUE(window_->GetPreferredEnteredOutputId());
+  EXPECT_EQ(expected_entered_output_id,
+            *window_->GetPreferredEnteredOutputId());
 
   // Now, the output1 changes its scale factor back to 1.
   output1->SetScale(1);
@@ -2203,7 +2211,9 @@
   // It must be the very the second output now.
   entered_outputs = window_->root_surface()->entered_outputs();
   expected_entered_output_id = *(++entered_outputs.begin());
-  EXPECT_EQ(expected_entered_output_id, window_->GetPreferredEnteredOutputId());
+  EXPECT_TRUE(window_->GetPreferredEnteredOutputId());
+  EXPECT_EQ(expected_entered_output_id,
+            *window_->GetPreferredEnteredOutputId());
 
   // All outputs have scale factor of 1. window_ prefers the output that
   // it entered first again.
@@ -2212,8 +2222,10 @@
   Sync();
 
   entered_outputs = window_->root_surface()->entered_outputs();
-  expected_entered_output_id = *(entered_outputs.begin());
-  EXPECT_EQ(expected_entered_output_id, window_->GetPreferredEnteredOutputId());
+  expected_entered_output_id = entered_outputs.front();
+  EXPECT_TRUE(window_->GetPreferredEnteredOutputId());
+  EXPECT_EQ(expected_entered_output_id,
+            *window_->GetPreferredEnteredOutputId());
 }
 
 TEST_P(WaylandWindowTest, GetChildrenPreferredOutput) {
@@ -2297,7 +2309,9 @@
   // It must be the very the second output now.
   entered_outputs = window_->root_surface()->entered_outputs();
   uint32_t expected_entered_output_id = *(++entered_outputs.begin());
-  EXPECT_EQ(expected_entered_output_id, window_->GetPreferredEnteredOutputId());
+  EXPECT_TRUE(window_->GetPreferredEnteredOutputId());
+  EXPECT_EQ(expected_entered_output_id,
+            *window_->GetPreferredEnteredOutputId());
 
   EXPECT_EQ(window_->GetPreferredEnteredOutputId(),
             menu_window->GetPreferredEnteredOutputId());
diff --git a/ui/ozone/platform/wayland/host/wayland_zwp_pointer_gestures_unittest.cc b/ui/ozone/platform/wayland/host/wayland_zwp_pointer_gestures_unittest.cc
index 968a9f6..cecfac48 100644
--- a/ui/ozone/platform/wayland/host/wayland_zwp_pointer_gestures_unittest.cc
+++ b/ui/ozone/platform/wayland/host/wayland_zwp_pointer_gestures_unittest.cc
@@ -10,6 +10,7 @@
 #include "ui/events/platform/platform_event_observer.h"
 #include "ui/ozone/platform/wayland/host/wayland_event_source.h"
 #include "ui/ozone/platform/wayland/host/wayland_zwp_pointer_gestures.h"
+#include "ui/ozone/platform/wayland/test/mock_pointer.h"
 #include "ui/ozone/platform/wayland/test/mock_surface.h"
 #include "ui/ozone/platform/wayland/test/wayland_test.h"
 
@@ -75,14 +76,6 @@
   }
 };
 
-// TODO(crbug.com/1298099): Reenable test when exo has been fixed and the
-// libinput behavior has been restored.
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-#define MAYBE(x) DISABLED_##x
-#else
-#define MAYBE(x) x
-#endif
-
 // Tests that scale in pinch zoom events is fixed to the progression expected by
 // the compositor.
 //
@@ -94,20 +87,20 @@
 // WaylandZwpPointerGestures methods.
 //
 // See https://crbug.com/1283652
-TEST_P(WaylandPointerGesturesTest, MAYBE(PinchZoomScale)) {
-  // TODO(1353670): is this needed?
-#if DCHECK_IS_ON()
-  window_->disable_null_target_dcheck_for_testing();
-#endif
-
+TEST_P(WaylandPointerGesturesTest, PinchZoomScale) {
   auto* const mock_surface = server_.GetObject<wl::MockSurface>(
       window_->root_surface()->GetSurfaceId());
 
+  uint32_t serial = 0;
+  auto* pointer = server_.seat()->pointer();
+  wl_pointer_send_enter(pointer->resource(), ++serial, mock_surface->resource(),
+                        wl_fixed_from_int(50), wl_fixed_from_int(50));
+  wl_pointer_send_frame(pointer->resource());
+
   PinchEventScaleRecorder observer;
 
   auto* pinch_resource = server_.wp_pointer_gestures().pinch()->resource();
-  zwp_pointer_gesture_pinch_v1_send_begin(pinch_resource,
-                                          /* serial */ 0,
+  zwp_pointer_gesture_pinch_v1_send_begin(pinch_resource, ++serial,
                                           /* time */ 0,
                                           mock_surface->resource(),
                                           /* fingers */ 2);
@@ -116,18 +109,13 @@
   constexpr double kScales[] = {1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.4,
                                 1.3, 1.2, 1.1, 1.0, 0.9, 0.8, 0.7,
                                 0.6, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0};
-  auto previous_scale = kScales[0];
   for (auto scale : kScales) {
     zwp_pointer_gesture_pinch_v1_send_update(
         pinch_resource, /* time */ 0, /* dx */ 0, /* dy */ 0,
         wl_fixed_from_double(scale), /* rotation */ 0);
     Sync();
-    // The conversion from double to fixed and back is necessary because it
-    // happens during the roundtrip, and it creates significant error.
-    EXPECT_FLOAT_EQ(
-        observer.latest_scale_update(),
-        wl_fixed_to_double(wl_fixed_from_double(scale)) / previous_scale);
-    previous_scale = wl_fixed_to_double(wl_fixed_from_double(scale));
+    EXPECT_FLOAT_EQ(observer.latest_scale_update(),
+                    wl_fixed_to_double(wl_fixed_from_double(scale)));
   }
 }
 
diff --git a/ui/ozone/platform/wayland/host/xdg_toplevel_wrapper_impl.cc b/ui/ozone/platform/wayland/host/xdg_toplevel_wrapper_impl.cc
index 85bbea64..090db779 100644
--- a/ui/ozone/platform/wayland/host/xdg_toplevel_wrapper_impl.cc
+++ b/ui/ozone/platform/wayland/host/xdg_toplevel_wrapper_impl.cc
@@ -416,22 +416,26 @@
 
 void XDGToplevelWrapperImpl::RequestWindowBounds(const gfx::Rect& bounds) {
   DCHECK(SupportsScreenCoordinates());
-  uint32_t id = wayland_window_->GetPreferredEnteredOutputId();
-  auto* output = connection_->wayland_output_manager()->GetOutput(id);
-  if (!output) {
-    // output can be null when the surfae is just created. output should
-    // probably be inferred in that case.
-    LOG(WARNING) << "Output Not found for id=" << id;
-    output = connection_->wayland_output_manager()->GetPrimaryOutput();
-  }
-  // `output` can be null in unit tests where it doesn't wait for output events.
-  if (!output)
+  const auto entered_id = wayland_window_->GetPreferredEnteredOutputId();
+  const WaylandOutputManager* manager = connection_->wayland_output_manager();
+  WaylandOutput* entered_output = entered_id.has_value()
+                                      ? manager->GetOutput(entered_id.value())
+                                      : manager->GetPrimaryOutput();
+
+  // Output can be null when the surface has been just created. It should
+  // probably be inferred in that case.
+  LOG_IF(WARNING, !entered_id.has_value()) << "No output has been entered yet.";
+
+  // `entered_output` can be null in unit tests, where it doesn't wait for
+  // output events.
+  if (!entered_output)
     return;
+
   if (aura_toplevel_ && zaura_toplevel_get_version(aura_toplevel_.get()) >=
                             ZAURA_TOPLEVEL_SET_WINDOW_BOUNDS_SINCE_VERSION) {
-    zaura_toplevel_set_window_bounds(aura_toplevel_.get(), bounds.x(),
-                                     bounds.y(), bounds.width(),
-                                     bounds.height(), output->get_output());
+    zaura_toplevel_set_window_bounds(
+        aura_toplevel_.get(), bounds.x(), bounds.y(), bounds.width(),
+        bounds.height(), entered_output->get_output());
   }
 }
 
diff --git a/ui/views/accessibility/views_ax_tree_manager.cc b/ui/views/accessibility/views_ax_tree_manager.cc
index abad8ac..7b8c927 100644
--- a/ui/views/accessibility/views_ax_tree_manager.cc
+++ b/ui/views/accessibility/views_ax_tree_manager.cc
@@ -64,10 +64,10 @@
     return nullptr;
 
   const ui::AXTreeManager* manager = ui::AXTreeManager::FromID(tree_id);
-  return manager ? manager->GetNodeFromTree(node_id) : nullptr;
+  return manager ? manager->GetNode(node_id) : nullptr;
 }
 
-ui::AXNode* ViewsAXTreeManager::GetNodeFromTree(
+ui::AXNode* ViewsAXTreeManager::GetNode(
     const ui::AXNodeID node_id) const {
   if (!widget_ || !widget_->GetRootView() || !ax_tree_)
     return nullptr;
diff --git a/ui/views/accessibility/views_ax_tree_manager.h b/ui/views/accessibility/views_ax_tree_manager.h
index a94de70a..fccbeb3 100644
--- a/ui/views/accessibility/views_ax_tree_manager.h
+++ b/ui/views/accessibility/views_ax_tree_manager.h
@@ -81,7 +81,7 @@
   // AXTreeManager implementation.
   ui::AXNode* GetNodeFromTree(const ui::AXTreeID& tree_id,
                               const ui::AXNodeID node_id) const override;
-  ui::AXNode* GetNodeFromTree(const ui::AXNodeID node_id) const override;
+  ui::AXNode* GetNode(const ui::AXNodeID node_id) const override;
   ui::AXTreeID GetParentTreeID() const override;
   ui::AXNode* GetParentNodeFromParentTreeAsAXNode() const override;
 
diff --git a/ui/views/bubble/bubble_dialog_model_host.cc b/ui/views/bubble/bubble_dialog_model_host.cc
index 072b45b..d83719a 100644
--- a/ui/views/bubble/bubble_dialog_model_host.cc
+++ b/ui/views/bubble/bubble_dialog_model_host.cc
@@ -45,7 +45,7 @@
   switch (field->type(pass_key)) {
     case ui::DialogModelField::kButton:
       return BubbleDialogModelHost::FieldType::kControl;
-    case ui::DialogModelField::kBodyText:
+    case ui::DialogModelField::kParagraph:
       return BubbleDialogModelHost::FieldType::kText;
     case ui::DialogModelField::kCheckbox:
       return BubbleDialogModelHost::FieldType::kControl;
@@ -514,8 +514,8 @@
       // TODO(pbos): Add support for buttons that are part of content area.
       NOTREACHED();
       return;
-    case ui::DialogModelField::kBodyText:
-      AddOrUpdateBodyText(field->AsBodyText(GetPassKey()));
+    case ui::DialogModelField::kParagraph:
+      AddOrUpdateParagraph(field->AsParagraph(GetPassKey()));
       break;
     case ui::DialogModelField::kCheckbox:
       AddOrUpdateCheckbox(field->AsCheckbox(GetPassKey()));
@@ -606,11 +606,14 @@
   // TODO(pbos): Do we need to reset `model_` and destroy contents? See Close().
 }
 
-void BubbleDialogModelHost::AddOrUpdateBodyText(
-    ui::DialogModelBodyText* model_field) {
+void BubbleDialogModelHost::AddOrUpdateParagraph(
+    ui::DialogModelParagraph* model_field) {
   // TODO(pbos): Handle updating existing field.
   std::unique_ptr<View> view =
-      CreateViewForLabel(model_field->label(GetPassKey()));
+      model_field->header(GetPassKey()).empty()
+          ? CreateViewForLabel(model_field->label(GetPassKey()))
+          : CreateViewForParagraphWithHeader(model_field->label(GetPassKey()),
+                                             model_field->header(GetPassKey()));
   DialogModelHostField info{model_field, view.get(), nullptr};
   view->SetProperty(kElementIdentifierKey, model_field->id(GetPassKey()));
   AddDialogModelHostField(std::move(view), info);
@@ -897,6 +900,20 @@
   return text_label;
 }
 
+std::unique_ptr<View> BubbleDialogModelHost::CreateViewForParagraphWithHeader(
+    const ui::DialogModelLabel& dialog_label,
+    const std::u16string header) {
+  auto view = std::make_unique<BoxLayoutView>();
+  view->SetOrientation(BoxLayout::Orientation::kVertical);
+
+  auto* header_label = view->AddChildView(std::make_unique<Label>(
+      header, style::CONTEXT_DIALOG_BODY_TEXT, style::STYLE_PRIMARY));
+  header_label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
+
+  view->AddChildView(CreateViewForLabel(dialog_label));
+  return view;
+}
+
 bool BubbleDialogModelHost::IsModalDialog() const {
   return GetModalType() != ui::MODAL_TYPE_NONE;
 }
diff --git a/ui/views/bubble/bubble_dialog_model_host.h b/ui/views/bubble/bubble_dialog_model_host.h
index 76d81838..ec01ade 100644
--- a/ui/views/bubble/bubble_dialog_model_host.h
+++ b/ui/views/bubble/bubble_dialog_model_host.h
@@ -125,7 +125,7 @@
   void OnWindowClosing();
 
   void AddInitialFields();
-  void AddOrUpdateBodyText(ui::DialogModelBodyText* model_field);
+  void AddOrUpdateParagraph(ui::DialogModelParagraph* model_field);
   void AddOrUpdateCheckbox(ui::DialogModelCheckbox* model_field);
   void AddOrUpdateCombobox(ui::DialogModelCombobox* model_field);
   void AddOrUpdateMenuItem(ui::DialogModelMenuItem* model_field);
@@ -147,6 +147,9 @@
       const ui::DialogModelLabel& dialog_label);
   std::unique_ptr<Label> CreateLabelForDialogModelLabel(
       const ui::DialogModelLabel& dialog_label);
+  std::unique_ptr<View> CreateViewForParagraphWithHeader(
+      const ui::DialogModelLabel& dialog_label,
+      const std::u16string header);
 
   void AddDialogModelHostField(std::unique_ptr<View> view,
                                const DialogModelHostField& field_view_info);
diff --git a/ui/webui/resources/cr_components/chromeos/network/BUILD.gn b/ui/webui/resources/cr_components/chromeos/network/BUILD.gn
index 6a78802..99691a7 100644
--- a/ui/webui/resources/cr_components/chromeos/network/BUILD.gn
+++ b/ui/webui/resources/cr_components/chromeos/network/BUILD.gn
@@ -305,7 +305,7 @@
   sources = [ "$root_gen_dir/ui/webui/resources/cr_components/chromeos/network/cr_policy_network_indicator_mojo.m.js" ]
   deps = [
     ":cr_policy_network_behavior_mojo.m",
-    ":onc_mojo",
+    ":onc_mojo.m",
     "../../../cr_elements/policy:cr_policy_indicator_behavior.m",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
   ]
diff --git a/ui/webui/resources/cr_components/chromeos/network/network_choose_mobile.html b/ui/webui/resources/cr_components/chromeos/network/network_choose_mobile.html
index e755859..bd4fd30 100644
--- a/ui/webui/resources/cr_components/chromeos/network/network_choose_mobile.html
+++ b/ui/webui/resources/cr_components/chromeos/network/network_choose_mobile.html
@@ -11,6 +11,7 @@
 <link rel="import" href="chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/iron-flex-layout/iron-flex-layout-classes.html">
 <link rel="import" href="mojo_interface_provider.html">
+<link rel="import" href="onc_mojo.html">
 <link rel="import" href="network_shared_css.html">
 
 <dom-module id="network-choose-mobile">
diff --git a/ui/webui/resources/cr_components/chromeos/network/network_config_element_behavior.html b/ui/webui/resources/cr_components/chromeos/network/network_config_element_behavior.html
index 5047aa7..59945473 100644
--- a/ui/webui/resources/cr_components/chromeos/network/network_config_element_behavior.html
+++ b/ui/webui/resources/cr_components/chromeos/network/network_config_element_behavior.html
@@ -1 +1,2 @@
+<link rel="import" href="onc_mojo.html">
 <script src="network_config_element_behavior.js"></script>
diff --git a/ui/webui/resources/cr_components/chromeos/network/network_config_element_behavior.js b/ui/webui/resources/cr_components/chromeos/network/network_config_element_behavior.js
index 95d24a2..98274f92 100644
--- a/ui/webui/resources/cr_components/chromeos/network/network_config_element_behavior.js
+++ b/ui/webui/resources/cr_components/chromeos/network/network_config_element_behavior.js
@@ -6,6 +6,8 @@
  * @fileoverview Behavior for network config elements.
  */
 
+// #import {OncMojo} from './onc_mojo.m.js';
+
 /** @polymerBehavior */
 /* #export */ const NetworkConfigElementBehavior = {
   properties: {
diff --git a/ui/webui/resources/cr_components/chromeos/network/network_config_select.html b/ui/webui/resources/cr_components/chromeos/network/network_config_select.html
index f0a7834..647716d 100644
--- a/ui/webui/resources/cr_components/chromeos/network/network_config_select.html
+++ b/ui/webui/resources/cr_components/chromeos/network/network_config_select.html
@@ -4,6 +4,7 @@
 <link rel="import" href="chrome://resources/cr_elements/policy/cr_tooltip_icon.html">
 <link rel="import" href="chrome://resources/cr_elements/shared_vars_css.html">
 <link rel="import" href="chrome://resources/cr_elements/shared_style_css.html">
+<link rel="import" href="chrome://resources/html/assert.html">
 <link rel="import" href="chrome://resources/html/i18n_behavior.html">
 <link rel="import" href="cr_policy_network_behavior_mojo.html">
 <link rel="import" href="cr_policy_network_indicator_mojo.html">
diff --git a/ui/webui/resources/cr_components/chromeos/network/sim_lock_dialogs.html b/ui/webui/resources/cr_components/chromeos/network/sim_lock_dialogs.html
index 374d88b..bd2b6a2a 100644
--- a/ui/webui/resources/cr_components/chromeos/network/sim_lock_dialogs.html
+++ b/ui/webui/resources/cr_components/chromeos/network/sim_lock_dialogs.html
@@ -4,6 +4,7 @@
 <link rel="import" href="../../../cr_elements/cr_dialog/cr_dialog.html">
 <link rel="import" href="../../../cr_elements/icons.html">
 <link rel="import" href="../../../cr_elements/shared_style_css.html">
+<link rel="import" href="../../../html/assert.html">
 <link rel="import" href="../../../html/i18n_behavior.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/iron-flex-layout/iron-flex-layout-classes.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html">
@@ -223,4 +224,4 @@
     </cr-dialog>
   </template>
   <script src="sim_lock_dialogs.js"></script>
-</dom-module>
\ No newline at end of file
+</dom-module>
diff --git a/ui/webui/resources/cr_components/chromeos/network_health/BUILD.gn b/ui/webui/resources/cr_components/chromeos/network_health/BUILD.gn
index 95b6781..40f73a1 100644
--- a/ui/webui/resources/cr_components/chromeos/network_health/BUILD.gn
+++ b/ui/webui/resources/cr_components/chromeos/network_health/BUILD.gn
@@ -31,7 +31,8 @@
   deps = [
     "//chromeos/services/network_health/public/mojom:mojom_webui_js",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_components/chromeos/network:onc_mojo",
+    "//ui/webui/resources/cr_components/chromeos/network:onc_mojo.m",
+    "//ui/webui/resources/js:assert.m",
     "//ui/webui/resources/js:i18n_behavior.m",
   ]
 }
diff --git a/ui/webui/resources/cr_components/chromeos/network_health/network_health_summary.js b/ui/webui/resources/cr_components/chromeos/network_health/network_health_summary.js
index 8b6fd7e..c9249e9 100644
--- a/ui/webui/resources/cr_components/chromeos/network_health/network_health_summary.js
+++ b/ui/webui/resources/cr_components/chromeos/network_health/network_health_summary.js
@@ -9,6 +9,7 @@
 import {NetworkType, PortalState} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {Network, NetworkHealthService, NetworkHealthServiceRemote, NetworkHealthState, NetworkState, UInt32Value} from 'chrome://resources/mojo/chromeos/services/network_health/public/mojom/network_health.mojom-webui.js';
 
+import {assertNotReached} from '../../../js/assert.m.js';
 import {I18nBehavior} from '../../../js/i18n_behavior.m.js';
 import {OncMojo} from '../network/onc_mojo.m.js';
 
@@ -140,7 +141,10 @@
    * @return {string}
    */
   getPortalStateString_(state) {
-    return this.i18n('OncPortalState' + OncMojo.getPortalStateString(state));
+    return this.i18n(
+        'OncPortalState' +
+        OncMojo.getPortalStateString(
+            /** @type {chromeos.networkConfig.mojom.PortalState} */ (state)));
   },
 
   /**
@@ -150,7 +154,10 @@
    * @return {string}
    */
   getNetworkTypeString_(type) {
-    return this.i18n('OncType' + OncMojo.getNetworkTypeString(type));
+    return this.i18n(
+        'OncType' +
+        OncMojo.getNetworkTypeString(
+            /** @type {chromeos.networkConfig.mojom.NetworkType} */ (type)));
   },
 
   /**
diff --git a/ui/webui/resources/cr_elements/cr_toggle/cr_toggle.ts b/ui/webui/resources/cr_elements/cr_toggle/cr_toggle.ts
index 4add181d..35ef4261 100644
--- a/ui/webui/resources/cr_elements/cr_toggle/cr_toggle.ts
+++ b/ui/webui/resources/cr_elements/cr_toggle/cr_toggle.ts
@@ -87,8 +87,8 @@
     if (!this.hasAttribute('tabindex')) {
       this.setAttribute('tabindex', '0');
     }
-    this.setAttribute('aria-pressed', 'false');
-    this.setAttribute('aria-disabled', 'false');
+    this.setAttribute('aria-pressed', this.checked ? 'true' : 'false');
+    this.setAttribute('aria-disabled', this.disabled ? 'true' : 'false');
 
     this.addEventListener('blur', this.hideRipple_.bind(this));
     this.addEventListener('click', this.onClick_.bind(this));